diff options
| author | Yuuki Harano | 2019-07-10 02:32:35 +0900 |
|---|---|---|
| committer | Jeff Walsh | 2020-11-22 14:46:55 +1100 |
| commit | 519a4ac39f7cd9e2339b203463704db48752bc5b (patch) | |
| tree | 1a3048b3ee44a1de0ea20a37a826708c9b72f3d3 /src | |
| parent | 68b99a3e6615a7f3eb21dbd72b0b796960831a5e (diff) | |
| download | emacs-519a4ac39f7cd9e2339b203463704db48752bc5b.tar.gz emacs-519a4ac39f7cd9e2339b203463704db48752bc5b.zip | |
Implement Meta key detection
* ../src/pgtkterm.c (x_find_modifier_meanings, )
(key_press_event, construct_mouse_click, scroll_event)
(pgtk_term_init):
* src/pgtkterm.h (struct pgtk_display_info):
* ../src/gtkutil.c (xg_tool_bar_callback):
meta キーの検出を実装。
X11 で alt キーを meta キーとして使えなくなっていたのを修正。
Diffstat (limited to 'src')
| -rw-r--r-- | src/gtkutil.c | 2 | ||||
| -rw-r--r-- | src/pgtkterm.c | 132 | ||||
| -rw-r--r-- | src/pgtkterm.h | 5 |
3 files changed, 88 insertions, 51 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c index 9655c8dfc12..2da6beb2ca5 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -4693,7 +4693,7 @@ xg_tool_bar_callback (GtkWidget *w, gpointer client_data) | |||
| 4693 | #ifndef HAVE_PGTK | 4693 | #ifndef HAVE_PGTK |
| 4694 | event.modifiers = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), mod); | 4694 | event.modifiers = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), mod); |
| 4695 | #else | 4695 | #else |
| 4696 | event.modifiers = pgtk_gtk_to_emacs_modifiers (mod); | 4696 | event.modifiers = pgtk_gtk_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), mod); |
| 4697 | #endif | 4697 | #endif |
| 4698 | kbd_buffer_store_event (&event); | 4698 | kbd_buffer_store_event (&event); |
| 4699 | 4699 | ||
diff --git a/src/pgtkterm.c b/src/pgtkterm.c index 2e98dedbc75..5890326430f 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c | |||
| @@ -4895,64 +4895,100 @@ static void size_allocate(GtkWidget *widget, GtkAllocation *alloc, gpointer *use | |||
| 4895 | } | 4895 | } |
| 4896 | } | 4896 | } |
| 4897 | 4897 | ||
| 4898 | int | 4898 | static void |
| 4899 | pgtk_gtk_to_emacs_modifiers (int state) | 4899 | x_find_modifier_meanings (struct pgtk_display_info *dpyinfo) |
| 4900 | { | ||
| 4901 | GdkDisplay *gdpy = dpyinfo->gdpy; | ||
| 4902 | GdkKeymap *keymap = gdk_keymap_get_for_display (gdpy); | ||
| 4903 | GdkModifierType state = GDK_META_MASK; | ||
| 4904 | gboolean r = gdk_keymap_map_virtual_modifiers (keymap, &state); | ||
| 4905 | if (r) { | ||
| 4906 | /* Meta key exists. */ | ||
| 4907 | if (state == GDK_META_MASK) { | ||
| 4908 | dpyinfo->meta_mod_mask = GDK_MOD1_MASK; /* maybe this is meta. */ | ||
| 4909 | dpyinfo->alt_mod_mask = 0; | ||
| 4910 | } else { | ||
| 4911 | dpyinfo->meta_mod_mask = state & ~GDK_META_MASK; | ||
| 4912 | if (dpyinfo->meta_mod_mask == GDK_MOD1_MASK) | ||
| 4913 | dpyinfo->alt_mod_mask = 0; | ||
| 4914 | else | ||
| 4915 | dpyinfo->alt_mod_mask = GDK_MOD1_MASK; | ||
| 4916 | } | ||
| 4917 | } else { | ||
| 4918 | dpyinfo->meta_mod_mask = GDK_MOD1_MASK; | ||
| 4919 | dpyinfo->alt_mod_mask = 0; | ||
| 4920 | } | ||
| 4921 | } | ||
| 4922 | |||
| 4923 | static void get_modifier_values( | ||
| 4924 | int *mod_ctrl, | ||
| 4925 | int *mod_meta, | ||
| 4926 | int *mod_alt, | ||
| 4927 | int *mod_hyper, | ||
| 4928 | int *mod_super) | ||
| 4900 | { | 4929 | { |
| 4901 | int mod_ctrl = ctrl_modifier; | ||
| 4902 | int mod_meta = meta_modifier; | ||
| 4903 | int mod_alt = alt_modifier; | ||
| 4904 | int mod_hyper = hyper_modifier; | ||
| 4905 | int mod_super = super_modifier; | ||
| 4906 | Lisp_Object tem; | 4930 | Lisp_Object tem; |
| 4907 | 4931 | ||
| 4932 | *mod_ctrl = ctrl_modifier; | ||
| 4933 | *mod_meta = meta_modifier; | ||
| 4934 | *mod_alt = alt_modifier; | ||
| 4935 | *mod_hyper = hyper_modifier; | ||
| 4936 | *mod_super = super_modifier; | ||
| 4937 | |||
| 4908 | tem = Fget (Vx_ctrl_keysym, Qmodifier_value); | 4938 | tem = Fget (Vx_ctrl_keysym, Qmodifier_value); |
| 4909 | if (INTEGERP (tem)) mod_ctrl = XFIXNUM (tem) & INT_MAX; | 4939 | if (INTEGERP (tem)) *mod_ctrl = XFIXNUM (tem) & INT_MAX; |
| 4910 | tem = Fget (Vx_alt_keysym, Qmodifier_value); | 4940 | tem = Fget (Vx_alt_keysym, Qmodifier_value); |
| 4911 | if (INTEGERP (tem)) mod_alt = XFIXNUM (tem) & INT_MAX; | 4941 | if (INTEGERP (tem)) *mod_alt = XFIXNUM (tem) & INT_MAX; |
| 4912 | tem = Fget (Vx_meta_keysym, Qmodifier_value); | 4942 | tem = Fget (Vx_meta_keysym, Qmodifier_value); |
| 4913 | if (INTEGERP (tem)) mod_meta = XFIXNUM (tem) & INT_MAX; | 4943 | if (INTEGERP (tem)) *mod_meta = XFIXNUM (tem) & INT_MAX; |
| 4914 | tem = Fget (Vx_hyper_keysym, Qmodifier_value); | 4944 | tem = Fget (Vx_hyper_keysym, Qmodifier_value); |
| 4915 | if (INTEGERP (tem)) mod_hyper = XFIXNUM (tem) & INT_MAX; | 4945 | if (INTEGERP (tem)) *mod_hyper = XFIXNUM (tem) & INT_MAX; |
| 4916 | tem = Fget (Vx_super_keysym, Qmodifier_value); | 4946 | tem = Fget (Vx_super_keysym, Qmodifier_value); |
| 4917 | if (INTEGERP (tem)) mod_super = XFIXNUM (tem) & INT_MAX; | 4947 | if (INTEGERP (tem)) *mod_super = XFIXNUM (tem) & INT_MAX; |
| 4918 | |||
| 4919 | return ( ((state & GDK_SHIFT_MASK) ? shift_modifier : 0) | ||
| 4920 | | ((state & GDK_CONTROL_MASK) ? mod_ctrl : 0) | ||
| 4921 | | ((state & GDK_META_MASK) ? mod_meta : 0) | ||
| 4922 | | ((state & GDK_MOD1_MASK) ? mod_alt : 0) | ||
| 4923 | | ((state & GDK_SUPER_MASK) ? mod_super : 0) | ||
| 4924 | | ((state & GDK_HYPER_MASK) ? mod_hyper : 0)); | ||
| 4925 | } | 4948 | } |
| 4926 | 4949 | ||
| 4927 | static int | 4950 | int |
| 4928 | pgtk_emacs_to_gtk_modifiers (EMACS_INT state) | 4951 | pgtk_gtk_to_emacs_modifiers (struct pgtk_display_info *dpyinfo, int state) |
| 4929 | { | 4952 | { |
| 4930 | EMACS_INT mod_ctrl = ctrl_modifier; | 4953 | int mod_ctrl; |
| 4931 | EMACS_INT mod_meta = meta_modifier; | 4954 | int mod_meta; |
| 4932 | EMACS_INT mod_alt = alt_modifier; | 4955 | int mod_alt; |
| 4933 | EMACS_INT mod_hyper = hyper_modifier; | 4956 | int mod_hyper; |
| 4934 | EMACS_INT mod_super = super_modifier; | 4957 | int mod_super; |
| 4958 | int mod; | ||
| 4935 | 4959 | ||
| 4936 | Lisp_Object tem; | 4960 | get_modifier_values(&mod_ctrl, &mod_meta, &mod_alt, &mod_hyper, &mod_super); |
| 4937 | 4961 | ||
| 4938 | tem = Fget (Vx_ctrl_keysym, Qmodifier_value); | 4962 | mod = 0; |
| 4939 | if (INTEGERP (tem)) mod_ctrl = XFIXNUM (tem); | 4963 | if (state & GDK_SHIFT_MASK) mod |= shift_modifier; |
| 4940 | tem = Fget (Vx_alt_keysym, Qmodifier_value); | 4964 | if (state & GDK_CONTROL_MASK) mod |= mod_ctrl; |
| 4941 | if (INTEGERP (tem)) mod_alt = XFIXNUM (tem); | 4965 | if (state & dpyinfo->meta_mod_mask) mod |= mod_meta; |
| 4942 | tem = Fget (Vx_meta_keysym, Qmodifier_value); | 4966 | if (state & dpyinfo->alt_mod_mask) mod |= mod_alt; |
| 4943 | if (INTEGERP (tem)) mod_meta = XFIXNUM (tem); | 4967 | if (state & GDK_SUPER_MASK) mod |= mod_super; |
| 4944 | tem = Fget (Vx_hyper_keysym, Qmodifier_value); | 4968 | if (state & GDK_HYPER_MASK) mod |= mod_hyper; |
| 4945 | if (INTEGERP (tem)) mod_hyper = XFIXNUM (tem); | 4969 | return mod; |
| 4946 | tem = Fget (Vx_super_keysym, Qmodifier_value); | 4970 | } |
| 4947 | if (INTEGERP (tem)) mod_super = XFIXNUM (tem); | 4971 | |
| 4972 | static int | ||
| 4973 | pgtk_emacs_to_gtk_modifiers (struct pgtk_display_info *dpyinfo, int state) | ||
| 4974 | { | ||
| 4975 | int mod_ctrl; | ||
| 4976 | int mod_meta; | ||
| 4977 | int mod_alt; | ||
| 4978 | int mod_hyper; | ||
| 4979 | int mod_super; | ||
| 4980 | int mask; | ||
| 4948 | 4981 | ||
| 4982 | get_modifier_values(&mod_ctrl, &mod_meta, &mod_alt, &mod_hyper, &mod_super); | ||
| 4949 | 4983 | ||
| 4950 | return ( ((state & mod_alt) ? GDK_MOD1_MASK : 0) | 4984 | mask = 0; |
| 4951 | | ((state & mod_super) ? GDK_SUPER_MASK : 0) | 4985 | if (state & mod_alt) mask |= dpyinfo->alt_mod_mask; |
| 4952 | | ((state & mod_hyper) ? GDK_HYPER_MASK : 0) | 4986 | if (state & mod_super) mask |= GDK_SUPER_MASK; |
| 4953 | | ((state & shift_modifier) ? GDK_SHIFT_MASK : 0) | 4987 | if (state & mod_hyper) mask |= GDK_HYPER_MASK; |
| 4954 | | ((state & mod_ctrl) ? GDK_CONTROL_MASK : 0) | 4988 | if (state & shift_modifier) mask |= GDK_SHIFT_MASK; |
| 4955 | | ((state & mod_meta) ? GDK_META_MASK : 0)); | 4989 | if (state & mod_ctrl) mask |= GDK_CONTROL_MASK; |
| 4990 | if (state & mod_meta) mask |= dpyinfo->meta_mod_mask; | ||
| 4991 | return mask; | ||
| 4956 | } | 4992 | } |
| 4957 | 4993 | ||
| 4958 | #define IsCursorKey(keysym) (0xff50 <= (keysym) && (keysym) < 0xff60) | 4994 | #define IsCursorKey(keysym) (0xff50 <= (keysym) && (keysym) < 0xff60) |
| @@ -5008,7 +5044,7 @@ static gboolean key_press_event(GtkWidget *widget, GdkEvent *event, gpointer *us | |||
| 5008 | Lisp_Object c; | 5044 | Lisp_Object c; |
| 5009 | guint state = event->key.state; | 5045 | guint state = event->key.state; |
| 5010 | 5046 | ||
| 5011 | state |= pgtk_emacs_to_gtk_modifiers (extra_keyboard_modifiers); | 5047 | state |= pgtk_emacs_to_gtk_modifiers (FRAME_DISPLAY_INFO (f), extra_keyboard_modifiers); |
| 5012 | modifiers = state; | 5048 | modifiers = state; |
| 5013 | 5049 | ||
| 5014 | /* This will have to go some day... */ | 5050 | /* This will have to go some day... */ |
| @@ -5031,7 +5067,7 @@ static gboolean key_press_event(GtkWidget *widget, GdkEvent *event, gpointer *us | |||
| 5031 | 5067 | ||
| 5032 | /* Common for all keysym input events. */ | 5068 | /* Common for all keysym input events. */ |
| 5033 | XSETFRAME (inev.ie.frame_or_window, f); | 5069 | XSETFRAME (inev.ie.frame_or_window, f); |
| 5034 | inev.ie.modifiers = pgtk_gtk_to_emacs_modifiers (modifiers); | 5070 | inev.ie.modifiers = pgtk_gtk_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), modifiers); |
| 5035 | inev.ie.timestamp = event->key.time; | 5071 | inev.ie.timestamp = event->key.time; |
| 5036 | 5072 | ||
| 5037 | /* First deal with keysyms which have defined | 5073 | /* First deal with keysyms which have defined |
| @@ -5680,7 +5716,7 @@ construct_mouse_click (struct input_event *result, | |||
| 5680 | result->kind = MOUSE_CLICK_EVENT; | 5716 | result->kind = MOUSE_CLICK_EVENT; |
| 5681 | result->code = event->button - 1; | 5717 | result->code = event->button - 1; |
| 5682 | result->timestamp = event->time; | 5718 | result->timestamp = event->time; |
| 5683 | result->modifiers = (pgtk_gtk_to_emacs_modifiers (event->state) | 5719 | result->modifiers = (pgtk_gtk_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), event->state) |
| 5684 | | (event->type == GDK_BUTTON_RELEASE | 5720 | | (event->type == GDK_BUTTON_RELEASE |
| 5685 | ? up_modifier | 5721 | ? up_modifier |
| 5686 | : down_modifier)); | 5722 | : down_modifier)); |
| @@ -5817,7 +5853,7 @@ scroll_event(GtkWidget *widget, GdkEvent *event, gpointer *user_data) | |||
| 5817 | 5853 | ||
| 5818 | inev.ie.kind = WHEEL_EVENT; | 5854 | inev.ie.kind = WHEEL_EVENT; |
| 5819 | inev.ie.timestamp = event->scroll.time; | 5855 | inev.ie.timestamp = event->scroll.time; |
| 5820 | inev.ie.modifiers = pgtk_gtk_to_emacs_modifiers (event->scroll.state); | 5856 | inev.ie.modifiers = pgtk_gtk_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), event->scroll.state); |
| 5821 | XSETINT (inev.ie.x, event->scroll.x); | 5857 | XSETINT (inev.ie.x, event->scroll.x); |
| 5822 | XSETINT (inev.ie.y, event->scroll.y); | 5858 | XSETINT (inev.ie.y, event->scroll.y); |
| 5823 | XSETFRAME (inev.ie.frame_or_window, f); | 5859 | XSETFRAME (inev.ie.frame_or_window, f); |
| @@ -6158,10 +6194,8 @@ pgtk_term_init (Lisp_Object display_name, char *resource_name) | |||
| 6158 | *nametail++ = '@'; | 6194 | *nametail++ = '@'; |
| 6159 | lispstpcpy (nametail, system_name); | 6195 | lispstpcpy (nametail, system_name); |
| 6160 | 6196 | ||
| 6161 | #if 0 | ||
| 6162 | /* Figure out which modifier bits mean what. */ | 6197 | /* Figure out which modifier bits mean what. */ |
| 6163 | x_find_modifier_meanings (dpyinfo); | 6198 | x_find_modifier_meanings (dpyinfo); |
| 6164 | #endif | ||
| 6165 | 6199 | ||
| 6166 | /* Get the scroll bar cursor. */ | 6200 | /* Get the scroll bar cursor. */ |
| 6167 | /* We must create a GTK cursor, it is required for GTK widgets. */ | 6201 | /* We must create a GTK cursor, it is required for GTK widgets. */ |
diff --git a/src/pgtkterm.h b/src/pgtkterm.h index 3222bb25975..c85a9ea097e 100644 --- a/src/pgtkterm.h +++ b/src/pgtkterm.h | |||
| @@ -222,6 +222,9 @@ struct pgtk_display_info | |||
| 222 | 222 | ||
| 223 | /* The frame where the mouse was last time we reported a mouse position. */ | 223 | /* The frame where the mouse was last time we reported a mouse position. */ |
| 224 | struct frame *last_mouse_glyph_frame; | 224 | struct frame *last_mouse_glyph_frame; |
| 225 | |||
| 226 | /* Modifier masks in gdk */ | ||
| 227 | int meta_mod_mask, alt_mod_mask; | ||
| 225 | }; | 228 | }; |
| 226 | 229 | ||
| 227 | /* This is a chain of structures for all the PGTK displays currently in use. */ | 230 | /* This is a chain of structures for all the PGTK displays currently in use. */ |
| @@ -529,7 +532,7 @@ extern int pgtk_lisp_to_color (Lisp_Object color, Emacs_Color *col); | |||
| 529 | 532 | ||
| 530 | /* Implemented in pgtkterm.c */ | 533 | /* Implemented in pgtkterm.c */ |
| 531 | extern void pgtk_clear_area (struct frame *f, int x, int y, int width, int height); | 534 | extern void pgtk_clear_area (struct frame *f, int x, int y, int width, int height); |
| 532 | extern int pgtk_gtk_to_emacs_modifiers (int state); | 535 | extern int pgtk_gtk_to_emacs_modifiers (struct pgtk_display_info *dpyinfo, int state); |
| 533 | extern void pgtk_clear_under_internal_border (struct frame *f); | 536 | extern void pgtk_clear_under_internal_border (struct frame *f); |
| 534 | extern void pgtk_set_event_handler(struct frame *f); | 537 | extern void pgtk_set_event_handler(struct frame *f); |
| 535 | 538 | ||