diff options
| author | Po Lu | 2022-01-10 02:32:01 +0000 |
|---|---|---|
| committer | Po Lu | 2022-01-10 02:32:01 +0000 |
| commit | bf121747de93f7a7d04f04ffde5e35c8725451e5 (patch) | |
| tree | a16a1ec6f9657588b415cf2aa44ec7af582b37aa /src | |
| parent | f3b1badfd61c499f141ecbf95cf594e73a752e4a (diff) | |
| download | emacs-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.cc | 167 | ||||
| -rw-r--r-- | src/haiku_support.h | 8 | ||||
| -rw-r--r-- | src/haikuterm.c | 7 |
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 | ||
| 139 | static int | ||
| 140 | keysym_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 | |||
| 139 | static void | 198 | static void |
| 140 | map_key (char *chars, int32 offset, uint32_t *c) | 199 | map_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. */ | ||
| 1851 | void | ||
| 1852 | be_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. */ |
| 1921 | void * | 1914 | void * |
| 1922 | BScrollBar_make_for_view (void *view, int horizontal_p, | 1915 | BScrollBar_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 | ||
| 138 | struct haiku_activation_event | 137 | struct 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 : |