Remove support for Mac Carbon.
[bpt/emacs.git] / src / nsfns.m
CommitLineData
edfda783 1/* Functions for the NeXT/Open/GNUstep and MacOSX window system.
edfda783 2 Copyright (C) 1989, 1992, 1993, 1994, 2005, 2006, 2008
32d235f8 3 Free Software Foundation, Inc.
edfda783
AR
4
5This file is part of GNU Emacs.
6
32d235f8 7GNU Emacs is free software: you can redistribute it and/or modify
edfda783 8it under the terms of the GNU General Public License as published by
32d235f8
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
edfda783
AR
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
32d235f8 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
edfda783 19
32d235f8 20/*
edfda783
AR
21Originally by Carl Edman
22Updated by Christian Limpach (chris@nice.ch)
23OpenStep/Rhapsody port by Scott Bender (sbender@harmony-ds.com)
24MacOSX/Aqua port by Christophe de Dinechin (descubes@earthlink.net)
25GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)
edfda783
AR
26*/
27
28#include <signal.h>
29#include <math.h>
30#include "config.h"
31#include "lisp.h"
32#include "blockinput.h"
33#include "nsterm.h"
34#include "window.h"
35#include "buffer.h"
36#include "keyboard.h"
37#include "termhooks.h"
38#include "fontset.h"
39
40#include "character.h"
41#include "font.h"
42
43#if 0
44int fns_trace_num = 1;
45#define NSTRACE(x) fprintf (stderr, "%s:%d: [%d] " #x "\n", \
46 __FILE__, __LINE__, ++fns_trace_num)
47#else
48#define NSTRACE(x)
49#endif
50
51#ifdef HAVE_NS
52
53extern NSArray *ns_send_types, *ns_return_types, *ns_drag_types;
54
55extern Lisp_Object Qforeground_color;
56extern Lisp_Object Qbackground_color;
57extern Lisp_Object Qcursor_color;
58extern Lisp_Object Qinternal_border_width;
59extern Lisp_Object Qvisibility;
60extern Lisp_Object Qcursor_type;
61extern Lisp_Object Qicon_type;
62extern Lisp_Object Qicon_name;
63extern Lisp_Object Qicon_left;
64extern Lisp_Object Qicon_top;
65extern Lisp_Object Qleft;
66extern Lisp_Object Qright;
67extern Lisp_Object Qtop;
68extern Lisp_Object Qdisplay;
69extern Lisp_Object Qvertical_scroll_bars;
70extern Lisp_Object Qauto_raise;
71extern Lisp_Object Qauto_lower;
72extern Lisp_Object Qbox;
73extern Lisp_Object Qscroll_bar_width;
74extern Lisp_Object Qx_resource_name;
75extern Lisp_Object Qface_set_after_frame_default;
76extern Lisp_Object Qunderline, Qundefined;
77extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
78extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle;
79
80Lisp_Object Qnone;
81Lisp_Object Qns_frame_parameter;
82Lisp_Object Qbuffered;
83Lisp_Object Qfontsize;
84
85/* hack for OS X file panels */
86char panelOK = 0;
87
88/* Alist of elements (REGEXP . IMAGE) for images of icons associated
89 to frames.*/
90Lisp_Object Vns_icon_type_alist;
91
92EmacsTooltip *ns_tooltip;
93
94/* Need forward declaration here to preserve organizational integrity of file */
9e50ff0c 95Lisp_Object Fx_open_connection (Lisp_Object, Lisp_Object, Lisp_Object);
edfda783
AR
96
97extern BOOL ns_in_resize;
98
99
100/* ==========================================================================
101
102 Internal utility functions
103
104 ========================================================================== */
105
106
107void
108check_ns (void)
109{
110 if (NSApp == nil)
111 error ("OpenStep is not in use or not initialized");
112}
113
114
115/* Nonzero if we can use mouse menus. */
116int
117have_menus_p ()
118{
119 return NSApp != nil;
120}
121
122
123/* Extract a frame as a FRAME_PTR, defaulting to the selected frame
124 and checking validity for NS. */
125static FRAME_PTR
126check_ns_frame (Lisp_Object frame)
127{
128 FRAME_PTR f;
129
130 if (NILP (frame))
131 f = SELECTED_FRAME ();
132 else
133 {
134 CHECK_LIVE_FRAME (frame);
135 f = XFRAME (frame);
136 }
137 if (! FRAME_NS_P (f))
d26fbe1a 138 error ("non-Nextstep frame used");
edfda783
AR
139 return f;
140}
141
142
d26fbe1a
CY
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. */
edfda783
AR
146static struct ns_display_info *
147check_ns_display_info (Lisp_Object frame)
148{
149 if (NILP (frame))
150 {
151 struct frame *f = SELECTED_FRAME ();
152 if (FRAME_NS_P (f) && FRAME_LIVE_P (f) )
153 return FRAME_NS_DISPLAY_INFO (f);
9e50ff0c
DN
154 else if (x_display_list != 0)
155 return x_display_list;
edfda783 156 else
d26fbe1a 157 error ("Nextstep windows are not in use or not initialized");
edfda783
AR
158 }
159 else if (INTEGERP (frame))
160 {
161 struct terminal *t = get_terminal (frame, 1);
162
163 if (t->type != output_ns)
d26fbe1a 164 error ("Terminal %d is not a Nextstep display", XINT (frame));
edfda783
AR
165
166 return t->display_info.ns;
167 }
168 else if (STRINGP (frame))
169 return ns_display_info_for_name (frame);
170 else
171 {
172 FRAME_PTR f;
173
174 CHECK_LIVE_FRAME (frame);
175 f = XFRAME (frame);
176 if (! FRAME_NS_P (f))
d26fbe1a 177 error ("non-Nextstep frame used");
edfda783
AR
178 return FRAME_NS_DISPLAY_INFO (f);
179 }
180 return NULL; /* shut compiler up */
181}
182
183
184static id
185ns_get_window (Lisp_Object maybeFrame)
186{
187 id view =nil, window =nil;
188
189 if (!FRAMEP (maybeFrame) || !FRAME_NS_P (XFRAME (maybeFrame)))
190 maybeFrame = selected_frame;/*wrong_type_argument (Qframep, maybeFrame); */
191
192 if (!NILP (maybeFrame))
193 view = FRAME_NS_VIEW (XFRAME (maybeFrame));
194 if (view) window =[view window];
195
196 return window;
197}
198
199
200static NSScreen *
201ns_get_screen (Lisp_Object anythingUnderTheSun)
202{
203 id window =nil;
204 NSScreen *screen = 0;
205
206 struct terminal *terminal;
207 struct ns_display_info *dpyinfo;
208 struct frame *f = NULL;
209 Lisp_Object frame;
210
211 if (INTEGERP (anythingUnderTheSun)) {
212 /* we got a terminal */
213 terminal = get_terminal (anythingUnderTheSun, 1);
214 dpyinfo = terminal->display_info.ns;
9e50ff0c 215 f = dpyinfo->x_focus_frame;
edfda783 216 if (!f)
9e50ff0c 217 f = dpyinfo->x_highlight_frame;
edfda783
AR
218
219 } else if (FRAMEP (anythingUnderTheSun) &&
220 FRAME_NS_P (XFRAME (anythingUnderTheSun))) {
221 /* we got a frame */
222 f = XFRAME (anythingUnderTheSun);
223
224 } else if (STRINGP (anythingUnderTheSun)) { /* FIXME/cl for multi-display */
225 }
226
227 if (!f)
228 f = SELECTED_FRAME ();
229 if (f)
230 {
231 XSETFRAME (frame, f);
232 window = ns_get_window (frame);
233 }
234
235 if (window)
236 screen = [window screen];
237 if (!screen)
238 screen = [NSScreen mainScreen];
239
240 return screen;
241}
242
243
244/* Return the X display structure for the display named NAME.
245 Open a new connection if necessary. */
246struct ns_display_info *
247ns_display_info_for_name (name)
248 Lisp_Object name;
249{
250 Lisp_Object names;
251 struct ns_display_info *dpyinfo;
252
253 CHECK_STRING (name);
254
9e50ff0c 255 for (dpyinfo = x_display_list, names = ns_display_name_list;
edfda783
AR
256 dpyinfo;
257 dpyinfo = dpyinfo->next, names = XCDR (names))
258 {
259 Lisp_Object tem;
260 tem = Fstring_equal (XCAR (XCAR (names)), name);
261 if (!NILP (tem))
262 return dpyinfo;
263 }
264
265 error ("Emacs for OpenStep does not yet support multi-display.");
266
9e50ff0c
DN
267 Fx_open_connection (name, Qnil, Qnil);
268 dpyinfo = x_display_list;
edfda783
AR
269
270 if (dpyinfo == 0)
facfbbbd 271 error ("OpenStep on %s not responding.\n", SDATA (name));
edfda783
AR
272
273 return dpyinfo;
274}
275
276
277static Lisp_Object
278interpret_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 -------------------------------------------------------------------------- */
282{
283 int i, count;
284 id<NSMenuItem> item;
285 const char *name;
286 Lisp_Object nameStr;
287 unsigned short key;
288 NSString *keys;
289 Lisp_Object res;
290
291 count = [menu numberOfItems];
292 for (i = 0; i<count; i++)
293 {
294 item = [menu itemAtIndex: i];
295 name = [[item title] UTF8String];
296 if (!name) continue;
297
298 nameStr = build_string (name);
299
300 if ([item hasSubmenu])
301 {
302 old = interpret_services_menu ([item submenu],
303 Fcons (nameStr, prefix), old);
304 }
305 else
306 {
307 keys = [item keyEquivalent];
308 if (keys && [keys length] )
309 {
310 key = [keys characterAtIndex: 0];
311 res = make_number (key|super_modifier);
312 }
313 else
314 {
315 res = Qundefined;
316 }
317 old = Fcons (Fcons (res,
318 Freverse (Fcons (nameStr,
319 prefix))),
320 old);
321 }
322 }
323 return old;
324}
325
326
327
328/* ==========================================================================
329
330 Frame parameter setters
331
332 ========================================================================== */
333
334
335static void
336ns_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
337{
338 NSColor *col;
339
340 if (ns_lisp_to_color (arg, &col))
341 {
342 store_frame_param (f, Qforeground_color, oldval);
343 error ("Unknown color");
344 }
345
346 [col retain];
347 [f->output_data.ns->foreground_color release];
348 f->output_data.ns->foreground_color = col;
349
350 if (FRAME_NS_VIEW (f))
351 {
352 update_face_from_frame_parameter (f, Qforeground_color, arg);
353 /*recompute_basic_faces (f); */
354 if (FRAME_VISIBLE_P (f))
355 redraw_frame (f);
356 }
357}
358
359
360static void
361ns_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
362{
363 struct face *face;
364 NSColor *col;
365 NSView *view = FRAME_NS_VIEW (f);
366 float alpha;
367
368 if (ns_lisp_to_color (arg, &col))
369 {
370 store_frame_param (f, Qbackground_color, oldval);
371 error ("Unknown color");
372 }
373
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))
377 ns_clear_frame (f);
378
379 [col retain];
380 [f->output_data.ns->background_color release];
381 f->output_data.ns->background_color = col;
382 if (view != nil)
383 {
384 [[view window] setBackgroundColor: col];
385 alpha = [col alphaComponent];
386
387#ifdef NS_IMPL_COCOA
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];
393#endif
394
395 if (alpha != 1.0)
396 [[view window] setOpaque: NO];
397 else
398 [[view window] setOpaque: YES];
399
400 face = FRAME_DEFAULT_FACE (f);
401 if (face)
402 {
45d325c4 403 col = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f);
facfbbbd
SM
404 face->background
405 = (EMACS_UINT) [[col colorWithAlphaComponent: alpha] retain];
edfda783
AR
406 [col release];
407
408 update_face_from_frame_parameter (f, Qbackground_color, arg);
409 }
410
411 if (FRAME_VISIBLE_P (f))
412 redraw_frame (f);
413 }
414}
415
416
417static void
418ns_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
419{
420 NSColor *col;
421
422 if (ns_lisp_to_color (arg, &col))
423 {
424 store_frame_param (f, Qcursor_color, oldval);
425 error ("Unknown color");
426 }
427
428 [f->output_data.ns->desired_cursor_color release];
429 f->output_data.ns->desired_cursor_color = [col retain];
430
431 if (FRAME_VISIBLE_P (f))
432 {
433 x_update_cursor (f, 0);
434 x_update_cursor (f, 1);
435 }
436 update_face_from_frame_parameter (f, Qcursor_color, arg);
437}
438
439
440static void
441ns_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
442{
443 NSView *view = FRAME_NS_VIEW (f);
444 NSTRACE (ns_set_icon_name);
445
446 if (ns_in_resize)
447 return;
448
449 /* see if it's changed */
450 if (STRINGP (arg))
451 {
452 if (STRINGP (oldval) && EQ (Fstring_equal (oldval, arg), Qt))
453 return;
454 }
455 else if (!STRINGP (oldval) && EQ (oldval, Qnil) == EQ (arg, Qnil))
456 return;
457
458 f->icon_name = arg;
459
460 if (NILP (arg))
461 {
462 if (!NILP (f->title))
463 arg = f->title;
464 else
465 /* explicit name and no icon-name -> explicit_name */
466 if (f->explicit_name)
467 arg = f->name;
468 else
469 {
470 /* no explicit name and no icon-name ->
471 name has to be rebuild from icon_title_format */
472 windows_or_buffers_changed++;
473 return;
474 }
475 }
476
477 /* Don't change the name if it's already NAME. */
478 if ([[view window] miniwindowTitle] &&
479 ([[[view window] miniwindowTitle]
480 isEqualToString: [NSString stringWithUTF8String:
facfbbbd 481 SDATA (arg)]]))
edfda783
AR
482 return;
483
484 [[view window] setMiniwindowTitle:
facfbbbd 485 [NSString stringWithUTF8String: SDATA (arg)]];
edfda783
AR
486}
487
488
489static void
490ns_set_name_iconic (struct frame *f, Lisp_Object name, int explicit)
491{
492 NSView *view = FRAME_NS_VIEW (f);
493 NSTRACE (ns_set_name_iconic);
494
495 if (ns_in_resize)
496 return;
497
498 /* Make sure that requests from lisp code override requests from
499 Emacs redisplay code. */
500 if (explicit)
501 {
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;
506
507 f->explicit_name = ! NILP (name);
508 }
509 else if (f->explicit_name)
510 name = f->name;
511
512 /* title overrides explicit name */
513 if (! NILP (f->title))
514 name = f->title;
515
516 /* icon_name overrides title and explicit name */
517 if (! NILP (f->icon_name))
518 name = f->icon_name;
519
520 if (NILP (name))
521 name = build_string
522 ([[[NSProcessInfo processInfo] processName] UTF8String]);
523 else
524 CHECK_STRING (name);
525
526 /* Don't change the name if it's already NAME. */
527 if ([[view window] miniwindowTitle] &&
528 ([[[view window] miniwindowTitle]
529 isEqualToString: [NSString stringWithUTF8String:
facfbbbd 530 SDATA (name)]]))
edfda783
AR
531 return;
532
533 [[view window] setMiniwindowTitle:
facfbbbd 534 [NSString stringWithUTF8String: SDATA (name)]];
edfda783
AR
535}
536
537
538static void
539ns_set_name (struct frame *f, Lisp_Object name, int explicit)
540{
541 NSView *view = FRAME_NS_VIEW (f);
542 NSTRACE (ns_set_name);
543
544 if (ns_in_resize)
545 return;
546
547 /* Make sure that requests from lisp code override requests from
548 Emacs redisplay code. */
549 if (explicit)
550 {
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;
555
556 f->explicit_name = ! NILP (name);
557 }
558 else if (f->explicit_name)
559 return;
560
561 if (NILP (name))
562 name = build_string
563 ([[[NSProcessInfo processInfo] processName] UTF8String]);
564
565 f->name = name;
566
567 /* title overrides explicit name */
568 if (! NILP (f->title))
569 name = f->title;
570
571 CHECK_STRING (name);
572
573 /* Don't change the name if it's already NAME. */
574 if ([[[view window] title]
575 isEqualToString: [NSString stringWithUTF8String:
facfbbbd 576 SDATA (name)]])
edfda783
AR
577 return;
578 [[view window] setTitle: [NSString stringWithUTF8String:
facfbbbd 579 SDATA (name)]];
edfda783
AR
580}
581
582
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
585 redisplay code. */
586static void
587ns_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
588{
589 NSTRACE (ns_explicitly_set_name);
590 ns_set_name_iconic (f, arg, 1);
591 ns_set_name (f, arg, 1);
592}
593
594
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
597 lisp code. */
598void
599x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
600{
601 NSTRACE (x_implicitly_set_name);
602 if (FRAME_ICONIFIED_P (f))
603 ns_set_name_iconic (f, arg, 0);
604 else
605 ns_set_name (f, arg, 0);
606}
607
608
609/* Change the title of frame F to NAME.
610 If NAME is nil, use the frame name as the title.
611
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.
615
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. */
619static void
620ns_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
621{
622 NSTRACE (ns_set_title);
623 /* Don't change the title if it's already NAME. */
624 if (EQ (name, f->title))
625 return;
626
627 update_mode_lines = 1;
628
629 f->title = name;
630}
631
632
633void
634ns_set_name_as_filename (struct frame *f)
635{
636 NSView *view = FRAME_NS_VIEW (f);
637 Lisp_Object name;
638 Lisp_Object buf = XWINDOW (f->selected_window)->buffer;
639 const char *title;
640 NSAutoreleasePool *pool;
641 NSTRACE (ns_set_name_as_filename);
642
643 if (f->explicit_name || ! NILP (f->title) || ns_in_resize)
644 return;
645
646 BLOCK_INPUT;
647 pool = [[NSAutoreleasePool alloc] init];
648 name =XBUFFER (buf)->filename;
649 if (NILP (name) || FRAME_ICONIFIED_P (f)) name =XBUFFER (buf)->name;
650
651 if (FRAME_ICONIFIED_P (f) && !NILP (f->icon_name))
652 name = f->icon_name;
653
654 if (NILP (name))
655 name = build_string
656 ([[[NSProcessInfo processInfo] processName] UTF8String]);
657 else
658 CHECK_STRING (name);
659
660 title = FRAME_ICONIFIED_P (f) ? [[[view window] miniwindowTitle] UTF8String]
661 : [[[view window] title] UTF8String];
662
facfbbbd 663 if (title && (! strcmp (title, SDATA (name))))
edfda783
AR
664 {
665 [pool release];
666 UNBLOCK_INPUT;
667 return;
668 }
669
670 if (! FRAME_ICONIFIED_P (f))
671 {
672#ifdef NS_IMPL_COCOA
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 */
facfbbbd 676 NSString *str = [NSString stringWithUTF8String: SDATA (name)];
edfda783
AR
677 if (![[NSFileManager defaultManager] fileExistsAtPath: str])
678 {
679 [[view window] setTitleWithRepresentedFilename: @""];
680 [[view window] setTitle: str];
681 }
682 else
683 {
684 [[view window] setTitleWithRepresentedFilename: str];
685 }
686#else
687 [[view window] setTitleWithRepresentedFilename:
facfbbbd 688 [NSString stringWithUTF8String: SDATA (name)]];
edfda783
AR
689#endif
690 f->name = name;
691 }
692 else
693 {
694 [[view window] setMiniwindowTitle:
facfbbbd 695 [NSString stringWithUTF8String: SDATA (name)]];
edfda783
AR
696 }
697 [pool release];
698 UNBLOCK_INPUT;
699}
700
701
702void
703ns_set_doc_edited (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
704{
705 NSView *view = FRAME_NS_VIEW (f);
706 NSAutoreleasePool *pool;
707 BLOCK_INPUT;
708 pool = [[NSAutoreleasePool alloc] init];
709 [[view window] setDocumentEdited: !NILP (arg)];
710 [pool release];
711 UNBLOCK_INPUT;
712}
713
714
cc98b6a0
DN
715void
716x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
edfda783
AR
717{
718 int nlines;
719 int olines = FRAME_MENU_BAR_LINES (f);
720 if (FRAME_MINIBUF_ONLY_P (f))
721 return;
722
723 if (INTEGERP (value))
724 nlines = XINT (value);
725 else
726 nlines = 0;
727
728 FRAME_MENU_BAR_LINES (f) = 0;
729 if (nlines)
730 {
731 FRAME_EXTERNAL_MENU_BAR (f) = 1;
cc98b6a0
DN
732 /* does for all frames, whereas we just want for one frame
733 [NSMenu setMenuBarVisible: YES]; */
edfda783
AR
734 }
735 else
736 {
737 if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
738 free_frame_menubar (f);
cc98b6a0 739 /* [NSMenu setMenuBarVisible: NO]; */
edfda783
AR
740 FRAME_EXTERNAL_MENU_BAR (f) = 0;
741 }
742}
743
744
edfda783 745/* 23: toolbar support */
cc98b6a0
DN
746void
747x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
edfda783
AR
748{
749 int nlines;
750 Lisp_Object root_window;
751
752 if (FRAME_MINIBUF_ONLY_P (f))
753 return;
754
755 if (INTEGERP (value) && XINT (value) >= 0)
756 nlines = XFASTINT (value);
757 else
758 nlines = 0;
759
760 if (nlines)
761 {
762 FRAME_EXTERNAL_TOOL_BAR (f) = 1;
763 update_frame_tool_bar (f);
764 }
765 else
766 {
767 if (FRAME_EXTERNAL_TOOL_BAR (f))
768 {
769 free_frame_tool_bar (f);
770 FRAME_EXTERNAL_TOOL_BAR (f) = 0;
771 }
772 }
773
774 x_set_window_size (f, 0, f->text_cols, f->text_lines);
775}
776
777
edfda783
AR
778void
779ns_implicitly_set_icon_type (struct frame *f)
780{
781 Lisp_Object tem;
782 EmacsView *view = FRAME_NS_VIEW (f);
783 id image =nil;
784 Lisp_Object chain, elt;
785 NSAutoreleasePool *pool;
786 BOOL setMini = YES;
787
788 NSTRACE (ns_implicitly_set_icon_type);
789
790 BLOCK_INPUT;
791 pool = [[NSAutoreleasePool alloc] init];
792 if (f->output_data.ns->miniimage
facfbbbd 793 && [[NSString stringWithUTF8String: SDATA (f->name)]
edfda783
AR
794 isEqualToString: [(NSImage *)f->output_data.ns->miniimage name]])
795 {
796 [pool release];
797 UNBLOCK_INPUT;
798 return;
799 }
800
801 tem = assq_no_quit (Qicon_type, f->param_alist);
802 if (CONSP (tem) && ! NILP (XCDR (tem)))
803 {
804 [pool release];
805 UNBLOCK_INPUT;
806 return;
807 }
808
809 for (chain = Vns_icon_type_alist;
810 (image = nil) && CONSP (chain);
811 chain = XCDR (chain))
812 {
813 elt = XCAR (chain);
814 /* special case: 't' means go by file type */
facfbbbd 815 if (SYMBOLP (elt) && EQ (elt, Qt) && SDATA (f->name)[0] == '/')
edfda783 816 {
facfbbbd
SM
817 NSString *str
818 = [NSString stringWithUTF8String: SDATA (f->name)];
edfda783
AR
819 if ([[NSFileManager defaultManager] fileExistsAtPath: str])
820 image = [[[NSWorkspace sharedWorkspace] iconForFile: str] retain];
821 }
822 else if (CONSP (elt) &&
823 STRINGP (XCAR (elt)) &&
824 STRINGP (XCDR (elt)) &&
825 fast_string_match (XCAR (elt), f->name) >= 0)
826 {
827 image = [EmacsImage allocInitFromFile: XCDR (elt)];
828 if (image == nil)
829 image = [[NSImage imageNamed:
830 [NSString stringWithUTF8String:
facfbbbd 831 SDATA (XCDR (elt))]] retain];
edfda783
AR
832 }
833 }
834
835 if (image == nil)
836 {
837 image = [[[NSWorkspace sharedWorkspace] iconForFileType: @"text"] retain];
838 setMini = NO;
839 }
840
841 [f->output_data.ns->miniimage release];
842 f->output_data.ns->miniimage = image;
843 [view setMiniwindowImage: setMini];
844 [pool release];
845 UNBLOCK_INPUT;
846}
847
848
849static void
850ns_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
851{
852 EmacsView *view = FRAME_NS_VIEW (f);
853 id image = nil;
854 BOOL setMini = YES;
855
856 NSTRACE (ns_set_icon_type);
857
858 if (!NILP (arg) && SYMBOLP (arg))
859 {
facfbbbd 860 arg =build_string (SDATA (SYMBOL_NAME (arg)));
edfda783
AR
861 store_frame_param (f, Qicon_type, arg);
862 }
863
864 /* do it the implicit way */
865 if (NILP (arg))
866 {
867 ns_implicitly_set_icon_type (f);
868 return;
869 }
870
871 CHECK_STRING (arg);
872
873 image = [EmacsImage allocInitFromFile: arg];
874 if (image == nil)
875 image =[NSImage imageNamed: [NSString stringWithUTF8String:
facfbbbd 876 SDATA (arg)]];
edfda783
AR
877
878 if (image == nil)
879 {
880 image = [NSImage imageNamed: @"text"];
881 setMini = NO;
882 }
883
884 f->output_data.ns->miniimage = image;
885 [view setMiniwindowImage: setMini];
886}
887
888
889/* 23: added Xism; we stub out (we do implement this in ns-win.el) */
890int
891XParseGeometry (char *string, int *x, int *y,
892 unsigned int *width, unsigned int *height)
893{
894 message1 ("Warning: XParseGeometry not supported under NS.\n");
895 return 0;
896}
897
898
6fb5f7da 899/* TODO: move to nsterm? */
edfda783
AR
900int
901ns_lisp_to_cursor_type (Lisp_Object arg)
902{
903 char *str;
904 if (XTYPE (arg) == Lisp_String)
facfbbbd 905 str = SDATA (arg);
edfda783 906 else if (XTYPE (arg) == Lisp_Symbol)
facfbbbd 907 str = SDATA (SYMBOL_NAME (arg));
edfda783
AR
908 else return -1;
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;
914 return -1;
915}
916
917
918Lisp_Object
919ns_cursor_type_to_lisp (int arg)
920{
921 switch (arg)
922 {
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");
927 case no_highlight:
928 default: return intern ("no");
929 }
930}
931
932
933static void
934ns_set_cursor_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
935{
936 int val;
937
938 val = ns_lisp_to_cursor_type (arg);
939 if (val >= 0)
940 {
941 f->output_data.ns->desired_cursor =val;
942 }
943 else
944 {
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'.");
948 }
949
950 update_mode_lines++;
951}
952
953
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 ;) */
956static void
957ns_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
958{
d26fbe1a 959 /* don't think we can do this on Nextstep */
edfda783
AR
960}
961
962
963static void
952913d4 964x_icon (struct frame *f, Lisp_Object parms)
edfda783
AR
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 -------------------------------------------------------------------------- */
971{
972 Lisp_Object icon_x, icon_y;
973 struct ns_display_info *dpyinfo = check_ns_display_info (Qnil);
974
975 f->output_data.ns->icon_top = Qnil;
976 f->output_data.ns->icon_left = Qnil;
977
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))
982 {
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;
987 }
988 else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
989 error ("Both left and top icon corners of icon must be specified");
990}
991
992
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 */
996frame_parm_handler ns_frame_parm_handlers[] =
997{
998 x_set_autoraise, /* generic OK */
999 x_set_autolower, /* generic OK */
1000 ns_set_background_color,
d26fbe1a
CY
1001 0, /* x_set_border_color, may be impossible under Nextstep */
1002 0, /* x_set_border_width, may be impossible under Nextstep */
edfda783
AR
1003 ns_set_cursor_color,
1004 ns_set_cursor_type,
1005 x_set_font, /* generic OK */
1006 ns_set_foreground_color,
1007 ns_set_icon_name,
1008 ns_set_icon_type,
1009 x_set_internal_border_width, /* generic OK */
cc98b6a0 1010 x_set_menu_bar_lines,
edfda783
AR
1011 ns_set_mouse_color,
1012 ns_explicitly_set_name,
1013 x_set_scroll_bar_width, /* generic OK */
1014 ns_set_title,
1015 x_set_unsplittable, /* generic OK */
1016 x_set_vertical_scroll_bars, /* generic OK */
1017 x_set_visibility, /* generic OK */
cc98b6a0 1018 x_set_tool_bar_lines,
edfda783
AR
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 */
1028};
1029
1030
9e50ff0c 1031DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
edfda783 1032 1, 1, 0,
51d5ef9f 1033 doc: /* Make a new Nextstep window, called a \"frame\" in Emacs terms.
d26fbe1a
CY
1034Return an Emacs frame object.
1035PARMS is an alist of frame parameters.
1036If the parameters specify that the frame should not have a minibuffer,
1037and do not specify a specific minibuffer window to use,
1038then `default-minibuffer-frame' must be a frame whose minibuffer can
51d5ef9f 1039be shared by the new frame. */)
edfda783
AR
1040 (parms)
1041 Lisp_Object parms;
1042{
1043 static int desc_ctr = 1;
1044 struct frame *f;
1045 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1046 Lisp_Object frame, tem;
1047 Lisp_Object name;
1048 int minibuffer_only = 0;
1049 int count = specpdl_ptr - specpdl;
1050 Lisp_Object display;
1051 struct ns_display_info *dpyinfo = NULL;
1052 Lisp_Object parent;
1053 struct kboard *kb;
1054 Lisp_Object tfont, tfontsize;
1055 int window_prompting = 0;
1056 int width, height;
1057
1058 check_ns ();
1059
1060 display = x_get_arg (dpyinfo, parms, Qterminal, 0, 0, RES_TYPE_STRING);
1061 if (EQ (display, Qunbound))
1062 display = Qnil;
1063 dpyinfo = check_ns_display_info (display);
1064
1065 if (!dpyinfo->terminal->name)
1066 error ("Terminal is not live, can't create new frames on it");
1067
1068 kb = dpyinfo->terminal->kboard;
1069
1070 name = x_get_arg (dpyinfo, parms, Qname, 0, 0, RES_TYPE_STRING);
1071 if (!STRINGP (name)
1072 && ! EQ (name, Qunbound)
1073 && ! NILP (name))
1074 error ("Invalid frame name--not a string or nil");
1075
1076 if (STRINGP (name))
1077 Vx_resource_name = name;
1078
1079 parent = x_get_arg (dpyinfo, parms, Qparent_id, 0, 0, RES_TYPE_NUMBER);
1080 if (EQ (parent, Qunbound))
1081 parent = Qnil;
1082 if (! NILP (parent))
1083 CHECK_NUMBER (parent);
1084
1085 frame = Qnil;
1086 GCPRO4 (parms, parent, name, frame);
1087
1088 tem = x_get_arg (dpyinfo, parms, Qminibuffer, "minibuffer", "Minibuffer",
1089 RES_TYPE_SYMBOL);
1090 if (EQ (tem, Qnone) || NILP (tem))
1091 {
1092 f = make_frame_without_minibuffer (Qnil, kb, display);
1093 }
1094 else if (EQ (tem, Qonly))
1095 {
1096 f = make_minibuffer_frame ();
1097 minibuffer_only = 1;
1098 }
1099 else if (WINDOWP (tem))
1100 {
1101 f = make_frame_without_minibuffer (tem, kb, display);
1102 }
1103 else
1104 {
1105 f = make_frame (1);
1106 }
1107
1108 /* Set the name; the functions to which we pass f expect the name to
1109 be set. */
1110 if (EQ (name, Qunbound) || NILP (name) || (XTYPE (name) != Lisp_String))
1111 {
facfbbbd
SM
1112 f->name
1113 = build_string ([[[NSProcessInfo processInfo] processName] UTF8String]);
edfda783
AR
1114 f->explicit_name =0;
1115 }
1116 else
1117 {
1118 f->name = name;
1119 f->explicit_name = 1;
1120 specbind (Qx_resource_name, name);
1121 }
1122
1123 XSETFRAME (frame, f);
1124 FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
1125
1126 f->terminal = dpyinfo->terminal;
1127 f->terminal->reference_count++;
1128
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)));
1132
1133 FRAME_FONTSET (f) = -1;
1134
1135 /* record_unwind_protect (unwind_create_frame, frame); safety; maybe later? */
1136
1137 f->icon_name = x_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title",
1138 RES_TYPE_STRING);
1139 if (EQ (f->icon_name, Qunbound) || (XTYPE (f->icon_name) != Lisp_String))
1140 f->icon_name = Qnil;
1141
1142 FRAME_NS_DISPLAY_INFO (f) = dpyinfo;
1143
1144 f->output_data.ns->window_desc = desc_ctr++;
1145 if (!NILP (parent))
1146 {
1147 f->output_data.ns->parent_desc = (Window) XFASTINT (parent);
1148 f->output_data.ns->explicit_parent = 1;
1149 }
1150 else
1151 {
1152 f->output_data.ns->parent_desc = FRAME_NS_DISPLAY_INFO (f)->root_window;
1153 f->output_data.ns->explicit_parent = 0;
1154 }
1155
1156 f->resx = dpyinfo->resx;
1157 f->resy = dpyinfo->resy;
1158
1159 BLOCK_INPUT;
1160 register_font_driver (&nsfont_driver, f);
1161 x_default_parameter (f, parms, Qfont_backend, Qnil,
1162 "fontBackend", "FontBackend", RES_TYPE_STRING);
1163
1164 {
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);
1173 }
1174 UNBLOCK_INPUT;
1175
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",
1180 RES_TYPE_NUMBER);
1181
1182 /* default scrollbars on right on Mac */
1183 {
facfbbbd 1184 Lisp_Object spos
edfda783 1185#ifdef NS_IMPL_GNUSTEP
facfbbbd 1186 = Qt;
edfda783 1187#else
facfbbbd 1188 = Qright;
edfda783 1189#endif
facfbbbd
SM
1190 x_default_parameter (f, parms, Qvertical_scroll_bars, spos,
1191 "verticalScrollBars", "VerticalScrollBars",
1192 RES_TYPE_SYMBOL);
edfda783
AR
1193 }
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);
d26fbe1a 1200 /* FIXME: not suppported yet in Nextstep */
edfda783
AR
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);
1207 /* end PENDING */
1208
1209 init_frame_faces (f);
1210
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",
1218 RES_TYPE_STRING);
1219
6fb5f7da 1220/* TODO: other terms seem to get away w/o this complexity.. */
edfda783
AR
1221 if (NILP (Fassq (Qwidth, parms)))
1222 {
facfbbbd
SM
1223 Lisp_Object value
1224 = x_get_arg (dpyinfo, parms, Qwidth, "width", "Width",
1225 RES_TYPE_NUMBER);
edfda783
AR
1226 if (! EQ (value, Qunbound))
1227 parms = Fcons (Fcons (Qwidth, value), parms);
1228 }
1229 if (NILP (Fassq (Qheight, parms)))
1230 {
facfbbbd
SM
1231 Lisp_Object value
1232 = x_get_arg (dpyinfo, parms, Qheight, "height", "Height",
1233 RES_TYPE_NUMBER);
edfda783
AR
1234 if (! EQ (value, Qunbound))
1235 parms = Fcons (Fcons (Qheight, value), parms);
1236 }
1237 if (NILP (Fassq (Qleft, parms)))
1238 {
facfbbbd
SM
1239 Lisp_Object value
1240 = x_get_arg (dpyinfo, parms, Qleft, "left", "Left", RES_TYPE_NUMBER);
edfda783
AR
1241 if (! EQ (value, Qunbound))
1242 parms = Fcons (Fcons (Qleft, value), parms);
1243 }
1244 if (NILP (Fassq (Qtop, parms)))
1245 {
facfbbbd
SM
1246 Lisp_Object value
1247 = x_get_arg (dpyinfo, parms, Qtop, "top", "Top", RES_TYPE_NUMBER);
edfda783
AR
1248 if (! EQ (value, Qunbound))
1249 parms = Fcons (Fcons (Qtop, value), parms);
1250 }
1251
1252 window_prompting = x_figure_window_size (f, parms, 1);
1253
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));
1256
1257 /* NOTE: on other terms, this is done in set_mouse_color, however this
d26fbe1a 1258 was not getting called under Nextstep */
edfda783
AR
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];
facfbbbd
SM
1265 FRAME_NS_DISPLAY_INFO (f)->vertical_scroll_bar_cursor
1266 = [NSCursor arrowCursor];
edfda783
AR
1267 f->output_data.ns->current_pointer = f->output_data.ns->text_cursor;
1268
1269 [[EmacsView alloc] initFrameFromEmacs: f];
1270
952913d4 1271 x_icon (f, parms);
edfda783
AR
1272
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++; */
1277
1278 x_default_parameter (f, parms, Qcursor_type, Qbox, "cursorType", "CursorType",
1279 RES_TYPE_SYMBOL);
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",
1283 RES_TYPE_SYMBOL);
1284 x_default_parameter (f, parms, Qauto_raise, Qnil, "autoRaise", "AutoRaise",
1285 RES_TYPE_BOOLEAN);
1286 x_default_parameter (f, parms, Qauto_lower, Qnil, "autoLower", "AutoLower",
1287 RES_TYPE_BOOLEAN);
1288 x_default_parameter (f, parms, Qbuffered, Qt, "buffered", "Buffered",
1289 RES_TYPE_BOOLEAN);
1290
1291 width = FRAME_COLS (f);
1292 height = FRAME_LINES (f);
1293
1294 SET_FRAME_COLS (f, 0);
1295 FRAME_LINES (f) = 0;
1296 change_frame_size (f, height, width, 1, 0, 0);
1297
1298 if (! f->output_data.ns->explicit_parent)
1299 {
1300 tem = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0, RES_TYPE_BOOLEAN);
1301 if (EQ (tem, Qunbound))
1302 tem = Qnil;
1303
1304 x_set_visibility (f, tem, Qnil);
1305 if (EQ (tem, Qt))
1306 [[FRAME_NS_VIEW (f) window] makeKeyWindow];
1307 }
1308
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;
1313
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);
1319
1320 UNGCPRO;
1321 Vwindow_list = Qnil;
1322
1323 return unbind_to (count, frame);
1324}
1325
1326
1327/* ==========================================================================
1328
1329 Lisp definitions
1330
1331 ========================================================================== */
1332
9e50ff0c 1333DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
edfda783
AR
1334 doc: /* Set the input focus to FRAME.
1335FRAME nil means use the selected frame. */)
1336 (frame)
1337 Lisp_Object frame;
1338{
1339 struct frame *f = check_ns_frame (frame);
1340 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
1341
9e50ff0c 1342 if (dpyinfo->x_focus_frame != f)
edfda783
AR
1343 {
1344 EmacsView *view = FRAME_NS_VIEW (f);
1345 BLOCK_INPUT;
1346 [[view window] makeKeyAndOrderFront: view];
1347 UNBLOCK_INPUT;
1348 }
1349
1350 return Qnil;
1351}
1352
1353
1354DEFUN ("ns-popup-prefs-panel", Fns_popup_prefs_panel, Sns_popup_prefs_panel,
51d5ef9f
AR
1355 0, 0, "",
1356 doc: /* Pop up the preferences panel. */)
edfda783
AR
1357 ()
1358{
1359 check_ns ();
1360 [(EmacsApp *)NSApp showPreferencesWindow: NSApp];
1361 return Qnil;
1362}
1363
1364
1365DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel,
51d5ef9f
AR
1366 0, 1, "",
1367 doc: /* Pop up the font panel. */)
edfda783
AR
1368 (frame)
1369 Lisp_Object frame;
1370{
1371 id fm;
1372 struct frame *f;
1373
1374 check_ns ();
1375 fm = [NSFontManager new];
1376 if (NILP (frame))
1377 f = SELECTED_FRAME ();
1378 else
1379 {
1380 CHECK_FRAME (frame);
1381 f = XFRAME (frame);
1382 }
1383
1384 [fm setSelectedFont: ((struct nsfont_info *)f->output_data.ns->font)->nsfont
1385 isMultiple: NO];
1386 [fm orderFrontFontPanel: NSApp];
1387 return Qnil;
1388}
1389
1390
1391DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel,
51d5ef9f
AR
1392 0, 1, "",
1393 doc: /* Pop up the color panel. */)
edfda783
AR
1394 (frame)
1395 Lisp_Object frame;
1396{
1397 struct frame *f;
1398
1399 check_ns ();
1400 if (NILP (frame))
1401 f = SELECTED_FRAME ();
1402 else
1403 {
1404 CHECK_FRAME (frame);
1405 f = XFRAME (frame);
1406 }
1407
1408 [NSApp orderFrontColorPanel: NSApp];
1409 return Qnil;
1410}
1411
1412
1413DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 4, 0,
51d5ef9f 1414 doc: /* Use a graphical panel to read a file name, using prompt PROMPT.
d26fbe1a
CY
1415Optional arg DIR, if non-nil, supplies a default directory.
1416Optional arg ISLOAD, if non-nil, means read a file name for saving.
51d5ef9f 1417Optional arg INIT, if non-nil, provides a default file name to use. */)
edfda783
AR
1418 (prompt, dir, isLoad, init)
1419 Lisp_Object prompt, dir, isLoad, init;
1420{
1421 static id fileDelegate = nil;
1422 int ret;
1423 id panel;
1424 NSString *fname;
1425
1426 NSString *promptS = NILP (prompt) || !STRINGP (prompt) ? nil :
facfbbbd 1427 [NSString stringWithUTF8String: SDATA (prompt)];
edfda783 1428 NSString *dirS = NILP (dir) || !STRINGP (dir) ?
facfbbbd
SM
1429 [NSString stringWithUTF8String: SDATA (current_buffer->directory)] :
1430 [NSString stringWithUTF8String: SDATA (dir)];
edfda783 1431 NSString *initS = NILP (init) || !STRINGP (init) ? nil :
facfbbbd 1432 [NSString stringWithUTF8String: SDATA (init)];
edfda783
AR
1433
1434 check_ns ();
1435
1436 if (fileDelegate == nil)
1437 fileDelegate = [EmacsFileDelegate new];
1438
1439 [NSCursor setHiddenUntilMouseMoves: NO];
1440
1441 if ([dirS characterAtIndex: 0] == '~')
1442 dirS = [dirS stringByExpandingTildeInPath];
1443
1444 panel = NILP (isLoad) ?
1445 [EmacsSavePanel savePanel] : [EmacsOpenPanel openPanel];
1446
1447 [panel setTitle: promptS];
1448
1449 /* Puma (10.1) does not have */
1450 if ([panel respondsToSelector: @selector (setAllowsOtherFileTypes:)])
1451 [panel setAllowsOtherFileTypes: YES];
1452
1453 [panel setTreatsFilePackagesAsDirectories: YES];
1454 [panel setDelegate: fileDelegate];
1455
1456 panelOK = 0;
1457 if (NILP (isLoad))
1458 {
1459 ret = [panel runModalForDirectory: dirS file: initS];
1460 }
1461 else
1462 {
1463 [panel setCanChooseDirectories: YES];
1464 ret = [panel runModalForDirectory: dirS file: initS types: nil];
1465 }
1466
1467 ret = (ret = NSOKButton) || panelOK;
1468
1469 fname = [panel filename];
1470
1471 [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
1472
1473 return ret ? build_string ([fname UTF8String]) : Qnil;
1474}
1475
1476
1477DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0,
51d5ef9f
AR
1478 doc: /* Return the value of the property NAME of OWNER from the defaults database.
1479If OWNER is nil, Emacs is assumed. */)
edfda783
AR
1480 (owner, name)
1481 Lisp_Object owner, name;
1482{
1483 const char *value;
1484
1485 check_ns ();
1486 if (NILP (owner))
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)); */
1492
1493 value =[[[NSUserDefaults standardUserDefaults]
facfbbbd 1494 objectForKey: [NSString stringWithUTF8String: SDATA (name)]]
edfda783
AR
1495 UTF8String];
1496
1497 if (value)
1498 return build_string (value);
edfda783
AR
1499 return Qnil;
1500}
1501
1502
1503DEFUN ("ns-set-resource", Fns_set_resource, Sns_set_resource, 3, 3, 0,
51d5ef9f 1504 doc: /* Set property NAME of OWNER to VALUE, from the defaults database.
d26fbe1a 1505If OWNER is nil, Emacs is assumed.
51d5ef9f 1506If VALUE is nil, the default is removed. */)
edfda783
AR
1507 (owner, name, value)
1508 Lisp_Object owner, name, value;
1509{
1510 check_ns ();
1511 if (NILP (owner))
facfbbbd
SM
1512 owner
1513 = build_string ([[[NSProcessInfo processInfo] processName] UTF8String]);
edfda783
AR
1514 CHECK_STRING (owner);
1515 CHECK_STRING (name);
1516 if (NILP (value))
1517 {
1518 [[NSUserDefaults standardUserDefaults] removeObjectForKey:
facfbbbd 1519 [NSString stringWithUTF8String: SDATA (name)]];
edfda783
AR
1520 }
1521 else
1522 {
1523 CHECK_STRING (value);
1524 [[NSUserDefaults standardUserDefaults] setObject:
facfbbbd 1525 [NSString stringWithUTF8String: SDATA (value)]
edfda783 1526 forKey: [NSString stringWithUTF8String:
facfbbbd 1527 SDATA (name)]];
edfda783
AR
1528 }
1529
1530 return Qnil;
1531}
1532
1533
1534DEFUN ("ns-set-alpha", Fns_set_alpha, Sns_set_alpha, 2, 2, 0,
51d5ef9f 1535 doc: /* Return a color equivalent to COLOR with alpha setting ALPHA.
d26fbe1a 1536The argument ALPHA should be a number between 0 and 1, where 0 is full
51d5ef9f 1537transparency and 1 is opaque. */)
edfda783
AR
1538 (color, alpha)
1539 Lisp_Object color;
1540 Lisp_Object alpha;
1541{
1542 NSColor *col;
1543 float a;
1544
1545 CHECK_STRING (color);
1546 CHECK_NUMBER_OR_FLOAT (alpha);
1547
1548 if (ns_lisp_to_color (color, &col))
1549 error ("Unknown color.");
1550
1551 a = XFLOATINT (alpha);
1552 if (a < 0.0 || a > 1.0)
1553 error ("Alpha value should be between 0 and 1 inclusive.");
1554
1555 col = [col colorWithAlphaComponent: a];
1556 return ns_color_to_lisp (col);
1557}
1558
1559
952913d4
DN
1560DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
1561 Sx_server_max_request_size,
edfda783 1562 0, 1, 0,
51d5ef9f 1563 doc: /* This function is a no-op. It is only present for completeness. */)
edfda783
AR
1564 (display)
1565 Lisp_Object display;
1566{
1567 check_ns ();
1568 /* This function has no real equivalent under NeXTstep. Return nil to
1569 indicate this. */
1570 return Qnil;
1571}
1572
1573
9e50ff0c 1574DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
51d5ef9f 1575 doc: /* Return the vendor ID string of Nextstep display server DISPLAY.
d26fbe1a 1576DISPLAY should be either a frame or a display name (a string).
51d5ef9f 1577If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1578 (display)
1579 Lisp_Object display;
1580{
1581 check_ns ();
1582#ifdef NS_IMPL_GNUSTEP
1583 return build_string ("GNU");
1584#else
1585 return build_string ("Apple");
1586#endif
1587}
1588
1589
9e50ff0c 1590DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
51d5ef9f 1591 doc: /* Return the version number of Nextstep display server DISPLAY.
d26fbe1a
CY
1592DISPLAY should be either a frame or a display name (a string).
1593If omitted or nil, the selected frame's display is used.
51d5ef9f 1594See also the function `ns-server-vendor'. */)
edfda783
AR
1595 (display)
1596 Lisp_Object display;
1597{
6fb5f7da 1598 /* FIXME: return GUI version on GNUSTEP, ?? on OS X */
edfda783
AR
1599 return build_string ("1.0");
1600}
1601
1602
9e50ff0c 1603DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
51d5ef9f 1604 doc: /* Return the number of screens on Nextstep display server DISPLAY.
d26fbe1a 1605DISPLAY should be a frame, the display name as a string, or a terminal ID.
51d5ef9f 1606If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1607 (display)
1608 Lisp_Object display;
1609{
1610 int num;
1611
1612 check_ns ();
1613 num = [[NSScreen screens] count];
1614
1615 return (num != 0) ? make_number (num) : Qnil;
1616}
1617
1618
9e50ff0c 1619DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height,
edfda783 1620 0, 1, 0,
51d5ef9f 1621 doc: /* Return the height of Nextstep display server DISPLAY, in millimeters.
d26fbe1a 1622DISPLAY should be a frame, the display name as a string, or a terminal ID.
51d5ef9f 1623If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1624 (display)
1625 Lisp_Object display;
1626{
1627 check_ns ();
1628 return make_number ((int)
1629 ([ns_get_screen (display) frame].size.height/(92.0/25.4)));
1630}
1631
1632
9e50ff0c 1633DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width,
edfda783 1634 0, 1, 0,
51d5ef9f 1635 doc: /* Return the width of Nextstep display server DISPLAY, in millimeters.
d26fbe1a 1636DISPLAY should be a frame, the display name as a string, or a terminal ID.
51d5ef9f 1637If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1638 (display)
1639 Lisp_Object display;
1640{
1641 check_ns ();
1642 return make_number ((int)
1643 ([ns_get_screen (display) frame].size.width/(92.0/25.4)));
1644}
1645
1646
9e50ff0c 1647DEFUN ("x-display-backing-store", Fx_display_backing_store,
51d5ef9f
AR
1648 Sx_display_backing_store, 0, 1, 0,
1649 doc: /* Return whether the Nexstep display DISPLAY supports backing store.
d26fbe1a
CY
1650The value may be `buffered', `retained', or `non-retained'.
1651DISPLAY should be a frame, the display name as a string, or a terminal ID.
51d5ef9f 1652If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1653 (display)
1654 Lisp_Object display;
1655{
1656 check_ns ();
1657 switch ([ns_get_window (display) backingType])
1658 {
1659 case NSBackingStoreBuffered:
1660 return intern ("buffered");
1661 case NSBackingStoreRetained:
1662 return intern ("retained");
1663 case NSBackingStoreNonretained:
1664 return intern ("non-retained");
1665 default:
1666 error ("Strange value for backingType parameter of frame");
1667 }
1668 return Qnil; /* not reached, shut compiler up */
1669}
1670
1671
9e50ff0c 1672DEFUN ("x-display-visual-class", Fx_display_visual_class,
51d5ef9f
AR
1673 Sx_display_visual_class, 0, 1, 0,
1674 doc: /* Return the visual class of the Nextstep display server DISPLAY.
d26fbe1a
CY
1675The value is one of the symbols `static-gray', `gray-scale',
1676`static-color', `pseudo-color', `true-color', or `direct-color'.
1677DISPLAY should be a frame, the display name as a string, or a terminal ID.
51d5ef9f 1678If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1679 (display)
1680 Lisp_Object display;
1681{
1682 NSWindowDepth depth;
1683 check_ns ();
1684 depth = [ns_get_screen (display) depth];
1685
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");
1696 else
d26fbe1a 1697 /* color mgmt as far as we do it is really handled by Nextstep itself anyway */
edfda783
AR
1698 return intern ("direct-color");
1699}
1700
1701
9e50ff0c 1702DEFUN ("x-display-save-under", Fx_display_save_under,
51d5ef9f
AR
1703 Sx_display_save_under, 0, 1, 0,
1704 doc: /* Non-nil if the Nextstep display server supports the save-under feature.
d26fbe1a
CY
1705The optional argument DISPLAY specifies which display to ask about.
1706DISPLAY should be a frame, the display name as a string, or a terminal ID.
51d5ef9f 1707If omitted or nil, the selected frame's display is used. */)
edfda783
AR
1708 (display)
1709 Lisp_Object display;
1710{
1711 check_ns ();
1712 switch ([ns_get_window (display) backingType])
1713 {
1714 case NSBackingStoreBuffered:
1715 return Qt;
1716
1717 case NSBackingStoreRetained:
1718 case NSBackingStoreNonretained:
1719 return Qnil;
1720
1721 default:
1722 error ("Strange value for backingType parameter of frame");
1723 }
1724 return Qnil; /* not reached, shut compiler up */
1725}
1726
1727
9e50ff0c 1728DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
51d5ef9f
AR
1729 1, 3, 0,
1730 doc: /* Open a connection to a Nextstep display server.
d26fbe1a 1731DISPLAY is the name of the display to connect to.
51d5ef9f 1732Optional arguments XRM-STRING and MUST-SUCCEED are currently ignored. */)
edfda783
AR
1733 (display, resource_string, must_succeed)
1734 Lisp_Object display, resource_string, must_succeed;
1735{
1736 struct ns_display_info *dpyinfo;
1737
1738 CHECK_STRING (display);
1739
1740 nxatoms_of_nsselect ();
1741 dpyinfo = ns_term_init (display);
1742 if (dpyinfo == 0)
1743 {
1744 if (!NILP (must_succeed))
1745 fatal ("OpenStep on %s not responding.\n",
facfbbbd 1746 SDATA (display));
edfda783
AR
1747 else
1748 error ("OpenStep on %s not responding.\n",
facfbbbd 1749 SDATA (display));
edfda783
AR
1750 }
1751
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:
1757 NSStringPboardType,
1758 NSTabularTextPboardType,
1759 NSFilenamesPboardType,
1760 NSURLPboardType,
1761 NSColorPboardType,
1762 NSFontPboardType, nil] retain];
1763
1764 return Qnil;
1765}
1766
1767
9e50ff0c 1768DEFUN ("x-close-connection", Fx_close_connection, Sx_close_connection,
51d5ef9f
AR
1769 1, 1, 0,
1770 doc: /* Close the connection to the current Nextstep display server.
1771The second argument DISPLAY is currently ignored. */)
edfda783
AR
1772 (display)
1773 Lisp_Object display;
1774{
1775 check_ns ();
1776#ifdef NS_IMPL_COCOA
1777 PSFlush ();
1778#endif
1779 /*ns_delete_terminal (dpyinfo->terminal); */
1780 [NSApp terminate: NSApp];
1781 return Qnil;
1782}
1783
1784
9e50ff0c 1785DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
51d5ef9f 1786 doc: /* Return the list of display names that Emacs has connections to. */)
edfda783
AR
1787 ()
1788{
1789 Lisp_Object tail, result;
1790
1791 result = Qnil;
1792 for (tail = ns_display_name_list; CONSP (tail); tail = XCDR (tail))
1793 result = Fcons (XCAR (XCAR (tail)), result);
1794
1795 return result;
1796}
1797
1798
1799DEFUN ("ns-hide-others", Fns_hide_others, Sns_hide_others,
51d5ef9f
AR
1800 0, 0, 0,
1801 doc: /* Hides all applications other than emacs. */)
edfda783
AR
1802 ()
1803{
1804 check_ns ();
1805 [NSApp hideOtherApplications: NSApp];
1806 return Qnil;
1807}
1808
1809DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs,
51d5ef9f
AR
1810 1, 1, 0,
1811 doc: /* If ON is non-nil, the entire emacs application is hidden.
d26fbe1a
CY
1812Otherwise if emacs is hidden, it is unhidden.
1813If ON is equal to `activate', emacs is unhidden and becomes
51d5ef9f 1814the active application. */)
edfda783
AR
1815 (on)
1816 Lisp_Object on;
1817{
1818 check_ns ();
1819 if (EQ (on, intern ("activate")))
1820 {
1821 [NSApp unhide: NSApp];
1822 [NSApp activateIgnoringOtherApps: YES];
1823 }
1824 else if (NILP (on))
1825 [NSApp unhide: NSApp];
1826 else
1827 [NSApp hide: NSApp];
1828 return Qnil;
1829}
1830
1831
1832DEFUN ("ns-emacs-info-panel", Fns_emacs_info_panel, Sns_emacs_info_panel,
51d5ef9f
AR
1833 0, 0, 0,
1834 doc: /* Shows the 'Info' or 'About' panel for Emacs. */)
edfda783
AR
1835 ()
1836{
1837 check_ns ();
1838 [NSApp orderFrontStandardAboutPanel: nil];
1839 return Qnil;
1840}
1841
1842
edfda783 1843DEFUN ("ns-font-name", Fns_font_name, Sns_font_name, 1, 1, 0,
51d5ef9f 1844 doc: /* Determine font postscript or family name for font NAME.
d26fbe1a
CY
1845NAME should be a string containing either the font name or an XLFD
1846font descriptor. If string contains `fontset' and not
51d5ef9f 1847`fontset-startup', it is left alone. */)
edfda783
AR
1848 (name)
1849 Lisp_Object name;
1850{
1851 char *nm;
1852 CHECK_STRING (name);
1853 nm = SDATA (name);
1854
1855 if (nm[0] != '-')
1856 return name;
1857 if (strstr (nm, "fontset") && !strstr (nm, "fontset-startup"))
1858 return name;
1859
1860 return build_string (ns_xlfd_to_fontname (SDATA (name)));
1861}
1862
1863
1864DEFUN ("ns-list-colors", Fns_list_colors, Sns_list_colors, 0, 1, 0,
51d5ef9f
AR
1865 doc: /* Return a list of all available colors.
1866The optional argument FRAME is currently ignored. */)
edfda783
AR
1867 (frame)
1868 Lisp_Object frame;
1869{
1870 Lisp_Object list = Qnil;
1871 NSEnumerator *colorlists;
1872 NSColorList *clist;
1873
1874 if (!NILP (frame))
1875 {
1876 CHECK_FRAME (frame);
1877 if (! FRAME_NS_P (XFRAME (frame)))
d26fbe1a 1878 error ("non-Nextstep frame used in `ns-list-colors'");
edfda783
AR
1879 }
1880
1881 BLOCK_INPUT;
1882
1883 colorlists = [[NSColorList availableColorLists] objectEnumerator];
1884 while (clist = [colorlists nextObject])
1885 {
1886 if ([[clist name] length] < 7 ||
1887 [[clist name] rangeOfString: @"PANTONE"].location == 0)
1888 {
1889 NSEnumerator *cnames = [[clist allKeys] reverseObjectEnumerator];
1890 NSString *cname;
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); */
1896 }
1897 }
1898
1899 UNBLOCK_INPUT;
1900
1901 return list;
1902}
1903
1904
1905DEFUN ("ns-list-services", Fns_list_services, Sns_list_services, 0, 0, 0,
51d5ef9f 1906 doc: /* List available Nextstep services by querying NSApp. */)
edfda783
AR
1907 ()
1908{
1909 Lisp_Object ret = Qnil;
1910 NSMenu *svcs;
1911 id delegate;
1912
1913 check_ns ();
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];
1918
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)
1923 {
1924 delegate = [svcs delegate];
1925 if (delegate != nil)
1926 {
1927 if ([delegate respondsToSelector: @selector (menuNeedsUpdate:)])
1928 [delegate menuNeedsUpdate: svcs];
1929 if ([delegate respondsToSelector:
1930 @selector (menu:updateItem:atIndex:shouldCancel:)])
1931 {
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])
1939 break;
1940 }
1941 }
1942 }
1943#endif
1944
1945 [svcs setAutoenablesItems: NO];
1946#ifdef NS_IMPL_COCOA
1947 [svcs update]; /* on OS X, converts from '/' structure */
1948#endif
1949
1950 ret = interpret_services_menu (svcs, Qnil, ret);
1951 return ret;
1952}
1953
1954
1955DEFUN ("ns-perform-service", Fns_perform_service, Sns_perform_service,
51d5ef9f
AR
1956 2, 2, 0,
1957 doc: /* Perform Nextstep SERVICE on SEND.
d26fbe1a
CY
1958SEND should be either a string or nil.
1959The return value is the result of the service, as string, or nil if
51d5ef9f 1960there was no result. */)
edfda783
AR
1961 (service, send)
1962 Lisp_Object service, send;
1963{
1964 id pb;
1965 NSString *svcName;
1966 char *utfStr;
1967 int len;
1968
1969 CHECK_STRING (service);
1970 check_ns ();
1971
facfbbbd 1972 utfStr = SDATA (service);
edfda783
AR
1973 svcName = [NSString stringWithUTF8String: utfStr];
1974
1975 pb =[NSPasteboard pasteboardWithUniqueName];
1976 ns_string_to_pasteboard (pb, send);
1977
1978 if (NSPerformService (svcName, pb) == NO)
1979 Fsignal (Qquit, Fcons (build_string ("service not available"), Qnil));
1980
1981 if ([[pb types] count] == 0)
1982 return build_string ("");
1983 return ns_string_from_pasteboard (pb);
1984}
1985
1986
1987DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc,
1988 Sns_convert_utf8_nfd_to_nfc, 1, 1, 0,
51d5ef9f 1989 doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */)
edfda783
AR
1990 (str)
1991 Lisp_Object str;
1992{
1993 NSString *utfStr;
1994
1995 CHECK_STRING (str);
facfbbbd 1996 utfStr = [[NSString stringWithUTF8String: SDATA (str)]
edfda783
AR
1997 precomposedStringWithCanonicalMapping];
1998 return build_string ([utfStr UTF8String]);
1999}
2000
2001
2002/* ==========================================================================
2003
2004 Miscellaneous functions not called through hooks
2005
2006 ========================================================================== */
2007
2008
2009/* 23: call in image.c */
2010FRAME_PTR
2011check_x_frame (Lisp_Object frame)
2012{
2013 return check_ns_frame (frame);
2014}
2015
2016/* 23: added, due to call in frame.c */
2017struct ns_display_info *
2018check_x_display_info (Lisp_Object frame)
2019{
2020 return check_ns_display_info (frame);
2021}
2022
2023
2024/* 23: new function; we don't have much in the way of flexibility though */
2025void
2026x_set_scroll_bar_default_width (f)
2027 struct frame *f;
2028{
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) +
2032 wid - 1) / wid;
2033}
2034
2035
2036/* 23: terms now impl this instead of x-get-resource directly */
2037const char *
2038x_get_string_resource (XrmDatabase rdb, char *name, char *class)
2039{
6fb5f7da 2040 /* remove appname prefix; TODO: allow for !="Emacs" */
edfda783
AR
2041 char *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0);
2042 const char *res;
2043 check_ns ();
2044
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);
2048
2049/*fprintf (stderr, "Checking '%s'\n", toCheck); */
2050
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));
2056}
2057
2058
2059Lisp_Object
2060x_get_focus_frame (struct frame *frame)
2061{
2062 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame);
2063 Lisp_Object nsfocus;
2064
9e50ff0c 2065 if (!dpyinfo->x_focus_frame)
edfda783
AR
2066 return Qnil;
2067
9e50ff0c 2068 XSETFRAME (nsfocus, dpyinfo->x_focus_frame);
edfda783
AR
2069 return nsfocus;
2070}
2071
2072
2073int
2074x_pixel_width (struct frame *f)
2075{
2076 return FRAME_PIXEL_WIDTH (f);
2077}
2078
2079
2080int
2081x_pixel_height (struct frame *f)
2082{
2083 return FRAME_PIXEL_HEIGHT (f);
2084}
2085
2086
2087int
2088x_char_width (struct frame *f)
2089{
2090 return FRAME_COLUMN_WIDTH (f);
2091}
2092
2093
2094int
2095x_char_height (struct frame *f)
2096{
2097 return FRAME_LINE_HEIGHT (f);
2098}
2099
2100
2101int
2102x_screen_planes (struct frame *f)
2103{
2104 return FRAME_NS_DISPLAY_INFO (f)->n_planes;
2105}
2106
2107
2108void
2109x_sync (Lisp_Object frame)
2110{
2111 /* XXX Not implemented XXX */
2112 return;
2113}
2114
2115
2116
2117/* ==========================================================================
2118
2119 Lisp definitions that, for whatever reason, we can't alias as 'ns-XXX'.
2120
2121 ========================================================================== */
2122
2123
74876614
DR
2124#ifdef NS_IMPL_COCOA
2125
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,
2130 1 is returned. */
2131
2132static int
2133do_applescript (script, result)
2134 Lisp_Object script, *result;
2135{
2136 NSAppleEventDescriptor *desc;
2137 NSDictionary* errorDict;
2138 NSAppleEventDescriptor* returnDescriptor = NULL;
2139
2140 NSAppleScript* scriptObject =
2141 [[NSAppleScript alloc] initWithSource:
2142 [NSString stringWithUTF8String: SDATA (script)]];
2143
2144 returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
2145 [scriptObject release];
2146
2147 *result = Qnil;
2148
2149 if (returnDescriptor != NULL)
2150 {
2151 // successful execution
2152 if (kAENullEvent != [returnDescriptor descriptorType])
2153 {
2154 *result = Qt;
2155 // script returned an AppleScript result
2156 if ((typeUnicodeText == [returnDescriptor descriptorType]) ||
2157 (typeUTF16ExternalRepresentation
2158 == [returnDescriptor descriptorType]) ||
2159 (typeUTF8Text == [returnDescriptor descriptorType]) ||
2160 (typeCString == [returnDescriptor descriptorType]))
2161 {
2162 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2163 if (desc)
2164 *result = build_string([[desc stringValue] UTF8String]);
2165 }
2166 else
2167 {
2168 /* use typeUTF16ExternalRepresentation? */
2169 // coerce the result to the appropriate ObjC type
2170 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2171 if (desc)
2172 *result = make_number([desc int32Value]);
2173 }
2174 }
2175 }
2176 else
2177 {
2178 // no script result, return error
2179 return 1;
2180 }
2181 return 0;
2182}
2183
2184DEFUN ("do-applescript", Fdo_applescript, Sdo_applescript, 1, 1, 0,
2185 doc: /* Execute AppleScript SCRIPT and return the result. If
2186compilation and execution are successful, the resulting script value
2187is returned as a string, a number or, in the case of other constructs,
2188t. In case the execution fails, an error is signaled. */)
2189 (script)
2190 Lisp_Object script;
2191{
2192 Lisp_Object result;
2193 long status;
2194
2195 CHECK_STRING (script);
2196 check_ns ();
2197
2198 BLOCK_INPUT;
2199 status = do_applescript (script, &result);
2200 UNBLOCK_INPUT;
2201 if (status == 0)
2202 return result;
2203 else if (!STRINGP (result))
2204 error ("AppleScript error %d", status);
2205 else
2206 error ("%s", SDATA (result));
2207}
2208#endif
2209
952913d4 2210DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
51d5ef9f
AR
2211 doc: /* Return t if the current Nextstep display supports the color COLOR.
2212The optional argument FRAME is currently ignored. */)
edfda783
AR
2213 (color, frame)
2214 Lisp_Object color, frame;
2215{
2216 NSColor * col;
2217 check_ns ();
2218 return ns_lisp_to_color (color, &col) ? Qnil : Qt;
2219}
2220
2221
952913d4 2222DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
51d5ef9f 2223 doc: /* Return a description of the color named COLOR.
d26fbe1a
CY
2224The value is a list of integer RGBA values--(RED GREEN BLUE ALPHA).
2225These values appear to range from 0 to 65280; white is (65280 65280 65280 0).
51d5ef9f 2226The optional argument FRAME is currently ignored. */)
edfda783
AR
2227 (color, frame)
2228 Lisp_Object color, frame;
2229{
2230 NSColor * col;
2231 float red, green, blue, alpha;
2232 Lisp_Object rgba[4];
2233
2234 check_ns ();
2235 CHECK_STRING (color);
2236
2237 if (ns_lisp_to_color (color, &col))
2238 return Qnil;
2239
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));
2246
2247 return Flist (4, rgba);
2248}
2249
2250
2251DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
51d5ef9f 2252 doc: /* Return t if the Nextstep display supports color.
d26fbe1a
CY
2253The optional argument DISPLAY specifies which display to ask about.
2254DISPLAY should be either a frame, a display name (a string), or terminal ID.
51d5ef9f 2255If omitted or nil, that stands for the selected frame's display. */)
edfda783
AR
2256 (display)
2257 Lisp_Object display;
2258{
2259 NSWindowDepth depth;
2260 NSString *colorSpace;
2261 check_ns ();
2262 depth = [ns_get_screen (display) depth];
2263 colorSpace = NSColorSpaceFromDepth (depth);
2264
2265 return [colorSpace isEqualToString: NSDeviceWhiteColorSpace]
2266 || [colorSpace isEqualToString: NSCalibratedWhiteColorSpace]
2267 ? Qnil : Qt;
2268}
2269
2270
2271DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p,
2272 Sx_display_grayscale_p, 0, 1, 0,
51d5ef9f 2273 doc: /* Return t if the Nextstep display supports shades of gray.
d26fbe1a
CY
2274Note that color displays do support shades of gray.
2275The optional argument DISPLAY specifies which display to ask about.
2276DISPLAY should be either a frame, a display name (a string), or terminal ID.
51d5ef9f 2277If omitted or nil, that stands for the selected frame's display. */)
edfda783
AR
2278 (display)
2279 Lisp_Object display;
2280{
2281 NSWindowDepth depth;
2282 check_ns ();
2283 depth = [ns_get_screen (display) depth];
2284
2285 return NSBitsPerPixelFromDepth (depth) > 1 ? Qt : Qnil;
2286}
2287
2288
952913d4 2289DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
edfda783 2290 0, 1, 0,
51d5ef9f 2291 doc: /* Returns the width in pixels of the Nextstep display DISPLAY.
d26fbe1a
CY
2292The optional argument DISPLAY specifies which display to ask about.
2293DISPLAY should be either a frame, a display name (a string), or terminal ID.
51d5ef9f 2294If omitted or nil, that stands for the selected frame's display. */)
edfda783
AR
2295 (display)
2296 Lisp_Object display;
2297{
2298 check_ns ();
2299 return make_number ((int) [ns_get_screen (display) frame].size.width);
2300}
2301
2302
952913d4
DN
2303DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
2304 Sx_display_pixel_height, 0, 1, 0,
51d5ef9f 2305 doc: /* Returns the height in pixels of the Nextstep display DISPLAY.
d26fbe1a
CY
2306The optional argument DISPLAY specifies which display to ask about.
2307DISPLAY should be either a frame, a display name (a string), or terminal ID.
51d5ef9f 2308If omitted or nil, that stands for the selected frame's display. */)
edfda783
AR
2309 (display)
2310 Lisp_Object display;
2311{
2312 check_ns ();
2313 return make_number ((int) [ns_get_screen (display) frame].size.height);
2314}
2315
2316DEFUN ("display-usable-bounds", Fns_display_usable_bounds,
2317 Sns_display_usable_bounds, 0, 1, 0,
51d5ef9f 2318 doc: /*Return the bounds of the usable part of the screen.
d26fbe1a
CY
2319The return value is a list of integers (LEFT TOP WIDTH HEIGHT), which
2320are the boundaries of the usable part of the screen, excluding areas
2321reserved for the Mac menu, dock, and so forth.
2322
2323The screen queried corresponds to DISPLAY, which should be either a
2324frame, a display name (a string), or terminal ID. If omitted or nil,
51d5ef9f 2325that stands for the selected frame's display. */)
edfda783
AR
2326 (display)
2327 Lisp_Object display;
2328{
2329 int top;
2330 NSRect vScreen;
2331
2332 check_ns ();
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;
2336
2337 return list4 (make_number ((int) vScreen.origin.x),
2338 make_number (top),
2339 make_number ((int) vScreen.size.width),
2340 make_number ((int) vScreen.size.height));
2341}
2342
2343
952913d4 2344DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
edfda783 2345 0, 1, 0,
51d5ef9f 2346 doc: /* Returns the number of bitplanes of the Nextstep display DISPLAY.
d26fbe1a
CY
2347The optional argument DISPLAY specifies which display to ask about.
2348DISPLAY should be either a frame, a display name (a string), or terminal ID.
51d5ef9f 2349If omitted or nil, that stands for the selected frame's display. */)
edfda783
AR
2350 (display)
2351 Lisp_Object display;
2352{
2353 check_ns ();
2354 return make_number
2355 (NSBitsPerSampleFromDepth ([ns_get_screen (display) depth]));
2356}
2357
2358
952913d4
DN
2359DEFUN ("x-display-color-cells", Fx_display_color_cells,
2360 Sx_display_color_cells, 0, 1, 0,
51d5ef9f 2361 doc: /* Returns the number of color cells of the Nextstep display DISPLAY.
d26fbe1a
CY
2362The optional argument DISPLAY specifies which display to ask about.
2363DISPLAY should be either a frame, a display name (a string), or terminal ID.
51d5ef9f 2364If omitted or nil, that stands for the selected frame's display. */)
edfda783
AR
2365 (display)
2366 Lisp_Object display;
2367{
2368 check_ns ();
2369 struct ns_display_info *dpyinfo = check_ns_display_info (display);
2370
2371 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2372 return make_number (1 << min (dpyinfo->n_planes, 24));
2373}
2374
2375
2376/* Unused dummy def needed for compatibility. */
2377Lisp_Object tip_frame;
2378
6fb5f7da 2379/* TODO: move to xdisp or similar */
edfda783
AR
2380static void
2381compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y)
2382 struct frame *f;
2383 Lisp_Object parms, dx, dy;
2384 int width, height;
2385 int *root_x, *root_y;
2386{
2387 Lisp_Object left, top;
2388 EmacsView *view = FRAME_NS_VIEW (f);
2389 NSPoint pt;
2390
2391 /* Start with user-specified or mouse position. */
2392 left = Fcdr (Fassq (Qleft, parms));
2393 if (INTEGERP (left))
2394 pt.x = XINT (left);
2395 else
2396 pt.x = last_mouse_motion_position.x;
2397 top = Fcdr (Fassq (Qtop, parms));
2398 if (INTEGERP (top))
2399 pt.y = XINT (top);
2400 else
2401 pt.y = last_mouse_motion_position.y;
2402
2403 /* Convert to screen coordinates */
2404 pt = [view convertPoint: pt toView: nil];
2405 pt = [[view window] convertBaseToScreen: pt];
2406
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);
2416 else
2417 /* Put it left justified on the screen -- it ought to fit that way. */
2418 *root_x = 0;
2419
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);
2426 else
2427 /* Put it on the top. */
2428 *root_y = FRAME_NS_DISPLAY_INFO (f)->height - height;
2429}
2430
2431
2432DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
2433 doc: /* Show STRING in a "tooltip" window on frame FRAME.
2434A tooltip window is a small window displaying a string.
2435
2436FRAME nil or omitted means use the selected frame.
2437
2438PARMS is an optional list of frame parameters which can be used to
2439change the tooltip's appearance.
2440
2441Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
2442means use the default timeout of 5 seconds.
2443
2444If the list of frame parameters PARMS contains a `left' parameter,
2445the tooltip is displayed at that x-position. Otherwise it is
2446displayed at the mouse position, with offset DX added (default is 5 if
2447DX isn't specified). Likewise for the y-position; if a `top' frame
2448parameter is specified, it determines the y-position of the tooltip
2449window, otherwise it is displayed at the mouse position, with offset
2450DY added (default is -10).
2451
2452A tooltip's maximum size is specified by `x-max-tooltip-size'.
2453Text larger than the specified size is clipped. */)
2454 (string, frame, parms, timeout, dx, dy)
2455 Lisp_Object string, frame, parms, timeout, dx, dy;
2456{
2457 int root_x, root_y;
2458 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2459 int count = SPECPDL_INDEX ();
2460 struct frame *f;
2461 char *str;
2462 NSSize size;
2463
2464 specbind (Qinhibit_redisplay, Qt);
2465
2466 GCPRO4 (string, parms, frame, timeout);
2467
2468 CHECK_STRING (string);
facfbbbd 2469 str = SDATA (string);
edfda783
AR
2470 f = check_x_frame (frame);
2471 if (NILP (timeout))
2472 timeout = make_number (5);
2473 else
2474 CHECK_NATNUM (timeout);
2475
2476 if (NILP (dx))
2477 dx = make_number (5);
2478 else
2479 CHECK_NUMBER (dx);
2480
2481 if (NILP (dy))
2482 dy = make_number (-10);
2483 else
2484 CHECK_NUMBER (dy);
2485
2486 BLOCK_INPUT;
2487 if (ns_tooltip == nil)
2488 ns_tooltip = [[EmacsTooltip alloc] init];
2489 else
2490 Fx_hide_tip ();
2491
2492 [ns_tooltip setText: str];
2493 size = [ns_tooltip frame].size;
2494
2495 /* Move the tooltip window where the mouse pointer is. Resize and
2496 show it. */
2497 compute_tip_xy (f, parms, dx, dy, (int)size.width, (int)size.height,
2498 &root_x, &root_y);
2499
2500 [ns_tooltip showAtX: root_x Y: root_y for: XINT (timeout)];
2501 UNBLOCK_INPUT;
2502
2503 UNGCPRO;
2504 return unbind_to (count, Qnil);
2505}
2506
2507
2508DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
2509 doc: /* Hide the current tooltip window, if there is any.
2510Value is t if tooltip was open, nil otherwise. */)
2511 ()
2512{
2513 if (ns_tooltip == nil || ![ns_tooltip isActive])
2514 return Qnil;
2515 [ns_tooltip hide];
2516 return Qt;
2517}
2518
2519
cc98b6a0
DN
2520/* ==========================================================================
2521
2522 Class implementations
2523
2524 ========================================================================== */
2525
2526
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
2535{
2536 [super ok: sender];
2537 panelOK = 1;
2538 [NSApp stop: self];
2539}
2540- (void) cancel: (id)sender
2541{
2542 [super cancel: sender];
2543 [NSApp stop: self];
2544}
2545#endif
2546@end
2547
2548
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
2557{
2558 [super ok: sender];
2559 panelOK = 1;
2560 [NSApp stop: self];
2561}
2562- (void) cancel: (id)sender
2563{
2564 [super cancel: sender];
2565 [NSApp stop: self];
2566}
2567#endif
2568@end
2569
2570
2571@implementation EmacsFileDelegate
2572/* --------------------------------------------------------------------------
2573 Delegate methods for Open/Save panels
2574 -------------------------------------------------------------------------- */
2575- (BOOL)panel: (id)sender isValidFilename: (NSString *)filename
2576{
2577 return YES;
2578}
2579- (BOOL)panel: (id)sender shouldShowFilename: (NSString *)filename
2580{
2581 return YES;
2582}
2583- (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
2584 confirmed: (BOOL)okFlag
2585{
2586 return filename;
2587}
2588@end
2589
2590#endif
2591
edfda783
AR
2592/* ==========================================================================
2593
2594 Lisp interface declaration
2595
2596 ========================================================================== */
2597
2598
2599void
2600syms_of_nsfns ()
2601{
2602 int i;
2603
2604 Qns_frame_parameter = intern ("ns-frame-parameter");
2605 staticpro (&Qns_frame_parameter);
2606 Qnone = intern ("none");
2607 staticpro (&Qnone);
2608 Qbuffered = intern ("bufferd");
2609 staticpro (&Qbuffered);
2610 Qfontsize = intern ("fontsize");
2611 staticpro (&Qfontsize);
2612
2613 DEFVAR_LISP ("ns-icon-type-alist", &Vns_icon_type_alist,
51d5ef9f 2614 doc: /* Alist of elements (REGEXP . IMAGE) for images of icons associated to frames.
d26fbe1a
CY
2615If the title of a frame matches REGEXP, then IMAGE.tiff is
2616selected as the image of the icon representing the frame when it's
2617miniaturized. If an element is t, then Emacs tries to select an icon
2618based on the filetype of the visited file.
2619
2620The images have to be installed in a folder called English.lproj in the
2621Emacs folder. You have to restart Emacs after installing new icons.
2622
2623Example: Install an icon Gnus.tiff and execute the following code
2624
2625 (setq ns-icon-type-alist
2626 (append ns-icon-type-alist
2627 '((\"^\\\\*\\\\(Group\\\\*$\\\\|Summary \\\\|Article\\\\*$\\\\)\"
2628 . \"Gnus\"))))
2629
2630When you miniaturize a Group, Summary or Article frame, Gnus.tiff will
51d5ef9f 2631be used as the image of the icon representing the frame. */);
edfda783
AR
2632 Vns_icon_type_alist = Fcons (Qt, Qnil);
2633
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);
edfda783
AR
2639 defsubr (&Sns_font_name);
2640 defsubr (&Sns_list_colors);
74876614
DR
2641#ifdef NS_IMPL_COCOA
2642 defsubr (&Sdo_applescript);
2643#endif
952913d4
DN
2644 defsubr (&Sxw_color_defined_p);
2645 defsubr (&Sxw_color_values);
2646 defsubr (&Sx_server_max_request_size);
9e50ff0c
DN
2647 defsubr (&Sx_server_vendor);
2648 defsubr (&Sx_server_version);
952913d4
DN
2649 defsubr (&Sx_display_pixel_width);
2650 defsubr (&Sx_display_pixel_height);
edfda783 2651 defsubr (&Sns_display_usable_bounds);
9e50ff0c
DN
2652 defsubr (&Sx_display_mm_width);
2653 defsubr (&Sx_display_mm_height);
2654 defsubr (&Sx_display_screens);
952913d4
DN
2655 defsubr (&Sx_display_planes);
2656 defsubr (&Sx_display_color_cells);
9e50ff0c
DN
2657 defsubr (&Sx_display_visual_class);
2658 defsubr (&Sx_display_backing_store);
2659 defsubr (&Sx_display_save_under);
2660 defsubr (&Sx_create_frame);
edfda783 2661 defsubr (&Sns_set_alpha);
9e50ff0c
DN
2662 defsubr (&Sx_open_connection);
2663 defsubr (&Sx_close_connection);
2664 defsubr (&Sx_display_list);
edfda783
AR
2665
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);
9e50ff0c 2672 defsubr (&Sx_focus_frame);
edfda783
AR
2673 defsubr (&Sns_popup_prefs_panel);
2674 defsubr (&Sns_popup_font_panel);
2675 defsubr (&Sns_popup_color_panel);
2676
2677 defsubr (&Sx_show_tip);
2678 defsubr (&Sx_hide_tip);
2679
2680 /* used only in fontset.c */
2681 check_window_system_func = check_ns;
2682
2683}
2684
2f8e74bb 2685// arch-tag: dc2a3f74-1123-4daa-8eed-fb78db6a5642