X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/83fc05543999d2890697f1106eb126e2a535ef0e..9f62b5dd0e873f6048630e1e59a371112bdcf720:/src/nsfns.m diff --git a/src/nsfns.m b/src/nsfns.m index f021e834d5..a0fbcfd58b 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -1,6 +1,6 @@ /* Functions for the NeXT/Open/GNUstep and MacOSX window system. -Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2013 Free Software +Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -46,6 +46,9 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #ifdef NS_IMPL_COCOA #include +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#include "macfont.h" +#endif #endif #if 0 @@ -124,7 +127,7 @@ check_ns_display_info (Lisp_Object object) struct frame *sf = XFRAME (selected_frame); if (FRAME_NS_P (sf) && FRAME_LIVE_P (sf)) - dpyinfo = FRAME_NS_DISPLAY_INFO (sf); + dpyinfo = FRAME_DISPLAY_INFO (sf); else if (x_display_list != 0) dpyinfo = x_display_list; else @@ -144,7 +147,7 @@ check_ns_display_info (Lisp_Object object) else { struct frame *f = decode_window_system_frame (object); - dpyinfo = FRAME_NS_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); } return dpyinfo; @@ -172,28 +175,21 @@ ns_get_window (Lisp_Object maybeFrame) struct ns_display_info * ns_display_info_for_name (Lisp_Object name) { - Lisp_Object names; struct ns_display_info *dpyinfo; CHECK_STRING (name); - for (dpyinfo = x_display_list, names = ns_display_name_list; - dpyinfo; - dpyinfo = dpyinfo->next, names = XCDR (names)) - { - Lisp_Object tem; - tem = Fstring_equal (XCAR (XCAR (names)), name); - if (!NILP (tem)) - return dpyinfo; - } + for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) + if (!NILP (Fstring_equal (XCAR (dpyinfo->name_list_element), name))) + return dpyinfo; - error ("Emacs for OpenStep does not yet support multi-display."); + error ("Emacs for Nextstep does not yet support multi-display"); Fx_open_connection (name, Qnil, Qnil); dpyinfo = x_display_list; if (dpyinfo == 0) - error ("OpenStep on %s not responding.\n", SDATA (name)); + error ("Display on %s not responding.\n", SDATA (name)); return dpyinfo; } @@ -407,23 +403,23 @@ x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval) if (!NILP (f->title)) arg = f->title; else - /* explicit name and no icon-name -> explicit_name */ + /* Explicit name and no icon-name -> explicit_name. */ if (f->explicit_name) arg = f->name; else { - /* no explicit name and no icon-name -> - name has to be rebuild from icon_title_format */ - windows_or_buffers_changed++; + /* No explicit name and no icon-name -> + name has to be rebuild from icon_title_format. */ + windows_or_buffers_changed = 62; return; } } /* Don't change the name if it's already NAME. */ - if ([[view window] miniwindowTitle] && - ([[[view window] miniwindowTitle] + if ([[view window] miniwindowTitle] + && ([[[view window] miniwindowTitle] isEqualToString: [NSString stringWithUTF8String: - SSDATA (arg)]])) + SSDATA (arg)]])) return; [[view window] setMiniwindowTitle: @@ -455,8 +451,8 @@ ns_set_name_internal (struct frame *f, Lisp_Object name) str = [NSString stringWithUTF8String: SSDATA (encoded_icon_name)]; - if ([[view window] miniwindowTitle] && - ! [[[view window] miniwindowTitle] isEqualToString: str]) + if ([[view window] miniwindowTitle] + && ! [[[view window] miniwindowTitle] isEqualToString: str]) [[view window] setMiniwindowTitle: str]; } @@ -473,7 +469,7 @@ ns_set_name (struct frame *f, Lisp_Object name, int explicit) /* If we're switching from explicit to implicit, we had better update the mode lines and thereby update the title. */ if (f->explicit_name && NILP (name)) - update_mode_lines = 1; + update_mode_lines = 21; f->explicit_name = ! NILP (name); } @@ -481,7 +477,7 @@ ns_set_name (struct frame *f, Lisp_Object name, int explicit) return; if (NILP (name)) - name = build_string([ns_app_name UTF8String]); + name = build_string ([ns_app_name UTF8String]); else CHECK_STRING (name); @@ -491,7 +487,7 @@ ns_set_name (struct frame *f, Lisp_Object name, int explicit) fset_name (f, name); - /* title overrides explicit name */ + /* Title overrides explicit name. */ if (! NILP (f->title)) name = f->title; @@ -538,7 +534,7 @@ x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name) if (EQ (name, f->title)) return; - update_mode_lines = 1; + update_mode_lines = 22; fset_title (f, name); @@ -707,7 +703,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) } } - x_set_window_size (f, 0, f->text_cols, f->text_lines); + x_set_window_size (f, 0, f->text_cols, f->text_lines, 0); } @@ -827,9 +823,9 @@ int ns_lisp_to_cursor_type (Lisp_Object arg) { char *str; - if (XTYPE (arg) == Lisp_String) + if (STRINGP (arg)) str = SSDATA (arg); - else if (XTYPE (arg) == Lisp_Symbol) + else if (SYMBOLP (arg)) str = SSDATA (SYMBOL_NAME (arg)); else return -1; if (!strcmp (str, "box")) return FILLED_BOX_CURSOR; @@ -877,12 +873,16 @@ x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) static Lisp_Object ns_appkit_version_str (void) { - char tmp[80]; + char tmp[256]; #ifdef NS_IMPL_GNUSTEP sprintf(tmp, "gnustep-gui-%s", Xstr(GNUSTEP_GUI_VERSION)); #elif defined (NS_IMPL_COCOA) - sprintf(tmp, "apple-appkit-%.2f", NSAppKitVersionNumber); + NSString *osversion + = [[NSProcessInfo processInfo] operatingSystemVersionString]; + sprintf(tmp, "appkit-%.2f %s", + NSAppKitVersionNumber, + [osversion UTF8String]); #else tmp = "ns-unknown"; #endif @@ -950,6 +950,8 @@ frame_parm_handler ns_frame_parm_handlers[] = x_set_icon_name, x_set_icon_type, x_set_internal_border_width, /* generic OK */ + 0, /* x_set_right_divider_width */ + 0, /* x_set_bottom_divider_width */ x_set_menu_bar_lines, x_set_mouse_color, x_explicitly_set_name, @@ -992,7 +994,7 @@ unwind_create_frame (Lisp_Object frame) if (NILP (Fmemq (frame, Vframe_list))) { #if defined GLYPH_DEBUG && defined ENABLE_CHECKING - struct ns_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); #endif x_free_frame_resources (f); @@ -1026,7 +1028,7 @@ get_geometry_from_preferences (struct ns_display_info *dpyinfo, }; int i; - for (i = 0; i < sizeof (r)/sizeof (r[0]); ++i) + for (i = 0; i < ARRAYELTS (r); ++i) { if (NILP (Fassq (r[i].tem, parms))) { @@ -1066,7 +1068,6 @@ This function is an internal primitive--use `make-frame' instead. */) int minibuffer_only = 0; long window_prompting = 0; int width, height; - ptrdiff_t count = specpdl_ptr - specpdl; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; Lisp_Object display; struct ns_display_info *dpyinfo = NULL; @@ -1139,9 +1140,11 @@ This function is an internal primitive--use `make-frame' instead. */) if (! STRINGP (f->icon_name)) fset_icon_name (f, Qnil); - FRAME_NS_DISPLAY_INFO (f) = dpyinfo; + FRAME_DISPLAY_INFO (f) = dpyinfo; + + dynwind_begin (); - /* With FRAME_NS_DISPLAY_INFO set up, this unwind-protect is safe. */ + /* With FRAME_DISPLAY_INFO set up, this unwind-protect is safe. */ record_unwind_protect (unwind_create_frame, frame); f->output_data.ns->window_desc = desc_ctr++; @@ -1152,7 +1155,7 @@ This function is an internal primitive--use `make-frame' instead. */) } else { - f->output_data.ns->parent_desc = FRAME_NS_DISPLAY_INFO (f)->root_window; + f->output_data.ns->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.ns->explicit_parent = 0; } @@ -1171,7 +1174,16 @@ This function is an internal primitive--use `make-frame' instead. */) } block_input (); + +#ifdef NS_IMPL_COCOA +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + if (CTGetCoreTextVersion != NULL + && CTGetCoreTextVersion () >= kCTVersionNumber10_5) + mac_register_font_driver (f); +#endif +#endif register_font_driver (&nsfont_driver, f); + x_default_parameter (f, parms, Qfont_backend, Qnil, "fontBackend", "FontBackend", RES_TYPE_STRING); @@ -1181,9 +1193,15 @@ This function is an internal primitive--use `make-frame' instead. */) x_default_parameter (f, parms, Qfontsize, make_number (0 /*(int)[font pointSize]*/), "fontSize", "FontSize", RES_TYPE_NUMBER); + // Remove ' Regular', not handled by backends. + char *fontname = xstrdup ([[font displayName] UTF8String]); + int len = strlen (fontname); + if (len > 8 && strcmp (fontname + len - 8, " Regular") == 0) + fontname[len-8] = '\0'; x_default_parameter (f, parms, Qfont, - build_string ([[font fontName] UTF8String]), + build_string (fontname), "font", "Font", RES_TYPE_STRING); + xfree (fontname); } unblock_input (); @@ -1224,6 +1242,13 @@ This function is an internal primitive--use `make-frame' instead. */) init_frame_faces (f); + /* Read comment about this code in corresponding place in xfns.c. */ + width = FRAME_TEXT_WIDTH (f); + height = FRAME_TEXT_HEIGHT (f); + FRAME_TEXT_HEIGHT (f) = 0; + SET_FRAME_WIDTH (f, 0); + change_frame_size (f, width, height, 1, 0, 0, 1); + /* The resources controlling the menu-bar and tool-bar are processed specially at startup, and reflected in the mode variables; ignore them here. */ @@ -1255,7 +1280,8 @@ This function is an internal primitive--use `make-frame' instead. */) f->output_data.ns->hand_cursor = [NSCursor pointingHandCursor]; f->output_data.ns->hourglass_cursor = [NSCursor disappearingItemCursor]; f->output_data.ns->horizontal_drag_cursor = [NSCursor resizeLeftRightCursor]; - FRAME_NS_DISPLAY_INFO (f)->vertical_scroll_bar_cursor + f->output_data.ns->vertical_drag_cursor = [NSCursor resizeUpDownCursor]; + FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor = [NSCursor arrowCursor]; f->output_data.ns->current_pointer = f->output_data.ns->text_cursor; @@ -1287,12 +1313,11 @@ This function is an internal primitive--use `make-frame' instead. */) x_default_parameter (f, parms, Qfullscreen, Qnil, "fullscreen", "Fullscreen", RES_TYPE_SYMBOL); - width = FRAME_COLS (f); - height = FRAME_LINES (f); - - SET_FRAME_COLS (f, 0); - FRAME_LINES (f) = 0; - change_frame_size (f, height, width, 1, 0, 0); + width = FRAME_TEXT_WIDTH (f); + height = FRAME_TEXT_HEIGHT (f); + FRAME_TEXT_HEIGHT (f) = 0; + SET_FRAME_WIDTH (f, 0); + change_frame_size (f, width, height, 1, 0, 0, 1); if (! f->output_data.ns->explicit_parent) { @@ -1336,17 +1361,14 @@ This function is an internal primitive--use `make-frame' instead. */) and similar functions. */ Vwindow_list = Qnil; - return unbind_to (count, frame); + dynwind_end (); + return frame; } - -DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0, - doc: /* Set the input focus to FRAME. -FRAME nil means use the selected frame. */) - (Lisp_Object frame) +void +x_focus_frame (struct frame *f) { - struct frame *f = decode_window_system_frame (frame); - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); if (dpyinfo->x_focus_frame != f) { @@ -1356,8 +1378,6 @@ FRAME nil means use the selected frame. */) [[view window] makeKeyAndOrderFront: view]; unblock_input (); } - - return Qnil; } @@ -1368,9 +1388,15 @@ DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel, { struct frame *f = decode_window_system_frame (frame); id fm = [NSFontManager sharedFontManager]; - - [fm setSelectedFont: ((struct nsfont_info *)f->output_data.ns->font)->nsfont - isMultiple: NO]; + struct font *font = f->output_data.ns->font; + NSFont *nsfont; + if (EQ (font->driver->type, Qns)) + nsfont = ((struct nsfont_info *)font)->nsfont; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + else + nsfont = (NSFont *) macfont_get_nsctfont (font); +#endif + [fm setSelectedFont: nsfont isMultiple: NO]; [fm orderFrontFontPanel: NSApp]; return Qnil; } @@ -1797,10 +1823,10 @@ terminate Emacs if we can't open the connection. if (dpyinfo == 0) { if (!NILP (must_succeed)) - fatal ("OpenStep on %s not responding.\n", + fatal ("Display on %s not responding.\n", SSDATA (display)); else - error ("OpenStep on %s not responding.\n", + error ("Display on %s not responding.\n", SSDATA (display)); } @@ -1826,11 +1852,11 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, doc: /* Return the list of display names that Emacs has connections to. */) (void) { - Lisp_Object tail, result; + Lisp_Object result = Qnil; + struct ns_display_info *ndi; - result = Qnil; - for (tail = ns_display_name_list; CONSP (tail); tail = XCDR (tail)) - result = Fcons (XCAR (XCAR (tail)), result); + for (ndi = x_display_list; ndi; ndi = ndi->next) + result = Fcons (XCAR (ndi->name_list_element), result); return result; } @@ -2031,16 +2057,27 @@ DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc, /* TODO: If GNUstep ever implements precomposedStringWithCanonicalMapping, remove this. */ NSString *utfStr; - Lisp_Object ret; + Lisp_Object ret = Qnil; + NSAutoreleasePool *pool; CHECK_STRING (str); - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - utfStr = [NSString stringWithUTF8String: SSDATA (str)]; + pool = [[NSAutoreleasePool alloc] init]; + utfStr = [NSString stringWithUTF8String: SSDATA (str)]; #ifdef NS_IMPL_COCOA - utfStr = [utfStr precomposedStringWithCanonicalMapping]; + if (utfStr) + utfStr = [utfStr precomposedStringWithCanonicalMapping]; #endif - ret = build_string ([utfStr UTF8String]); + if (utfStr) + { + const char *cstr = [utfStr UTF8String]; + if (cstr) + ret = build_string (cstr); + } + [pool release]; + if (NILP (ret)) + error ("Invalid UTF-8"); + return ret; } @@ -2065,7 +2102,6 @@ ns_do_applescript (Lisp_Object script, Lisp_Object *result) returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; [scriptObject release]; - *result = Qnil; if (returnDescriptor != NULL) @@ -2126,6 +2162,7 @@ In case the execution fails, an error is signaled. */) Lisp_Object result; int status; NSEvent *nxev; + struct input_event ev; CHECK_STRING (script); check_window_system (NULL); @@ -2153,8 +2190,10 @@ In case the execution fails, an error is signaled. */) // If there are other events, the event loop may exit. Keep running // until the script has been handled. */ + ns_init_events (&ev); while (! NILP (as_script)) [NSApp run]; + ns_finish_events (); status = as_status; as_status = 0; @@ -2194,17 +2233,13 @@ x_set_scroll_bar_default_width (struct frame *f) wid - 1) / wid; } - -extern const char *x_get_string_resource (XrmDatabase, char *, char *); - - /* terms impl this instead of x-get-resource directly */ -const char * -x_get_string_resource (XrmDatabase rdb, char *name, char *class) +char * +x_get_string_resource (XrmDatabase rdb, const char *name, const char *class) { /* remove appname prefix; TODO: allow for !="Emacs" */ - char *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0); - const char *res; + const char *res, *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0); + check_window_system (NULL); if (inhibit_x_resources) @@ -2212,16 +2247,16 @@ x_get_string_resource (XrmDatabase rdb, char *name, char *class) return NULL; res = ns_get_defaults_value (toCheck); - return !res ? NULL : - (!c_strncasecmp (res, "YES", 3) ? "true" : - (!c_strncasecmp (res, "NO", 2) ? "false" : res)); + return (!res ? NULL : + (!c_strncasecmp (res, "YES", 3) ? "true" : + (!c_strncasecmp (res, "NO", 2) ? "false" : (char *) res))); } Lisp_Object x_get_focus_frame (struct frame *frame) { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (frame); Lisp_Object nsfocus; if (!dpyinfo->x_focus_frame) @@ -2262,7 +2297,7 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0, if (ns_lisp_to_color (color, &col)) return Qnil; - [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace] + [[col colorUsingDefaultColorSpace] getRed: &red green: &green blue: &blue alpha: &alpha]; return list3i (lrint (red * 65280), lrint (green * 65280), lrint (blue * 65280)); @@ -2340,28 +2375,86 @@ each physical monitor, use `display-monitor-attributes-list'. */) } #ifdef NS_IMPL_COCOA -/* Returns the name for the screen that DICT came from, or NULL. + +/* Returns the name for the screen that OBJ represents, or NULL. Caller must free return value. */ static char * -ns_screen_name (CGDirectDisplayID did) +ns_get_name_from_ioreg (io_object_t obj) { char *name = NULL; + NSDictionary *info = (NSDictionary *) - IODisplayCreateInfoDictionary (CGDisplayIOServicePort (did), - kIODisplayOnlyPreferredName); - NSDictionary *names - = [info objectForKey: - [NSString stringWithUTF8String:kDisplayProductName]]; - - if ([names count] > 0) { - NSString *n = [names objectForKey: [[names allKeys] objectAtIndex:0]]; - if (n != nil) - name = xstrdup ([n UTF8String]); - } + IODisplayCreateInfoDictionary (obj, kIODisplayOnlyPreferredName); + NSDictionary *names = [info objectForKey: + [NSString stringWithUTF8String: + kDisplayProductName]]; + + if ([names count] > 0) + { + NSString *n = [names objectForKey: [[names allKeys] + objectAtIndex:0]]; + if (n != nil) name = xstrdup ([n UTF8String]); + } [info release]; + + return name; +} + +/* Returns the name for the screen that DID came from, or NULL. + Caller must free return value. +*/ + +static char * +ns_screen_name (CGDirectDisplayID did) +{ + char *name = NULL; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 + mach_port_t masterPort; + io_iterator_t it; + io_object_t obj; + + // CGDisplayIOServicePort is deprecated. Do it another (harder) way. + + if (IOMasterPort (MACH_PORT_NULL, &masterPort) != kIOReturnSuccess + || IOServiceGetMatchingServices (masterPort, + IOServiceMatching ("IONDRVDevice"), + &it) != kIOReturnSuccess) + return name; + + /* Must loop until we find a name. Many devices can have the same unit + number (represents different GPU parts), but only one has a name. */ + while (! name && (obj = IOIteratorNext (it))) + { + CFMutableDictionaryRef props; + const void *val; + + if (IORegistryEntryCreateCFProperties (obj, + &props, + kCFAllocatorDefault, + kNilOptions) == kIOReturnSuccess + && props != nil + && (val = CFDictionaryGetValue(props, @"IOFBDependentIndex"))) + { + unsigned nr = [(NSNumber *)val unsignedIntegerValue]; + if (nr == CGDisplayUnitNumber (did)) + name = ns_get_name_from_ioreg (obj); + } + + CFRelease (props); + IOObjectRelease (obj); + } + + IOObjectRelease (it); + +#else + + name = ns_get_name_from_ioreg (CGDisplayIOServicePort (did)); + +#endif return name; } #endif @@ -2551,6 +2644,7 @@ compute_tip_xy (struct frame *f, { Lisp_Object left, top; EmacsView *view = FRAME_NS_VIEW (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); NSPoint pt; /* Start with user-specified or mouse position. */ @@ -2559,7 +2653,8 @@ compute_tip_xy (struct frame *f, if (!INTEGERP (left) || !INTEGERP (top)) { - pt = last_mouse_motion_position; + pt.x = dpyinfo->last_mouse_motion_x; + pt.y = dpyinfo->last_mouse_motion_y; /* Convert to screen coordinates */ pt = [view convertPoint: pt toView: nil]; pt = [[view window] convertBaseToScreen: pt]; @@ -2568,7 +2663,7 @@ compute_tip_xy (struct frame *f, { /* Absolute coordinates. */ pt.x = XINT (left); - pt.y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - XINT (top) + pt.y = x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - XINT (top) - height; } @@ -2578,7 +2673,7 @@ compute_tip_xy (struct frame *f, else if (pt.x + XINT (dx) <= 0) *root_x = 0; /* Can happen for negative dx */ else if (pt.x + XINT (dx) + width - <= x_display_pixel_width (FRAME_NS_DISPLAY_INFO (f))) + <= x_display_pixel_width (FRAME_DISPLAY_INFO (f))) /* It fits to the right of the pointer. */ *root_x = pt.x + XINT (dx); else if (width + XINT (dx) <= pt.x) @@ -2594,12 +2689,12 @@ compute_tip_xy (struct frame *f, /* It fits below the pointer. */ *root_y = pt.y - height - XINT (dy); else if (pt.y + XINT (dy) + height - <= x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f))) + <= x_display_pixel_height (FRAME_DISPLAY_INFO (f))) /* It fits above the pointer */ *root_y = pt.y + XINT (dy); else /* Put it on the top. */ - *root_y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - height; + *root_y = x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - height; } @@ -2631,11 +2726,11 @@ Text larger than the specified size is clipped. */) { int root_x, root_y; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; - ptrdiff_t count = SPECPDL_INDEX (); struct frame *f; char *str; NSSize size; + dynwind_begin (); specbind (Qinhibit_redisplay, Qt); GCPRO4 (string, parms, frame, timeout); @@ -2676,7 +2771,8 @@ Text larger than the specified size is clipped. */) unblock_input (); UNGCPRO; - return unbind_to (count, Qnil); + dynwind_end (); + return Qnil; } @@ -2829,6 +2925,8 @@ handlePanelKeys (NSSavePanel *panel, NSEvent *theEvent) void syms_of_nsfns (void) { +#include "nsfns.x" + Qfontsize = intern_c_string ("fontsize"); staticpro (&Qfontsize); @@ -2857,50 +2955,6 @@ be used as the image of the icon representing the frame. */); doc: /* Toolkit version for NS Windowing. */); Vns_version_string = ns_appkit_version_str (); - defsubr (&Sns_read_file_name); - defsubr (&Sns_get_resource); - defsubr (&Sns_set_resource); - defsubr (&Sxw_display_color_p); /* this and next called directly by C code */ - defsubr (&Sx_display_grayscale_p); - defsubr (&Sns_font_name); - defsubr (&Sns_list_colors); -#ifdef NS_IMPL_COCOA - defsubr (&Sns_do_applescript); -#endif - defsubr (&Sxw_color_defined_p); - defsubr (&Sxw_color_values); - defsubr (&Sx_server_max_request_size); - defsubr (&Sx_server_vendor); - defsubr (&Sx_server_version); - defsubr (&Sx_display_pixel_width); - defsubr (&Sx_display_pixel_height); - defsubr (&Sns_display_monitor_attributes_list); - defsubr (&Sx_display_mm_width); - defsubr (&Sx_display_mm_height); - defsubr (&Sx_display_screens); - defsubr (&Sx_display_planes); - defsubr (&Sx_display_color_cells); - defsubr (&Sx_display_visual_class); - defsubr (&Sx_display_backing_store); - defsubr (&Sx_display_save_under); - defsubr (&Sx_create_frame); - defsubr (&Sx_open_connection); - defsubr (&Sx_close_connection); - defsubr (&Sx_display_list); - - defsubr (&Sns_hide_others); - defsubr (&Sns_hide_emacs); - defsubr (&Sns_emacs_info_panel); - defsubr (&Sns_list_services); - defsubr (&Sns_perform_service); - defsubr (&Sns_convert_utf8_nfd_to_nfc); - defsubr (&Sx_focus_frame); - defsubr (&Sns_popup_font_panel); - defsubr (&Sns_popup_color_panel); - - defsubr (&Sx_show_tip); - defsubr (&Sx_hide_tip); - as_status = 0; as_script = Qnil; as_result = 0;