* lisp/eshell/em-term.el: New defcustoms need :version tags.
[bpt/emacs.git] / src / nsfns.m
CommitLineData
edfda783 1/* Functions for the NeXT/Open/GNUstep and MacOSX window system.
e9bffc61 2
ab422c4d
PE
3Copyright (C) 1989, 1992-1994, 2005-2006, 2008-2013 Free Software
4Foundation, Inc.
edfda783
AR
5
6This file is part of GNU Emacs.
7
32d235f8 8GNU Emacs is free software: you can redistribute it and/or modify
edfda783 9it under the terms of the GNU General Public License as published by
32d235f8
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
edfda783
AR
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
32d235f8 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
edfda783 20
32d235f8 21/*
edfda783
AR
22Originally by Carl Edman
23Updated by Christian Limpach (chris@nice.ch)
24OpenStep/Rhapsody port by Scott Bender (sbender@harmony-ds.com)
25MacOSX/Aqua port by Christophe de Dinechin (descubes@earthlink.net)
26GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)
edfda783
AR
27*/
28
5a06864f
AR
29/* This should be the first include, as it may set up #defines affecting
30 interpretation of even the system includes. */
08a494a3 31#include <config.h>
5a06864f 32
edfda783 33#include <math.h>
fee5959d 34#include <c-strcase.h>
5a06864f 35
edfda783
AR
36#include "lisp.h"
37#include "blockinput.h"
38#include "nsterm.h"
39#include "window.h"
e5560ff7 40#include "character.h"
edfda783
AR
41#include "buffer.h"
42#include "keyboard.h"
43#include "termhooks.h"
44#include "fontset.h"
edfda783
AR
45#include "font.h"
46
4465bfb4
JD
47#ifdef NS_IMPL_COCOA
48#include <IOKit/graphics/IOGraphicsLib.h>
49#endif
50
edfda783
AR
51#if 0
52int fns_trace_num = 1;
53#define NSTRACE(x) fprintf (stderr, "%s:%d: [%d] " #x "\n", \
54 __FILE__, __LINE__, ++fns_trace_num)
55#else
56#define NSTRACE(x)
57#endif
58
59#ifdef HAVE_NS
60
61extern NSArray *ns_send_types, *ns_return_types, *ns_drag_types;
62
63extern Lisp_Object Qforeground_color;
64extern Lisp_Object Qbackground_color;
65extern Lisp_Object Qcursor_color;
66extern Lisp_Object Qinternal_border_width;
67extern Lisp_Object Qvisibility;
68extern Lisp_Object Qcursor_type;
69extern Lisp_Object Qicon_type;
70extern Lisp_Object Qicon_name;
71extern Lisp_Object Qicon_left;
72extern Lisp_Object Qicon_top;
73extern Lisp_Object Qleft;
74extern Lisp_Object Qright;
75extern Lisp_Object Qtop;
76extern Lisp_Object Qdisplay;
77extern Lisp_Object Qvertical_scroll_bars;
78extern Lisp_Object Qauto_raise;
79extern Lisp_Object Qauto_lower;
80extern Lisp_Object Qbox;
81extern Lisp_Object Qscroll_bar_width;
82extern Lisp_Object Qx_resource_name;
83extern Lisp_Object Qface_set_after_frame_default;
84extern Lisp_Object Qunderline, Qundefined;
85extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
86extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle;
87
5d1d3d04 88
edfda783
AR
89Lisp_Object Qbuffered;
90Lisp_Object Qfontsize;
91
92/* hack for OS X file panels */
93char panelOK = 0;
94
0fb0a4f3 95EmacsTooltip *ns_tooltip = nil;
edfda783
AR
96
97/* Need forward declaration here to preserve organizational integrity of file */
9e50ff0c 98Lisp_Object Fx_open_connection (Lisp_Object, Lisp_Object, Lisp_Object);
edfda783 99
08e3161a
JD
100/* Static variables to handle applescript execution. */
101static Lisp_Object as_script, *as_result;
102static int as_status;
edfda783 103
ef884f23 104#ifdef GLYPH_DEBUG
a97f8f3f
JD
105static ptrdiff_t image_cache_refcount;
106#endif
107
4465bfb4 108
edfda783
AR
109/* ==========================================================================
110
111 Internal utility functions
112
113 ========================================================================== */
114
91e8418b
YM
115/* Let the user specify a Nextstep display with a Lisp object.
116 OBJECT may be nil, a frame or a terminal object.
117 nil stands for the selected frame--or, if that is not a Nextstep frame,
d26fbe1a 118 the first Nextstep display on the list. */
91e8418b 119
edfda783 120static struct ns_display_info *
91e8418b 121check_ns_display_info (Lisp_Object object)
edfda783 122{
91e8418b
YM
123 struct ns_display_info *dpyinfo = NULL;
124
125 if (NILP (object))
edfda783 126 {
91e8418b
YM
127 struct frame *sf = XFRAME (selected_frame);
128
129 if (FRAME_NS_P (sf) && FRAME_LIVE_P (sf))
130 dpyinfo = FRAME_NS_DISPLAY_INFO (sf);
9e50ff0c 131 else if (x_display_list != 0)
91e8418b 132 dpyinfo = x_display_list;
edfda783 133 else
d26fbe1a 134 error ("Nextstep windows are not in use or not initialized");
edfda783 135 }
91e8418b 136 else if (TERMINALP (object))
edfda783 137 {
91e8418b 138 struct terminal *t = get_terminal (object, 1);
edfda783
AR
139
140 if (t->type != output_ns)
91e8418b 141 error ("Terminal %d is not a Nextstep display", t->id);
edfda783 142
91e8418b 143 dpyinfo = t->display_info.ns;
edfda783 144 }
91e8418b
YM
145 else if (STRINGP (object))
146 dpyinfo = ns_display_info_for_name (object);
edfda783
AR
147 else
148 {
91e8418b
YM
149 FRAME_PTR f = decode_window_system_frame (object);
150 dpyinfo = FRAME_NS_DISPLAY_INFO (f);
edfda783 151 }
91e8418b
YM
152
153 return dpyinfo;
edfda783
AR
154}
155
156
157static id
158ns_get_window (Lisp_Object maybeFrame)
159{
160 id view =nil, window =nil;
161
162 if (!FRAMEP (maybeFrame) || !FRAME_NS_P (XFRAME (maybeFrame)))
163 maybeFrame = selected_frame;/*wrong_type_argument (Qframep, maybeFrame); */
164
165 if (!NILP (maybeFrame))
166 view = FRAME_NS_VIEW (XFRAME (maybeFrame));
167 if (view) window =[view window];
168
169 return window;
170}
171
172
edfda783
AR
173/* Return the X display structure for the display named NAME.
174 Open a new connection if necessary. */
175struct ns_display_info *
3d608a86 176ns_display_info_for_name (Lisp_Object name)
edfda783
AR
177{
178 Lisp_Object names;
179 struct ns_display_info *dpyinfo;
180
181 CHECK_STRING (name);
182
9e50ff0c 183 for (dpyinfo = x_display_list, names = ns_display_name_list;
edfda783
AR
184 dpyinfo;
185 dpyinfo = dpyinfo->next, names = XCDR (names))
186 {
187 Lisp_Object tem;
188 tem = Fstring_equal (XCAR (XCAR (names)), name);
189 if (!NILP (tem))
190 return dpyinfo;
191 }
192
193 error ("Emacs for OpenStep does not yet support multi-display.");
194
9e50ff0c
DN
195 Fx_open_connection (name, Qnil, Qnil);
196 dpyinfo = x_display_list;
edfda783
AR
197
198 if (dpyinfo == 0)
facfbbbd 199 error ("OpenStep on %s not responding.\n", SDATA (name));
edfda783
AR
200
201 return dpyinfo;
202}
203
8f2906f5
JD
204static NSString *
205ns_filename_from_panel (NSSavePanel *panel)
206{
207#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
208 NSURL *url = [panel URL];
209 NSString *str = [url path];
210 return str;
211#else
212 return [panel filename];
213#endif
214}
215
216static NSString *
217ns_directory_from_panel (NSSavePanel *panel)
218{
219#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
220 NSURL *url = [panel directoryURL];
221 NSString *str = [url path];
222 return str;
223#else
224 return [panel directory];
225#endif
226}
edfda783
AR
227
228static Lisp_Object
229interpret_services_menu (NSMenu *menu, Lisp_Object prefix, Lisp_Object old)
230/* --------------------------------------------------------------------------
231 Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
232 -------------------------------------------------------------------------- */
233{
234 int i, count;
15034960 235 NSMenuItem *item;
edfda783
AR
236 const char *name;
237 Lisp_Object nameStr;
238 unsigned short key;
239 NSString *keys;
240 Lisp_Object res;
241
242 count = [menu numberOfItems];
243 for (i = 0; i<count; i++)
244 {
245 item = [menu itemAtIndex: i];
246 name = [[item title] UTF8String];
247 if (!name) continue;
248
249 nameStr = build_string (name);
250
251 if ([item hasSubmenu])
252 {
253 old = interpret_services_menu ([item submenu],
254 Fcons (nameStr, prefix), old);
255 }
256 else
257 {
258 keys = [item keyEquivalent];
259 if (keys && [keys length] )
260 {
261 key = [keys characterAtIndex: 0];
262 res = make_number (key|super_modifier);
263 }
264 else
265 {
266 res = Qundefined;
267 }
268 old = Fcons (Fcons (res,
269 Freverse (Fcons (nameStr,
270 prefix))),
271 old);
272 }
273 }
274 return old;
275}
276
277
278
279/* ==========================================================================
280
281 Frame parameter setters
282
283 ========================================================================== */
284
285
286static void
89e2438a 287x_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
edfda783
AR
288{
289 NSColor *col;
d8c2fa78 290 CGFloat r, g, b, alpha;
edfda783
AR
291
292 if (ns_lisp_to_color (arg, &col))
293 {
294 store_frame_param (f, Qforeground_color, oldval);
295 error ("Unknown color");
296 }
297
298 [col retain];
299 [f->output_data.ns->foreground_color release];
300 f->output_data.ns->foreground_color = col;
301
d8c2fa78
AA
302 [col getRed: &r green: &g blue: &b alpha: &alpha];
303 FRAME_FOREGROUND_PIXEL (f) =
304 ARGB_TO_ULONG ((int)(alpha*0xff), (int)(r*0xff), (int)(g*0xff), (int)(b*0xff));
305
edfda783
AR
306 if (FRAME_NS_VIEW (f))
307 {
308 update_face_from_frame_parameter (f, Qforeground_color, arg);
309 /*recompute_basic_faces (f); */
310 if (FRAME_VISIBLE_P (f))
311 redraw_frame (f);
312 }
313}
314
315
316static void
89e2438a 317x_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
edfda783
AR
318{
319 struct face *face;
320 NSColor *col;
321 NSView *view = FRAME_NS_VIEW (f);
d8c2fa78 322 CGFloat r, g, b, alpha;
edfda783
AR
323
324 if (ns_lisp_to_color (arg, &col))
325 {
326 store_frame_param (f, Qbackground_color, oldval);
327 error ("Unknown color");
328 }
329
330 /* clear the frame; in some instances the NS-internal GC appears not to
331 update, or it does update and cannot clear old text properly */
332 if (FRAME_VISIBLE_P (f))
333 ns_clear_frame (f);
334
335 [col retain];
336 [f->output_data.ns->background_color release];
337 f->output_data.ns->background_color = col;
d8c2fa78
AA
338
339 [col getRed: &r green: &g blue: &b alpha: &alpha];
340 FRAME_BACKGROUND_PIXEL (f) =
341 ARGB_TO_ULONG ((int)(alpha*0xff), (int)(r*0xff), (int)(g*0xff), (int)(b*0xff));
342
edfda783
AR
343 if (view != nil)
344 {
345 [[view window] setBackgroundColor: col];
edfda783 346
edfda783
AR
347 if (alpha != 1.0)
348 [[view window] setOpaque: NO];
349 else
350 [[view window] setOpaque: YES];
351
352 face = FRAME_DEFAULT_FACE (f);
353 if (face)
354 {
45d325c4 355 col = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f);
204ee57f
JD
356 face->background = ns_index_color
357 ([col colorWithAlphaComponent: alpha], f);
edfda783
AR
358
359 update_face_from_frame_parameter (f, Qbackground_color, arg);
360 }
361
362 if (FRAME_VISIBLE_P (f))
363 redraw_frame (f);
364 }
365}
366
367
368static void
89e2438a 369x_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
edfda783
AR
370{
371 NSColor *col;
372
373 if (ns_lisp_to_color (arg, &col))
374 {
375 store_frame_param (f, Qcursor_color, oldval);
376 error ("Unknown color");
377 }
378
c8c057de
AR
379 [FRAME_CURSOR_COLOR (f) release];
380 FRAME_CURSOR_COLOR (f) = [col retain];
edfda783
AR
381
382 if (FRAME_VISIBLE_P (f))
383 {
384 x_update_cursor (f, 0);
385 x_update_cursor (f, 1);
386 }
387 update_face_from_frame_parameter (f, Qcursor_color, arg);
388}
389
c8c057de 390
edfda783 391static void
89e2438a 392x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
edfda783
AR
393{
394 NSView *view = FRAME_NS_VIEW (f);
89e2438a 395 NSTRACE (x_set_icon_name);
edfda783 396
edfda783
AR
397 /* see if it's changed */
398 if (STRINGP (arg))
399 {
400 if (STRINGP (oldval) && EQ (Fstring_equal (oldval, arg), Qt))
401 return;
402 }
403 else if (!STRINGP (oldval) && EQ (oldval, Qnil) == EQ (arg, Qnil))
404 return;
405
f00af5b1 406 fset_icon_name (f, arg);
edfda783
AR
407
408 if (NILP (arg))
409 {
e69b0960
DA
410 if (!NILP (f->title))
411 arg = f->title;
edfda783
AR
412 else
413 /* explicit name and no icon-name -> explicit_name */
414 if (f->explicit_name)
e69b0960 415 arg = f->name;
edfda783
AR
416 else
417 {
418 /* no explicit name and no icon-name ->
419 name has to be rebuild from icon_title_format */
420 windows_or_buffers_changed++;
421 return;
422 }
423 }
424
425 /* Don't change the name if it's already NAME. */
426 if ([[view window] miniwindowTitle] &&
427 ([[[view window] miniwindowTitle]
428 isEqualToString: [NSString stringWithUTF8String:
0dc8cf50 429 SSDATA (arg)]]))
edfda783
AR
430 return;
431
432 [[view window] setMiniwindowTitle:
0dc8cf50 433 [NSString stringWithUTF8String: SSDATA (arg)]];
edfda783
AR
434}
435
edfda783 436static void
5bbb4727 437ns_set_name_internal (FRAME_PTR f, Lisp_Object name)
edfda783 438{
5bbb4727
JD
439 struct gcpro gcpro1;
440 Lisp_Object encoded_name, encoded_icon_name;
441 NSString *str;
edfda783 442 NSView *view = FRAME_NS_VIEW (f);
edfda783 443
5bbb4727
JD
444 GCPRO1 (name);
445 encoded_name = ENCODE_UTF_8 (name);
446 UNGCPRO;
edfda783 447
0dc8cf50 448 str = [NSString stringWithUTF8String: SSDATA (encoded_name)];
edfda783 449
5bbb4727
JD
450 /* Don't change the name if it's already NAME. */
451 if (! [[[view window] title] isEqualToString: str])
452 [[view window] setTitle: str];
edfda783 453
e69b0960 454 if (!STRINGP (f->icon_name))
5bbb4727 455 encoded_icon_name = encoded_name;
edfda783 456 else
e69b0960 457 encoded_icon_name = ENCODE_UTF_8 (f->icon_name);
5bbb4727 458
0dc8cf50 459 str = [NSString stringWithUTF8String: SSDATA (encoded_icon_name)];
edfda783 460
edfda783 461 if ([[view window] miniwindowTitle] &&
5bbb4727
JD
462 ! [[[view window] miniwindowTitle] isEqualToString: str])
463 [[view window] setMiniwindowTitle: str];
edfda783 464
edfda783
AR
465}
466
edfda783
AR
467static void
468ns_set_name (struct frame *f, Lisp_Object name, int explicit)
469{
edfda783
AR
470 NSTRACE (ns_set_name);
471
edfda783
AR
472 /* Make sure that requests from lisp code override requests from
473 Emacs redisplay code. */
474 if (explicit)
475 {
476 /* If we're switching from explicit to implicit, we had better
477 update the mode lines and thereby update the title. */
478 if (f->explicit_name && NILP (name))
479 update_mode_lines = 1;
480
481 f->explicit_name = ! NILP (name);
482 }
483 else if (f->explicit_name)
484 return;
485
486 if (NILP (name))
56d513e6 487 name = build_string([ns_app_name UTF8String]);
5bbb4727
JD
488 else
489 CHECK_STRING (name);
490
491 /* Don't change the name if it's already NAME. */
e69b0960 492 if (! NILP (Fstring_equal (name, f->name)))
5bbb4727 493 return;
edfda783 494
f00af5b1 495 fset_name (f, name);
edfda783
AR
496
497 /* title overrides explicit name */
e69b0960
DA
498 if (! NILP (f->title))
499 name = f->title;
edfda783 500
5bbb4727 501 ns_set_name_internal (f, name);
edfda783
AR
502}
503
504
505/* This function should be called when the user's lisp code has
506 specified a name for the frame; the name will override any set by the
507 redisplay code. */
508static void
89e2438a 509x_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
edfda783 510{
89e2438a 511 NSTRACE (x_explicitly_set_name);
edfda783
AR
512 ns_set_name (f, arg, 1);
513}
514
515
516/* This function should be called by Emacs redisplay code to set the
517 name; names set this way will never override names set by the user's
518 lisp code. */
519void
520x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
521{
522 NSTRACE (x_implicitly_set_name);
5bbb4727
JD
523
524 /* Deal with NS specific format t. */
525 if (FRAME_NS_P (f) && ((FRAME_ICONIFIED_P (f) && EQ (Vicon_title_format, Qt))
526 || EQ (Vframe_title_format, Qt)))
9ae6e189 527 ns_set_name_as_filename (f);
edfda783
AR
528 else
529 ns_set_name (f, arg, 0);
530}
531
532
533/* Change the title of frame F to NAME.
5bbb4727 534 If NAME is nil, use the frame name as the title. */
edfda783 535
edfda783 536static void
89e2438a 537x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
edfda783 538{
89e2438a 539 NSTRACE (x_set_title);
edfda783 540 /* Don't change the title if it's already NAME. */
e69b0960 541 if (EQ (name, f->title))
edfda783
AR
542 return;
543
544 update_mode_lines = 1;
545
f00af5b1 546 fset_title (f, name);
5bbb4727
JD
547
548 if (NILP (name))
e69b0960 549 name = f->name;
5bbb4727
JD
550 else
551 CHECK_STRING (name);
552
553 ns_set_name_internal (f, name);
edfda783
AR
554}
555
556
557void
558ns_set_name_as_filename (struct frame *f)
559{
fec8f0fe 560 NSView *view;
aeb7e951 561 Lisp_Object name, filename;
e74aeda8 562 Lisp_Object buf = XWINDOW (f->selected_window)->contents;
edfda783
AR
563 const char *title;
564 NSAutoreleasePool *pool;
5bbb4727 565 struct gcpro gcpro1;
aeb7e951
JD
566 Lisp_Object encoded_name, encoded_filename;
567 NSString *str;
edfda783
AR
568 NSTRACE (ns_set_name_as_filename);
569
3bc0a2f7 570 if (f->explicit_name || ! NILP (f->title))
edfda783
AR
571 return;
572
4d7e6e51 573 block_input ();
edfda783 574 pool = [[NSAutoreleasePool alloc] init];
124c9ff0
JD
575 filename = BVAR (XBUFFER (buf), filename);
576 name = BVAR (XBUFFER (buf), name);
edfda783
AR
577
578 if (NILP (name))
aeb7e951
JD
579 {
580 if (! NILP (filename))
581 name = Ffile_name_nondirectory (filename);
582 else
583 name = build_string ([ns_app_name UTF8String]);
584 }
edfda783 585
5bbb4727
JD
586 GCPRO1 (name);
587 encoded_name = ENCODE_UTF_8 (name);
588 UNGCPRO;
589
fec8f0fe
CY
590 view = FRAME_NS_VIEW (f);
591
edfda783
AR
592 title = FRAME_ICONIFIED_P (f) ? [[[view window] miniwindowTitle] UTF8String]
593 : [[[view window] title] UTF8String];
594
0dc8cf50 595 if (title && (! strcmp (title, SSDATA (encoded_name))))
edfda783
AR
596 {
597 [pool release];
4d7e6e51 598 unblock_input ();
edfda783
AR
599 return;
600 }
601
0dc8cf50 602 str = [NSString stringWithUTF8String: SSDATA (encoded_name)];
aeb7e951
JD
603 if (str == nil) str = @"Bad coding";
604
605 if (FRAME_ICONIFIED_P (f))
606 [[view window] setMiniwindowTitle: str];
5fdb398c 607 else
edfda783 608 {
aeb7e951
JD
609 NSString *fstr;
610
611 if (! NILP (filename))
edfda783 612 {
aeb7e951
JD
613 GCPRO1 (filename);
614 encoded_filename = ENCODE_UTF_8 (filename);
615 UNGCPRO;
616
0dc8cf50 617 fstr = [NSString stringWithUTF8String: SSDATA (encoded_filename)];
aeb7e951
JD
618 if (fstr == nil) fstr = @"";
619#ifdef NS_IMPL_COCOA
620 /* work around a bug observed on 10.3 and later where
621 setTitleWithRepresentedFilename does not clear out previous state
622 if given filename does not exist */
623 if (! [[NSFileManager defaultManager] fileExistsAtPath: fstr])
624 [[view window] setRepresentedFilename: @""];
625#endif
edfda783
AR
626 }
627 else
aeb7e951
JD
628 fstr = @"";
629
630 [[view window] setRepresentedFilename: fstr];
631 [[view window] setTitle: str];
f00af5b1 632 fset_name (f, name);
edfda783 633 }
aeb7e951 634
edfda783 635 [pool release];
4d7e6e51 636 unblock_input ();
edfda783
AR
637}
638
639
640void
6521c534 641ns_set_doc_edited (struct frame *f, Lisp_Object arg)
edfda783
AR
642{
643 NSView *view = FRAME_NS_VIEW (f);
644 NSAutoreleasePool *pool;
e69b0960 645 if (!MINI_WINDOW_P (XWINDOW (f->selected_window)))
9ae6e189 646 {
4d7e6e51 647 block_input ();
9ae6e189
CY
648 pool = [[NSAutoreleasePool alloc] init];
649 [[view window] setDocumentEdited: !NILP (arg)];
650 [pool release];
4d7e6e51 651 unblock_input ();
9ae6e189 652 }
edfda783
AR
653}
654
655
cc98b6a0
DN
656void
657x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
edfda783
AR
658{
659 int nlines;
edfda783
AR
660 if (FRAME_MINIBUF_ONLY_P (f))
661 return;
662
d311d28c 663 if (TYPE_RANGED_INTEGERP (int, value))
edfda783
AR
664 nlines = XINT (value);
665 else
666 nlines = 0;
667
668 FRAME_MENU_BAR_LINES (f) = 0;
669 if (nlines)
670 {
671 FRAME_EXTERNAL_MENU_BAR (f) = 1;
cc98b6a0
DN
672 /* does for all frames, whereas we just want for one frame
673 [NSMenu setMenuBarVisible: YES]; */
edfda783
AR
674 }
675 else
676 {
677 if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
678 free_frame_menubar (f);
cc98b6a0 679 /* [NSMenu setMenuBarVisible: NO]; */
edfda783
AR
680 FRAME_EXTERNAL_MENU_BAR (f) = 0;
681 }
682}
683
684
3fe53a83 685/* toolbar support */
cc98b6a0
DN
686void
687x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
edfda783
AR
688{
689 int nlines;
edfda783
AR
690
691 if (FRAME_MINIBUF_ONLY_P (f))
692 return;
693
d311d28c 694 if (RANGED_INTEGERP (0, value, INT_MAX))
edfda783
AR
695 nlines = XFASTINT (value);
696 else
697 nlines = 0;
698
699 if (nlines)
700 {
701 FRAME_EXTERNAL_TOOL_BAR (f) = 1;
702 update_frame_tool_bar (f);
703 }
704 else
705 {
706 if (FRAME_EXTERNAL_TOOL_BAR (f))
707 {
708 free_frame_tool_bar (f);
709 FRAME_EXTERNAL_TOOL_BAR (f) = 0;
710 }
711 }
712
713 x_set_window_size (f, 0, f->text_cols, f->text_lines);
714}
715
716
edfda783
AR
717void
718ns_implicitly_set_icon_type (struct frame *f)
719{
720 Lisp_Object tem;
721 EmacsView *view = FRAME_NS_VIEW (f);
204ee57f 722 id image = nil;
edfda783
AR
723 Lisp_Object chain, elt;
724 NSAutoreleasePool *pool;
725 BOOL setMini = YES;
726
727 NSTRACE (ns_implicitly_set_icon_type);
728
4d7e6e51 729 block_input ();
edfda783
AR
730 pool = [[NSAutoreleasePool alloc] init];
731 if (f->output_data.ns->miniimage
e69b0960 732 && [[NSString stringWithUTF8String: SSDATA (f->name)]
edfda783
AR
733 isEqualToString: [(NSImage *)f->output_data.ns->miniimage name]])
734 {
735 [pool release];
4d7e6e51 736 unblock_input ();
edfda783
AR
737 return;
738 }
739
e69b0960 740 tem = assq_no_quit (Qicon_type, f->param_alist);
edfda783
AR
741 if (CONSP (tem) && ! NILP (XCDR (tem)))
742 {
743 [pool release];
4d7e6e51 744 unblock_input ();
edfda783
AR
745 return;
746 }
747
748 for (chain = Vns_icon_type_alist;
204ee57f 749 image == nil && CONSP (chain);
edfda783
AR
750 chain = XCDR (chain))
751 {
752 elt = XCAR (chain);
753 /* special case: 't' means go by file type */
e69b0960 754 if (SYMBOLP (elt) && EQ (elt, Qt) && SSDATA (f->name)[0] == '/')
edfda783 755 {
facfbbbd 756 NSString *str
e69b0960 757 = [NSString stringWithUTF8String: SSDATA (f->name)];
edfda783
AR
758 if ([[NSFileManager defaultManager] fileExistsAtPath: str])
759 image = [[[NSWorkspace sharedWorkspace] iconForFile: str] retain];
760 }
761 else if (CONSP (elt) &&
762 STRINGP (XCAR (elt)) &&
763 STRINGP (XCDR (elt)) &&
e69b0960 764 fast_string_match (XCAR (elt), f->name) >= 0)
edfda783
AR
765 {
766 image = [EmacsImage allocInitFromFile: XCDR (elt)];
767 if (image == nil)
768 image = [[NSImage imageNamed:
769 [NSString stringWithUTF8String:
0dc8cf50 770 SSDATA (XCDR (elt))]] retain];
edfda783
AR
771 }
772 }
773
774 if (image == nil)
775 {
776 image = [[[NSWorkspace sharedWorkspace] iconForFileType: @"text"] retain];
777 setMini = NO;
778 }
779
780 [f->output_data.ns->miniimage release];
781 f->output_data.ns->miniimage = image;
782 [view setMiniwindowImage: setMini];
783 [pool release];
4d7e6e51 784 unblock_input ();
edfda783
AR
785}
786
787
788static void
89e2438a 789x_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
edfda783
AR
790{
791 EmacsView *view = FRAME_NS_VIEW (f);
792 id image = nil;
793 BOOL setMini = YES;
794
89e2438a 795 NSTRACE (x_set_icon_type);
edfda783
AR
796
797 if (!NILP (arg) && SYMBOLP (arg))
798 {
0dc8cf50 799 arg =build_string (SSDATA (SYMBOL_NAME (arg)));
edfda783
AR
800 store_frame_param (f, Qicon_type, arg);
801 }
802
803 /* do it the implicit way */
804 if (NILP (arg))
805 {
806 ns_implicitly_set_icon_type (f);
807 return;
808 }
809
810 CHECK_STRING (arg);
811
812 image = [EmacsImage allocInitFromFile: arg];
813 if (image == nil)
814 image =[NSImage imageNamed: [NSString stringWithUTF8String:
0dc8cf50 815 SSDATA (arg)]];
edfda783
AR
816
817 if (image == nil)
818 {
819 image = [NSImage imageNamed: @"text"];
820 setMini = NO;
821 }
822
823 f->output_data.ns->miniimage = image;
824 [view setMiniwindowImage: setMini];
825}
826
827
6fb5f7da 828/* TODO: move to nsterm? */
edfda783
AR
829int
830ns_lisp_to_cursor_type (Lisp_Object arg)
831{
832 char *str;
833 if (XTYPE (arg) == Lisp_String)
0dc8cf50 834 str = SSDATA (arg);
edfda783 835 else if (XTYPE (arg) == Lisp_Symbol)
0dc8cf50 836 str = SSDATA (SYMBOL_NAME (arg));
edfda783 837 else return -1;
c8c057de
AR
838 if (!strcmp (str, "box")) return FILLED_BOX_CURSOR;
839 if (!strcmp (str, "hollow")) return HOLLOW_BOX_CURSOR;
840 if (!strcmp (str, "hbar")) return HBAR_CURSOR;
841 if (!strcmp (str, "bar")) return BAR_CURSOR;
842 if (!strcmp (str, "no")) return NO_CURSOR;
edfda783
AR
843 return -1;
844}
845
846
847Lisp_Object
848ns_cursor_type_to_lisp (int arg)
849{
850 switch (arg)
851 {
c8c057de
AR
852 case FILLED_BOX_CURSOR: return Qbox;
853 case HOLLOW_BOX_CURSOR: return intern ("hollow");
854 case HBAR_CURSOR: return intern ("hbar");
855 case BAR_CURSOR: return intern ("bar");
856 case NO_CURSOR:
857 default: return intern ("no");
edfda783
AR
858 }
859}
860
89e2438a 861/* This is the same as the xfns.c definition. */
06197b17 862void
3d608a86 863x_set_cursor_type (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
edfda783 864{
06197b17 865 set_frame_cursor_types (f, arg);
edfda783 866
06197b17
DR
867 /* Make sure the cursor gets redrawn. */
868 cursor_type_changed = 1;
edfda783 869}
06197b17 870\f
edfda783 871
3fe53a83
AR
872/* called to set mouse pointer color, but all other terms use it to
873 initialize pointer types (and don't set the color ;) */
edfda783 874static void
89e2438a 875x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
edfda783 876{
d26fbe1a 877 /* don't think we can do this on Nextstep */
edfda783
AR
878}
879
880
cb83c00b
AR
881#define Str(x) #x
882#define Xstr(x) Str(x)
883
884static Lisp_Object
3d608a86 885ns_appkit_version_str (void)
cb83c00b
AR
886{
887 char tmp[80];
888
889#ifdef NS_IMPL_GNUSTEP
890 sprintf(tmp, "gnustep-gui-%s", Xstr(GNUSTEP_GUI_VERSION));
891#elif defined(NS_IMPL_COCOA)
892 sprintf(tmp, "apple-appkit-%.2f", NSAppKitVersionNumber);
893#else
894 tmp = "ns-unknown";
895#endif
896 return build_string (tmp);
897}
898
899
f5497e45
AR
900/* This is for use by x-server-version and collapses all version info we
901 have into a single int. For a better picture of the implementation
902 running, use ns_appkit_version_str.*/
903static int
3d608a86 904ns_appkit_version_int (void)
f5497e45
AR
905{
906#ifdef NS_IMPL_GNUSTEP
13cd8a29 907 return GNUSTEP_GUI_MAJOR_VERSION * 100 + GNUSTEP_GUI_MINOR_VERSION;
f5497e45
AR
908#elif defined(NS_IMPL_COCOA)
909 return (int)NSAppKitVersionNumber;
910#endif
911 return 0;
912}
913
914
edfda783 915static void
952913d4 916x_icon (struct frame *f, Lisp_Object parms)
edfda783
AR
917/* --------------------------------------------------------------------------
918 Strangely-named function to set icon position parameters in frame.
919 This is irrelevant under OS X, but might be needed under GNUstep,
920 depending on the window manager used. Note, this is not a standard
921 frame parameter-setter; it is called directly from x-create-frame.
922 -------------------------------------------------------------------------- */
923{
924 Lisp_Object icon_x, icon_y;
925 struct ns_display_info *dpyinfo = check_ns_display_info (Qnil);
926
927 f->output_data.ns->icon_top = Qnil;
928 f->output_data.ns->icon_left = Qnil;
929
930 /* Set the position of the icon. */
931 icon_x = x_get_arg (dpyinfo, parms, Qicon_left, 0, 0, RES_TYPE_NUMBER);
932 icon_y = x_get_arg (dpyinfo, parms, Qicon_top, 0, 0, RES_TYPE_NUMBER);
933 if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound))
934 {
935 CHECK_NUMBER (icon_x);
936 CHECK_NUMBER (icon_y);
937 f->output_data.ns->icon_top = icon_y;
938 f->output_data.ns->icon_left = icon_x;
939 }
940 else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
941 error ("Both left and top icon corners of icon must be specified");
942}
943
944
3fe53a83 945/* Note: see frame.c for template, also where generic functions are impl */
edfda783
AR
946frame_parm_handler ns_frame_parm_handlers[] =
947{
948 x_set_autoraise, /* generic OK */
949 x_set_autolower, /* generic OK */
89e2438a 950 x_set_background_color,
d26fbe1a
CY
951 0, /* x_set_border_color, may be impossible under Nextstep */
952 0, /* x_set_border_width, may be impossible under Nextstep */
89e2438a
DN
953 x_set_cursor_color,
954 x_set_cursor_type,
edfda783 955 x_set_font, /* generic OK */
89e2438a
DN
956 x_set_foreground_color,
957 x_set_icon_name,
958 x_set_icon_type,
edfda783 959 x_set_internal_border_width, /* generic OK */
cc98b6a0 960 x_set_menu_bar_lines,
89e2438a
DN
961 x_set_mouse_color,
962 x_explicitly_set_name,
edfda783 963 x_set_scroll_bar_width, /* generic OK */
89e2438a 964 x_set_title,
edfda783
AR
965 x_set_unsplittable, /* generic OK */
966 x_set_vertical_scroll_bars, /* generic OK */
967 x_set_visibility, /* generic OK */
cc98b6a0 968 x_set_tool_bar_lines,
edfda783
AR
969 0, /* x_set_scroll_bar_foreground, will ignore (not possible on NS) */
970 0, /* x_set_scroll_bar_background, will ignore (not possible on NS) */
971 x_set_screen_gamma, /* generic OK */
972 x_set_line_spacing, /* generic OK, sets f->extra_line_spacing to int */
973 x_set_fringe_width, /* generic OK */
974 x_set_fringe_width, /* generic OK */
975 0, /* x_set_wait_for_wm, will ignore */
dd946752 976 x_set_fullscreen, /* generic OK */
dee721c0 977 x_set_font_backend, /* generic OK */
cad9ef74 978 x_set_alpha,
5fdb398c
PE
979 0, /* x_set_sticky */
980 0, /* x_set_tool_bar_position */
edfda783
AR
981};
982
983
a97f8f3f
JD
984/* Handler for signals raised during x_create_frame.
985 FRAME is the frame which is partially constructed. */
986
987static Lisp_Object
988unwind_create_frame (Lisp_Object frame)
989{
990 struct frame *f = XFRAME (frame);
991
992 /* If frame is already dead, nothing to do. This can happen if the
993 display is disconnected after the frame has become official, but
994 before x_create_frame removes the unwind protect. */
995 if (!FRAME_LIVE_P (f))
996 return Qnil;
997
998 /* If frame is ``official'', nothing to do. */
97f18cc8 999 if (NILP (Fmemq (frame, Vframe_list)))
a97f8f3f 1000 {
ef884f23 1001#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
a97f8f3f
JD
1002 struct ns_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
1003#endif
1004
1005 x_free_frame_resources (f);
1006 free_glyphs (f);
1007
ef884f23 1008#ifdef GLYPH_DEBUG
a97f8f3f 1009 /* Check that reference counts are indeed correct. */
ef884f23 1010 eassert (dpyinfo->terminal->image_cache->refcount == image_cache_refcount);
a97f8f3f
JD
1011#endif
1012 return Qt;
1013 }
1014
1015 return Qnil;
1016}
1017
a0c3fad0
JD
1018/*
1019 * Read geometry related parameters from preferences if not in PARMS.
1020 * Returns the union of parms and any preferences read.
1021 */
a97f8f3f 1022
a0c3fad0
JD
1023static Lisp_Object
1024get_geometry_from_preferences (struct ns_display_info *dpyinfo,
1025 Lisp_Object parms)
1026{
1027 struct {
1028 const char *val;
1029 const char *cls;
1030 Lisp_Object tem;
1031 } r[] = {
1032 { "width", "Width", Qwidth },
1033 { "height", "Height", Qheight },
1034 { "left", "Left", Qleft },
1035 { "top", "Top", Qtop },
1036 };
1037
1038 int i;
1039 for (i = 0; i < sizeof (r)/sizeof (r[0]); ++i)
1040 {
1041 if (NILP (Fassq (r[i].tem, parms)))
1042 {
1043 Lisp_Object value
1044 = x_get_arg (dpyinfo, parms, r[i].tem, r[i].val, r[i].cls,
1045 RES_TYPE_NUMBER);
1046 if (! EQ (value, Qunbound))
1047 parms = Fcons (Fcons (r[i].tem, value), parms);
1048 }
1049 }
a97f8f3f 1050
a0c3fad0
JD
1051 return parms;
1052}
cb83c00b
AR
1053
1054/* ==========================================================================
1055
1056 Lisp definitions
1057
1058 ========================================================================== */
1059
9e50ff0c 1060DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
edfda783 1061 1, 1, 0,
a97f8f3f 1062 doc: /* Make a new Nextstep window, called a "frame" in Emacs terms.
d26fbe1a
CY
1063Return an Emacs frame object.
1064PARMS is an alist of frame parameters.
1065If the parameters specify that the frame should not have a minibuffer,
1066and do not specify a specific minibuffer window to use,
1067then `default-minibuffer-frame' must be a frame whose minibuffer can
a97f8f3f
JD
1068be shared by the new frame.
1069
1070This function is an internal primitive--use `make-frame' instead. */)
5842a27b 1071 (Lisp_Object parms)
edfda783 1072{
edfda783 1073 struct frame *f;
edfda783
AR
1074 Lisp_Object frame, tem;
1075 Lisp_Object name;
1076 int minibuffer_only = 0;
a97f8f3f
JD
1077 int window_prompting = 0;
1078 int width, height;
d311d28c 1079 ptrdiff_t count = specpdl_ptr - specpdl;
a97f8f3f 1080 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
edfda783
AR
1081 Lisp_Object display;
1082 struct ns_display_info *dpyinfo = NULL;
1083 Lisp_Object parent;
1084 struct kboard *kb;
1085 Lisp_Object tfont, tfontsize;
a97f8f3f 1086 static int desc_ctr = 1;
edfda783 1087
a97f8f3f 1088 /* x_get_arg modifies parms. */
bd6ce2ba
AR
1089 parms = Fcopy_alist (parms);
1090
a97f8f3f
JD
1091 /* Use this general default value to start with
1092 until we know if this frame has a specified name. */
1093 Vx_resource_name = Vinvocation_name;
1094
edfda783
AR
1095 display = x_get_arg (dpyinfo, parms, Qterminal, 0, 0, RES_TYPE_STRING);
1096 if (EQ (display, Qunbound))
1097 display = Qnil;
1098 dpyinfo = check_ns_display_info (display);
a97f8f3f 1099 kb = dpyinfo->terminal->kboard;
edfda783
AR
1100
1101 if (!dpyinfo->terminal->name)
1102 error ("Terminal is not live, can't create new frames on it");
1103
edfda783
AR
1104 name = x_get_arg (dpyinfo, parms, Qname, 0, 0, RES_TYPE_STRING);
1105 if (!STRINGP (name)
1106 && ! EQ (name, Qunbound)
1107 && ! NILP (name))
1108 error ("Invalid frame name--not a string or nil");
1109
1110 if (STRINGP (name))
1111 Vx_resource_name = name;
1112
1113 parent = x_get_arg (dpyinfo, parms, Qparent_id, 0, 0, RES_TYPE_NUMBER);
1114 if (EQ (parent, Qunbound))
1115 parent = Qnil;
1116 if (! NILP (parent))
1117 CHECK_NUMBER (parent);
1118
a97f8f3f
JD
1119 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
1120 /* No need to protect DISPLAY because that's not used after passing
1121 it to make_frame_without_minibuffer. */
edfda783
AR
1122 frame = Qnil;
1123 GCPRO4 (parms, parent, name, frame);
edfda783
AR
1124 tem = x_get_arg (dpyinfo, parms, Qminibuffer, "minibuffer", "Minibuffer",
1125 RES_TYPE_SYMBOL);
1126 if (EQ (tem, Qnone) || NILP (tem))
edfda783 1127 f = make_frame_without_minibuffer (Qnil, kb, display);
edfda783
AR
1128 else if (EQ (tem, Qonly))
1129 {
1130 f = make_minibuffer_frame ();
1131 minibuffer_only = 1;
1132 }
1133 else if (WINDOWP (tem))
edfda783 1134 f = make_frame_without_minibuffer (tem, kb, display);
edfda783 1135 else
edfda783 1136 f = make_frame (1);
edfda783
AR
1137
1138 XSETFRAME (frame, f);
edfda783
AR
1139
1140 f->terminal = dpyinfo->terminal;
edfda783
AR
1141
1142 f->output_method = output_ns;
38182d90 1143 f->output_data.ns = xzalloc (sizeof *f->output_data.ns);
edfda783
AR
1144
1145 FRAME_FONTSET (f) = -1;
1146
f00af5b1
PE
1147 fset_icon_name (f, x_get_arg (dpyinfo, parms, Qicon_name,
1148 "iconName", "Title",
1149 RES_TYPE_STRING));
e69b0960 1150 if (! STRINGP (f->icon_name))
f00af5b1 1151 fset_icon_name (f, Qnil);
edfda783
AR
1152
1153 FRAME_NS_DISPLAY_INFO (f) = dpyinfo;
1154
a97f8f3f
JD
1155 /* With FRAME_NS_DISPLAY_INFO set up, this unwind-protect is safe. */
1156 record_unwind_protect (unwind_create_frame, frame);
1157
edfda783 1158 f->output_data.ns->window_desc = desc_ctr++;
d311d28c 1159 if (TYPE_RANGED_INTEGERP (Window, parent))
edfda783 1160 {
d311d28c 1161 f->output_data.ns->parent_desc = XFASTINT (parent);
edfda783
AR
1162 f->output_data.ns->explicit_parent = 1;
1163 }
1164 else
1165 {
1166 f->output_data.ns->parent_desc = FRAME_NS_DISPLAY_INFO (f)->root_window;
1167 f->output_data.ns->explicit_parent = 0;
1168 }
1169
a97f8f3f
JD
1170 /* Set the name; the functions to which we pass f expect the name to
1171 be set. */
1172 if (EQ (name, Qunbound) || NILP (name) || ! STRINGP (name))
1173 {
f00af5b1 1174 fset_name (f, build_string ([ns_app_name UTF8String]));
a97f8f3f
JD
1175 f->explicit_name = 0;
1176 }
1177 else
1178 {
f00af5b1 1179 fset_name (f, name);
a97f8f3f
JD
1180 f->explicit_name = 1;
1181 specbind (Qx_resource_name, name);
1182 }
1183
4d7e6e51 1184 block_input ();
edfda783
AR
1185 register_font_driver (&nsfont_driver, f);
1186 x_default_parameter (f, parms, Qfont_backend, Qnil,
1187 "fontBackend", "FontBackend", RES_TYPE_STRING);
1188
1189 {
1190 /* use for default font name */
1191 id font = [NSFont userFixedPitchFontOfSize: -1.0]; /* default */
1192 tfontsize = x_default_parameter (f, parms, Qfontsize,
1193 make_number (0 /*(int)[font pointSize]*/),
1194 "fontSize", "FontSize", RES_TYPE_NUMBER);
1195 tfont = x_default_parameter (f, parms, Qfont,
1196 build_string ([[font fontName] UTF8String]),
1197 "font", "Font", RES_TYPE_STRING);
1198 }
4d7e6e51 1199 unblock_input ();
edfda783
AR
1200
1201 x_default_parameter (f, parms, Qborder_width, make_number (0),
1202 "borderwidth", "BorderWidth", RES_TYPE_NUMBER);
1203 x_default_parameter (f, parms, Qinternal_border_width, make_number (2),
1204 "internalBorderWidth", "InternalBorderWidth",
1205 RES_TYPE_NUMBER);
1206
1207 /* default scrollbars on right on Mac */
1208 {
facfbbbd 1209 Lisp_Object spos
edfda783 1210#ifdef NS_IMPL_GNUSTEP
facfbbbd 1211 = Qt;
edfda783 1212#else
facfbbbd 1213 = Qright;
edfda783 1214#endif
facfbbbd
SM
1215 x_default_parameter (f, parms, Qvertical_scroll_bars, spos,
1216 "verticalScrollBars", "VerticalScrollBars",
1217 RES_TYPE_SYMBOL);
edfda783
AR
1218 }
1219 x_default_parameter (f, parms, Qforeground_color, build_string ("Black"),
1220 "foreground", "Foreground", RES_TYPE_STRING);
1221 x_default_parameter (f, parms, Qbackground_color, build_string ("White"),
1222 "background", "Background", RES_TYPE_STRING);
22bcf204 1223 /* FIXME: not supported yet in Nextstep */
edfda783
AR
1224 x_default_parameter (f, parms, Qline_spacing, Qnil,
1225 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER);
1226 x_default_parameter (f, parms, Qleft_fringe, Qnil,
1227 "leftFringe", "LeftFringe", RES_TYPE_NUMBER);
1228 x_default_parameter (f, parms, Qright_fringe, Qnil,
1229 "rightFringe", "RightFringe", RES_TYPE_NUMBER);
edfda783 1230
ef884f23 1231#ifdef GLYPH_DEBUG
a97f8f3f
JD
1232 image_cache_refcount =
1233 FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
1234#endif
edfda783
AR
1235
1236 init_frame_faces (f);
1237
a97f8f3f 1238 /* The resources controlling the menu-bar and tool-bar are
6431f2e6
CY
1239 processed specially at startup, and reflected in the mode
1240 variables; ignore them here. */
1241 x_default_parameter (f, parms, Qmenu_bar_lines,
1242 NILP (Vmenu_bar_mode)
1243 ? make_number (0) : make_number (1),
1244 NULL, NULL, RES_TYPE_NUMBER);
1245 x_default_parameter (f, parms, Qtool_bar_lines,
1246 NILP (Vtool_bar_mode)
1247 ? make_number (0) : make_number (1),
1248 NULL, NULL, RES_TYPE_NUMBER);
1249
edfda783
AR
1250 x_default_parameter (f, parms, Qbuffer_predicate, Qnil, "bufferPredicate",
1251 "BufferPredicate", RES_TYPE_SYMBOL);
1252 x_default_parameter (f, parms, Qtitle, Qnil, "title", "Title",
1253 RES_TYPE_STRING);
1254
a0c3fad0 1255 parms = get_geometry_from_preferences (dpyinfo, parms);
edfda783
AR
1256 window_prompting = x_figure_window_size (f, parms, 1);
1257
1258 tem = x_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
1259 f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !EQ (tem, Qnil));
1260
1261 /* NOTE: on other terms, this is done in set_mouse_color, however this
d26fbe1a 1262 was not getting called under Nextstep */
edfda783
AR
1263 f->output_data.ns->text_cursor = [NSCursor IBeamCursor];
1264 f->output_data.ns->nontext_cursor = [NSCursor arrowCursor];
1265 f->output_data.ns->modeline_cursor = [NSCursor pointingHandCursor];
1266 f->output_data.ns->hand_cursor = [NSCursor pointingHandCursor];
1267 f->output_data.ns->hourglass_cursor = [NSCursor disappearingItemCursor];
1268 f->output_data.ns->horizontal_drag_cursor = [NSCursor resizeLeftRightCursor];
facfbbbd
SM
1269 FRAME_NS_DISPLAY_INFO (f)->vertical_scroll_bar_cursor
1270 = [NSCursor arrowCursor];
edfda783
AR
1271 f->output_data.ns->current_pointer = f->output_data.ns->text_cursor;
1272
1273 [[EmacsView alloc] initFrameFromEmacs: f];
1274
952913d4 1275 x_icon (f, parms);
edfda783 1276
a97f8f3f
JD
1277 /* ns_display_info does not have a reference_count. */
1278 f->terminal->reference_count++;
1279
edfda783
AR
1280 /* It is now ok to make the frame official even if we get an error below.
1281 The frame needs to be on Vframe_list or making it visible won't work. */
1282 Vframe_list = Fcons (frame, Vframe_list);
a97f8f3f
JD
1283
1284 x_default_parameter (f, parms, Qicon_type, Qnil,
1285 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL);
1286
1287 x_default_parameter (f, parms, Qauto_raise, Qnil,
1288 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN);
1289 x_default_parameter (f, parms, Qauto_lower, Qnil,
1290 "autoLower", "AutoLower", RES_TYPE_BOOLEAN);
1291 x_default_parameter (f, parms, Qcursor_type, Qbox,
1292 "cursorType", "CursorType", RES_TYPE_SYMBOL);
1293 x_default_parameter (f, parms, Qscroll_bar_width, Qnil,
1294 "scrollBarWidth", "ScrollBarWidth",
1295 RES_TYPE_NUMBER);
1296 x_default_parameter (f, parms, Qalpha, Qnil,
1297 "alpha", "Alpha", RES_TYPE_NUMBER);
04fafa46
JD
1298 x_default_parameter (f, parms, Qfullscreen, Qnil,
1299 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL);
edfda783
AR
1300
1301 width = FRAME_COLS (f);
1302 height = FRAME_LINES (f);
1303
1304 SET_FRAME_COLS (f, 0);
1305 FRAME_LINES (f) = 0;
1306 change_frame_size (f, height, width, 1, 0, 0);
1307
1308 if (! f->output_data.ns->explicit_parent)
1309 {
a97f8f3f
JD
1310 Lisp_Object visibility;
1311
1312 visibility = x_get_arg (dpyinfo, parms, Qvisibility, 0, 0,
1313 RES_TYPE_SYMBOL);
1314 if (EQ (visibility, Qunbound))
1315 visibility = Qt;
1316
1317 if (EQ (visibility, Qicon))
15891144 1318 x_iconify_frame (f);
a97f8f3f 1319 else if (! NILP (visibility))
15891144
DR
1320 {
1321 x_make_frame_visible (f);
15891144
DR
1322 [[FRAME_NS_VIEW (f) window] makeKeyWindow];
1323 }
1324 else
a97f8f3f
JD
1325 {
1326 /* Must have been Qnil. */
1327 }
edfda783
AR
1328 }
1329
1330 if (FRAME_HAS_MINIBUF_P (f)
124c9ff0
JD
1331 && (!FRAMEP (KVAR (kb, Vdefault_minibuffer_frame))
1332 || !FRAME_LIVE_P (XFRAME (KVAR (kb, Vdefault_minibuffer_frame)))))
15dbb4d6 1333 kset_default_minibuffer_frame (kb, frame);
edfda783
AR
1334
1335 /* All remaining specified parameters, which have not been "used"
1336 by x_get_arg and friends, now go in the misc. alist of the frame. */
1337 for (tem = parms; CONSP (tem); tem = XCDR (tem))
1338 if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
f00af5b1 1339 fset_param_alist (f, Fcons (XCAR (tem), f->param_alist));
edfda783
AR
1340
1341 UNGCPRO;
a97f8f3f 1342
e543ae91
JD
1343 if (window_prompting & USPosition)
1344 x_set_offset (f, f->left_pos, f->top_pos, 1);
1345
a97f8f3f
JD
1346 /* Make sure windows on this frame appear in calls to next-window
1347 and similar functions. */
edfda783
AR
1348 Vwindow_list = Qnil;
1349
1350 return unbind_to (count, frame);
1351}
1352
1353
9e50ff0c 1354DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
edfda783
AR
1355 doc: /* Set the input focus to FRAME.
1356FRAME nil means use the selected frame. */)
5842a27b 1357 (Lisp_Object frame)
edfda783 1358{
7452b7bd 1359 struct frame *f = decode_window_system_frame (frame);
edfda783
AR
1360 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
1361
9e50ff0c 1362 if (dpyinfo->x_focus_frame != f)
edfda783
AR
1363 {
1364 EmacsView *view = FRAME_NS_VIEW (f);
4d7e6e51 1365 block_input ();
4acaaa2b 1366 [NSApp activateIgnoringOtherApps: YES];
edfda783 1367 [[view window] makeKeyAndOrderFront: view];
4d7e6e51 1368 unblock_input ();
edfda783
AR
1369 }
1370
1371 return Qnil;
1372}
1373
1374
edfda783 1375DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel,
51d5ef9f
AR
1376 0, 1, "",
1377 doc: /* Pop up the font panel. */)
5842a27b 1378 (Lisp_Object frame)
edfda783 1379{
7452b7bd
DA
1380 struct frame *f = decode_window_system_frame (frame);
1381 id fm = [NSFontManager sharedFontManager];
edfda783
AR
1382
1383 [fm setSelectedFont: ((struct nsfont_info *)f->output_data.ns->font)->nsfont
1384 isMultiple: NO];
1385 [fm orderFrontFontPanel: NSApp];
1386 return Qnil;
1387}
1388
1389
b066e6b6 1390DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel,
51d5ef9f
AR
1391 0, 1, "",
1392 doc: /* Pop up the color panel. */)
5842a27b 1393 (Lisp_Object frame)
edfda783 1394{
7452b7bd 1395 check_window_system (NULL);
edfda783
AR
1396 [NSApp orderFrontColorPanel: NSApp];
1397 return Qnil;
1398}
1399
1400
d7e642cc 1401DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 5, 0,
51d5ef9f 1402 doc: /* Use a graphical panel to read a file name, using prompt PROMPT.
d26fbe1a 1403Optional arg DIR, if non-nil, supplies a default directory.
45cb8994
CY
1404Optional arg MUSTMATCH, if non-nil, means the returned file or
1405directory must exist.
d7e642cc
JD
1406Optional arg INIT, if non-nil, provides a default file name to use.
1407Optional arg DIR_ONLY_P, if non-nil, means choose only directories. */)
1408 (Lisp_Object prompt, Lisp_Object dir, Lisp_Object mustmatch,
1409 Lisp_Object init, Lisp_Object dir_only_p)
edfda783
AR
1410{
1411 static id fileDelegate = nil;
8f2906f5 1412 BOOL ret;
edfda783 1413 id panel;
ba301db3 1414 Lisp_Object fname;
edfda783
AR
1415
1416 NSString *promptS = NILP (prompt) || !STRINGP (prompt) ? nil :
0dc8cf50 1417 [NSString stringWithUTF8String: SSDATA (prompt)];
edfda783 1418 NSString *dirS = NILP (dir) || !STRINGP (dir) ?
0dc8cf50
JD
1419 [NSString stringWithUTF8String: SSDATA (BVAR (current_buffer, directory))] :
1420 [NSString stringWithUTF8String: SSDATA (dir)];
edfda783 1421 NSString *initS = NILP (init) || !STRINGP (init) ? nil :
0dc8cf50 1422 [NSString stringWithUTF8String: SSDATA (init)];
edfda783 1423
7452b7bd 1424 check_window_system (NULL);
edfda783
AR
1425
1426 if (fileDelegate == nil)
1427 fileDelegate = [EmacsFileDelegate new];
1428
1429 [NSCursor setHiddenUntilMouseMoves: NO];
1430
1431 if ([dirS characterAtIndex: 0] == '~')
1432 dirS = [dirS stringByExpandingTildeInPath];
1433
d7e642cc 1434 panel = NILP (mustmatch) && NILP (dir_only_p) ?
f2f7f42c 1435 (id)[EmacsSavePanel savePanel] : (id)[EmacsOpenPanel openPanel];
edfda783
AR
1436
1437 [panel setTitle: promptS];
1438
d7e642cc 1439 [panel setAllowsOtherFileTypes: YES];
edfda783
AR
1440 [panel setTreatsFilePackagesAsDirectories: YES];
1441 [panel setDelegate: fileDelegate];
1442
1443 panelOK = 0;
677d5c92 1444 if (! NILP (dir_only_p))
d7e642cc
JD
1445 {
1446 [panel setCanChooseDirectories: YES];
1447 [panel setCanChooseFiles: NO];
1448 }
8f2906f5
JD
1449 else
1450 {
1451 /* This is not quite what the documentation says, but it is compatible
1452 with the Gtk+ code. Also, the menu entry says "Open File...". */
1453 [panel setCanChooseDirectories: NO];
1454 [panel setCanChooseFiles: YES];
1455 }
677d5c92 1456
edbdcec0 1457 block_input ();
d7e642cc
JD
1458#if defined (NS_IMPL_COCOA) && \
1459 MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
1460 if (! NILP (mustmatch) || ! NILP (dir_only_p))
1461 [panel setAllowedFileTypes: nil];
1462 if (dirS) [panel setDirectoryURL: [NSURL fileURLWithPath: dirS]];
1463 if (initS && NILP (Ffile_directory_p (init)))
1464 [panel setNameFieldStringValue: [initS lastPathComponent]];
1465 else
1466 [panel setNameFieldStringValue: @""];
677d5c92 1467
d7e642cc
JD
1468 ret = [panel runModal];
1469#else
1470 if (NILP (mustmatch) && NILP (dir_only_p))
edfda783
AR
1471 {
1472 ret = [panel runModalForDirectory: dirS file: initS];
1473 }
1474 else
1475 {
edfda783
AR
1476 ret = [panel runModalForDirectory: dirS file: initS types: nil];
1477 }
d7e642cc 1478#endif
edfda783 1479
575fb8bd 1480 ret = (ret == NSOKButton) || panelOK;
edfda783 1481
a37d34f3 1482 if (ret)
8f2906f5
JD
1483 {
1484 NSString *str = [panel getFilename];
1485 if (! str) str = [panel getDirectory];
1486 if (! str) ret = NO;
1487 else fname = build_string ([str UTF8String]);
1488 }
b066e6b6 1489
edfda783 1490 [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
4d7e6e51 1491 unblock_input ();
edfda783 1492
ba301db3 1493 return ret ? fname : Qnil;
edfda783
AR
1494}
1495
f7dfe5d6
JD
1496const char *
1497ns_get_defaults_value (const char *key)
1498{
1499 NSObject *obj = [[NSUserDefaults standardUserDefaults]
1500 objectForKey: [NSString stringWithUTF8String: key]];
1501
1502 if (!obj) return NULL;
1503
1504 return [[NSString stringWithFormat: @"%@", obj] UTF8String];
1505}
1506
edfda783
AR
1507
1508DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0,
51d5ef9f
AR
1509 doc: /* Return the value of the property NAME of OWNER from the defaults database.
1510If OWNER is nil, Emacs is assumed. */)
5842a27b 1511 (Lisp_Object owner, Lisp_Object name)
edfda783
AR
1512{
1513 const char *value;
1514
7452b7bd 1515 check_window_system (NULL);
edfda783 1516 if (NILP (owner))
56d513e6 1517 owner = build_string([ns_app_name UTF8String]);
edfda783 1518 CHECK_STRING (name);
edfda783 1519
0dc8cf50 1520 value = ns_get_defaults_value (SSDATA (name));
edfda783
AR
1521
1522 if (value)
1523 return build_string (value);
edfda783
AR
1524 return Qnil;
1525}
1526
1527
1528DEFUN ("ns-set-resource", Fns_set_resource, Sns_set_resource, 3, 3, 0,
51d5ef9f 1529 doc: /* Set property NAME of OWNER to VALUE, from the defaults database.
d26fbe1a 1530If OWNER is nil, Emacs is assumed.
51d5ef9f 1531If VALUE is nil, the default is removed. */)
5842a27b 1532 (Lisp_Object owner, Lisp_Object name, Lisp_Object value)
edfda783 1533{
7452b7bd 1534 check_window_system (NULL);
edfda783 1535 if (NILP (owner))
56d513e6 1536 owner = build_string ([ns_app_name UTF8String]);
edfda783
AR
1537 CHECK_STRING (name);
1538 if (NILP (value))
1539 {
1540 [[NSUserDefaults standardUserDefaults] removeObjectForKey:
0dc8cf50 1541 [NSString stringWithUTF8String: SSDATA (name)]];
edfda783
AR
1542 }
1543 else
1544 {
1545 CHECK_STRING (value);
1546 [[NSUserDefaults standardUserDefaults] setObject:
0dc8cf50 1547 [NSString stringWithUTF8String: SSDATA (value)]
edfda783 1548 forKey: [NSString stringWithUTF8String:
0dc8cf50 1549 SSDATA (name)]];
edfda783
AR
1550 }
1551
1552 return Qnil;
1553}
1554
1555
952913d4
DN
1556DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
1557 Sx_server_max_request_size,
edfda783 1558 0, 1, 0,
51d5ef9f 1559 doc: /* This function is a no-op. It is only present for completeness. */)
91e8418b 1560 (Lisp_Object terminal)
edfda783 1561{
91e8418b 1562 check_ns_display_info (terminal);
edfda783
AR
1563 /* This function has no real equivalent under NeXTstep. Return nil to
1564 indicate this. */
1565 return Qnil;
1566}
1567
1568
9e50ff0c 1569DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
91e8418b
YM
1570 doc: /* Return the "vendor ID" string of Nextstep display server TERMINAL.
1571\(Labeling every distributor as a "vendor" embodies the false assumption
1572that operating systems cannot be developed and distributed noncommercially.)
1573The optional argument TERMINAL specifies which display to ask about.
1574TERMINAL should be a terminal object, a frame or a display name (a string).
1575If omitted or nil, that stands for the selected frame's display. */)
1576 (Lisp_Object terminal)
edfda783 1577{
91e8418b 1578 check_ns_display_info (terminal);
edfda783
AR
1579#ifdef NS_IMPL_GNUSTEP
1580 return build_string ("GNU");
1581#else
1582 return build_string ("Apple");
1583#endif
1584}
1585
1586
9e50ff0c 1587DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
91e8418b 1588 doc: /* Return the version numbers of the server of display TERMINAL.
f5497e45 1589The value is a list of three integers: the major and minor
91e8418b
YM
1590version numbers of the X Protocol in use, and the distributor-specific release
1591number. See also the function `x-server-vendor'.
f5497e45 1592
91e8418b
YM
1593The optional argument TERMINAL specifies which display to ask about.
1594TERMINAL should be a terminal object, a frame or a display name (a string).
f5497e45 1595If omitted or nil, that stands for the selected frame's display. */)
91e8418b 1596 (Lisp_Object terminal)
edfda783 1597{
91e8418b 1598 check_ns_display_info (terminal);
f5497e45
AR
1599 /*NOTE: it is unclear what would best correspond with "protocol";
1600 we return 10.3, meaning Panther, since this is roughly the
1601 level that GNUstep's APIs correspond to.
1602 The last number is where we distinguish between the Apple
1603 and GNUstep implementations ("distributor-specific release
1604 number") and give int'ized versions of major.minor. */
3de717bd 1605 return list3i (10, 3, ns_appkit_version_int ());
edfda783
AR
1606}
1607
1608
9e50ff0c 1609DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
91e8418b
YM
1610 doc: /* Return the number of screens on Nextstep display server TERMINAL.
1611The optional argument TERMINAL specifies which display to ask about.
1612TERMINAL should be a terminal object, a frame or a display name (a string).
1613If omitted or nil, that stands for the selected frame's display.
edfda783 1614
91e8418b
YM
1615Note: "screen" here is not in Nextstep terminology but in X11's. For
1616the number of physical monitors, use `(length
1617(display-monitor-attributes-list TERMINAL))' instead. */)
1618 (Lisp_Object terminal)
1619{
1620 check_ns_display_info (terminal);
1621 return make_number (1);
edfda783
AR
1622}
1623
1624
91e8418b
YM
1625DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1, 0,
1626 doc: /* Return the height in millimeters of the Nextstep display TERMINAL.
1627The optional argument TERMINAL specifies which display to ask about.
1628TERMINAL should be a terminal object, a frame or a display name (a string).
1629If omitted or nil, that stands for the selected frame's display.
1630
1631On \"multi-monitor\" setups this refers to the height in millimeters for
1632all physical monitors associated with TERMINAL. To get information
1633for each physical monitor, use `display-monitor-attributes-list'. */)
1634 (Lisp_Object terminal)
edfda783 1635{
91e8418b
YM
1636 struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
1637
1638 return make_number (x_display_pixel_height (dpyinfo) / (92.0/25.4));
edfda783
AR
1639}
1640
1641
91e8418b
YM
1642DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0,
1643 doc: /* Return the width in millimeters of the Nextstep display TERMINAL.
1644The optional argument TERMINAL specifies which display to ask about.
1645TERMINAL should be a terminal object, a frame or a display name (a string).
1646If omitted or nil, that stands for the selected frame's display.
1647
1648On \"multi-monitor\" setups this refers to the width in millimeters for
1649all physical monitors associated with TERMINAL. To get information
1650for each physical monitor, use `display-monitor-attributes-list'. */)
1651 (Lisp_Object terminal)
edfda783 1652{
91e8418b
YM
1653 struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
1654
1655 return make_number (x_display_pixel_width (dpyinfo) / (92.0/25.4));
edfda783
AR
1656}
1657
1658
9e50ff0c 1659DEFUN ("x-display-backing-store", Fx_display_backing_store,
51d5ef9f 1660 Sx_display_backing_store, 0, 1, 0,
91e8418b 1661 doc: /* Return an indication of whether the Nextstep display TERMINAL does backing store.
d26fbe1a 1662The value may be `buffered', `retained', or `non-retained'.
91e8418b
YM
1663The optional argument TERMINAL specifies which display to ask about.
1664TERMINAL should be a terminal object, a frame or a display name (a string).
1665If omitted or nil, that stands for the selected frame's display. */)
1666 (Lisp_Object terminal)
edfda783 1667{
91e8418b
YM
1668 check_ns_display_info (terminal);
1669 switch ([ns_get_window (terminal) backingType])
edfda783
AR
1670 {
1671 case NSBackingStoreBuffered:
1672 return intern ("buffered");
1673 case NSBackingStoreRetained:
1674 return intern ("retained");
1675 case NSBackingStoreNonretained:
1676 return intern ("non-retained");
1677 default:
1678 error ("Strange value for backingType parameter of frame");
1679 }
1680 return Qnil; /* not reached, shut compiler up */
1681}
1682
1683
9e50ff0c 1684DEFUN ("x-display-visual-class", Fx_display_visual_class,
51d5ef9f 1685 Sx_display_visual_class, 0, 1, 0,
91e8418b 1686 doc: /* Return the visual class of the Nextstep display TERMINAL.
d26fbe1a
CY
1687The value is one of the symbols `static-gray', `gray-scale',
1688`static-color', `pseudo-color', `true-color', or `direct-color'.
91e8418b
YM
1689
1690The optional argument TERMINAL specifies which display to ask about.
1691TERMINAL should a terminal object, a frame or a display name (a string).
1692If omitted or nil, that stands for the selected frame's display. */)
1693 (Lisp_Object terminal)
edfda783
AR
1694{
1695 NSWindowDepth depth;
a37d34f3 1696
91e8418b
YM
1697 check_ns_display_info (terminal);
1698 depth = [[[NSScreen screens] objectAtIndex:0] depth];
edfda783
AR
1699
1700 if ( depth == NSBestDepth (NSCalibratedWhiteColorSpace, 2, 2, YES, NULL))
1701 return intern ("static-gray");
1702 else if (depth == NSBestDepth (NSCalibratedWhiteColorSpace, 8, 8, YES, NULL))
1703 return intern ("gray-scale");
1704 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 8, 8, YES, NULL))
1705 return intern ("pseudo-color");
1706 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 4, 12, NO, NULL))
1707 return intern ("true-color");
1708 else if ( depth == NSBestDepth (NSCalibratedRGBColorSpace, 8, 24, NO, NULL))
1709 return intern ("direct-color");
1710 else
d26fbe1a 1711 /* color mgmt as far as we do it is really handled by Nextstep itself anyway */
edfda783
AR
1712 return intern ("direct-color");
1713}
1714
1715
9e50ff0c 1716DEFUN ("x-display-save-under", Fx_display_save_under,
51d5ef9f 1717 Sx_display_save_under, 0, 1, 0,
91e8418b
YM
1718 doc: /* Return t if TERMINAL supports the save-under feature.
1719The optional argument TERMINAL specifies which display to ask about.
1720TERMINAL should be a terminal object, a frame or a display name (a string).
1721If omitted or nil, that stands for the selected frame's display. */)
1722 (Lisp_Object terminal)
1723{
1724 check_ns_display_info (terminal);
1725 switch ([ns_get_window (terminal) backingType])
edfda783
AR
1726 {
1727 case NSBackingStoreBuffered:
1728 return Qt;
1729
1730 case NSBackingStoreRetained:
1731 case NSBackingStoreNonretained:
1732 return Qnil;
1733
1734 default:
1735 error ("Strange value for backingType parameter of frame");
1736 }
1737 return Qnil; /* not reached, shut compiler up */
1738}
1739
1740
9e50ff0c 1741DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
51d5ef9f 1742 1, 3, 0,
4f4f2973 1743 doc: /* Open a connection to a display server.
d26fbe1a 1744DISPLAY is the name of the display to connect to.
4f4f2973
GM
1745Optional second arg XRM-STRING is a string of resources in xrdb format.
1746If the optional third arg MUST-SUCCEED is non-nil,
1747terminate Emacs if we can't open the connection.
1748\(In the Nextstep version, the last two arguments are currently ignored.) */)
5842a27b 1749 (Lisp_Object display, Lisp_Object resource_string, Lisp_Object must_succeed)
edfda783
AR
1750{
1751 struct ns_display_info *dpyinfo;
1752
1753 CHECK_STRING (display);
1754
1755 nxatoms_of_nsselect ();
1756 dpyinfo = ns_term_init (display);
1757 if (dpyinfo == 0)
1758 {
1759 if (!NILP (must_succeed))
1760 fatal ("OpenStep on %s not responding.\n",
0dc8cf50 1761 SSDATA (display));
edfda783
AR
1762 else
1763 error ("OpenStep on %s not responding.\n",
0dc8cf50 1764 SSDATA (display));
edfda783
AR
1765 }
1766
edfda783
AR
1767 return Qnil;
1768}
1769
1770
9e50ff0c 1771DEFUN ("x-close-connection", Fx_close_connection, Sx_close_connection,
51d5ef9f 1772 1, 1, 0,
91e8418b
YM
1773 doc: /* Close the connection to TERMINAL's Nextstep display server.
1774For TERMINAL, specify a terminal object, a frame or a display name (a
1775string). If TERMINAL is nil, that stands for the selected frame's
1776terminal. */)
1777 (Lisp_Object terminal)
edfda783 1778{
91e8418b 1779 check_ns_display_info (terminal);
edfda783
AR
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. */)
5842a27b 1787 (void)
edfda783
AR
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 1800 0, 0, 0,
b066e6b6 1801 doc: /* Hides all applications other than Emacs. */)
5842a27b 1802 (void)
edfda783 1803{
7452b7bd 1804 check_window_system (NULL);
edfda783
AR
1805 [NSApp hideOtherApplications: NSApp];
1806 return Qnil;
1807}
1808
1809DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs,
51d5ef9f 1810 1, 1, 0,
b066e6b6
JB
1811 doc: /* If ON is non-nil, the entire Emacs application is hidden.
1812Otherwise if Emacs is hidden, it is unhidden.
1813If ON is equal to `activate', Emacs is unhidden and becomes
51d5ef9f 1814the active application. */)
5842a27b 1815 (Lisp_Object on)
edfda783 1816{
7452b7bd 1817 check_window_system (NULL);
edfda783
AR
1818 if (EQ (on, intern ("activate")))
1819 {
1820 [NSApp unhide: NSApp];
1821 [NSApp activateIgnoringOtherApps: YES];
1822 }
1823 else if (NILP (on))
1824 [NSApp unhide: NSApp];
1825 else
1826 [NSApp hide: NSApp];
1827 return Qnil;
1828}
1829
1830
1831DEFUN ("ns-emacs-info-panel", Fns_emacs_info_panel, Sns_emacs_info_panel,
51d5ef9f
AR
1832 0, 0, 0,
1833 doc: /* Shows the 'Info' or 'About' panel for Emacs. */)
5842a27b 1834 (void)
edfda783 1835{
7452b7bd 1836 check_window_system (NULL);
edfda783
AR
1837 [NSApp orderFrontStandardAboutPanel: nil];
1838 return Qnil;
1839}
1840
1841
edfda783 1842DEFUN ("ns-font-name", Fns_font_name, Sns_font_name, 1, 1, 0,
7877f373 1843 doc: /* Determine font PostScript or family name for font NAME.
d26fbe1a
CY
1844NAME should be a string containing either the font name or an XLFD
1845font descriptor. If string contains `fontset' and not
51d5ef9f 1846`fontset-startup', it is left alone. */)
5842a27b 1847 (Lisp_Object name)
edfda783
AR
1848{
1849 char *nm;
1850 CHECK_STRING (name);
0dc8cf50 1851 nm = SSDATA (name);
edfda783
AR
1852
1853 if (nm[0] != '-')
1854 return name;
1855 if (strstr (nm, "fontset") && !strstr (nm, "fontset-startup"))
1856 return name;
1857
0dc8cf50 1858 return build_string (ns_xlfd_to_fontname (SSDATA (name)));
edfda783
AR
1859}
1860
1861
1862DEFUN ("ns-list-colors", Fns_list_colors, Sns_list_colors, 0, 1, 0,
51d5ef9f
AR
1863 doc: /* Return a list of all available colors.
1864The optional argument FRAME is currently ignored. */)
5842a27b 1865 (Lisp_Object frame)
edfda783
AR
1866{
1867 Lisp_Object list = Qnil;
1868 NSEnumerator *colorlists;
1869 NSColorList *clist;
1870
1871 if (!NILP (frame))
1872 {
1873 CHECK_FRAME (frame);
1874 if (! FRAME_NS_P (XFRAME (frame)))
d26fbe1a 1875 error ("non-Nextstep frame used in `ns-list-colors'");
edfda783
AR
1876 }
1877
4d7e6e51 1878 block_input ();
edfda783
AR
1879
1880 colorlists = [[NSColorList availableColorLists] objectEnumerator];
0dc8cf50 1881 while ((clist = [colorlists nextObject]))
edfda783
AR
1882 {
1883 if ([[clist name] length] < 7 ||
1884 [[clist name] rangeOfString: @"PANTONE"].location == 0)
1885 {
1886 NSEnumerator *cnames = [[clist allKeys] reverseObjectEnumerator];
1887 NSString *cname;
0dc8cf50 1888 while ((cname = [cnames nextObject]))
edfda783
AR
1889 list = Fcons (build_string ([cname UTF8String]), list);
1890/* for (i = [[clist allKeys] count] - 1; i >= 0; i--)
1891 list = Fcons (build_string ([[[clist allKeys] objectAtIndex: i]
1892 UTF8String]), list); */
1893 }
1894 }
1895
4d7e6e51 1896 unblock_input ();
edfda783
AR
1897
1898 return list;
1899}
1900
1901
1902DEFUN ("ns-list-services", Fns_list_services, Sns_list_services, 0, 0, 0,
51d5ef9f 1903 doc: /* List available Nextstep services by querying NSApp. */)
5842a27b 1904 (void)
edfda783 1905{
699c10bd
JD
1906#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
1907 /* You can't get services like this in 10.6+. */
1908 return Qnil;
1909#else
edfda783
AR
1910 Lisp_Object ret = Qnil;
1911 NSMenu *svcs;
1912 id delegate;
1913
7452b7bd 1914 check_window_system (NULL);
edfda783 1915 svcs = [[NSMenu alloc] initWithTitle: @"Services"];
335f5ae4 1916 [NSApp setServicesMenu: svcs];
edfda783
AR
1917 [NSApp registerServicesMenuSendTypes: ns_send_types
1918 returnTypes: ns_return_types];
1919
1920/* On Tiger, services menu updating was made lazier (waits for user to
1921 actually click on the menu), so we have to force things along: */
1922#ifdef NS_IMPL_COCOA
335f5ae4
JD
1923 delegate = [svcs delegate];
1924 if (delegate != nil)
edfda783 1925 {
335f5ae4
JD
1926 if ([delegate respondsToSelector: @selector (menuNeedsUpdate:)])
1927 [delegate menuNeedsUpdate: svcs];
1928 if ([delegate respondsToSelector:
1929 @selector (menu:updateItem:atIndex:shouldCancel:)])
edfda783 1930 {
335f5ae4
JD
1931 int i, len = [delegate numberOfItemsInMenu: svcs];
1932 for (i =0; i<len; i++)
1933 [svcs addItemWithTitle: @"" action: NULL keyEquivalent: @""];
1934 for (i =0; i<len; i++)
1935 if (![delegate menu: svcs
1936 updateItem: (NSMenuItem *)[svcs itemAtIndex: i]
1937 atIndex: i shouldCancel: NO])
1938 break;
edfda783
AR
1939 }
1940 }
1941#endif
1942
1943 [svcs setAutoenablesItems: NO];
1944#ifdef NS_IMPL_COCOA
1945 [svcs update]; /* on OS X, converts from '/' structure */
1946#endif
1947
1948 ret = interpret_services_menu (svcs, Qnil, ret);
1949 return ret;
699c10bd 1950#endif
edfda783
AR
1951}
1952
1953
1954DEFUN ("ns-perform-service", Fns_perform_service, Sns_perform_service,
51d5ef9f
AR
1955 2, 2, 0,
1956 doc: /* Perform Nextstep SERVICE on SEND.
d26fbe1a
CY
1957SEND should be either a string or nil.
1958The return value is the result of the service, as string, or nil if
51d5ef9f 1959there was no result. */)
5842a27b 1960 (Lisp_Object service, Lisp_Object send)
edfda783
AR
1961{
1962 id pb;
1963 NSString *svcName;
1964 char *utfStr;
edfda783
AR
1965
1966 CHECK_STRING (service);
7452b7bd 1967 check_window_system (NULL);
edfda783 1968
0dc8cf50 1969 utfStr = SSDATA (service);
edfda783
AR
1970 svcName = [NSString stringWithUTF8String: utfStr];
1971
1972 pb =[NSPasteboard pasteboardWithUniqueName];
1973 ns_string_to_pasteboard (pb, send);
1974
1975 if (NSPerformService (svcName, pb) == NO)
1976 Fsignal (Qquit, Fcons (build_string ("service not available"), Qnil));
1977
1978 if ([[pb types] count] == 0)
1979 return build_string ("");
1980 return ns_string_from_pasteboard (pb);
1981}
1982
1983
1984DEFUN ("ns-convert-utf8-nfd-to-nfc", Fns_convert_utf8_nfd_to_nfc,
1985 Sns_convert_utf8_nfd_to_nfc, 1, 1, 0,
b066e6b6 1986 doc: /* Return an NFC string that matches the UTF-8 NFD string STR. */)
5842a27b 1987 (Lisp_Object str)
edfda783 1988{
f2f7f42c
AR
1989/* TODO: If GNUstep ever implements precomposedStringWithCanonicalMapping,
1990 remove this. */
edfda783
AR
1991 NSString *utfStr;
1992
1993 CHECK_STRING (str);
0dc8cf50 1994 utfStr = [NSString stringWithUTF8String: SSDATA (str)];
f2f7f42c
AR
1995 if (![utfStr respondsToSelector:
1996 @selector (precomposedStringWithCanonicalMapping)])
1997 {
1998 message1
1999 ("Warning: ns-convert-utf8-nfd-to-nfc unsupported under GNUstep.\n");
2000 return Qnil;
2001 }
2002 else
2003 utfStr = [utfStr precomposedStringWithCanonicalMapping];
edfda783
AR
2004 return build_string ([utfStr UTF8String]);
2005}
2006
2007
583ff3c3
AR
2008#ifdef NS_IMPL_COCOA
2009
2010/* Compile and execute the AppleScript SCRIPT and return the error
2011 status as function value. A zero is returned if compilation and
2012 execution is successful, in which case *RESULT is set to a Lisp
2013 string or a number containing the resulting script value. Otherwise,
2014 1 is returned. */
2015static int
3d608a86 2016ns_do_applescript (Lisp_Object script, Lisp_Object *result)
583ff3c3
AR
2017{
2018 NSAppleEventDescriptor *desc;
2019 NSDictionary* errorDict;
2020 NSAppleEventDescriptor* returnDescriptor = NULL;
2021
2022 NSAppleScript* scriptObject =
2023 [[NSAppleScript alloc] initWithSource:
0dc8cf50 2024 [NSString stringWithUTF8String: SSDATA (script)]];
583ff3c3
AR
2025
2026 returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
2027 [scriptObject release];
b066e6b6 2028
583ff3c3 2029 *result = Qnil;
b066e6b6 2030
583ff3c3
AR
2031 if (returnDescriptor != NULL)
2032 {
2033 // successful execution
2034 if (kAENullEvent != [returnDescriptor descriptorType])
2035 {
2036 *result = Qt;
2037 // script returned an AppleScript result
2038 if ((typeUnicodeText == [returnDescriptor descriptorType]) ||
335f5ae4 2039#if defined (NS_IMPL_COCOA)
b066e6b6 2040 (typeUTF16ExternalRepresentation
583ff3c3 2041 == [returnDescriptor descriptorType]) ||
a39e2539 2042#endif
583ff3c3
AR
2043 (typeUTF8Text == [returnDescriptor descriptorType]) ||
2044 (typeCString == [returnDescriptor descriptorType]))
2045 {
2046 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2047 if (desc)
2048 *result = build_string([[desc stringValue] UTF8String]);
2049 }
2050 else
2051 {
2052 /* use typeUTF16ExternalRepresentation? */
2053 // coerce the result to the appropriate ObjC type
2054 desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text];
2055 if (desc)
2056 *result = make_number([desc int32Value]);
2057 }
2058 }
2059 }
2060 else
2061 {
2062 // no script result, return error
2063 return 1;
2064 }
2065 return 0;
2066}
2067
08e3161a
JD
2068/* Helper function called from sendEvent to run applescript
2069 from within the main event loop. */
2070
2071void
2072ns_run_ascript (void)
2073{
cf162aee
JD
2074 if (! NILP (as_script))
2075 as_status = ns_do_applescript (as_script, as_result);
2076 as_script = Qnil;
08e3161a
JD
2077}
2078
583ff3c3 2079DEFUN ("ns-do-applescript", Fns_do_applescript, Sns_do_applescript, 1, 1, 0,
b066e6b6
JB
2080 doc: /* Execute AppleScript SCRIPT and return the result.
2081If compilation and execution are successful, the resulting script value
2082is returned as a string, a number or, in the case of other constructs, t.
2083In case the execution fails, an error is signaled. */)
5842a27b 2084 (Lisp_Object script)
583ff3c3
AR
2085{
2086 Lisp_Object result;
5fdb398c 2087 int status;
08e3161a 2088 NSEvent *nxev;
583ff3c3
AR
2089
2090 CHECK_STRING (script);
7452b7bd 2091 check_window_system (NULL);
583ff3c3 2092
4d7e6e51 2093 block_input ();
08e3161a
JD
2094
2095 as_script = script;
2096 as_result = &result;
2097
2098 /* executing apple script requires the event loop to run, otherwise
2099 errors aren't returned and executeAndReturnError hangs forever.
2100 Post an event that runs applescript and then start the event loop.
2101 The event loop is exited when the script is done. */
2102 nxev = [NSEvent otherEventWithType: NSApplicationDefined
2103 location: NSMakePoint (0, 0)
2104 modifierFlags: 0
2105 timestamp: 0
2106 windowNumber: [[NSApp mainWindow] windowNumber]
2107 context: [NSApp context]
2108 subtype: 0
2109 data1: 0
2110 data2: NSAPP_DATA2_RUNASSCRIPT];
2111
2112 [NSApp postEvent: nxev atStart: NO];
cf162aee
JD
2113
2114 // If there are other events, the event loop may exit. Keep running
677d5c92 2115 // until the script has been handled. */
cf162aee
JD
2116 while (! NILP (as_script))
2117 [NSApp run];
08e3161a
JD
2118
2119 status = as_status;
2120 as_status = 0;
08e3161a 2121 as_result = 0;
4d7e6e51 2122 unblock_input ();
583ff3c3
AR
2123 if (status == 0)
2124 return result;
2125 else if (!STRINGP (result))
2126 error ("AppleScript error %d", status);
2127 else
0dc8cf50 2128 error ("%s", SSDATA (result));
583ff3c3
AR
2129}
2130#endif
2131
2132
2133
edfda783
AR
2134/* ==========================================================================
2135
2136 Miscellaneous functions not called through hooks
2137
2138 ========================================================================== */
2139
3fe53a83 2140/* called from frame.c */
edfda783
AR
2141struct ns_display_info *
2142check_x_display_info (Lisp_Object frame)
2143{
2144 return check_ns_display_info (frame);
2145}
2146
2147
edfda783 2148void
3d608a86 2149x_set_scroll_bar_default_width (struct frame *f)
edfda783
AR
2150{
2151 int wid = FRAME_COLUMN_WIDTH (f);
2152 FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = NS_SCROLL_BAR_WIDTH_DEFAULT;
2153 FRAME_CONFIG_SCROLL_BAR_COLS (f) = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) +
2154 wid - 1) / wid;
2155}
2156
2157
3fe53a83 2158/* terms impl this instead of x-get-resource directly */
edfda783
AR
2159const char *
2160x_get_string_resource (XrmDatabase rdb, char *name, char *class)
2161{
6fb5f7da 2162 /* remove appname prefix; TODO: allow for !="Emacs" */
edfda783
AR
2163 char *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0);
2164 const char *res;
7452b7bd 2165 check_window_system (NULL);
edfda783 2166
386a49d3
AR
2167 if (inhibit_x_resources)
2168 /* --quick was passed, so this is a no-op. */
2169 return NULL;
edfda783 2170
f7dfe5d6 2171 res = ns_get_defaults_value (toCheck);
edfda783 2172 return !res ? NULL :
fee5959d
PE
2173 (!c_strncasecmp (res, "YES", 3) ? "true" :
2174 (!c_strncasecmp (res, "NO", 2) ? "false" : res));
edfda783
AR
2175}
2176
2177
2178Lisp_Object
2179x_get_focus_frame (struct frame *frame)
2180{
2181 struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame);
2182 Lisp_Object nsfocus;
2183
9e50ff0c 2184 if (!dpyinfo->x_focus_frame)
edfda783
AR
2185 return Qnil;
2186
9e50ff0c 2187 XSETFRAME (nsfocus, dpyinfo->x_focus_frame);
edfda783
AR
2188 return nsfocus;
2189}
2190
2191
2192int
2193x_pixel_width (struct frame *f)
2194{
2195 return FRAME_PIXEL_WIDTH (f);
2196}
2197
2198
2199int
2200x_pixel_height (struct frame *f)
2201{
2202 return FRAME_PIXEL_HEIGHT (f);
2203}
2204
2205
edfda783
AR
2206int
2207x_screen_planes (struct frame *f)
2208{
2209 return FRAME_NS_DISPLAY_INFO (f)->n_planes;
2210}
2211
2212
2213void
3d608a86 2214x_sync (struct frame *f)
edfda783
AR
2215{
2216 /* XXX Not implemented XXX */
2217 return;
2218}
2219
2220
2221
2222/* ==========================================================================
2223
2224 Lisp definitions that, for whatever reason, we can't alias as 'ns-XXX'.
2225
2226 ========================================================================== */
2227
2228
952913d4 2229DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
4f4f2973
GM
2230 doc: /* Internal function called by `color-defined-p', which see.
2231\(Note that the Nextstep version of this function ignores FRAME.) */)
5842a27b 2232 (Lisp_Object color, Lisp_Object frame)
edfda783
AR
2233{
2234 NSColor * col;
7452b7bd 2235 check_window_system (NULL);
edfda783
AR
2236 return ns_lisp_to_color (color, &col) ? Qnil : Qt;
2237}
2238
2239
952913d4 2240DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
fb67c21b 2241 doc: /* Internal function called by `color-values', which see. */)
5842a27b 2242 (Lisp_Object color, Lisp_Object frame)
edfda783
AR
2243{
2244 NSColor * col;
09b1339d 2245 CGFloat red, green, blue, alpha;
edfda783 2246
7452b7bd 2247 check_window_system (NULL);
edfda783
AR
2248 CHECK_STRING (color);
2249
2250 if (ns_lisp_to_color (color, &col))
2251 return Qnil;
2252
2253 [[col colorUsingColorSpaceName: NSCalibratedRGBColorSpace]
2254 getRed: &red green: &green blue: &blue alpha: &alpha];
3de717bd
DA
2255 return list3i (lrint (red * 65280), lrint (green * 65280),
2256 lrint (blue * 65280));
edfda783
AR
2257}
2258
2259
2260DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
4f4f2973 2261 doc: /* Internal function called by `display-color-p', which see. */)
91e8418b 2262 (Lisp_Object terminal)
edfda783
AR
2263{
2264 NSWindowDepth depth;
2265 NSString *colorSpace;
a37d34f3 2266
91e8418b
YM
2267 check_ns_display_info (terminal);
2268 depth = [[[NSScreen screens] objectAtIndex:0] depth];
edfda783
AR
2269 colorSpace = NSColorSpaceFromDepth (depth);
2270
2271 return [colorSpace isEqualToString: NSDeviceWhiteColorSpace]
2272 || [colorSpace isEqualToString: NSCalibratedWhiteColorSpace]
2273 ? Qnil : Qt;
2274}
2275
2276
91e8418b
YM
2277DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p,
2278 0, 1, 0,
51d5ef9f 2279 doc: /* Return t if the Nextstep display supports shades of gray.
d26fbe1a 2280Note that color displays do support shades of gray.
91e8418b
YM
2281The optional argument TERMINAL specifies which display to ask about.
2282TERMINAL should be a terminal object, a frame or a display name (a string).
2283If omitted or nil, that stands for the selected frame's display. */)
2284 (Lisp_Object terminal)
edfda783
AR
2285{
2286 NSWindowDepth depth;
7452b7bd 2287
91e8418b
YM
2288 check_ns_display_info (terminal);
2289 depth = [[[NSScreen screens] objectAtIndex:0] depth];
edfda783
AR
2290
2291 return NSBitsPerPixelFromDepth (depth) > 1 ? Qt : Qnil;
2292}
2293
2294
952913d4 2295DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
edfda783 2296 0, 1, 0,
91e8418b
YM
2297 doc: /* Return the width in pixels of the Nextstep display TERMINAL.
2298The optional argument TERMINAL specifies which display to ask about.
2299TERMINAL should be a terminal object, a frame or a display name (a string).
2300If omitted or nil, that stands for the selected frame's display.
2301
2302On \"multi-monitor\" setups this refers to the pixel width for all
2303physical monitors associated with TERMINAL. To get information for
2304each physical monitor, use `display-monitor-attributes-list'. */)
2305 (Lisp_Object terminal)
edfda783 2306{
91e8418b
YM
2307 struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
2308
2309 return make_number (x_display_pixel_width (dpyinfo));
edfda783
AR
2310}
2311
2312
952913d4
DN
2313DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
2314 Sx_display_pixel_height, 0, 1, 0,
91e8418b
YM
2315 doc: /* Return the height in pixels of the Nextstep display TERMINAL.
2316The optional argument TERMINAL specifies which display to ask about.
2317TERMINAL should be a terminal object, a frame or a display name (a string).
2318If omitted or nil, that stands for the selected frame's display.
2319
2320On \"multi-monitor\" setups this refers to the pixel height for all
2321physical monitors associated with TERMINAL. To get information for
2322each physical monitor, use `display-monitor-attributes-list'. */)
2323 (Lisp_Object terminal)
edfda783 2324{
91e8418b
YM
2325 struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
2326
2327 return make_number (x_display_pixel_height (dpyinfo));
edfda783
AR
2328}
2329
4465bfb4
JD
2330#ifdef NS_IMPL_COCOA
2331/* Returns the name for the screen that DICT came from, or NULL.
2332 Caller must free return value.
2333*/
583ff3c3 2334
6799bb26 2335static char *
4465bfb4
JD
2336ns_screen_name (CGDirectDisplayID did)
2337{
2338 char *name = NULL;
2339 NSDictionary *info = (NSDictionary *)
2340 IODisplayCreateInfoDictionary (CGDisplayIOServicePort (did),
2341 kIODisplayOnlyPreferredName);
2342 NSDictionary *names
2343 = [info objectForKey:
2344 [NSString stringWithUTF8String:kDisplayProductName]];
2345
2346 if ([names count] > 0) {
2347 NSString *n = [names objectForKey: [[names allKeys] objectAtIndex:0]];
2348 if (n != nil)
2349 name = xstrdup ([n UTF8String]);
2350 }
d26fbe1a 2351
4465bfb4
JD
2352 [info release];
2353 return name;
2354}
2355#endif
2356
2357static Lisp_Object
2358ns_make_monitor_attribute_list (struct MonitorInfo *monitors,
2359 int n_monitors,
2360 int primary_monitor,
2361 const char *source)
2362{
2363 Lisp_Object monitor_frames = Fmake_vector (make_number (n_monitors), Qnil);
6799bb26 2364 Lisp_Object frame, rest;
4465bfb4
JD
2365 NSArray *screens = [NSScreen screens];
2366 int i;
2367
2368 FOR_EACH_FRAME (rest, frame)
2369 {
2370 struct frame *f = XFRAME (frame);
2371
2372 if (FRAME_NS_P (f))
2373 {
2374 NSView *view = FRAME_NS_VIEW (f);
2375 NSScreen *screen = [[view window] screen];
2376 NSUInteger k;
2377
2378 i = -1;
2379 for (k = 0; i == -1 && k < [screens count]; ++k)
2380 {
2381 if ([screens objectAtIndex: k] == screen)
2382 i = (int)k;
2383 }
2384
2385 if (i > -1)
2386 ASET (monitor_frames, i, Fcons (frame, AREF (monitor_frames, i)));
2387 }
2388 }
2389
6799bb26
JD
2390 return make_monitor_attribute_list (monitors, n_monitors, primary_monitor,
2391 monitor_frames, source);
4465bfb4
JD
2392}
2393
2394DEFUN ("ns-display-monitor-attributes-list",
2395 Fns_display_monitor_attributes_list,
2396 Sns_display_monitor_attributes_list,
2397 0, 1, 0,
2398 doc: /* Return a list of physical monitor attributes on the X display TERMINAL.
2399
2400The optional argument TERMINAL specifies which display to ask about.
2401TERMINAL should be a terminal object, a frame or a display name (a string).
2402If omitted or nil, that stands for the selected frame's display.
2403
2404In addition to the standard attribute keys listed in
2405`display-monitor-attributes-list', the following keys are contained in
2406the attributes:
2407
2408 source -- String describing the source from which multi-monitor
2409 information is obtained, \"NS\" is always the source."
2410
2411Internal use only, use `display-monitor-attributes-list' instead. */)
2412 (Lisp_Object terminal)
edfda783 2413{
4465bfb4
JD
2414 struct terminal *term = get_terminal (terminal, 1);
2415 NSArray *screens;
2416 NSUInteger i, n_monitors;
2417 struct MonitorInfo *monitors;
2418 Lisp_Object attributes_list = Qnil;
2419 CGFloat primary_display_height = 0;
edfda783 2420
4465bfb4
JD
2421 if (term->type != output_ns)
2422 return Qnil;
2423
2424 screens = [NSScreen screens];
2425 n_monitors = [screens count];
2426 if (n_monitors == 0)
474217c8
CY
2427 return Qnil;
2428
4465bfb4
JD
2429 monitors = (struct MonitorInfo *) xzalloc (n_monitors * sizeof (*monitors));
2430
2431 for (i = 0; i < [screens count]; ++i)
2432 {
2433 NSScreen *s = [screens objectAtIndex:i];
2434 struct MonitorInfo *m = &monitors[i];
2435 NSRect fr = [s frame];
2436 NSRect vfr = [s visibleFrame];
2437 NSDictionary *dict = [s deviceDescription];
2438 NSValue *resval = [dict valueForKey:NSDeviceResolution];
2439 short y, vy;
2440
2441#ifdef NS_IMPL_COCOA
2442 NSNumber *nid = [dict objectForKey:@"NSScreenNumber"];
2443 CGDirectDisplayID did = [nid unsignedIntValue];
2444#endif
2445 if (i == 0)
2446 {
2447 primary_display_height = fr.size.height;
2448 y = (short) fr.origin.y;
2449 vy = (short) vfr.origin.y;
2450 }
2451 else
2452 {
2453 // Flip y coordinate as NS has y starting from the bottom.
2454 y = (short) (primary_display_height - fr.size.height - fr.origin.y);
2455 vy = (short) (primary_display_height -
2456 vfr.size.height - vfr.origin.y);
2457 }
2458
2459 m->geom.x = (short) fr.origin.x;
2460 m->geom.y = y;
2461 m->geom.width = (unsigned short) fr.size.width;
2462 m->geom.height = (unsigned short) fr.size.height;
2463
2464 m->work.x = (short) vfr.origin.x;
2465 // y is flipped on NS, so vy - y are pixels missing at the bottom,
2466 // and fr.size.height - vfr.size.height are pixels missing in total.
2467 // Pixels missing at top are
2468 // fr.size.height - vfr.size.height - vy + y.
2469 // work.y is then pixels missing at top + y.
2470 m->work.y = (short) (fr.size.height - vfr.size.height) - vy + y + y;
2471 m->work.width = (unsigned short) vfr.size.width;
2472 m->work.height = (unsigned short) vfr.size.height;
2473
2474#ifdef NS_IMPL_COCOA
2475 m->name = ns_screen_name (did);
2476
2477 {
2478 CGSize mms = CGDisplayScreenSize (did);
2479 m->mm_width = (int) mms.width;
2480 m->mm_height = (int) mms.height;
2481 }
2482
2483#else
2484 // Assume 92 dpi as x-display-mm-height/x-display-mm-width does.
2485 m->mm_width = (int) (25.4 * fr.size.width / 92.0);
2486 m->mm_height = (int) (25.4 * fr.size.height / 92.0);
2487#endif
2488 }
2489
2490 // Primary monitor is always first for NS.
2491 attributes_list = ns_make_monitor_attribute_list (monitors, n_monitors,
2492 0, "NS");
edfda783 2493
4465bfb4
JD
2494 free_monitors (monitors, n_monitors);
2495 return attributes_list;
edfda783
AR
2496}
2497
2498
952913d4 2499DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
edfda783 2500 0, 1, 0,
91e8418b
YM
2501 doc: /* Return the number of bitplanes of the Nextstep display TERMINAL.
2502The optional argument TERMINAL specifies which display to ask about.
2503TERMINAL should be a terminal object, a frame or a display name (a string).
51d5ef9f 2504If omitted or nil, that stands for the selected frame's display. */)
91e8418b 2505 (Lisp_Object terminal)
edfda783 2506{
91e8418b 2507 check_ns_display_info (terminal);
edfda783 2508 return make_number
91e8418b 2509 (NSBitsPerPixelFromDepth ([[[NSScreen screens] objectAtIndex:0] depth]));
edfda783
AR
2510}
2511
2512
91e8418b
YM
2513DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells,
2514 0, 1, 0,
2515 doc: /* Returns the number of color cells of the Nextstep display TERMINAL.
2516The optional argument TERMINAL specifies which display to ask about.
2517TERMINAL should be a terminal object, a frame or a display name (a string).
51d5ef9f 2518If omitted or nil, that stands for the selected frame's display. */)
91e8418b 2519 (Lisp_Object terminal)
edfda783 2520{
91e8418b 2521 struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
edfda783
AR
2522 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2523 return make_number (1 << min (dpyinfo->n_planes, 24));
2524}
2525
2526
2527/* Unused dummy def needed for compatibility. */
2528Lisp_Object tip_frame;
2529
6fb5f7da 2530/* TODO: move to xdisp or similar */
edfda783 2531static void
3d608a86
J
2532compute_tip_xy (struct frame *f,
2533 Lisp_Object parms,
2534 Lisp_Object dx,
2535 Lisp_Object dy,
2536 int width,
2537 int height,
2538 int *root_x,
2539 int *root_y)
edfda783
AR
2540{
2541 Lisp_Object left, top;
2542 EmacsView *view = FRAME_NS_VIEW (f);
2543 NSPoint pt;
b066e6b6 2544
edfda783
AR
2545 /* Start with user-specified or mouse position. */
2546 left = Fcdr (Fassq (Qleft, parms));
edfda783 2547 top = Fcdr (Fassq (Qtop, parms));
edfda783 2548
7a18115b
J
2549 if (!INTEGERP (left) || !INTEGERP (top))
2550 {
2551 pt = last_mouse_motion_position;
2552 /* Convert to screen coordinates */
2553 pt = [view convertPoint: pt toView: nil];
2554 pt = [[view window] convertBaseToScreen: pt];
2555 }
2556 else
2557 {
2558 /* Absolute coordinates. */
2559 pt.x = XINT (left);
2560 pt.y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - XINT (top)
2561 - height;
2562 }
5fdb398c 2563
edfda783 2564 /* Ensure in bounds. (Note, screen origin = lower left.) */
7a18115b
J
2565 if (INTEGERP (left))
2566 *root_x = pt.x;
2567 else if (pt.x + XINT (dx) <= 0)
edfda783 2568 *root_x = 0; /* Can happen for negative dx */
889bd438
CY
2569 else if (pt.x + XINT (dx) + width
2570 <= x_display_pixel_width (FRAME_NS_DISPLAY_INFO (f)))
edfda783
AR
2571 /* It fits to the right of the pointer. */
2572 *root_x = pt.x + XINT (dx);
2573 else if (width + XINT (dx) <= pt.x)
2574 /* It fits to the left of the pointer. */
2575 *root_x = pt.x - width - XINT (dx);
2576 else
2577 /* Put it left justified on the screen -- it ought to fit that way. */
2578 *root_x = 0;
2579
7a18115b
J
2580 if (INTEGERP (top))
2581 *root_y = pt.y;
2582 else if (pt.y - XINT (dy) - height >= 0)
edfda783
AR
2583 /* It fits below the pointer. */
2584 *root_y = pt.y - height - XINT (dy);
889bd438
CY
2585 else if (pt.y + XINT (dy) + height
2586 <= x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)))
edfda783
AR
2587 /* It fits above the pointer */
2588 *root_y = pt.y + XINT (dy);
2589 else
2590 /* Put it on the top. */
889bd438 2591 *root_y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - height;
edfda783
AR
2592}
2593
2594
2595DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
b066e6b6 2596 doc: /* Show STRING in a \"tooltip\" window on frame FRAME.
edfda783
AR
2597A tooltip window is a small window displaying a string.
2598
4f4f2973
GM
2599This is an internal function; Lisp code should call `tooltip-show'.
2600
edfda783
AR
2601FRAME nil or omitted means use the selected frame.
2602
2603PARMS is an optional list of frame parameters which can be used to
2604change the tooltip's appearance.
2605
2606Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
2607means use the default timeout of 5 seconds.
2608
2609If the list of frame parameters PARMS contains a `left' parameter,
2610the tooltip is displayed at that x-position. Otherwise it is
2611displayed at the mouse position, with offset DX added (default is 5 if
2612DX isn't specified). Likewise for the y-position; if a `top' frame
2613parameter is specified, it determines the y-position of the tooltip
2614window, otherwise it is displayed at the mouse position, with offset
2615DY added (default is -10).
2616
2617A tooltip's maximum size is specified by `x-max-tooltip-size'.
2618Text larger than the specified size is clipped. */)
5842a27b 2619 (Lisp_Object string, Lisp_Object frame, Lisp_Object parms, Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy)
edfda783
AR
2620{
2621 int root_x, root_y;
2622 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
d311d28c 2623 ptrdiff_t count = SPECPDL_INDEX ();
edfda783
AR
2624 struct frame *f;
2625 char *str;
2626 NSSize size;
2627
2628 specbind (Qinhibit_redisplay, Qt);
2629
2630 GCPRO4 (string, parms, frame, timeout);
2631
2632 CHECK_STRING (string);
0dc8cf50 2633 str = SSDATA (string);
7452b7bd 2634 f = decode_window_system_frame (frame);
edfda783
AR
2635 if (NILP (timeout))
2636 timeout = make_number (5);
2637 else
2638 CHECK_NATNUM (timeout);
2639
2640 if (NILP (dx))
2641 dx = make_number (5);
2642 else
2643 CHECK_NUMBER (dx);
2644
2645 if (NILP (dy))
2646 dy = make_number (-10);
2647 else
2648 CHECK_NUMBER (dy);
2649
4d7e6e51 2650 block_input ();
edfda783
AR
2651 if (ns_tooltip == nil)
2652 ns_tooltip = [[EmacsTooltip alloc] init];
2653 else
2654 Fx_hide_tip ();
2655
2656 [ns_tooltip setText: str];
2657 size = [ns_tooltip frame].size;
2658
2659 /* Move the tooltip window where the mouse pointer is. Resize and
2660 show it. */
2661 compute_tip_xy (f, parms, dx, dy, (int)size.width, (int)size.height,
2662 &root_x, &root_y);
2663
2664 [ns_tooltip showAtX: root_x Y: root_y for: XINT (timeout)];
4d7e6e51 2665 unblock_input ();
edfda783
AR
2666
2667 UNGCPRO;
2668 return unbind_to (count, Qnil);
2669}
2670
2671
2672DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
2673 doc: /* Hide the current tooltip window, if there is any.
2674Value is t if tooltip was open, nil otherwise. */)
5842a27b 2675 (void)
edfda783
AR
2676{
2677 if (ns_tooltip == nil || ![ns_tooltip isActive])
2678 return Qnil;
2679 [ns_tooltip hide];
2680 return Qt;
2681}
2682
2683
cc98b6a0
DN
2684/* ==========================================================================
2685
2686 Class implementations
2687
2688 ========================================================================== */
2689
edbdcec0
JD
2690/*
2691 Handle arrow/function/control keys and copy/paste/cut in file dialogs.
a37d34f3 2692 Return YES if handled, NO if not.
edbdcec0
JD
2693 */
2694static BOOL
2695handlePanelKeys (NSSavePanel *panel, NSEvent *theEvent)
2696{
2697 NSString *s;
2698 int i;
2699 BOOL ret = NO;
2700
2701 if ([theEvent type] != NSKeyDown) return NO;
2702 s = [theEvent characters];
2703
2704 for (i = 0; i < [s length]; ++i)
2705 {
2706 int ch = (int) [s characterAtIndex: i];
2707 switch (ch)
2708 {
2709 case NSHomeFunctionKey:
2710 case NSDownArrowFunctionKey:
2711 case NSUpArrowFunctionKey:
2712 case NSLeftArrowFunctionKey:
2713 case NSRightArrowFunctionKey:
2714 case NSPageUpFunctionKey:
2715 case NSPageDownFunctionKey:
2716 case NSEndFunctionKey:
2717 [panel sendEvent: theEvent];
2718 ret = YES;
2719 break;
2720 /* As we don't have the standard key commands for
2721 copy/paste/cut/select-all in our edit menu, we must handle
2722 them here. TODO: handle Emacs key bindings for copy/cut/select-all
2723 here, paste works, because we have that in our Edit menu.
2724 I.e. refactor out code in nsterm.m, keyDown: to figure out the
2725 correct modifier.
2726 */
2727 case 'x': // Cut
2728 case 'c': // Copy
2729 case 'v': // Paste
2730 case 'a': // Select all
2731 if ([theEvent modifierFlags] & NSCommandKeyMask)
2732 {
2733 [NSApp sendAction:
2734 (ch == 'x'
2735 ? @selector(cut:)
2736 : (ch == 'c'
2737 ? @selector(copy:)
2738 : (ch == 'v'
2739 ? @selector(paste:)
2740 : @selector(selectAll:))))
2741 to:nil from:panel];
2742 ret = YES;
2743 }
2744 default:
2745 // Send all control keys, as the text field supports C-a, C-f, C-e
2746 // C-b and more.
2747 if ([theEvent modifierFlags] & NSControlKeyMask)
2748 {
2749 [panel sendEvent: theEvent];
2750 ret = YES;
2751 }
2752 break;
2753 }
2754 }
2755
2756
2757 return ret;
2758}
cc98b6a0
DN
2759
2760@implementation EmacsSavePanel
2761#ifdef NS_IMPL_COCOA
2762/* --------------------------------------------------------------------------
2763 These are overridden to intercept on OS X: ending panel restarts NSApp
2764 event loop if it is stopped. Not sure if this is correct behavior,
2765 perhaps should check if running and if so send an appdefined.
2766 -------------------------------------------------------------------------- */
2767- (void) ok: (id)sender
2768{
2769 [super ok: sender];
2770 panelOK = 1;
2771 [NSApp stop: self];
2772}
2773- (void) cancel: (id)sender
2774{
2775 [super cancel: sender];
2776 [NSApp stop: self];
2777}
2778#endif
8f2906f5
JD
2779- (NSString *) getFilename
2780{
2781 return ns_filename_from_panel (self);
2782}
2783- (NSString *) getDirectory
2784{
2785 return ns_directory_from_panel (self);
2786}
edbdcec0
JD
2787
2788- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
2789{
2790 BOOL ret = handlePanelKeys (self, theEvent);
2791 if (! ret)
2792 ret = [super performKeyEquivalent:theEvent];
2793 return ret;
2794}
cc98b6a0
DN
2795@end
2796
2797
2798@implementation EmacsOpenPanel
2799#ifdef NS_IMPL_COCOA
2800/* --------------------------------------------------------------------------
2801 These are overridden to intercept on OS X: ending panel restarts NSApp
2802 event loop if it is stopped. Not sure if this is correct behavior,
2803 perhaps should check if running and if so send an appdefined.
2804 -------------------------------------------------------------------------- */
2805- (void) ok: (id)sender
2806{
2807 [super ok: sender];
8f2906f5
JD
2808
2809 // If not choosing directories, and Open is pressed on a directory, return.
2810 if (! [self canChooseDirectories] && [self getDirectory] &&
2811 ! [self getFilename])
2812 return;
2813
cc98b6a0
DN
2814 panelOK = 1;
2815 [NSApp stop: self];
2816}
2817- (void) cancel: (id)sender
2818{
2819 [super cancel: sender];
2820 [NSApp stop: self];
2821}
8f2906f5 2822
cc98b6a0 2823#endif
8f2906f5
JD
2824- (NSString *) getFilename
2825{
2826 return ns_filename_from_panel (self);
2827}
2828- (NSString *) getDirectory
2829{
2830 return ns_directory_from_panel (self);
2831}
edbdcec0
JD
2832- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
2833{
2834 // NSOpenPanel inherits NSSavePanel, so passing self is OK.
2835 BOOL ret = handlePanelKeys (self, theEvent);
2836 if (! ret)
2837 ret = [super performKeyEquivalent:theEvent];
2838 return ret;
2839}
cc98b6a0
DN
2840@end
2841
2842
2843@implementation EmacsFileDelegate
2844/* --------------------------------------------------------------------------
2845 Delegate methods for Open/Save panels
2846 -------------------------------------------------------------------------- */
2847- (BOOL)panel: (id)sender isValidFilename: (NSString *)filename
2848{
2849 return YES;
2850}
2851- (BOOL)panel: (id)sender shouldShowFilename: (NSString *)filename
2852{
2853 return YES;
2854}
2855- (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
2856 confirmed: (BOOL)okFlag
2857{
2858 return filename;
2859}
2860@end
2861
2862#endif
2863
ba301db3 2864
edfda783
AR
2865/* ==========================================================================
2866
2867 Lisp interface declaration
2868
2869 ========================================================================== */
2870
2871
2872void
3d608a86 2873syms_of_nsfns (void)
edfda783 2874{
088dcc3e 2875 Qfontsize = intern_c_string ("fontsize");
edfda783
AR
2876 staticpro (&Qfontsize);
2877
fb9d0f5a 2878 DEFVAR_LISP ("ns-icon-type-alist", Vns_icon_type_alist,
51d5ef9f 2879 doc: /* Alist of elements (REGEXP . IMAGE) for images of icons associated to frames.
d26fbe1a
CY
2880If the title of a frame matches REGEXP, then IMAGE.tiff is
2881selected as the image of the icon representing the frame when it's
2882miniaturized. If an element is t, then Emacs tries to select an icon
2883based on the filetype of the visited file.
2884
2885The images have to be installed in a folder called English.lproj in the
2886Emacs folder. You have to restart Emacs after installing new icons.
2887
2888Example: Install an icon Gnus.tiff and execute the following code
2889
2890 (setq ns-icon-type-alist
2891 (append ns-icon-type-alist
2892 '((\"^\\\\*\\\\(Group\\\\*$\\\\|Summary \\\\|Article\\\\*$\\\\)\"
2893 . \"Gnus\"))))
2894
2895When you miniaturize a Group, Summary or Article frame, Gnus.tiff will
51d5ef9f 2896be used as the image of the icon representing the frame. */);
edfda783
AR
2897 Vns_icon_type_alist = Fcons (Qt, Qnil);
2898
fb9d0f5a 2899 DEFVAR_LISP ("ns-version-string", Vns_version_string,
cb83c00b 2900 doc: /* Toolkit version for NS Windowing. */);
f5497e45 2901 Vns_version_string = ns_appkit_version_str ();
cb83c00b 2902
edfda783
AR
2903 defsubr (&Sns_read_file_name);
2904 defsubr (&Sns_get_resource);
2905 defsubr (&Sns_set_resource);
2906 defsubr (&Sxw_display_color_p); /* this and next called directly by C code */
2907 defsubr (&Sx_display_grayscale_p);
edfda783
AR
2908 defsubr (&Sns_font_name);
2909 defsubr (&Sns_list_colors);
74876614 2910#ifdef NS_IMPL_COCOA
583ff3c3 2911 defsubr (&Sns_do_applescript);
74876614 2912#endif
952913d4
DN
2913 defsubr (&Sxw_color_defined_p);
2914 defsubr (&Sxw_color_values);
2915 defsubr (&Sx_server_max_request_size);
9e50ff0c
DN
2916 defsubr (&Sx_server_vendor);
2917 defsubr (&Sx_server_version);
952913d4
DN
2918 defsubr (&Sx_display_pixel_width);
2919 defsubr (&Sx_display_pixel_height);
4465bfb4 2920 defsubr (&Sns_display_monitor_attributes_list);
9e50ff0c
DN
2921 defsubr (&Sx_display_mm_width);
2922 defsubr (&Sx_display_mm_height);
2923 defsubr (&Sx_display_screens);
952913d4
DN
2924 defsubr (&Sx_display_planes);
2925 defsubr (&Sx_display_color_cells);
9e50ff0c
DN
2926 defsubr (&Sx_display_visual_class);
2927 defsubr (&Sx_display_backing_store);
2928 defsubr (&Sx_display_save_under);
2929 defsubr (&Sx_create_frame);
9e50ff0c
DN
2930 defsubr (&Sx_open_connection);
2931 defsubr (&Sx_close_connection);
2932 defsubr (&Sx_display_list);
edfda783
AR
2933
2934 defsubr (&Sns_hide_others);
2935 defsubr (&Sns_hide_emacs);
2936 defsubr (&Sns_emacs_info_panel);
2937 defsubr (&Sns_list_services);
2938 defsubr (&Sns_perform_service);
2939 defsubr (&Sns_convert_utf8_nfd_to_nfc);
9e50ff0c 2940 defsubr (&Sx_focus_frame);
edfda783
AR
2941 defsubr (&Sns_popup_font_panel);
2942 defsubr (&Sns_popup_color_panel);
2943
2944 defsubr (&Sx_show_tip);
2945 defsubr (&Sx_hide_tip);
2946
08e3161a
JD
2947 as_status = 0;
2948 as_script = Qnil;
2949 as_result = 0;
edfda783 2950}