6912897da5fac457d984fbf4ff67d4440dc52dce
1 /** @file
2 * Collection of shorthands to deal with GDK events.
3 */
4 /* Authors:
5 * Krzysztof KosiĆski <tweenk.pl@gmail.com>
6 *
7 * Copyright (C) 2009 Authors
8 * Released under GNU GPL, read the file 'COPYING' for more information
9 */
11 #include <gdk/gdk.h>
12 #include <gdk/gdkkeysyms.h>
13 #include "ui/tool/event-utils.h"
15 namespace Inkscape {
16 namespace UI {
19 guint shortcut_key(GdkEventKey const &event)
20 {
21 guint shortcut_key = 0;
22 gdk_keymap_translate_keyboard_state(
23 gdk_keymap_get_for_display(gdk_display_get_default()),
24 event.hardware_keycode,
25 (GdkModifierType) event.state,
26 0 /*event->key.group*/,
27 &shortcut_key, NULL, NULL, NULL);
28 return shortcut_key;
29 }
31 unsigned consume_same_key_events(guint keyval, gint mask)
32 {
33 GdkEvent *event_next;
34 gint i = 0;
36 event_next = gdk_event_get();
37 // while the next event is also a key notify with the same keyval and mask,
38 while (event_next && (event_next->type == GDK_KEY_PRESS || event_next->type == GDK_KEY_RELEASE)
39 && event_next->key.keyval == keyval
40 && (!mask || (event_next->key.state & mask))) {
41 if (event_next->type == GDK_KEY_PRESS)
42 i ++;
43 // kill it
44 gdk_event_free(event_next);
45 // get next
46 event_next = gdk_event_get();
47 }
48 // otherwise, put it back onto the queue
49 if (event_next) gdk_event_put(event_next);
51 return i;
52 }
54 /** Returns the modifier state valid after this event. Use this when you process events
55 * that change the modifier state. Currently handles only Shift, Ctrl, Alt. */
56 unsigned state_after_event(GdkEvent *event)
57 {
58 unsigned state = 0;
59 switch (event->type) {
60 case GDK_KEY_PRESS:
61 state = event->key.state;
62 switch(shortcut_key(event->key)) {
63 case GDK_Shift_L:
64 case GDK_Shift_R:
65 state |= GDK_SHIFT_MASK;
66 break;
67 case GDK_Control_L:
68 case GDK_Control_R:
69 state |= GDK_CONTROL_MASK;
70 break;
71 case GDK_Alt_L:
72 case GDK_Alt_R:
73 state |= GDK_MOD1_MASK;
74 break;
75 default: break;
76 }
77 break;
78 case GDK_KEY_RELEASE:
79 state = event->key.state;
80 switch(shortcut_key(event->key)) {
81 case GDK_Shift_L:
82 case GDK_Shift_R:
83 state &= ~GDK_SHIFT_MASK;
84 break;
85 case GDK_Control_L:
86 case GDK_Control_R:
87 state &= ~GDK_CONTROL_MASK;
88 break;
89 case GDK_Alt_L:
90 case GDK_Alt_R:
91 state &= ~GDK_MOD1_MASK;
92 break;
93 default: break;
94 }
95 break;
96 default: break;
97 }
98 return state;
99 }
101 } // namespace UI
102 } // namespace Inkscape
104 /*
105 Local Variables:
106 mode:c++
107 c-file-style:"stroustrup"
108 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
109 indent-tabs-mode:nil
110 fill-column:99
111 End:
112 */
113 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :