1 /* Functions for the NeXT/Open/GNUstep and MacOSX window system.
2 Copyright (C) 1989, 1992, 1993, 1994, 2005, 2006, 2008
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 Originally by Carl Edman
22 Updated by Christian Limpach (chris@nice.ch)
23 OpenStep/Rhapsody port by Scott Bender (sbender@harmony-ds.com)
24 MacOSX/Aqua port by Christophe de Dinechin (descubes@earthlink.net)
25 GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)
32 #include "blockinput.h"
37 #include "termhooks.h"
40 #include "character.h"
44 int fns_trace_num = 1;
45 #define NSTRACE(x) fprintf (stderr, "%s:%d: [%d] " #x "\n", \
46 __FILE__, __LINE__, ++fns_trace_num)
53 extern NSArray *ns_send_types, *ns_return_types, *ns_drag_types;
55 extern Lisp_Object Qforeground_color;
56 extern Lisp_Object Qbackground_color;
57 extern Lisp_Object Qcursor_color;
58 extern Lisp_Object Qinternal_border_width;
59 extern Lisp_Object Qvisibility;
60 extern Lisp_Object Qcursor_type;
61 extern Lisp_Object Qicon_type;
62 extern Lisp_Object Qicon_name;
63 extern Lisp_Object Qicon_left;
64 extern Lisp_Object Qicon_top;
65 extern Lisp_Object Qleft;
66 extern Lisp_Object Qright;
67 extern Lisp_Object Qtop;
68 extern Lisp_Object Qdisplay;
69 extern Lisp_Object Qvertical_scroll_bars;
70 extern Lisp_Object Qauto_raise;
71 extern Lisp_Object Qauto_lower;
72 extern Lisp_Object Qbox;
73 extern Lisp_Object Qscroll_bar_width;
74 extern Lisp_Object Qx_resource_name;
75 extern Lisp_Object Qface_set_after_frame_default;
76 extern Lisp_Object Qunderline, Qundefined;
77 extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
78 extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle;
81 Lisp_Object Qns_frame_parameter;
82 Lisp_Object Qbuffered;
83 Lisp_Object Qfontsize;
85 /* hack for OS X file panels */
88 /* Alist of elements (REGEXP . IMAGE) for images of icons associated
90 Lisp_Object Vns_icon_type_alist;
92 EmacsTooltip *ns_tooltip;
94 /* Need forward declaration here to preserve organizational integrity of file */
95 Lisp_Object Fx_open_connection (Lisp_Object, Lisp_Object, Lisp_Object);
97 extern BOOL ns_in_resize;
100 /* ==========================================================================
102 Internal utility functions
104 ========================================================================== */
111 error ("OpenStep is not in use or not initialized");
115 /* Nonzero if we can use mouse menus. */
123 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
124 and checking validity for NS. */
126 check_ns_frame (Lisp_Object frame)
131 f = SELECTED_FRAME ();
134 CHECK_LIVE_FRAME (frame);
137 if (! FRAME_NS_P (f))
138 error ("non-Nextstep frame used");
143 /* Let the user specify an Nextstep display with a frame.
144 nil stands for the selected frame--or, if that is not an Nextstep frame,
145 the first Nextstep display on the list. */
146 static struct ns_display_info *
147 check_ns_display_info (Lisp_Object frame)
151 struct frame *f = SELECTED_FRAME ();
152 if (FRAME_NS_P (f) && FRAME_LIVE_P (f) )
153 return FRAME_NS_DISPLAY_INFO (f);
154 else if (x_display_list != 0)
155 return x_display_list;
157 error ("Nextstep windows are not in use or not initialized");
159 else if (INTEGERP (frame))
161 struct terminal *t = get_terminal (frame, 1);
163 if (t->type != output_ns)
164 error ("Terminal %d is not a Nextstep display", XINT (frame));
166 return t->display_info.ns;
168 else if (STRINGP (frame))
169 return ns_display_info_for_name (frame);
174 CHECK_LIVE_FRAME (frame);
176 if (! FRAME_NS_P (f))
177 error ("non-Nextstep frame used");
178 return FRAME_NS_DISPLAY_INFO (f);
180 return NULL; /* shut compiler up */
185 ns_get_window (Lisp_Object maybeFrame)
187 id view =nil, window =nil;
189 if (!FRAMEP (maybeFrame) || !FRAME_NS_P (XFRAME (maybeFrame)))
190 maybeFrame = selected_frame;/*wrong_type_argument (Qframep, maybeFrame); */
192 if (!NILP (maybeFrame))
193 view = FRAME_NS_VIEW (XFRAME (maybeFrame));
194 if (view) window =[view window];
201 ns_get_screen (Lisp_Object anythingUnderTheSun)
204 NSScreen *screen = 0;
206 struct terminal *terminal;
207 struct ns_display_info *dpyinfo;
208 struct frame *f = NULL;
211 if (INTEGERP (anythingUnderTheSun)) {
212 /* we got a terminal */
213 terminal = get_terminal (anythingUnderTheSun, 1);
214 dpyinfo = terminal->display_info.ns;
215 f = dpyinfo->x_focus_frame;
217 f = dpyinfo->x_highlight_frame;
219 } else if (FRAMEP (anythingUnderTheSun) &&
220 FRAME_NS_P (XFRAME (anythingUnderTheSun))) {
222 f = XFRAME (anythingUnderTheSun);
224 } else if (STRINGP (anythingUnderTheSun)) { /* FIXME/cl for multi-display */
228 f = SELECTED_FRAME ();
231 XSETFRAME (frame, f);
232 window = ns_get_window (frame);
236 screen = [window screen];
238 screen = [NSScreen mainScreen];
244 /* Return the X display structure for the display named NAME.
245 Open a new connection if necessary. */
246 struct ns_display_info *
247 ns_display_info_for_name (name)
251 struct ns_display_info *dpyinfo;
255 for (dpyinfo = x_display_list, names = ns_display_name_list;
257 dpyinfo = dpyinfo->next, names = XCDR (names))
260 tem = Fstring_equal (XCAR (XCAR (names)), name);
265 error ("Emacs for OpenStep does not yet support multi-display.");
267 Fx_open_connection (name, Qnil, Qnil);
268 dpyinfo = x_display_list;
271 error ("OpenStep on %s not responding.\n", SDATA (name));
278 interpret_services_menu (NSMenu *menu, Lisp_Object prefix, Lisp_Object old)
279 /* --------------------------------------------------------------------------
280 Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
281 -------------------------------------------------------------------------- */
291 count = [menu numberOfItems];
292 for (i = 0; i<count; i++)
294 item = [menu itemAtIndex: i];
295 name = [[item title] UTF8String];
298 nameStr = build_string (name);
300 if ([item hasSubmenu])
302 old = interpret_services_menu ([item submenu],
303 Fcons (nameStr, prefix), old);
307 keys = [item keyEquivalent];
308 if (keys && [keys length] )
310 key = [keys characterAtIndex: 0];
311 res = make_number (key|super_modifier);
317 old = Fcons (Fcons (res,
318 Freverse (Fcons (nameStr,
328 /* ==========================================================================
330 Frame parameter setters
332 ========================================================================== */
336 ns_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
340 if (ns_lisp_to_color (arg, &col))
342 store_frame_param (f, Qforeground_color, oldval);
343 error ("Unknown color");
347 [f->output_data.ns->foreground_color release];
348 f->output_data.ns->foreground_color = col;
350 if (FRAME_NS_VIEW (f))
352 update_face_from_frame_parameter (f, Qforeground_color, arg);
353 /*recompute_basic_faces (f); */
354 if (FRAME_VISIBLE_P (f))
361 ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
365 NSView *view = FRAME_NS_VIEW (f);
368 if (ns_lisp_to_color (arg, &col))
370 store_frame_param (f, Qbackground_color, oldval);
371 error ("Unknown color");
374 /* clear the frame; in some instances the NS-internal GC appears not to
375 update, or it does update and cannot clear old text properly */
376 if (FRAME_VISIBLE_P (f))
380 [f->output_data.ns->background_color release];
381 f->output_data.ns->background_color = col;
384 [[view window] setBackgroundColor: col];
385 alpha = [col alphaComponent];
388 /* the alpha code below only works on 10.4, so we need to do something
389 else (albeit less good) otherwise.
390 Check NSApplication.h for useful NSAppKitVersionNumber values. */
391 if (NSAppKitVersionNumber < 744.0)
392 [[view window] setAlphaValue: alpha];
396 [[view window] setOpaque: NO];
398 [[view window] setOpaque: YES];
400 face = FRAME_DEFAULT_FACE (f);
403 col = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f);
405 = (EMACS_UINT) [[col colorWithAlphaComponent: alpha] retain];
408 update_face_from_frame_parameter (f, Qbackground_color, arg);
411 if (FRAME_VISIBLE_P (f))
418 ns_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
422 if (ns_lisp_to_color (arg, &col))
424 store_frame_param (f, Qcursor_color, oldval);
425 error ("Unknown color");
428 [f->output_data.ns->desired_cursor_color release];
429 f->output_data.ns->desired_cursor_color = [col retain];
431 if (FRAME_VISIBLE_P (f))
433 x_update_cursor (f, 0);
434 x_update_cursor (f, 1);
436 update_face_from_frame_parameter (f, Qcursor_color, arg);
441 ns_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
443 NSView *view = FRAME_NS_VIEW (f);
444 NSTRACE (ns_set_icon_name);
449 /* see if it's changed */
452 if (STRINGP (oldval) && EQ (Fstring_equal (oldval, arg), Qt))
455 else if (!STRINGP (oldval) && EQ (oldval, Qnil) == EQ (arg, Qnil))
462 if (!NILP (f->title))
465 /* explicit name and no icon-name -> explicit_name */
466 if (f->explicit_name)
470 /* no explicit name and no icon-name ->
471 name has to be rebuild from icon_title_format */
472 windows_or_buffers_changed++;
477 /* Don't change the name if it's already NAME. */
478 if ([[view window] miniwindowTitle] &&
479 ([[[view window] miniwindowTitle]
480 isEqualToString: [NSString stringWithUTF8String:
484 [[view window] setMiniwindowTitle:
485 [NSString stringWithUTF8String: SDATA (arg)]];
490 ns_set_name_iconic (struct frame *f, Lisp_Object name, int explicit)
492 NSView *view = FRAME_NS_VIEW (f);
493 NSTRACE (ns_set_name_iconic);
498 /* Make sure that requests from lisp code override requests from
499 Emacs redisplay code. */
502 /* If we're switching from explicit to implicit, we had better
503 update the mode lines and thereby update the title. */
504 if (f->explicit_name && NILP (name))
505 update_mode_lines = 1;
507 f->explicit_name = ! NILP (name);
509 else if (f->explicit_name)
512 /* title overrides explicit name */
513 if (! NILP (f->title))
516 /* icon_name overrides title and explicit name */
517 if (! NILP (f->icon_name))
522 ([[[NSProcessInfo processInfo] processName] UTF8String]);
526 /* Don't change the name if it's already NAME. */
527 if ([[view window] miniwindowTitle] &&
528 ([[[view window] miniwindowTitle]
529 isEqualToString: [NSString stringWithUTF8String:
533 [[view window] setMiniwindowTitle:
534 [NSString stringWithUTF8String: SDATA (name)]];
539 ns_set_name (struct frame *f, Lisp_Object name, int explicit)
541 NSView *view = FRAME_NS_VIEW (f);
542 NSTRACE (ns_set_name);
547 /* Make sure that requests from lisp code override requests from
548 Emacs redisplay code. */
551 /* If we're switching from explicit to implicit, we had better
552 update the mode lines and thereby update the title. */
553 if (f->explicit_name && NILP (name))
554 update_mode_lines = 1;
556 f->explicit_name = ! NILP (name);
558 else if (f->explicit_name)
563 ([[[NSProcessInfo processInfo] processName] UTF8String]);
567 /* title overrides explicit name */
568 if (! NILP (f->title))
573 /* Don't change the name if it's already NAME. */
574 if ([[[view window] title]
575 isEqualToString: [NSString stringWithUTF8String:
578 [[view window] setTitle: [NSString stringWithUTF8String:
583 /* This function should be called when the user's lisp code has
584 specified a name for the frame; the name will override any set by the
587 ns_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
589 NSTRACE (ns_explicitly_set_name);
590 ns_set_name_iconic (f, arg, 1);
591 ns_set_name (f, arg, 1);
595 /* This function should be called by Emacs redisplay code to set the
596 name; names set this way will never override names set by the user's
599 x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
601 NSTRACE (x_implicitly_set_name);
602 if (FRAME_ICONIFIED_P (f))
603 ns_set_name_iconic (f, arg, 0);
605 ns_set_name (f, arg, 0);
609 /* Change the title of frame F to NAME.
610 If NAME is nil, use the frame name as the title.
612 If EXPLICIT is non-zero, that indicates that lisp code is setting the
613 name; if NAME is a string, set F's name to NAME and set
614 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
616 If EXPLICIT is zero, that indicates that Emacs redisplay code is
617 suggesting a new name, which lisp code should override; if
618 F->explicit_name is set, ignore the new name; otherwise, set it. */
620 ns_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
622 NSTRACE (ns_set_title);
623 /* Don't change the title if it's already NAME. */
624 if (EQ (name, f->title))
627 update_mode_lines = 1;
634 ns_set_name_as_filename (struct frame *f)
636 NSView *view = FRAME_NS_VIEW (f);
638 Lisp_Object buf = XWINDOW (f->selected_window)->buffer;
640 NSAutoreleasePool *pool;
641 NSTRACE (ns_set_name_as_filename);
643 if (f->explicit_name || ! NILP (f->title) || ns_in_resize)
647 pool = [[NSAutoreleasePool alloc] init];
648 name =XBUFFER (buf)->filename;
649 if (NILP (name) || FRAME_ICONIFIED_P (f)) name =XBUFFER (buf)->name;
651 if (FRAME_ICONIFIED_P (f) && !NILP (f->icon_name))
656 ([[[NSProcessInfo processInfo] processName] UTF8String]);
660 title = FRAME_ICONIFIED_P (f) ? [[[view window] miniwindowTitle] UTF8String]
661 : [[[view window] title] UTF8String];
663 if (title && (! strcmp (title, SDATA (name))))
670 if (! FRAME_ICONIFIED_P (f))
673 /* work around a bug observed on 10.3 where
674 setTitleWithRepresentedFilename does not clear out previous state
675 if given filename does not exist */
676 NSString *str = [NSString stringWithUTF8String: SDATA (name)];
677 if (![[NSFileManager defaultManager] fileExistsAtPath: str])
679 [[view window] setTitleWithRepresentedFilename: @""];
680 [[view window] setTitle: str];
684 [[view window] setTitleWithRepresentedFilename: str];
687 [[view window] setTitleWithRepresentedFilename:
688 [NSString stringWithUTF8String: SDATA (name)]];
694 [[view window] setMiniwindowTitle:
695 [NSString stringWithUTF8String: SDATA (name)]];
703 ns_set_doc_edited (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
705 NSView *view = FRAME_NS_VIEW (f);
706 NSAutoreleasePool *pool;
708 pool = [[NSAutoreleasePool alloc] init];
709 [[view window] setDocumentEdited: !NILP (arg)];
716 x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
719 int olines = FRAME_MENU_BAR_LINES (f);
720 if (FRAME_MINIBUF_ONLY_P (f))
723 if (INTEGERP (value))
724 nlines = XINT (value);
728 FRAME_MENU_BAR_LINES (f) = 0;
731 FRAME_EXTERNAL_MENU_BAR (f) = 1;
732 /* does for all frames, whereas we just want for one frame
733 [NSMenu setMenuBarVisible: YES]; */
737 if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
738 free_frame_menubar (f);
739 /* [NSMenu setMenuBarVisible: NO]; */
740 FRAME_EXTERNAL_MENU_BAR (f) = 0;
745 /* 23: toolbar support */
747 x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
750 Lisp_Object root_window;
752 if (FRAME_MINIBUF_ONLY_P (f))
755 if (INTEGERP (value) && XINT (value) >= 0)
756 nlines = XFASTINT (value);
762 FRAME_EXTERNAL_TOOL_BAR (f) = 1;
763 update_frame_tool_bar (f);
767 if (FRAME_EXTERNAL_TOOL_BAR (f))
769 free_frame_tool_bar (f);
770 FRAME_EXTERNAL_TOOL_BAR (f) = 0;
774 x_set_window_size (f, 0, f->text_cols, f->text_lines);
779 ns_implicitly_set_icon_type (struct frame *f)
782 EmacsView *view = FRAME_NS_VIEW (f);
784 Lisp_Object chain, elt;
785 NSAutoreleasePool *pool;
788 NSTRACE (ns_implicitly_set_icon_type);
791 pool = [[NSAutoreleasePool alloc] init];
792 if (f->output_data.ns->miniimage
793 && [[NSString stringWithUTF8String: SDATA (f->name)]
794 isEqualToString: [(NSImage *)f->output_data.ns->miniimage name]])
801 tem = assq_no_quit (Qicon_type, f->param_alist);
802 if (CONSP (tem) && ! NILP (XCDR (tem)))
809 for (chain = Vns_icon_type_alist;
810 (image = nil) && CONSP (chain);
811 chain = XCDR (chain))
814 /* special case: 't' means go by file type */
815 if (SYMBOLP (elt) && EQ (elt, Qt) && SDATA (f->name)[0] == '/')
818 = [NSString stringWithUTF8String: SDATA (f->name)];
819 if ([[NSFileManager defaultManager] fileExistsAtPath: str])
820 image = [[[NSWorkspace sharedWorkspace] iconForFile: str] retain];
822 else if (CONSP (elt) &&
823 STRINGP (XCAR (elt)) &&
824 STRINGP (XCDR (elt)) &&
825 fast_string_match (XCAR (elt), f->name) >= 0)
827 image = [EmacsImage allocInitFromFile: XCDR (elt)];
829 image = [[NSImage imageNamed:
830 [NSString stringWithUTF8String:
831 SDATA (XCDR (elt))]] retain];
837 image = [[[NSWorkspace sharedWorkspace] iconForFileType: @"text"] retain];
841 [f->output_data.ns->miniimage release];
842 f->output_data.ns->miniimage = image;
843 [view setMiniwindowImage: setMini];
850 ns_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
852 EmacsView *view = FRAME_NS_VIEW (f);
856 NSTRACE (ns_set_icon_type);
858 if (!NILP (arg) && SYMBOLP (arg))
860 arg =build_string (SDATA (SYMBOL_NAME (arg)));
861 store_frame_param (f, Qicon_type, arg);
864 /* do it the implicit way */
867 ns_implicitly_set_icon_type (f);
873 image = [EmacsImage allocInitFromFile: arg];
875 image =[NSImage imageNamed: [NSString stringWithUTF8String:
880 image = [NSImage imageNamed: @"text"];
884 f->output_data.ns->miniimage = image;
885 [view setMiniwindowImage: setMini];
889 /* 23: added Xism; we stub out (we do implement this in ns-win.el) */
891 XParseGeometry (char *string, int *x, int *y,
892 unsigned int *width, unsigned int *height)
894 message1 ("Warning: XParseGeometry not supported under NS.\n");
899 /* TODO: move to nsterm? */
901 ns_lisp_to_cursor_type (Lisp_Object arg)
904 if (XTYPE (arg) == Lisp_String)
906 else if (XTYPE (arg) == Lisp_Symbol)
907 str = SDATA (SYMBOL_NAME (arg));
909 if (!strcmp (str, "box")) return filled_box;
910 if (!strcmp (str, "hollow")) return hollow_box;
911 if (!strcmp (str, "underscore")) return underscore;
912 if (!strcmp (str, "bar")) return bar;
913 if (!strcmp (str, "no")) return no_highlight;
919 ns_cursor_type_to_lisp (int arg)
923 case filled_box: return Qbox;
924 case hollow_box: return intern ("hollow");
925 case underscore: return intern ("underscore");
926 case bar: return intern ("bar");
928 default: return intern ("no");
934 ns_set_cursor_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
938 val = ns_lisp_to_cursor_type (arg);
941 f->output_data.ns->desired_cursor =val;
945 store_frame_param (f, Qcursor_type, oldval);
946 error ("the `cursor-type' frame parameter should be either `no', `box', \
947 `hollow', `underscore' or `bar'.");
954 /* 23: called to set mouse pointer color, but all other terms use it to
955 initialize pointer types (and don't set the color ;) */
957 ns_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
959 /* don't think we can do this on Nextstep */
964 x_icon (struct frame *f, Lisp_Object parms)
965 /* --------------------------------------------------------------------------
966 Strangely-named function to set icon position parameters in frame.
967 This is irrelevant under OS X, but might be needed under GNUstep,
968 depending on the window manager used. Note, this is not a standard
969 frame parameter-setter; it is called directly from x-create-frame.
970 -------------------------------------------------------------------------- */
972 Lisp_Object icon_x, icon_y;
973 struct ns_display_info *dpyinfo = check_ns_display_info (Qnil);
975 f->output_data.ns->icon_top = Qnil;
976 f->output_data.ns->icon_left = Qnil;
978 /* Set the position of the icon. */
979 icon_x = x_get_arg (dpyinfo, parms, Qicon_left, 0, 0, RES_TYPE_NUMBER);
980 icon_y = x_get_arg (dpyinfo, parms, Qicon_top, 0, 0, RES_TYPE_NUMBER);
981 if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound))
983 CHECK_NUMBER (icon_x);
984 CHECK_NUMBER (icon_y);
985 f->output_data.ns->icon_top = icon_y;
986 f->output_data.ns->icon_left = icon_x;
988 else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
989 error ("Both left and top icon corners of icon must be specified");
993 /* 23 Note: commented out ns_... entries are no longer used in 23.
994 commented out x_... entries have not been implemented yet.
995 see frame.c for template, also where all generic OK functions are impl */
996 frame_parm_handler ns_frame_parm_handlers[] =
998 x_set_autoraise, /* generic OK */
999 x_set_autolower, /* generic OK */
1000 ns_set_background_color,
1001 0, /* x_set_border_color, may be impossible under Nextstep */
1002 0, /* x_set_border_width, may be impossible under Nextstep */
1003 ns_set_cursor_color,
1005 x_set_font, /* generic OK */
1006 ns_set_foreground_color,
1009 x_set_internal_border_width, /* generic OK */
1010 x_set_menu_bar_lines,
1012 ns_explicitly_set_name,
1013 x_set_scroll_bar_width, /* generic OK */
1015 x_set_unsplittable, /* generic OK */
1016 x_set_vertical_scroll_bars, /* generic OK */
1017 x_set_visibility, /* generic OK */
1018 x_set_tool_bar_lines,
1019 0, /* x_set_scroll_bar_foreground, will ignore (not possible on NS) */
1020 0, /* x_set_scroll_bar_background, will ignore (not possible on NS) */
1021 x_set_screen_gamma, /* generic OK */
1022 x_set_line_spacing, /* generic OK, sets f->extra_line_spacing to int */
1023 x_set_fringe_width, /* generic OK */
1024 x_set_fringe_width, /* generic OK */
1025 0, /* x_set_wait_for_wm, will ignore */
1026 0, /* x_set_fullscreen will ignore */
1027 x_set_font_backend /* generic OK */
1031 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
1033 doc: /* Make a new Nextstep window, called a \"frame\" in Emacs terms.
1034 Return an Emacs frame object.
1035 PARMS is an alist of frame parameters.
1036 If the parameters specify that the frame should not have a minibuffer,
1037 and do not specify a specific minibuffer window to use,
1038 then `default-minibuffer-frame' must be a frame whose minibuffer can
1039 be shared by the new frame. */)
1043 static int desc_ctr = 1;
1045 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1046 Lisp_Object frame, tem;
1048 int minibuffer_only = 0;
1049 int count = specpdl_ptr - specpdl;
1050 Lisp_Object display;
1051 struct ns_display_info *dpyinfo = NULL;
1054 Lisp_Object tfont, tfontsize;
1055 int window_prompting = 0;
1060 display = x_get_arg (dpyinfo, parms, Qterminal, 0, 0, RES_TYPE_STRING);
1061 if (EQ (display, Qunbound))
1063 dpyinfo = check_ns_display_info (display);
1065 if (!dpyinfo->terminal->name)
1066 error ("Terminal is not live, can't create new frames on it");
1068 kb = dpyinfo->terminal->kboard;
1070 name = x_get_arg (dpyinfo, parms, Qname, 0, 0, RES_TYPE_STRING);
1072 && ! EQ (name, Qunbound)
1074 error ("Invalid frame name--not a string or nil");
1077 Vx_resource_name = name;
1079 parent = x_get_arg (dpyinfo, parms, Qparent_id, 0, 0, RES_TYPE_NUMBER);
1080 if (EQ (parent, Qunbound))
1082 if (! NILP (parent))
1083 CHECK_NUMBER (parent);
1086 GCPRO4 (parms, parent, name, frame);
1088 tem = x_get_arg (dpyinfo, parms, Qminibuffer, "minibuffer", "Minibuffer",
1090 if (EQ (tem, Qnone) || NILP (tem))
1092 f = make_frame_without_minibuffer (Qnil, kb, display);
1094 else if (EQ (tem, Qonly))
1096 f = make_minibuffer_frame ();
1097 minibuffer_only = 1;
1099 else if (WINDOWP (tem))
1101 f = make_frame_without_minibuffer (tem, kb, display);
1108 /* Set the name; the functions to which we pass f expect the name to
1110 if (EQ (name, Qunbound) || NILP (name) || (XTYPE (name) != Lisp_String))
1113 = build_string ([[[NSProcessInfo processInfo] processName] UTF8String]);
1114 f->explicit_name =0;
1119 f->explicit_name = 1;
1120 specbind (Qx_resource_name, name);
1123 XSETFRAME (frame, f);
1124 FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
1126 f->terminal = dpyinfo->terminal;
1127 f->terminal->reference_count++;
1129 f->output_method = output_ns;
1130 f->output_data.ns = (struct ns_output *)xmalloc (sizeof *(f->output_data.ns));
1131 bzero (f->output_data.ns, sizeof (*(f->output_data.ns)));
1133 FRAME_FONTSET (f) = -1;
1135 /* record_unwind_protect (unwind_create_frame, frame); safety; maybe later? */
1137 f->icon_name = x_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title",
1139 if (EQ (f->icon_name, Qunbound) || (XTYPE (f->icon_name) != Lisp_String))
1140 f->icon_name = Qnil;
1142 FRAME_NS_DISPLAY_INFO (f) = dpyinfo;
1144 f->output_data.ns->window_desc = desc_ctr++;
1147 f->output_data.ns->parent_desc = (Window) XFASTINT (parent);
1148 f->output_data.ns->explicit_parent = 1;
1152 f->output_data.ns->parent_desc = FRAME_NS_DISPLAY_INFO (f)->root_window;
1153 f->output_data.ns->explicit_parent = 0;
1156 f->resx = dpyinfo->resx;
1157 f->resy = dpyinfo->resy;
1160 register_font_driver (&nsfont_driver, f);
1161 x_default_parameter (f, parms, Qfont_backend, Qnil,
1162 "fontBackend", "FontBackend", RES_TYPE_STRING);
1165 /* use for default font name */
1166 id font = [NSFont userFixedPitchFontOfSize: -1.0]; /* default */
1167 tfontsize = x_default_parameter (f, parms, Qfontsize,
1168 make_number (0 /*(int)[font pointSize]*/),
1169 "fontSize", "FontSize", RES_TYPE_NUMBER);
1170 tfont = x_default_parameter (f, parms, Qfont,
1171 build_string ([[font fontName] UTF8String]),
1172 "font", "Font", RES_TYPE_STRING);
1176 x_default_parameter (f, parms, Qborder_width, make_number (0),
1177 "borderwidth", "BorderWidth", RES_TYPE_NUMBER);
1178 x_default_parameter (f, parms, Qinternal_border_width, make_number (2),
1179 "internalBorderWidth", "InternalBorderWidth",
1182 /* default scrollbars on right on Mac */
1185 #ifdef NS_IMPL_GNUSTEP
1190 x_default_parameter (f, parms, Qvertical_scroll_bars, spos,
1191 "verticalScrollBars", "VerticalScrollBars",
1194 x_default_parameter (f, parms, Qforeground_color, build_string ("Black"),
1195 "foreground", "Foreground", RES_TYPE_STRING);
1196 x_default_parameter (f, parms, Qbackground_color, build_string ("White"),
1197 "background", "Background", RES_TYPE_STRING);
1198 x_default_parameter (f, parms, Qcursor_color, build_string ("grey"),
1199 "cursorColor", "CursorColor", RES_TYPE_STRING);
1200 /* FIXME: not suppported yet in Nextstep */
1201 x_default_parameter (f, parms, Qline_spacing, Qnil,
1202 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER);
1203 x_default_parameter (f, parms, Qleft_fringe, Qnil,
1204 "leftFringe", "LeftFringe", RES_TYPE_NUMBER);
1205 x_default_parameter (f, parms, Qright_fringe, Qnil,
1206 "rightFringe", "RightFringe", RES_TYPE_NUMBER);
1209 init_frame_faces (f);
1211 x_default_parameter (f, parms, Qmenu_bar_lines, make_number (0), "menuBar",
1212 "menuBar", RES_TYPE_NUMBER);
1213 x_default_parameter (f, parms, Qtool_bar_lines, make_number (0), "toolBar",
1214 "toolBar", RES_TYPE_NUMBER);
1215 x_default_parameter (f, parms, Qbuffer_predicate, Qnil, "bufferPredicate",
1216 "BufferPredicate", RES_TYPE_SYMBOL);
1217 x_default_parameter (f, parms, Qtitle, Qnil, "title", "Title",
1220 /* TODO: other terms seem to get away w/o this complexity.. */
1221 if (NILP (Fassq (Qwidth, parms)))
1224 = x_get_arg (dpyinfo, parms, Qwidth, "width", "Width",
1226 if (! EQ (value, Qunbound))
1227 parms = Fcons (Fcons (Qwidth, value), parms);
1229 if (NILP (Fassq (Qheight, parms)))
1232 = x_get_arg (dpyinfo, parms, Qheight, "height", "Height",
1234 if (! EQ (value, Qunbound))
1235 parms = Fcons (Fcons (Qheight, value), parms);
1237 if (NILP (Fassq (Qleft, parms)))
1240 = x_get_arg (dpyinfo, parms, Qleft, "left", "Left", RES_TYPE_NUMBER);
1241 if (! EQ (value, Qunbound))
1242 parms = Fcons (Fcons (Qleft, value), parms);
1244 if (NILP (Fassq (Qtop, parms)))
1247 = x_get_arg (dpyinfo, parms, Qtop, "top", "Top", RES_TYPE_NUMBER);
1248 if (! EQ (value, Qunbound))
1249 parms = Fcons (Fcons (Qtop, value), parms);
1252 window_prompting = x_figure_window_size (f, parms, 1);
1254 tem = x_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
1255 f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !EQ (tem, Qnil));
1257 /* NOTE: on other terms, this is done in set_mouse_color, however this
1258 was not getting called under Nextstep */
1259 f->output_data.ns->text_cursor = [NSCursor IBeamCursor];
1260 f->output_data.ns->nontext_cursor = [NSCursor arrowCursor];
1261 f->output_data.ns->modeline_cursor = [NSCursor pointingHandCursor];
1262 f->output_data.ns->hand_cursor = [NSCursor pointingHandCursor];
1263 f->output_data.ns->hourglass_cursor = [NSCursor disappearingItemCursor];
1264 f->output_data.ns->horizontal_drag_cursor = [NSCursor resizeLeftRightCursor];
1265 FRAME_NS_DISPLAY_INFO (f)->vertical_scroll_bar_cursor
1266 = [NSCursor arrowCursor];
1267 f->output_data.ns->current_pointer = f->output_data.ns->text_cursor;
1269 [[EmacsView alloc] initFrameFromEmacs: f];
1273 /* It is now ok to make the frame official even if we get an error below.
1274 The frame needs to be on Vframe_list or making it visible won't work. */
1275 Vframe_list = Fcons (frame, Vframe_list);
1276 /*FRAME_NS_DISPLAY_INFO (f)->reference_count++; */
1278 x_default_parameter (f, parms, Qcursor_type, Qbox, "cursorType", "CursorType",
1280 x_default_parameter (f, parms, Qscroll_bar_width, Qnil, "scrollBarWidth",
1281 "ScrollBarWidth", RES_TYPE_NUMBER);
1282 x_default_parameter (f, parms, Qicon_type, Qnil, "bitmapIcon", "BitmapIcon",
1284 x_default_parameter (f, parms, Qauto_raise, Qnil, "autoRaise", "AutoRaise",
1286 x_default_parameter (f, parms, Qauto_lower, Qnil, "autoLower", "AutoLower",
1288 x_default_parameter (f, parms, Qbuffered, Qt, "buffered", "Buffered",
1291 width = FRAME_COLS (f);
1292 height = FRAME_LINES (f);
1294 SET_FRAME_COLS (f, 0);
1295 FRAME_LINES (f) = 0;
1296 change_frame_size (f, height, width, 1, 0, 0);
1298 if (! f->output_data.ns->explicit_parent)
1300 tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_BOOLEAN);
1301 if (EQ (tem, Qunbound))
1304 x_set_visibility (f, tem, Qnil);
1306 [[FRAME_NS_VIEW (f) window] makeKeyWindow];
1309 if (FRAME_HAS_MINIBUF_P (f)
1310 && (!FRAMEP (kb->Vdefault_minibuffer_frame)
1311 || !FRAME_LIVE_P (XFRAME (kb->Vdefault_minibuffer_frame))))
1312 kb->Vdefault_minibuffer_frame = frame;
1314 /* All remaining specified parameters, which have not been "used"
1315 by x_get_arg and friends, now go in the misc. alist of the frame. */
1316 for (tem = parms; CONSP (tem); tem = XCDR (tem))
1317 if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
1318 f->param_alist = Fcons (XCAR (tem), f->param_alist);
1321 Vwindow_list = Qnil;
1323 return unbind_to (count, frame);
1327 /* ==========================================================================
1331 ========================================================================== */
1333 DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
1334 doc: /* Set the input focus to FRAME.
1335 FRAME nil means use the selected frame. */)
1339 struct frame *f = check_ns_frame (frame);
1340 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
1342 if (dpyinfo->x_focus_frame != f)
1344 EmacsView *view = FRAME_NS_VIEW (f);
1346 [[view window] makeKeyAndOrderFront: view];
1354 DEFUN ("ns-popup-prefs-panel", Fns_popup_prefs_panel, Sns_popup_prefs_panel,
1356 doc: /* Pop up the preferences panel. */)
1360 [(EmacsApp *)NSApp showPreferencesWindow: NSApp];
1365 DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel,
1367 doc: /* Pop up the font panel. */)
1375 fm = [NSFontManager new];
1377 f = SELECTED_FRAME ();
1380 CHECK_FRAME (frame);
1384 [fm setSelectedFont: ((struct nsfont_info *)f->output_data.ns->font)->nsfont
1386 [fm orderFrontFontPanel: NSApp];
1391 DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel,
1393 doc: /* Pop up the color panel. */)
1401 f = SELECTED_FRAME ();
1404 CHECK_FRAME (frame);
1408 [NSApp orderFrontColorPanel: NSApp];
1413 DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 4, 0,
1414 doc: /* Use a graphical panel to read a file name, using prompt PROMPT.
1415 Optional arg DIR, if non-nil, supplies a default directory.
1416 Optional arg ISLOAD, if non-nil, means read a file name for saving.
1417 Optional arg INIT, if non-nil, provides a default file name to use. */)
1418 (prompt, dir, isLoad, init)
1419 Lisp_Object prompt, dir, isLoad, init;
1421 static id fileDelegate = nil;
1426 NSString *promptS = NILP (prompt) || !STRINGP (prompt) ? nil :
1427 [NSString stringWithUTF8String: SDATA (prompt)];
1428 NSString *dirS = NILP (dir) || !STRINGP (dir) ?
1429 [NSString stringWithUTF8String: SDATA (current_buffer->directory)] :
1430 [NSString stringWithUTF8String: SDATA (dir)];
1431 NSString *initS = NILP (init) || !STRINGP (init) ? nil :
1432 [NSString stringWithUTF8String: SDATA (init)];
1436 if (fileDelegate == nil)
1437 fileDelegate = [EmacsFileDelegate new];
1439 [NSCursor setHiddenUntilMouseMoves: NO];
1441 if ([dirS characterAtIndex: 0] == '~')
1442 dirS = [dirS stringByExpandingTildeInPath];
1444 panel = NILP (isLoad) ?
1445 [EmacsSavePanel savePanel] : [EmacsOpenPanel openPanel];
1447 [panel setTitle: promptS];
1449 /* Puma (10.1) does not have */
1450 if ([panel respondsToSelector: @selector (setAllowsOtherFileTypes:)])
1451 [panel setAllowsOtherFileTypes: YES];
1453 [panel setTreatsFilePackagesAsDirectories: YES];
1454 [panel setDelegate: fileDelegate];
1459 ret = [panel runModalForDirectory: dirS file: initS];
1463 [panel setCanChooseDirectories: YES];
1464 ret = [panel runModalForDirectory: dirS file: initS types: nil];
1467 ret = (ret = NSOKButton) || panelOK;
1469 fname = [panel filename];
1471 [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
1473 return ret ? build_string ([fname UTF8String]) : Qnil;
1477 DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0,
1478 doc: /* Return the value of the property NAME of OWNER from the defaults database.
1479 If OWNER is nil, Emacs is assumed. */)
1481 Lisp_Object owner, name;
1487 owner = build_string
1488 ([[[NSProcessInfo processInfo] processName] UTF8String]);
1489 /* CHECK_STRING (owner); this should be just "Emacs" */
1490 CHECK_STRING (name);
1491 /*fprintf (stderr, "ns-get-resource checking resource '%s'\n", SDATA (name)); */
1493 value =[[[NSUserDefaults standardUserDefaults]
1494 objectForKey: [NSString stringWithUTF8String: SDATA (name)]]
1498 return build_string (value);
1503 DEFUN ("ns-set-resource", Fns_set_resource, Sns_set_resource, 3, 3, 0,
1504 doc: /* Set property NAME of OWNER to VALUE, from the defaults database.
1505 If OWNER is nil, Emacs is assumed.
1506 If VALUE is nil, the default is removed. */)
1507 (owner, name, value)
1508 Lisp_Object owner, name, value;
1513 = build_string ([[[NSProcessInfo processInfo] processName] UTF8String]);
1514 CHECK_STRING (owner);
1515 CHECK_STRING (name);
1518 [[NSUserDefaults standardUserDefaults] removeObjectForKey:
1519 [NSString stringWithUTF8String: SDATA (name)]];
1523 CHECK_STRING (value);
1524 [[NSUserDefaults standardUserDefaults] setObject:
1525 [NSString stringWithUTF8String: SDATA (value)]
1526 forKey: [NSString stringWithUTF8String:
1534 DEFUN ("ns-set-alpha", Fns_set_alpha, Sns_set_alpha, 2, 2, 0,
1535 doc: /* Return a color equivalent to COLOR with alpha setting ALPHA.
1536 The argument ALPHA should be a number between 0 and 1, where 0 is full
1537 transparency and 1 is opaque. */)
1545 CHECK_STRING (color);
1546 CHECK_NUMBER_OR_FLOAT (alpha);
1548 if (ns_lisp_to_color (color, &col))
1549 error ("Unknown color.");
1551 a = XFLOATINT (alpha);
1552 if (a < 0.0 || a > 1.0)
1553 error ("Alpha value should be between 0 and 1 inclusive.");
1555 col = [col colorWithAlphaComponent: a];
1556 return ns_color_to_lisp (col);
1560 DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
1561 Sx_server_max_request_size,
1563 doc: /* This function is a no-op. It is only present for completeness. */)
1565 Lisp_Object display;
1568 /* This function has no real equivalent under NeXTstep. Return nil to
1574 DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
1575 doc: /* Return the vendor ID string of Nextstep display server DISPLAY.
1576 DISPLAY should be either a frame or a display name (a string).
1577 If omitted or nil, the selected frame's display is used. */)
1579 Lisp_Object display;
1582 #ifdef NS_IMPL_GNUSTEP
1583 return build_string ("GNU");
1585 return build_string ("Apple");
1590 DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
1591 doc: /* Return the version number of Nextstep display server DISPLAY.
1592 DISPLAY should be either a frame or a display name (a string).
1593 If omitted or nil, the selected frame's display is used.
1594 See also the function `ns-server-vendor'. */)
1596 Lisp_Object display;
1598 /* FIXME: return GUI version on GNUSTEP, ?? on OS X */
1599 return build_string ("1.0");
1603 DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
1604 doc: /* Return the number of screens on Nextstep display server DISPLAY.
1605 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1606 If omitted or nil, the selected frame's display is used. */)
1608 Lisp_Object display;
1613 num = [[NSScreen screens] count];
1615 return (num != 0) ? make_number (num) : Qnil;
1619 DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height,
1621 doc: /* Return the height of Nextstep display server DISPLAY, in millimeters.
1622 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1623 If omitted or nil, the selected frame's display is used. */)
1625 Lisp_Object display;
1628 return make_number ((int)
1629 ([ns_get_screen (display) frame].size.height/(92.0/25.4)));
1633 DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width,
1635 doc: /* Return the width of Nextstep display server DISPLAY, in millimeters.
1636 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1637 If omitted or nil, the selected frame's display is used. */)
1639 Lisp_Object display;
1642 return make_number ((int)
1643 ([ns_get_screen (display) frame].size.width/(92.0/25.4)));
1647 DEFUN ("x-display-backing-store", Fx_display_backing_store,
1648 Sx_display_backing_store, 0, 1, 0,
1649 doc: /* Return whether the Nexstep display DISPLAY supports backing store.
1650 The value may be `buffered', `retained', or `non-retained'.
1651 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1652 If omitted or nil, the selected frame's display is used. */)
1654 Lisp_Object display;
1657 switch ([ns_get_window (display) backingType])
1659 case NSBackingStoreBuffered:
1660 return intern ("buffered");
1661 case NSBackingStoreRetained:
1662 return intern ("retained");
1663 case NSBackingStoreNonretained:
1664 return intern ("non-retained");
1666 error ("Strange value for backingType parameter of frame");
1668 return Qnil; /* not reached, shut compiler up */
1672 DEFUN ("x-display-visual-class", Fx_display_visual_class,
1673 Sx_display_visual_class, 0, 1, 0,
1674 doc: /* Return the visual class of the Nextstep display server DISPLAY.
1675 The value is one of the symbols `static-gray', `gray-scale',
1676 `static-color', `pseudo-color', `true-color', or `direct-color'.
1677 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1678 If omitted or nil, the selected frame's display is used. */)
1680 Lisp_Object display;
1682 NSWindowDepth depth;
1684 depth = [ns_get_screen (display) depth];
1686 if ( depth == NSBestDepth (NSCalibratedWhiteColorSpace, 2, 2, YES, NULL))
1687 return intern ("static-gray");
1688 else if (depth == NSBestDepth (NSCalibratedWhiteColorSpace, 8, 8, YES, NULL))
1689 return intern ("gray-scale");
1690 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 8, 8, YES, NULL))
1691 return intern ("pseudo-color");
1692 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 4, 12, NO, NULL))
1693 return intern ("true-color");
1694 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 8, 24, NO, NULL))
1695 return intern ("direct-color");
1697 /* color mgmt as far as we do it is really handled by Nextstep itself anyway */
1698 return intern ("direct-color");
1702 DEFUN ("x-display-save-under", Fx_display_save_under,
1703 Sx_display_save_under, 0, 1, 0,
1704 doc: /* Non-nil if the Nextstep display server supports the save-under feature.
1705 The optional argument DISPLAY specifies which display to ask about.
1706 DISPLAY should be a frame, the display name as a string, or a terminal ID.
1707 If omitted or nil, the selected frame's display is used. */)
1709 Lisp_Object display;
1712 switch ([ns_get_window (display) backingType])
1714 case NSBackingStoreBuffered:
1717 case NSBackingStoreRetained:
1718 case NSBackingStoreNonretained:
1722 error ("Strange value for backingType parameter of frame");
1724 return Qnil; /* not reached, shut compiler up */
1728 DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
1730 doc: /* Open a connection to a Nextstep display server.
1731 DISPLAY is the name of the display to connect to.
1732 Optional arguments XRM-STRING and MUST-SUCCEED are currently ignored. */)
1733 (display, resource_string, must_succeed)
1734 Lisp_Object display, resource_string, must_succeed;
1736 struct ns_display_info *dpyinfo;
1738 CHECK_STRING (display);
1740 nxatoms_of_nsselect ();
1741 dpyinfo = ns_term_init (display);
1744 if (!NILP (must_succeed))
1745 fatal ("OpenStep on %s not responding.\n",
1748 error ("OpenStep on %s not responding.\n",
1752 /* Register our external input/output types, used for determining
1753 applicable services and also drag/drop eligibility. */
1754 ns_send_types = [[NSArray arrayWithObject: NSStringPboardType] retain];
1755 ns_return_types = [[NSArray arrayWithObject: NSStringPboardType] retain];
1756 ns_drag_types = [[NSArray arrayWithObjects:
1758 NSTabularTextPboardType,
1759 NSFilenamesPboardType,
1762 NSFontPboardType, nil] retain];
1768 DEFUN ("x-close-connection", Fx_close_connection, Sx_close_connection,
1770 doc: /* Close the connection to the current Nextstep display server.
1771 The second argument DISPLAY is currently ignored. */)
1773 Lisp_Object display;
1776 #ifdef NS_IMPL_COCOA
1779 /*ns_delete_terminal (dpyinfo->terminal); */
1780 [NSApp terminate: NSApp];
1785 DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
1786 doc: /* Return the list of display names that Emacs has connections to. */)
1789 Lisp_Object tail, result;
1792 for (tail = ns_display_name_list; CONSP (tail); tail = XCDR (tail))
1793 result = Fcons (XCAR (XCAR (tail)), result);
1799 DEFUN ("ns-hide-others", Fns_hide_others, Sns_hide_others,
1801 doc: /* Hides all applications other than emacs. */)
1805 [NSApp hideOtherApplications: NSApp];
1809 DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs,
1811 doc: /* If ON is non-nil, the entire emacs application is hidden.
1812 Otherwise if emacs is hidden, it is unhidden.
1813 If ON is equal to `activate', emacs is unhidden and becomes
1814 the active application. */)
1819 if (EQ (on, intern ("activate")))
1821 [NSApp unhide: NSApp];
1822 [NSApp activateIgnoringOtherApps: YES];
1825 [NSApp unhide: NSApp];
1827 [NSApp hide: NSApp];
1832 DEFUN ("ns-emacs-info-panel", Fns_emacs_info_panel, Sns_emacs_info_panel,
1834 doc: /* Shows the 'Info' or 'About' panel for Emacs. */)
1838 [NSApp orderFrontStandardAboutPanel: nil];
1843 DEFUN ("ns-font-name", Fns_font_name, Sns_font_name, 1, 1, 0,
1844 doc: /* Determine font postscript or family name for font NAME.
1845 NAME should be a string containing either the font name or an XLFD
1846 font descriptor. If string contains `fontset' and not
1847 `fontset-startup', it is left alone. */)
1852 CHECK_STRING (name);
1857 if (strstr (nm, "fontset") && !strstr (nm, "fontset-startup"))
1860 return build_string (ns_xlfd_to_fontname (SDATA (name)));
1864 DEFUN ("ns-list-colors", Fns_list_colors, Sns_list_colors, 0, 1, 0,
1865 doc: /* Return a list of all available colors.
1866 The optional argument FRAME is currently ignored. */)
1870 Lisp_Object list = Qnil;
1871 NSEnumerator *colorlists;
1876 CHECK_FRAME (frame);
1877 if (! FRAME_NS_P (XFRAME (frame)))
1878 error ("non-Nextstep frame used in `ns-list-colors'");
1883 colorlists = [[NSColorList availableColorLists] objectEnumerator];
1884 while (clist = [colorlists nextObject])
1886 if ([[clist name] length] < 7 ||
1887 [[clist name] rangeOfString: @"PANTONE"].location == 0)
1889 NSEnumerator *cnames = [[clist allKeys] reverseObjectEnumerator];
1891 while (cname = [cnames nextObject])
1892 list = Fcons (build_string ([cname UTF8String]), list);
1893 /* for (i = [[clist allKeys] count] - 1; i >= 0; i--)
1894 list = Fcons (build_string ([[[clist allKeys] objectAtIndex: i]
1895 UTF8String]), list); */
1905 DEFUN ("ns-list-services", Fns_list_services, Sns_list_services, 0, 0, 0,
1906 doc: /* List available Nextstep services by querying NSApp. */)
1909 Lisp_Object ret = Qnil;
1914 svcs = [[NSMenu alloc] initWithTitle: @"Services"];
1915 [NSApp setServicesMenu: svcs]; /* this and next rebuild on <10.4 */
1916 [NSApp registerServicesMenuSendTypes: ns_send_types
1917 returnTypes: ns_return_types];
1919 /* On Tiger, services menu updating was made lazier (waits for user to
1920 actually click on the menu), so we have to force things along: */
1921 #ifdef NS_IMPL_COCOA
1922 if (NSAppKitVersionNumber >= 744.0)
1924 delegate = [svcs delegate];
1925 if (delegate != nil)
1927 if ([delegate respondsToSelector: @selector (menuNeedsUpdate:)])
1928 [delegate menuNeedsUpdate: svcs];
1929 if ([delegate respondsToSelector:
1930 @selector (menu:updateItem:atIndex:shouldCancel:)])
1932 int i, len = [delegate numberOfItemsInMenu: svcs];
1933 for (i =0; i<len; i++)
1934 [svcs addItemWithTitle: @"" action: NULL keyEquivalent: @""];
1935 for (i =0; i<len; i++)
1936 if (![delegate menu: svcs
1937 updateItem: (NSMenuItem *)[svcs itemAtIndex: i]
1938 atIndex: i shouldCancel: NO])
1945 [svcs setAutoenablesItems: NO];
1946 #ifdef NS_IMPL_COCOA
1947 [svcs update]; /* on OS X, converts from '/' structure */
1950 ret = interpret_services_menu (svcs, Qnil, ret);
1955 DEFUN ("ns-perform-service", Fns_perform_service, Sns_perform_service,
1957 doc: /* Perform Nextstep SERVICE on SEND.
1958 SEND should be either a string or nil.
1959 The return value is the result of the service, as string, or nil if
1960 there was no result. */)
1962 Lisp_Object service, send;
1969 CHECK_STRING (service);
1972 utfStr = SDATA (service);
1973 svcName = [NSString stringWithUTF8String: utfStr];
1975 pb =[NSPasteboard pasteboardWithUniqueName];
1976 ns_string_to_pasteboard (pb, send);
1978 if (NSPerformService (svcName, pb) == NO)
1979 Fsignal (Qquit, Fcons (build_string ("service not available"), Qnil));
1981 if ([[pb types] count] == 0)
1982 return build_string ("");
1983 return ns_string_from_pasteboard (pb);
1987 DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc,
1988 Sns_convert_utf8_nfd_to_nfc, 1, 1, 0,
1989 doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */)
1996 utfStr = [[NSString stringWithUTF8String: SDATA (str)]
1997 precomposedStringWithCanonicalMapping];
1998 return build_string ([utfStr UTF8String]);
2002 /* ==========================================================================
2004 Miscellaneous functions not called through hooks
2006 ========================================================================== */
2009 /* 23: call in image.c */
2011 check_x_frame (Lisp_Object frame)
2013 return check_ns_frame (frame);
2016 /* 23: added, due to call in frame.c */
2017 struct ns_display_info *
2018 check_x_display_info (Lisp_Object frame)
2020 return check_ns_display_info (frame);
2024 /* 23: new function; we don't have much in the way of flexibility though */
2026 x_set_scroll_bar_default_width (f)
2029 int wid = FRAME_COLUMN_WIDTH (f);
2030 FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = NS_SCROLL_BAR_WIDTH_DEFAULT;
2031 FRAME_CONFIG_SCROLL_BAR_COLS (f) = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) +
2036 /* 23: terms now impl this instead of x-get-resource directly */
2038 x_get_string_resource (XrmDatabase rdb, char *name, char *class)
2040 /* remove appname prefix; TODO: allow for !="Emacs" */
2041 char *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0);
2045 /* Support emacs-20-style face resources for backwards compatibility */
2046 if (!strncmp (toCheck, "Face", 4))
2047 toCheck = name + (!strncmp (name, "emacs.", 6) ? 6 : 0);
2049 /*fprintf (stderr, "Checking '%s'\n", toCheck); */
2051 res = [[[NSUserDefaults standardUserDefaults] objectForKey:
2052 [NSString stringWithUTF8String: toCheck]] UTF8String];
2053 return !res ? NULL :
2054 (!strncasecmp (res, "YES", 3) ? "true" :
2055 (!strncasecmp (res, "NO", 2) ? "false" : res));
2060 x_get_focus_frame (struct frame *frame)
2062 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame);
2063 Lisp_Object nsfocus;
2065 if (!dpyinfo->x_focus_frame)
2068 XSETFRAME (nsfocus, dpyinfo->x_focus_frame);
2074 x_pixel_width (struct frame *f)
2076 return FRAME_PIXEL_WIDTH (f);
2081 x_pixel_height (struct frame *f)
2083 return FRAME_PIXEL_HEIGHT (f);
2088 x_char_width (struct frame *f)
2090 return FRAME_COLUMN_WIDTH (f);
2095 x_char_height (struct frame *f)
2097 return FRAME_LINE_HEIGHT (f);
2102 x_screen_planes (struct frame *f)
2104 return FRAME_NS_DISPLAY_INFO (f)->n_planes;
2109 x_sync (Lisp_Object frame)
2111 /* XXX Not implemented XXX */
2117 /* ==========================================================================
2119 Lisp definitions that, for whatever reason, we can't alias as 'ns-XXX'.
2121 ========================================================================== */
2124 #ifdef NS_IMPL_COCOA
2126 /* Compile and execute the AppleScript SCRIPT and return the error
2127 status as function value. A zero is returned if compilation and
2128 execution is successful, in which case *RESULT is set to a Lisp
2129 string or a number containing the resulting script value. Otherwise,
2133 do_applescript (script, result)
2134 Lisp_Object script, *result;
2136 NSAppleEventDescriptor *desc;
2137 NSDictionary* errorDict;
2138 NSAppleEventDescriptor* returnDescriptor = NULL;
2140 NSAppleScript* scriptObject =
2141 [[NSAppleScript alloc] initWithSource:
2142 [NSString stringWithUTF8String: SDATA (script)]];
2144 returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
2145 [scriptObject release];
2149 if (returnDescriptor != NULL)
2151 // successful execution
2152 if (kAENullEvent != [returnDescriptor descriptorType])
2155 // script returned an AppleScript result
2156 if ((typeUnicodeText == [returnDescriptor descriptorType]) ||
2157 (typeUTF16ExternalRepresentation
2158 == [returnDescriptor descriptorType]) ||
2159 (typeUTF8Text == [returnDescriptor descriptorType]) ||
2160 (typeCString == [returnDescriptor descriptorType]))
2162 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2164 *result = build_string([[desc stringValue] UTF8String]);
2168 /* use typeUTF16ExternalRepresentation? */
2169 // coerce the result to the appropriate ObjC type
2170 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2172 *result = make_number([desc int32Value]);
2178 // no script result, return error
2184 DEFUN ("do-applescript", Fdo_applescript, Sdo_applescript, 1, 1, 0,
2185 doc: /* Execute AppleScript SCRIPT and return the result. If
2186 compilation and execution are successful, the resulting script value
2187 is returned as a string, a number or, in the case of other constructs,
2188 t. In case the execution fails, an error is signaled. */)
2195 CHECK_STRING (script);
2199 status = do_applescript (script, &result);
2203 else if (!STRINGP (result))
2204 error ("AppleScript error %d", status);
2206 error ("%s", SDATA (result));
2210 DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
2211 doc: /* Return t if the current Nextstep display supports the color COLOR.
2212 The optional argument FRAME is currently ignored. */)
2214 Lisp_Object color, frame;
2218 return ns_lisp_to_color (color, &col) ? Qnil : Qt;
2222 DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
2223 doc: /* Return a description of the color named COLOR.
2224 The value is a list of integer RGBA values--(RED GREEN BLUE ALPHA).
2225 These values appear to range from 0 to 65280; white is (65280 65280 65280 0).
2226 The optional argument FRAME is currently ignored. */)
2228 Lisp_Object color, frame;
2231 float red, green, blue, alpha;
2232 Lisp_Object rgba[4];
2235 CHECK_STRING (color);
2237 if (ns_lisp_to_color (color, &col))
2240 [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace]
2241 getRed: &red green: &green blue: &blue alpha: &alpha];
2242 rgba[0] = make_number (lrint (red*65280));
2243 rgba[1] = make_number (lrint (green*65280));
2244 rgba[2] = make_number (lrint (blue*65280));
2245 rgba[3] = make_number (lrint (alpha*65280));
2247 return Flist (4, rgba);
2251 DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
2252 doc: /* Return t if the Nextstep display supports color.
2253 The optional argument DISPLAY specifies which display to ask about.
2254 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2255 If omitted or nil, that stands for the selected frame's display. */)
2257 Lisp_Object display;
2259 NSWindowDepth depth;
2260 NSString *colorSpace;
2262 depth = [ns_get_screen (display) depth];
2263 colorSpace = NSColorSpaceFromDepth (depth);
2265 return [colorSpace isEqualToString: NSDeviceWhiteColorSpace]
2266 || [colorSpace isEqualToString: NSCalibratedWhiteColorSpace]
2271 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p,
2272 Sx_display_grayscale_p, 0, 1, 0,
2273 doc: /* Return t if the Nextstep display supports shades of gray.
2274 Note that color displays do support shades of gray.
2275 The optional argument DISPLAY specifies which display to ask about.
2276 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2277 If omitted or nil, that stands for the selected frame's display. */)
2279 Lisp_Object display;
2281 NSWindowDepth depth;
2283 depth = [ns_get_screen (display) depth];
2285 return NSBitsPerPixelFromDepth (depth) > 1 ? Qt : Qnil;
2289 DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
2291 doc: /* Returns the width in pixels of the Nextstep display DISPLAY.
2292 The optional argument DISPLAY specifies which display to ask about.
2293 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2294 If omitted or nil, that stands for the selected frame's display. */)
2296 Lisp_Object display;
2299 return make_number ((int) [ns_get_screen (display) frame].size.width);
2303 DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
2304 Sx_display_pixel_height, 0, 1, 0,
2305 doc: /* Returns the height in pixels of the Nextstep display DISPLAY.
2306 The optional argument DISPLAY specifies which display to ask about.
2307 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2308 If omitted or nil, that stands for the selected frame's display. */)
2310 Lisp_Object display;
2313 return make_number ((int) [ns_get_screen (display) frame].size.height);
2316 DEFUN ("display-usable-bounds", Fns_display_usable_bounds,
2317 Sns_display_usable_bounds, 0, 1, 0,
2318 doc: /*Return the bounds of the usable part of the screen.
2319 The return value is a list of integers (LEFT TOP WIDTH HEIGHT), which
2320 are the boundaries of the usable part of the screen, excluding areas
2321 reserved for the Mac menu, dock, and so forth.
2323 The screen queried corresponds to DISPLAY, which should be either a
2324 frame, a display name (a string), or terminal ID. If omitted or nil,
2325 that stands for the selected frame's display. */)
2327 Lisp_Object display;
2333 vScreen = [ns_get_screen (display) visibleFrame];
2334 top = vScreen.origin.y == 0.0 ?
2335 (int) [ns_get_screen (display) frame].size.height - vScreen.size.height : 0;
2337 return list4 (make_number ((int) vScreen.origin.x),
2339 make_number ((int) vScreen.size.width),
2340 make_number ((int) vScreen.size.height));
2344 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
2346 doc: /* Returns the number of bitplanes of the Nextstep display DISPLAY.
2347 The optional argument DISPLAY specifies which display to ask about.
2348 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2349 If omitted or nil, that stands for the selected frame's display. */)
2351 Lisp_Object display;
2355 (NSBitsPerSampleFromDepth ([ns_get_screen (display) depth]));
2359 DEFUN ("x-display-color-cells", Fx_display_color_cells,
2360 Sx_display_color_cells, 0, 1, 0,
2361 doc: /* Returns the number of color cells of the Nextstep display DISPLAY.
2362 The optional argument DISPLAY specifies which display to ask about.
2363 DISPLAY should be either a frame, a display name (a string), or terminal ID.
2364 If omitted or nil, that stands for the selected frame's display. */)
2366 Lisp_Object display;
2369 struct ns_display_info *dpyinfo = check_ns_display_info (display);
2371 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2372 return make_number (1 << min (dpyinfo->n_planes, 24));
2376 /* Unused dummy def needed for compatibility. */
2377 Lisp_Object tip_frame;
2379 /* TODO: move to xdisp or similar */
2381 compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y)
2383 Lisp_Object parms, dx, dy;
2385 int *root_x, *root_y;
2387 Lisp_Object left, top;
2388 EmacsView *view = FRAME_NS_VIEW (f);
2391 /* Start with user-specified or mouse position. */
2392 left = Fcdr (Fassq (Qleft, parms));
2393 if (INTEGERP (left))
2396 pt.x = last_mouse_motion_position.x;
2397 top = Fcdr (Fassq (Qtop, parms));
2401 pt.y = last_mouse_motion_position.y;
2403 /* Convert to screen coordinates */
2404 pt = [view convertPoint: pt toView: nil];
2405 pt = [[view window] convertBaseToScreen: pt];
2407 /* Ensure in bounds. (Note, screen origin = lower left.) */
2408 if (pt.x + XINT (dx) <= 0)
2409 *root_x = 0; /* Can happen for negative dx */
2410 else if (pt.x + XINT (dx) + width <= FRAME_NS_DISPLAY_INFO (f)->width)
2411 /* It fits to the right of the pointer. */
2412 *root_x = pt.x + XINT (dx);
2413 else if (width + XINT (dx) <= pt.x)
2414 /* It fits to the left of the pointer. */
2415 *root_x = pt.x - width - XINT (dx);
2417 /* Put it left justified on the screen -- it ought to fit that way. */
2420 if (pt.y - XINT (dy) - height >= 0)
2421 /* It fits below the pointer. */
2422 *root_y = pt.y - height - XINT (dy);
2423 else if (pt.y + XINT (dy) + height <= FRAME_NS_DISPLAY_INFO (f)->height)
2424 /* It fits above the pointer */
2425 *root_y = pt.y + XINT (dy);
2427 /* Put it on the top. */
2428 *root_y = FRAME_NS_DISPLAY_INFO (f)->height - height;
2432 DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
2433 doc: /* Show STRING in a "tooltip" window on frame FRAME.
2434 A tooltip window is a small window displaying a string.
2436 FRAME nil or omitted means use the selected frame.
2438 PARMS is an optional list of frame parameters which can be used to
2439 change the tooltip's appearance.
2441 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
2442 means use the default timeout of 5 seconds.
2444 If the list of frame parameters PARMS contains a `left' parameter,
2445 the tooltip is displayed at that x-position. Otherwise it is
2446 displayed at the mouse position, with offset DX added (default is 5 if
2447 DX isn't specified). Likewise for the y-position; if a `top' frame
2448 parameter is specified, it determines the y-position of the tooltip
2449 window, otherwise it is displayed at the mouse position, with offset
2450 DY added (default is -10).
2452 A tooltip's maximum size is specified by `x-max-tooltip-size'.
2453 Text larger than the specified size is clipped. */)
2454 (string, frame, parms, timeout, dx, dy)
2455 Lisp_Object string, frame, parms, timeout, dx, dy;
2458 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2459 int count = SPECPDL_INDEX ();
2464 specbind (Qinhibit_redisplay, Qt);
2466 GCPRO4 (string, parms, frame, timeout);
2468 CHECK_STRING (string);
2469 str = SDATA (string);
2470 f = check_x_frame (frame);
2472 timeout = make_number (5);
2474 CHECK_NATNUM (timeout);
2477 dx = make_number (5);
2482 dy = make_number (-10);
2487 if (ns_tooltip == nil)
2488 ns_tooltip = [[EmacsTooltip alloc] init];
2492 [ns_tooltip setText: str];
2493 size = [ns_tooltip frame].size;
2495 /* Move the tooltip window where the mouse pointer is. Resize and
2497 compute_tip_xy (f, parms, dx, dy, (int)size.width, (int)size.height,
2500 [ns_tooltip showAtX: root_x Y: root_y for: XINT (timeout)];
2504 return unbind_to (count, Qnil);
2508 DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
2509 doc: /* Hide the current tooltip window, if there is any.
2510 Value is t if tooltip was open, nil otherwise. */)
2513 if (ns_tooltip == nil || ![ns_tooltip isActive])
2520 /* ==========================================================================
2522 Class implementations
2524 ========================================================================== */
2527 @implementation EmacsSavePanel
2528 #ifdef NS_IMPL_COCOA
2529 /* --------------------------------------------------------------------------
2530 These are overridden to intercept on OS X: ending panel restarts NSApp
2531 event loop if it is stopped. Not sure if this is correct behavior,
2532 perhaps should check if running and if so send an appdefined.
2533 -------------------------------------------------------------------------- */
2534 - (void) ok: (id)sender
2540 - (void) cancel: (id)sender
2542 [super cancel: sender];
2549 @implementation EmacsOpenPanel
2550 #ifdef NS_IMPL_COCOA
2551 /* --------------------------------------------------------------------------
2552 These are overridden to intercept on OS X: ending panel restarts NSApp
2553 event loop if it is stopped. Not sure if this is correct behavior,
2554 perhaps should check if running and if so send an appdefined.
2555 -------------------------------------------------------------------------- */
2556 - (void) ok: (id)sender
2562 - (void) cancel: (id)sender
2564 [super cancel: sender];
2571 @implementation EmacsFileDelegate
2572 /* --------------------------------------------------------------------------
2573 Delegate methods for Open/Save panels
2574 -------------------------------------------------------------------------- */
2575 - (BOOL)panel: (id)sender isValidFilename: (NSString *)filename
2579 - (BOOL)panel: (id)sender shouldShowFilename: (NSString *)filename
2583 - (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
2584 confirmed: (BOOL)okFlag
2592 /* ==========================================================================
2594 Lisp interface declaration
2596 ========================================================================== */
2604 Qns_frame_parameter = intern ("ns-frame-parameter");
2605 staticpro (&Qns_frame_parameter);
2606 Qnone = intern ("none");
2608 Qbuffered = intern ("bufferd");
2609 staticpro (&Qbuffered);
2610 Qfontsize = intern ("fontsize");
2611 staticpro (&Qfontsize);
2613 DEFVAR_LISP ("ns-icon-type-alist", &Vns_icon_type_alist,
2614 doc: /* Alist of elements (REGEXP . IMAGE) for images of icons associated to frames.
2615 If the title of a frame matches REGEXP, then IMAGE.tiff is
2616 selected as the image of the icon representing the frame when it's
2617 miniaturized. If an element is t, then Emacs tries to select an icon
2618 based on the filetype of the visited file.
2620 The images have to be installed in a folder called English.lproj in the
2621 Emacs folder. You have to restart Emacs after installing new icons.
2623 Example: Install an icon Gnus.tiff and execute the following code
2625 (setq ns-icon-type-alist
2626 (append ns-icon-type-alist
2627 '((\"^\\\\*\\\\(Group\\\\*$\\\\|Summary \\\\|Article\\\\*$\\\\)\"
2630 When you miniaturize a Group, Summary or Article frame, Gnus.tiff will
2631 be used as the image of the icon representing the frame. */);
2632 Vns_icon_type_alist = Fcons (Qt, Qnil);
2634 defsubr (&Sns_read_file_name);
2635 defsubr (&Sns_get_resource);
2636 defsubr (&Sns_set_resource);
2637 defsubr (&Sxw_display_color_p); /* this and next called directly by C code */
2638 defsubr (&Sx_display_grayscale_p);
2639 defsubr (&Sns_font_name);
2640 defsubr (&Sns_list_colors);
2641 #ifdef NS_IMPL_COCOA
2642 defsubr (&Sdo_applescript);
2644 defsubr (&Sxw_color_defined_p);
2645 defsubr (&Sxw_color_values);
2646 defsubr (&Sx_server_max_request_size);
2647 defsubr (&Sx_server_vendor);
2648 defsubr (&Sx_server_version);
2649 defsubr (&Sx_display_pixel_width);
2650 defsubr (&Sx_display_pixel_height);
2651 defsubr (&Sns_display_usable_bounds);
2652 defsubr (&Sx_display_mm_width);
2653 defsubr (&Sx_display_mm_height);
2654 defsubr (&Sx_display_screens);
2655 defsubr (&Sx_display_planes);
2656 defsubr (&Sx_display_color_cells);
2657 defsubr (&Sx_display_visual_class);
2658 defsubr (&Sx_display_backing_store);
2659 defsubr (&Sx_display_save_under);
2660 defsubr (&Sx_create_frame);
2661 defsubr (&Sns_set_alpha);
2662 defsubr (&Sx_open_connection);
2663 defsubr (&Sx_close_connection);
2664 defsubr (&Sx_display_list);
2666 defsubr (&Sns_hide_others);
2667 defsubr (&Sns_hide_emacs);
2668 defsubr (&Sns_emacs_info_panel);
2669 defsubr (&Sns_list_services);
2670 defsubr (&Sns_perform_service);
2671 defsubr (&Sns_convert_utf8_nfd_to_nfc);
2672 defsubr (&Sx_focus_frame);
2673 defsubr (&Sns_popup_prefs_panel);
2674 defsubr (&Sns_popup_font_panel);
2675 defsubr (&Sns_popup_color_panel);
2677 defsubr (&Sx_show_tip);
2678 defsubr (&Sx_hide_tip);
2680 /* used only in fontset.c */
2681 check_window_system_func = check_ns;
2685 // arch-tag: dc2a3f74-1123-4daa-8eed-fb78db6a5642