static void keyboard_grab(int grab) { #ifdef DEBUGNOKBDGRAB DBG(("keyboard_grab disabled (%d)", grab)); #else GtkWidget *widget; GdkWindow *window; DBG(("keyboard_grab (%d, was %d)", grab, keyboard_grabbed)); if (grab == keyboard_grabbed) { return; } /*ui_dispatch_events(); gdk_flush();*/ if (grab) { widget = get_active_toplevel(); window = widget ? widget->window : NULL; if ((widget == NULL) || (window == NULL)) { log_error(ui_log, "keyboard_grab: bad params"); return; } gdk_keyboard_grab(window, 1, GDK_CURRENT_TIME); keyboard_grabbed = 1; } else { gdk_keyboard_ungrab(GDK_CURRENT_TIME); keyboard_grabbed = 0; } #endif }
char video_canvas_can_resize(video_canvas_t *canvas) { GtkWidget *t = get_active_toplevel(); if (t) { return !(gdk_window_get_state(gtk_widget_get_window(t)) & GDK_WINDOW_STATE_MAXIMIZED); } return 0; }
/* Display a text to the user. */ void ui_show_text(const char *title, const char *text, int width, int height) { GtkWidget *show_text; vsync_suspend_speed_eval(); show_text = build_show_text((const gchar*)text, width, height); g_signal_connect(G_OBJECT(show_text), "destroy", G_CALLBACK(gtk_widget_destroyed), &show_text); g_signal_connect(G_OBJECT(show_text), "response", G_CALLBACK(text_response), show_text); ui_make_window_transient(get_active_toplevel(), show_text); gtk_window_set_modal(GTK_WINDOW(show_text), TRUE); gtk_window_set_title(GTK_WINDOW(show_text), title); gtk_widget_show(show_text); }
/* Message Helper */ static void ui_message2(const GtkMessageType type, const char *msg, const char *title) { static GtkWidget* msgdlg; vsync_suspend_speed_eval(); msgdlg = gtk_message_dialog_new(GTK_WINDOW(get_active_toplevel()), GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, msg, NULL); ui_popup(msgdlg, title, FALSE); gtk_dialog_run(GTK_DIALOG(msgdlg)); ui_unblock_shells(); /* ui_popdown can't be used in message_boxes */ gtk_widget_destroy(msgdlg); /* still needed ? */ ui_check_mouse_cursor(); ui_dispatch_events(); }
ui_button_t ui_change_dir(const char *title, const char *prompt, char *buf, unsigned int buflen) { GtkWidget *fc; gint res; gchar *fname = NULL; ui_button_t r; fc = gtk_file_chooser_dialog_new(title, GTK_WINDOW(get_active_toplevel()), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); ui_popup(fc, title, FALSE); res = gtk_dialog_run(GTK_DIALOG(fc)); ui_popdown(fc); if ((res == GTK_RESPONSE_ACCEPT) && (fname = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)))) { strncpy(buf, fname, buflen); r = UI_BUTTON_OK; } else { r = UI_BUTTON_CANCEL; } g_free(fname); return r; }
/* grab pointer, set mouse pointer shape called by: ui_check_mouse_cursor, ui_restore_mouse, x11ui_fullscreen TODO: also route lightpen stuff through this function */ static void mouse_cursor_grab(int grab, GdkCursor *cursor) { #ifdef DEBUGNOMOUSEGRAB DBG(("mouse_cursor_grab disabled (%d)", grab)); #else GtkWidget *widget; GdkWindow *window; DBG(("mouse_cursor_grab (%d, was %d)", grab, mouse_grabbed)); if (mouse_grabbed) { gdk_pointer_ungrab(GDK_CURRENT_TIME); mouse_grabbed = 0; } if (grab) { /*ui_dispatch_events(); gdk_flush();*/ widget = get_active_toplevel(); window = widget ? gtk_widget_get_window(widget) : NULL; if ((widget == NULL) || (window == NULL)) { log_error(ui_log, "mouse_cursor_grab: bad params"); return; } #ifdef DEBUGMOUSECURSOR if (cursor == blankCursor) { DBG(("mouse_cursor_grab blankCursor disabled")); cursor = NULL; } #endif gdk_pointer_grab(window, 1, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK, window, cursor, GDK_CURRENT_TIME); mouse_grabbed = 1; } #endif }
GtkWidget *ui_create_status_bar(GtkWidget *pane) { /* Create the status bar on the bottom. */ GdkWindow *window = gtk_widget_get_window(get_active_toplevel()); GtkWidget *speed_label, *drive_box, *joystick_box, *frame, *event_box, *pcb, *vcb, *tmp, *pal_ctrl_checkbox, *status_bar; int i; app_shell_type *as; char *empty = util_concat("<", _("empty"), ">", NULL); int num_app_shells = get_num_shells(); status_bar = gtk_hbox_new(FALSE, 0); gtk_box_pack_end(GTK_BOX(pane), status_bar, FALSE, FALSE, 0); gtk_widget_show(status_bar); /* speed menu */ event_box = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(status_bar), event_box, TRUE, TRUE,0); gtk_widget_show(event_box); g_signal_connect(G_OBJECT(event_box), "button-press-event", G_CALLBACK(speed_popup_cb), (gpointer)NULL); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(event_box), frame); gtk_widget_show(frame); gdk_window_set_cursor(gtk_widget_get_window(event_box), gdk_cursor_new(GDK_HAND1)); /* speed label */ speed_label = gtk_label_new(""); app_shells[num_app_shells - 1].speed_label = (GtkLabel*)speed_label; gtk_misc_set_alignment (GTK_MISC(speed_label), 0, 0.5f); gtk_misc_set_padding(GTK_MISC(speed_label), 1, 1); gtk_container_add(GTK_CONTAINER(frame), speed_label); gtk_widget_show(speed_label); /* spacer */ frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); tmp = gtk_label_new(""); app_shells[num_app_shells - 1].statustext = (GtkLabel*)tmp; gtk_misc_set_alignment(GTK_MISC(tmp), 0, 0.5f); gtk_misc_set_padding(GTK_MISC(tmp), 1, 1); gtk_container_add(GTK_CONTAINER(frame), tmp); gtk_widget_show(tmp); gtk_box_pack_start(GTK_BOX(status_bar), frame, TRUE, TRUE,0); gtk_widget_show(frame); as = &app_shells[num_app_shells - 1]; /* PAL Control checkbox */ pal_ctrl_checkbox = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(pal_ctrl_checkbox), GTK_SHADOW_IN); pcb = gtk_check_button_new_with_label((machine_class != VICE_MACHINE_VSID) ? _("CRT Controls") : _("Mixer")); gtk_widget_set_can_focus(pcb, 0); g_signal_connect(G_OBJECT(pcb), "toggled", G_CALLBACK(ui_update_pal_checkbox), as); gtk_container_add(GTK_CONTAINER(pal_ctrl_checkbox), pcb); gtk_widget_show(pcb); gtk_box_pack_start(GTK_BOX(status_bar), pal_ctrl_checkbox, FALSE, FALSE, 0); gtk_widget_show(pal_ctrl_checkbox); /* Video Control checkbox */ video_ctrl_checkbox = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(video_ctrl_checkbox), GTK_SHADOW_IN); video_ctrl_checkbox_label = gtk_label_new(_("audio/video recording")); vcb = gtk_button_new(); gtk_container_add(GTK_CONTAINER(vcb), video_ctrl_checkbox_label); gtk_widget_show(video_ctrl_checkbox_label); gtk_widget_set_can_focus(pcb, 0); g_signal_connect(G_OBJECT(vcb), "clicked", G_CALLBACK(ui_update_video_checkbox), vcb); gtk_container_add(GTK_CONTAINER(video_ctrl_checkbox), vcb); gtk_widget_show(vcb); gtk_box_pack_start(GTK_BOX(status_bar), video_ctrl_checkbox, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(GTK_WIDGET(vcb), _("click to stop recording")); /* additional controls */ if (machine_class != VICE_MACHINE_VSID) { /* Event record control checkbox */ event_rec_checkbox = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(event_rec_checkbox), GTK_SHADOW_IN); event_rec_checkbox_label = gtk_label_new(_("event recording")); vcb = gtk_button_new(); gtk_container_add(GTK_CONTAINER(vcb), event_rec_checkbox_label); gtk_widget_show(event_rec_checkbox_label); gtk_widget_set_can_focus(pcb, 0); g_signal_connect(G_OBJECT(vcb), "clicked", G_CALLBACK(ui_update_event_checkbox), (gpointer)0); gtk_container_add(GTK_CONTAINER(event_rec_checkbox), vcb); gtk_widget_show(vcb); gtk_box_pack_start(GTK_BOX(status_bar), event_rec_checkbox, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(GTK_WIDGET(vcb), _("click to stop recording")); /* Event playback control checkbox */ event_playback_checkbox = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(event_playback_checkbox), GTK_SHADOW_IN); event_playback_checkbox_label = gtk_label_new(_("event playback")); vcb = gtk_button_new(); gtk_container_add(GTK_CONTAINER(vcb), event_playback_checkbox_label); gtk_widget_show(event_playback_checkbox_label); gtk_widget_set_can_focus(pcb, 0); g_signal_connect(G_OBJECT(vcb), "clicked", G_CALLBACK(ui_update_event_checkbox), (gpointer)1); gtk_container_add(GTK_CONTAINER(event_playback_checkbox), vcb); gtk_widget_show(vcb); gtk_box_pack_start(GTK_BOX(status_bar), event_playback_checkbox, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(GTK_WIDGET(vcb), _("click to stop playback")); if (machine_class != VICE_MACHINE_VSID) { joystick_box = build_joystick_status_widget(as, window); gtk_widget_show(joystick_box); gtk_box_pack_start(GTK_BOX(status_bar), joystick_box, FALSE, FALSE, 0); drive_box = build_drive_status_widget(as, window); gtk_widget_show(drive_box); gtk_box_pack_start(GTK_BOX(status_bar), drive_box, FALSE, FALSE, 0); if ((machine_class != VICE_MACHINE_C64DTV) && (machine_class != VICE_MACHINE_SCPU64)) { build_tape_status_widget(as, window); gtk_box_pack_start(GTK_BOX(status_bar), as->tape_status.event_box, FALSE, FALSE, 0); gtk_widget_show(as->tape_status.event_box); gdk_window_set_cursor(gtk_widget_get_window(as->tape_status.event_box), gdk_cursor_new(GDK_HAND1)); } } gtk_widget_show(status_bar); for (i = 0; i < NUM_DRIVES; i++) { #if 0 int ih, iw; gdk_window_get_size_request(((GtkWidget *)as->drive_status[i].image)->window, &iw, &ih); gtk_widget_set_size_request(as->drive_status[i].image, width / 3, ih); #endif gtk_widget_hide(as->drive_status[i].event_box); /* Hide Drive widget */ gdk_window_set_cursor(gtk_widget_get_window(as->drive_status[i].event_box), gdk_cursor_new (GDK_HAND1)); } } else { gtk_widget_show(status_bar); } /* finalize event-box */ #if 0 gdk_window_set_cursor(event_box->window, gdk_cursor_new(GDK_HAND1)); #endif lib_free(empty); return status_bar; }