]> code.delx.au - gnu-emacs/blob - src/nsterm.h
Don't install keyboard hook when debugged on MS-Windows
[gnu-emacs] / src / nsterm.h
1 /* Definitions and headers for communication with NeXT/Open/GNUstep API.
2 Copyright (C) 1989, 1993, 2005, 2008-2016 Free Software Foundation,
3 Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or (at
10 your option) any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
19
20
21 #include "dispextern.h"
22 #include "frame.h"
23 #include "character.h"
24 #include "font.h"
25 #include "sysselect.h"
26
27 #ifdef HAVE_NS
28
29 #ifdef NS_IMPL_COCOA
30 #ifndef MAC_OS_X_VERSION_10_6
31 #define MAC_OS_X_VERSION_10_6 1060
32 #endif
33 #ifndef MAC_OS_X_VERSION_10_7
34 #define MAC_OS_X_VERSION_10_7 1070
35 #endif
36 #ifndef MAC_OS_X_VERSION_10_8
37 #define MAC_OS_X_VERSION_10_8 1080
38 #endif
39 #ifndef MAC_OS_X_VERSION_10_9
40 #define MAC_OS_X_VERSION_10_9 1090
41 #endif
42
43 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
44 #define HAVE_NATIVE_FS
45 #endif
46
47 #endif /* NS_IMPL_COCOA */
48
49 #ifdef __OBJC__
50
51 /* CGFloat on GNUstep may be 4 or 8 byte, but functions expect float* for some
52 versions.
53 On Cocoa >= 10.5, functions expect CGFloat*. Make compatible type. */
54 #ifdef NS_IMPL_COCOA
55 typedef CGFloat EmacsCGFloat;
56 #elif GNUSTEP_GUI_MAJOR_VERSION > 0 || GNUSTEP_GUI_MINOR_VERSION >= 22
57 typedef CGFloat EmacsCGFloat;
58 #else
59 typedef float EmacsCGFloat;
60 #endif
61
62 /* ==========================================================================
63
64 Trace support
65
66 ========================================================================== */
67
68 /* Uncomment the following line to enable trace.
69
70 Uncomment suitable NSTRACE_GROUP_xxx lines to trace more.
71
72 Hint: keep the trailing whitespace -- the version control system
73 will reject accidental commits. */
74
75 /* #define NSTRACE_ENABLED 1 */
76
77
78 /* When non-zero, trace output is enabled for all parts, except those
79 explicitly disabled. */
80 /* #define NSTRACE_ALL_GROUPS 1 */
81
82 /* When non-zero, trace output is enabled in the corresponding part. */
83 /* #define NSTRACE_GROUP_EVENTS 1 */
84 /* #define NSTRACE_GROUP_UPDATES 1 */
85 /* #define NSTRACE_GROUP_FRINGE 1 */
86 /* #define NSTRACE_GROUP_COLOR 1 */
87 /* #define NSTRACE_GROUP_GLYPHS 1 */
88 /* #define NSTRACE_GROUP_FOCUS 1 */
89
90
91 /* Print a call tree containing all annotated functions.
92
93 The call structure of the functions is represented using
94 indentation and vertical lines. Extra information is printed using
95 horizontal lines that connect to the vertical line.
96
97 The return value is represented using the arrow "->>". For simple
98 functions, the arrow can be printed on the same line as the
99 function name. If more output is printed, it is connected to the
100 vertical line of the function.
101
102 The first column contains the file name, the second the line
103 number, and the third a number increasing for each trace line.
104
105 Note, when trace output from several threads are mixed, the output
106 can become misaligned, as all threads (currently) share one state.
107 This is post prominent when the EVENTS part is enabled.
108
109 Note that the trace system, when enabled, use the GCC/Clang
110 "cleanup" extension. */
111
112 /* For example, the following is the output of `M-x
113 toggle-frame-maximized RET'.
114
115 (Long lines manually split to reduced width):
116
117 nsterm.m : 1608: [ 354] ns_fullscreen_hook
118 nsterm.m : 7180: [ 355] | [EmacsView handleFS]
119 nsterm.m : 7209: [ 356] | +--- FULLSCREEN_MAXIMIZED
120 nsterm.m : 7706: [ 357] | | [EmacsWindow performZoom:]
121 nsterm.m : 7715: [ 358] | | | [EmacsWindow zoom:]
122 nsterm.m : 882: [ 359] | | | | ns_update_auto_hide_menu_bar
123 nsterm.m : 6752: [ 360] | | | |
124 [EmacsView windowWillUseStandardFrame:defaultFrame:(X:0 Y:0)/(W:1600 H:1177)]
125 nsterm.m : 6753: [ 361] | | | | +--- fs_state: FULLSCREEN_NONE
126 nsterm.m : 6754: [ 362] | | | | +--- fs_before_fs: -1
127 nsterm.m : 6755: [ 363] | | | | +--- next_maximized: FULLSCREEN_MAXIMIZED
128 nsterm.m : 6756: [ 364] | | | | +--- ns_userRect: (X:0 Y:0)/(W:0 H:0)
129 nsterm.m : 6757: [ 365] | | | | +---
130 [sender frame]: (X:0 Y:626)/(W:595 H:551)
131 nsterm.m : 6781: [ 366] | | | | +---
132 ns_userRect (2): (X:0 Y:626)/(W:595 H:551)
133 nsterm.m : 6821: [ 367] | | | | +--- FULLSCREEN_MAXIMIZED
134 nsterm.m : 7232: [ 368] | | | | |
135 [EmacsView setFSValue:FULLSCREEN_MAXIMIZED]
136 nsterm.m : 6848: [ 369] | | | | +---
137 Final ns_userRect: (X:0 Y:626)/(W:595 H:551)
138 nsterm.m : 6849: [ 370] | | | | +--- Final maximized_width: 1600
139 nsterm.m : 6850: [ 371] | | | | +--- Final maximized_height: 1177
140 nsterm.m : 6851: [ 372] | | | | +--- Final next_maximized: -1
141 nsterm.m : 6322: [ 373] | | | | |
142 [EmacsView windowWillResize:toSize: (W:1600 H:1177)]
143 nsterm.m : 6323: [ 374] | | | | | +---
144 [sender frame]: (X:0 Y:626)/(W:595 H:551)
145 nsterm.m : 6324: [ 375] | | | | | +--- fs_state: FULLSCREEN_MAXIMIZED
146 nsterm.m : 7027: [ 376] | | | | | | [EmacsView isFullscreen]
147 nsterm.m : 6387: [ 377] | | | | | +--- cols: 223 rows: 79
148 nsterm.m : 6412: [ 378] | | | | | +->> (W:1596 H:1167)
149 nsterm.m : 6855: [ 379] | | | | +->> (X:0 Y:0)/(W:1600 H:1177)
150 */
151
152 #ifndef NSTRACE_ENABLED
153 #define NSTRACE_ENABLED 0
154 #endif
155
156 #if NSTRACE_ENABLED
157
158 #ifndef NSTRACE_ALL_GROUPS
159 #define NSTRACE_ALL_GROUPS 0
160 #endif
161
162 #ifndef NSTRACE_GROUP_EVENTS
163 #define NSTRACE_GROUP_EVENTS NSTRACE_ALL_GROUPS
164 #endif
165
166 #ifndef NSTRACE_GROUP_UPDATES
167 #define NSTRACE_GROUP_UPDATES NSTRACE_ALL_GROUPS
168 #endif
169
170 #ifndef NSTRACE_GROUP_FRINGE
171 #define NSTRACE_GROUP_FRINGE NSTRACE_ALL_GROUPS
172 #endif
173
174 #ifndef NSTRACE_GROUP_COLOR
175 #define NSTRACE_GROUP_COLOR NSTRACE_ALL_GROUPS
176 #endif
177
178 #ifndef NSTRACE_GROUP_GLYPHS
179 #define NSTRACE_GROUP_GLYPHS NSTRACE_ALL_GROUPS
180 #endif
181
182 #ifndef NSTRACE_GROUP_FOCUS
183 #define NSTRACE_GROUP_FOCUS NSTRACE_ALL_GROUPS
184 #endif
185
186 extern volatile int nstrace_num;
187 extern volatile int nstrace_depth;
188 extern volatile int nstrace_enabled_global;
189
190 void nstrace_leave(int *);
191 void nstrace_restore_global_trace_state(int *);
192 char const * nstrace_fullscreen_type_name (int);
193
194 /* printf-style trace output. Output is aligned with contained heading. */
195 #define NSTRACE_MSG_NO_DASHES(...) \
196 do \
197 { \
198 if (nstrace_enabled) \
199 { \
200 fprintf (stderr, "%-10s:%5d: [%5d]%.*s", \
201 __FILE__, __LINE__, nstrace_num++, \
202 2*nstrace_depth, " | | | | | | | | | | | | | | | .."); \
203 fprintf (stderr, __VA_ARGS__); \
204 fprintf (stderr, "\n"); \
205 } \
206 } \
207 while(0)
208
209 #define NSTRACE_MSG(...) NSTRACE_MSG_NO_DASHES("+--- " __VA_ARGS__)
210
211
212
213 /* Macros for printing complex types.
214
215 NSTRACE_FMT_what -- Printf format string for "what".
216 NSTRACE_ARG_what(x) -- Printf argument for "what". */
217
218 #define NSTRACE_FMT_SIZE "(W:%.0f H:%.0f)"
219 #define NSTRACE_ARG_SIZE(elt) (elt).width, (elt).height
220
221 #define NSTRACE_FMT_POINT "(X:%.0f Y:%.0f)"
222 #define NSTRACE_ARG_POINT(elt) (elt).x, (elt).y
223
224 #define NSTRACE_FMT_RECT NSTRACE_FMT_POINT "/" NSTRACE_FMT_SIZE
225 #define NSTRACE_ARG_RECT(elt) \
226 NSTRACE_ARG_POINT((elt).origin), NSTRACE_ARG_SIZE((elt).size)
227
228 #define NSTRACE_FMT_FSTYPE "%s"
229 #define NSTRACE_ARG_FSTYPE(elt) nstrace_fullscreen_type_name(elt)
230
231
232 /* Macros for printing complex types as extra information. */
233
234 #define NSTRACE_SIZE(str,size) \
235 NSTRACE_MSG (str ": " NSTRACE_FMT_SIZE, \
236 NSTRACE_ARG_SIZE (size));
237
238 #define NSTRACE_POINT(str,point) \
239 NSTRACE_MSG (str ": " NSTRACE_FMT_POINT, \
240 NSTRACE_ARG_POINT (point));
241
242 #define NSTRACE_RECT(str,rect) \
243 NSTRACE_MSG (str ": " NSTRACE_FMT_RECT, \
244 NSTRACE_ARG_RECT (rect));
245
246 #define NSTRACE_FSTYPE(str,fs_type) \
247 NSTRACE_MSG (str ": " NSTRACE_FMT_FSTYPE, \
248 NSTRACE_ARG_FSTYPE (fs_type));
249
250
251 /* Return value macros.
252
253 NSTRACE_RETURN(fmt, ...) - Print a return value, support printf-style
254 format string and arguments.
255
256 NSTRACE_RETURN_what(obj) - Print a return value of kind WHAT.
257
258 NSTRACE_FMT_RETURN - A string literal representing a returned
259 value. Useful when creating a format string
260 to printf-like constructs like NSTRACE(). */
261
262 #define NSTRACE_FMT_RETURN "->>"
263
264 #define NSTRACE_RETURN(...) \
265 NSTRACE_MSG_NO_DASHES ("+" NSTRACE_FMT_RETURN " " __VA_ARGS__)
266
267 #define NSTRACE_RETURN_SIZE(size) \
268 NSTRACE_RETURN(NSTRACE_FMT_SIZE, NSTRACE_ARG_SIZE(size))
269
270 #define NSTRACE_RETURN_POINT(point) \
271 NSTRACE_RETURN(NSTRACE_FMT_POINT, NSTRACE_ARG_POINT(point))
272
273 #define NSTRACE_RETURN_RECT(rect) \
274 NSTRACE_RETURN(NSTRACE_FMT_RECT, NSTRACE_ARG_RECT(rect))
275
276
277 /* Function enter macros.
278
279 NSTRACE (fmt, ...) -- Enable trace output in current block
280 (typically a function). Accepts printf-style
281 arguments.
282
283 NSTRACE_WHEN (cond, fmt, ...) -- Enable trace output when COND is true.
284
285 NSTRACE_UNLESS (cond, fmt, ...) -- Enable trace output unless COND is
286 true. */
287
288
289
290 #define NSTRACE_WHEN(cond, ...) \
291 __attribute__((cleanup(nstrace_restore_global_trace_state))) \
292 int nstrace_saved_enabled_global = nstrace_enabled_global; \
293 __attribute__((cleanup(nstrace_leave))) \
294 int nstrace_enabled = nstrace_enabled_global && (cond); \
295 if (nstrace_enabled) { ++nstrace_depth; } \
296 else { nstrace_enabled_global = 0; } \
297 NSTRACE_MSG_NO_DASHES(__VA_ARGS__);
298
299 /* Unsilence called functions.
300
301 Concretely, this us used to allow "event" functions to be silenced
302 while trace output can be printed for functions they call. */
303 #define NSTRACE_UNSILENCE() do { nstrace_enabled_global = 1; } while(0)
304
305 #endif /* NSTRACE_ENABLED */
306
307 #define NSTRACE(...) NSTRACE_WHEN(1, __VA_ARGS__)
308 #define NSTRACE_UNLESS(cond, ...) NSTRACE_WHEN(!(cond), __VA_ARGS__)
309
310 /* Non-trace replacement versions. */
311 #ifndef NSTRACE_WHEN
312 #define NSTRACE_WHEN(...)
313 #endif
314
315 #ifndef NSTRACE_MSG
316 #define NSTRACE_MSG(...)
317 #endif
318
319 #ifndef NSTRACE_SIZE
320 #define NSTRACE_SIZE(str,size)
321 #endif
322
323 #ifndef NSTRACE_POINT
324 #define NSTRACE_POINT(str,point)
325 #endif
326
327 #ifndef NSTRACE_RECT
328 #define NSTRACE_RECT(str,rect)
329 #endif
330
331 #ifndef NSTRACE_FSTYPE
332 #define NSTRACE_FSTYPE(str,fs_type)
333 #endif
334
335 #ifndef NSTRACE_RETURN_SIZE
336 #define NSTRACE_RETURN_SIZE(size)
337 #endif
338
339 #ifndef NSTRACE_RETURN_POINT
340 #define NSTRACE_RETURN_POINT(point)
341 #endif
342
343 #ifndef NSTRACE_RETURN_RECT
344 #define NSTRACE_RETURN_RECT(rect)
345 #endif
346
347 #ifndef NSTRACE_RETURN_FSTYPE
348 #define NSTRACE_RETURN_FSTYPE(fs_type)
349 #endif
350
351 #ifndef NSTRACE_UNSILENCE
352 #define NSTRACE_UNSILENCE()
353 #endif
354
355
356 /* ==========================================================================
357
358 NSColor, EmacsColor category.
359
360 ========================================================================== */
361 @interface NSColor (EmacsColor)
362 + (NSColor *)colorForEmacsRed:(CGFloat)red green:(CGFloat)green
363 blue:(CGFloat)blue alpha:(CGFloat)alpha;
364 - (NSColor *)colorUsingDefaultColorSpace;
365
366 @end
367
368 /* ==========================================================================
369
370 The Emacs application
371
372 ========================================================================== */
373
374 /* We override sendEvent: as a means to stop/start the event loop */
375 @interface EmacsApp : NSApplication
376 {
377 #ifdef NS_IMPL_COCOA
378 BOOL shouldKeepRunning;
379 BOOL isFirst;
380 #endif
381 #ifdef NS_IMPL_GNUSTEP
382 BOOL applicationDidFinishLaunchingCalled;
383 @public
384 int nextappdefined;
385 #endif
386 }
387 - (void)logNotification: (NSNotification *)notification;
388 - (void)antialiasThresholdDidChange:(NSNotification *)notification;
389 - (void)sendEvent: (NSEvent *)theEvent;
390 - (void)showPreferencesWindow: (id)sender;
391 - (BOOL) openFile: (NSString *)fileName;
392 - (void)fd_handler: (id)unused;
393 - (void)timeout_handler: (NSTimer *)timedEntry;
394 - (BOOL)fulfillService: (NSString *)name withArg: (NSString *)arg;
395 #ifdef NS_IMPL_GNUSTEP
396 - (void)sendFromMainThread:(id)unused;
397 #endif
398 @end
399
400 #ifdef NS_IMPL_GNUSTEP
401 /* Dummy class to get rid of startup warnings. */
402 @interface EmacsDocument : NSDocument
403 {
404 }
405 @end
406 #endif
407
408 /* ==========================================================================
409
410 The main Emacs view
411
412 ========================================================================== */
413
414 @class EmacsToolbar;
415
416 #ifdef NS_IMPL_COCOA
417 @interface EmacsView : NSView <NSTextInput, NSWindowDelegate>
418 #else
419 @interface EmacsView : NSView <NSTextInput>
420 #endif
421 {
422 #ifdef NS_IMPL_COCOA
423 char *old_title;
424 BOOL maximizing_resize;
425 #endif
426 BOOL windowClosing;
427 NSString *workingText;
428 BOOL processingCompose;
429 int fs_state, fs_before_fs, next_maximized;
430 int tibar_height, tobar_height, bwidth;
431 int maximized_width, maximized_height;
432 NSWindow *nonfs_window;
433 BOOL fs_is_native;
434 @public
435 struct frame *emacsframe;
436 int rows, cols;
437 int scrollbarsNeedingUpdate;
438 EmacsToolbar *toolbar;
439 NSRect ns_userRect;
440 BOOL wait_for_tool_bar;
441 }
442
443 /* AppKit-side interface */
444 - menuDown: (id)sender;
445 - toolbarClicked: (id)item;
446 - toggleToolbar: (id)sender;
447 - (void)keyDown: (NSEvent *)theEvent;
448 - (void)mouseDown: (NSEvent *)theEvent;
449 - (void)mouseUp: (NSEvent *)theEvent;
450 - setMiniwindowImage: (BOOL)setMini;
451
452 /* Emacs-side interface */
453 - initFrameFromEmacs: (struct frame *) f;
454 - (void) setRows: (int) r andColumns: (int) c;
455 - (void) setWindowClosing: (BOOL)closing;
456 - (EmacsToolbar *) toolbar;
457 - (void) deleteWorkingText;
458 - (void) updateFrameSize: (BOOL) delay;
459 - (void) handleFS;
460 - (void) setFSValue: (int)value;
461 - (void) toggleFullScreen: (id) sender;
462 - (BOOL) fsIsNative;
463 - (BOOL) isFullscreen;
464 #ifdef HAVE_NATIVE_FS
465 - (void) updateCollectionBehavior;
466 #endif
467
468 #ifdef NS_IMPL_GNUSTEP
469 - (void)windowDidMove: (id)sender;
470 #endif
471 - (int)fullscreenState;
472
473 /* Non-notification versions of NSView methods. Used for direct calls. */
474 - (void)windowWillEnterFullScreen;
475 - (void)windowDidEnterFullScreen;
476 - (void)windowWillExitFullScreen;
477 - (void)windowDidExitFullScreen;
478 - (void)windowDidBecomeKey;
479 @end
480
481
482 /* Small utility used for processing resize events under Cocoa. */
483 @interface EmacsWindow : NSWindow
484 {
485 NSPoint grabOffset;
486 }
487 @end
488
489
490 /* Fullscreen version of the above. */
491 @interface EmacsFSWindow : EmacsWindow
492 {
493 }
494 @end
495
496 /* ==========================================================================
497
498 The main menu implementation
499
500 ========================================================================== */
501
502 #ifdef NS_IMPL_COCOA
503 @interface EmacsMenu : NSMenu <NSMenuDelegate>
504 #else
505 @interface EmacsMenu : NSMenu
506 #endif
507 {
508 struct frame *frame;
509 unsigned long keyEquivModMask;
510 }
511
512 - initWithTitle: (NSString *)title frame: (struct frame *)f;
513 - (void)setFrame: (struct frame *)f;
514 - (void)menuNeedsUpdate: (NSMenu *)menu; /* (delegate method) */
515 - (NSString *)parseKeyEquiv: (const char *)key;
516 - (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr;
517 - (void)fillWithWidgetValue: (void *)wvptr;
518 - (void)fillWithWidgetValue: (void *)wvptr frame: (struct frame *)f;
519 - (EmacsMenu *)addSubmenuWithTitle: (const char *)title forFrame: (struct frame *)f;
520 - (void) clear;
521 - (Lisp_Object)runMenuAt: (NSPoint)p forFrame: (struct frame *)f
522 keymaps: (bool)keymaps;
523 @end
524
525
526 /* ==========================================================================
527
528 Toolbar
529
530 ========================================================================== */
531
532 @class EmacsImage;
533
534 #ifdef NS_IMPL_COCOA
535 @interface EmacsToolbar : NSToolbar <NSToolbarDelegate>
536 #else
537 @interface EmacsToolbar : NSToolbar
538 #endif
539 {
540 EmacsView *emacsView;
541 NSMutableDictionary *identifierToItem;
542 NSMutableArray *activeIdentifiers;
543 NSArray *prevIdentifiers;
544 unsigned long enablement, prevEnablement;
545 }
546 - initForView: (EmacsView *)view withIdentifier: (NSString *)identifier;
547 - (void) clearActive;
548 - (void) clearAll;
549 - (BOOL) changed;
550 - (void) addDisplayItemWithImage: (EmacsImage *)img
551 idx: (int)idx
552 tag: (int)tag
553 helpText: (const char *)help
554 enabled: (BOOL)enabled;
555
556 /* delegate methods */
557 - (NSToolbarItem *)toolbar: (NSToolbar *)toolbar
558 itemForItemIdentifier: (NSString *)itemIdentifier
559 willBeInsertedIntoToolbar: (BOOL)flag;
560 - (NSArray *)toolbarDefaultItemIdentifiers: (NSToolbar *)toolbar;
561 - (NSArray *)toolbarAllowedItemIdentifiers: (NSToolbar *)toolbar;
562 @end
563
564
565 /* ==========================================================================
566
567 Message / question windows
568
569 ========================================================================== */
570
571 @interface EmacsDialogPanel : NSPanel
572 {
573 NSTextField *command;
574 NSTextField *title;
575 NSMatrix *matrix;
576 int rows, cols;
577 BOOL timer_fired, window_closed;
578 Lisp_Object dialog_return;
579 Lisp_Object *button_values;
580 }
581 - initFromContents: (Lisp_Object)menu isQuestion: (BOOL)isQ;
582 - (void)process_dialog: (Lisp_Object)list;
583 - (void)addButton: (char *)str value: (int)tag row: (int)row;
584 - (void)addString: (char *)str row: (int)row;
585 - (void)addSplit;
586 - (Lisp_Object)runDialogAt: (NSPoint)p;
587 - (void)timeout_handler: (NSTimer *)timedEntry;
588 @end
589
590 #ifdef NS_IMPL_COCOA
591 @interface EmacsTooltip : NSObject <NSWindowDelegate>
592 #else
593 @interface EmacsTooltip : NSObject
594 #endif
595 {
596 NSWindow *win;
597 NSTextField *textField;
598 NSTimer *timer;
599 }
600 - init;
601 - (void) setText: (char *)text;
602 - (void) showAtX: (int)x Y: (int)y for: (int)seconds;
603 - (void) hide;
604 - (BOOL) isActive;
605 - (NSRect) frame;
606 @end
607
608
609 /* ==========================================================================
610
611 File open/save panels
612 This and next override methods to handle keyboard input in panels.
613
614 ========================================================================== */
615
616 @interface EmacsSavePanel : NSSavePanel
617 {
618 }
619 @end
620 @interface EmacsOpenPanel : NSOpenPanel
621 {
622 }
623 @end
624
625 @interface EmacsFileDelegate : NSObject
626 {
627 }
628 - (BOOL)panel: (id)sender isValidFilename: (NSString *)filename;
629 - (BOOL)panel: (id)sender shouldShowFilename: (NSString *)filename;
630 - (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
631 confirmed: (BOOL)okFlag;
632 @end
633
634
635 /* ==========================================================================
636
637 Images and stippling
638
639 ========================================================================== */
640
641 @interface EmacsImage : NSImage
642 {
643 NSBitmapImageRep *bmRep; /* used for accessing pixel data */
644 unsigned char *pixmapData[5]; /* shortcut to access pixel data */
645 NSColor *stippleMask;
646 unsigned long xbm_fg;
647 }
648 + allocInitFromFile: (Lisp_Object)file;
649 - (void)dealloc;
650 - initFromXBM: (unsigned char *)bits width: (int)w height: (int)h
651 fg: (unsigned long)fg bg: (unsigned long)bg;
652 - setXBMColor: (NSColor *)color;
653 - initForXPMWithDepth: (int)depth width: (int)width height: (int)height;
654 - (void)setPixmapData;
655 - (unsigned long)getPixelAtX: (int)x Y: (int)y;
656 - (void)setPixelAtX: (int)x Y: (int)y toRed: (unsigned char)r
657 green: (unsigned char)g blue: (unsigned char)b
658 alpha:(unsigned char)a;
659 - (void)setAlphaAtX: (int)x Y: (int)y to: (unsigned char)a;
660 - (NSColor *)stippleMask;
661 @end
662
663
664 /* ==========================================================================
665
666 Scrollbars
667
668 ========================================================================== */
669
670 @interface EmacsScroller : NSScroller
671 {
672 struct window *window;
673 struct frame *frame;
674 NSResponder *prevResponder;
675
676 /* offset to the bottom of knob of last mouse down */
677 CGFloat last_mouse_offset;
678 float min_portion;
679 int pixel_length;
680 enum scroll_bar_part last_hit_part;
681
682 BOOL condemned;
683
684 BOOL horizontal;
685
686 /* optimize against excessive positioning calls generated by emacs */
687 int em_position;
688 int em_portion;
689 int em_whole;
690 }
691
692 - initFrame: (NSRect )r window: (Lisp_Object)win;
693 - (void)setFrame: (NSRect)r;
694
695 - setPosition: (int) position portion: (int) portion whole: (int) whole;
696 - (int) checkSamePosition: (int)position portion: (int)portion
697 whole: (int)whole;
698 - (void) sendScrollEventAtLoc: (float)loc fromEvent: (NSEvent *)e;
699 - repeatScroll: (NSTimer *)sender;
700 - condemn;
701 - reprieve;
702 - (bool)judge;
703 + (CGFloat)scrollerWidth;
704 @end
705
706
707 /* ==========================================================================
708
709 Rendering
710
711 ========================================================================== */
712
713 #ifdef NS_IMPL_COCOA
714 /* rendering util */
715 @interface EmacsGlyphStorage : NSObject <NSGlyphStorage>
716 {
717 @public
718 NSAttributedString *attrStr;
719 NSMutableDictionary *dict;
720 CGGlyph *cglyphs;
721 unsigned long maxChar, maxGlyph;
722 long i, len;
723 }
724 - initWithCapacity: (unsigned long) c;
725 - (void) setString: (NSString *)str font: (NSFont *)font;
726 @end
727 #endif /* NS_IMPL_COCOA */
728
729 extern NSArray *ns_send_types, *ns_return_types;
730 extern NSString *ns_app_name;
731 extern EmacsMenu *mainMenu, *svcsMenu, *dockMenu;
732
733 /* Apple removed the declaration, but kept the implementation */
734 #if defined (NS_IMPL_COCOA)
735 @interface NSApplication (EmacsApp)
736 - (void)setAppleMenu: (NSMenu *)menu;
737 @end
738 #endif
739
740 #endif /* __OBJC__ */
741
742
743
744 /* ==========================================================================
745
746 Non-OO stuff
747
748 ========================================================================== */
749
750 /* Special keycodes that we pass down the event chain */
751 #define KEY_NS_POWER_OFF ((1<<28)|(0<<16)|1)
752 #define KEY_NS_OPEN_FILE ((1<<28)|(0<<16)|2)
753 #define KEY_NS_OPEN_TEMP_FILE ((1<<28)|(0<<16)|3)
754 #define KEY_NS_CHANGE_FONT ((1<<28)|(0<<16)|7)
755 #define KEY_NS_OPEN_FILE_LINE ((1<<28)|(0<<16)|8)
756 #define KEY_NS_PUT_WORKING_TEXT ((1<<28)|(0<<16)|9)
757 #define KEY_NS_UNPUT_WORKING_TEXT ((1<<28)|(0<<16)|10)
758 #define KEY_NS_SPI_SERVICE_CALL ((1<<28)|(0<<16)|11)
759 #define KEY_NS_NEW_FRAME ((1<<28)|(0<<16)|12)
760 #define KEY_NS_TOGGLE_TOOLBAR ((1<<28)|(0<<16)|13)
761 #define KEY_NS_SHOW_PREFS ((1<<28)|(0<<16)|14)
762
763 /* could use list to store these, but rest of emacs has a big infrastructure
764 for managing a table of bitmap "records" */
765 struct ns_bitmap_record
766 {
767 #ifdef __OBJC__
768 EmacsImage *img;
769 #else
770 void *img;
771 #endif
772 char *file;
773 int refcount;
774 int height, width, depth;
775 };
776
777 /* this to map between emacs color indices and NSColor objects */
778 struct ns_color_table
779 {
780 ptrdiff_t size;
781 ptrdiff_t avail;
782 #ifdef __OBJC__
783 NSColor **colors;
784 NSMutableSet *empty_indices;
785 #else
786 void **items;
787 void *availIndices;
788 #endif
789 };
790 #define NS_COLOR_CAPACITY 256
791
792 #define RGB_TO_ULONG(r, g, b) (((r) << 16) | ((g) << 8) | (b))
793 #define ARGB_TO_ULONG(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
794
795 #define ALPHA_FROM_ULONG(color) ((color) >> 24)
796 #define RED_FROM_ULONG(color) (((color) >> 16) & 0xff)
797 #define GREEN_FROM_ULONG(color) (((color) >> 8) & 0xff)
798 #define BLUE_FROM_ULONG(color) ((color) & 0xff)
799
800 /* Do not change `* 0x101' in the following lines to `<< 8'. If
801 changed, image masks in 1-bit depth will not work. */
802 #define RED16_FROM_ULONG(color) (RED_FROM_ULONG(color) * 0x101)
803 #define GREEN16_FROM_ULONG(color) (GREEN_FROM_ULONG(color) * 0x101)
804 #define BLUE16_FROM_ULONG(color) (BLUE_FROM_ULONG(color) * 0x101)
805
806 /* this extends font backend font */
807 struct nsfont_info
808 {
809 struct font font;
810
811 char *name; /* PostScript name, uniquely identifies on NS systems */
812
813 /* The following metrics are stored as float rather than int. */
814
815 float width; /* Maximum advance for the font. */
816 float height;
817 float underpos;
818 float underwidth;
819 float size;
820 #ifdef __OBJC__
821 NSFont *nsfont;
822 #if defined (NS_IMPL_COCOA)
823 CGFontRef cgfont;
824 #else /* GNUstep */
825 void *cgfont;
826 #endif
827 #else /* ! OBJC */
828 void *nsfont;
829 void *cgfont;
830 #endif
831 char bold, ital; /* convenience flags */
832 char synthItal;
833 XCharStruct max_bounds;
834 /* we compute glyph codes and metrics on-demand in blocks of 256 indexed
835 by hibyte, lobyte */
836 unsigned short **glyphs; /* map Unicode index to glyph */
837 struct font_metrics **metrics;
838 };
839
840
841 /* init'd in ns_initialize_display_info () */
842 struct ns_display_info
843 {
844 /* Chain of all ns_display_info structures. */
845 struct ns_display_info *next;
846
847 /* The generic display parameters corresponding to this NS display. */
848 struct terminal *terminal;
849
850 /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). */
851 Lisp_Object name_list_element;
852
853 /* The number of fonts loaded. */
854 int n_fonts;
855
856 /* Minimum width over all characters in all fonts in font_table. */
857 int smallest_char_width;
858
859 /* Minimum font height over all fonts in font_table. */
860 int smallest_font_height;
861
862 struct ns_bitmap_record *bitmaps;
863 ptrdiff_t bitmaps_size;
864 ptrdiff_t bitmaps_last;
865
866 struct ns_color_table *color_table;
867
868 /* DPI resolution of this screen */
869 double resx, resy;
870
871 /* Mask of things that cause the mouse to be grabbed */
872 int grabbed;
873
874 int n_planes;
875
876 int color_p;
877
878 Window root_window;
879
880 /* Xism */
881 XrmDatabase xrdb;
882
883 /* The cursor to use for vertical scroll bars. */
884 Cursor vertical_scroll_bar_cursor;
885
886 /* The cursor to use for horizontal scroll bars. */
887 Cursor horizontal_scroll_bar_cursor;
888
889 /* Information about the range of text currently shown in
890 mouse-face. */
891 Mouse_HLInfo mouse_highlight;
892
893 struct frame *x_highlight_frame;
894 struct frame *x_focus_frame;
895
896 /* The frame where the mouse was last time we reported a mouse event. */
897 struct frame *last_mouse_frame;
898
899 /* The frame where the mouse was last time we reported a mouse motion. */
900 struct frame *last_mouse_motion_frame;
901
902 /* Position where the mouse was last time we reported a motion.
903 This is a position on last_mouse_motion_frame. */
904 int last_mouse_motion_x;
905 int last_mouse_motion_y;
906
907 /* Where the mouse was last time we reported a mouse position. */
908 NSRect last_mouse_glyph;
909
910 /* Time of last mouse movement. */
911 Time last_mouse_movement_time;
912
913 /* The scroll bar in which the last motion event occurred. */
914 #ifdef __OBJC__
915 EmacsScroller *last_mouse_scroll_bar;
916 #else
917 void *last_mouse_scroll_bar;
918 #endif
919 };
920
921 /* This is a chain of structures for all the NS displays currently in use. */
922 extern struct ns_display_info *x_display_list;
923
924 extern struct ns_display_info *ns_display_info_for_name (Lisp_Object name);
925
926 struct ns_output
927 {
928 #ifdef __OBJC__
929 EmacsView *view;
930 id miniimage;
931 NSColor *cursor_color;
932 NSColor *foreground_color;
933 NSColor *background_color;
934 EmacsToolbar *toolbar;
935 #else
936 void *view;
937 void *miniimage;
938 void *cursor_color;
939 void *foreground_color;
940 void *background_color;
941 void *toolbar;
942 #endif
943
944 /* NSCursors init'ed in initFrameFromEmacs */
945 Cursor text_cursor;
946 Cursor nontext_cursor;
947 Cursor modeline_cursor;
948 Cursor hand_cursor;
949 Cursor hourglass_cursor;
950 Cursor horizontal_drag_cursor;
951 Cursor vertical_drag_cursor;
952
953 /* NS-specific */
954 Cursor current_pointer;
955
956 /* lord knows why Emacs needs to know about our Window ids.. */
957 Window window_desc, parent_desc;
958 char explicit_parent;
959
960 struct font *font;
961 int baseline_offset;
962
963 /* If a fontset is specified for this frame instead of font, this
964 value contains an ID of the fontset, else -1. */
965 int fontset; /* only used with font_backend */
966
967 int icon_top;
968 int icon_left;
969
970 /* The size of the extra width currently allotted for vertical
971 scroll bars, in pixels. */
972 int vertical_scroll_bar_extra;
973
974 /* The height of the titlebar decoration (included in NSWindow's frame). */
975 int titlebar_height;
976
977 /* The height of the toolbar if displayed, else 0. */
978 int toolbar_height;
979
980 /* This is the Emacs structure for the NS display this frame is on. */
981 struct ns_display_info *display_info;
982
983 /* Non-zero if we are zooming (maximizing) the frame. */
984 int zooming;
985
986 /* Non-zero if we are doing an animation, e.g. toggling the tool bar. */
987 int in_animation;
988 };
989
990 /* this dummy decl needed to support TTYs */
991 struct x_output
992 {
993 int unused;
994 };
995
996
997 /* This gives the ns_display_info structure for the display F is on. */
998 #define FRAME_DISPLAY_INFO(f) ((f)->output_data.ns->display_info)
999 #define FRAME_X_OUTPUT(f) ((f)->output_data.ns)
1000 #define FRAME_NS_WINDOW(f) ((f)->output_data.ns->window_desc)
1001 #define FRAME_X_WINDOW(f) ((f)->output_data.ns->window_desc)
1002
1003 /* This is the `Display *' which frame F is on. */
1004 #define FRAME_NS_DISPLAY(f) (0)
1005 #define FRAME_X_DISPLAY(f) (0)
1006 #define FRAME_X_SCREEN(f) (0)
1007 #define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO(f)->visual
1008
1009 #define FRAME_FOREGROUND_COLOR(f) ((f)->output_data.ns->foreground_color)
1010 #define FRAME_BACKGROUND_COLOR(f) ((f)->output_data.ns->background_color)
1011
1012 #define NS_FACE_FOREGROUND(f) ((f)->foreground)
1013 #define NS_FACE_BACKGROUND(f) ((f)->background)
1014 #define FRAME_NS_TITLEBAR_HEIGHT(f) ((f)->output_data.ns->titlebar_height)
1015 #define FRAME_TOOLBAR_HEIGHT(f) ((f)->output_data.ns->toolbar_height)
1016
1017 #define FRAME_DEFAULT_FACE(f) FACE_FROM_ID_OR_NULL (f, DEFAULT_FACE_ID)
1018
1019 #define FRAME_NS_VIEW(f) ((f)->output_data.ns->view)
1020 #define FRAME_CURSOR_COLOR(f) ((f)->output_data.ns->cursor_color)
1021 #define FRAME_POINTER_TYPE(f) ((f)->output_data.ns->current_pointer)
1022
1023 #define FRAME_FONT(f) ((f)->output_data.ns->font)
1024
1025 #ifdef __OBJC__
1026 #define XNS_SCROLL_BAR(vec) ((id) XSAVE_POINTER (vec, 0))
1027 #else
1028 #define XNS_SCROLL_BAR(vec) XSAVE_POINTER (vec, 0)
1029 #endif
1030
1031 /* Compute pixel size for vertical scroll bars */
1032 #define NS_SCROLL_BAR_WIDTH(f) \
1033 (FRAME_HAS_VERTICAL_SCROLL_BARS (f) \
1034 ? rint (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0 \
1035 ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f) \
1036 : (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f))) \
1037 : 0)
1038
1039 /* Compute pixel size for horizontal scroll bars */
1040 #define NS_SCROLL_BAR_HEIGHT(f) \
1041 (FRAME_HAS_HORIZONTAL_SCROLL_BARS (f) \
1042 ? rint (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) > 0 \
1043 ? FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) \
1044 : (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f))) \
1045 : 0)
1046
1047 /* Difference btwn char-column-calculated and actual SB widths.
1048 This is only a concern for rendering when SB on left. */
1049 #define NS_SCROLL_BAR_ADJUST(w, f) \
1050 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) ? \
1051 (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f) \
1052 - NS_SCROLL_BAR_WIDTH (f)) : 0)
1053
1054 /* Difference btwn char-line-calculated and actual SB heights.
1055 This is only a concern for rendering when SB on top. */
1056 #define NS_SCROLL_BAR_ADJUST_HORIZONTALLY(w, f) \
1057 (WINDOW_HAS_HORIZONTAL_SCROLL_BARS (w) ? \
1058 (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f) \
1059 - NS_SCROLL_BAR_HEIGHT (f)) : 0)
1060
1061 /* XXX: fix for GNUstep inconsistent accounting for titlebar */
1062 #ifdef NS_IMPL_GNUSTEP
1063 #define NS_TOP_POS(f) ((f)->top_pos + 18)
1064 #else
1065 #define NS_TOP_POS(f) ((f)->top_pos)
1066 #endif
1067
1068 #define FRAME_NS_FONT_TABLE(f) (FRAME_DISPLAY_INFO (f)->font_table)
1069
1070 #define FRAME_FONTSET(f) ((f)->output_data.ns->fontset)
1071
1072 #define FRAME_BASELINE_OFFSET(f) ((f)->output_data.ns->baseline_offset)
1073 #define BLACK_PIX_DEFAULT(f) 0x000000
1074 #define WHITE_PIX_DEFAULT(f) 0xFFFFFF
1075
1076 /* First position where characters can be shown (instead of scrollbar, if
1077 it is on left. */
1078 #define FIRST_CHAR_POSITION(f) \
1079 (! (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f)) ? 0 \
1080 : FRAME_SCROLL_BAR_COLS (f))
1081
1082 extern struct ns_display_info *ns_term_init (Lisp_Object display_name);
1083 extern void ns_term_shutdown (int sig);
1084
1085 /* constants for text rendering */
1086 #define NS_DUMPGLYPH_NORMAL 0
1087 #define NS_DUMPGLYPH_CURSOR 1
1088 #define NS_DUMPGLYPH_FOREGROUND 2
1089 #define NS_DUMPGLYPH_MOUSEFACE 3
1090
1091
1092
1093 /* In nsfont, called from fontset.c */
1094 extern void nsfont_make_fontset_for_font (Lisp_Object name,
1095 Lisp_Object font_object);
1096
1097 /* In nsfont, for debugging */
1098 struct glyph_string;
1099 void ns_dump_glyphstring (struct glyph_string *s);
1100
1101 /* Implemented in nsterm, published in or needed from nsfns. */
1102 extern Lisp_Object ns_list_fonts (struct frame *f, Lisp_Object pattern,
1103 int size, int maxnames);
1104 extern void ns_clear_frame (struct frame *f);
1105
1106 extern const char *ns_xlfd_to_fontname (const char *xlfd);
1107
1108 extern Lisp_Object ns_map_event_to_object (void);
1109 #ifdef __OBJC__
1110 extern Lisp_Object ns_string_from_pasteboard (id pb);
1111 extern void ns_string_to_pasteboard (id pb, Lisp_Object str);
1112 #endif
1113 extern Lisp_Object ns_get_local_selection (Lisp_Object selection_name,
1114 Lisp_Object target_type);
1115 extern void nxatoms_of_nsselect (void);
1116 extern int ns_lisp_to_cursor_type (Lisp_Object arg);
1117 extern Lisp_Object ns_cursor_type_to_lisp (int arg);
1118 extern void ns_set_name_as_filename (struct frame *f);
1119 extern void ns_set_doc_edited (void);
1120
1121 extern bool
1122 ns_defined_color (struct frame *f,
1123 const char *name,
1124 XColor *color_def, bool alloc,
1125 bool makeIndex);
1126 extern void
1127 ns_query_color (void *col, XColor *color_def, int setPixel);
1128
1129 #ifdef __OBJC__
1130 extern Lisp_Object ns_color_to_lisp (NSColor *col);
1131 extern int ns_lisp_to_color (Lisp_Object color, NSColor **col);
1132 extern NSColor *ns_lookup_indexed_color (unsigned long idx, struct frame *f);
1133 extern unsigned long ns_index_color (NSColor *color, struct frame *f);
1134 extern void ns_free_indexed_color (unsigned long idx, struct frame *f);
1135 extern const char *ns_get_pending_menu_title (void);
1136 extern void ns_check_menu_open (NSMenu *menu);
1137 extern void ns_check_pending_open_menu (void);
1138 #endif
1139
1140 /* C access to ObjC functionality */
1141 extern void ns_release_object (void *obj);
1142 extern void ns_retain_object (void *obj);
1143 extern void *ns_alloc_autorelease_pool (void);
1144 extern void ns_release_autorelease_pool (void *);
1145 extern const char *ns_get_defaults_value (const char *key);
1146 extern void ns_init_locale (void);
1147
1148
1149 /* in nsmenu */
1150 extern void update_frame_tool_bar (struct frame *f);
1151 extern void free_frame_tool_bar (struct frame *f);
1152 extern void find_and_call_menu_selection (struct frame *f,
1153 int menu_bar_items_used, Lisp_Object vector, void *client_data);
1154 extern Lisp_Object find_and_return_menu_selection (struct frame *f,
1155 bool keymaps,
1156 void *client_data);
1157 extern Lisp_Object ns_popup_dialog (struct frame *, Lisp_Object header,
1158 Lisp_Object contents);
1159
1160 #define NSAPP_DATA2_RUNASSCRIPT 10
1161 extern void ns_run_ascript (void);
1162
1163 #define NSAPP_DATA2_RUNFILEDIALOG 11
1164 extern void ns_run_file_dialog (void);
1165
1166 extern const char *ns_etc_directory (void);
1167 extern const char *ns_exec_path (void);
1168 extern const char *ns_load_path (void);
1169 extern void syms_of_nsterm (void);
1170 extern void syms_of_nsfns (void);
1171 extern void syms_of_nsmenu (void);
1172 extern void syms_of_nsselect (void);
1173
1174 /* From nsimage.m, needed in image.c */
1175 struct image;
1176 extern void *ns_image_from_XBM (unsigned char *bits, int width, int height,
1177 unsigned long fg, unsigned long bg);
1178 extern void *ns_image_for_XPM (int width, int height, int depth);
1179 extern void *ns_image_from_file (Lisp_Object file);
1180 extern bool ns_load_image (struct frame *f, struct image *img,
1181 Lisp_Object spec_file, Lisp_Object spec_data);
1182 extern int ns_image_width (void *img);
1183 extern int ns_image_height (void *img);
1184 extern unsigned long ns_get_pixel (void *img, int x, int y);
1185 extern void ns_put_pixel (void *img, int x, int y, unsigned long argb);
1186 extern void ns_set_alpha (void *img, int x, int y, unsigned char a);
1187
1188 extern int x_display_pixel_height (struct ns_display_info *);
1189 extern int x_display_pixel_width (struct ns_display_info *);
1190
1191 /* This in nsterm.m */
1192 extern void x_destroy_window (struct frame *f);
1193 extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
1194 fd_set *exceptfds, struct timespec const *timeout,
1195 sigset_t const *sigmask);
1196 extern unsigned long ns_get_rgb_color (struct frame *f,
1197 float r, float g, float b, float a);
1198
1199 extern void ns_init_events ();
1200 extern void ns_finish_events ();
1201
1202 #ifdef __OBJC__
1203 /* From nsterm.m, needed in nsfont.m. */
1204 extern void
1205 ns_draw_text_decoration (struct glyph_string *s, struct face *face,
1206 NSColor *defaultCol, CGFloat width, CGFloat x);
1207 /* Needed in nsfns.m. */
1208 extern void
1209 ns_set_represented_filename (NSString* fstr, struct frame *f);
1210
1211 #endif
1212
1213 #ifdef NS_IMPL_GNUSTEP
1214 extern char gnustep_base_version[]; /* version tracking */
1215 #endif
1216
1217 #define MINWIDTH 10
1218 #define MINHEIGHT 10
1219
1220 /* Screen max coordinate
1221 Using larger coordinates causes movewindow/placewindow to abort */
1222 #define SCREENMAX 16000
1223
1224 #define NS_SCROLL_BAR_WIDTH_DEFAULT [EmacsScroller scrollerWidth]
1225 #define NS_SCROLL_BAR_HEIGHT_DEFAULT [EmacsScroller scrollerHeight]
1226 /* This is to match emacs on other platforms, ugly though it is. */
1227 #define NS_SELECTION_BG_COLOR_DEFAULT @"LightGoldenrod2";
1228 #define NS_SELECTION_FG_COLOR_DEFAULT @"Black";
1229 #define RESIZE_HANDLE_SIZE 12
1230
1231 /* Little utility macros */
1232 #define IN_BOUND(min, x, max) (((x) < (min)) \
1233 ? (min) : (((x)>(max)) ? (max) : (x)))
1234 #define SCREENMAXBOUND(x) (IN_BOUND (-SCREENMAX, x, SCREENMAX))
1235
1236 #endif /* HAVE_NS */