1/* Shortcuts
2 * #Keywords: GtkShortcutController
3 *
4 * GtkShortcut is the abstraction used by GTK to handle shortcuts from
5 * keyboard or other input devices.
6 *
7 * Shortcut triggers can be used to weave complex sequences of key
8 * presses into sophisticated mechanisms to activate shortcuts.
9 *
10 * This demo code shows creative ways to do that.
11 */
12
13#include <gtk/gtk.h>
14
15static GtkWidget *window = NULL;
16
17static gboolean
18shortcut_activated (GtkWidget *widget,
19 GVariant *unused,
20 gpointer row)
21{
22 g_print (format: "activated %s\n", gtk_label_get_label (self: row));
23 return TRUE;
24}
25
26static GtkShortcutTrigger *
27create_ctrl_g (void)
28{
29 return gtk_keyval_trigger_new (GDK_KEY_g, modifiers: GDK_CONTROL_MASK);
30}
31
32static GtkShortcutTrigger *
33create_x (void)
34{
35 return gtk_keyval_trigger_new (GDK_KEY_x, modifiers: 0);
36}
37
38struct {
39 const char *description;
40 GtkShortcutTrigger * (* create_trigger_func) (void);
41} shortcuts[] = {
42 { "Press Ctrl-G", create_ctrl_g },
43 { "Press X", create_x },
44};
45
46GtkWidget *
47do_shortcut_triggers (GtkWidget *do_widget)
48{
49 guint i;
50
51 if (!window)
52 {
53 GtkWidget *list;
54 GtkEventController *controller;
55
56 window = gtk_window_new ();
57 gtk_window_set_display (GTK_WINDOW (window),
58 display: gtk_widget_get_display (widget: do_widget));
59 gtk_window_set_title (GTK_WINDOW (window), title: "Shortcuts");
60 gtk_window_set_default_size (GTK_WINDOW (window), width: 200, height: -1);
61 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
62 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
63
64 list = gtk_list_box_new ();
65 gtk_widget_set_margin_top (widget: list, margin: 6);
66 gtk_widget_set_margin_bottom (widget: list, margin: 6);
67 gtk_widget_set_margin_start (widget: list, margin: 6);
68 gtk_widget_set_margin_end (widget: list, margin: 6);
69 gtk_window_set_child (GTK_WINDOW (window), child: list);
70
71 for (i = 0; i < G_N_ELEMENTS (shortcuts); i++)
72 {
73 GtkShortcut *shortcut;
74 GtkWidget *row;
75
76 row = gtk_label_new (str: shortcuts[i].description);
77 gtk_list_box_insert (GTK_LIST_BOX (list), child: row, position: -1);
78
79 controller = gtk_shortcut_controller_new ();
80 gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller), scope: GTK_SHORTCUT_SCOPE_GLOBAL);
81 gtk_widget_add_controller (widget: row, controller);
82
83 shortcut = gtk_shortcut_new (trigger: shortcuts[i].create_trigger_func(),
84 action: gtk_callback_action_new (callback: shortcut_activated, data: row, NULL));
85 gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
86 }
87 }
88
89 if (!gtk_widget_get_visible (widget: window))
90 gtk_widget_show (widget: window);
91 else
92 gtk_window_destroy (GTK_WINDOW (window));
93
94 return window;
95}
96

source code of gtk/demos/gtk-demo/shortcut_triggers.c