diff options
| author | Yuuki Harano | 2020-11-19 01:20:06 +0900 |
|---|---|---|
| committer | Jeff Walsh | 2020-11-24 12:24:40 +1100 |
| commit | b1b744057f4605cf7165a2041d2979a7decdacff (patch) | |
| tree | e319e1540155d8fca339e9140a500f2cfed6cde4 /src | |
| parent | 8fa5427130c67a9710838672a61eaf2db0eb16ba (diff) | |
| download | emacs-b1b744057f4605cf7165a2041d2979a7decdacff.tar.gz emacs-b1b744057f4605cf7165a2041d2979a7decdacff.zip | |
Work around gtk_im_context_filter_keypress() issue with super key
* src/pgtkterm.c (x_find_modifier_meanings): Convert virtual super
to non-virtual one.
(pgtk_gtk_to_emacs_modifiers): Use non-virtual one.
(pgtk_emacs_to_gtk_modifiers): Use non-virtual one.
(key_press_event): Don't call pgtk_im_context_filter_keypress while
super is pressed.
* src/pgtkterm.h (struct pgtk_display_info): New member.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pgtkterm.c | 35 | ||||
| -rw-r--r-- | src/pgtkterm.h | 2 |
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 | ||
| 5429 | static void | 5448 | static 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; |