Code

6912897da5fac457d984fbf4ff67d4440dc52dce
[inkscape.git] / src / ui / tool / event-utils.cpp
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 :