diff options
| author | YAMAMOTO Mitsuharu | 2006-05-23 08:12:13 +0000 |
|---|---|---|
| committer | YAMAMOTO Mitsuharu | 2006-05-23 08:12:13 +0000 |
| commit | b8c6940eafe88b5a7d8dbf53943962cee9079f36 (patch) | |
| tree | 2aa11792aa477e5c1fa9f9073b0543460b2566a0 /src | |
| parent | b12d1537e7b0dcc07bdfc7ca3a63f4e3b14595dd (diff) | |
| download | emacs-b8c6940eafe88b5a7d8dbf53943962cee9079f36.tar.gz emacs-b8c6940eafe88b5a7d8dbf53943962cee9079f36.zip | |
(fn_keycode_to_xkeysym_table, convert_fn_keycode): Remove.
(fn_keycode_to_keycode_table) [MAC_OSX]: New variable.
(mac_set_unicode_keystroke_event) [TARGET_API_MAC_CARBON]: New function.
(XTread_socket) [TARGET_API_MAC_CARBON]: Use it.
(XTread_socket) [MAC_OSX]: Try 'uchr' Unicode keyboard-layout
resource to backtranslate key with modifiers.
(XTread_socket): Don't set read_socket_inev around AEProcessAppleEvent.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 12 | ||||
| -rw-r--r-- | src/macterm.c | 384 |
2 files changed, 226 insertions, 170 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index fad5c85727f..c2fdb389729 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,13 @@ | |||
| 1 | 2006-05-23 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> | ||
| 2 | |||
| 3 | * macterm.c (fn_keycode_to_xkeysym_table, convert_fn_keycode): Remove. | ||
| 4 | (fn_keycode_to_keycode_table) [MAC_OSX]: New variable. | ||
| 5 | (mac_set_unicode_keystroke_event) [TARGET_API_MAC_CARBON]: New function. | ||
| 6 | (XTread_socket) [TARGET_API_MAC_CARBON]: Use it. | ||
| 7 | (XTread_socket) [MAC_OSX]: Try 'uchr' Unicode keyboard-layout | ||
| 8 | resource to backtranslate key with modifiers. | ||
| 9 | (XTread_socket): Don't set read_socket_inev around AEProcessAppleEvent. | ||
| 10 | |||
| 1 | 2006-05-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> | 11 | 2006-05-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> |
| 2 | 12 | ||
| 3 | * xterm.c: Remove declarations already in xterm.h | 13 | * xterm.c: Remove declarations already in xterm.h |
| @@ -147,7 +157,7 @@ | |||
| 147 | [MAC_OS] (gif_load): Emulate Graphic Control Extension block. | 157 | [MAC_OS] (gif_load): Emulate Graphic Control Extension block. |
| 148 | 158 | ||
| 149 | * macfns.c (x_to_mac_color): Fix shift amount change. | 159 | * macfns.c (x_to_mac_color): Fix shift amount change. |
| 150 | [USE_MAC_FONT_PANEL] (mac_set_font): Use x_get_focus_frame. | 160 | (mac_set_font) [USE_MAC_FONT_PANEL]: Use x_get_focus_frame. |
| 151 | [USE_MAC_FONT_PANEL] (Fmac_set_font_panel_visibility): Doc fix. | 161 | [USE_MAC_FONT_PANEL] (Fmac_set_font_panel_visibility): Doc fix. |
| 152 | 162 | ||
| 153 | * macselect.c (Vmac_service_selection) [MAC_OSX]: Rename from | 163 | * macselect.c (Vmac_service_selection) [MAC_OSX]: Rename from |
diff --git a/src/macterm.c b/src/macterm.c index 5401e9dfe0e..8ed33226036 100644 --- a/src/macterm.c +++ b/src/macterm.c | |||
| @@ -9629,7 +9629,12 @@ keycode_to_xkeysym (int keyCode, int *xKeySym) | |||
| 9629 | return *xKeySym != 0; | 9629 | return *xKeySym != 0; |
| 9630 | } | 9630 | } |
| 9631 | 9631 | ||
| 9632 | static unsigned char fn_keycode_to_xkeysym_table[] = { | 9632 | #ifdef MAC_OSX |
| 9633 | /* Table for translating Mac keycode with the laptop `fn' key to that | ||
| 9634 | without it. Destination symbols in comments are keys on US | ||
| 9635 | keyboard, and they may not be the same on other types of | ||
| 9636 | keyboards. */ | ||
| 9637 | static unsigned char fn_keycode_to_keycode_table[] = { | ||
| 9633 | /*0x00*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 9638 | /*0x00*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 9634 | /*0x10*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 9639 | /*0x10*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 9635 | /*0x20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 9640 | /*0x20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| @@ -9639,113 +9644,27 @@ static unsigned char fn_keycode_to_xkeysym_table[] = { | |||
| 9639 | /*0x38*/ 0, 0, 0, 0, | 9644 | /*0x38*/ 0, 0, 0, 0, |
| 9640 | /*0x3C*/ 0, 0, 0, 0, | 9645 | /*0x3C*/ 0, 0, 0, 0, |
| 9641 | 9646 | ||
| 9642 | /*0x40*/ 0, 0x2e /*kp-. = .*/, 0, 0x50 /*kp-* = 'p'*/, | 9647 | /*0x40*/ 0, 0x2f /*kp-. -> '.'*/, 0, 0x23 /*kp-* -> 'p'*/, |
| 9643 | /*0x44*/ 0, '/' /*kp-+*/, 0, 0, | 9648 | /*0x44*/ 0, 0x2c /*kp-+ -> '/'*/, 0, 0x16 /*clear -> '6'*/, |
| 9644 | /*0x48*/ 0, 0, 0, 0x30 /*kp-/ = '0'*/, | 9649 | /*0x48*/ 0, 0, 0, 0x1d /*kp-/ -> '0'*/, |
| 9645 | /*0x4C*/ 0, 0, 0x3b /*kp-- = ';'*/, 0, | 9650 | /*0x4C*/ 0x24 /*kp-enter -> return*/, 0, 0x29 /*kp-- -> ';'*/, 0, |
| 9646 | 9651 | ||
| 9647 | /*0x50*/ 0, 0x2d /*kp-= = '-'*/, 0x6d /*kp-0 = 'm'*/, 0x6a /*kp-1 = 'j'*/, | 9652 | /*0x50*/ 0, 0x1b /*kp-= -> '-'*/, 0x2e /*kp-0 -> 'm'*/, 0x26 /*kp-1 -> 'j'*/, |
| 9648 | /*0x54*/ 0x6b /*kp-2 = 'k'*/, 0x6c /*kp-3 = 'l'*/, 'u' /*kp-4*/, 'i' /*kp-5*/, | 9653 | /*0x54*/ 0x28 /*kp-2 -> 'k'*/, 0x25 /*kp-3 -> 'l'*/, 0x20 /*kp-4 -> 'u'*/, 0x22 /*kp-5 ->'i'*/, |
| 9649 | /*0x58*/ 'o' /*kp-6*/, '7' /*kp-7*/, 0, '8' /*kp-8*/, | 9654 | /*0x58*/ 0x1f /*kp-6 -> 'o'*/, 0x1a /*kp-7 -> '7'*/, 0, 0x1c /*kp-8 -> '8'*/, |
| 9650 | /*0x5C*/ '9' /*kp-9*/, 0, 0, 0, | 9655 | /*0x5C*/ 0x19 /*kp-9 -> '9'*/, 0, 0, 0, |
| 9651 | 9656 | ||
| 9652 | /*0x60*/ 0, 0, 0, 0, | 9657 | /*0x60*/ 0, 0, 0, 0, |
| 9653 | /*0x64*/ 0, 0, 0, 0, | 9658 | /*0x64*/ 0, 0, 0, 0, |
| 9654 | /*0x68*/ 0, 0, 0, 0, | 9659 | /*0x68*/ 0, 0, 0, 0, |
| 9655 | /*0x6C*/ 0, 0, 0, 0, | 9660 | /*0x6C*/ 0, 0, 0, 0, |
| 9656 | 9661 | ||
| 9657 | /*0x70*/ 0, 0, 0, 0, | 9662 | /*0x70*/ 0, 0, 0, 0x7b /*home -> left*/, |
| 9658 | /*0x74*/ 0, 0, 0, 0, | 9663 | /*0x74*/ 0x7e /*pgup -> up*/, 0x33 /*delete -> backspace*/, 0, 0x7c /*end -> right*/, |
| 9659 | /*0x78*/ 0, 0, 0, 0, | 9664 | /*0x78*/ 0, 0x7d /*pgdown -> down*/, 0, 0, |
| 9660 | /*0x7C*/ 0, 0, 0, 0 | 9665 | /*0x7C*/ 0, 0, 0, 0 |
| 9661 | }; | 9666 | }; |
| 9662 | static int | 9667 | #endif /* MAC_OSX */ |
| 9663 | convert_fn_keycode (EventRef eventRef, int keyCode, int *newCode) | ||
| 9664 | { | ||
| 9665 | #ifdef MAC_OSX | ||
| 9666 | /* Use the special map to translate keys when function modifier is | ||
| 9667 | to be caught. KeyTranslate can't be used in that case. | ||
| 9668 | We can't detect the function key using the input_event.modifiers, | ||
| 9669 | because this uses the high word of an UInt32. Therefore, | ||
| 9670 | we'll just read it out of the original eventRef. | ||
| 9671 | */ | ||
| 9672 | |||
| 9673 | |||
| 9674 | /* TODO / known issues | ||
| 9675 | |||
| 9676 | - Fn-Shift-j is regonized as Fn-j and not Fn-J. | ||
| 9677 | The above table always translates to lower characters. We need to use | ||
| 9678 | the KCHR keyboard resource (KeyTranslate() ) to map k->K and 8->*. | ||
| 9679 | |||
| 9680 | - The table is meant for English language keyboards, and it will work | ||
| 9681 | for many others with the exception of key combinations like Fn-ö on | ||
| 9682 | a German keyboard, which is currently mapped to Fn-;. | ||
| 9683 | How to solve this without keeping separate tables for all keyboards | ||
| 9684 | around? KeyTranslate isn't of much help here, as it only takes a 16-bit | ||
| 9685 | value for keycode with the modifiers in he high byte, i.e. no room for the | ||
| 9686 | Fn modifier. That's why we need the table. | ||
| 9687 | |||
| 9688 | */ | ||
| 9689 | OSStatus err; | ||
| 9690 | UInt32 mods = 0; | ||
| 9691 | if (!NILP(Vmac_function_modifier)) | ||
| 9692 | { | ||
| 9693 | err = GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32, | ||
| 9694 | NULL, sizeof (UInt32), NULL, &mods); | ||
| 9695 | if (err == noErr && mods & kEventKeyModifierFnMask) | ||
| 9696 | { *newCode = fn_keycode_to_xkeysym_table [keyCode & 0x7f]; | ||
| 9697 | |||
| 9698 | return (*newCode != 0); | ||
| 9699 | } | ||
| 9700 | } | ||
| 9701 | #endif | ||
| 9702 | return false; | ||
| 9703 | } | ||
| 9704 | |||
| 9705 | static int | ||
| 9706 | backtranslate_modified_keycode(int mods, int keycode, int def) | ||
| 9707 | { | ||
| 9708 | EventModifiers mapped_modifiers = | ||
| 9709 | (NILP (Vmac_control_modifier) ? 0 : controlKey) | ||
| 9710 | | (NILP (Vmac_option_modifier) ? 0 : optionKey) | ||
| 9711 | | (NILP (Vmac_command_modifier) ? 0 : cmdKey); | ||
| 9712 | |||
| 9713 | if (mods & mapped_modifiers) | ||
| 9714 | { | ||
| 9715 | /* This code comes from Keyboard Resource, | ||
| 9716 | Appendix C of IM - Text. This is necessary | ||
| 9717 | since shift is ignored in KCHR table | ||
| 9718 | translation when option or command is pressed. | ||
| 9719 | It also does not translate correctly | ||
| 9720 | control-shift chars like C-% so mask off shift | ||
| 9721 | here also. | ||
| 9722 | |||
| 9723 | Not done for combinations with the option key (alt) | ||
| 9724 | unless it is to be caught by Emacs: this is | ||
| 9725 | to preserve key combinations translated by the OS | ||
| 9726 | such as Alt-3. | ||
| 9727 | */ | ||
| 9728 | /* Mask off modifier keys that are mapped to some Emacs | ||
| 9729 | modifiers. */ | ||
| 9730 | int new_modifiers = mods & ~mapped_modifiers; | ||
| 9731 | /* set high byte of keycode to modifier high byte*/ | ||
| 9732 | int new_keycode = keycode | new_modifiers; | ||
| 9733 | Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache); | ||
| 9734 | unsigned long some_state = 0; | ||
| 9735 | return (int) KeyTranslate (kchr_ptr, new_keycode, | ||
| 9736 | &some_state) & 0xff; | ||
| 9737 | /* TO DO: Recognize two separate resulting characters, "for | ||
| 9738 | example, when the user presses Option-E followed by N, you | ||
| 9739 | can map this through the KeyTranslate function using the | ||
| 9740 | U.S. 'KCHR' resource to produce ´n, which KeyTranslate | ||
| 9741 | returns as two characters in the bytes labeled Character code | ||
| 9742 | 1 and Character code 2." (from Carbon API doc) */ | ||
| 9743 | |||
| 9744 | } | ||
| 9745 | else | ||
| 9746 | return def; | ||
| 9747 | } | ||
| 9748 | |||
| 9749 | 9668 | ||
| 9750 | #if !USE_CARBON_EVENTS | 9669 | #if !USE_CARBON_EVENTS |
| 9751 | static RgnHandle mouse_region = NULL; | 9670 | static RgnHandle mouse_region = NULL; |
| @@ -9819,6 +9738,44 @@ mac_post_mouse_moved_event () | |||
| 9819 | 9738 | ||
| 9820 | return err; | 9739 | return err; |
| 9821 | } | 9740 | } |
| 9741 | |||
| 9742 | static void | ||
| 9743 | mac_set_unicode_keystroke_event (code, buf) | ||
| 9744 | UniChar code; | ||
| 9745 | struct input_event *buf; | ||
| 9746 | { | ||
| 9747 | int charset_id, c1, c2; | ||
| 9748 | |||
| 9749 | if (code < 0x80) | ||
| 9750 | { | ||
| 9751 | buf->kind = ASCII_KEYSTROKE_EVENT; | ||
| 9752 | buf->code = code; | ||
| 9753 | } | ||
| 9754 | else if (code < 0x100) | ||
| 9755 | { | ||
| 9756 | if (code < 0xA0) | ||
| 9757 | charset_id = CHARSET_8_BIT_CONTROL; | ||
| 9758 | else | ||
| 9759 | charset_id = charset_latin_iso8859_1; | ||
| 9760 | buf->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; | ||
| 9761 | buf->code = MAKE_CHAR (charset_id, code, 0); | ||
| 9762 | } | ||
| 9763 | else | ||
| 9764 | { | ||
| 9765 | if (code < 0x2500) | ||
| 9766 | charset_id = charset_mule_unicode_0100_24ff, | ||
| 9767 | code -= 0x100; | ||
| 9768 | else if (code < 0x33FF) | ||
| 9769 | charset_id = charset_mule_unicode_2500_33ff, | ||
| 9770 | code -= 0x2500; | ||
| 9771 | else if (code >= 0xE000) | ||
| 9772 | charset_id = charset_mule_unicode_e000_ffff, | ||
| 9773 | code -= 0xE000; | ||
| 9774 | c1 = (code / 96) + 32, c2 = (code % 96) + 32; | ||
| 9775 | buf->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; | ||
| 9776 | buf->code = MAKE_CHAR (charset_id, c1, c2); | ||
| 9777 | } | ||
| 9778 | } | ||
| 9822 | #endif | 9779 | #endif |
| 9823 | 9780 | ||
| 9824 | /* Emacs calls this whenever it wants to read an input event from the | 9781 | /* Emacs calls this whenever it wants to read an input event from the |
| @@ -10338,55 +10295,39 @@ XTread_socket (sd, expected, hold_quit) | |||
| 10338 | { | 10295 | { |
| 10339 | int keycode = (er.message & keyCodeMask) >> 8; | 10296 | int keycode = (er.message & keyCodeMask) >> 8; |
| 10340 | int xkeysym; | 10297 | int xkeysym; |
| 10298 | static SInt16 last_key_script = -1; | ||
| 10299 | SInt16 current_key_script; | ||
| 10300 | UInt32 modifiers = er.modifiers, mapped_modifiers; | ||
| 10301 | |||
| 10302 | mapped_modifiers = | ||
| 10303 | (NILP (Vmac_control_modifier) ? 0 : controlKey) | ||
| 10304 | | (NILP (Vmac_option_modifier) ? 0 : optionKey) | ||
| 10305 | | (NILP (Vmac_command_modifier) ? 0 : cmdKey); | ||
| 10341 | 10306 | ||
| 10342 | #if USE_CARBON_EVENTS && defined (MAC_OSX) | 10307 | #if USE_CARBON_EVENTS && defined (MAC_OSX) |
| 10308 | mapped_modifiers |= | ||
| 10309 | (NILP (Vmac_function_modifier) ? 0 : kEventKeyModifierFnMask); | ||
| 10310 | |||
| 10311 | GetEventParameter (eventRef, kEventParamKeyModifiers, | ||
| 10312 | typeUInt32, NULL, | ||
| 10313 | sizeof (UInt32), NULL, &modifiers); | ||
| 10314 | |||
| 10343 | /* When using Carbon Events, we need to pass raw keyboard | 10315 | /* When using Carbon Events, we need to pass raw keyboard |
| 10344 | events to the TSM ourselves. If TSM handles it, it | 10316 | events to the TSM ourselves. If TSM handles it, it |
| 10345 | will pass back noErr, otherwise it will pass back | 10317 | will pass back noErr, otherwise it will pass back |
| 10346 | "eventNotHandledErr" and we can process it | 10318 | "eventNotHandledErr" and we can process it |
| 10347 | normally. */ | 10319 | normally. */ |
| 10348 | if ((mac_pass_command_to_system | 10320 | if (!(modifiers |
| 10349 | || !(er.modifiers & cmdKey)) | 10321 | & mapped_modifiers |
| 10350 | && (mac_pass_control_to_system | 10322 | & ~(mac_pass_command_to_system ? cmdKey : 0) |
| 10351 | || !(er.modifiers & controlKey)) | 10323 | & ~(mac_pass_control_to_system ? controlKey : 0))) |
| 10352 | && (NILP (Vmac_option_modifier) | ||
| 10353 | || !(er.modifiers & optionKey))) | ||
| 10354 | if (SendEventToEventTarget (eventRef, toolbox_dispatcher) | 10324 | if (SendEventToEventTarget (eventRef, toolbox_dispatcher) |
| 10355 | != eventNotHandledErr) | 10325 | != eventNotHandledErr) |
| 10356 | break; | 10326 | break; |
| 10357 | #endif | 10327 | #endif |
| 10358 | if (er.what == keyUp) | 10328 | if (er.what == keyUp) |
| 10359 | break; | 10329 | break; |
| 10360 | 10330 | ||
| 10361 | #if 0 | ||
| 10362 | if (dpyinfo->x_focus_frame == NULL) | ||
| 10363 | { | ||
| 10364 | /* Beep if keyboard input occurs when all the frames | ||
| 10365 | are invisible. */ | ||
| 10366 | SysBeep (1); | ||
| 10367 | break; | ||
| 10368 | } | ||
| 10369 | #endif | ||
| 10370 | |||
| 10371 | { | ||
| 10372 | static SInt16 last_key_script = -1; | ||
| 10373 | SInt16 current_key_script = GetScriptManagerVariable (smKeyScript); | ||
| 10374 | |||
| 10375 | if (last_key_script != current_key_script) | ||
| 10376 | { | ||
| 10377 | struct input_event event; | ||
| 10378 | |||
| 10379 | EVENT_INIT (event); | ||
| 10380 | event.kind = LANGUAGE_CHANGE_EVENT; | ||
| 10381 | event.arg = Qnil; | ||
| 10382 | event.code = current_key_script; | ||
| 10383 | event.timestamp = timestamp; | ||
| 10384 | kbd_buffer_store_event (&event); | ||
| 10385 | count++; | ||
| 10386 | } | ||
| 10387 | last_key_script = current_key_script; | ||
| 10388 | } | ||
| 10389 | |||
| 10390 | ObscureCursor (); | 10331 | ObscureCursor (); |
| 10391 | 10332 | ||
| 10392 | f = mac_focus_frame (dpyinfo); | 10333 | f = mac_focus_frame (dpyinfo); |
| @@ -10398,51 +10339,156 @@ XTread_socket (sd, expected, hold_quit) | |||
| 10398 | dpyinfo->mouse_face_hidden = 1; | 10339 | dpyinfo->mouse_face_hidden = 1; |
| 10399 | } | 10340 | } |
| 10400 | 10341 | ||
| 10401 | /* translate the keycode back to determine the original key */ | 10342 | current_key_script = GetScriptManagerVariable (smKeyScript); |
| 10402 | /* Convert key code if function key is pressed. | 10343 | if (last_key_script != current_key_script) |
| 10403 | Otherwise, if non-ASCII-event, take care of that | ||
| 10404 | without re-translating the key code. */ | ||
| 10405 | #if USE_CARBON_EVENTS | ||
| 10406 | if (convert_fn_keycode (eventRef, keycode, &xkeysym)) | ||
| 10407 | { | 10344 | { |
| 10408 | inev.code = xkeysym; | 10345 | struct input_event event; |
| 10409 | /* this doesn't work - tried to add shift modifiers */ | 10346 | |
| 10410 | inev.code = | 10347 | EVENT_INIT (event); |
| 10411 | backtranslate_modified_keycode(er.modifiers & (~0x2200), | 10348 | event.kind = LANGUAGE_CHANGE_EVENT; |
| 10412 | xkeysym | 0x80, xkeysym); | 10349 | event.arg = Qnil; |
| 10413 | inev.kind = ASCII_KEYSTROKE_EVENT; | 10350 | event.code = current_key_script; |
| 10351 | event.timestamp = timestamp; | ||
| 10352 | kbd_buffer_store_event (&event); | ||
| 10353 | count++; | ||
| 10354 | last_key_script = current_key_script; | ||
| 10414 | } | 10355 | } |
| 10415 | else | 10356 | |
| 10357 | #ifdef MAC_OSX | ||
| 10358 | if (modifiers & kEventKeyModifierFnMask | ||
| 10359 | && keycode <= 0x7f | ||
| 10360 | && fn_keycode_to_keycode_table[keycode]) | ||
| 10361 | keycode = fn_keycode_to_keycode_table[keycode]; | ||
| 10416 | #endif | 10362 | #endif |
| 10417 | if (keycode_to_xkeysym (keycode, &xkeysym)) | 10363 | if (keycode_to_xkeysym (keycode, &xkeysym)) |
| 10418 | { | 10364 | { |
| 10419 | inev.code = 0xff00 | xkeysym; | 10365 | inev.kind = NON_ASCII_KEYSTROKE_EVENT; |
| 10420 | inev.kind = NON_ASCII_KEYSTROKE_EVENT; | 10366 | inev.code = 0xff00 | xkeysym; |
| 10421 | } | 10367 | } |
| 10422 | else | 10368 | else if (modifiers & mapped_modifiers) |
| 10423 | { | 10369 | { |
| 10424 | inev.code = | 10370 | /* translate the keycode back to determine the |
| 10425 | backtranslate_modified_keycode(er.modifiers, keycode, | 10371 | original key */ |
| 10426 | er.message & charCodeMask); | 10372 | #ifdef MAC_OSX |
| 10427 | inev.kind = ASCII_KEYSTROKE_EVENT; | 10373 | static SInt16 last_key_layout_id = 0; |
| 10428 | } | 10374 | static Handle uchr_handle = (Handle)-1; |
| 10429 | } | 10375 | SInt16 current_key_layout_id = |
| 10376 | GetScriptVariable (current_key_script, smScriptKeys); | ||
| 10377 | |||
| 10378 | if (uchr_handle == (Handle)-1 | ||
| 10379 | || last_key_layout_id != current_key_layout_id) | ||
| 10380 | { | ||
| 10381 | uchr_handle = GetResource ('uchr', current_key_layout_id); | ||
| 10382 | last_key_layout_id = current_key_layout_id; | ||
| 10383 | } | ||
| 10384 | |||
| 10385 | if (uchr_handle) | ||
| 10386 | { | ||
| 10387 | OSStatus status; | ||
| 10388 | UInt16 key_action = er.what - keyDown; | ||
| 10389 | UInt32 modifier_key_state = | ||
| 10390 | (modifiers & ~mapped_modifiers) >> 8; | ||
| 10391 | UInt32 keyboard_type = LMGetKbdType (); | ||
| 10392 | SInt32 dead_key_state = 0; | ||
| 10393 | UniChar code; | ||
| 10394 | UniCharCount actual_length; | ||
| 10395 | |||
| 10396 | status = UCKeyTranslate ((UCKeyboardLayout *)*uchr_handle, | ||
| 10397 | keycode, key_action, | ||
| 10398 | modifier_key_state, | ||
| 10399 | keyboard_type, | ||
| 10400 | kUCKeyTranslateNoDeadKeysMask, | ||
| 10401 | &dead_key_state, | ||
| 10402 | 1, &actual_length, &code); | ||
| 10403 | if (status == noErr && actual_length == 1) | ||
| 10404 | mac_set_unicode_keystroke_event (code, &inev); | ||
| 10405 | } | ||
| 10406 | #endif /* MAC_OSX */ | ||
| 10407 | |||
| 10408 | if (inev.kind == NO_EVENT) | ||
| 10409 | { | ||
| 10410 | /* This code comes from Keyboard Resource, | ||
| 10411 | Appendix C of IM - Text. This is necessary | ||
| 10412 | since shift is ignored in KCHR table | ||
| 10413 | translation when option or command is pressed. | ||
| 10414 | It also does not translate correctly | ||
| 10415 | control-shift chars like C-% so mask off shift | ||
| 10416 | here also. */ | ||
| 10417 | /* Mask off modifier keys that are mapped to some | ||
| 10418 | Emacs modifiers. */ | ||
| 10419 | int new_modifiers = er.modifiers & ~mapped_modifiers; | ||
| 10420 | /* set high byte of keycode to modifier high byte*/ | ||
| 10421 | int new_keycode = keycode | new_modifiers; | ||
| 10422 | Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache); | ||
| 10423 | unsigned long some_state = 0; | ||
| 10424 | UInt32 new_char_code; | ||
| 10425 | |||
| 10426 | new_char_code = KeyTranslate (kchr_ptr, new_keycode, | ||
| 10427 | &some_state); | ||
| 10428 | if (new_char_code == 0) | ||
| 10429 | /* Seems like a dead key. Append up-stroke. */ | ||
| 10430 | new_char_code = KeyTranslate (kchr_ptr, | ||
| 10431 | new_keycode | 0x80, | ||
| 10432 | &some_state); | ||
| 10433 | if (new_char_code) | ||
| 10434 | { | ||
| 10435 | inev.kind = ASCII_KEYSTROKE_EVENT; | ||
| 10436 | inev.code = new_char_code & 0xff; | ||
| 10437 | } | ||
| 10438 | } | ||
| 10439 | } | ||
| 10440 | |||
| 10441 | if (inev.kind == NO_EVENT) | ||
| 10442 | { | ||
| 10443 | inev.kind = ASCII_KEYSTROKE_EVENT; | ||
| 10444 | inev.code = er.message & charCodeMask; | ||
| 10445 | } | ||
| 10430 | 10446 | ||
| 10431 | #if USE_CARBON_EVENTS | 10447 | #if USE_CARBON_EVENTS |
| 10432 | inev.modifiers = mac_event_to_emacs_modifiers (eventRef); | 10448 | inev.modifiers = mac_event_to_emacs_modifiers (eventRef); |
| 10433 | #else | 10449 | #else |
| 10434 | inev.modifiers = mac_to_emacs_modifiers (er.modifiers); | 10450 | inev.modifiers = mac_to_emacs_modifiers (er.modifiers); |
| 10451 | #endif | ||
| 10452 | inev.modifiers |= (extra_keyboard_modifiers | ||
| 10453 | & (meta_modifier | alt_modifier | ||
| 10454 | | hyper_modifier | super_modifier)); | ||
| 10455 | XSETFRAME (inev.frame_or_window, f); | ||
| 10456 | |||
| 10457 | #if TARGET_API_MAC_CARBON | ||
| 10458 | if (inev.kind == ASCII_KEYSTROKE_EVENT | ||
| 10459 | && inev.code >= 0x80 && inev.modifiers) | ||
| 10460 | { | ||
| 10461 | OSStatus err; | ||
| 10462 | TextEncoding encoding = kTextEncodingMacRoman; | ||
| 10463 | TextToUnicodeInfo ttu_info; | ||
| 10464 | |||
| 10465 | UpgradeScriptInfoToTextEncoding (current_key_script, | ||
| 10466 | kTextLanguageDontCare, | ||
| 10467 | kTextRegionDontCare, | ||
| 10468 | NULL, &encoding); | ||
| 10469 | err = CreateTextToUnicodeInfoByEncoding (encoding, &ttu_info); | ||
| 10470 | if (err == noErr) | ||
| 10471 | { | ||
| 10472 | UniChar code; | ||
| 10473 | Str255 pstr; | ||
| 10474 | ByteCount unicode_len; | ||
| 10475 | |||
| 10476 | pstr[0] = 1; | ||
| 10477 | pstr[1] = inev.code; | ||
| 10478 | err = ConvertFromPStringToUnicode (ttu_info, pstr, | ||
| 10479 | sizeof (UniChar), | ||
| 10480 | &unicode_len, &code); | ||
| 10481 | if (err == noErr && unicode_len == sizeof (UniChar)) | ||
| 10482 | mac_set_unicode_keystroke_event (code, &inev); | ||
| 10483 | DisposeTextToUnicodeInfo (&ttu_info); | ||
| 10484 | } | ||
| 10485 | } | ||
| 10435 | #endif | 10486 | #endif |
| 10436 | inev.modifiers |= (extra_keyboard_modifiers | 10487 | } |
| 10437 | & (meta_modifier | alt_modifier | ||
| 10438 | | hyper_modifier | super_modifier)); | ||
| 10439 | XSETFRAME (inev.frame_or_window, f); | ||
| 10440 | break; | 10488 | break; |
| 10441 | 10489 | ||
| 10442 | case kHighLevelEvent: | 10490 | case kHighLevelEvent: |
| 10443 | read_socket_inev = &inev; | ||
| 10444 | AEProcessAppleEvent (&er); | 10491 | AEProcessAppleEvent (&er); |
| 10445 | read_socket_inev = NULL; | ||
| 10446 | break; | 10492 | break; |
| 10447 | 10493 | ||
| 10448 | default: | 10494 | default: |