X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/5a06864fb69973eb2be01e230a98d6c24ff2138c..474217c83c8a8e07a996ff621ea59f4f472dc340:/src/nsfns.m diff --git a/src/nsfns.m b/src/nsfns.m index 2e2d6a77b7..08564c7216 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -1,5 +1,5 @@ /* Functions for the NeXT/Open/GNUstep and MacOSX window system. - Copyright (C) 1989, 1992, 1993, 1994, 2005, 2006, 2008 + Copyright (C) 1989, 1992, 1993, 1994, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -31,6 +31,7 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #include #include +#include #include "lisp.h" #include "blockinput.h" @@ -203,46 +204,30 @@ ns_get_window (Lisp_Object maybeFrame) static NSScreen * -ns_get_screen (Lisp_Object anythingUnderTheSun) +ns_get_screen (Lisp_Object screen) { - id window =nil; - NSScreen *screen = 0; - + struct frame *f; struct terminal *terminal; - struct ns_display_info *dpyinfo; - struct frame *f = NULL; - Lisp_Object frame; - - if (INTEGERP (anythingUnderTheSun)) { - /* we got a terminal */ - terminal = get_terminal (anythingUnderTheSun, 1); - dpyinfo = terminal->display_info.ns; - f = dpyinfo->x_focus_frame; - if (!f) - f = dpyinfo->x_highlight_frame; - - } else if (FRAMEP (anythingUnderTheSun) && - FRAME_NS_P (XFRAME (anythingUnderTheSun))) { - /* we got a frame */ - f = XFRAME (anythingUnderTheSun); - - } else if (STRINGP (anythingUnderTheSun)) { /* FIXME/cl for multi-display */ - } - if (!f) + if (EQ (Qt, screen)) /* not documented */ + return [NSScreen mainScreen]; + + terminal = get_terminal (screen, 1); + if (terminal->type != output_ns) + return NULL; + + if (NILP (screen)) f = SELECTED_FRAME (); - if (f) + else if (FRAMEP (screen)) + f = XFRAME (screen); + else { - XSETFRAME (frame, f); - window = ns_get_window (frame); + struct ns_display_info *dpyinfo = terminal->display_info.ns; + f = (dpyinfo->x_focus_frame || dpyinfo->x_highlight_frame); } - if (window) - screen = [window screen]; - if (!screen) - screen = [NSScreen mainScreen]; - - return screen; + return ((f && FRAME_NS_P (f)) ? [[FRAME_NS_VIEW (f) window] screen] + : NULL); } @@ -338,7 +323,7 @@ interpret_services_menu (NSMenu *menu, Lisp_Object prefix, Lisp_Object old) static void -ns_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +x_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { NSColor *col; @@ -363,7 +348,7 @@ ns_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) static void -ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +x_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { struct face *face; NSColor *col; @@ -389,14 +374,6 @@ ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) [[view window] setBackgroundColor: col]; alpha = [col alphaComponent]; -#ifdef NS_IMPL_COCOA - /* the alpha code below only works on 10.4, so we need to do something - else (albeit less good) otherwise. - Check NSApplication.h for useful NSAppKitVersionNumber values. */ - if (NSAppKitVersionNumber < 744.0) - [[view window] setAlphaValue: alpha]; -#endif - if (alpha != 1.0) [[view window] setOpaque: NO]; else @@ -420,7 +397,7 @@ ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) static void -ns_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +x_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { NSColor *col; @@ -443,10 +420,10 @@ ns_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) static void -ns_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { NSView *view = FRAME_NS_VIEW (f); - NSTRACE (ns_set_icon_name); + NSTRACE (x_set_icon_name); if (ns_in_resize) return; @@ -523,8 +500,7 @@ ns_set_name_iconic (struct frame *f, Lisp_Object name, int explicit) name = f->icon_name; if (NILP (name)) - name = build_string - ([[[NSProcessInfo processInfo] processName] UTF8String]); + name = build_string([ns_app_name UTF8String]); else CHECK_STRING (name); @@ -543,7 +519,7 @@ ns_set_name_iconic (struct frame *f, Lisp_Object name, int explicit) static void ns_set_name (struct frame *f, Lisp_Object name, int explicit) { - NSView *view = FRAME_NS_VIEW (f); + NSView *view; NSTRACE (ns_set_name); if (ns_in_resize) @@ -564,8 +540,7 @@ ns_set_name (struct frame *f, Lisp_Object name, int explicit) return; if (NILP (name)) - name = build_string - ([[[NSProcessInfo processInfo] processName] UTF8String]); + name = build_string([ns_app_name UTF8String]); f->name = name; @@ -575,6 +550,8 @@ ns_set_name (struct frame *f, Lisp_Object name, int explicit) CHECK_STRING (name); + view = FRAME_NS_VIEW (f); + /* Don't change the name if it's already NAME. */ if ([[[view window] title] isEqualToString: [NSString stringWithUTF8String: @@ -589,9 +566,9 @@ ns_set_name (struct frame *f, Lisp_Object name, int explicit) specified a name for the frame; the name will override any set by the redisplay code. */ static void -ns_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval) +x_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval) { - NSTRACE (ns_explicitly_set_name); + NSTRACE (x_explicitly_set_name); ns_set_name_iconic (f, arg, 1); ns_set_name (f, arg, 1); } @@ -622,9 +599,9 @@ x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval) suggesting a new name, which lisp code should override; if F->explicit_name is set, ignore the new name; otherwise, set it. */ static void -ns_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name) +x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name) { - NSTRACE (ns_set_title); + NSTRACE (x_set_title); /* Don't change the title if it's already NAME. */ if (EQ (name, f->title)) return; @@ -638,7 +615,7 @@ ns_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name) void ns_set_name_as_filename (struct frame *f) { - NSView *view = FRAME_NS_VIEW (f); + NSView *view; Lisp_Object name; Lisp_Object buf = XWINDOW (f->selected_window)->buffer; const char *title; @@ -657,11 +634,12 @@ ns_set_name_as_filename (struct frame *f) name = f->icon_name; if (NILP (name)) - name = build_string - ([[[NSProcessInfo processInfo] processName] UTF8String]); + name = build_string([ns_app_name UTF8String]); else CHECK_STRING (name); + view = FRAME_NS_VIEW (f); + title = FRAME_ICONIFIED_P (f) ? [[[view window] miniwindowTitle] UTF8String] : [[[view window] title] UTF8String]; @@ -747,7 +725,7 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) } -/* 23: toolbar support */ +/* toolbar support */ void x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) { @@ -852,13 +830,13 @@ ns_implicitly_set_icon_type (struct frame *f) static void -ns_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +x_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { EmacsView *view = FRAME_NS_VIEW (f); id image = nil; BOOL setMini = YES; - NSTRACE (ns_set_icon_type); + NSTRACE (x_set_icon_type); if (!NILP (arg) && SYMBOLP (arg)) { @@ -891,7 +869,7 @@ ns_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval) } -/* 23: added Xism; we stub out (we do implement this in ns-win.el) */ +/* Xism; we stub out (we do implement this in ns-win.el) */ int XParseGeometry (char *string, int *x, int *y, unsigned int *width, unsigned int *height) @@ -934,9 +912,9 @@ ns_cursor_type_to_lisp (int arg) } } -/* this is like x_set_cursor_type defined in xfns.c */ +/* This is the same as the xfns.c definition. */ void -ns_set_cursor_type (f, arg, oldval) +x_set_cursor_type (f, arg, oldval) FRAME_PTR f; Lisp_Object arg, oldval; { @@ -947,10 +925,10 @@ ns_set_cursor_type (f, arg, oldval) } -/* 23: called to set mouse pointer color, but all other terms use it to - initialize pointer types (and don't set the color ;) */ +/* called to set mouse pointer color, but all other terms use it to + initialize pointer types (and don't set the color ;) */ static void -ns_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { /* don't think we can do this on Nextstep */ } @@ -960,7 +938,7 @@ ns_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) #define Xstr(x) Str(x) static Lisp_Object -ns_appkit_version () +ns_appkit_version_str () { char tmp[80]; @@ -975,6 +953,21 @@ ns_appkit_version () } +/* This is for use by x-server-version and collapses all version info we + have into a single int. For a better picture of the implementation + running, use ns_appkit_version_str.*/ +static int +ns_appkit_version_int () +{ +#ifdef NS_IMPL_GNUSTEP + return GNUSTEP_GUI_MAJOR_VERSION * 100 + GNUSTEP_GUI_MINOR_VERSION; +#elif defined(NS_IMPL_COCOA) + return (int)NSAppKitVersionNumber; +#endif + return 0; +} + + static void x_icon (struct frame *f, Lisp_Object parms) /* -------------------------------------------------------------------------- @@ -1005,28 +998,26 @@ x_icon (struct frame *f, Lisp_Object parms) } -/* 23 Note: commented out ns_... entries are no longer used in 23. - commented out x_... entries have not been implemented yet. - see frame.c for template, also where all generic OK functions are impl */ +/* Note: see frame.c for template, also where generic functions are impl */ frame_parm_handler ns_frame_parm_handlers[] = { x_set_autoraise, /* generic OK */ x_set_autolower, /* generic OK */ - ns_set_background_color, + x_set_background_color, 0, /* x_set_border_color, may be impossible under Nextstep */ 0, /* x_set_border_width, may be impossible under Nextstep */ - ns_set_cursor_color, - ns_set_cursor_type, + x_set_cursor_color, + x_set_cursor_type, x_set_font, /* generic OK */ - ns_set_foreground_color, - ns_set_icon_name, - ns_set_icon_type, + x_set_foreground_color, + x_set_icon_name, + x_set_icon_type, x_set_internal_border_width, /* generic OK */ x_set_menu_bar_lines, - ns_set_mouse_color, - ns_explicitly_set_name, + x_set_mouse_color, + x_explicitly_set_name, x_set_scroll_bar_width, /* generic OK */ - ns_set_title, + x_set_title, x_set_unsplittable, /* generic OK */ x_set_vertical_scroll_bars, /* generic OK */ x_set_visibility, /* generic OK */ @@ -1040,7 +1031,8 @@ frame_parm_handler ns_frame_parm_handlers[] = 0, /* x_set_wait_for_wm, will ignore */ 0, /* x_set_fullscreen will ignore */ x_set_font_backend, /* generic OK */ - 0 + x_set_alpha, + 0, /* x_set_sticky */ }; @@ -1138,8 +1130,7 @@ be shared by the new frame. */) be set. */ if (EQ (name, Qunbound) || NILP (name) || (XTYPE (name) != Lisp_String)) { - f->name - = build_string ([[[NSProcessInfo processInfo] processName] UTF8String]); + f->name = build_string ([ns_app_name UTF8String]); f->explicit_name =0; } else @@ -1326,13 +1317,20 @@ be shared by the new frame. */) if (! f->output_data.ns->explicit_parent) { - tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_BOOLEAN); - if (EQ (tem, Qunbound)) - tem = Qnil; - - x_set_visibility (f, tem, Qnil); - if (EQ (tem, Qt)) - [[FRAME_NS_VIEW (f) window] makeKeyWindow]; + tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_SYMBOL); + if (EQ (tem, Qunbound)) + tem = Qt; + x_set_visibility (f, tem, Qnil); + if (EQ (tem, Qicon)) + x_iconify_frame (f); + else if (! NILP (tem)) + { + x_make_frame_visible (f); + f->async_visible = 1; + [[FRAME_NS_VIEW (f) window] makeKeyWindow]; + } + else + f->async_visible = 0; } if (FRAME_HAS_MINIBUF_P (f) @@ -1366,6 +1364,7 @@ FRAME nil means use the selected frame. */) { EmacsView *view = FRAME_NS_VIEW (f); BLOCK_INPUT; + [NSApp activateIgnoringOtherApps: YES]; [[view window] makeKeyAndOrderFront: view]; UNBLOCK_INPUT; } @@ -1374,17 +1373,6 @@ FRAME nil means use the selected frame. */) } -DEFUN ("ns-popup-prefs-panel", Fns_popup_prefs_panel, Sns_popup_prefs_panel, - 0, 0, "", - doc: /* Pop up the preferences panel. */) - () -{ - check_ns (); - [(EmacsApp *)NSApp showPreferencesWindow: NSApp]; - return Qnil; -} - - DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel, 0, 1, "", doc: /* Pop up the font panel. */) @@ -1395,7 +1383,7 @@ DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel, struct frame *f; check_ns (); - fm = [NSFontManager new]; + fm = [NSFontManager sharedFontManager]; if (NILP (frame)) f = SELECTED_FRAME (); else @@ -1411,7 +1399,7 @@ DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel, } -DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel, +DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel, 0, 1, "", doc: /* Pop up the color panel. */) (frame) @@ -1444,7 +1432,7 @@ Optional arg INIT, if non-nil, provides a default file name to use. */) static id fileDelegate = nil; int ret; id panel; - NSString *fname; + Lisp_Object fname; NSString *promptS = NILP (prompt) || !STRINGP (prompt) ? nil : [NSString stringWithUTF8String: SDATA (prompt)]; @@ -1477,6 +1465,7 @@ Optional arg INIT, if non-nil, provides a default file name to use. */) [panel setDelegate: fileDelegate]; panelOK = 0; + BLOCK_INPUT; if (NILP (isLoad)) { ret = [panel runModalForDirectory: dirS file: initS]; @@ -1487,13 +1476,15 @@ Optional arg INIT, if non-nil, provides a default file name to use. */) ret = [panel runModalForDirectory: dirS file: initS types: nil]; } - ret = (ret = NSOKButton) || panelOK; + ret = (ret == NSOKButton) || panelOK; - fname = [panel filename]; + if (ret) + fname = build_string ([[panel filename] UTF8String]); [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow]; + UNBLOCK_INPUT; - return ret ? build_string ([fname UTF8String]) : Qnil; + return ret ? fname : Qnil; } @@ -1507,9 +1498,7 @@ If OWNER is nil, Emacs is assumed. */) check_ns (); if (NILP (owner)) - owner = build_string - ([[[NSProcessInfo processInfo] processName] UTF8String]); - /* CHECK_STRING (owner); this should be just "Emacs" */ + owner = build_string([ns_app_name UTF8String]); CHECK_STRING (name); /*fprintf (stderr, "ns-get-resource checking resource '%s'\n", SDATA (name)); */ @@ -1532,9 +1521,7 @@ If VALUE is nil, the default is removed. */) { check_ns (); if (NILP (owner)) - owner - = build_string ([[[NSProcessInfo processInfo] processName] UTF8String]); - CHECK_STRING (owner); + owner = build_string ([ns_app_name UTF8String]); CHECK_STRING (name); if (NILP (value)) { @@ -1554,32 +1541,6 @@ If VALUE is nil, the default is removed. */) } -DEFUN ("ns-set-alpha", Fns_set_alpha, Sns_set_alpha, 2, 2, 0, - doc: /* Return a color equivalent to COLOR with alpha setting ALPHA. -The argument ALPHA should be a number between 0 and 1, where 0 is full -transparency and 1 is opaque. */) - (color, alpha) - Lisp_Object color; - Lisp_Object alpha; -{ - NSColor *col; - float a; - - CHECK_STRING (color); - CHECK_NUMBER_OR_FLOAT (alpha); - - if (ns_lisp_to_color (color, &col)) - error ("Unknown color."); - - a = XFLOATINT (alpha); - if (a < 0.0 || a > 1.0) - error ("Alpha value should be between 0 and 1 inclusive."); - - col = [col colorWithAlphaComponent: a]; - return ns_color_to_lisp (col); -} - - DEFUN ("x-server-max-request-size", Fx_server_max_request_size, Sx_server_max_request_size, 0, 1, 0, @@ -1610,14 +1571,26 @@ If omitted or nil, the selected frame's display is used. */) DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0, - doc: /* Return the version number of Nextstep display server DISPLAY. + doc: /* Return the version numbers of the server of DISPLAY. +The value is a list of three integers: the major and minor +version numbers of the X Protocol in use, and the distributor-specific +release number. See also the function `x-server-vendor'. + +The optional argument DISPLAY specifies which display to ask about. DISPLAY should be either a frame or a display name (a string). -If omitted or nil, the selected frame's display is used. -See also the function `ns-server-vendor'. */) +If omitted or nil, that stands for the selected frame's display. */) (display) Lisp_Object display; { - return ns_appkit_version (); + /*NOTE: it is unclear what would best correspond with "protocol"; + we return 10.3, meaning Panther, since this is roughly the + level that GNUstep's APIs correspond to. + The last number is where we distinguish between the Apple + and GNUstep implementations ("distributor-specific release + number") and give int'ized versions of major.minor. */ + return Fcons (make_number (10), + Fcons (make_number (3), + Fcons (make_number (ns_appkit_version_int()), Qnil))); } @@ -1789,14 +1762,11 @@ Optional arguments XRM-STRING and MUST-SUCCEED are currently ignored. */) DEFUN ("x-close-connection", Fx_close_connection, Sx_close_connection, 1, 1, 0, doc: /* Close the connection to the current Nextstep display server. -The second argument DISPLAY is currently ignored. */) +The argument DISPLAY is currently ignored. */) (display) Lisp_Object display; { check_ns (); -#ifdef NS_IMPL_COCOA - PSFlush (); -#endif /*ns_delete_terminal (dpyinfo->terminal); */ [NSApp terminate: NSApp]; return Qnil; @@ -1819,7 +1789,7 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, DEFUN ("ns-hide-others", Fns_hide_others, Sns_hide_others, 0, 0, 0, - doc: /* Hides all applications other than emacs. */) + doc: /* Hides all applications other than Emacs. */) () { check_ns (); @@ -1829,9 +1799,9 @@ DEFUN ("ns-hide-others", Fns_hide_others, Sns_hide_others, DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs, 1, 1, 0, - doc: /* If ON is non-nil, the entire emacs application is hidden. -Otherwise if emacs is hidden, it is unhidden. -If ON is equal to `activate', emacs is unhidden and becomes + doc: /* If ON is non-nil, the entire Emacs application is hidden. +Otherwise if Emacs is hidden, it is unhidden. +If ON is equal to `activate', Emacs is unhidden and becomes the active application. */) (on) Lisp_Object on; @@ -2007,7 +1977,7 @@ there was no result. */) DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc, Sns_convert_utf8_nfd_to_nfc, 1, 1, 0, - doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */) + doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */) (str) Lisp_Object str; { @@ -2051,9 +2021,9 @@ ns_do_applescript (script, result) returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; [scriptObject release]; - + *result = Qnil; - + if (returnDescriptor != NULL) { // successful execution @@ -2062,8 +2032,10 @@ ns_do_applescript (script, result) *result = Qt; // script returned an AppleScript result if ((typeUnicodeText == [returnDescriptor descriptorType]) || - (typeUTF16ExternalRepresentation +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + (typeUTF16ExternalRepresentation == [returnDescriptor descriptorType]) || +#endif (typeUTF8Text == [returnDescriptor descriptorType]) || (typeCString == [returnDescriptor descriptorType])) { @@ -2090,10 +2062,10 @@ ns_do_applescript (script, result) } DEFUN ("ns-do-applescript", Fns_do_applescript, Sns_do_applescript, 1, 1, 0, - doc: /* Execute AppleScript SCRIPT and return the result. If -compilation and execution are successful, the resulting script value -is returned as a string, a number or, in the case of other constructs, -t. In case the execution fails, an error is signaled. */) + doc: /* Execute AppleScript SCRIPT and return the result. +If compilation and execution are successful, the resulting script value +is returned as a string, a number or, in the case of other constructs, t. +In case the execution fails, an error is signaled. */) (script) Lisp_Object script; { @@ -2124,14 +2096,15 @@ t. In case the execution fails, an error is signaled. */) ========================================================================== */ -/* 23: call in image.c */ +/* called from image.c */ FRAME_PTR check_x_frame (Lisp_Object frame) { return check_ns_frame (frame); } -/* 23: added, due to call in frame.c */ + +/* called from frame.c */ struct ns_display_info * check_x_display_info (Lisp_Object frame) { @@ -2139,7 +2112,6 @@ check_x_display_info (Lisp_Object frame) } -/* 23: new function; we don't have much in the way of flexibility though */ void x_set_scroll_bar_default_width (f) struct frame *f; @@ -2151,7 +2123,7 @@ x_set_scroll_bar_default_width (f) } -/* 23: terms now impl this instead of x-get-resource directly */ +/* terms impl this instead of x-get-resource directly */ const char * x_get_string_resource (XrmDatabase rdb, char *name, char *class) { @@ -2160,14 +2132,12 @@ x_get_string_resource (XrmDatabase rdb, char *name, char *class) const char *res; check_ns (); - /* Support emacs-20-style face resources for backwards compatibility */ - if (!strncmp (toCheck, "Face", 4)) - toCheck = name + (!strncmp (name, "emacs.", 6) ? 6 : 0); + if (inhibit_x_resources) + /* --quick was passed, so this is a no-op. */ + return NULL; -/*fprintf (stderr, "Checking '%s'\n", toCheck); */ - res = [[[NSUserDefaults standardUserDefaults] objectForKey: - [NSString stringWithUTF8String: toCheck]] UTF8String]; + [NSString stringWithUTF8String: toCheck]] UTF8String]; return !res ? NULL : (!strncasecmp (res, "YES", 3) ? "true" : (!strncasecmp (res, "NO", 2) ? "false" : res)); @@ -2252,16 +2222,12 @@ The optional argument FRAME is currently ignored. */) DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0, - doc: /* Return a description of the color named COLOR. -The value is a list of integer RGBA values--(RED GREEN BLUE ALPHA). -These values appear to range from 0 to 65280; white is (65280 65280 65280 0). -The optional argument FRAME is currently ignored. */) + doc: /* Internal function called by `color-values', which see. */) (color, frame) Lisp_Object color, frame; { NSColor * col; - float red, green, blue, alpha; - Lisp_Object rgba[4]; + CGFloat red, green, blue, alpha; check_ns (); CHECK_STRING (color); @@ -2271,12 +2237,9 @@ The optional argument FRAME is currently ignored. */) [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace] getRed: &red green: &green blue: &blue alpha: &alpha]; - rgba[0] = make_number (lrint (red*65280)); - rgba[1] = make_number (lrint (green*65280)); - rgba[2] = make_number (lrint (blue*65280)); - rgba[3] = make_number (lrint (alpha*65280)); - - return Flist (4, rgba); + return list3 (make_number (lrint (red*65280)), + make_number (lrint (green*65280)), + make_number (lrint (blue*65280))); } @@ -2320,7 +2283,7 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width, 0, 1, 0, - doc: /* Returns the width in pixels of the Nextstep display DISPLAY. + doc: /* Return the width in pixels of the Nextstep display DISPLAY. The optional argument DISPLAY specifies which display to ask about. DISPLAY should be either a frame, a display name (a string), or terminal ID. If omitted or nil, that stands for the selected frame's display. */) @@ -2334,7 +2297,7 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-pixel-height", Fx_display_pixel_height, Sx_display_pixel_height, 0, 1, 0, - doc: /* Returns the height in pixels of the Nextstep display DISPLAY. + doc: /* Return the height in pixels of the Nextstep display DISPLAY. The optional argument DISPLAY specifies which display to ask about. DISPLAY should be either a frame, a display name (a string), or terminal ID. If omitted or nil, that stands for the selected frame's display. */) @@ -2348,7 +2311,7 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("display-usable-bounds", Fns_display_usable_bounds, Sns_display_usable_bounds, 0, 1, 0, - doc: /*Return the bounds of the usable part of the screen. + doc: /* Return the bounds of the usable part of the screen. The return value is a list of integers (LEFT TOP WIDTH HEIGHT), which are the boundaries of the usable part of the screen, excluding areas reserved for the Mac menu, dock, and so forth. @@ -2360,15 +2323,21 @@ that stands for the selected frame's display. */) Lisp_Object display; { int top; + NSScreen *screen; NSRect vScreen; check_ns (); - vScreen = [ns_get_screen (display) visibleFrame]; - top = vScreen.origin.y == 0.0 ? - (int) [ns_get_screen (display) frame].size.height - vScreen.size.height : 0; + screen = ns_get_screen (display); + if (!screen) + return Qnil; + + vScreen = [screen visibleFrame]; + /* NS coordinate system is upside-down. + Transform to screen-specific coordinates. */ return list4 (make_number ((int) vScreen.origin.x), - make_number (top), + make_number ((int) [screen frame].size.height + - vScreen.size.height - vScreen.origin.y), make_number ((int) vScreen.size.width), make_number ((int) vScreen.size.height)); } @@ -2376,7 +2345,7 @@ that stands for the selected frame's display. */) DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes, 0, 1, 0, - doc: /* Returns the number of bitplanes of the Nextstep display DISPLAY. + doc: /* Return the number of bitplanes of the Nextstep display DISPLAY. The optional argument DISPLAY specifies which display to ask about. DISPLAY should be either a frame, a display name (a string), or terminal ID. If omitted or nil, that stands for the selected frame's display. */) @@ -2385,7 +2354,7 @@ If omitted or nil, that stands for the selected frame's display. */) { check_ns (); return make_number - (NSBitsPerSampleFromDepth ([ns_get_screen (display) depth])); + (NSBitsPerPixelFromDepth ([ns_get_screen (display) depth])); } @@ -2420,7 +2389,7 @@ compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y) Lisp_Object left, top; EmacsView *view = FRAME_NS_VIEW (f); NSPoint pt; - + /* Start with user-specified or mouse position. */ left = Fcdr (Fassq (Qleft, parms)); if (INTEGERP (left)) @@ -2465,7 +2434,7 @@ compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y) DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0, - doc: /* Show STRING in a "tooltip" window on frame FRAME. + doc: /* Show STRING in a \"tooltip\" window on frame FRAME. A tooltip window is a small window displaying a string. FRAME nil or omitted means use the selected frame. @@ -2624,6 +2593,7 @@ Value is t if tooltip was open, nil otherwise. */) #endif + /* ========================================================================== Lisp interface declaration @@ -2638,8 +2608,6 @@ syms_of_nsfns () Qnone = intern ("none"); staticpro (&Qnone); - Qbuffered = intern ("bufferd"); - staticpro (&Qbuffered); Qfontsize = intern ("fontsize"); staticpro (&Qfontsize); @@ -2666,7 +2634,7 @@ be used as the image of the icon representing the frame. */); DEFVAR_LISP ("ns-version-string", &Vns_version_string, doc: /* Toolkit version for NS Windowing. */); - Vns_version_string = ns_appkit_version (); + Vns_version_string = ns_appkit_version_str (); defsubr (&Sns_read_file_name); defsubr (&Sns_get_resource); @@ -2695,7 +2663,6 @@ be used as the image of the icon representing the frame. */); defsubr (&Sx_display_backing_store); defsubr (&Sx_display_save_under); defsubr (&Sx_create_frame); - defsubr (&Sns_set_alpha); defsubr (&Sx_open_connection); defsubr (&Sx_close_connection); defsubr (&Sx_display_list); @@ -2707,7 +2674,6 @@ be used as the image of the icon representing the frame. */); defsubr (&Sns_perform_service); defsubr (&Sns_convert_utf8_nfd_to_nfc); defsubr (&Sx_focus_frame); - defsubr (&Sns_popup_prefs_panel); defsubr (&Sns_popup_font_panel); defsubr (&Sns_popup_color_panel);