diff options
| author | Po Lu | 2022-01-09 04:32:57 +0000 |
|---|---|---|
| committer | Po Lu | 2022-01-09 04:32:57 +0000 |
| commit | 97f41faf093280079f8cf409ee8604869964b9d9 (patch) | |
| tree | 3a1720581eab7f5640d0d77205cbc966a0ff3cb0 /src | |
| parent | 8aad4cee326dff4c63b05eaf290c34a397067b93 (diff) | |
| download | emacs-97f41faf093280079f8cf409ee8604869964b9d9.tar.gz emacs-97f41faf093280079f8cf409ee8604869964b9d9.zip | |
Make caps lock work on Haiku
* src/haiku_support.cc (map_caps):
(map_caps_shift): New functions.
(DispatchMessage): Map keys with the appropriate map if caps
lock is on.
Diffstat (limited to 'src')
| -rw-r--r-- | src/haiku_support.cc | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 47a6af92f61..03d5dad7699 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc | |||
| @@ -179,6 +179,40 @@ map_shift (uint32_t kc, uint32_t *ch) | |||
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | static void | 181 | static void |
| 182 | map_caps (uint32_t kc, uint32_t *ch) | ||
| 183 | { | ||
| 184 | if (!key_map_lock.Lock ()) | ||
| 185 | gui_abort ("Failed to lock keymap"); | ||
| 186 | if (!key_map) | ||
| 187 | get_key_map (&key_map, &key_chars); | ||
| 188 | if (!key_map) | ||
| 189 | return; | ||
| 190 | if (kc >= 128) | ||
| 191 | return; | ||
| 192 | |||
| 193 | int32_t m = key_map->caps_map[kc]; | ||
| 194 | map_key (key_chars, m, ch); | ||
| 195 | key_map_lock.Unlock (); | ||
| 196 | } | ||
| 197 | |||
| 198 | static void | ||
| 199 | map_caps_shift (uint32_t kc, uint32_t *ch) | ||
| 200 | { | ||
| 201 | if (!key_map_lock.Lock ()) | ||
| 202 | gui_abort ("Failed to lock keymap"); | ||
| 203 | if (!key_map) | ||
| 204 | get_key_map (&key_map, &key_chars); | ||
| 205 | if (!key_map) | ||
| 206 | return; | ||
| 207 | if (kc >= 128) | ||
| 208 | return; | ||
| 209 | |||
| 210 | int32_t m = key_map->caps_shift_map[kc]; | ||
| 211 | map_key (key_chars, m, ch); | ||
| 212 | key_map_lock.Unlock (); | ||
| 213 | } | ||
| 214 | |||
| 215 | static void | ||
| 182 | map_normal (uint32_t kc, uint32_t *ch) | 216 | map_normal (uint32_t kc, uint32_t *ch) |
| 183 | { | 217 | { |
| 184 | if (!key_map_lock.Lock ()) | 218 | if (!key_map_lock.Lock ()) |
| @@ -605,9 +639,19 @@ public: | |||
| 605 | BUnicodeChar::FromUTF8 (msg->GetString ("bytes")); | 639 | BUnicodeChar::FromUTF8 (msg->GetString ("bytes")); |
| 606 | 640 | ||
| 607 | if ((mods & B_SHIFT_KEY) && rq.kc >= 0) | 641 | if ((mods & B_SHIFT_KEY) && rq.kc >= 0) |
| 608 | map_shift (rq.kc, &rq.unraw_mb_char); | 642 | { |
| 643 | if (mods & B_CAPS_LOCK) | ||
| 644 | map_caps_shift (rq.kc, &rq.unraw_mb_char); | ||
| 645 | else | ||
| 646 | map_shift (rq.kc, &rq.unraw_mb_char); | ||
| 647 | } | ||
| 609 | else if (rq.kc >= 0) | 648 | else if (rq.kc >= 0) |
| 610 | map_normal (rq.kc, &rq.unraw_mb_char); | 649 | { |
| 650 | if (mods & B_CAPS_LOCK) | ||
| 651 | map_caps (rq.kc, &rq.unraw_mb_char); | ||
| 652 | else | ||
| 653 | map_normal (rq.kc, &rq.unraw_mb_char); | ||
| 654 | } | ||
| 611 | 655 | ||
| 612 | haiku_write (msg->what == B_KEY_DOWN ? KEY_DOWN : KEY_UP, &rq); | 656 | haiku_write (msg->what == B_KEY_DOWN ? KEY_DOWN : KEY_UP, &rq); |
| 613 | } | 657 | } |