int thread_sleep(struct object *o, struct object *p) { int32_t millisec; struct thread *t; struct integer *i; t = object_get_thread(o); if (t == NULL) { fprintf(stderr, "mvm: thread not initialized!\n"); mvm_halt(); } i = object_get_integer(p); millisec = integer_get_value(i); #ifdef DMP if (t->dmp != NULL) { return thread_dmp_thread_sleep(t->dmp, millisec); } #endif while (usleep(millisec * 1000) != 0) { if (errno != EINTR) { perror("mvm: usleep"); mvm_halt(); } } return 0; }
void sal_gui_window_size(vm_t *vm) { obj_t *obj = (obj_t *)sal_stack_pop(vm->stack); obj_t *width = (obj_t *)sal_stack_pop(vm->stack); obj_t *heigh = (obj_t *)sal_stack_pop(vm->stack); GtkWidget *window = obj->data; gtk_window_set_default_size( GTK_WINDOW(window), integer_get_value(width), integer_get_value(heigh)); gtk_widget_set_usize( GTK_WIDGET(window), integer_get_value(width), integer_get_value(heigh)); }
void sal_gui_progress_set(vm_t *vm) { obj_t *box = (obj_t *)sal_stack_pop(vm->stack); /* progress bar widget */ obj_t *obj = (obj_t *)sal_stack_pop(vm->stack); /* value */ switch(obj->type) { case OBJECT_STRING: /* text */ gtk_progress_bar_set_text( GTK_PROGRESS_BAR(box->data), string_get_value(obj)); break; case OBJECT_FLOAT: { /* 0 - 1 */ float val = float_get_value(obj); if (val<0) val = 0; if (val>1) val = 1; gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR(box->data), (gdouble)val); } break; case OBJECT_INTEGER: { /* 0 - 100 */ int val = integer_get_value(obj); if (val<0) val = 0; if (val>100) val = 100; gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR(box->data), (gdouble)0.01*val); } break; default: fprintf(stderr, "Don't know how to handle this obj (%d).\n", obj->type); } }
void sal_gui_dialog(vm_t *vm) { obj_t *obj = (obj_t *)sal_stack_pop(vm->stack); /* title */ obj_t *str = (obj_t *)sal_stack_pop(vm->stack); /* string */ obj_t *typ = (obj_t *)sal_stack_pop(vm->stack); /* type */ obj_t *ptr; #if USE_GTK GtkDialog *d = (GtkDialog *)gtk_dialog_new(); int ret; gtk_window_set_title(GTK_WINDOW(d), string_get_value(obj)); // gtk_window_set_default_size(GTK_WINDOW(d), 300,140); gtk_window_set_position(GTK_WINDOW(d), GTK_WIN_POS_CENTER); switch(integer_get_value(typ)) { case DIALOG_YESNO: gtk_dialog_add_button(d, "gtk-cancel", FALSE); case DIALOG_POPUP: default: gtk_dialog_add_button(d, "gtk-ok", TRUE); break; } gtk_dialog_set_default_response(d, FALSE); gtk_window_set_modal(GTK_WINDOW(d), TRUE); // XXX no access to w pointer //gtk_window_set_transient_for(GTK_WINDOW(d), GTK_WINDOW(w->window)); gtk_container_add( GTK_CONTAINER(d->vbox), gtk_label_new( string_get_value(str) )); gtk_widget_show_all(GTK_WIDGET(d)); ret = gtk_dialog_run(d); gtk_widget_destroy(GTK_WIDGET(d)); #endif vm->flags = FLAGS_CLEAR; if (ret<0) { ret = -1; // avoid -4 if window closed vm->flags = FLAGS_NOPER; // nothing new in stack return; } ptr = integer_new_i(ret); sal_stack_push(vm->stack, ptr); }
int table_run_equals(struct table *t, struct object *o, struct object *p) { int ref; int32_t value; uint32_t pc; struct integer *integer; struct object *object; struct vm_stack *vm_stack; struct frame *frame; struct operand_stack *operand_stack; struct thread *thread; if (t == NULL) { fprintf(stderr, "mvm: table not initialized!\n"); mvm_halt(); } thread = thread_get_current(); pc = thread_get_pc(thread); vm_stack = thread_get_vm_stack(thread); frame = vm_stack_peek(vm_stack); operand_stack = frame_get_operand_stack(frame); operand_stack_push(operand_stack, object_get_ref(o)); operand_stack_push(operand_stack, object_get_ref(p)); invoke_virtual_method_by_name(thread, object_get_ref(o), pc, "equals", 1, "Object"); ref = operand_stack_peek(operand_stack); object = heap_fetch_object(heap, ref); integer = object_get_integer(object); value = integer_get_value(integer); operand_stack_pop(operand_stack); return value; }