aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-01-09 04:32:57 +0000
committerPo Lu2022-01-09 04:32:57 +0000
commit97f41faf093280079f8cf409ee8604869964b9d9 (patch)
tree3a1720581eab7f5640d0d77205cbc966a0ff3cb0 /src
parent8aad4cee326dff4c63b05eaf290c34a397067b93 (diff)
downloademacs-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.cc48
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
181static void 181static void
182map_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
198static void
199map_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
215static void
182map_normal (uint32_t kc, uint32_t *ch) 216map_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 }