1 /* Functions for the NeXT/Open/GNUstep and MacOSX window system.
3 Copyright (C) 1989, 1992, 1993, 1994, 2005, 2006, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
22 Originally by Carl Edman
23 Updated by Christian Limpach (chris@nice.ch)
24 OpenStep/Rhapsody port by Scott Bender (sbender@harmony-ds.com)
25 MacOSX/Aqua port by Christophe de Dinechin (descubes@earthlink.net)
26 GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)
29 /* This should be the first include, as it may set up #defines affecting
30 interpretation of even the system includes. */
38 #include "blockinput.h"
43 #include "termhooks.h"
45 #include "character.h"
49 int fns_trace_num = 1;
50 #define NSTRACE(x) fprintf (stderr, "%s:%d: [%d] " #x "\n", \
51 __FILE__, __LINE__, ++fns_trace_num)
58 extern NSArray *ns_send_types, *ns_return_types, *ns_drag_types;
60 extern Lisp_Object Qforeground_color;
61 extern Lisp_Object Qbackground_color;
62 extern Lisp_Object Qcursor_color;
63 extern Lisp_Object Qinternal_border_width;
64 extern Lisp_Object Qvisibility;
65 extern Lisp_Object Qcursor_type;
66 extern Lisp_Object Qicon_type;
67 extern Lisp_Object Qicon_name;
68 extern Lisp_Object Qicon_left;
69 extern Lisp_Object Qicon_top;
70 extern Lisp_Object Qleft;
71 extern Lisp_Object Qright;
72 extern Lisp_Object Qtop;
73 extern Lisp_Object Qdisplay;
74 extern Lisp_Object Qvertical_scroll_bars;
75 extern Lisp_Object Qauto_raise;
76 extern Lisp_Object Qauto_lower;
77 extern Lisp_Object Qbox;
78 extern Lisp_Object Qscroll_bar_width;
79 extern Lisp_Object Qx_resource_name;
80 extern Lisp_Object Qface_set_after_frame_default;
81 extern Lisp_Object Qunderline, Qundefined;
82 extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
83 extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle;
84 extern Lisp_Object Qnone;
85 extern Lisp_Object Vframe_title_format, Vicon_title_format;
87 /* The below are defined in frame.c. */
89 extern Lisp_Object Vmenu_bar_mode, Vtool_bar_mode;
91 Lisp_Object Qbuffered;
92 Lisp_Object Qfontsize;
94 /* hack for OS X file panels */
97 /* Alist of elements (REGEXP . IMAGE) for images of icons associated
99 static Lisp_Object Vns_icon_type_alist;
101 /* Toolkit version support. */
102 static Lisp_Object Vns_version_string;
104 EmacsTooltip *ns_tooltip;
106 /* Need forward declaration here to preserve organizational integrity of file */
107 Lisp_Object Fx_open_connection (Lisp_Object, Lisp_Object, Lisp_Object);
109 extern BOOL ns_in_resize;
112 /* ==========================================================================
114 Internal utility functions
116 ========================================================================== */
123 error ("OpenStep is not in use or not initialized");
127 /* Nonzero if we can use mouse menus. */
135 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
136 and checking validity for NS. */
138 check_ns_frame (Lisp_Object frame)
143 f = SELECTED_FRAME ();
146 CHECK_LIVE_FRAME (frame);
149 if (! FRAME_NS_P (f))
150 error ("non-Nextstep frame used");
155 /* Let the user specify an Nextstep display with a frame.
156 nil stands for the selected frame--or, if that is not an Nextstep frame,
157 the first Nextstep display on the list. */
158 static struct ns_display_info *
159 check_ns_display_info (Lisp_Object frame)
163 struct frame *f = SELECTED_FRAME ();
164 if (FRAME_NS_P (f) && FRAME_LIVE_P (f) )
165 return FRAME_NS_DISPLAY_INFO (f);
166 else if (x_display_list != 0)
167 return x_display_list;
169 error ("Nextstep windows are not in use or not initialized");
171 else if (INTEGERP (frame))
173 struct terminal *t = get_terminal (frame, 1);
175 if (t->type != output_ns)
176 error ("Terminal %d is not a Nextstep display", XINT (frame));
178 return t->display_info.ns;
180 else if (STRINGP (frame))
181 return ns_display_info_for_name (frame);
186 CHECK_LIVE_FRAME (frame);
188 if (! FRAME_NS_P (f))
189 error ("non-Nextstep frame used");
190 return FRAME_NS_DISPLAY_INFO (f);
192 return NULL; /* shut compiler up */
197 ns_get_window (Lisp_Object maybeFrame)
199 id view =nil, window =nil;
201 if (!FRAMEP (maybeFrame) || !FRAME_NS_P (XFRAME (maybeFrame)))
202 maybeFrame = selected_frame;/*wrong_type_argument (Qframep, maybeFrame); */
204 if (!NILP (maybeFrame))
205 view = FRAME_NS_VIEW (XFRAME (maybeFrame));
206 if (view) window =[view window];
213 ns_get_screen (Lisp_Object screen)
216 struct terminal *terminal;
218 if (EQ (Qt, screen)) /* not documented */
219 return [NSScreen mainScreen];
221 terminal = get_terminal (screen, 1);
222 if (terminal->type != output_ns)
226 f = SELECTED_FRAME ();
227 else if (FRAMEP (screen))
231 struct ns_display_info *dpyinfo = terminal->display_info.ns;
232 f = dpyinfo->x_focus_frame
233 ? dpyinfo->x_focus_frame : dpyinfo->x_highlight_frame;
236 return ((f && FRAME_NS_P (f)) ? [[FRAME_NS_VIEW (f) window] screen]
241 /* Return the X display structure for the display named NAME.
242 Open a new connection if necessary. */
243 struct ns_display_info *
244 ns_display_info_for_name (Lisp_Object name)
247 struct ns_display_info *dpyinfo;
251 for (dpyinfo = x_display_list, names = ns_display_name_list;
253 dpyinfo = dpyinfo->next, names = XCDR (names))
256 tem = Fstring_equal (XCAR (XCAR (names)), name);
261 error ("Emacs for OpenStep does not yet support multi-display.");
263 Fx_open_connection (name, Qnil, Qnil);
264 dpyinfo = x_display_list;
267 error ("OpenStep on %s not responding.\n", SDATA (name));
274 interpret_services_menu (NSMenu *menu, Lisp_Object prefix, Lisp_Object old)
275 /* --------------------------------------------------------------------------
276 Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
277 -------------------------------------------------------------------------- */
287 count = [menu numberOfItems];
288 for (i = 0; i<count; i++)
290 item = [menu itemAtIndex: i];
291 name = [[item title] UTF8String];
294 nameStr = build_string (name);
296 if ([item hasSubmenu])
298 old = interpret_services_menu ([item submenu],
299 Fcons (nameStr, prefix), old);
303 keys = [item keyEquivalent];
304 if (keys && [keys length] )
306 key = [keys characterAtIndex: 0];
307 res = make_number (key|super_modifier);
313 old = Fcons (Fcons (res,
314 Freverse (Fcons (nameStr,
324 /* ==========================================================================
326 Frame parameter setters
328 ========================================================================== */
332 x_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
336 if (ns_lisp_to_color (arg, &col))
338 store_frame_param (f, Qforeground_color, oldval);
339 error ("Unknown color");
343 [f->output_data.ns->foreground_color release];
344 f->output_data.ns->foreground_color = col;
346 if (FRAME_NS_VIEW (f))
348 update_face_from_frame_parameter (f, Qforeground_color, arg);
349 /*recompute_basic_faces (f); */
350 if (FRAME_VISIBLE_P (f))
357 x_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
361 NSView *view = FRAME_NS_VIEW (f);
364 if (ns_lisp_to_color (arg, &col))
366 store_frame_param (f, Qbackground_color, oldval);
367 error ("Unknown color");
370 /* clear the frame; in some instances the NS-internal GC appears not to
371 update, or it does update and cannot clear old text properly */
372 if (FRAME_VISIBLE_P (f))
376 [f->output_data.ns->background_color release];
377 f->output_data.ns->background_color = col;
380 [[view window] setBackgroundColor: col];
381 alpha = [col alphaComponent];
384 [[view window] setOpaque: NO];
386 [[view window] setOpaque: YES];
388 face = FRAME_DEFAULT_FACE (f);
391 col = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f);
393 = (EMACS_UINT) [[col colorWithAlphaComponent: alpha] retain];
396 update_face_from_frame_parameter (f, Qbackground_color, arg);
399 if (FRAME_VISIBLE_P (f))
406 x_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
410 if (ns_lisp_to_color (arg, &col))
412 store_frame_param (f, Qcursor_color, oldval);
413 error ("Unknown color");
416 [FRAME_CURSOR_COLOR (f) release];
417 FRAME_CURSOR_COLOR (f) = [col retain];
419 if (FRAME_VISIBLE_P (f))
421 x_update_cursor (f, 0);
422 x_update_cursor (f, 1);
424 update_face_from_frame_parameter (f, Qcursor_color, arg);
429 x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
431 NSView *view = FRAME_NS_VIEW (f);
432 NSTRACE (x_set_icon_name);
437 /* see if it's changed */
440 if (STRINGP (oldval) && EQ (Fstring_equal (oldval, arg), Qt))
443 else if (!STRINGP (oldval) && EQ (oldval, Qnil) == EQ (arg, Qnil))
450 if (!NILP (f->title))
453 /* explicit name and no icon-name -> explicit_name */
454 if (f->explicit_name)
458 /* no explicit name and no icon-name ->
459 name has to be rebuild from icon_title_format */
460 windows_or_buffers_changed++;
465 /* Don't change the name if it's already NAME. */
466 if ([[view window] miniwindowTitle] &&
467 ([[[view window] miniwindowTitle]
468 isEqualToString: [NSString stringWithUTF8String:
472 [[view window] setMiniwindowTitle:
473 [NSString stringWithUTF8String: SDATA (arg)]];
477 ns_set_name_internal (FRAME_PTR f, Lisp_Object name)
480 Lisp_Object encoded_name, encoded_icon_name;
482 NSView *view = FRAME_NS_VIEW (f);
485 encoded_name = ENCODE_UTF_8 (name);
488 str = [NSString stringWithUTF8String: SDATA (encoded_name)];
490 /* Don't change the name if it's already NAME. */
491 if (! [[[view window] title] isEqualToString: str])
492 [[view window] setTitle: str];
494 if (!STRINGP (f->icon_name))
495 encoded_icon_name = encoded_name;
497 encoded_icon_name = ENCODE_UTF_8 (f->icon_name);
499 str = [NSString stringWithUTF8String: SDATA (encoded_icon_name)];
501 if ([[view window] miniwindowTitle] &&
502 ! [[[view window] miniwindowTitle] isEqualToString: str])
503 [[view window] setMiniwindowTitle: str];
508 ns_set_name (struct frame *f, Lisp_Object name, int explicit)
511 NSTRACE (ns_set_name);
516 /* Make sure that requests from lisp code override requests from
517 Emacs redisplay code. */
520 /* If we're switching from explicit to implicit, we had better
521 update the mode lines and thereby update the title. */
522 if (f->explicit_name && NILP (name))
523 update_mode_lines = 1;
525 f->explicit_name = ! NILP (name);
527 else if (f->explicit_name)
531 name = build_string([ns_app_name UTF8String]);
535 /* Don't change the name if it's already NAME. */
536 if (! NILP (Fstring_equal (name, f->name)))
541 /* title overrides explicit name */
542 if (! NILP (f->title))
545 ns_set_name_internal (f, name);
549 /* This function should be called when the user's lisp code has
550 specified a name for the frame; the name will override any set by the
553 x_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
555 NSTRACE (x_explicitly_set_name);
556 ns_set_name (f, arg, 1);
560 /* This function should be called by Emacs redisplay code to set the
561 name; names set this way will never override names set by the user's
564 x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
566 NSTRACE (x_implicitly_set_name);
568 /* Deal with NS specific format t. */
569 if (FRAME_NS_P (f) && ((FRAME_ICONIFIED_P (f) && EQ (Vicon_title_format, Qt))
570 || EQ (Vframe_title_format, Qt)))
571 ns_set_name_as_filename (f);
573 ns_set_name (f, arg, 0);
577 /* Change the title of frame F to NAME.
578 If NAME is nil, use the frame name as the title. */
581 x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
583 NSTRACE (x_set_title);
584 /* Don't change the title if it's already NAME. */
585 if (EQ (name, f->title))
588 update_mode_lines = 1;
597 ns_set_name_internal (f, name);
602 ns_set_name_as_filename (struct frame *f)
605 Lisp_Object name, filename;
606 Lisp_Object buf = XWINDOW (f->selected_window)->buffer;
608 NSAutoreleasePool *pool;
610 Lisp_Object encoded_name, encoded_filename;
612 NSTRACE (ns_set_name_as_filename);
614 if (f->explicit_name || ! NILP (f->title) || ns_in_resize)
618 pool = [[NSAutoreleasePool alloc] init];
619 filename = XBUFFER (buf)->filename;
620 name = XBUFFER (buf)->name;
624 if (! NILP (filename))
625 name = Ffile_name_nondirectory (filename);
627 name = build_string ([ns_app_name UTF8String]);
631 encoded_name = ENCODE_UTF_8 (name);
634 view = FRAME_NS_VIEW (f);
636 title = FRAME_ICONIFIED_P (f) ? [[[view window] miniwindowTitle] UTF8String]
637 : [[[view window] title] UTF8String];
639 if (title && (! strcmp (title, SDATA (encoded_name))))
646 str = [NSString stringWithUTF8String: SDATA (encoded_name)];
647 if (str == nil) str = @"Bad coding";
649 if (FRAME_ICONIFIED_P (f))
650 [[view window] setMiniwindowTitle: str];
655 if (! NILP (filename))
658 encoded_filename = ENCODE_UTF_8 (filename);
661 fstr = [NSString stringWithUTF8String: SDATA (encoded_filename)];
662 if (fstr == nil) fstr = @"";
664 /* work around a bug observed on 10.3 and later where
665 setTitleWithRepresentedFilename does not clear out previous state
666 if given filename does not exist */
667 if (! [[NSFileManager defaultManager] fileExistsAtPath: fstr])
668 [[view window] setRepresentedFilename: @""];
674 [[view window] setRepresentedFilename: fstr];
675 [[view window] setTitle: str];
685 ns_set_doc_edited (struct frame *f, Lisp_Object arg)
687 NSView *view = FRAME_NS_VIEW (f);
688 NSAutoreleasePool *pool;
689 if (!MINI_WINDOW_P (XWINDOW (f->selected_window)))
692 pool = [[NSAutoreleasePool alloc] init];
693 [[view window] setDocumentEdited: !NILP (arg)];
701 x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
704 int olines = FRAME_MENU_BAR_LINES (f);
705 if (FRAME_MINIBUF_ONLY_P (f))
708 if (INTEGERP (value))
709 nlines = XINT (value);
713 FRAME_MENU_BAR_LINES (f) = 0;
716 FRAME_EXTERNAL_MENU_BAR (f) = 1;
717 /* does for all frames, whereas we just want for one frame
718 [NSMenu setMenuBarVisible: YES]; */
722 if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
723 free_frame_menubar (f);
724 /* [NSMenu setMenuBarVisible: NO]; */
725 FRAME_EXTERNAL_MENU_BAR (f) = 0;
730 /* toolbar support */
732 x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
735 Lisp_Object root_window;
737 if (FRAME_MINIBUF_ONLY_P (f))
740 if (INTEGERP (value) && XINT (value) >= 0)
741 nlines = XFASTINT (value);
747 FRAME_EXTERNAL_TOOL_BAR (f) = 1;
748 update_frame_tool_bar (f);
752 if (FRAME_EXTERNAL_TOOL_BAR (f))
754 free_frame_tool_bar (f);
755 FRAME_EXTERNAL_TOOL_BAR (f) = 0;
759 x_set_window_size (f, 0, f->text_cols, f->text_lines);
764 ns_implicitly_set_icon_type (struct frame *f)
767 EmacsView *view = FRAME_NS_VIEW (f);
769 Lisp_Object chain, elt;
770 NSAutoreleasePool *pool;
773 NSTRACE (ns_implicitly_set_icon_type);
776 pool = [[NSAutoreleasePool alloc] init];
777 if (f->output_data.ns->miniimage
778 && [[NSString stringWithUTF8String: SDATA (f->name)]
779 isEqualToString: [(NSImage *)f->output_data.ns->miniimage name]])
786 tem = assq_no_quit (Qicon_type, f->param_alist);
787 if (CONSP (tem) && ! NILP (XCDR (tem)))
794 for (chain = Vns_icon_type_alist;
795 (image = nil) && CONSP (chain);
796 chain = XCDR (chain))
799 /* special case: 't' means go by file type */
800 if (SYMBOLP (elt) && EQ (elt, Qt) && SDATA (f->name)[0] == '/')
803 = [NSString stringWithUTF8String: SDATA (f->name)];
804 if ([[NSFileManager defaultManager] fileExistsAtPath: str])
805 image = [[[NSWorkspace sharedWorkspace] iconForFile: str] retain];
807 else if (CONSP (elt) &&
808 STRINGP (XCAR (elt)) &&
809 STRINGP (XCDR (elt)) &&
810 fast_string_match (XCAR (elt), f->name) >= 0)
812 image = [EmacsImage allocInitFromFile: XCDR (elt)];
814 image = [[NSImage imageNamed:
815 [NSString stringWithUTF8String:
816 SDATA (XCDR (elt))]] retain];
822 image = [[[NSWorkspace sharedWorkspace] iconForFileType: @"text"] retain];
826 [f->output_data.ns->miniimage release];
827 f->output_data.ns->miniimage = image;
828 [view setMiniwindowImage: setMini];
835 x_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
837 EmacsView *view = FRAME_NS_VIEW (f);
841 NSTRACE (x_set_icon_type);
843 if (!NILP (arg) && SYMBOLP (arg))
845 arg =build_string (SDATA (SYMBOL_NAME (arg)));
846 store_frame_param (f, Qicon_type, arg);
849 /* do it the implicit way */
852 ns_implicitly_set_icon_type (f);
858 image = [EmacsImage allocInitFromFile: arg];
860 image =[NSImage imageNamed: [NSString stringWithUTF8String:
865 image = [NSImage imageNamed: @"text"];
869 f->output_data.ns->miniimage = image;
870 [view setMiniwindowImage: setMini];
874 /* Xism; we stub out (we do implement this in ns-win.el) */
876 XParseGeometry (char *string, int *x, int *y,
877 unsigned int *width, unsigned int *height)
879 message1 ("Warning: XParseGeometry not supported under NS.\n");
884 /* TODO: move to nsterm? */
886 ns_lisp_to_cursor_type (Lisp_Object arg)
889 if (XTYPE (arg) == Lisp_String)
891 else if (XTYPE (arg) == Lisp_Symbol)
892 str = SDATA (SYMBOL_NAME (arg));
894 if (!strcmp (str, "box")) return FILLED_BOX_CURSOR;
895 if (!strcmp (str, "hollow")) return HOLLOW_BOX_CURSOR;
896 if (!strcmp (str, "hbar")) return HBAR_CURSOR;
897 if (!strcmp (str, "bar")) return BAR_CURSOR;
898 if (!strcmp (str, "no")) return NO_CURSOR;
904 ns_cursor_type_to_lisp (int arg)
908 case FILLED_BOX_CURSOR: return Qbox;
909 case HOLLOW_BOX_CURSOR: return intern ("hollow");
910 case HBAR_CURSOR: return intern ("hbar");
911 case BAR_CURSOR: return intern ("bar");
913 default: return intern ("no");
917 /* This is the same as the xfns.c definition. */
919 x_set_cursor_type (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
921 set_frame_cursor_types (f, arg);
923 /* Make sure the cursor gets redrawn. */
924 cursor_type_changed = 1;
928 /* called to set mouse pointer color, but all other terms use it to
929 initialize pointer types (and don't set the color ;) */
931 x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
933 /* don't think we can do this on Nextstep */
938 #define Xstr(x) Str(x)
941 ns_appkit_version_str (void)
945 #ifdef NS_IMPL_GNUSTEP
946 sprintf(tmp, "gnustep-gui-%s", Xstr(GNUSTEP_GUI_VERSION));
947 #elif defined(NS_IMPL_COCOA)
948 sprintf(tmp, "apple-appkit-%.2f", NSAppKitVersionNumber);
952 return build_string (tmp);
956 /* This is for use by x-server-version and collapses all version info we
957 have into a single int. For a better picture of the implementation
958 running, use ns_appkit_version_str.*/
960 ns_appkit_version_int (void)
962 #ifdef NS_IMPL_GNUSTEP
963 return GNUSTEP_GUI_MAJOR_VERSION * 100 + GNUSTEP_GUI_MINOR_VERSION;
964 #elif defined(NS_IMPL_COCOA)
965 return (int)NSAppKitVersionNumber;
972 x_icon (struct frame *f, Lisp_Object parms)
973 /* --------------------------------------------------------------------------
974 Strangely-named function to set icon position parameters in frame.
975 This is irrelevant under OS X, but might be needed under GNUstep,
976 depending on the window manager used. Note, this is not a standard
977 frame parameter-setter; it is called directly from x-create-frame.
978 -------------------------------------------------------------------------- */
980 Lisp_Object icon_x, icon_y;
981 struct ns_display_info *dpyinfo = check_ns_display_info (Qnil);
983 f->output_data.ns->icon_top = Qnil;
984 f->output_data.ns->icon_left = Qnil;
986 /* Set the position of the icon. */
987 icon_x = x_get_arg (dpyinfo, parms, Qicon_left, 0, 0, RES_TYPE_NUMBER);
988 icon_y = x_get_arg (dpyinfo, parms, Qicon_top, 0, 0, RES_TYPE_NUMBER);
989 if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound))
991 CHECK_NUMBER (icon_x);
992 CHECK_NUMBER (icon_y);
993 f->output_data.ns->icon_top = icon_y;
994 f->output_data.ns->icon_left = icon_x;
996 else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
997 error ("Both left and top icon corners of icon must be specified");
1001 /* Note: see frame.c for template, also where generic functions are impl */
1002 frame_parm_handler ns_frame_parm_handlers[] =
1004 x_set_autoraise, /* generic OK */
1005 x_set_autolower, /* generic OK */
1006 x_set_background_color,
1007 0, /* x_set_border_color, may be impossible under Nextstep */
1008 0, /* x_set_border_width, may be impossible under Nextstep */
1011 x_set_font, /* generic OK */
1012 x_set_foreground_color,
1015 x_set_internal_border_width, /* generic OK */
1016 x_set_menu_bar_lines,
1018 x_explicitly_set_name,
1019 x_set_scroll_bar_width, /* generic OK */
1021 x_set_unsplittable, /* generic OK */
1022 x_set_vertical_scroll_bars, /* generic OK */
1023 x_set_visibility, /* generic OK */
1024 x_set_tool_bar_lines,
1025 0, /* x_set_scroll_bar_foreground, will ignore (not possible on NS) */
1026 0, /* x_set_scroll_bar_background, will ignore (not possible on NS) */
1027 x_set_screen_gamma, /* generic OK */
1028 x_set_line_spacing, /* generic OK, sets f->extra_line_spacing to int */
1029 x_set_fringe_width, /* generic OK */
1030 x_set_fringe_width, /* generic OK */
1031 0, /* x_set_wait_for_wm, will ignore */
1032 0, /* x_set_fullscreen will ignore */
1033 x_set_font_backend, /* generic OK */
1035 0, /* x_set_sticky */
1036 0, /* x_set_tool_bar_position */
1041 /* ==========================================================================
1045 ========================================================================== */
1047 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
1049 doc: /* Make a new Nextstep window, called a \"frame\" in Emacs terms.
1050 Return an Emacs frame object.
1051 PARMS is an alist of frame parameters.
1052 If the parameters specify that the frame should not have a minibuffer,
1053 and do not specify a specific minibuffer window to use,
1054 then `default-minibuffer-frame' must be a frame whose minibuffer can
1055 be shared by the new frame. */)
1058 static int desc_ctr = 1;
1060 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1061 Lisp_Object frame, tem;
1063 int minibuffer_only = 0;
1064 int count = specpdl_ptr - specpdl;
1065 Lisp_Object display;
1066 struct ns_display_info *dpyinfo = NULL;
1069 Lisp_Object tfont, tfontsize;
1070 int window_prompting = 0;
1075 /* Seems a little strange, but other terms do it. Perhaps the code below
1076 is modifying something? */
1077 parms = Fcopy_alist (parms);
1079 display = x_get_arg (dpyinfo, parms, Qterminal, 0, 0, RES_TYPE_STRING);
1080 if (EQ (display, Qunbound))
1082 dpyinfo = check_ns_display_info (display);
1084 if (!dpyinfo->terminal->name)
1085 error ("Terminal is not live, can't create new frames on it");
1087 kb = dpyinfo->terminal->kboard;
1089 name = x_get_arg (dpyinfo, parms, Qname, 0, 0, RES_TYPE_STRING);
1091 && ! EQ (name, Qunbound)
1093 error ("Invalid frame name--not a string or nil");
1096 Vx_resource_name = name;
1098 Vx_resource_name = Vinvocation_name;
1100 parent = x_get_arg (dpyinfo, parms, Qparent_id, 0, 0, RES_TYPE_NUMBER);
1101 if (EQ (parent, Qunbound))
1103 if (! NILP (parent))
1104 CHECK_NUMBER (parent);
1107 GCPRO4 (parms, parent, name, frame);
1109 tem = x_get_arg (dpyinfo, parms, Qminibuffer, "minibuffer", "Minibuffer",
1111 if (EQ (tem, Qnone) || NILP (tem))
1113 f = make_frame_without_minibuffer (Qnil, kb, display);
1115 else if (EQ (tem, Qonly))
1117 f = make_minibuffer_frame ();
1118 minibuffer_only = 1;
1120 else if (WINDOWP (tem))
1122 f = make_frame_without_minibuffer (tem, kb, display);
1129 /* Set the name; the functions to which we pass f expect the name to
1131 if (EQ (name, Qunbound) || NILP (name) || (XTYPE (name) != Lisp_String))
1133 f->name = build_string ([ns_app_name UTF8String]);
1134 f->explicit_name =0;
1139 f->explicit_name = 1;
1140 specbind (Qx_resource_name, name);
1143 XSETFRAME (frame, f);
1144 FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
1146 f->terminal = dpyinfo->terminal;
1147 f->terminal->reference_count++;
1149 f->output_method = output_ns;
1150 f->output_data.ns = (struct ns_output *)xmalloc (sizeof *(f->output_data.ns));
1151 memset (f->output_data.ns, 0, sizeof (*(f->output_data.ns)));
1153 FRAME_FONTSET (f) = -1;
1155 /* record_unwind_protect (unwind_create_frame, frame); safety; maybe later? */
1157 f->icon_name = x_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title",
1159 if (! STRINGP (f->icon_name))
1160 f->icon_name = Qnil;
1162 FRAME_NS_DISPLAY_INFO (f) = dpyinfo;
1164 f->output_data.ns->window_desc = desc_ctr++;
1167 f->output_data.ns->parent_desc = (Window) XFASTINT (parent);
1168 f->output_data.ns->explicit_parent = 1;
1172 f->output_data.ns->parent_desc = FRAME_NS_DISPLAY_INFO (f)->root_window;
1173 f->output_data.ns->explicit_parent = 0;
1176 f->resx = dpyinfo->resx;
1177 f->resy = dpyinfo->resy;
1180 register_font_driver (&nsfont_driver, f);
1181 x_default_parameter (f, parms, Qfont_backend, Qnil,
1182 "fontBackend", "FontBackend", RES_TYPE_STRING);
1185 /* use for default font name */
1186 id font = [NSFont userFixedPitchFontOfSize: -1.0]; /* default */
1187 tfontsize = x_default_parameter (f, parms, Qfontsize,
1188 make_number (0 /*(int)[font pointSize]*/),
1189 "fontSize", "FontSize", RES_TYPE_NUMBER);
1190 tfont = x_default_parameter (f, parms, Qfont,
1191 build_string ([[font fontName] UTF8String]),
1192 "font", "Font", RES_TYPE_STRING);
1196 x_default_parameter (f, parms, Qborder_width, make_number (0),
1197 "borderwidth", "BorderWidth", RES_TYPE_NUMBER);
1198 x_default_parameter (f, parms, Qinternal_border_width, make_number (2),
1199 "internalBorderWidth", "InternalBorderWidth",
1202 /* default scrollbars on right on Mac */
1205 #ifdef NS_IMPL_GNUSTEP
1210 x_default_parameter (f, parms, Qvertical_scroll_bars, spos,
1211 "verticalScrollBars", "VerticalScrollBars",
1214 x_default_parameter (f, parms, Qforeground_color, build_string ("Black"),
1215 "foreground", "Foreground", RES_TYPE_STRING);
1216 x_default_parameter (f, parms, Qbackground_color, build_string ("White"),
1217 "background", "Background", RES_TYPE_STRING);
1218 /* FIXME: not suppported yet in Nextstep */
1219 x_default_parameter (f, parms, Qline_spacing, Qnil,
1220 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER);
1221 x_default_parameter (f, parms, Qleft_fringe, Qnil,
1222 "leftFringe", "LeftFringe", RES_TYPE_NUMBER);
1223 x_default_parameter (f, parms, Qright_fringe, Qnil,
1224 "rightFringe", "RightFringe", RES_TYPE_NUMBER);
1227 init_frame_faces (f);
1229 /* The X resources controlling the menu-bar and tool-bar are
1230 processed specially at startup, and reflected in the mode
1231 variables; ignore them here. */
1232 x_default_parameter (f, parms, Qmenu_bar_lines,
1233 NILP (Vmenu_bar_mode)
1234 ? make_number (0) : make_number (1),
1235 NULL, NULL, RES_TYPE_NUMBER);
1236 x_default_parameter (f, parms, Qtool_bar_lines,
1237 NILP (Vtool_bar_mode)
1238 ? make_number (0) : make_number (1),
1239 NULL, NULL, RES_TYPE_NUMBER);
1241 x_default_parameter (f, parms, Qbuffer_predicate, Qnil, "bufferPredicate",
1242 "BufferPredicate", RES_TYPE_SYMBOL);
1243 x_default_parameter (f, parms, Qtitle, Qnil, "title", "Title",
1246 /* TODO: other terms seem to get away w/o this complexity.. */
1247 if (NILP (Fassq (Qwidth, parms)))
1250 = x_get_arg (dpyinfo, parms, Qwidth, "width", "Width",
1252 if (! EQ (value, Qunbound))
1253 parms = Fcons (Fcons (Qwidth, value), parms);
1255 if (NILP (Fassq (Qheight, parms)))
1258 = x_get_arg (dpyinfo, parms, Qheight, "height", "Height",
1260 if (! EQ (value, Qunbound))
1261 parms = Fcons (Fcons (Qheight, value), parms);
1263 if (NILP (Fassq (Qleft, parms)))
1266 = x_get_arg (dpyinfo, parms, Qleft, "left", "Left", RES_TYPE_NUMBER);
1267 if (! EQ (value, Qunbound))
1268 parms = Fcons (Fcons (Qleft, value), parms);
1270 if (NILP (Fassq (Qtop, parms)))
1273 = x_get_arg (dpyinfo, parms, Qtop, "top", "Top", RES_TYPE_NUMBER);
1274 if (! EQ (value, Qunbound))
1275 parms = Fcons (Fcons (Qtop, value), parms);
1278 window_prompting = x_figure_window_size (f, parms, 1);
1280 tem = x_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
1281 f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !EQ (tem, Qnil));
1283 /* NOTE: on other terms, this is done in set_mouse_color, however this
1284 was not getting called under Nextstep */
1285 f->output_data.ns->text_cursor = [NSCursor IBeamCursor];
1286 f->output_data.ns->nontext_cursor = [NSCursor arrowCursor];
1287 f->output_data.ns->modeline_cursor = [NSCursor pointingHandCursor];
1288 f->output_data.ns->hand_cursor = [NSCursor pointingHandCursor];
1289 f->output_data.ns->hourglass_cursor = [NSCursor disappearingItemCursor];
1290 f->output_data.ns->horizontal_drag_cursor = [NSCursor resizeLeftRightCursor];
1291 FRAME_NS_DISPLAY_INFO (f)->vertical_scroll_bar_cursor
1292 = [NSCursor arrowCursor];
1293 f->output_data.ns->current_pointer = f->output_data.ns->text_cursor;
1295 [[EmacsView alloc] initFrameFromEmacs: f];
1299 /* It is now ok to make the frame official even if we get an error below.
1300 The frame needs to be on Vframe_list or making it visible won't work. */
1301 Vframe_list = Fcons (frame, Vframe_list);
1302 /*FRAME_NS_DISPLAY_INFO (f)->reference_count++; */
1304 x_default_parameter (f, parms, Qicon_type, Qnil, "bitmapIcon", "BitmapIcon",
1306 x_default_parameter (f, parms, Qauto_raise, Qnil, "autoRaise", "AutoRaiseLower",
1308 x_default_parameter (f, parms, Qauto_lower, Qnil, "autoLower", "AutoLower",
1310 x_default_parameter (f, parms, Qcursor_type, Qbox, "cursorType", "CursorType",
1312 x_default_parameter (f, parms, Qscroll_bar_width, Qnil, "scrollBarWidth",
1313 "ScrollBarWidth", RES_TYPE_NUMBER);
1314 x_default_parameter (f, parms, Qalpha, Qnil, "alpha", "Alpha",
1317 width = FRAME_COLS (f);
1318 height = FRAME_LINES (f);
1320 SET_FRAME_COLS (f, 0);
1321 FRAME_LINES (f) = 0;
1322 change_frame_size (f, height, width, 1, 0, 0);
1324 if (! f->output_data.ns->explicit_parent)
1326 tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_SYMBOL);
1327 if (EQ (tem, Qunbound))
1329 x_set_visibility (f, tem, Qnil);
1330 if (EQ (tem, Qicon))
1331 x_iconify_frame (f);
1332 else if (! NILP (tem))
1334 x_make_frame_visible (f);
1335 f->async_visible = 1;
1336 [[FRAME_NS_VIEW (f) window] makeKeyWindow];
1339 f->async_visible = 0;
1342 if (FRAME_HAS_MINIBUF_P (f)
1343 && (!FRAMEP (kb->Vdefault_minibuffer_frame)
1344 || !FRAME_LIVE_P (XFRAME (kb->Vdefault_minibuffer_frame))))
1345 kb->Vdefault_minibuffer_frame = frame;
1347 /* All remaining specified parameters, which have not been "used"
1348 by x_get_arg and friends, now go in the misc. alist of the frame. */
1349 for (tem = parms; CONSP (tem); tem = XCDR (tem))
1350 if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
1351 f->param_alist = Fcons (XCAR (tem), f->param_alist);
1354 Vwindow_list = Qnil;
1356 return unbind_to (count, frame);
1360 DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
1361 doc: /* Set the input focus to FRAME.
1362 FRAME nil means use the selected frame. */)
1365 struct frame *f = check_ns_frame (frame);
1366 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
1368 if (dpyinfo->x_focus_frame != f)
1370 EmacsView *view = FRAME_NS_VIEW (f);
1372 [NSApp activateIgnoringOtherApps: YES];
1373 [[view window] makeKeyAndOrderFront: view];
1381 DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel,
1383 doc: /* Pop up the font panel. */)
1390 fm = [NSFontManager sharedFontManager];
1392 f = SELECTED_FRAME ();
1395 CHECK_FRAME (frame);
1399 [fm setSelectedFont: ((struct nsfont_info *)f->output_data.ns->font)->nsfont
1401 [fm orderFrontFontPanel: NSApp];
1406 DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel,
1408 doc: /* Pop up the color panel. */)
1415 f = SELECTED_FRAME ();
1418 CHECK_FRAME (frame);
1422 [NSApp orderFrontColorPanel: NSApp];
1427 DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 4, 0,
1428 doc: /* Use a graphical panel to read a file name, using prompt PROMPT.
1429 Optional arg DIR, if non-nil, supplies a default directory.
1430 Optional arg ISLOAD, if non-nil, means read a file name for saving.
1431 Optional arg INIT, if non-nil, provides a default file name to use. */)
1432 (Lisp_Object prompt, Lisp_Object dir, Lisp_Object isLoad, Lisp_Object init)
1434 static id fileDelegate = nil;
1439 NSString *promptS = NILP (prompt) || !STRINGP (prompt) ? nil :
1440 [NSString stringWithUTF8String: SDATA (prompt)];
1441 NSString *dirS = NILP (dir) || !STRINGP (dir) ?
1442 [NSString stringWithUTF8String: SDATA (current_buffer->directory)] :
1443 [NSString stringWithUTF8String: SDATA (dir)];
1444 NSString *initS = NILP (init) || !STRINGP (init) ? nil :
1445 [NSString stringWithUTF8String: SDATA (init)];
1449 if (fileDelegate == nil)
1450 fileDelegate = [EmacsFileDelegate new];
1452 [NSCursor setHiddenUntilMouseMoves: NO];
1454 if ([dirS characterAtIndex: 0] == '~')
1455 dirS = [dirS stringByExpandingTildeInPath];
1457 panel = NILP (isLoad) ?
1458 (id)[EmacsSavePanel savePanel] : (id)[EmacsOpenPanel openPanel];
1460 [panel setTitle: promptS];
1462 /* Puma (10.1) does not have */
1463 if ([panel respondsToSelector: @selector (setAllowsOtherFileTypes:)])
1464 [panel setAllowsOtherFileTypes: YES];
1466 [panel setTreatsFilePackagesAsDirectories: YES];
1467 [panel setDelegate: fileDelegate];
1473 ret = [panel runModalForDirectory: dirS file: initS];
1477 [panel setCanChooseDirectories: YES];
1478 ret = [panel runModalForDirectory: dirS file: initS types: nil];
1481 ret = (ret == NSOKButton) || panelOK;
1484 fname = build_string ([[panel filename] UTF8String]);
1486 [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
1489 return ret ? fname : Qnil;
1493 DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0,
1494 doc: /* Return the value of the property NAME of OWNER from the defaults database.
1495 If OWNER is nil, Emacs is assumed. */)
1496 (Lisp_Object owner, Lisp_Object name)
1502 owner = build_string([ns_app_name UTF8String]);
1503 CHECK_STRING (name);
1504 /*fprintf (stderr, "ns-get-resource checking resource '%s'\n", SDATA (name)); */
1506 value =[[[NSUserDefaults standardUserDefaults]
1507 objectForKey: [NSString stringWithUTF8String: SDATA (name)]]
1511 return build_string (value);
1516 DEFUN ("ns-set-resource", Fns_set_resource, Sns_set_resource, 3, 3, 0,
1517 doc: /* Set property NAME of OWNER to VALUE, from the defaults database.
1518 If OWNER is nil, Emacs is assumed.
1519 If VALUE is nil, the default is removed. */)
1520 (Lisp_Object owner, Lisp_Object name, Lisp_Object value)
1524 owner = build_string ([ns_app_name UTF8String]);
1525 CHECK_STRING (name);
1528 [[NSUserDefaults standardUserDefaults] removeObjectForKey:
1529 [NSString stringWithUTF8String: SDATA (name)]];
1533 CHECK_STRING (value);
1534 [[NSUserDefaults standardUserDefaults] setObject:
1535 [NSString stringWithUTF8String: SDATA (value)]
1536 forKey: [NSString stringWithUTF8String:
1544 DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
1545 Sx_server_max_request_size,
1547 doc: /* This function is a no-op. It is only present for completeness. */)
1548 (Lisp_Object display)
1551 /* This function has no real equivalent under NeXTstep. Return nil to
1557 DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
1558 doc: /* Return the vendor ID string of Nextstep display server DISPLAY.
1559 DISPLAY should be either a frame or a display name (a string).
1560 If omitted or nil, the selected frame's display is used. */)
1561 (Lisp_Object display)
1563 #ifdef NS_IMPL_GNUSTEP
1564 return build_string ("GNU");
1566 return build_string ("Apple");
1571 DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
1572 doc: /* Return the version numbers of the server of DISPLAY.
1573 The value is a list of three integers: the major and minor
1574 version numbers of the X Protocol in use, and the distributor-specific
1575 release number. See also the function `x-server-vendor'.
1577 The optional argument DISPLAY specifies which display to ask about.
1578 DISPLAY should be either a frame or a display name (a string).
1579 If omitted or nil, that stands for the selected frame's display. */)
1580 (Lisp_Object display)
1582 /*NOTE: it is unclear what would best correspond with "protocol";
1583 we return 10.3, meaning Panther, since this is roughly the
1584 level that GNUstep's APIs correspond to.
1585 The last number is where we distinguish between the Apple
1586 and GNUstep implementations ("distributor-specific release
1587 number") and give int'ized versions of major.minor. */
1588 return Fcons (make_number (10),
1589 Fcons (make_number (3),
1590 Fcons (make_number (ns_appkit_version_int()), Qnil)));
1594 DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
1595 doc: /* Return the number of screens on Nextstep display server DISPLAY.
1596 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1597 If omitted or nil, the selected frame's display is used. */)
1598 (Lisp_Object display)
1603 num = [[NSScreen screens] count];
1605 return (num != 0) ? make_number (num) : Qnil;
1609 DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height,
1611 doc: /* Return the height of Nextstep display server DISPLAY, in millimeters.
1612 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1613 If omitted or nil, the selected frame's display is used. */)
1614 (Lisp_Object display)
1617 return make_number ((int)
1618 ([ns_get_screen (display) frame].size.height/(92.0/25.4)));
1622 DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width,
1624 doc: /* Return the width of Nextstep display server DISPLAY, in millimeters.
1625 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1626 If omitted or nil, the selected frame's display is used. */)
1627 (Lisp_Object display)
1630 return make_number ((int)
1631 ([ns_get_screen (display) frame].size.width/(92.0/25.4)));
1635 DEFUN ("x-display-backing-store", Fx_display_backing_store,
1636 Sx_display_backing_store, 0, 1, 0,
1637 doc: /* Return whether the Nexstep display DISPLAY supports backing store.
1638 The value may be `buffered', `retained', or `non-retained'.
1639 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1640 If omitted or nil, the selected frame's display is used. */)
1641 (Lisp_Object display)
1644 switch ([ns_get_window (display) backingType])
1646 case NSBackingStoreBuffered:
1647 return intern ("buffered");
1648 case NSBackingStoreRetained:
1649 return intern ("retained");
1650 case NSBackingStoreNonretained:
1651 return intern ("non-retained");
1653 error ("Strange value for backingType parameter of frame");
1655 return Qnil; /* not reached, shut compiler up */
1659 DEFUN ("x-display-visual-class", Fx_display_visual_class,
1660 Sx_display_visual_class, 0, 1, 0,
1661 doc: /* Return the visual class of the Nextstep display server DISPLAY.
1662 The value is one of the symbols `static-gray', `gray-scale',
1663 `static-color', `pseudo-color', `true-color', or `direct-color'.
1664 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1665 If omitted or nil, the selected frame's display is used. */)
1666 (Lisp_Object display)
1668 NSWindowDepth depth;
1670 depth = [ns_get_screen (display) depth];
1672 if ( depth == NSBestDepth (NSCalibratedWhiteColorSpace, 2, 2, YES, NULL))
1673 return intern ("static-gray");
1674 else if (depth == NSBestDepth (NSCalibratedWhiteColorSpace, 8, 8, YES, NULL))
1675 return intern ("gray-scale");
1676 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 8, 8, YES, NULL))
1677 return intern ("pseudo-color");
1678 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 4, 12, NO, NULL))
1679 return intern ("true-color");
1680 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 8, 24, NO, NULL))
1681 return intern ("direct-color");
1683 /* color mgmt as far as we do it is really handled by Nextstep itself anyway */
1684 return intern ("direct-color");
1688 DEFUN ("x-display-save-under", Fx_display_save_under,
1689 Sx_display_save_under, 0, 1, 0,
1690 doc: /* Return t if DISPLAY supports the save-under feature.
1691 The optional argument DISPLAY specifies which display to ask about.
1692 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1693 If omitted or nil, the selected frame's display is used. */)
1694 (Lisp_Object display)
1697 switch ([ns_get_window (display) backingType])
1699 case NSBackingStoreBuffered:
1702 case NSBackingStoreRetained:
1703 case NSBackingStoreNonretained:
1707 error ("Strange value for backingType parameter of frame");
1709 return Qnil; /* not reached, shut compiler up */
1713 DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
1715 doc: /* Open a connection to a display server.
1716 DISPLAY is the name of the display to connect to.
1717 Optional second arg XRM-STRING is a string of resources in xrdb format.
1718 If the optional third arg MUST-SUCCEED is non-nil,
1719 terminate Emacs if we can't open the connection.
1720 \(In the Nextstep version, the last two arguments are currently ignored.) */)
1721 (Lisp_Object display, Lisp_Object resource_string, Lisp_Object must_succeed)
1723 struct ns_display_info *dpyinfo;
1725 CHECK_STRING (display);
1727 nxatoms_of_nsselect ();
1728 dpyinfo = ns_term_init (display);
1731 if (!NILP (must_succeed))
1732 fatal ("OpenStep on %s not responding.\n",
1735 error ("OpenStep on %s not responding.\n",
1739 /* Register our external input/output types, used for determining
1740 applicable services and also drag/drop eligibility. */
1741 ns_send_types = [[NSArray arrayWithObject: NSStringPboardType] retain];
1742 ns_return_types = [[NSArray arrayWithObject: NSStringPboardType] retain];
1743 ns_drag_types = [[NSArray arrayWithObjects:
1745 NSTabularTextPboardType,
1746 NSFilenamesPboardType,
1749 NSFontPboardType, nil] retain];
1755 DEFUN ("x-close-connection", Fx_close_connection, Sx_close_connection,
1757 doc: /* Close the connection to the current Nextstep display server.
1758 The argument DISPLAY is currently ignored. */)
1759 (Lisp_Object display)
1762 /*ns_delete_terminal (dpyinfo->terminal); */
1763 [NSApp terminate: NSApp];
1768 DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
1769 doc: /* Return the list of display names that Emacs has connections to. */)
1772 Lisp_Object tail, result;
1775 for (tail = ns_display_name_list; CONSP (tail); tail = XCDR (tail))
1776 result = Fcons (XCAR (XCAR (tail)), result);
1782 DEFUN ("ns-hide-others", Fns_hide_others, Sns_hide_others,
1784 doc: /* Hides all applications other than Emacs. */)
1788 [NSApp hideOtherApplications: NSApp];
1792 DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs,
1794 doc: /* If ON is non-nil, the entire Emacs application is hidden.
1795 Otherwise if Emacs is hidden, it is unhidden.
1796 If ON is equal to `activate', Emacs is unhidden and becomes
1797 the active application. */)
1801 if (EQ (on, intern ("activate")))
1803 [NSApp unhide: NSApp];
1804 [NSApp activateIgnoringOtherApps: YES];
1807 [NSApp unhide: NSApp];
1809 [NSApp hide: NSApp];
1814 DEFUN ("ns-emacs-info-panel", Fns_emacs_info_panel, Sns_emacs_info_panel,
1816 doc: /* Shows the 'Info' or 'About' panel for Emacs. */)
1820 [NSApp orderFrontStandardAboutPanel: nil];
1825 DEFUN ("ns-font-name", Fns_font_name, Sns_font_name, 1, 1, 0,
1826 doc: /* Determine font postscript or family name for font NAME.
1827 NAME should be a string containing either the font name or an XLFD
1828 font descriptor. If string contains `fontset' and not
1829 `fontset-startup', it is left alone. */)
1833 CHECK_STRING (name);
1838 if (strstr (nm, "fontset") && !strstr (nm, "fontset-startup"))
1841 return build_string (ns_xlfd_to_fontname (SDATA (name)));
1845 DEFUN ("ns-list-colors", Fns_list_colors, Sns_list_colors, 0, 1, 0,
1846 doc: /* Return a list of all available colors.
1847 The optional argument FRAME is currently ignored. */)
1850 Lisp_Object list = Qnil;
1851 NSEnumerator *colorlists;
1856 CHECK_FRAME (frame);
1857 if (! FRAME_NS_P (XFRAME (frame)))
1858 error ("non-Nextstep frame used in `ns-list-colors'");
1863 colorlists = [[NSColorList availableColorLists] objectEnumerator];
1864 while (clist = [colorlists nextObject])
1866 if ([[clist name] length] < 7 ||
1867 [[clist name] rangeOfString: @"PANTONE"].location == 0)
1869 NSEnumerator *cnames = [[clist allKeys] reverseObjectEnumerator];
1871 while (cname = [cnames nextObject])
1872 list = Fcons (build_string ([cname UTF8String]), list);
1873 /* for (i = [[clist allKeys] count] - 1; i >= 0; i--)
1874 list = Fcons (build_string ([[[clist allKeys] objectAtIndex: i]
1875 UTF8String]), list); */
1885 DEFUN ("ns-list-services", Fns_list_services, Sns_list_services, 0, 0, 0,
1886 doc: /* List available Nextstep services by querying NSApp. */)
1889 Lisp_Object ret = Qnil;
1894 svcs = [[NSMenu alloc] initWithTitle: @"Services"];
1895 [NSApp setServicesMenu: svcs]; /* this and next rebuild on <10.4 */
1896 [NSApp registerServicesMenuSendTypes: ns_send_types
1897 returnTypes: ns_return_types];
1899 /* On Tiger, services menu updating was made lazier (waits for user to
1900 actually click on the menu), so we have to force things along: */
1901 #ifdef NS_IMPL_COCOA
1902 if (NSAppKitVersionNumber >= 744.0)
1904 delegate = [svcs delegate];
1905 if (delegate != nil)
1907 if ([delegate respondsToSelector: @selector (menuNeedsUpdate:)])
1908 [delegate menuNeedsUpdate: svcs];
1909 if ([delegate respondsToSelector:
1910 @selector (menu:updateItem:atIndex:shouldCancel:)])
1912 int i, len = [delegate numberOfItemsInMenu: svcs];
1913 for (i =0; i<len; i++)
1914 [svcs addItemWithTitle: @"" action: NULL keyEquivalent: @""];
1915 for (i =0; i<len; i++)
1916 if (![delegate menu: svcs
1917 updateItem: (NSMenuItem *)[svcs itemAtIndex: i]
1918 atIndex: i shouldCancel: NO])
1925 [svcs setAutoenablesItems: NO];
1926 #ifdef NS_IMPL_COCOA
1927 [svcs update]; /* on OS X, converts from '/' structure */
1930 ret = interpret_services_menu (svcs, Qnil, ret);
1935 DEFUN ("ns-perform-service", Fns_perform_service, Sns_perform_service,
1937 doc: /* Perform Nextstep SERVICE on SEND.
1938 SEND should be either a string or nil.
1939 The return value is the result of the service, as string, or nil if
1940 there was no result. */)
1941 (Lisp_Object service, Lisp_Object send)
1948 CHECK_STRING (service);
1951 utfStr = SDATA (service);
1952 svcName = [NSString stringWithUTF8String: utfStr];
1954 pb =[NSPasteboard pasteboardWithUniqueName];
1955 ns_string_to_pasteboard (pb, send);
1957 if (NSPerformService (svcName, pb) == NO)
1958 Fsignal (Qquit, Fcons (build_string ("service not available"), Qnil));
1960 if ([[pb types] count] == 0)
1961 return build_string ("");
1962 return ns_string_from_pasteboard (pb);
1966 DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc,
1967 Sns_convert_utf8_nfd_to_nfc, 1, 1, 0,
1968 doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */)
1971 /* TODO: If GNUstep ever implements precomposedStringWithCanonicalMapping,
1976 utfStr = [NSString stringWithUTF8String: SDATA (str)];
1977 if (![utfStr respondsToSelector:
1978 @selector (precomposedStringWithCanonicalMapping)])
1981 ("Warning: ns-convert-utf8-nfd-to-nfc unsupported under GNUstep.\n");
1985 utfStr = [utfStr precomposedStringWithCanonicalMapping];
1986 return build_string ([utfStr UTF8String]);
1990 #ifdef NS_IMPL_COCOA
1992 /* Compile and execute the AppleScript SCRIPT and return the error
1993 status as function value. A zero is returned if compilation and
1994 execution is successful, in which case *RESULT is set to a Lisp
1995 string or a number containing the resulting script value. Otherwise,
1998 ns_do_applescript (Lisp_Object script, Lisp_Object *result)
2000 NSAppleEventDescriptor *desc;
2001 NSDictionary* errorDict;
2002 NSAppleEventDescriptor* returnDescriptor = NULL;
2004 NSAppleScript* scriptObject =
2005 [[NSAppleScript alloc] initWithSource:
2006 [NSString stringWithUTF8String: SDATA (script)]];
2008 returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
2009 [scriptObject release];
2013 if (returnDescriptor != NULL)
2015 // successful execution
2016 if (kAENullEvent != [returnDescriptor descriptorType])
2019 // script returned an AppleScript result
2020 if ((typeUnicodeText == [returnDescriptor descriptorType]) ||
2021 #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
2022 (typeUTF16ExternalRepresentation
2023 == [returnDescriptor descriptorType]) ||
2025 (typeUTF8Text == [returnDescriptor descriptorType]) ||
2026 (typeCString == [returnDescriptor descriptorType]))
2028 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2030 *result = build_string([[desc stringValue] UTF8String]);
2034 /* use typeUTF16ExternalRepresentation? */
2035 // coerce the result to the appropriate ObjC type
2036 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2038 *result = make_number([desc int32Value]);
2044 // no script result, return error
2050 DEFUN ("ns-do-applescript", Fns_do_applescript, Sns_do_applescript, 1, 1, 0,
2051 doc: /* Execute AppleScript SCRIPT and return the result.
2052 If compilation and execution are successful, the resulting script value
2053 is returned as a string, a number or, in the case of other constructs, t.
2054 In case the execution fails, an error is signaled. */)
2055 (Lisp_Object script)
2060 CHECK_STRING (script);
2064 status = ns_do_applescript (script, &result);
2068 else if (!STRINGP (result))
2069 error ("AppleScript error %d", status);
2071 error ("%s", SDATA (result));
2077 /* ==========================================================================
2079 Miscellaneous functions not called through hooks
2081 ========================================================================== */
2084 /* called from image.c */
2086 check_x_frame (Lisp_Object frame)
2088 return check_ns_frame (frame);
2092 /* called from frame.c */
2093 struct ns_display_info *
2094 check_x_display_info (Lisp_Object frame)
2096 return check_ns_display_info (frame);
2101 x_set_scroll_bar_default_width (struct frame *f)
2103 int wid = FRAME_COLUMN_WIDTH (f);
2104 FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = NS_SCROLL_BAR_WIDTH_DEFAULT;
2105 FRAME_CONFIG_SCROLL_BAR_COLS (f) = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) +
2110 /* terms impl this instead of x-get-resource directly */
2112 x_get_string_resource (XrmDatabase rdb, char *name, char *class)
2114 /* remove appname prefix; TODO: allow for !="Emacs" */
2115 char *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0);
2119 if (inhibit_x_resources)
2120 /* --quick was passed, so this is a no-op. */
2123 res = [[[NSUserDefaults standardUserDefaults] objectForKey:
2124 [NSString stringWithUTF8String: toCheck]] UTF8String];
2125 return !res ? NULL :
2126 (!strncasecmp (res, "YES", 3) ? "true" :
2127 (!strncasecmp (res, "NO", 2) ? "false" : res));
2132 x_get_focus_frame (struct frame *frame)
2134 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame);
2135 Lisp_Object nsfocus;
2137 if (!dpyinfo->x_focus_frame)
2140 XSETFRAME (nsfocus, dpyinfo->x_focus_frame);
2146 x_pixel_width (struct frame *f)
2148 return FRAME_PIXEL_WIDTH (f);
2153 x_pixel_height (struct frame *f)
2155 return FRAME_PIXEL_HEIGHT (f);
2160 x_char_width (struct frame *f)
2162 return FRAME_COLUMN_WIDTH (f);
2167 x_char_height (struct frame *f)
2169 return FRAME_LINE_HEIGHT (f);
2174 x_screen_planes (struct frame *f)
2176 return FRAME_NS_DISPLAY_INFO (f)->n_planes;
2181 x_sync (struct frame *f)
2183 /* XXX Not implemented XXX */
2189 /* ==========================================================================
2191 Lisp definitions that, for whatever reason, we can't alias as 'ns-XXX'.
2193 ========================================================================== */
2196 DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
2197 doc: /* Internal function called by `color-defined-p', which see.
2198 \(Note that the Nextstep version of this function ignores FRAME.) */)
2199 (Lisp_Object color, Lisp_Object frame)
2203 return ns_lisp_to_color (color, &col) ? Qnil : Qt;
2207 DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
2208 doc: /* Internal function called by `color-values', which see. */)
2209 (Lisp_Object color, Lisp_Object frame)
2212 CGFloat red, green, blue, alpha;
2215 CHECK_STRING (color);
2217 if (ns_lisp_to_color (color, &col))
2220 [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace]
2221 getRed: &red green: &green blue: &blue alpha: &alpha];
2222 return list3 (make_number (lrint (red*65280)),
2223 make_number (lrint (green*65280)),
2224 make_number (lrint (blue*65280)));
2228 DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
2229 doc: /* Internal function called by `display-color-p', which see. */)
2230 (Lisp_Object display)
2232 NSWindowDepth depth;
2233 NSString *colorSpace;
2235 depth = [ns_get_screen (display) depth];
2236 colorSpace = NSColorSpaceFromDepth (depth);
2238 return [colorSpace isEqualToString: NSDeviceWhiteColorSpace]
2239 || [colorSpace isEqualToString: NSCalibratedWhiteColorSpace]
2244 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p,
2245 Sx_display_grayscale_p, 0, 1, 0,
2246 doc: /* Return t if the Nextstep display supports shades of gray.
2247 Note that color displays do support shades of gray.
2248 The optional argument DISPLAY specifies which display to ask about.
2249 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2250 If omitted or nil, that stands for the selected frame's display. */)
2251 (Lisp_Object display)
2253 NSWindowDepth depth;
2255 depth = [ns_get_screen (display) depth];
2257 return NSBitsPerPixelFromDepth (depth) > 1 ? Qt : Qnil;
2261 DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
2263 doc: /* Return the width in pixels of the Nextstep display DISPLAY.
2264 The optional argument DISPLAY specifies which display to ask about.
2265 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2266 If omitted or nil, that stands for the selected frame's display. */)
2267 (Lisp_Object display)
2270 return make_number ((int) [ns_get_screen (display) frame].size.width);
2274 DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
2275 Sx_display_pixel_height, 0, 1, 0,
2276 doc: /* Return the height in pixels of the Nextstep display DISPLAY.
2277 The optional argument DISPLAY specifies which display to ask about.
2278 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2279 If omitted or nil, that stands for the selected frame's display. */)
2280 (Lisp_Object display)
2283 return make_number ((int) [ns_get_screen (display) frame].size.height);
2287 DEFUN ("display-usable-bounds", Fns_display_usable_bounds,
2288 Sns_display_usable_bounds, 0, 1, 0,
2289 doc: /* Return the bounds of the usable part of the screen.
2290 The return value is a list of integers (LEFT TOP WIDTH HEIGHT), which
2291 are the boundaries of the usable part of the screen, excluding areas
2292 reserved for the Mac menu, dock, and so forth.
2294 The screen queried corresponds to DISPLAY, which should be either a
2295 frame, a display name (a string), or terminal ID. If omitted or nil,
2296 that stands for the selected frame's display. */)
2297 (Lisp_Object display)
2304 screen = ns_get_screen (display);
2308 vScreen = [screen visibleFrame];
2310 /* NS coordinate system is upside-down.
2311 Transform to screen-specific coordinates. */
2312 return list4 (make_number ((int) vScreen.origin.x),
2313 make_number ((int) [screen frame].size.height
2314 - vScreen.size.height - vScreen.origin.y),
2315 make_number ((int) vScreen.size.width),
2316 make_number ((int) vScreen.size.height));
2320 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
2322 doc: /* Return the number of bitplanes of the Nextstep display DISPLAY.
2323 The optional argument DISPLAY specifies which display to ask about.
2324 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2325 If omitted or nil, that stands for the selected frame's display. */)
2326 (Lisp_Object display)
2330 (NSBitsPerPixelFromDepth ([ns_get_screen (display) depth]));
2334 DEFUN ("x-display-color-cells", Fx_display_color_cells,
2335 Sx_display_color_cells, 0, 1, 0,
2336 doc: /* Returns the number of color cells of the Nextstep display DISPLAY.
2337 The optional argument DISPLAY specifies which display to ask about.
2338 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2339 If omitted or nil, that stands for the selected frame's display. */)
2340 (Lisp_Object display)
2342 struct ns_display_info *dpyinfo;
2345 dpyinfo = check_ns_display_info (display);
2346 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2347 return make_number (1 << min (dpyinfo->n_planes, 24));
2351 /* Unused dummy def needed for compatibility. */
2352 Lisp_Object tip_frame;
2354 /* TODO: move to xdisp or similar */
2356 compute_tip_xy (struct frame *f,
2365 Lisp_Object left, top;
2366 EmacsView *view = FRAME_NS_VIEW (f);
2369 /* Start with user-specified or mouse position. */
2370 left = Fcdr (Fassq (Qleft, parms));
2371 top = Fcdr (Fassq (Qtop, parms));
2373 if (!INTEGERP (left) || !INTEGERP (top))
2375 pt = last_mouse_motion_position;
2376 /* Convert to screen coordinates */
2377 pt = [view convertPoint: pt toView: nil];
2378 pt = [[view window] convertBaseToScreen: pt];
2382 /* Absolute coordinates. */
2384 pt.y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - XINT (top)
2388 /* Ensure in bounds. (Note, screen origin = lower left.) */
2389 if (INTEGERP (left))
2391 else if (pt.x + XINT (dx) <= 0)
2392 *root_x = 0; /* Can happen for negative dx */
2393 else if (pt.x + XINT (dx) + width
2394 <= x_display_pixel_width (FRAME_NS_DISPLAY_INFO (f)))
2395 /* It fits to the right of the pointer. */
2396 *root_x = pt.x + XINT (dx);
2397 else if (width + XINT (dx) <= pt.x)
2398 /* It fits to the left of the pointer. */
2399 *root_x = pt.x - width - XINT (dx);
2401 /* Put it left justified on the screen -- it ought to fit that way. */
2406 else if (pt.y - XINT (dy) - height >= 0)
2407 /* It fits below the pointer. */
2408 *root_y = pt.y - height - XINT (dy);
2409 else if (pt.y + XINT (dy) + height
2410 <= x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)))
2411 /* It fits above the pointer */
2412 *root_y = pt.y + XINT (dy);
2414 /* Put it on the top. */
2415 *root_y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - height;
2419 DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
2420 doc: /* Show STRING in a \"tooltip\" window on frame FRAME.
2421 A tooltip window is a small window displaying a string.
2423 This is an internal function; Lisp code should call `tooltip-show'.
2425 FRAME nil or omitted means use the selected frame.
2427 PARMS is an optional list of frame parameters which can be used to
2428 change the tooltip's appearance.
2430 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
2431 means use the default timeout of 5 seconds.
2433 If the list of frame parameters PARMS contains a `left' parameter,
2434 the tooltip is displayed at that x-position. Otherwise it is
2435 displayed at the mouse position, with offset DX added (default is 5 if
2436 DX isn't specified). Likewise for the y-position; if a `top' frame
2437 parameter is specified, it determines the y-position of the tooltip
2438 window, otherwise it is displayed at the mouse position, with offset
2439 DY added (default is -10).
2441 A tooltip's maximum size is specified by `x-max-tooltip-size'.
2442 Text larger than the specified size is clipped. */)
2443 (Lisp_Object string, Lisp_Object frame, Lisp_Object parms, Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy)
2446 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2447 int count = SPECPDL_INDEX ();
2452 specbind (Qinhibit_redisplay, Qt);
2454 GCPRO4 (string, parms, frame, timeout);
2456 CHECK_STRING (string);
2457 str = SDATA (string);
2458 f = check_x_frame (frame);
2460 timeout = make_number (5);
2462 CHECK_NATNUM (timeout);
2465 dx = make_number (5);
2470 dy = make_number (-10);
2475 if (ns_tooltip == nil)
2476 ns_tooltip = [[EmacsTooltip alloc] init];
2480 [ns_tooltip setText: str];
2481 size = [ns_tooltip frame].size;
2483 /* Move the tooltip window where the mouse pointer is. Resize and
2485 compute_tip_xy (f, parms, dx, dy, (int)size.width, (int)size.height,
2488 [ns_tooltip showAtX: root_x Y: root_y for: XINT (timeout)];
2492 return unbind_to (count, Qnil);
2496 DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
2497 doc: /* Hide the current tooltip window, if there is any.
2498 Value is t if tooltip was open, nil otherwise. */)
2501 if (ns_tooltip == nil || ![ns_tooltip isActive])
2508 /* ==========================================================================
2510 Class implementations
2512 ========================================================================== */
2515 @implementation EmacsSavePanel
2516 #ifdef NS_IMPL_COCOA
2517 /* --------------------------------------------------------------------------
2518 These are overridden to intercept on OS X: ending panel restarts NSApp
2519 event loop if it is stopped. Not sure if this is correct behavior,
2520 perhaps should check if running and if so send an appdefined.
2521 -------------------------------------------------------------------------- */
2522 - (void) ok: (id)sender
2528 - (void) cancel: (id)sender
2530 [super cancel: sender];
2537 @implementation EmacsOpenPanel
2538 #ifdef NS_IMPL_COCOA
2539 /* --------------------------------------------------------------------------
2540 These are overridden to intercept on OS X: ending panel restarts NSApp
2541 event loop if it is stopped. Not sure if this is correct behavior,
2542 perhaps should check if running and if so send an appdefined.
2543 -------------------------------------------------------------------------- */
2544 - (void) ok: (id)sender
2550 - (void) cancel: (id)sender
2552 [super cancel: sender];
2559 @implementation EmacsFileDelegate
2560 /* --------------------------------------------------------------------------
2561 Delegate methods for Open/Save panels
2562 -------------------------------------------------------------------------- */
2563 - (BOOL)panel: (id)sender isValidFilename: (NSString *)filename
2567 - (BOOL)panel: (id)sender shouldShowFilename: (NSString *)filename
2571 - (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
2572 confirmed: (BOOL)okFlag
2581 /* ==========================================================================
2583 Lisp interface declaration
2585 ========================================================================== */
2589 syms_of_nsfns (void)
2593 Qfontsize = intern_c_string ("fontsize");
2594 staticpro (&Qfontsize);
2596 DEFVAR_LISP ("ns-icon-type-alist", &Vns_icon_type_alist,
2597 doc: /* Alist of elements (REGEXP . IMAGE) for images of icons associated to frames.
2598 If the title of a frame matches REGEXP, then IMAGE.tiff is
2599 selected as the image of the icon representing the frame when it's
2600 miniaturized. If an element is t, then Emacs tries to select an icon
2601 based on the filetype of the visited file.
2603 The images have to be installed in a folder called English.lproj in the
2604 Emacs folder. You have to restart Emacs after installing new icons.
2606 Example: Install an icon Gnus.tiff and execute the following code
2608 (setq ns-icon-type-alist
2609 (append ns-icon-type-alist
2610 '((\"^\\\\*\\\\(Group\\\\*$\\\\|Summary \\\\|Article\\\\*$\\\\)\"
2613 When you miniaturize a Group, Summary or Article frame, Gnus.tiff will
2614 be used as the image of the icon representing the frame. */);
2615 Vns_icon_type_alist = Fcons (Qt, Qnil);
2617 DEFVAR_LISP ("ns-version-string", &Vns_version_string,
2618 doc: /* Toolkit version for NS Windowing. */);
2619 Vns_version_string = ns_appkit_version_str ();
2621 defsubr (&Sns_read_file_name);
2622 defsubr (&Sns_get_resource);
2623 defsubr (&Sns_set_resource);
2624 defsubr (&Sxw_display_color_p); /* this and next called directly by C code */
2625 defsubr (&Sx_display_grayscale_p);
2626 defsubr (&Sns_font_name);
2627 defsubr (&Sns_list_colors);
2628 #ifdef NS_IMPL_COCOA
2629 defsubr (&Sns_do_applescript);
2631 defsubr (&Sxw_color_defined_p);
2632 defsubr (&Sxw_color_values);
2633 defsubr (&Sx_server_max_request_size);
2634 defsubr (&Sx_server_vendor);
2635 defsubr (&Sx_server_version);
2636 defsubr (&Sx_display_pixel_width);
2637 defsubr (&Sx_display_pixel_height);
2638 defsubr (&Sns_display_usable_bounds);
2639 defsubr (&Sx_display_mm_width);
2640 defsubr (&Sx_display_mm_height);
2641 defsubr (&Sx_display_screens);
2642 defsubr (&Sx_display_planes);
2643 defsubr (&Sx_display_color_cells);
2644 defsubr (&Sx_display_visual_class);
2645 defsubr (&Sx_display_backing_store);
2646 defsubr (&Sx_display_save_under);
2647 defsubr (&Sx_create_frame);
2648 defsubr (&Sx_open_connection);
2649 defsubr (&Sx_close_connection);
2650 defsubr (&Sx_display_list);
2652 defsubr (&Sns_hide_others);
2653 defsubr (&Sns_hide_emacs);
2654 defsubr (&Sns_emacs_info_panel);
2655 defsubr (&Sns_list_services);
2656 defsubr (&Sns_perform_service);
2657 defsubr (&Sns_convert_utf8_nfd_to_nfc);
2658 defsubr (&Sx_focus_frame);
2659 defsubr (&Sns_popup_font_panel);
2660 defsubr (&Sns_popup_color_panel);
2662 defsubr (&Sx_show_tip);
2663 defsubr (&Sx_hide_tip);
2665 /* used only in fontset.c */
2666 check_window_system_func = check_ns;