/* Builder * #Keywords: GMenu, GtkPopoverMenuBar, GtkBuilder, GtkStatusBar, GtkShortcutController, toolbar * * Demonstrates a traditional interface, loaded from a XML description, * and shows how to connect actions to the menu items and toolbar buttons. */ #include static void quit_activate (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *window = user_data; gtk_window_destroy (GTK_WINDOW (window)); } static void about_activate (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *window = user_data; GtkWidget *about_dlg; about_dlg = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "about")); gtk_window_present (GTK_WINDOW (about_dlg)); } static void remove_timeout (gpointer data) { guint id = GPOINTER_TO_UINT (data); g_source_remove (id); } static gboolean pop_status (gpointer data) { gtk_statusbar_pop (GTK_STATUSBAR (data), 0); g_object_set_data (G_OBJECT (data), "timeout", NULL); return G_SOURCE_REMOVE; } static void status_message (GtkStatusbar *status, const char *text) { guint id; gtk_statusbar_push (GTK_STATUSBAR (status), 0, text); id = g_timeout_add (5000, pop_status, status); g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout); } static void help_activate (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *status; status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status")); status_message (GTK_STATUSBAR (status), "Help not available"); } static void not_implemented (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *status; char *text; text = g_strdup_printf ("Action ā€œ%sā€ not implemented", g_action_get_name (G_ACTION (action))); status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status")); status_message (GTK_STATUSBAR (status), text); g_free (text); } static GActionEntry win_entries[] = { { "new", not_implemented, NULL, NULL, NULL }, { "open", not_implemented, NULL, NULL, NULL }, { "save", not_implemented, NULL, NULL, NULL }, { "save-as", not_implemented, NULL, NULL, NULL }, { "copy", not_implemented, NULL, NULL, NULL }, { "cut", not_implemented, NULL, NULL, NULL }, { "paste", not_implemented, NULL, NULL, NULL }, { "quit", quit_activate, NULL, NULL, NULL }, { "about", about_activate, NULL, NULL, NULL }, { "help", help_activate, NULL, NULL, NULL } }; GtkWidget * do_builder (GtkWidget *do_widget) { static GtkWidget *window = NULL; GActionGroup *actions; if (!window) { GtkBuilder *builder; GtkWidget *about; GtkWidget *status; GtkEventController *controller; builder = gtk_builder_new_from_resource ("/builder/demo.ui"); window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); actions = (GActionGroup*)g_simple_action_group_new (); g_action_map_add_action_entries (G_ACTION_MAP (actions), win_entries, G_N_ELEMENTS (win_entries), window); gtk_widget_insert_action_group (window, "win", actions); controller = gtk_shortcut_controller_new (); gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller), GTK_SHORTCUT_SCOPE_GLOBAL); gtk_widget_add_controller (window, controller); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_n, GDK_CONTROL_MASK), gtk_named_action_new ("win.new"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_o, GDK_CONTROL_MASK), gtk_named_action_new ("win.open"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_s, GDK_CONTROL_MASK), gtk_named_action_new ("win.save"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_s, GDK_CONTROL_MASK|GDK_SHIFT_MASK), gtk_named_action_new ("win.save-as"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_q, GDK_CONTROL_MASK), gtk_named_action_new ("win.quit"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_c, GDK_CONTROL_MASK), gtk_named_action_new ("win.copy"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_x, GDK_CONTROL_MASK), gtk_named_action_new ("win.cut"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_v, GDK_CONTROL_MASK), gtk_named_action_new ("win.paste"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_F1, 0), gtk_named_action_new ("win.help"))); gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_F7, 0), gtk_named_action_new ("win.about"))); about = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1")); gtk_window_set_transient_for (GTK_WINDOW (about), GTK_WINDOW (window)); gtk_window_set_hide_on_close (GTK_WINDOW (about), TRUE); g_object_set_data_full (G_OBJECT (window), "about", about, (GDestroyNotify)gtk_window_destroy); status = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar1")); g_object_set_data (G_OBJECT (window), "status", status); g_object_unref (builder); } if (!gtk_widget_get_visible (window)) gtk_widget_show (window); else gtk_window_destroy (GTK_WINDOW (window)); return window; }