aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-01-10 02:32:01 +0000
committerPo Lu2022-01-10 02:32:01 +0000
commitbf121747de93f7a7d04f04ffde5e35c8725451e5 (patch)
treea16a1ec6f9657588b415cf2aa44ec7af582b37aa /src
parentf3b1badfd61c499f141ecbf95cf594e73a752e4a (diff)
downloademacs-bf121747de93f7a7d04f04ffde5e35c8725451e5.tar.gz
emacs-bf121747de93f7a7d04f04ffde5e35c8725451e5.zip
Don't hard code key codes on Haiku
* src/haiku_support.cc (keysym_from_raw_char): New function. (DispatchMessage): Map raw character to keysym if applicable. (be_map_key): Delete function. * src/haiku_support.h (struct haiku_key_event): Update fields to hold keysym and character instead. * src/haikuterm.c (haiku_read_socket): Don't call be_map_key, and use keysym field if provided instead.
Diffstat (limited to 'src')
-rw-r--r--src/haiku_support.cc167
-rw-r--r--src/haiku_support.h8
-rw-r--r--src/haikuterm.c7
3 files changed, 84 insertions, 98 deletions
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index c4ff52a5305..459f8c2be40 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -136,6 +136,65 @@ gui_abort (const char *msg)
136 emacs_abort (); 136 emacs_abort ();
137} 137}
138 138
139static int
140keysym_from_raw_char (int32 raw, int32 key, unsigned *code)
141{
142 switch (raw)
143 {
144 case B_BACKSPACE:
145 *code = XK_BackSpace;
146 break;
147 case B_RETURN:
148 *code = XK_Return;
149 break;
150 case B_TAB:
151 *code = XK_Tab;
152 break;
153 case B_ESCAPE:
154 *code = XK_Escape;
155 break;
156 case B_LEFT_ARROW:
157 *code = XK_Left;
158 break;
159 case B_RIGHT_ARROW:
160 *code = XK_Right;
161 break;
162 case B_UP_ARROW:
163 *code = XK_Up;
164 break;
165 case B_DOWN_ARROW:
166 *code = XK_Down;
167 break;
168 case B_INSERT:
169 *code = XK_Insert;
170 break;
171 case B_DELETE:
172 *code = XK_Delete;
173 break;
174 case B_HOME:
175 *code = XK_Home;
176 break;
177 case B_END:
178 *code = XK_End;
179 break;
180 case B_PAGE_UP:
181 *code = XK_Page_Up;
182 break;
183 case B_PAGE_DOWN:
184 *code = XK_Page_Down;
185 break;
186
187 case B_FUNCTION_KEY:
188 *code = XK_F1 + key - 2;
189 break;
190
191 default:
192 return 0;
193 }
194
195 return 1;
196}
197
139static void 198static void
140map_key (char *chars, int32 offset, uint32_t *c) 199map_key (char *chars, int32 offset, uint32_t *c)
141{ 200{
@@ -616,7 +675,9 @@ public:
616 675
617 rq.window = this; 676 rq.window = this;
618 677
619 int32_t code = msg->GetInt32 ("raw_char", 0); 678 int32 raw, key;
679 msg->FindInt32 ("raw_char", &raw);
680 msg->FindInt32 ("key", &key);
620 681
621 rq.modifiers = 0; 682 rq.modifiers = 0;
622 uint32_t mods = modifiers (); 683 uint32_t mods = modifiers ();
@@ -633,24 +694,27 @@ public:
633 if (mods & B_OPTION_KEY) 694 if (mods & B_OPTION_KEY)
634 rq.modifiers |= HAIKU_MODIFIER_SUPER; 695 rq.modifiers |= HAIKU_MODIFIER_SUPER;
635 696
636 rq.mb_char = code; 697 if (!keysym_from_raw_char (raw, key, &rq.keysym))
637 rq.kc = msg->GetInt32 ("key", -1); 698 rq.keysym = 0;
638 rq.unraw_mb_char =
639 BUnicodeChar::FromUTF8 (msg->GetString ("bytes"));
640 699
641 if ((mods & B_SHIFT_KEY) && rq.kc >= 0) 700 rq.multibyte_char = 0;
642 { 701
643 if (mods & B_CAPS_LOCK) 702 if (!rq.keysym)
644 map_caps_shift (rq.kc, &rq.unraw_mb_char);
645 else
646 map_shift (rq.kc, &rq.unraw_mb_char);
647 }
648 else if (rq.kc >= 0)
649 { 703 {
650 if (mods & B_CAPS_LOCK) 704 if (mods & B_SHIFT_KEY)
651 map_caps (rq.kc, &rq.unraw_mb_char); 705 {
706 if (mods & B_CAPS_LOCK)
707 map_caps_shift (key, &rq.multibyte_char);
708 else
709 map_shift (key, &rq.multibyte_char);
710 }
652 else 711 else
653 map_normal (rq.kc, &rq.unraw_mb_char); 712 {
713 if (mods & B_CAPS_LOCK)
714 map_caps (key, &rq.multibyte_char);
715 else
716 map_normal (key, &rq.multibyte_char);
717 }
654 } 718 }
655 719
656 haiku_write (msg->what == B_KEY_DOWN ? KEY_DOWN : KEY_UP, &rq); 720 haiku_write (msg->what == B_KEY_DOWN ? KEY_DOWN : KEY_UP, &rq);
@@ -1846,77 +1910,6 @@ BWindow_Flush (void *window)
1846 ((BWindow *) window)->Flush (); 1910 ((BWindow *) window)->Flush ();
1847} 1911}
1848 1912
1849/* Map the keycode KC, storing the result in CODE and 1 in
1850 NON_ASCII_P if it should be used. */
1851void
1852be_map_key (uint32_t kc, int *non_ascii_p, unsigned *code)
1853{
1854 if (*code == 10 && kc != 0x42)
1855 {
1856 *code = XK_Return;
1857 *non_ascii_p = 1;
1858 return;
1859 }
1860
1861 switch (kc)
1862 {
1863 default:
1864 *non_ascii_p = 0;
1865 if (kc < 0xe && kc > 0x1)
1866 {
1867 *code = XK_F1 + kc - 2;
1868 *non_ascii_p = 1;
1869 }
1870 return;
1871 case 0x1e:
1872 *code = XK_BackSpace;
1873 break;
1874 case 0x61:
1875 *code = XK_Left;
1876 break;
1877 case 0x63:
1878 *code = XK_Right;
1879 break;
1880 case 0x57:
1881 *code = XK_Up;
1882 break;
1883 case 0x62:
1884 *code = XK_Down;
1885 break;
1886 case 0x64:
1887 case 0x1f:
1888 *code = XK_Insert;
1889 break;
1890 case 0x65:
1891 case 0x34:
1892 *code = XK_Delete;
1893 break;
1894 case 0x37:
1895 case 0x20:
1896 *code = XK_Home;
1897 break;
1898 case 0x58:
1899 case 0x35:
1900 *code = XK_End;
1901 break;
1902 case 0x39:
1903 case 0x21:
1904 *code = XK_Page_Up;
1905 break;
1906 case 0x5a:
1907 case 0x36:
1908 *code = XK_Page_Down;
1909 break;
1910 case 0x1:
1911 *code = XK_Escape;
1912 break;
1913 case 0x68:
1914 *code = XK_Menu;
1915 break;
1916 }
1917 *non_ascii_p = 1;
1918}
1919
1920/* Make a scrollbar, attach it to VIEW's window, and return it. */ 1913/* Make a scrollbar, attach it to VIEW's window, and return it. */
1921void * 1914void *
1922BScrollBar_make_for_view (void *view, int horizontal_p, 1915BScrollBar_make_for_view (void *view, int horizontal_p,
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 114e8429ab5..d39e30735d3 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -130,9 +130,8 @@ struct haiku_key_event
130{ 130{
131 void *window; 131 void *window;
132 int modifiers; 132 int modifiers;
133 uint32_t mb_char; 133 unsigned keysym;
134 uint32_t unraw_mb_char; 134 uint32_t multibyte_char;
135 short kc;
136}; 135};
137 136
138struct haiku_activation_event 137struct haiku_activation_event
@@ -560,9 +559,6 @@ extern "C"
560 extern void 559 extern void
561 BWindow_Flush (void *window); 560 BWindow_Flush (void *window);
562 561
563 extern void
564 be_map_key (uint32_t kc, int *non_ascii_p, unsigned *code);
565
566 extern void * 562 extern void *
567 BScrollBar_make_for_view (void *view, int horizontal_p, 563 BScrollBar_make_for_view (void *view, int horizontal_p,
568 int x, int y, int x1, int y1, 564 int x, int y, int x1, int y1,
diff --git a/src/haikuterm.c b/src/haikuterm.c
index e5bf917fb9a..b2337fe1047 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -2670,7 +2670,6 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
2670 struct haiku_key_event *b = buf; 2670 struct haiku_key_event *b = buf;
2671 Mouse_HLInfo *hlinfo = &x_display_list->mouse_highlight; 2671 Mouse_HLInfo *hlinfo = &x_display_list->mouse_highlight;
2672 struct frame *f = haiku_window_to_frame (b->window); 2672 struct frame *f = haiku_window_to_frame (b->window);
2673 int non_ascii_p;
2674 if (!f) 2673 if (!f)
2675 continue; 2674 continue;
2676 2675
@@ -2686,11 +2685,9 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
2686 need_flush = 1; 2685 need_flush = 1;
2687 } 2686 }
2688 2687
2689 inev.code = b->unraw_mb_char; 2688 inev.code = b->keysym ? b->keysym : b->multibyte_char;
2690 2689
2691 be_map_key (b->kc, &non_ascii_p, &inev.code); 2690 if (b->keysym)
2692
2693 if (non_ascii_p)
2694 inev.kind = NON_ASCII_KEYSTROKE_EVENT; 2691 inev.kind = NON_ASCII_KEYSTROKE_EVENT;
2695 else 2692 else
2696 inev.kind = inev.code > 127 ? MULTIBYTE_CHAR_KEYSTROKE_EVENT : 2693 inev.kind = inev.code > 127 ? MULTIBYTE_CHAR_KEYSTROKE_EVENT :