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 | |
15 | static GtkWidget *window = NULL; |
16 | |
17 | static gboolean |
18 | shortcut_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 | |
26 | static GtkShortcutTrigger * |
27 | create_ctrl_g (void) |
28 | { |
29 | return gtk_keyval_trigger_new (GDK_KEY_g, modifiers: GDK_CONTROL_MASK); |
30 | } |
31 | |
32 | static GtkShortcutTrigger * |
33 | create_x (void) |
34 | { |
35 | return gtk_keyval_trigger_new (GDK_KEY_x, modifiers: 0); |
36 | } |
37 | |
38 | struct { |
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 | |
46 | GtkWidget * |
47 | do_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 | |