From: YAMAMOTO Mitsuharu Date: Fri, 16 Jun 2006 08:08:59 +0000 (+0000) Subject: (do_app_resume, do_app_suspend): Remove functions. X-Git-Tag: emacs-pretest-22.0.90~1947 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b4c515960ff17093ed7c499b1d1435b02a5e57b3;p=emacs.git (do_app_resume, do_app_suspend): Remove functions. (mac_tsm_resume, mac_tsm_suspend) [USE_MAC_TSM]: New functions. (mac_handle_window_event, XTread_socket) [USE_MAC_TSM]: Use them. (Vmac_ts_script_language_on_focus) [USE_MAC_TSM]: New variable. (syms_of_macterm) [USE_MAC_TSM]: Defvar it. (saved_ts_language, saved_ts_component) [USE_MAC_TSM]: New variables. (mac_initialize_display_info) [MAC_OSX]: Use Quartz Display Services functions to get size of main display in pixels. --- diff --git a/src/macterm.c b/src/macterm.c index 007cc14888e..e1fc7dbff66 100644 --- a/src/macterm.c +++ b/src/macterm.c @@ -8512,6 +8512,9 @@ static Lisp_Object Qtext_input; static Lisp_Object Qupdate_active_input_area, Qunicode_for_key_event; static Lisp_Object Vmac_ts_active_input_overlay; extern Lisp_Object Qbefore_string; +static Lisp_Object Vmac_ts_script_language_on_focus; +static ScriptLanguageRecord saved_ts_language; +static Component saved_ts_component; #endif #endif extern int mac_ready_for_apple_events; @@ -8861,22 +8864,84 @@ is_emacs_window (WindowPtr win) return 0; } -static void -do_app_resume () -{ #if USE_MAC_TSM - ActivateTSMDocument (tsm_document_id); +static OSStatus +mac_tsm_resume () +{ + OSStatus err; + ScriptLanguageRecord slrec, *slptr = NULL; + + err = ActivateTSMDocument (tsm_document_id); + + if (err == noErr) + { + if (EQ (Vmac_ts_script_language_on_focus, Qt)) + slptr = &saved_ts_language; + else if (CONSP (Vmac_ts_script_language_on_focus) + && INTEGERP (XCAR (Vmac_ts_script_language_on_focus)) + && INTEGERP (XCDR (Vmac_ts_script_language_on_focus))) + { + slrec.fScript = XINT (XCAR (Vmac_ts_script_language_on_focus)); + slrec.fLanguage = XINT (XCDR (Vmac_ts_script_language_on_focus)); + slptr = &slrec; + } + } + + if (slptr) + { +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 + err = SetDefaultInputMethodOfClass (saved_ts_component, slptr, + kKeyboardInputMethodClass); +#else + err = SetDefaultInputMethod (saved_ts_component, slptr); #endif + if (err == noErr) + err = SetTextServiceLanguage (slptr); + + /* Seems to be needed on Mac OS X 10.2. */ + if (err == noErr) + KeyScript (slptr->fScript | smKeyForceKeyScriptMask); + } + + return err; } -static void -do_app_suspend () +static OSStatus +mac_tsm_suspend () { -#if USE_MAC_TSM - DeactivateTSMDocument (tsm_document_id); + OSStatus err; + ScriptLanguageRecord slrec, *slptr = NULL; + + if (EQ (Vmac_ts_script_language_on_focus, Qt)) + { + err = GetTextServiceLanguage (&saved_ts_language); + if (err == noErr) + slptr = &saved_ts_language; + } + else if (CONSP (Vmac_ts_script_language_on_focus) + && INTEGERP (XCAR (Vmac_ts_script_language_on_focus)) + && INTEGERP (XCDR (Vmac_ts_script_language_on_focus))) + { + slrec.fScript = XINT (XCAR (Vmac_ts_script_language_on_focus)); + slrec.fLanguage = XINT (XCDR (Vmac_ts_script_language_on_focus)); + slptr = &slrec; + } + + if (slptr) + { +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 + GetDefaultInputMethodOfClass (&saved_ts_component, slptr, + kKeyboardInputMethodClass); +#else + GetDefaultInputMethod (&saved_ts_component, slptr); #endif -} + } + err = DeactivateTSMDocument (tsm_document_id); + + return err; +} +#endif static void do_apple_menu (SInt16 menu_item) @@ -9330,12 +9395,12 @@ mac_handle_window_event (next_handler, event, data) #if USE_MAC_TSM case kEventWindowFocusAcquired: result = CallNextEventHandler (next_handler, event); - err = ActivateTSMDocument (tsm_document_id); + err = mac_tsm_resume (); return err == noErr ? noErr : result; case kEventWindowFocusRelinquish: result = CallNextEventHandler (next_handler, event); - err = DeactivateTSMDocument (tsm_document_id); + err = mac_tsm_suspend (); return err == noErr ? noErr : result; #endif } @@ -10394,10 +10459,12 @@ XTread_socket (sd, expected, hold_quit) switch ((er.message >> 24) & 0x000000FF) { case suspendResumeMessage: - if ((er.message & resumeFlag) == 1) - do_app_resume (); +#if USE_MAC_TSM + if (er.message & resumeFlag) + mac_tsm_resume (); else - do_app_suspend (); + mac_tsm_suspend (); +#endif break; case mouseMovedMessage: @@ -10960,7 +11027,6 @@ void mac_initialize_display_info () { struct mac_display_info *dpyinfo = &one_mac_display_info; - GDHandle main_device_handle; bzero (dpyinfo, sizeof (*dpyinfo)); @@ -10976,37 +11042,29 @@ mac_initialize_display_info () strcpy (dpyinfo->mac_id_name, "Mac Display"); #endif - main_device_handle = LMGetMainDevice(); - dpyinfo->reference_count = 0; dpyinfo->resx = 72.0; dpyinfo->resy = 72.0; - dpyinfo->color_p = TestDeviceAttribute (main_device_handle, gdDevType); #ifdef MAC_OSX /* HasDepth returns true if it is possible to have a 32 bit display, - but this may not be what is actually used. Mac OSX can do better. - CGMainDisplayID is only available on OSX 10.2 and higher, but the - header for CGGetActiveDisplayList says that the first display returned - is the active one, so we use that. */ + but this may not be what is actually used. Mac OSX can do better. */ + dpyinfo->color_p = 1; + dpyinfo->n_planes = CGDisplayBitsPerPixel (kCGDirectMainDisplay); + dpyinfo->height = CGDisplayPixelsHigh (kCGDirectMainDisplay); + dpyinfo->width = CGDisplayPixelsWide (kCGDirectMainDisplay); +#else { - CGDirectDisplayID disp_id[1]; - CGDisplayCount disp_count; - CGDisplayErr error_code; - - error_code = CGGetActiveDisplayList (1, disp_id, &disp_count); - if (error_code != 0) - error ("No display found, CGGetActiveDisplayList error %d", error_code); + GDHandle main_device_handle = LMGetMainDevice(); - dpyinfo->n_planes = CGDisplayBitsPerPixel (disp_id[0]); + dpyinfo->color_p = TestDeviceAttribute (main_device_handle, gdDevType); + for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1) + if (HasDepth (main_device_handle, dpyinfo->n_planes, + gdDevType, dpyinfo->color_p)) + break; + dpyinfo->height = (**main_device_handle).gdRect.bottom; + dpyinfo->width = (**main_device_handle).gdRect.right; } -#else - for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1) - if (HasDepth (main_device_handle, dpyinfo->n_planes, - gdDevType, dpyinfo->color_p)) - break; #endif - dpyinfo->height = (**main_device_handle).gdRect.bottom; - dpyinfo->width = (**main_device_handle).gdRect.right; dpyinfo->grabbed = 0; dpyinfo->root_window = NULL; dpyinfo->image_cache = make_image_cache (); @@ -11557,6 +11615,15 @@ order. */); DEFVAR_LISP ("mac-ts-active-input-overlay", &Vmac_ts_active_input_overlay, doc: /* Overlay used to display Mac TSM active input area. */); Vmac_ts_active_input_overlay = Qnil; + + DEFVAR_LISP ("mac-ts-script-language-on-focus", &Vmac_ts_script_language_on_focus, + doc: /* *How to change Mac TSM script/language when a frame gets focus. +If the value is t, the input script and language are restored to those +used in the last focus frame. If the value is a pair of integers, the +input script and language codes, which are defined in the Script +Manager, are set to its car and cdr parts, respectively. Otherwise, +Emacs doesn't set them and thus follows the system default behavior. */); + Vmac_ts_script_language_on_focus = Qnil; #endif }