Mercurial > emacs
changeset 48739:9f54273b7ff1
Added code to check for pressing of quit_char in the Carbon Event Queue
author | Steven Tamm <steventamm@mac.com> |
---|---|
date | Sun, 08 Dec 2002 05:56:37 +0000 |
parents | 81dc78298a54 |
children | b45c19284d24 |
files | src/macterm.c |
diffstat | 1 files changed, 171 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/src/macterm.c Sun Dec 08 01:29:31 2002 +0000 +++ b/src/macterm.c Sun Dec 08 05:56:37 2002 +0000 @@ -12630,7 +12630,7 @@ expected ? TicksToEventTime (app_sleep_time) : 0, - true, &eventRef); + kEventRemoveFromQueue, &eventRef); if (!rneResult) { /* Handle new events */ @@ -12661,7 +12661,7 @@ bufp->timestamp = EventTimeToTicks (GetEventTime (eventRef))*(1000/60); count++; } - else + else SendEventToEventTarget (eventRef, GetEventDispatcherTarget ()); break; @@ -12911,16 +12911,16 @@ break; } #endif - + if (!IsValidWindowPtr (FrontNonFloatingWindow ())) { SysBeep (1); UNBLOCK_INPUT; return 0; } - + ObscureCursor (); - + if (keycode == 0x33) /* delete key (charCode translated to 0x8) */ { bufp->code = 0x7f; @@ -12945,76 +12945,76 @@ else { if (er.modifiers & macMetaKey) - { - /* This code comes from Keyboard Resource, Appendix + { + /* This code comes from Keyboard Resource, Appendix C of IM - Text. This is necessary since shift is ignored in KCHR table translation when option or command is pressed. */ - int new_modifiers = er.modifiers & 0xf600; - /* mask off option and command */ - int new_keycode = keycode | new_modifiers; - Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache); - unsigned long some_state = 0; - bufp->code = KeyTranslate (kchr_ptr, new_keycode, + int new_modifiers = er.modifiers & 0xf600; + /* mask off option and command */ + int new_keycode = keycode | new_modifiers; + Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache); + unsigned long some_state = 0; + bufp->code = KeyTranslate (kchr_ptr, new_keycode, &some_state) & 0xff; - } + } else - bufp->code = er.message & charCodeMask; + bufp->code = er.message & charCodeMask; bufp->kind = ASCII_KEYSTROKE_EVENT; } } - - /* If variable mac-convert-keyboard-input-to-latin-1 is non-nil, - convert non-ASCII characters typed at the Mac keyboard - (presumed to be in the Mac Roman encoding) to iso-latin-1 - encoding before they are passed to Emacs. This enables the - Mac keyboard to be used to enter non-ASCII iso-latin-1 - characters directly. */ - if (mac_keyboard_text_encoding != kTextEncodingMacRoman + + /* If variable mac-convert-keyboard-input-to-latin-1 is non-nil, + convert non-ASCII characters typed at the Mac keyboard + (presumed to be in the Mac Roman encoding) to iso-latin-1 + encoding before they are passed to Emacs. This enables the + Mac keyboard to be used to enter non-ASCII iso-latin-1 + characters directly. */ + if (mac_keyboard_text_encoding != kTextEncodingMacRoman && bufp->kind == ASCII_KEYSTROKE_EVENT && bufp->code >= 128) { - static TECObjectRef converter = NULL; - OSStatus the_err = noErr; - OSStatus convert_status = noErr; - - if (converter == NULL) - { - the_err = TECCreateConverter (&converter, + static TECObjectRef converter = NULL; + OSStatus the_err = noErr; + OSStatus convert_status = noErr; + + if (converter == NULL) + { + the_err = TECCreateConverter (&converter, kTextEncodingMacRoman, mac_keyboard_text_encoding); - current_mac_keyboard_text_encoding + current_mac_keyboard_text_encoding = mac_keyboard_text_encoding; - } - else if (mac_keyboard_text_encoding + } + else if (mac_keyboard_text_encoding != current_mac_keyboard_text_encoding) - { - /* Free the converter for the current encoding before - creating a new one. */ - TECDisposeConverter (converter); - the_err = TECCreateConverter (&converter, + { + /* Free the converter for the current encoding before + creating a new one. */ + TECDisposeConverter (converter); + the_err = TECCreateConverter (&converter, kTextEncodingMacRoman, mac_keyboard_text_encoding); - current_mac_keyboard_text_encoding + current_mac_keyboard_text_encoding = mac_keyboard_text_encoding; - } - - if (the_err == noErr) - { - unsigned char ch = bufp->code; - ByteCount actual_input_length, actual_output_length; - unsigned char outch; - - convert_status = TECConvertText (converter, &ch, 1, + } + + if (the_err == noErr) + { + unsigned char ch = bufp->code; + ByteCount actual_input_length, actual_output_length; + unsigned char outch; + + convert_status = TECConvertText (converter, &ch, 1, &actual_input_length, - &outch, 1, + &outch, 1, &actual_output_length); - if (convert_status == noErr + if (convert_status == noErr && actual_input_length == 1 && actual_output_length == 1) - bufp->code = outch; - } + bufp->code = outch; + } } - + #if USE_CARBON_EVENTS bufp->modifiers = mac_event_to_emacs_modifiers (eventRef); #else @@ -13026,7 +13026,7 @@ = (mac_output *) GetWRefCon (FrontNonFloatingWindow ()); XSETFRAME (bufp->frame_or_window, mwp->mFP); } - + bufp->timestamp = er.when * (1000 / 60); /* ticks to milliseconds */ count++; @@ -13446,6 +13446,36 @@ #ifdef MAC_OSX void +mac_check_bundle() +{ + extern int inhibit_window_system; + extern int noninteractive; + CFBundleRef appsBundle; + pid_t child; + + /* No need to test if already -nw*/ + if (inhibit_window_system || noninteractive) + return; + + appsBundle = CFBundleGetMainBundle(); + if (appsBundle != NULL) + { + CFStringRef cfBI = CFSTR("CFBundleIdentifier"); + CFTypeRef res = CFBundleGetValueForInfoDictionaryKey(appsBundle, cfBI); + /* We found the bundle identifier, now we know we are valid. */ + if (res != NULL) + { + CFRelease(res); + return; + } + } + /* MAC_TODO: Have this start the bundled executable */ + + /* For now, prevent the fatal error by bringing it up in the terminal */ + inhibit_window_system = 1; +} + +void MakeMeTheFrontProcess () { ProcessSerialNumber psn; @@ -13455,6 +13485,91 @@ if (err == noErr) (void) SetFrontProcess (&psn); } + +/***** Code to handle C-g testing *****/ + +/* Contains the Mac modifier formed from quit_char */ +static mac_quit_char_modifiers = 0; +static mac_quit_char_keycode; +extern int quit_char; + +static void +mac_determine_quit_char_modifiers() +{ + /* Todo: Determine modifiers from quit_char. */ + UInt32 qc_modifiers = ctrl_modifier; + + /* Map modifiers */ + mac_quit_char_modifiers = 0; + if (qc_modifiers & ctrl_modifier) mac_quit_char_modifiers |= macCtrlKey; + if (qc_modifiers & shift_modifier) mac_quit_char_modifiers |= macShiftKey; + if (qc_modifiers & meta_modifier) mac_quit_char_modifiers |= macMetaKey; + if (qc_modifiers & alt_modifier) mac_quit_char_modifiers |= macAltKey; +} + +static void +init_quit_char_handler () +{ + /* TODO: Let this support keys other the 'g' */ + mac_quit_char_keycode = 5; + /* Look at <architecture/adb_kb_map.h> for details */ + /* http://gemma.apple.com/techpubs/mac/Toolbox/Toolbox-40.html#MARKER-9-184*/ + + mac_determine_quit_char_modifiers(); +} + +static Boolean +quit_char_comp (EventRef inEvent, void *inCompData) +{ + if (GetEventClass(inEvent) != kEventClassKeyboard) + return false; + if (GetEventKind(inEvent) != kEventRawKeyDown) + return false; + { + UInt32 keyCode; + UInt32 keyModifiers; + GetEventParameter(inEvent, kEventParamKeyCode, + typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode); + if (keyCode != mac_quit_char_keycode) + return false; + GetEventParameter(inEvent, kEventParamKeyModifiers, + typeUInt32, NULL, sizeof(UInt32), NULL, &keyModifiers); + if (keyModifiers != mac_quit_char_modifiers) + return false; + } + return true; +} + +void +mac_check_for_quit_char() +{ + EventRef event; + /* If windows are not initialized, return immediately (keep it bouncin')*/ + if (!mac_quit_char_modifiers) + return; + + /* Redetermine modifiers because they are based on lisp variables */ + mac_determine_quit_char_modifiers(); + + /* Fill the queue with events */ + ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, &event); + event = FindSpecificEventInQueue (GetMainEventQueue(), quit_char_comp, NULL); + if (event) + { + struct input_event e; + struct mac_output *mwp = (mac_output*) GetWRefCon (FrontNonFloatingWindow ()); + /* Use an input_event to emulate what the interrupt handler does. */ + e.kind = ASCII_KEYSTROKE_EVENT; + e.code = quit_char; + e.timestamp = EventTimeToTicks(GetEventTime(event))*(1000/60); + XSETFRAME(e.frame_or_window, mwp->mFP); + /* Remove event from queue to prevent looping. */ + RemoveEventFromQueue(GetMainEventQueue(), event); + ReleaseEvent(event); + kbd_buffer_store_event(&e); + } +} + #endif /* MAC_OSX */ /* Set up use of X before we make the first connection. */ @@ -13563,6 +13678,8 @@ #if USE_CARBON_EVENTS init_service_handler (); + + init_quit_char_handler (); #endif DisableMenuCommand (NULL, kHICommandQuit);