22
22
#include <X11/extensions/XInput2.h>
23
23
#include <gdk/gdk.h>
24
24
#include <gdk/gdkx.h>
25
-
26
25
#include "sugar-key-grabber.h"
27
26
#include "eggaccelerators.h"
28
27
#include "sugar-marshal.h"
37
36
#define USED_MODS (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)
38
37
39
38
enum {
40
- KEY_PRESSED ,
41
- KEY_RELEASED ,
42
- N_SIGNALS
39
+ KEY_PRESSED ,
40
+ KEY_RELEASED ,
41
+ N_SIGNALS
43
42
};
44
43
45
44
typedef struct {
@@ -56,30 +55,30 @@ static guint signals[N_SIGNALS];
56
55
static void
57
56
free_key_info (Key * key_info )
58
57
{
59
- g_free (key_info -> key );
60
- g_free (key_info );
58
+ g_free (key_info -> key );
59
+ g_free (key_info );
61
60
}
62
61
63
62
static void
64
63
sugar_key_grabber_dispose (GObject * object )
65
64
{
66
- SugarKeyGrabber * grabber = SUGAR_KEY_GRABBER (object );
65
+ SugarKeyGrabber * grabber = SUGAR_KEY_GRABBER (object );
67
66
68
- if (grabber -> keys ) {
69
- g_list_foreach (grabber -> keys , (GFunc )free_key_info , NULL );
70
- g_list_free (grabber -> keys );
71
- grabber -> keys = NULL ;
72
- }
67
+ if (grabber -> keys ) {
68
+ g_list_foreach (grabber -> keys , (GFunc )free_key_info , NULL );
69
+ g_list_free (grabber -> keys );
70
+ grabber -> keys = NULL ;
71
+ }
73
72
}
74
73
75
74
static void
76
75
sugar_key_grabber_class_init (SugarKeyGrabberClass * grabber_class )
77
76
{
78
- GObjectClass * g_object_class = G_OBJECT_CLASS (grabber_class );
77
+ GObjectClass * g_object_class = G_OBJECT_CLASS (grabber_class );
79
78
80
- g_object_class -> dispose = sugar_key_grabber_dispose ;
79
+ g_object_class -> dispose = sugar_key_grabber_dispose ;
81
80
82
- signals [KEY_PRESSED ] = g_signal_new ("key-pressed" ,
81
+ signals [KEY_PRESSED ] = g_signal_new ("key-pressed" ,
83
82
G_TYPE_FROM_CLASS (grabber_class ),
84
83
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION ,
85
84
G_STRUCT_OFFSET (SugarKeyGrabberClass , key_pressed ),
@@ -89,7 +88,7 @@ sugar_key_grabber_class_init(SugarKeyGrabberClass *grabber_class)
89
88
G_TYPE_UINT ,
90
89
G_TYPE_UINT ,
91
90
G_TYPE_UINT );
92
- signals [KEY_RELEASED ] = g_signal_new ("key-released" ,
91
+ signals [KEY_RELEASED ] = g_signal_new ("key-released" ,
93
92
G_TYPE_FROM_CLASS (grabber_class ),
94
93
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION ,
95
94
G_STRUCT_OFFSET (SugarKeyGrabberClass , key_released ),
@@ -104,73 +103,73 @@ sugar_key_grabber_class_init(SugarKeyGrabberClass *grabber_class)
104
103
char *
105
104
sugar_key_grabber_get_key (SugarKeyGrabber * grabber , guint keycode , guint state )
106
105
{
107
- GList * l ;
106
+ GList * l ;
108
107
109
- for (l = grabber -> keys ; l != NULL ; l = l -> next ) {
110
- Key * keyinfo = (Key * )l -> data ;
111
- if ((keyinfo -> keycode == keycode ) &&
112
- ((state & USED_MODS ) == keyinfo -> state )) {
113
- return g_strdup (keyinfo -> key );
114
- }
115
- }
108
+ for (l = grabber -> keys ; l != NULL ; l = l -> next ) {
109
+ Key * keyinfo = (Key * )l -> data ;
110
+ if ((keyinfo -> keycode == keycode ) &&
111
+ ((state & USED_MODS ) == keyinfo -> state )) {
112
+ return g_strdup (keyinfo -> key );
113
+ }
114
+ }
116
115
117
- return NULL ;
116
+ return NULL ;
118
117
}
119
118
120
119
static GdkFilterReturn
121
120
filter_events (GdkXEvent * xevent , GdkEvent * event , gpointer data )
122
121
{
123
- SugarKeyGrabber * grabber = (SugarKeyGrabber * )data ;
124
- XEvent * xev = (XEvent * )xevent ;
125
-
126
- if (xev -> type == KeyRelease ) {
127
- int return_value ;
128
- g_signal_emit (grabber , signals [KEY_RELEASED ], 0 , xev -> xkey .keycode ,
129
- xev -> xkey .state , xev -> xkey .time , & return_value );
130
- if (return_value )
131
- return GDK_FILTER_REMOVE ;
132
- }
133
-
134
- if (xev -> type == KeyPress ) {
135
- int return_value ;
136
- g_signal_emit (grabber , signals [KEY_PRESSED ], 0 , xev -> xkey .keycode ,
137
- xev -> xkey .state , xev -> xkey .time , & return_value );
138
- if (return_value )
139
- return GDK_FILTER_REMOVE ;
140
- }
141
-
142
- if (xev -> type == GenericEvent ) {
143
- XIDeviceEvent * ev ;
144
- int return_value = FALSE;
145
-
146
- ev = (XIDeviceEvent * ) ((XGenericEventCookie * ) xev )-> data ;
147
-
148
- if (ev -> evtype == XI_KeyPress ) {
149
- g_signal_emit (grabber , signals [KEY_PRESSED ], 0 ,
150
- ev -> detail , ev -> mods .effective , ev -> time , & return_value );
151
- } else if (ev -> evtype == XI_KeyRelease ) {
152
- g_signal_emit (grabber , signals [KEY_RELEASED ], 0 ,
153
- ev -> detail , ev -> mods .effective , ev -> time , & return_value );
154
- }
155
-
156
- if (return_value )
157
- return GDK_FILTER_REMOVE ;
158
- }
159
-
160
-
161
- return GDK_FILTER_CONTINUE ;
122
+ SugarKeyGrabber * grabber = (SugarKeyGrabber * )data ;
123
+ XEvent * xev = (XEvent * )xevent ;
124
+
125
+ if (xev -> type == KeyRelease ) {
126
+ int return_value ;
127
+ g_signal_emit (grabber , signals [KEY_RELEASED ], 0 , xev -> xkey .keycode ,
128
+ xev -> xkey .state , xev -> xkey .time , & return_value );
129
+ if (return_value )
130
+ return GDK_FILTER_REMOVE ;
131
+ }
132
+
133
+ if (xev -> type == KeyPress ) {
134
+ int return_value ;
135
+ g_signal_emit (grabber , signals [KEY_PRESSED ], 0 , xev -> xkey .keycode ,
136
+ xev -> xkey .state , xev -> xkey .time , & return_value );
137
+ if (return_value )
138
+ return GDK_FILTER_REMOVE ;
139
+ }
140
+
141
+ if (xev -> type == GenericEvent ) {
142
+ XIDeviceEvent * ev ;
143
+ int return_value = FALSE;
144
+
145
+ ev = (XIDeviceEvent * ) ((XGenericEventCookie * ) xev )-> data ;
146
+
147
+ if (ev -> evtype == XI_KeyPress ) {
148
+ g_signal_emit (grabber , signals [KEY_PRESSED ], 0 ,
149
+ ev -> detail , ev -> mods .effective , ev -> time , & return_value );
150
+ } else if (ev -> evtype == XI_KeyRelease ) {
151
+ g_signal_emit (grabber , signals [KEY_RELEASED ], 0 ,
152
+ ev -> detail , ev -> mods .effective , ev -> time , & return_value );
153
+ }
154
+
155
+ if (return_value )
156
+ return GDK_FILTER_REMOVE ;
157
+ }
158
+
159
+
160
+ return GDK_FILTER_CONTINUE ;
162
161
}
163
162
164
163
static void
165
164
sugar_key_grabber_init (SugarKeyGrabber * grabber )
166
165
{
167
- GdkScreen * screen ;
166
+ GdkScreen * screen ;
168
167
169
- screen = gdk_screen_get_default ();
170
- grabber -> root = gdk_screen_get_root_window (screen );
171
- grabber -> keys = NULL ;
168
+ screen = gdk_screen_get_default ();
169
+ grabber -> root = gdk_screen_get_root_window (screen );
170
+ grabber -> keys = NULL ;
172
171
173
- gdk_window_add_filter (grabber -> root , filter_events , grabber );
172
+ gdk_window_add_filter (grabber -> root , filter_events , grabber );
174
173
}
175
174
176
175
/* grab_key and grab_key_real are from
@@ -230,20 +229,19 @@ grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
230
229
**/
231
230
void
232
231
sugar_key_grabber_grab_keys (SugarKeyGrabber * grabber ,
233
- const gchar * keys [],
234
- gint n_elements )
232
+ const gchar * keys [],
233
+ gint n_elements )
235
234
{
236
235
gint i ;
237
- const char * key ;
238
236
Key * keyinfo = NULL ;
239
237
gint min_keycodes , max_keycodes ;
240
238
241
239
XDisplayKeycodes (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
242
240
& min_keycodes , & max_keycodes );
243
241
244
242
for (i = 0 ; i < n_elements ; i ++ ){
245
- keyinfo = g_new0 (Key , 1 );
246
- keyinfo -> key = g_strdup (keys [i ]);
243
+ keyinfo = g_new0 (Key , 1 );
244
+ keyinfo -> key = g_strdup (keys [i ]);
247
245
248
246
if (!egg_accelerator_parse_virtual (keys [i ], & keyinfo -> keysym ,
249
247
& keyinfo -> keycode ,
@@ -257,12 +255,12 @@ sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber,
257
255
continue ;
258
256
}
259
257
260
- gdk_error_trap_push ( );
258
+ gdk_x11_display_error_trap_push ( gdk_display_get_default () );
261
259
262
260
grab_key (grabber , keyinfo , TRUE);
263
261
264
- gdk_flush ( );
265
- gint error_code = gdk_error_trap_pop ( );
262
+ gdk_display_flush ( gdk_display_get_default () );
263
+ gint error_code = gdk_x11_display_error_trap_pop ( gdk_display_get_default () );
266
264
if (!error_code )
267
265
grabber -> keys = g_list_append (grabber -> keys , keyinfo );
268
266
else if (error_code == BadAccess )
@@ -279,37 +277,37 @@ sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber,
279
277
gboolean
280
278
sugar_key_grabber_is_modifier (SugarKeyGrabber * grabber , guint keycode , guint mask )
281
279
{
282
- Display * xdisplay ;
283
- XModifierKeymap * modmap ;
284
- gint start , end , i , mod_index ;
285
- gboolean is_modifier = FALSE;
286
-
287
- xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
288
-
289
- modmap = XGetModifierMapping (xdisplay );
290
-
291
- if (mask != -1 ) {
292
- mod_index = 0 ;
293
- mask = mask >> 1 ;
294
- while (mask != 0 ) {
295
- mask = mask >> 1 ;
296
- mod_index += 1 ;
297
- }
298
- start = mod_index * modmap -> max_keypermod ;
299
- end = (mod_index + 1 ) * modmap -> max_keypermod ;
300
- } else {
301
- start = 0 ;
302
- end = 8 * modmap -> max_keypermod ;
303
- }
304
-
305
- for (i = start ; i < end ; i ++ ) {
306
- if (keycode == modmap -> modifiermap [i ]) {
307
- is_modifier = TRUE;
308
- break ;
309
- }
310
- }
311
-
312
- XFreeModifiermap (modmap );
313
-
314
- return is_modifier ;
280
+ Display * xdisplay ;
281
+ XModifierKeymap * modmap ;
282
+ gint start , end , i , mod_index ;
283
+ gboolean is_modifier = FALSE;
284
+
285
+ xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
286
+
287
+ modmap = XGetModifierMapping (xdisplay );
288
+
289
+ if (mask != -1 ) {
290
+ mod_index = 0 ;
291
+ mask = mask >> 1 ;
292
+ while (mask != 0 ) {
293
+ mask = mask >> 1 ;
294
+ mod_index += 1 ;
295
+ }
296
+ start = mod_index * modmap -> max_keypermod ;
297
+ end = (mod_index + 1 ) * modmap -> max_keypermod ;
298
+ } else {
299
+ start = 0 ;
300
+ end = 8 * modmap -> max_keypermod ;
301
+ }
302
+
303
+ for (i = start ; i < end ; i ++ ) {
304
+ if (keycode == modmap -> modifiermap [i ]) {
305
+ is_modifier = TRUE;
306
+ break ;
307
+ }
308
+ }
309
+
310
+ XFreeModifiermap (modmap );
311
+
312
+ return is_modifier ;
315
313
}
0 commit comments