Skip to content

Commit b5cb3e0

Browse files
vkarehraveit65
authored andcommitted
Prevent media-keys bindings from swallowing modifier keys
This changes how the media-keys manager determines successful key-bindings from KeyRelease to KeyPress so that it does not conflict with third-party applications that want to use modifier keys as global key-bindings. We've already done this change for general keybindings and marco. It also cleans up a bunch of deprectation warnings.
1 parent 982a89b commit b5cb3e0

File tree

2 files changed

+49
-23
lines changed

2 files changed

+49
-23
lines changed

plugins/keybindings/msd-keybindings-manager.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,12 @@ key_already_used (MsdKeybindingsManager *manager,
297297
static void
298298
binding_unregister_keys (MsdKeybindingsManager *manager)
299299
{
300+
GdkDisplay *dpy;
300301
GSList *li;
301302
gboolean need_flush = FALSE;
302303

303-
gdk_error_trap_push ();
304+
dpy = gdk_display_get_default ();
305+
gdk_x11_display_error_trap_push (dpy);
304306

305307
for (li = manager->priv->binding_list; li != NULL; li = li->next) {
306308
Binding *binding = (Binding *) li->data;
@@ -312,18 +314,20 @@ binding_unregister_keys (MsdKeybindingsManager *manager)
312314
}
313315

314316
if (need_flush)
315-
gdk_flush ();
317+
gdk_display_flush (dpy);
316318

317-
gdk_error_trap_pop_ignored ();
319+
gdk_x11_display_error_trap_pop_ignored (dpy);
318320
}
319321

320322
static void
321323
binding_register_keys (MsdKeybindingsManager *manager)
322324
{
323325
GSList *li;
326+
GdkDisplay *dpy;
324327
gboolean need_flush = FALSE;
325328

326-
gdk_error_trap_push ();
329+
dpy = gdk_display_get_default ();
330+
gdk_x11_display_error_trap_push (dpy);
327331

328332
/* Now check for changes and grab new key if not already used */
329333
for (li = manager->priv->binding_list; li != NULL; li = li->next) {
@@ -353,8 +357,8 @@ binding_register_keys (MsdKeybindingsManager *manager)
353357
}
354358

355359
if (need_flush)
356-
gdk_flush ();
357-
if (gdk_error_trap_pop ())
360+
gdk_display_flush (dpy);
361+
if (gdk_x11_display_error_trap_pop (dpy))
358362
g_warning ("Grab failed for some keys, another application may already have access the them.");
359363

360364
}
@@ -540,11 +544,11 @@ msd_keybindings_manager_start (MsdKeybindingsManager *manager,
540544
(GdkFilterFunc) keybindings_filter,
541545
manager);
542546

543-
gdk_error_trap_push ();
547+
gdk_x11_display_error_trap_push (dpy);
544548
/* Add KeyPressMask to the currently reportable event masks */
545549
XGetWindowAttributes (xdpy, xwindow, &atts);
546550
XSelectInput (xdpy, xwindow, atts.your_event_mask | KeyPressMask);
547-
gdk_error_trap_pop_ignored ();
551+
gdk_x11_display_error_trap_pop_ignored (dpy);
548552

549553
manager->priv->screens = get_screens_list ();
550554

plugins/media-keys/msd-media-keys-manager.c

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -264,11 +264,13 @@ update_kbd_cb (GSettings *settings,
264264
MsdMediaKeysManager *manager)
265265
{
266266
int i;
267+
GdkDisplay *dpy;
267268
gboolean need_flush = TRUE;
268269

269270
g_return_if_fail (settings_key != NULL);
270271

271-
gdk_error_trap_push ();
272+
dpy = gdk_display_get_default ();
273+
gdk_x11_display_error_trap_push (dpy);
272274

273275
/* Find the key that was modified */
274276
for (i = 0; i < HANDLED_KEYS; i++) {
@@ -313,19 +315,21 @@ update_kbd_cb (GSettings *settings,
313315
}
314316

315317
if (need_flush)
316-
gdk_flush ();
317-
if (gdk_error_trap_pop ())
318+
gdk_display_flush (dpy);
319+
if (gdk_x11_display_error_trap_pop (dpy))
318320
g_warning ("Grab failed for some keys, another application may already have access the them.");
319321
}
320322

321323
static void init_kbd(MsdMediaKeysManager* manager)
322324
{
323325
int i;
326+
GdkDisplay *dpy;
324327
gboolean need_flush = FALSE;
325328

326329
mate_settings_profile_start(NULL);
327330

328-
gdk_error_trap_push();
331+
dpy = gdk_display_get_default ();
332+
gdk_x11_display_error_trap_push (dpy);
329333

330334
for (i = 0; i < HANDLED_KEYS; i++)
331335
{
@@ -373,10 +377,10 @@ static void init_kbd(MsdMediaKeysManager* manager)
373377

374378
if (need_flush)
375379
{
376-
gdk_flush();
380+
gdk_display_flush (dpy);
377381
}
378382

379-
if (gdk_error_trap_pop ())
383+
if (gdk_x11_display_error_trap_pop (dpy))
380384
{
381385
g_warning("Grab failed for some keys, another application may already have access the them.");
382386
}
@@ -1057,7 +1061,7 @@ acme_filter_events (GdkXEvent *xevent,
10571061
int i;
10581062

10591063
/* verify we have a key event */
1060-
if (xev->type != KeyPress && xev->type != KeyRelease) {
1064+
if (xev->type != KeyPress) {
10611065
return GDK_FILTER_CONTINUE;
10621066
}
10631067

@@ -1071,10 +1075,6 @@ acme_filter_events (GdkXEvent *xevent,
10711075
return GDK_FILTER_CONTINUE;
10721076
}
10731077
break;
1074-
default:
1075-
if (xev->type != KeyRelease) {
1076-
return GDK_FILTER_CONTINUE;
1077-
}
10781078
}
10791079

10801080
manager->priv->current_screen = acme_get_screen_from_event (manager, xany);
@@ -1094,9 +1094,15 @@ static gboolean
10941094
start_media_keys_idle_cb (MsdMediaKeysManager *manager)
10951095
{
10961096
GSList *l;
1097+
GdkDisplay *dpy;
1098+
Display *xdpy;
10971099

10981100
g_debug ("Starting media_keys manager");
10991101
mate_settings_profile_start (NULL);
1102+
1103+
dpy = gdk_display_get_default ();
1104+
xdpy = GDK_DISPLAY_XDISPLAY (dpy);
1105+
11001106
manager->priv->volume_monitor = g_volume_monitor_get ();
11011107
manager->priv->settings = g_settings_new (BINDING_SCHEMA);
11021108

@@ -1105,14 +1111,28 @@ start_media_keys_idle_cb (MsdMediaKeysManager *manager)
11051111

11061112
/* Start filtering the events */
11071113
for (l = manager->priv->screens; l != NULL; l = l->next) {
1114+
GdkWindow *window;
1115+
Window xwindow;
1116+
XWindowAttributes atts;
1117+
11081118
mate_settings_profile_start ("gdk_window_add_filter");
11091119

1120+
window = gdk_screen_get_root_window (l->data);
1121+
xwindow = GDK_WINDOW_XID (window);
1122+
11101123
g_debug ("adding key filter for screen: %d",
11111124
gdk_x11_screen_get_screen_number (l->data));
11121125

1113-
gdk_window_add_filter (gdk_screen_get_root_window (l->data),
1126+
gdk_window_add_filter (window,
11141127
(GdkFilterFunc)acme_filter_events,
11151128
manager);
1129+
1130+
gdk_x11_display_error_trap_push (dpy);
1131+
/* Add KeyPressMask to the currently reportable event masks */
1132+
XGetWindowAttributes (xdpy, xwindow, &atts);
1133+
XSelectInput (xdpy, xwindow, atts.your_event_mask | KeyPressMask);
1134+
gdk_x11_display_error_trap_pop_ignored (dpy);
1135+
11161136
mate_settings_profile_end ("gdk_window_add_filter");
11171137
}
11181138

@@ -1161,6 +1181,7 @@ void
11611181
msd_media_keys_manager_stop (MsdMediaKeysManager *manager)
11621182
{
11631183
MsdMediaKeysManagerPrivate *priv = manager->priv;
1184+
GdkDisplay *dpy;
11641185
GSList *ls;
11651186
GList *l;
11661187
int i;
@@ -1190,7 +1211,8 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager)
11901211
}
11911212

11921213
need_flush = FALSE;
1193-
gdk_error_trap_push ();
1214+
dpy = gdk_display_get_default ();
1215+
gdk_x11_display_error_trap_push (dpy);
11941216

11951217
for (i = 0; i < HANDLED_KEYS; ++i) {
11961218
if (keys[i].key) {
@@ -1204,9 +1226,9 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager)
12041226
}
12051227

12061228
if (need_flush)
1207-
gdk_flush ();
1229+
gdk_display_flush (dpy);
12081230

1209-
gdk_error_trap_pop_ignored ();
1231+
gdk_x11_display_error_trap_pop_ignored (dpy);
12101232

12111233
g_slist_free (priv->screens);
12121234
priv->screens = NULL;

0 commit comments

Comments
 (0)