aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pgtkterm.c35
-rw-r--r--src/pgtkterm.h2
2 files changed, 32 insertions, 5 deletions
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index d7bbfe15117..ab61283e062 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -5424,6 +5424,25 @@ x_find_modifier_meanings (struct pgtk_display_info *dpyinfo)
5424 dpyinfo->meta_mod_mask = GDK_MOD1_MASK; 5424 dpyinfo->meta_mod_mask = GDK_MOD1_MASK;
5425 dpyinfo->alt_mod_mask = 0; 5425 dpyinfo->alt_mod_mask = 0;
5426 } 5426 }
5427
5428 state = GDK_SUPER_MASK;
5429 r = gdk_keymap_map_virtual_modifiers (keymap, &state);
5430 if (r)
5431 {
5432 /* Super key exists. */
5433 if (state == GDK_SUPER_MASK)
5434 {
5435 dpyinfo->super_mod_mask = GDK_MOD4_MASK; /* maybe this is super. */
5436 }
5437 else
5438 {
5439 dpyinfo->super_mod_mask = state & ~GDK_SUPER_MASK;
5440 }
5441 }
5442 else
5443 {
5444 dpyinfo->super_mod_mask = GDK_MOD4_MASK;
5445 }
5427} 5446}
5428 5447
5429static void 5448static void
@@ -5478,7 +5497,7 @@ pgtk_gtk_to_emacs_modifiers (struct pgtk_display_info *dpyinfo, int state)
5478 mod |= mod_meta; 5497 mod |= mod_meta;
5479 if (state & dpyinfo->alt_mod_mask) 5498 if (state & dpyinfo->alt_mod_mask)
5480 mod |= mod_alt; 5499 mod |= mod_alt;
5481 if (state & GDK_SUPER_MASK) 5500 if (state & dpyinfo->super_mod_mask)
5482 mod |= mod_super; 5501 mod |= mod_super;
5483 if (state & GDK_HYPER_MASK) 5502 if (state & GDK_HYPER_MASK)
5484 mod |= mod_hyper; 5503 mod |= mod_hyper;
@@ -5502,7 +5521,7 @@ pgtk_emacs_to_gtk_modifiers (struct pgtk_display_info *dpyinfo, int state)
5502 if (state & mod_alt) 5521 if (state & mod_alt)
5503 mask |= dpyinfo->alt_mod_mask; 5522 mask |= dpyinfo->alt_mod_mask;
5504 if (state & mod_super) 5523 if (state & mod_super)
5505 mask |= GDK_SUPER_MASK; 5524 mask |= dpyinfo->super_mod_mask;
5506 if (state & mod_hyper) 5525 if (state & mod_hyper)
5507 mask |= GDK_HYPER_MASK; 5526 mask |= GDK_HYPER_MASK;
5508 if (state & shift_modifier) 5527 if (state & shift_modifier)
@@ -5594,8 +5613,16 @@ key_press_event (GtkWidget * widget, GdkEvent * event, gpointer * user_data)
5594 5613
5595 if (f != 0) 5614 if (f != 0)
5596 { 5615 {
5597 if (pgtk_im_filter_keypress (f, &event->key)) 5616 /* While super is pressed, gtk_im_context_filter_keypress() always process the
5598 return TRUE; 5617 * key events ignoring super.
5618 * As a work around, don't call it while super is pressed...
5619 */
5620 struct pgtk_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
5621 if (!(event->key.state & dpyinfo->super_mod_mask))
5622 {
5623 if (pgtk_im_filter_keypress (f, &event->key))
5624 return TRUE;
5625 }
5599 } 5626 }
5600 5627
5601 if (f != 0) 5628 if (f != 0)
diff --git a/src/pgtkterm.h b/src/pgtkterm.h
index 641509bb4e6..a777885518e 100644
--- a/src/pgtkterm.h
+++ b/src/pgtkterm.h
@@ -235,7 +235,7 @@ struct pgtk_display_info
235 struct frame *last_mouse_glyph_frame; 235 struct frame *last_mouse_glyph_frame;
236 236
237 /* Modifier masks in gdk */ 237 /* Modifier masks in gdk */
238 int meta_mod_mask, alt_mod_mask; 238 int meta_mod_mask, alt_mod_mask, super_mod_mask;
239 239
240 /* The last click event. */ 240 /* The last click event. */
241 GdkEvent *last_click_event; 241 GdkEvent *last_click_event;