aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYuuki Harano2019-07-10 02:32:35 +0900
committerJeff Walsh2020-11-22 14:46:55 +1100
commit519a4ac39f7cd9e2339b203463704db48752bc5b (patch)
tree1a3048b3ee44a1de0ea20a37a826708c9b72f3d3 /src
parent68b99a3e6615a7f3eb21dbd72b0b796960831a5e (diff)
downloademacs-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.c2
-rw-r--r--src/pgtkterm.c132
-rw-r--r--src/pgtkterm.h5
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
4898int 4898static void
4899pgtk_gtk_to_emacs_modifiers (int state) 4899x_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
4923static 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
4927static int 4950int
4928pgtk_emacs_to_gtk_modifiers (EMACS_INT state) 4951pgtk_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
4972static int
4973pgtk_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 */
531extern void pgtk_clear_area (struct frame *f, int x, int y, int width, int height); 534extern void pgtk_clear_area (struct frame *f, int x, int y, int width, int height);
532extern int pgtk_gtk_to_emacs_modifiers (int state); 535extern int pgtk_gtk_to_emacs_modifiers (struct pgtk_display_info *dpyinfo, int state);
533extern void pgtk_clear_under_internal_border (struct frame *f); 536extern void pgtk_clear_under_internal_border (struct frame *f);
534extern void pgtk_set_event_handler(struct frame *f); 537extern void pgtk_set_event_handler(struct frame *f);
535 538