1 /* Graphical user interface functions for Mac OS.
2 Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Contributed by Andrew Choi (akochoi@mac.com). */
37 #include "dispextern.h"
39 #include "intervals.h"
41 #include "blockinput.h"
43 #include "termhooks.h"
47 /* #include "bitmaps/gray.xbm" */
50 static unsigned char gray_bits
[] = {
53 /*#include <commdlg.h>
54 #include <shellapi.h>*/
56 #include <sys/types.h>
62 /*extern void free_frame_menubar ();
63 extern double atof ();
64 extern int w32_console_toggle_lock_key (int vk_code, Lisp_Object new_state);
65 extern int quit_char;*/
67 extern char *lispy_function_keys
[];
69 /* The gray bitmap `bitmaps/gray'. This is done because macterm.c uses
70 it, and including `bitmaps/gray' more than once is a problem when
71 config.h defines `static' as an empty replacement string. */
73 int gray_bitmap_width
= gray_width
;
74 int gray_bitmap_height
= gray_height
;
75 unsigned char *gray_bitmap_bits
= gray_bits
;
77 /* Non-zero means we're allowed to display an hourglass cursor. */
79 int display_hourglass_p
;
81 /* The background and shape of the mouse pointer, and shape when not
82 over text or in the modeline. */
84 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
85 Lisp_Object Vx_hourglass_pointer_shape
;
87 /* The shape when over mouse-sensitive text. */
89 Lisp_Object Vx_sensitive_text_pointer_shape
;
91 /* If non-nil, the pointer shape to indicate that windows can be
92 dragged horizontally. */
94 Lisp_Object Vx_window_horizontal_drag_shape
;
96 /* Color of chars displayed in cursor box. */
98 Lisp_Object Vx_cursor_fore_pixel
;
100 /* Nonzero if using Windows. */
102 static int mac_in_use
;
104 /* Non nil if no window manager is in use. */
106 Lisp_Object Vx_no_window_manager
;
108 /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
110 Lisp_Object Vx_pixel_size_width_font_regexp
;
112 /* Evaluate this expression to rebuild the section of syms_of_macfns
113 that initializes and staticpros the symbols declared below. Note
114 that Emacs 18 has a bug that keeps C-x C-e from being able to
115 evaluate this expression.
118 ;; Accumulate a list of the symbols we want to initialize from the
119 ;; declarations at the top of the file.
120 (goto-char (point-min))
121 (search-forward "/\*&&& symbols declared here &&&*\/\n")
123 (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
125 (cons (buffer-substring (match-beginning 1) (match-end 1))
128 (setq symbol-list (nreverse symbol-list))
129 ;; Delete the section of syms_of_... where we initialize the symbols.
130 (search-forward "\n /\*&&& init symbols here &&&*\/\n")
131 (let ((start (point)))
132 (while (looking-at "^ Q")
134 (kill-region start (point)))
135 ;; Write a new symbol initialization section.
137 (insert (format " %s = intern (\"" (car symbol-list)))
138 (let ((start (point)))
139 (insert (substring (car symbol-list) 1))
140 (subst-char-in-region start (point) ?_ ?-))
141 (insert (format "\");\n staticpro (&%s);\n" (car symbol-list)))
142 (setq symbol-list (cdr symbol-list)))))
146 /*&&& symbols declared here &&&*/
148 Lisp_Object Qsuppress_icon
;
149 Lisp_Object Qundefined_color
;
150 Lisp_Object Qcancel_timer
;
156 Lisp_Object Qcontrol
;
159 extern Lisp_Object Vwindow_system_version
;
161 extern int mac_initialized
;
164 /* compare two strings ignoring case */
167 stricmp (const char *s
, const char *t
)
169 for ( ; tolower (*s
) == tolower (*t
); s
++, t
++)
172 return tolower (*s
) - tolower (*t
);
175 /* compare two strings up to n characters, ignoring case */
178 strnicmp (const char *s
, const char *t
, unsigned int n
)
180 for ( ; n
-- > 0 && tolower (*s
) == tolower (*t
); s
++, t
++)
183 return n
== 0 ? 0 : tolower (*s
) - tolower (*t
);
187 /* Error if we are not running on Mac OS. */
193 error ("Mac OS not in use or not initialized");
196 /* Nonzero if we can use mouse menus.
197 You should not call this unless HAVE_MENUS is defined. */
205 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
206 and checking validity for Mac. */
209 check_x_frame (frame
)
215 frame
= selected_frame
;
216 CHECK_LIVE_FRAME (frame
);
218 if (! FRAME_MAC_P (f
))
219 error ("non-mac frame used");
223 /* Let the user specify a display with a frame.
224 nil stands for the selected frame--or, if that is not a mac frame,
225 the first display on the list. */
227 struct mac_display_info
*
228 check_x_display_info (frame
)
231 if (!mac_initialized
)
239 struct frame
*sf
= XFRAME (selected_frame
);
241 if (FRAME_MAC_P (sf
) && FRAME_LIVE_P (sf
))
242 return FRAME_MAC_DISPLAY_INFO (sf
);
244 return &one_mac_display_info
;
246 else if (STRINGP (frame
))
247 return x_display_info_for_name (frame
);
252 CHECK_LIVE_FRAME (frame
);
254 if (! FRAME_MAC_P (f
))
255 error ("non-mac frame used");
256 return FRAME_MAC_DISPLAY_INFO (f
);
260 /* Return the Emacs frame-object corresponding to a mac window.
261 It could be the frame's main window or an icon window. */
263 /* This function can be called during GC, so use GC_xxx type test macros. */
266 x_window_to_frame (dpyinfo
, wdesc
)
267 struct mac_display_info
*dpyinfo
;
270 Lisp_Object tail
, frame
;
273 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
276 if (!GC_FRAMEP (frame
))
279 if (!FRAME_W32_P (f
) || FRAME_MAC_DISPLAY_INFO (f
) != dpyinfo
)
281 /*if (f->output_data.w32->hourglass_window == wdesc)
284 /* MAC_TODO: Check tooltips when supported. */
285 if (FRAME_MAC_WINDOW (f
) == wdesc
)
292 static Lisp_Object unwind_create_frame
P_ ((Lisp_Object
));
294 void x_set_foreground_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
295 void x_set_background_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
296 void x_set_mouse_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
297 void x_set_cursor_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
298 void x_set_border_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
299 void x_set_cursor_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
300 void x_set_icon_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
301 void x_set_icon_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
302 void x_explicitly_set_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
303 void x_set_menu_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
304 void x_set_title
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
305 void x_set_tool_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
306 void x_set_scroll_bar_foreground
P_ ((struct frame
*, Lisp_Object
,
308 void x_set_scroll_bar_background
P_ ((struct frame
*, Lisp_Object
,
310 static Lisp_Object x_default_scroll_bar_color_parameter
P_ ((struct frame
*,
315 /* Store the screen positions of frame F into XPTR and YPTR.
316 These are the positions of the containing window manager window,
317 not Emacs's own window. */
320 x_real_positions (f
, xptr
, yptr
)
327 #ifdef TARGET_API_MAC_CARBON
331 GetWindowPortBounds (f
->output_data
.mac
->mWP
, &r
);
332 SetPt (&pt
, r
.left
, r
.top
);
334 #else /* not TARGET_API_MAC_CARBON */
336 f
->output_data
.mac
->mWP
->portRect
.left
,
337 f
->output_data
.mac
->mWP
->portRect
.top
);
338 #endif /* not TARGET_API_MAC_CARBON */
343 /* MAC has no frame pixel diff. */
344 f
->x_pixels_diff
= 0;
345 f
->y_pixels_diff
= 0;
352 /* The default colors for the Mac color map */
353 typedef struct colormap_t
359 colormap_t mac_color_map
[] =
361 { RGB_TO_ULONG(255, 250, 250), "snow" },
362 { RGB_TO_ULONG(248, 248, 255), "ghost white" },
363 { RGB_TO_ULONG(248, 248, 255), "GhostWhite" },
364 { RGB_TO_ULONG(245, 245, 245), "white smoke" },
365 { RGB_TO_ULONG(245, 245, 245), "WhiteSmoke" },
366 { RGB_TO_ULONG(220, 220, 220), "gainsboro" },
367 { RGB_TO_ULONG(255, 250, 240), "floral white" },
368 { RGB_TO_ULONG(255, 250, 240), "FloralWhite" },
369 { RGB_TO_ULONG(253, 245, 230), "old lace" },
370 { RGB_TO_ULONG(253, 245, 230), "OldLace" },
371 { RGB_TO_ULONG(250, 240, 230), "linen" },
372 { RGB_TO_ULONG(250, 235, 215), "antique white" },
373 { RGB_TO_ULONG(250, 235, 215), "AntiqueWhite" },
374 { RGB_TO_ULONG(255, 239, 213), "papaya whip" },
375 { RGB_TO_ULONG(255, 239, 213), "PapayaWhip" },
376 { RGB_TO_ULONG(255, 235, 205), "blanched almond" },
377 { RGB_TO_ULONG(255, 235, 205), "BlanchedAlmond" },
378 { RGB_TO_ULONG(255, 228, 196), "bisque" },
379 { RGB_TO_ULONG(255, 218, 185), "peach puff" },
380 { RGB_TO_ULONG(255, 218, 185), "PeachPuff" },
381 { RGB_TO_ULONG(255, 222, 173), "navajo white" },
382 { RGB_TO_ULONG(255, 222, 173), "NavajoWhite" },
383 { RGB_TO_ULONG(255, 228, 181), "moccasin" },
384 { RGB_TO_ULONG(255, 248, 220), "cornsilk" },
385 { RGB_TO_ULONG(255, 255, 240), "ivory" },
386 { RGB_TO_ULONG(255, 250, 205), "lemon chiffon" },
387 { RGB_TO_ULONG(255, 250, 205), "LemonChiffon" },
388 { RGB_TO_ULONG(255, 245, 238), "seashell" },
389 { RGB_TO_ULONG(240, 255, 240), "honeydew" },
390 { RGB_TO_ULONG(245, 255, 250), "mint cream" },
391 { RGB_TO_ULONG(245, 255, 250), "MintCream" },
392 { RGB_TO_ULONG(240, 255, 255), "azure" },
393 { RGB_TO_ULONG(240, 248, 255), "alice blue" },
394 { RGB_TO_ULONG(240, 248, 255), "AliceBlue" },
395 { RGB_TO_ULONG(230, 230, 250), "lavender" },
396 { RGB_TO_ULONG(255, 240, 245), "lavender blush" },
397 { RGB_TO_ULONG(255, 240, 245), "LavenderBlush" },
398 { RGB_TO_ULONG(255, 228, 225), "misty rose" },
399 { RGB_TO_ULONG(255, 228, 225), "MistyRose" },
400 { RGB_TO_ULONG(255, 255, 255), "white" },
401 { RGB_TO_ULONG(0 , 0 , 0 ), "black" },
402 { RGB_TO_ULONG(47 , 79 , 79 ), "dark slate gray" },
403 { RGB_TO_ULONG(47 , 79 , 79 ), "DarkSlateGray" },
404 { RGB_TO_ULONG(47 , 79 , 79 ), "dark slate grey" },
405 { RGB_TO_ULONG(47 , 79 , 79 ), "DarkSlateGrey" },
406 { RGB_TO_ULONG(105, 105, 105), "dim gray" },
407 { RGB_TO_ULONG(105, 105, 105), "DimGray" },
408 { RGB_TO_ULONG(105, 105, 105), "dim grey" },
409 { RGB_TO_ULONG(105, 105, 105), "DimGrey" },
410 { RGB_TO_ULONG(112, 128, 144), "slate gray" },
411 { RGB_TO_ULONG(112, 128, 144), "SlateGray" },
412 { RGB_TO_ULONG(112, 128, 144), "slate grey" },
413 { RGB_TO_ULONG(112, 128, 144), "SlateGrey" },
414 { RGB_TO_ULONG(119, 136, 153), "light slate gray" },
415 { RGB_TO_ULONG(119, 136, 153), "LightSlateGray" },
416 { RGB_TO_ULONG(119, 136, 153), "light slate grey" },
417 { RGB_TO_ULONG(119, 136, 153), "LightSlateGrey" },
418 { RGB_TO_ULONG(190, 190, 190), "gray" },
419 { RGB_TO_ULONG(190, 190, 190), "grey" },
420 { RGB_TO_ULONG(211, 211, 211), "light grey" },
421 { RGB_TO_ULONG(211, 211, 211), "LightGrey" },
422 { RGB_TO_ULONG(211, 211, 211), "light gray" },
423 { RGB_TO_ULONG(211, 211, 211), "LightGray" },
424 { RGB_TO_ULONG(25 , 25 , 112), "midnight blue" },
425 { RGB_TO_ULONG(25 , 25 , 112), "MidnightBlue" },
426 { RGB_TO_ULONG(0 , 0 , 128), "navy" },
427 { RGB_TO_ULONG(0 , 0 , 128), "navy blue" },
428 { RGB_TO_ULONG(0 , 0 , 128), "NavyBlue" },
429 { RGB_TO_ULONG(100, 149, 237), "cornflower blue" },
430 { RGB_TO_ULONG(100, 149, 237), "CornflowerBlue" },
431 { RGB_TO_ULONG(72 , 61 , 139), "dark slate blue" },
432 { RGB_TO_ULONG(72 , 61 , 139), "DarkSlateBlue" },
433 { RGB_TO_ULONG(106, 90 , 205), "slate blue" },
434 { RGB_TO_ULONG(106, 90 , 205), "SlateBlue" },
435 { RGB_TO_ULONG(123, 104, 238), "medium slate blue" },
436 { RGB_TO_ULONG(123, 104, 238), "MediumSlateBlue" },
437 { RGB_TO_ULONG(132, 112, 255), "light slate blue" },
438 { RGB_TO_ULONG(132, 112, 255), "LightSlateBlue" },
439 { RGB_TO_ULONG(0 , 0 , 205), "medium blue" },
440 { RGB_TO_ULONG(0 , 0 , 205), "MediumBlue" },
441 { RGB_TO_ULONG(65 , 105, 225), "royal blue" },
442 { RGB_TO_ULONG(65 , 105, 225), "RoyalBlue" },
443 { RGB_TO_ULONG(0 , 0 , 255), "blue" },
444 { RGB_TO_ULONG(30 , 144, 255), "dodger blue" },
445 { RGB_TO_ULONG(30 , 144, 255), "DodgerBlue" },
446 { RGB_TO_ULONG(0 , 191, 255), "deep sky blue" },
447 { RGB_TO_ULONG(0 , 191, 255), "DeepSkyBlue" },
448 { RGB_TO_ULONG(135, 206, 235), "sky blue" },
449 { RGB_TO_ULONG(135, 206, 235), "SkyBlue" },
450 { RGB_TO_ULONG(135, 206, 250), "light sky blue" },
451 { RGB_TO_ULONG(135, 206, 250), "LightSkyBlue" },
452 { RGB_TO_ULONG(70 , 130, 180), "steel blue" },
453 { RGB_TO_ULONG(70 , 130, 180), "SteelBlue" },
454 { RGB_TO_ULONG(176, 196, 222), "light steel blue" },
455 { RGB_TO_ULONG(176, 196, 222), "LightSteelBlue" },
456 { RGB_TO_ULONG(173, 216, 230), "light blue" },
457 { RGB_TO_ULONG(173, 216, 230), "LightBlue" },
458 { RGB_TO_ULONG(176, 224, 230), "powder blue" },
459 { RGB_TO_ULONG(176, 224, 230), "PowderBlue" },
460 { RGB_TO_ULONG(175, 238, 238), "pale turquoise" },
461 { RGB_TO_ULONG(175, 238, 238), "PaleTurquoise" },
462 { RGB_TO_ULONG(0 , 206, 209), "dark turquoise" },
463 { RGB_TO_ULONG(0 , 206, 209), "DarkTurquoise" },
464 { RGB_TO_ULONG(72 , 209, 204), "medium turquoise" },
465 { RGB_TO_ULONG(72 , 209, 204), "MediumTurquoise" },
466 { RGB_TO_ULONG(64 , 224, 208), "turquoise" },
467 { RGB_TO_ULONG(0 , 255, 255), "cyan" },
468 { RGB_TO_ULONG(224, 255, 255), "light cyan" },
469 { RGB_TO_ULONG(224, 255, 255), "LightCyan" },
470 { RGB_TO_ULONG(95 , 158, 160), "cadet blue" },
471 { RGB_TO_ULONG(95 , 158, 160), "CadetBlue" },
472 { RGB_TO_ULONG(102, 205, 170), "medium aquamarine" },
473 { RGB_TO_ULONG(102, 205, 170), "MediumAquamarine" },
474 { RGB_TO_ULONG(127, 255, 212), "aquamarine" },
475 { RGB_TO_ULONG(0 , 100, 0 ), "dark green" },
476 { RGB_TO_ULONG(0 , 100, 0 ), "DarkGreen" },
477 { RGB_TO_ULONG(85 , 107, 47 ), "dark olive green" },
478 { RGB_TO_ULONG(85 , 107, 47 ), "DarkOliveGreen" },
479 { RGB_TO_ULONG(143, 188, 143), "dark sea green" },
480 { RGB_TO_ULONG(143, 188, 143), "DarkSeaGreen" },
481 { RGB_TO_ULONG(46 , 139, 87 ), "sea green" },
482 { RGB_TO_ULONG(46 , 139, 87 ), "SeaGreen" },
483 { RGB_TO_ULONG(60 , 179, 113), "medium sea green" },
484 { RGB_TO_ULONG(60 , 179, 113), "MediumSeaGreen" },
485 { RGB_TO_ULONG(32 , 178, 170), "light sea green" },
486 { RGB_TO_ULONG(32 , 178, 170), "LightSeaGreen" },
487 { RGB_TO_ULONG(152, 251, 152), "pale green" },
488 { RGB_TO_ULONG(152, 251, 152), "PaleGreen" },
489 { RGB_TO_ULONG(0 , 255, 127), "spring green" },
490 { RGB_TO_ULONG(0 , 255, 127), "SpringGreen" },
491 { RGB_TO_ULONG(124, 252, 0 ), "lawn green" },
492 { RGB_TO_ULONG(124, 252, 0 ), "LawnGreen" },
493 { RGB_TO_ULONG(0 , 255, 0 ), "green" },
494 { RGB_TO_ULONG(127, 255, 0 ), "chartreuse" },
495 { RGB_TO_ULONG(0 , 250, 154), "medium spring green" },
496 { RGB_TO_ULONG(0 , 250, 154), "MediumSpringGreen" },
497 { RGB_TO_ULONG(173, 255, 47 ), "green yellow" },
498 { RGB_TO_ULONG(173, 255, 47 ), "GreenYellow" },
499 { RGB_TO_ULONG(50 , 205, 50 ), "lime green" },
500 { RGB_TO_ULONG(50 , 205, 50 ), "LimeGreen" },
501 { RGB_TO_ULONG(154, 205, 50 ), "yellow green" },
502 { RGB_TO_ULONG(154, 205, 50 ), "YellowGreen" },
503 { RGB_TO_ULONG(34 , 139, 34 ), "forest green" },
504 { RGB_TO_ULONG(34 , 139, 34 ), "ForestGreen" },
505 { RGB_TO_ULONG(107, 142, 35 ), "olive drab" },
506 { RGB_TO_ULONG(107, 142, 35 ), "OliveDrab" },
507 { RGB_TO_ULONG(189, 183, 107), "dark khaki" },
508 { RGB_TO_ULONG(189, 183, 107), "DarkKhaki" },
509 { RGB_TO_ULONG(240, 230, 140), "khaki" },
510 { RGB_TO_ULONG(238, 232, 170), "pale goldenrod" },
511 { RGB_TO_ULONG(238, 232, 170), "PaleGoldenrod" },
512 { RGB_TO_ULONG(250, 250, 210), "light goldenrod yellow" },
513 { RGB_TO_ULONG(250, 250, 210), "LightGoldenrodYellow" },
514 { RGB_TO_ULONG(255, 255, 224), "light yellow" },
515 { RGB_TO_ULONG(255, 255, 224), "LightYellow" },
516 { RGB_TO_ULONG(255, 255, 0 ), "yellow" },
517 { RGB_TO_ULONG(255, 215, 0 ), "gold" },
518 { RGB_TO_ULONG(238, 221, 130), "light goldenrod" },
519 { RGB_TO_ULONG(238, 221, 130), "LightGoldenrod" },
520 { RGB_TO_ULONG(218, 165, 32 ), "goldenrod" },
521 { RGB_TO_ULONG(184, 134, 11 ), "dark goldenrod" },
522 { RGB_TO_ULONG(184, 134, 11 ), "DarkGoldenrod" },
523 { RGB_TO_ULONG(188, 143, 143), "rosy brown" },
524 { RGB_TO_ULONG(188, 143, 143), "RosyBrown" },
525 { RGB_TO_ULONG(205, 92 , 92 ), "indian red" },
526 { RGB_TO_ULONG(205, 92 , 92 ), "IndianRed" },
527 { RGB_TO_ULONG(139, 69 , 19 ), "saddle brown" },
528 { RGB_TO_ULONG(139, 69 , 19 ), "SaddleBrown" },
529 { RGB_TO_ULONG(160, 82 , 45 ), "sienna" },
530 { RGB_TO_ULONG(205, 133, 63 ), "peru" },
531 { RGB_TO_ULONG(222, 184, 135), "burlywood" },
532 { RGB_TO_ULONG(245, 245, 220), "beige" },
533 { RGB_TO_ULONG(245, 222, 179), "wheat" },
534 { RGB_TO_ULONG(244, 164, 96 ), "sandy brown" },
535 { RGB_TO_ULONG(244, 164, 96 ), "SandyBrown" },
536 { RGB_TO_ULONG(210, 180, 140), "tan" },
537 { RGB_TO_ULONG(210, 105, 30 ), "chocolate" },
538 { RGB_TO_ULONG(178, 34 , 34 ), "firebrick" },
539 { RGB_TO_ULONG(165, 42 , 42 ), "brown" },
540 { RGB_TO_ULONG(233, 150, 122), "dark salmon" },
541 { RGB_TO_ULONG(233, 150, 122), "DarkSalmon" },
542 { RGB_TO_ULONG(250, 128, 114), "salmon" },
543 { RGB_TO_ULONG(255, 160, 122), "light salmon" },
544 { RGB_TO_ULONG(255, 160, 122), "LightSalmon" },
545 { RGB_TO_ULONG(255, 165, 0 ), "orange" },
546 { RGB_TO_ULONG(255, 140, 0 ), "dark orange" },
547 { RGB_TO_ULONG(255, 140, 0 ), "DarkOrange" },
548 { RGB_TO_ULONG(255, 127, 80 ), "coral" },
549 { RGB_TO_ULONG(240, 128, 128), "light coral" },
550 { RGB_TO_ULONG(240, 128, 128), "LightCoral" },
551 { RGB_TO_ULONG(255, 99 , 71 ), "tomato" },
552 { RGB_TO_ULONG(255, 69 , 0 ), "orange red" },
553 { RGB_TO_ULONG(255, 69 , 0 ), "OrangeRed" },
554 { RGB_TO_ULONG(255, 0 , 0 ), "red" },
555 { RGB_TO_ULONG(255, 105, 180), "hot pink" },
556 { RGB_TO_ULONG(255, 105, 180), "HotPink" },
557 { RGB_TO_ULONG(255, 20 , 147), "deep pink" },
558 { RGB_TO_ULONG(255, 20 , 147), "DeepPink" },
559 { RGB_TO_ULONG(255, 192, 203), "pink" },
560 { RGB_TO_ULONG(255, 182, 193), "light pink" },
561 { RGB_TO_ULONG(255, 182, 193), "LightPink" },
562 { RGB_TO_ULONG(219, 112, 147), "pale violet red" },
563 { RGB_TO_ULONG(219, 112, 147), "PaleVioletRed" },
564 { RGB_TO_ULONG(176, 48 , 96 ), "maroon" },
565 { RGB_TO_ULONG(199, 21 , 133), "medium violet red" },
566 { RGB_TO_ULONG(199, 21 , 133), "MediumVioletRed" },
567 { RGB_TO_ULONG(208, 32 , 144), "violet red" },
568 { RGB_TO_ULONG(208, 32 , 144), "VioletRed" },
569 { RGB_TO_ULONG(255, 0 , 255), "magenta" },
570 { RGB_TO_ULONG(238, 130, 238), "violet" },
571 { RGB_TO_ULONG(221, 160, 221), "plum" },
572 { RGB_TO_ULONG(218, 112, 214), "orchid" },
573 { RGB_TO_ULONG(186, 85 , 211), "medium orchid" },
574 { RGB_TO_ULONG(186, 85 , 211), "MediumOrchid" },
575 { RGB_TO_ULONG(153, 50 , 204), "dark orchid" },
576 { RGB_TO_ULONG(153, 50 , 204), "DarkOrchid" },
577 { RGB_TO_ULONG(148, 0 , 211), "dark violet" },
578 { RGB_TO_ULONG(148, 0 , 211), "DarkViolet" },
579 { RGB_TO_ULONG(138, 43 , 226), "blue violet" },
580 { RGB_TO_ULONG(138, 43 , 226), "BlueViolet" },
581 { RGB_TO_ULONG(160, 32 , 240), "purple" },
582 { RGB_TO_ULONG(147, 112, 219), "medium purple" },
583 { RGB_TO_ULONG(147, 112, 219), "MediumPurple" },
584 { RGB_TO_ULONG(216, 191, 216), "thistle" },
585 { RGB_TO_ULONG(255, 250, 250), "snow1" },
586 { RGB_TO_ULONG(238, 233, 233), "snow2" },
587 { RGB_TO_ULONG(205, 201, 201), "snow3" },
588 { RGB_TO_ULONG(139, 137, 137), "snow4" },
589 { RGB_TO_ULONG(255, 245, 238), "seashell1" },
590 { RGB_TO_ULONG(238, 229, 222), "seashell2" },
591 { RGB_TO_ULONG(205, 197, 191), "seashell3" },
592 { RGB_TO_ULONG(139, 134, 130), "seashell4" },
593 { RGB_TO_ULONG(255, 239, 219), "AntiqueWhite1" },
594 { RGB_TO_ULONG(238, 223, 204), "AntiqueWhite2" },
595 { RGB_TO_ULONG(205, 192, 176), "AntiqueWhite3" },
596 { RGB_TO_ULONG(139, 131, 120), "AntiqueWhite4" },
597 { RGB_TO_ULONG(255, 228, 196), "bisque1" },
598 { RGB_TO_ULONG(238, 213, 183), "bisque2" },
599 { RGB_TO_ULONG(205, 183, 158), "bisque3" },
600 { RGB_TO_ULONG(139, 125, 107), "bisque4" },
601 { RGB_TO_ULONG(255, 218, 185), "PeachPuff1" },
602 { RGB_TO_ULONG(238, 203, 173), "PeachPuff2" },
603 { RGB_TO_ULONG(205, 175, 149), "PeachPuff3" },
604 { RGB_TO_ULONG(139, 119, 101), "PeachPuff4" },
605 { RGB_TO_ULONG(255, 222, 173), "NavajoWhite1" },
606 { RGB_TO_ULONG(238, 207, 161), "NavajoWhite2" },
607 { RGB_TO_ULONG(205, 179, 139), "NavajoWhite3" },
608 { RGB_TO_ULONG(139, 121, 94), "NavajoWhite4" },
609 { RGB_TO_ULONG(255, 250, 205), "LemonChiffon1" },
610 { RGB_TO_ULONG(238, 233, 191), "LemonChiffon2" },
611 { RGB_TO_ULONG(205, 201, 165), "LemonChiffon3" },
612 { RGB_TO_ULONG(139, 137, 112), "LemonChiffon4" },
613 { RGB_TO_ULONG(255, 248, 220), "cornsilk1" },
614 { RGB_TO_ULONG(238, 232, 205), "cornsilk2" },
615 { RGB_TO_ULONG(205, 200, 177), "cornsilk3" },
616 { RGB_TO_ULONG(139, 136, 120), "cornsilk4" },
617 { RGB_TO_ULONG(255, 255, 240), "ivory1" },
618 { RGB_TO_ULONG(238, 238, 224), "ivory2" },
619 { RGB_TO_ULONG(205, 205, 193), "ivory3" },
620 { RGB_TO_ULONG(139, 139, 131), "ivory4" },
621 { RGB_TO_ULONG(240, 255, 240), "honeydew1" },
622 { RGB_TO_ULONG(224, 238, 224), "honeydew2" },
623 { RGB_TO_ULONG(193, 205, 193), "honeydew3" },
624 { RGB_TO_ULONG(131, 139, 131), "honeydew4" },
625 { RGB_TO_ULONG(255, 240, 245), "LavenderBlush1" },
626 { RGB_TO_ULONG(238, 224, 229), "LavenderBlush2" },
627 { RGB_TO_ULONG(205, 193, 197), "LavenderBlush3" },
628 { RGB_TO_ULONG(139, 131, 134), "LavenderBlush4" },
629 { RGB_TO_ULONG(255, 228, 225), "MistyRose1" },
630 { RGB_TO_ULONG(238, 213, 210), "MistyRose2" },
631 { RGB_TO_ULONG(205, 183, 181), "MistyRose3" },
632 { RGB_TO_ULONG(139, 125, 123), "MistyRose4" },
633 { RGB_TO_ULONG(240, 255, 255), "azure1" },
634 { RGB_TO_ULONG(224, 238, 238), "azure2" },
635 { RGB_TO_ULONG(193, 205, 205), "azure3" },
636 { RGB_TO_ULONG(131, 139, 139), "azure4" },
637 { RGB_TO_ULONG(131, 111, 255), "SlateBlue1" },
638 { RGB_TO_ULONG(122, 103, 238), "SlateBlue2" },
639 { RGB_TO_ULONG(105, 89 , 205), "SlateBlue3" },
640 { RGB_TO_ULONG(71 , 60 , 139), "SlateBlue4" },
641 { RGB_TO_ULONG(72 , 118, 255), "RoyalBlue1" },
642 { RGB_TO_ULONG(67 , 110, 238), "RoyalBlue2" },
643 { RGB_TO_ULONG(58 , 95 , 205), "RoyalBlue3" },
644 { RGB_TO_ULONG(39 , 64 , 139), "RoyalBlue4" },
645 { RGB_TO_ULONG(0 , 0 , 255), "blue1" },
646 { RGB_TO_ULONG(0 , 0 , 238), "blue2" },
647 { RGB_TO_ULONG(0 , 0 , 205), "blue3" },
648 { RGB_TO_ULONG(0 , 0 , 139), "blue4" },
649 { RGB_TO_ULONG(30 , 144, 255), "DodgerBlue1" },
650 { RGB_TO_ULONG(28 , 134, 238), "DodgerBlue2" },
651 { RGB_TO_ULONG(24 , 116, 205), "DodgerBlue3" },
652 { RGB_TO_ULONG(16 , 78 , 139), "DodgerBlue4" },
653 { RGB_TO_ULONG(99 , 184, 255), "SteelBlue1" },
654 { RGB_TO_ULONG(92 , 172, 238), "SteelBlue2" },
655 { RGB_TO_ULONG(79 , 148, 205), "SteelBlue3" },
656 { RGB_TO_ULONG(54 , 100, 139), "SteelBlue4" },
657 { RGB_TO_ULONG(0 , 191, 255), "DeepSkyBlue1" },
658 { RGB_TO_ULONG(0 , 178, 238), "DeepSkyBlue2" },
659 { RGB_TO_ULONG(0 , 154, 205), "DeepSkyBlue3" },
660 { RGB_TO_ULONG(0 , 104, 139), "DeepSkyBlue4" },
661 { RGB_TO_ULONG(135, 206, 255), "SkyBlue1" },
662 { RGB_TO_ULONG(126, 192, 238), "SkyBlue2" },
663 { RGB_TO_ULONG(108, 166, 205), "SkyBlue3" },
664 { RGB_TO_ULONG(74 , 112, 139), "SkyBlue4" },
665 { RGB_TO_ULONG(176, 226, 255), "LightSkyBlue1" },
666 { RGB_TO_ULONG(164, 211, 238), "LightSkyBlue2" },
667 { RGB_TO_ULONG(141, 182, 205), "LightSkyBlue3" },
668 { RGB_TO_ULONG(96 , 123, 139), "LightSkyBlue4" },
669 { RGB_TO_ULONG(198, 226, 255), "SlateGray1" },
670 { RGB_TO_ULONG(185, 211, 238), "SlateGray2" },
671 { RGB_TO_ULONG(159, 182, 205), "SlateGray3" },
672 { RGB_TO_ULONG(108, 123, 139), "SlateGray4" },
673 { RGB_TO_ULONG(202, 225, 255), "LightSteelBlue1" },
674 { RGB_TO_ULONG(188, 210, 238), "LightSteelBlue2" },
675 { RGB_TO_ULONG(162, 181, 205), "LightSteelBlue3" },
676 { RGB_TO_ULONG(110, 123, 139), "LightSteelBlue4" },
677 { RGB_TO_ULONG(191, 239, 255), "LightBlue1" },
678 { RGB_TO_ULONG(178, 223, 238), "LightBlue2" },
679 { RGB_TO_ULONG(154, 192, 205), "LightBlue3" },
680 { RGB_TO_ULONG(104, 131, 139), "LightBlue4" },
681 { RGB_TO_ULONG(224, 255, 255), "LightCyan1" },
682 { RGB_TO_ULONG(209, 238, 238), "LightCyan2" },
683 { RGB_TO_ULONG(180, 205, 205), "LightCyan3" },
684 { RGB_TO_ULONG(122, 139, 139), "LightCyan4" },
685 { RGB_TO_ULONG(187, 255, 255), "PaleTurquoise1" },
686 { RGB_TO_ULONG(174, 238, 238), "PaleTurquoise2" },
687 { RGB_TO_ULONG(150, 205, 205), "PaleTurquoise3" },
688 { RGB_TO_ULONG(102, 139, 139), "PaleTurquoise4" },
689 { RGB_TO_ULONG(152, 245, 255), "CadetBlue1" },
690 { RGB_TO_ULONG(142, 229, 238), "CadetBlue2" },
691 { RGB_TO_ULONG(122, 197, 205), "CadetBlue3" },
692 { RGB_TO_ULONG(83 , 134, 139), "CadetBlue4" },
693 { RGB_TO_ULONG(0 , 245, 255), "turquoise1" },
694 { RGB_TO_ULONG(0 , 229, 238), "turquoise2" },
695 { RGB_TO_ULONG(0 , 197, 205), "turquoise3" },
696 { RGB_TO_ULONG(0 , 134, 139), "turquoise4" },
697 { RGB_TO_ULONG(0 , 255, 255), "cyan1" },
698 { RGB_TO_ULONG(0 , 238, 238), "cyan2" },
699 { RGB_TO_ULONG(0 , 205, 205), "cyan3" },
700 { RGB_TO_ULONG(0 , 139, 139), "cyan4" },
701 { RGB_TO_ULONG(151, 255, 255), "DarkSlateGray1" },
702 { RGB_TO_ULONG(141, 238, 238), "DarkSlateGray2" },
703 { RGB_TO_ULONG(121, 205, 205), "DarkSlateGray3" },
704 { RGB_TO_ULONG(82 , 139, 139), "DarkSlateGray4" },
705 { RGB_TO_ULONG(127, 255, 212), "aquamarine1" },
706 { RGB_TO_ULONG(118, 238, 198), "aquamarine2" },
707 { RGB_TO_ULONG(102, 205, 170), "aquamarine3" },
708 { RGB_TO_ULONG(69 , 139, 116), "aquamarine4" },
709 { RGB_TO_ULONG(193, 255, 193), "DarkSeaGreen1" },
710 { RGB_TO_ULONG(180, 238, 180), "DarkSeaGreen2" },
711 { RGB_TO_ULONG(155, 205, 155), "DarkSeaGreen3" },
712 { RGB_TO_ULONG(105, 139, 105), "DarkSeaGreen4" },
713 { RGB_TO_ULONG(84 , 255, 159), "SeaGreen1" },
714 { RGB_TO_ULONG(78 , 238, 148), "SeaGreen2" },
715 { RGB_TO_ULONG(67 , 205, 128), "SeaGreen3" },
716 { RGB_TO_ULONG(46 , 139, 87 ), "SeaGreen4" },
717 { RGB_TO_ULONG(154, 255, 154), "PaleGreen1" },
718 { RGB_TO_ULONG(144, 238, 144), "PaleGreen2" },
719 { RGB_TO_ULONG(124, 205, 124), "PaleGreen3" },
720 { RGB_TO_ULONG(84 , 139, 84 ), "PaleGreen4" },
721 { RGB_TO_ULONG(0 , 255, 127), "SpringGreen1" },
722 { RGB_TO_ULONG(0 , 238, 118), "SpringGreen2" },
723 { RGB_TO_ULONG(0 , 205, 102), "SpringGreen3" },
724 { RGB_TO_ULONG(0 , 139, 69 ), "SpringGreen4" },
725 { RGB_TO_ULONG(0 , 255, 0 ), "green1" },
726 { RGB_TO_ULONG(0 , 238, 0 ), "green2" },
727 { RGB_TO_ULONG(0 , 205, 0 ), "green3" },
728 { RGB_TO_ULONG(0 , 139, 0 ), "green4" },
729 { RGB_TO_ULONG(127, 255, 0 ), "chartreuse1" },
730 { RGB_TO_ULONG(118, 238, 0 ), "chartreuse2" },
731 { RGB_TO_ULONG(102, 205, 0 ), "chartreuse3" },
732 { RGB_TO_ULONG(69 , 139, 0 ), "chartreuse4" },
733 { RGB_TO_ULONG(192, 255, 62 ), "OliveDrab1" },
734 { RGB_TO_ULONG(179, 238, 58 ), "OliveDrab2" },
735 { RGB_TO_ULONG(154, 205, 50 ), "OliveDrab3" },
736 { RGB_TO_ULONG(105, 139, 34 ), "OliveDrab4" },
737 { RGB_TO_ULONG(202, 255, 112), "DarkOliveGreen1" },
738 { RGB_TO_ULONG(188, 238, 104), "DarkOliveGreen2" },
739 { RGB_TO_ULONG(162, 205, 90 ), "DarkOliveGreen3" },
740 { RGB_TO_ULONG(110, 139, 61 ), "DarkOliveGreen4" },
741 { RGB_TO_ULONG(255, 246, 143), "khaki1" },
742 { RGB_TO_ULONG(238, 230, 133), "khaki2" },
743 { RGB_TO_ULONG(205, 198, 115), "khaki3" },
744 { RGB_TO_ULONG(139, 134, 78 ), "khaki4" },
745 { RGB_TO_ULONG(255, 236, 139), "LightGoldenrod1" },
746 { RGB_TO_ULONG(238, 220, 130), "LightGoldenrod2" },
747 { RGB_TO_ULONG(205, 190, 112), "LightGoldenrod3" },
748 { RGB_TO_ULONG(139, 129, 76 ), "LightGoldenrod4" },
749 { RGB_TO_ULONG(255, 255, 224), "LightYellow1" },
750 { RGB_TO_ULONG(238, 238, 209), "LightYellow2" },
751 { RGB_TO_ULONG(205, 205, 180), "LightYellow3" },
752 { RGB_TO_ULONG(139, 139, 122), "LightYellow4" },
753 { RGB_TO_ULONG(255, 255, 0 ), "yellow1" },
754 { RGB_TO_ULONG(238, 238, 0 ), "yellow2" },
755 { RGB_TO_ULONG(205, 205, 0 ), "yellow3" },
756 { RGB_TO_ULONG(139, 139, 0 ), "yellow4" },
757 { RGB_TO_ULONG(255, 215, 0 ), "gold1" },
758 { RGB_TO_ULONG(238, 201, 0 ), "gold2" },
759 { RGB_TO_ULONG(205, 173, 0 ), "gold3" },
760 { RGB_TO_ULONG(139, 117, 0 ), "gold4" },
761 { RGB_TO_ULONG(255, 193, 37 ), "goldenrod1" },
762 { RGB_TO_ULONG(238, 180, 34 ), "goldenrod2" },
763 { RGB_TO_ULONG(205, 155, 29 ), "goldenrod3" },
764 { RGB_TO_ULONG(139, 105, 20 ), "goldenrod4" },
765 { RGB_TO_ULONG(255, 185, 15 ), "DarkGoldenrod1" },
766 { RGB_TO_ULONG(238, 173, 14 ), "DarkGoldenrod2" },
767 { RGB_TO_ULONG(205, 149, 12 ), "DarkGoldenrod3" },
768 { RGB_TO_ULONG(139, 101, 8 ), "DarkGoldenrod4" },
769 { RGB_TO_ULONG(255, 193, 193), "RosyBrown1" },
770 { RGB_TO_ULONG(238, 180, 180), "RosyBrown2" },
771 { RGB_TO_ULONG(205, 155, 155), "RosyBrown3" },
772 { RGB_TO_ULONG(139, 105, 105), "RosyBrown4" },
773 { RGB_TO_ULONG(255, 106, 106), "IndianRed1" },
774 { RGB_TO_ULONG(238, 99 , 99 ), "IndianRed2" },
775 { RGB_TO_ULONG(205, 85 , 85 ), "IndianRed3" },
776 { RGB_TO_ULONG(139, 58 , 58 ), "IndianRed4" },
777 { RGB_TO_ULONG(255, 130, 71 ), "sienna1" },
778 { RGB_TO_ULONG(238, 121, 66 ), "sienna2" },
779 { RGB_TO_ULONG(205, 104, 57 ), "sienna3" },
780 { RGB_TO_ULONG(139, 71 , 38 ), "sienna4" },
781 { RGB_TO_ULONG(255, 211, 155), "burlywood1" },
782 { RGB_TO_ULONG(238, 197, 145), "burlywood2" },
783 { RGB_TO_ULONG(205, 170, 125), "burlywood3" },
784 { RGB_TO_ULONG(139, 115, 85 ), "burlywood4" },
785 { RGB_TO_ULONG(255, 231, 186), "wheat1" },
786 { RGB_TO_ULONG(238, 216, 174), "wheat2" },
787 { RGB_TO_ULONG(205, 186, 150), "wheat3" },
788 { RGB_TO_ULONG(139, 126, 102), "wheat4" },
789 { RGB_TO_ULONG(255, 165, 79 ), "tan1" },
790 { RGB_TO_ULONG(238, 154, 73 ), "tan2" },
791 { RGB_TO_ULONG(205, 133, 63 ), "tan3" },
792 { RGB_TO_ULONG(139, 90 , 43 ), "tan4" },
793 { RGB_TO_ULONG(255, 127, 36 ), "chocolate1" },
794 { RGB_TO_ULONG(238, 118, 33 ), "chocolate2" },
795 { RGB_TO_ULONG(205, 102, 29 ), "chocolate3" },
796 { RGB_TO_ULONG(139, 69 , 19 ), "chocolate4" },
797 { RGB_TO_ULONG(255, 48 , 48 ), "firebrick1" },
798 { RGB_TO_ULONG(238, 44 , 44 ), "firebrick2" },
799 { RGB_TO_ULONG(205, 38 , 38 ), "firebrick3" },
800 { RGB_TO_ULONG(139, 26 , 26 ), "firebrick4" },
801 { RGB_TO_ULONG(255, 64 , 64 ), "brown1" },
802 { RGB_TO_ULONG(238, 59 , 59 ), "brown2" },
803 { RGB_TO_ULONG(205, 51 , 51 ), "brown3" },
804 { RGB_TO_ULONG(139, 35 , 35 ), "brown4" },
805 { RGB_TO_ULONG(255, 140, 105), "salmon1" },
806 { RGB_TO_ULONG(238, 130, 98 ), "salmon2" },
807 { RGB_TO_ULONG(205, 112, 84 ), "salmon3" },
808 { RGB_TO_ULONG(139, 76 , 57 ), "salmon4" },
809 { RGB_TO_ULONG(255, 160, 122), "LightSalmon1" },
810 { RGB_TO_ULONG(238, 149, 114), "LightSalmon2" },
811 { RGB_TO_ULONG(205, 129, 98 ), "LightSalmon3" },
812 { RGB_TO_ULONG(139, 87 , 66 ), "LightSalmon4" },
813 { RGB_TO_ULONG(255, 165, 0 ), "orange1" },
814 { RGB_TO_ULONG(238, 154, 0 ), "orange2" },
815 { RGB_TO_ULONG(205, 133, 0 ), "orange3" },
816 { RGB_TO_ULONG(139, 90 , 0 ), "orange4" },
817 { RGB_TO_ULONG(255, 127, 0 ), "DarkOrange1" },
818 { RGB_TO_ULONG(238, 118, 0 ), "DarkOrange2" },
819 { RGB_TO_ULONG(205, 102, 0 ), "DarkOrange3" },
820 { RGB_TO_ULONG(139, 69 , 0 ), "DarkOrange4" },
821 { RGB_TO_ULONG(255, 114, 86 ), "coral1" },
822 { RGB_TO_ULONG(238, 106, 80 ), "coral2" },
823 { RGB_TO_ULONG(205, 91 , 69 ), "coral3" },
824 { RGB_TO_ULONG(139, 62 , 47 ), "coral4" },
825 { RGB_TO_ULONG(255, 99 , 71 ), "tomato1" },
826 { RGB_TO_ULONG(238, 92 , 66 ), "tomato2" },
827 { RGB_TO_ULONG(205, 79 , 57 ), "tomato3" },
828 { RGB_TO_ULONG(139, 54 , 38 ), "tomato4" },
829 { RGB_TO_ULONG(255, 69 , 0 ), "OrangeRed1" },
830 { RGB_TO_ULONG(238, 64 , 0 ), "OrangeRed2" },
831 { RGB_TO_ULONG(205, 55 , 0 ), "OrangeRed3" },
832 { RGB_TO_ULONG(139, 37 , 0 ), "OrangeRed4" },
833 { RGB_TO_ULONG(255, 0 , 0 ), "red1" },
834 { RGB_TO_ULONG(238, 0 , 0 ), "red2" },
835 { RGB_TO_ULONG(205, 0 , 0 ), "red3" },
836 { RGB_TO_ULONG(139, 0 , 0 ), "red4" },
837 { RGB_TO_ULONG(255, 20 , 147), "DeepPink1" },
838 { RGB_TO_ULONG(238, 18 , 137), "DeepPink2" },
839 { RGB_TO_ULONG(205, 16 , 118), "DeepPink3" },
840 { RGB_TO_ULONG(139, 10 , 80 ), "DeepPink4" },
841 { RGB_TO_ULONG(255, 110, 180), "HotPink1" },
842 { RGB_TO_ULONG(238, 106, 167), "HotPink2" },
843 { RGB_TO_ULONG(205, 96 , 144), "HotPink3" },
844 { RGB_TO_ULONG(139, 58 , 98 ), "HotPink4" },
845 { RGB_TO_ULONG(255, 181, 197), "pink1" },
846 { RGB_TO_ULONG(238, 169, 184), "pink2" },
847 { RGB_TO_ULONG(205, 145, 158), "pink3" },
848 { RGB_TO_ULONG(139, 99 , 108), "pink4" },
849 { RGB_TO_ULONG(255, 174, 185), "LightPink1" },
850 { RGB_TO_ULONG(238, 162, 173), "LightPink2" },
851 { RGB_TO_ULONG(205, 140, 149), "LightPink3" },
852 { RGB_TO_ULONG(139, 95 , 101), "LightPink4" },
853 { RGB_TO_ULONG(255, 130, 171), "PaleVioletRed1" },
854 { RGB_TO_ULONG(238, 121, 159), "PaleVioletRed2" },
855 { RGB_TO_ULONG(205, 104, 137), "PaleVioletRed3" },
856 { RGB_TO_ULONG(139, 71 , 93 ), "PaleVioletRed4" },
857 { RGB_TO_ULONG(255, 52 , 179), "maroon1" },
858 { RGB_TO_ULONG(238, 48 , 167), "maroon2" },
859 { RGB_TO_ULONG(205, 41 , 144), "maroon3" },
860 { RGB_TO_ULONG(139, 28 , 98 ), "maroon4" },
861 { RGB_TO_ULONG(255, 62 , 150), "VioletRed1" },
862 { RGB_TO_ULONG(238, 58 , 140), "VioletRed2" },
863 { RGB_TO_ULONG(205, 50 , 120), "VioletRed3" },
864 { RGB_TO_ULONG(139, 34 , 82 ), "VioletRed4" },
865 { RGB_TO_ULONG(255, 0 , 255), "magenta1" },
866 { RGB_TO_ULONG(238, 0 , 238), "magenta2" },
867 { RGB_TO_ULONG(205, 0 , 205), "magenta3" },
868 { RGB_TO_ULONG(139, 0 , 139), "magenta4" },
869 { RGB_TO_ULONG(255, 131, 250), "orchid1" },
870 { RGB_TO_ULONG(238, 122, 233), "orchid2" },
871 { RGB_TO_ULONG(205, 105, 201), "orchid3" },
872 { RGB_TO_ULONG(139, 71 , 137), "orchid4" },
873 { RGB_TO_ULONG(255, 187, 255), "plum1" },
874 { RGB_TO_ULONG(238, 174, 238), "plum2" },
875 { RGB_TO_ULONG(205, 150, 205), "plum3" },
876 { RGB_TO_ULONG(139, 102, 139), "plum4" },
877 { RGB_TO_ULONG(224, 102, 255), "MediumOrchid1" },
878 { RGB_TO_ULONG(209, 95 , 238), "MediumOrchid2" },
879 { RGB_TO_ULONG(180, 82 , 205), "MediumOrchid3" },
880 { RGB_TO_ULONG(122, 55 , 139), "MediumOrchid4" },
881 { RGB_TO_ULONG(191, 62 , 255), "DarkOrchid1" },
882 { RGB_TO_ULONG(178, 58 , 238), "DarkOrchid2" },
883 { RGB_TO_ULONG(154, 50 , 205), "DarkOrchid3" },
884 { RGB_TO_ULONG(104, 34 , 139), "DarkOrchid4" },
885 { RGB_TO_ULONG(155, 48 , 255), "purple1" },
886 { RGB_TO_ULONG(145, 44 , 238), "purple2" },
887 { RGB_TO_ULONG(125, 38 , 205), "purple3" },
888 { RGB_TO_ULONG(85 , 26 , 139), "purple4" },
889 { RGB_TO_ULONG(171, 130, 255), "MediumPurple1" },
890 { RGB_TO_ULONG(159, 121, 238), "MediumPurple2" },
891 { RGB_TO_ULONG(137, 104, 205), "MediumPurple3" },
892 { RGB_TO_ULONG(93 , 71 , 139), "MediumPurple4" },
893 { RGB_TO_ULONG(255, 225, 255), "thistle1" },
894 { RGB_TO_ULONG(238, 210, 238), "thistle2" },
895 { RGB_TO_ULONG(205, 181, 205), "thistle3" },
896 { RGB_TO_ULONG(139, 123, 139), "thistle4" },
897 { RGB_TO_ULONG(0 , 0 , 0 ), "gray0" },
898 { RGB_TO_ULONG(0 , 0 , 0 ), "grey0" },
899 { RGB_TO_ULONG(3 , 3 , 3 ), "gray1" },
900 { RGB_TO_ULONG(3 , 3 , 3 ), "grey1" },
901 { RGB_TO_ULONG(5 , 5 , 5 ), "gray2" },
902 { RGB_TO_ULONG(5 , 5 , 5 ), "grey2" },
903 { RGB_TO_ULONG(8 , 8 , 8 ), "gray3" },
904 { RGB_TO_ULONG(8 , 8 , 8 ), "grey3" },
905 { RGB_TO_ULONG(10 , 10 , 10 ), "gray4" },
906 { RGB_TO_ULONG(10 , 10 , 10 ), "grey4" },
907 { RGB_TO_ULONG(13 , 13 , 13 ), "gray5" },
908 { RGB_TO_ULONG(13 , 13 , 13 ), "grey5" },
909 { RGB_TO_ULONG(15 , 15 , 15 ), "gray6" },
910 { RGB_TO_ULONG(15 , 15 , 15 ), "grey6" },
911 { RGB_TO_ULONG(18 , 18 , 18 ), "gray7" },
912 { RGB_TO_ULONG(18 , 18 , 18 ), "grey7" },
913 { RGB_TO_ULONG(20 , 20 , 20 ), "gray8" },
914 { RGB_TO_ULONG(20 , 20 , 20 ), "grey8" },
915 { RGB_TO_ULONG(23 , 23 , 23 ), "gray9" },
916 { RGB_TO_ULONG(23 , 23 , 23 ), "grey9" },
917 { RGB_TO_ULONG(26 , 26 , 26 ), "gray10" },
918 { RGB_TO_ULONG(26 , 26 , 26 ), "grey10" },
919 { RGB_TO_ULONG(28 , 28 , 28 ), "gray11" },
920 { RGB_TO_ULONG(28 , 28 , 28 ), "grey11" },
921 { RGB_TO_ULONG(31 , 31 , 31 ), "gray12" },
922 { RGB_TO_ULONG(31 , 31 , 31 ), "grey12" },
923 { RGB_TO_ULONG(33 , 33 , 33 ), "gray13" },
924 { RGB_TO_ULONG(33 , 33 , 33 ), "grey13" },
925 { RGB_TO_ULONG(36 , 36 , 36 ), "gray14" },
926 { RGB_TO_ULONG(36 , 36 , 36 ), "grey14" },
927 { RGB_TO_ULONG(38 , 38 , 38 ), "gray15" },
928 { RGB_TO_ULONG(38 , 38 , 38 ), "grey15" },
929 { RGB_TO_ULONG(41 , 41 , 41 ), "gray16" },
930 { RGB_TO_ULONG(41 , 41 , 41 ), "grey16" },
931 { RGB_TO_ULONG(43 , 43 , 43 ), "gray17" },
932 { RGB_TO_ULONG(43 , 43 , 43 ), "grey17" },
933 { RGB_TO_ULONG(46 , 46 , 46 ), "gray18" },
934 { RGB_TO_ULONG(46 , 46 , 46 ), "grey18" },
935 { RGB_TO_ULONG(48 , 48 , 48 ), "gray19" },
936 { RGB_TO_ULONG(48 , 48 , 48 ), "grey19" },
937 { RGB_TO_ULONG(51 , 51 , 51 ), "gray20" },
938 { RGB_TO_ULONG(51 , 51 , 51 ), "grey20" },
939 { RGB_TO_ULONG(54 , 54 , 54 ), "gray21" },
940 { RGB_TO_ULONG(54 , 54 , 54 ), "grey21" },
941 { RGB_TO_ULONG(56 , 56 , 56 ), "gray22" },
942 { RGB_TO_ULONG(56 , 56 , 56 ), "grey22" },
943 { RGB_TO_ULONG(59 , 59 , 59 ), "gray23" },
944 { RGB_TO_ULONG(59 , 59 , 59 ), "grey23" },
945 { RGB_TO_ULONG(61 , 61 , 61 ), "gray24" },
946 { RGB_TO_ULONG(61 , 61 , 61 ), "grey24" },
947 { RGB_TO_ULONG(64 , 64 , 64 ), "gray25" },
948 { RGB_TO_ULONG(64 , 64 , 64 ), "grey25" },
949 { RGB_TO_ULONG(66 , 66 , 66 ), "gray26" },
950 { RGB_TO_ULONG(66 , 66 , 66 ), "grey26" },
951 { RGB_TO_ULONG(69 , 69 , 69 ), "gray27" },
952 { RGB_TO_ULONG(69 , 69 , 69 ), "grey27" },
953 { RGB_TO_ULONG(71 , 71 , 71 ), "gray28" },
954 { RGB_TO_ULONG(71 , 71 , 71 ), "grey28" },
955 { RGB_TO_ULONG(74 , 74 , 74 ), "gray29" },
956 { RGB_TO_ULONG(74 , 74 , 74 ), "grey29" },
957 { RGB_TO_ULONG(77 , 77 , 77 ), "gray30" },
958 { RGB_TO_ULONG(77 , 77 , 77 ), "grey30" },
959 { RGB_TO_ULONG(79 , 79 , 79 ), "gray31" },
960 { RGB_TO_ULONG(79 , 79 , 79 ), "grey31" },
961 { RGB_TO_ULONG(82 , 82 , 82 ), "gray32" },
962 { RGB_TO_ULONG(82 , 82 , 82 ), "grey32" },
963 { RGB_TO_ULONG(84 , 84 , 84 ), "gray33" },
964 { RGB_TO_ULONG(84 , 84 , 84 ), "grey33" },
965 { RGB_TO_ULONG(87 , 87 , 87 ), "gray34" },
966 { RGB_TO_ULONG(87 , 87 , 87 ), "grey34" },
967 { RGB_TO_ULONG(89 , 89 , 89 ), "gray35" },
968 { RGB_TO_ULONG(89 , 89 , 89 ), "grey35" },
969 { RGB_TO_ULONG(92 , 92 , 92 ), "gray36" },
970 { RGB_TO_ULONG(92 , 92 , 92 ), "grey36" },
971 { RGB_TO_ULONG(94 , 94 , 94 ), "gray37" },
972 { RGB_TO_ULONG(94 , 94 , 94 ), "grey37" },
973 { RGB_TO_ULONG(97 , 97 , 97 ), "gray38" },
974 { RGB_TO_ULONG(97 , 97 , 97 ), "grey38" },
975 { RGB_TO_ULONG(99 , 99 , 99 ), "gray39" },
976 { RGB_TO_ULONG(99 , 99 , 99 ), "grey39" },
977 { RGB_TO_ULONG(102, 102, 102), "gray40" },
978 { RGB_TO_ULONG(102, 102, 102), "grey40" },
979 { RGB_TO_ULONG(105, 105, 105), "gray41" },
980 { RGB_TO_ULONG(105, 105, 105), "grey41" },
981 { RGB_TO_ULONG(107, 107, 107), "gray42" },
982 { RGB_TO_ULONG(107, 107, 107), "grey42" },
983 { RGB_TO_ULONG(110, 110, 110), "gray43" },
984 { RGB_TO_ULONG(110, 110, 110), "grey43" },
985 { RGB_TO_ULONG(112, 112, 112), "gray44" },
986 { RGB_TO_ULONG(112, 112, 112), "grey44" },
987 { RGB_TO_ULONG(115, 115, 115), "gray45" },
988 { RGB_TO_ULONG(115, 115, 115), "grey45" },
989 { RGB_TO_ULONG(117, 117, 117), "gray46" },
990 { RGB_TO_ULONG(117, 117, 117), "grey46" },
991 { RGB_TO_ULONG(120, 120, 120), "gray47" },
992 { RGB_TO_ULONG(120, 120, 120), "grey47" },
993 { RGB_TO_ULONG(122, 122, 122), "gray48" },
994 { RGB_TO_ULONG(122, 122, 122), "grey48" },
995 { RGB_TO_ULONG(125, 125, 125), "gray49" },
996 { RGB_TO_ULONG(125, 125, 125), "grey49" },
997 { RGB_TO_ULONG(127, 127, 127), "gray50" },
998 { RGB_TO_ULONG(127, 127, 127), "grey50" },
999 { RGB_TO_ULONG(130, 130, 130), "gray51" },
1000 { RGB_TO_ULONG(130, 130, 130), "grey51" },
1001 { RGB_TO_ULONG(133, 133, 133), "gray52" },
1002 { RGB_TO_ULONG(133, 133, 133), "grey52" },
1003 { RGB_TO_ULONG(135, 135, 135), "gray53" },
1004 { RGB_TO_ULONG(135, 135, 135), "grey53" },
1005 { RGB_TO_ULONG(138, 138, 138), "gray54" },
1006 { RGB_TO_ULONG(138, 138, 138), "grey54" },
1007 { RGB_TO_ULONG(140, 140, 140), "gray55" },
1008 { RGB_TO_ULONG(140, 140, 140), "grey55" },
1009 { RGB_TO_ULONG(143, 143, 143), "gray56" },
1010 { RGB_TO_ULONG(143, 143, 143), "grey56" },
1011 { RGB_TO_ULONG(145, 145, 145), "gray57" },
1012 { RGB_TO_ULONG(145, 145, 145), "grey57" },
1013 { RGB_TO_ULONG(148, 148, 148), "gray58" },
1014 { RGB_TO_ULONG(148, 148, 148), "grey58" },
1015 { RGB_TO_ULONG(150, 150, 150), "gray59" },
1016 { RGB_TO_ULONG(150, 150, 150), "grey59" },
1017 { RGB_TO_ULONG(153, 153, 153), "gray60" },
1018 { RGB_TO_ULONG(153, 153, 153), "grey60" },
1019 { RGB_TO_ULONG(156, 156, 156), "gray61" },
1020 { RGB_TO_ULONG(156, 156, 156), "grey61" },
1021 { RGB_TO_ULONG(158, 158, 158), "gray62" },
1022 { RGB_TO_ULONG(158, 158, 158), "grey62" },
1023 { RGB_TO_ULONG(161, 161, 161), "gray63" },
1024 { RGB_TO_ULONG(161, 161, 161), "grey63" },
1025 { RGB_TO_ULONG(163, 163, 163), "gray64" },
1026 { RGB_TO_ULONG(163, 163, 163), "grey64" },
1027 { RGB_TO_ULONG(166, 166, 166), "gray65" },
1028 { RGB_TO_ULONG(166, 166, 166), "grey65" },
1029 { RGB_TO_ULONG(168, 168, 168), "gray66" },
1030 { RGB_TO_ULONG(168, 168, 168), "grey66" },
1031 { RGB_TO_ULONG(171, 171, 171), "gray67" },
1032 { RGB_TO_ULONG(171, 171, 171), "grey67" },
1033 { RGB_TO_ULONG(173, 173, 173), "gray68" },
1034 { RGB_TO_ULONG(173, 173, 173), "grey68" },
1035 { RGB_TO_ULONG(176, 176, 176), "gray69" },
1036 { RGB_TO_ULONG(176, 176, 176), "grey69" },
1037 { RGB_TO_ULONG(179, 179, 179), "gray70" },
1038 { RGB_TO_ULONG(179, 179, 179), "grey70" },
1039 { RGB_TO_ULONG(181, 181, 181), "gray71" },
1040 { RGB_TO_ULONG(181, 181, 181), "grey71" },
1041 { RGB_TO_ULONG(184, 184, 184), "gray72" },
1042 { RGB_TO_ULONG(184, 184, 184), "grey72" },
1043 { RGB_TO_ULONG(186, 186, 186), "gray73" },
1044 { RGB_TO_ULONG(186, 186, 186), "grey73" },
1045 { RGB_TO_ULONG(189, 189, 189), "gray74" },
1046 { RGB_TO_ULONG(189, 189, 189), "grey74" },
1047 { RGB_TO_ULONG(191, 191, 191), "gray75" },
1048 { RGB_TO_ULONG(191, 191, 191), "grey75" },
1049 { RGB_TO_ULONG(194, 194, 194), "gray76" },
1050 { RGB_TO_ULONG(194, 194, 194), "grey76" },
1051 { RGB_TO_ULONG(196, 196, 196), "gray77" },
1052 { RGB_TO_ULONG(196, 196, 196), "grey77" },
1053 { RGB_TO_ULONG(199, 199, 199), "gray78" },
1054 { RGB_TO_ULONG(199, 199, 199), "grey78" },
1055 { RGB_TO_ULONG(201, 201, 201), "gray79" },
1056 { RGB_TO_ULONG(201, 201, 201), "grey79" },
1057 { RGB_TO_ULONG(204, 204, 204), "gray80" },
1058 { RGB_TO_ULONG(204, 204, 204), "grey80" },
1059 { RGB_TO_ULONG(207, 207, 207), "gray81" },
1060 { RGB_TO_ULONG(207, 207, 207), "grey81" },
1061 { RGB_TO_ULONG(209, 209, 209), "gray82" },
1062 { RGB_TO_ULONG(209, 209, 209), "grey82" },
1063 { RGB_TO_ULONG(212, 212, 212), "gray83" },
1064 { RGB_TO_ULONG(212, 212, 212), "grey83" },
1065 { RGB_TO_ULONG(214, 214, 214), "gray84" },
1066 { RGB_TO_ULONG(214, 214, 214), "grey84" },
1067 { RGB_TO_ULONG(217, 217, 217), "gray85" },
1068 { RGB_TO_ULONG(217, 217, 217), "grey85" },
1069 { RGB_TO_ULONG(219, 219, 219), "gray86" },
1070 { RGB_TO_ULONG(219, 219, 219), "grey86" },
1071 { RGB_TO_ULONG(222, 222, 222), "gray87" },
1072 { RGB_TO_ULONG(222, 222, 222), "grey87" },
1073 { RGB_TO_ULONG(224, 224, 224), "gray88" },
1074 { RGB_TO_ULONG(224, 224, 224), "grey88" },
1075 { RGB_TO_ULONG(227, 227, 227), "gray89" },
1076 { RGB_TO_ULONG(227, 227, 227), "grey89" },
1077 { RGB_TO_ULONG(229, 229, 229), "gray90" },
1078 { RGB_TO_ULONG(229, 229, 229), "grey90" },
1079 { RGB_TO_ULONG(232, 232, 232), "gray91" },
1080 { RGB_TO_ULONG(232, 232, 232), "grey91" },
1081 { RGB_TO_ULONG(235, 235, 235), "gray92" },
1082 { RGB_TO_ULONG(235, 235, 235), "grey92" },
1083 { RGB_TO_ULONG(237, 237, 237), "gray93" },
1084 { RGB_TO_ULONG(237, 237, 237), "grey93" },
1085 { RGB_TO_ULONG(240, 240, 240), "gray94" },
1086 { RGB_TO_ULONG(240, 240, 240), "grey94" },
1087 { RGB_TO_ULONG(242, 242, 242), "gray95" },
1088 { RGB_TO_ULONG(242, 242, 242), "grey95" },
1089 { RGB_TO_ULONG(245, 245, 245), "gray96" },
1090 { RGB_TO_ULONG(245, 245, 245), "grey96" },
1091 { RGB_TO_ULONG(247, 247, 247), "gray97" },
1092 { RGB_TO_ULONG(247, 247, 247), "grey97" },
1093 { RGB_TO_ULONG(250, 250, 250), "gray98" },
1094 { RGB_TO_ULONG(250, 250, 250), "grey98" },
1095 { RGB_TO_ULONG(252, 252, 252), "gray99" },
1096 { RGB_TO_ULONG(252, 252, 252), "grey99" },
1097 { RGB_TO_ULONG(255, 255, 255), "gray100" },
1098 { RGB_TO_ULONG(255, 255, 255), "grey100" },
1099 { RGB_TO_ULONG(169, 169, 169), "dark grey" },
1100 { RGB_TO_ULONG(169, 169, 169), "DarkGrey" },
1101 { RGB_TO_ULONG(169, 169, 169), "dark gray" },
1102 { RGB_TO_ULONG(169, 169, 169), "DarkGray" },
1103 { RGB_TO_ULONG(0 , 0 , 139), "dark blue" },
1104 { RGB_TO_ULONG(0 , 0 , 139), "DarkBlue" },
1105 { RGB_TO_ULONG(0 , 139, 139), "dark cyan" },
1106 { RGB_TO_ULONG(0 , 139, 139), "DarkCyan" },
1107 { RGB_TO_ULONG(139, 0 , 139), "dark magenta" },
1108 { RGB_TO_ULONG(139, 0 , 139), "DarkMagenta" },
1109 { RGB_TO_ULONG(139, 0 , 0 ), "dark red" },
1110 { RGB_TO_ULONG(139, 0 , 0 ), "DarkRed" },
1111 { RGB_TO_ULONG(144, 238, 144), "light green" },
1112 { RGB_TO_ULONG(144, 238, 144), "LightGreen" }
1116 mac_color_map_lookup (colorname
)
1119 Lisp_Object ret
= Qnil
;
1124 for (i
= 0; i
< sizeof (mac_color_map
) / sizeof (mac_color_map
[0]); i
++)
1125 if (stricmp (colorname
, mac_color_map
[i
].name
) == 0)
1127 ret
= make_number (mac_color_map
[i
].color
);
1137 x_to_mac_color (colorname
)
1140 register Lisp_Object tail
, ret
= Qnil
;
1144 if (colorname
[0] == '#')
1146 /* Could be an old-style RGB Device specification. */
1149 color
= colorname
+ 1;
1151 size
= strlen(color
);
1152 if (size
== 3 || size
== 6 || size
== 9 || size
== 12)
1154 unsigned long colorval
;
1160 for (i
= 0; i
< 3; i
++)
1164 unsigned long value
;
1166 /* The check for 'x' in the following conditional takes into
1167 account the fact that strtol allows a "0x" in front of
1168 our numbers, and we don't. */
1169 if (!isxdigit(color
[0]) || color
[1] == 'x')
1173 value
= strtoul(color
, &end
, 16);
1175 if (errno
== ERANGE
|| end
- color
!= size
)
1180 value
= value
* 0x10;
1191 colorval
|= (value
<< pos
);
1196 return make_number (colorval
);
1202 else if (strnicmp(colorname
, "rgb:", 4) == 0)
1205 unsigned long colorval
;
1210 color
= colorname
+ 4;
1211 for (i
= 0; i
< 3; i
++)
1214 unsigned long value
;
1216 /* The check for 'x' in the following conditional takes into
1217 account the fact that strtol allows a "0x" in front of
1218 our numbers, and we don't. */
1219 if (!isxdigit(color
[0]) || color
[1] == 'x')
1221 value
= strtoul(color
, &end
, 16);
1222 if (errno
== ERANGE
)
1224 switch (end
- color
)
1227 value
= value
* 0x10 + value
;
1240 if (value
== ULONG_MAX
)
1242 colorval
|= (value
<< pos
);
1249 return make_number (colorval
);
1256 else if (strnicmp(colorname
, "rgbi:", 5) == 0)
1258 /* This is an RGB Intensity specification. */
1260 unsigned long colorval
;
1265 color
= colorname
+ 5;
1266 for (i
= 0; i
< 3; i
++)
1272 value
= strtod(color
, &end
);
1273 if (errno
== ERANGE
)
1275 if (value
< 0.0 || value
> 1.0)
1277 val
= (unsigned long)(0x100 * value
);
1278 /* We used 0x100 instead of 0xFF to give a continuous
1279 range between 0.0 and 1.0 inclusive. The next statement
1280 fixes the 1.0 case. */
1283 colorval
|= (val
<< pos
);
1290 return make_number (colorval
);
1298 ret
= mac_color_map_lookup (colorname
);
1304 /* Gamma-correct COLOR on frame F. */
1307 gamma_correct (f
, color
)
1309 unsigned long *color
;
1313 unsigned long red
, green
, blue
;
1315 red
= pow (RED_FROM_ULONG (*color
) / 255.0, f
->gamma
) * 255.0 + 0.5;
1316 green
= pow (GREEN_FROM_ULONG (*color
) / 255.0, f
->gamma
) * 255.0 + 0.5;
1317 blue
= pow (BLUE_FROM_ULONG (*color
) / 255.0, f
->gamma
) * 255.0 + 0.5;
1318 *color
= RGB_TO_ULONG (red
, green
, blue
);
1322 /* Decide if color named COLOR is valid for the display associated
1323 with the selected frame; if so, return the rgb values in COLOR_DEF.
1324 If ALLOC is nonzero, allocate a new colormap cell. */
1327 mac_defined_color (f
, color
, color_def
, alloc
)
1333 register Lisp_Object tem
;
1334 unsigned long mac_color_ref
;
1336 tem
= x_to_mac_color (color
);
1342 /* Apply gamma correction. */
1343 mac_color_ref
= XUINT (tem
);
1344 gamma_correct (f
, &mac_color_ref
);
1345 XSETINT (tem
, mac_color_ref
);
1348 color_def
->pixel
= mac_color_ref
;
1349 color_def
->red
= RED16_FROM_ULONG (mac_color_ref
);
1350 color_def
->green
= GREEN16_FROM_ULONG (mac_color_ref
);
1351 color_def
->blue
= BLUE16_FROM_ULONG (mac_color_ref
);
1361 /* Given a string ARG naming a color, compute a pixel value from it
1362 suitable for screen F.
1363 If F is not a color screen, return DEF (default) regardless of what
1367 x_decode_color (f
, arg
, def
)
1376 if (strcmp (SDATA (arg
), "black") == 0)
1377 return BLACK_PIX_DEFAULT (f
);
1378 else if (strcmp (SDATA (arg
), "white") == 0)
1379 return WHITE_PIX_DEFAULT (f
);
1382 if (FRAME_MAC_DISPLAY_INFO (f
)->n_planes
) == 1)
1386 if (mac_defined_color (f
, SDATA (arg
), &cdef
, 1))
1389 /* defined_color failed; return an ultimate default. */
1393 /* Functions called only from `x_set_frame_param'
1394 to set individual parameters.
1396 If FRAME_MAC_WINDOW (f) is 0,
1397 the frame is being created and its window does not exist yet.
1398 In that case, just record the parameter's new value
1399 in the standard place; do not attempt to change the window. */
1402 x_set_foreground_color (f
, arg
, oldval
)
1404 Lisp_Object arg
, oldval
;
1406 unsigned long fg
, old_fg
;
1408 fg
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1409 old_fg
= FRAME_FOREGROUND_PIXEL (f
);
1410 FRAME_FOREGROUND_PIXEL (f
) = fg
;
1412 if (FRAME_MAC_WINDOW (f
) != 0)
1414 update_face_from_frame_parameter (f
, Qforeground_color
, arg
);
1415 if (FRAME_VISIBLE_P (f
))
1421 x_set_background_color (f
, arg
, oldval
)
1423 Lisp_Object arg
, oldval
;
1425 FRAME_BACKGROUND_PIXEL (f
)
1426 = x_decode_color (f
, arg
, WHITE_PIX_DEFAULT (f
));
1428 if (FRAME_MAC_WINDOW (f
) != 0)
1430 update_face_from_frame_parameter (f
, Qbackground_color
, arg
);
1432 if (FRAME_VISIBLE_P (f
))
1438 x_set_mouse_color (f
, arg
, oldval
)
1440 Lisp_Object arg
, oldval
;
1442 Cursor cursor
, nontext_cursor
, mode_cursor
, hand_cursor
;
1446 if (!EQ (Qnil
, arg
))
1447 f
->output_data
.mac
->mouse_pixel
1448 = x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1449 mask_color
= FRAME_BACKGROUND_PIXEL (f
);
1451 /* Don't let pointers be invisible. */
1452 if (mask_color
== f
->output_data
.mac
->mouse_pixel
1453 && mask_color
== FRAME_BACKGROUND_PIXEL (f
))
1454 f
->output_data
.mac
->mouse_pixel
= FRAME_FOREGROUND_PIXEL (f
);
1456 #if 0 /* MAC_TODO : cursor changes */
1459 /* It's not okay to crash if the user selects a screwy cursor. */
1460 count
= x_catch_errors (FRAME_W32_DISPLAY (f
));
1462 if (!EQ (Qnil
, Vx_pointer_shape
))
1464 CHECK_NUMBER (Vx_pointer_shape
);
1465 cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
), XINT (Vx_pointer_shape
));
1468 cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
), XC_xterm
);
1469 x_check_errors (FRAME_W32_DISPLAY (f
), "bad text pointer cursor: %s");
1471 if (!EQ (Qnil
, Vx_nontext_pointer_shape
))
1473 CHECK_NUMBER (Vx_nontext_pointer_shape
);
1474 nontext_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
),
1475 XINT (Vx_nontext_pointer_shape
));
1478 nontext_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
), XC_left_ptr
);
1479 x_check_errors (FRAME_W32_DISPLAY (f
), "bad nontext pointer cursor: %s");
1481 if (!EQ (Qnil
, Vx_hourglass_pointer_shape
))
1483 CHECK_NUMBER (Vx_hourglass_pointer_shape
);
1484 hourglass_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
),
1485 XINT (Vx_hourglass_pointer_shape
));
1488 hourglass_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
), XC_watch
);
1489 x_check_errors (FRAME_W32_DISPLAY (f
), "bad busy pointer cursor: %s");
1491 x_check_errors (FRAME_W32_DISPLAY (f
), "bad nontext pointer cursor: %s");
1492 if (!EQ (Qnil
, Vx_mode_pointer_shape
))
1494 CHECK_NUMBER (Vx_mode_pointer_shape
);
1495 mode_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
),
1496 XINT (Vx_mode_pointer_shape
));
1499 mode_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
), XC_xterm
);
1500 x_check_errors (FRAME_W32_DISPLAY (f
), "bad modeline pointer cursor: %s");
1502 if (!EQ (Qnil
, Vx_sensitive_text_pointer_shape
))
1504 CHECK_NUMBER (Vx_sensitive_text_pointer_shape
);
1506 = XCreateFontCursor (FRAME_W32_DISPLAY (f
),
1507 XINT (Vx_sensitive_text_pointer_shape
));
1510 hand_cursor
= XCreateFontCursor (FRAME_W32_DISPLAY (f
), XC_crosshair
);
1512 if (!NILP (Vx_window_horizontal_drag_shape
))
1514 CHECK_NUMBER (Vx_window_horizontal_drag_shape
);
1515 horizontal_drag_cursor
1516 = XCreateFontCursor (FRAME_W32_DISPLAY (f
),
1517 XINT (Vx_window_horizontal_drag_shape
));
1520 horizontal_drag_cursor
1521 = XCreateFontCursor (FRAME_W32_DISPLAY (f
), XC_sb_h_double_arrow
);
1523 /* Check and report errors with the above calls. */
1524 x_check_errors (FRAME_W32_DISPLAY (f
), "can't set cursor shape: %s");
1525 x_uncatch_errors (FRAME_W32_DISPLAY (f
), count
);
1528 XColor fore_color
, back_color
;
1530 fore_color
.pixel
= f
->output_data
.w32
->mouse_pixel
;
1531 back_color
.pixel
= mask_color
;
1532 XQueryColor (FRAME_W32_DISPLAY (f
),
1533 DefaultColormap (FRAME_W32_DISPLAY (f
),
1534 DefaultScreen (FRAME_W32_DISPLAY (f
))),
1536 XQueryColor (FRAME_W32_DISPLAY (f
),
1537 DefaultColormap (FRAME_W32_DISPLAY (f
),
1538 DefaultScreen (FRAME_W32_DISPLAY (f
))),
1540 XRecolorCursor (FRAME_W32_DISPLAY (f
), cursor
,
1541 &fore_color
, &back_color
);
1542 XRecolorCursor (FRAME_W32_DISPLAY (f
), nontext_cursor
,
1543 &fore_color
, &back_color
);
1544 XRecolorCursor (FRAME_W32_DISPLAY (f
), mode_cursor
,
1545 &fore_color
, &back_color
);
1546 XRecolorCursor (FRAME_W32_DISPLAY (f
), hand_cursor
,
1547 &fore_color
, &back_color
);
1548 XRecolorCursor (FRAME_W32_DISPLAY (f
), hourglass_cursor
,
1549 &fore_color
, &back_color
);
1552 if (FRAME_W32_WINDOW (f
) != 0)
1553 XDefineCursor (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
), cursor
);
1555 if (cursor
!= f
->output_data
.w32
->text_cursor
&& f
->output_data
.w32
->text_cursor
!= 0)
1556 XFreeCursor (FRAME_W32_DISPLAY (f
), f
->output_data
.w32
->text_cursor
);
1557 f
->output_data
.w32
->text_cursor
= cursor
;
1559 if (nontext_cursor
!= f
->output_data
.w32
->nontext_cursor
1560 && f
->output_data
.w32
->nontext_cursor
!= 0)
1561 XFreeCursor (FRAME_W32_DISPLAY (f
), f
->output_data
.w32
->nontext_cursor
);
1562 f
->output_data
.w32
->nontext_cursor
= nontext_cursor
;
1564 if (hourglass_cursor
!= f
->output_data
.w32
->hourglass_cursor
1565 && f
->output_data
.w32
->hourglass_cursor
!= 0)
1566 XFreeCursor (FRAME_W32_DISPLAY (f
), f
->output_data
.w32
->hourglass_cursor
);
1567 f
->output_data
.w32
->hourglass_cursor
= hourglass_cursor
;
1569 if (mode_cursor
!= f
->output_data
.w32
->modeline_cursor
1570 && f
->output_data
.w32
->modeline_cursor
!= 0)
1571 XFreeCursor (FRAME_W32_DISPLAY (f
), f
->output_data
.w32
->modeline_cursor
);
1572 f
->output_data
.w32
->modeline_cursor
= mode_cursor
;
1574 if (hand_cursor
!= f
->output_data
.w32
->hand_cursor
1575 && f
->output_data
.w32
->hand_cursor
!= 0)
1576 XFreeCursor (FRAME_W32_DISPLAY (f
), f
->output_data
.w32
->hand_cursor
);
1577 f
->output_data
.w32
->hand_cursor
= hand_cursor
;
1579 XFlush (FRAME_W32_DISPLAY (f
));
1582 update_face_from_frame_parameter (f
, Qmouse_color
, arg
);
1583 #endif /* MAC_TODO */
1587 x_set_cursor_color (f
, arg
, oldval
)
1589 Lisp_Object arg
, oldval
;
1591 unsigned long fore_pixel
, pixel
;
1593 if (!NILP (Vx_cursor_fore_pixel
))
1594 fore_pixel
= x_decode_color (f
, Vx_cursor_fore_pixel
,
1595 WHITE_PIX_DEFAULT (f
));
1597 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1599 pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1601 /* Make sure that the cursor color differs from the background color. */
1602 if (pixel
== FRAME_BACKGROUND_PIXEL (f
))
1604 pixel
= f
->output_data
.mac
->mouse_pixel
;
1605 if (pixel
== fore_pixel
)
1606 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1609 f
->output_data
.mac
->cursor_foreground_pixel
= fore_pixel
;
1610 f
->output_data
.mac
->cursor_pixel
= pixel
;
1612 if (FRAME_MAC_WINDOW (f
) != 0)
1615 /* Update frame's cursor_gc. */
1616 f
->output_data
.mac
->cursor_gc
->foreground
= fore_pixel
;
1617 f
->output_data
.mac
->cursor_gc
->background
= pixel
;
1621 if (FRAME_VISIBLE_P (f
))
1623 x_update_cursor (f
, 0);
1624 x_update_cursor (f
, 1);
1628 update_face_from_frame_parameter (f
, Qcursor_color
, arg
);
1631 /* Set the border-color of frame F to pixel value PIX.
1632 Note that this does not fully take effect if done before
1636 x_set_border_pixel (f
, pix
)
1641 f
->output_data
.mac
->border_pixel
= pix
;
1643 if (FRAME_MAC_WINDOW (f
) != 0 && f
->border_width
> 0)
1645 if (FRAME_VISIBLE_P (f
))
1650 /* Set the border-color of frame F to value described by ARG.
1651 ARG can be a string naming a color.
1652 The border-color is used for the border that is drawn by the server.
1653 Note that this does not fully take effect if done before
1654 F has a window; it must be redone when the window is created. */
1657 x_set_border_color (f
, arg
, oldval
)
1659 Lisp_Object arg
, oldval
;
1664 pix
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1665 x_set_border_pixel (f
, pix
);
1666 update_face_from_frame_parameter (f
, Qborder_color
, arg
);
1671 x_set_cursor_type (f
, arg
, oldval
)
1673 Lisp_Object arg
, oldval
;
1675 set_frame_cursor_types (f
, arg
);
1677 /* Make sure the cursor gets redrawn. */
1678 cursor_type_changed
= 1;
1681 #if 0 /* MAC_TODO: really no icon for Mac */
1683 x_set_icon_type (f
, arg
, oldval
)
1685 Lisp_Object arg
, oldval
;
1689 if (NILP (arg
) && NILP (oldval
))
1692 if (STRINGP (arg
) && STRINGP (oldval
)
1693 && EQ (Fstring_equal (oldval
, arg
), Qt
))
1696 if (SYMBOLP (arg
) && SYMBOLP (oldval
) && EQ (arg
, oldval
))
1701 result
= x_bitmap_icon (f
, arg
);
1705 error ("No icon window available");
1710 #endif /* MAC_TODO */
1713 x_set_icon_name (f
, arg
, oldval
)
1715 Lisp_Object arg
, oldval
;
1721 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1724 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1729 #if 0 /* MAC_TODO */
1730 if (f
->output_data
.w32
->icon_bitmap
!= 0)
1735 result
= x_text_icon (f
,
1736 (char *) SDATA ((!NILP (f
->icon_name
)
1745 error ("No icon window available");
1748 /* If the window was unmapped (and its icon was mapped),
1749 the new icon is not mapped, so map the window in its stead. */
1750 if (FRAME_VISIBLE_P (f
))
1752 #ifdef USE_X_TOOLKIT
1753 XtPopup (f
->output_data
.w32
->widget
, XtGrabNone
);
1755 XMapWindow (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
));
1758 XFlush (FRAME_W32_DISPLAY (f
));
1760 #endif /* MAC_TODO */
1765 x_set_menu_bar_lines (f
, value
, oldval
)
1767 Lisp_Object value
, oldval
;
1770 int olines
= FRAME_MENU_BAR_LINES (f
);
1772 /* Right now, menu bars don't work properly in minibuf-only frames;
1773 most of the commands try to apply themselves to the minibuffer
1774 frame itself, and get an error because you can't switch buffers
1775 in or split the minibuffer window. */
1776 if (FRAME_MINIBUF_ONLY_P (f
))
1779 if (INTEGERP (value
))
1780 nlines
= XINT (value
);
1784 FRAME_MENU_BAR_LINES (f
) = 0;
1786 FRAME_EXTERNAL_MENU_BAR (f
) = 1;
1789 if (FRAME_EXTERNAL_MENU_BAR (f
) == 1)
1790 free_frame_menubar (f
);
1791 FRAME_EXTERNAL_MENU_BAR (f
) = 0;
1793 /* Adjust the frame size so that the client (text) dimensions
1794 remain the same. This depends on FRAME_EXTERNAL_MENU_BAR being
1796 x_set_window_size (f
, 0, FRAME_COLS (f
), FRAME_LINES (f
));
1797 do_pending_window_change (0);
1803 /* Set the number of lines used for the tool bar of frame F to VALUE.
1804 VALUE not an integer, or < 0 means set the lines to zero. OLDVAL
1805 is the old number of tool bar lines. This function changes the
1806 height of all windows on frame F to match the new tool bar height.
1807 The frame's height doesn't change. */
1810 x_set_tool_bar_lines (f
, value
, oldval
)
1812 Lisp_Object value
, oldval
;
1814 int delta
, nlines
, root_height
;
1815 Lisp_Object root_window
;
1817 /* Treat tool bars like menu bars. */
1818 if (FRAME_MINIBUF_ONLY_P (f
))
1821 /* Use VALUE only if an integer >= 0. */
1822 if (INTEGERP (value
) && XINT (value
) >= 0)
1823 nlines
= XFASTINT (value
);
1827 /* Make sure we redisplay all windows in this frame. */
1828 ++windows_or_buffers_changed
;
1830 delta
= nlines
- FRAME_TOOL_BAR_LINES (f
);
1832 /* Don't resize the tool-bar to more than we have room for. */
1833 root_window
= FRAME_ROOT_WINDOW (f
);
1834 root_height
= WINDOW_TOTAL_LINES (XWINDOW (root_window
));
1835 if (root_height
- delta
< 1)
1837 delta
= root_height
- 1;
1838 nlines
= FRAME_TOOL_BAR_LINES (f
) + delta
;
1841 FRAME_TOOL_BAR_LINES (f
) = nlines
;
1842 change_window_heights (root_window
, delta
);
1845 /* We also have to make sure that the internal border at the top of
1846 the frame, below the menu bar or tool bar, is redrawn when the
1847 tool bar disappears. This is so because the internal border is
1848 below the tool bar if one is displayed, but is below the menu bar
1849 if there isn't a tool bar. The tool bar draws into the area
1850 below the menu bar. */
1851 if (FRAME_MAC_WINDOW (f
) && FRAME_TOOL_BAR_LINES (f
) == 0)
1855 clear_current_matrices (f
);
1856 updating_frame
= NULL
;
1859 /* If the tool bar gets smaller, the internal border below it
1860 has to be cleared. It was formerly part of the display
1861 of the larger tool bar, and updating windows won't clear it. */
1864 int height
= FRAME_INTERNAL_BORDER_WIDTH (f
);
1865 int width
= FRAME_PIXEL_WIDTH (f
);
1866 int y
= nlines
* FRAME_LINE_HEIGHT (f
);
1869 XClearArea (FRAME_MAC_DISPLAY (f
), FRAME_MAC_WINDOW (f
),
1870 0, y
, width
, height
, 0);
1873 if (WINDOWP (f
->tool_bar_window
))
1874 clear_glyph_matrix (XWINDOW (f
->tool_bar_window
)->current_matrix
);
1879 /* Change the name of frame F to NAME. If NAME is nil, set F's name to
1882 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1883 name; if NAME is a string, set F's name to NAME and set
1884 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1886 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1887 suggesting a new name, which lisp code should override; if
1888 F->explicit_name is set, ignore the new name; otherwise, set it. */
1891 x_set_name (f
, name
, explicit)
1896 /* Make sure that requests from lisp code override requests from
1897 Emacs redisplay code. */
1900 /* If we're switching from explicit to implicit, we had better
1901 update the mode lines and thereby update the title. */
1902 if (f
->explicit_name
&& NILP (name
))
1903 update_mode_lines
= 1;
1905 f
->explicit_name
= ! NILP (name
);
1907 else if (f
->explicit_name
)
1910 /* If NAME is nil, set the name to the w32_id_name. */
1913 /* Check for no change needed in this very common case
1914 before we do any consing. */
1915 if (!strcmp (FRAME_MAC_DISPLAY_INFO (f
)->mac_id_name
,
1918 name
= build_string (FRAME_MAC_DISPLAY_INFO (f
)->mac_id_name
);
1921 CHECK_STRING (name
);
1923 /* Don't change the name if it's already NAME. */
1924 if (! NILP (Fstring_equal (name
, f
->name
)))
1929 /* For setting the frame title, the title parameter should override
1930 the name parameter. */
1931 if (! NILP (f
->title
))
1934 if (FRAME_MAC_WINDOW (f
))
1936 if (STRING_MULTIBYTE (name
))
1937 #if 0 /* MAC_TODO: encoding title string */
1938 name
= ENCODE_SYSTEM (name
);
1947 if (strlen (SDATA (name
)) < 255)
1949 strcpy (windowTitle
, SDATA (name
));
1950 c2pstr (windowTitle
);
1951 SetWTitle (FRAME_MAC_WINDOW (f
), windowTitle
);
1959 /* This function should be called when the user's lisp code has
1960 specified a name for the frame; the name will override any set by the
1963 x_explicitly_set_name (f
, arg
, oldval
)
1965 Lisp_Object arg
, oldval
;
1967 x_set_name (f
, arg
, 1);
1970 /* This function should be called by Emacs redisplay code to set the
1971 name; names set this way will never override names set by the user's
1974 x_implicitly_set_name (f
, arg
, oldval
)
1976 Lisp_Object arg
, oldval
;
1978 x_set_name (f
, arg
, 0);
1981 /* Change the title of frame F to NAME.
1982 If NAME is nil, use the frame name as the title.
1984 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1985 name; if NAME is a string, set F's name to NAME and set
1986 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1988 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1989 suggesting a new name, which lisp code should override; if
1990 F->explicit_name is set, ignore the new name; otherwise, set it. */
1993 x_set_title (f
, name
, old_name
)
1995 Lisp_Object name
, old_name
;
1997 /* Don't change the title if it's already NAME. */
1998 if (EQ (name
, f
->title
))
2001 update_mode_lines
= 1;
2008 if (FRAME_MAC_WINDOW (f
))
2010 if (STRING_MULTIBYTE (name
))
2011 #if 0 /* MAC_TODO: encoding title string */
2012 name
= ENCODE_SYSTEM (name
);
2021 if (strlen (SDATA (name
)) < 255)
2023 strcpy (windowTitle
, SDATA (name
));
2024 c2pstr (windowTitle
);
2025 SetWTitle (FRAME_MAC_WINDOW (f
), windowTitle
);
2034 x_set_scroll_bar_default_width (f
)
2037 /* Imitate X without X Toolkit */
2039 int wid
= FRAME_COLUMN_WIDTH (f
);
2042 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 16; /* Aqua scroll bars. */
2043 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) +
2045 #else /* not MAC_OSX */
2046 /* Make the actual width at least 14 pixels and a multiple of a
2048 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (14 + wid
- 1) / wid
;
2050 /* Use all of that space (aside from required margins) for the
2052 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 0;
2053 #endif /* not MAC_OSX */
2057 /* Subroutines of creating a frame. */
2060 x_get_string_resource (rdb
, name
, class)
2064 /* MAC_TODO: implement resource strings */
2068 /* Return the value of parameter PARAM.
2070 First search ALIST, then Vdefault_frame_alist, then the X defaults
2071 database, using ATTRIBUTE as the attribute name and CLASS as its class.
2073 Convert the resource to the type specified by desired_type.
2075 If no default is specified, return Qunbound. If you call
2076 mac_get_arg, make sure you deal with Qunbound in a reasonable way,
2077 and don't let it get stored in any Lisp-visible variables! */
2080 mac_get_arg (alist
, param
, attribute
, class, type
)
2081 Lisp_Object alist
, param
;
2084 enum resource_types type
;
2086 return x_get_arg (check_x_display_info (Qnil
),
2087 alist
, param
, attribute
, class, type
);
2091 /* XParseGeometry copied from w32xfns.c */
2094 * XParseGeometry parses strings of the form
2095 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
2096 * width, height, xoffset, and yoffset are unsigned integers.
2097 * Example: "=80x24+300-49"
2098 * The equal sign is optional.
2099 * It returns a bitmask that indicates which of the four values
2100 * were actually found in the string. For each value found,
2101 * the corresponding argument is updated; for each value
2102 * not found, the corresponding argument is left unchanged.
2106 read_integer (string
, NextString
)
2107 register char *string
;
2110 register int Result
= 0;
2115 else if (*string
== '-')
2120 for (; (*string
>= '0') && (*string
<= '9'); string
++)
2122 Result
= (Result
* 10) + (*string
- '0');
2124 *NextString
= string
;
2132 XParseGeometry (string
, x
, y
, width
, height
)
2135 unsigned int *width
, *height
; /* RETURN */
2138 register char *strind
;
2139 unsigned int tempWidth
, tempHeight
;
2141 char *nextCharacter
;
2143 if ((string
== NULL
) || (*string
== '\0')) return (mask
);
2145 string
++; /* ignore possible '=' at beg of geometry spec */
2147 strind
= (char *)string
;
2148 if (*strind
!= '+' && *strind
!= '-' && *strind
!= 'x')
2150 tempWidth
= read_integer (strind
, &nextCharacter
);
2151 if (strind
== nextCharacter
)
2153 strind
= nextCharacter
;
2157 if (*strind
== 'x' || *strind
== 'X')
2160 tempHeight
= read_integer (strind
, &nextCharacter
);
2161 if (strind
== nextCharacter
)
2163 strind
= nextCharacter
;
2164 mask
|= HeightValue
;
2167 if ((*strind
== '+') || (*strind
== '-'))
2172 tempX
= -read_integer (strind
, &nextCharacter
);
2173 if (strind
== nextCharacter
)
2175 strind
= nextCharacter
;
2182 tempX
= read_integer (strind
, &nextCharacter
);
2183 if (strind
== nextCharacter
)
2185 strind
= nextCharacter
;
2188 if ((*strind
== '+') || (*strind
== '-'))
2193 tempY
= -read_integer (strind
, &nextCharacter
);
2194 if (strind
== nextCharacter
)
2196 strind
= nextCharacter
;
2203 tempY
= read_integer (strind
, &nextCharacter
);
2204 if (strind
== nextCharacter
)
2206 strind
= nextCharacter
;
2212 /* If strind isn't at the end of the string the it's an invalid
2213 geometry specification. */
2215 if (*strind
!= '\0') return (0);
2221 if (mask
& WidthValue
)
2223 if (mask
& HeightValue
)
2224 *height
= tempHeight
;
2229 #if 0 /* MAC_TODO */
2230 /* Create and set up the Mac window for frame F. */
2233 mac_window (f
, window_prompting
, minibuffer_only
)
2235 long window_prompting
;
2236 int minibuffer_only
;
2242 /* Use the resource name as the top-level window name
2243 for looking up resources. Make a non-Lisp copy
2244 for the window manager, so GC relocation won't bother it.
2246 Elsewhere we specify the window name for the window manager. */
2249 char *str
= (char *) SDATA (Vx_resource_name
);
2250 f
->namebuf
= (char *) xmalloc (strlen (str
) + 1);
2251 strcpy (f
->namebuf
, str
);
2254 SetRect (&r
, f
->left_pos
, f
->top_pos
,
2255 f
->left_pos
+ FRAME_PIXEL_WIDTH (f
),
2256 f
->top_pos
+ FRAME_PIXEL_HEIGHT (f
));
2257 FRAME_MAC_WINDOW (f
)
2258 = NewCWindow (NULL
, &r
, "\p", 1, zoomDocProc
, (WindowPtr
) -1, 1, (long) f
->output_data
.mac
);
2260 validate_x_resource_name ();
2262 /* x_set_name normally ignores requests to set the name if the
2263 requested name is the same as the current name. This is the one
2264 place where that assumption isn't correct; f->name is set, but
2265 the server hasn't been told. */
2268 int explicit = f
->explicit_name
;
2270 f
->explicit_name
= 0;
2273 x_set_name (f
, name
, explicit);
2276 ShowWindow (FRAME_MAC_WINDOW (f
));
2280 if (!minibuffer_only
&& FRAME_EXTERNAL_MENU_BAR (f
))
2281 initialize_frame_menubar (f
);
2283 if (FRAME_MAC_WINDOW (f
) == 0)
2284 error ("Unable to create window");
2286 #endif /* MAC_TODO */
2288 /* Handle the icon stuff for this window. Perhaps later we might
2289 want an x_set_icon_position which can be called interactively as
2297 Lisp_Object icon_x
, icon_y
;
2299 /* Set the position of the icon. Note that Windows 95 groups all
2300 icons in the tray. */
2301 icon_x
= mac_get_arg (parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2302 icon_y
= mac_get_arg (parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2303 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2305 CHECK_NUMBER (icon_x
);
2306 CHECK_NUMBER (icon_y
);
2308 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2309 error ("Both left and top icon corners of icon must be specified");
2313 if (! EQ (icon_x
, Qunbound
))
2314 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
2317 /* Start up iconic or window? */
2318 x_wm_set_window_state
2319 (f
, (EQ (w32_get_arg (parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
), Qicon
)
2323 x_text_icon (f
, (char *) SDATA ((!NILP (f
->icon_name
)
2336 XGCValues gc_values
;
2340 /* Create the GCs of this frame.
2341 Note that many default values are used. */
2344 gc_values
.font
= FRAME_FONT (f
);
2345 gc_values
.foreground
= FRAME_FOREGROUND_PIXEL (f
);
2346 gc_values
.background
= FRAME_BACKGROUND_PIXEL (f
);
2347 f
->output_data
.mac
->normal_gc
= XCreateGC (FRAME_MAC_DISPLAY (f
),
2348 FRAME_MAC_WINDOW (f
),
2349 GCFont
| GCForeground
| GCBackground
,
2352 /* Reverse video style. */
2353 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2354 gc_values
.background
= FRAME_FOREGROUND_PIXEL (f
);
2355 f
->output_data
.mac
->reverse_gc
= XCreateGC (FRAME_MAC_DISPLAY (f
),
2356 FRAME_MAC_WINDOW (f
),
2357 GCFont
| GCForeground
| GCBackground
,
2360 /* Cursor has cursor-color background, background-color foreground. */
2361 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2362 gc_values
.background
= f
->output_data
.mac
->cursor_pixel
;
2363 f
->output_data
.mac
->cursor_gc
= XCreateGC (FRAME_MAC_DISPLAY (f
),
2364 FRAME_MAC_WINDOW (f
),
2365 GCFont
| GCForeground
| GCBackground
,
2369 f
->output_data
.mac
->white_relief
.gc
= 0;
2370 f
->output_data
.mac
->black_relief
.gc
= 0;
2373 /* Create the gray border tile used when the pointer is not in
2374 the frame. Since this depends on the frame's pixel values,
2375 this must be done on a per-frame basis. */
2376 f
->output_data
.x
->border_tile
2377 = (XCreatePixmapFromBitmapData
2378 (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
2379 gray_bits
, gray_width
, gray_height
,
2380 f
->output_data
.x
->foreground_pixel
,
2381 f
->output_data
.x
->background_pixel
,
2382 DefaultDepth (FRAME_X_DISPLAY (f
), FRAME_X_SCREEN_NUMBER (f
))));
2389 /* Free what was was allocated in x_make_gc. */
2395 Display
*dpy
= FRAME_MAC_DISPLAY (f
);
2399 if (f
->output_data
.mac
->normal_gc
)
2401 XFreeGC (dpy
, f
->output_data
.mac
->normal_gc
);
2402 f
->output_data
.mac
->normal_gc
= 0;
2405 if (f
->output_data
.mac
->reverse_gc
)
2407 XFreeGC (dpy
, f
->output_data
.mac
->reverse_gc
);
2408 f
->output_data
.mac
->reverse_gc
= 0;
2411 if (f
->output_data
.mac
->cursor_gc
)
2413 XFreeGC (dpy
, f
->output_data
.mac
->cursor_gc
);
2414 f
->output_data
.mac
->cursor_gc
= 0;
2418 if (f
->output_data
.mac
->border_tile
)
2420 XFreePixmap (dpy
, f
->output_data
.mac
->border_tile
);
2421 f
->output_data
.mac
->border_tile
= 0;
2425 if (f
->output_data
.mac
->white_relief
.gc
)
2427 XFreeGC (dpy
, f
->output_data
.mac
->white_relief
.gc
);
2428 f
->output_data
.mac
->white_relief
.gc
= 0;
2431 if (f
->output_data
.mac
->black_relief
.gc
)
2433 XFreeGC (dpy
, f
->output_data
.mac
->black_relief
.gc
);
2434 f
->output_data
.mac
->black_relief
.gc
= 0;
2441 /* Handler for signals raised during x_create_frame and
2442 x_create_top_frame. FRAME is the frame which is partially
2446 unwind_create_frame (frame
)
2449 struct frame
*f
= XFRAME (frame
);
2451 /* If frame is ``official'', nothing to do. */
2452 if (!CONSP (Vframe_list
) || !EQ (XCAR (Vframe_list
), frame
))
2455 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2458 x_free_frame_resources (f
);
2460 /* Check that reference counts are indeed correct. */
2461 xassert (dpyinfo
->reference_count
== dpyinfo_refcount
);
2462 xassert (dpyinfo
->image_cache
->refcount
== image_cache_refcount
);
2470 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
2472 doc
: /* Make a new window, which is called a \"frame\" in Emacs terms.
2473 Returns an Emacs frame object.
2474 ALIST is an alist of frame parameters.
2475 If the parameters specify that the frame should not have a minibuffer,
2476 and do not specify a specific minibuffer window to use,
2477 then `default-minibuffer-frame' must be a frame whose minibuffer can
2478 be shared by the new frame.
2480 This function is an internal primitive--use `make-frame' instead. */)
2485 Lisp_Object frame
, tem
;
2487 int minibuffer_only
= 0;
2488 long window_prompting
= 0;
2490 int count
= SPECPDL_INDEX ();
2491 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2492 Lisp_Object display
;
2493 struct mac_display_info
*dpyinfo
= NULL
;
2496 char x_frame_name
[10];
2497 static int x_frame_count
= 2; /* begins at 2 because terminal frame is F1 */
2501 /* Use this general default value to start with
2502 until we know if this frame has a specified name. */
2503 Vx_resource_name
= Vinvocation_name
;
2505 display
= mac_get_arg (parms
, Qdisplay
, 0, 0, RES_TYPE_STRING
);
2506 if (EQ (display
, Qunbound
))
2508 dpyinfo
= check_x_display_info (display
);
2510 kb
= dpyinfo
->kboard
;
2512 kb
= &the_only_kboard
;
2515 name
= mac_get_arg (parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
2517 && ! EQ (name
, Qunbound
)
2519 error ("Invalid frame name--not a string or nil");
2522 Vx_resource_name
= name
;
2524 /* See if parent window is specified. */
2525 parent
= mac_get_arg (parms
, Qparent_id
, NULL
, NULL
, RES_TYPE_NUMBER
);
2526 if (EQ (parent
, Qunbound
))
2528 if (! NILP (parent
))
2529 CHECK_NUMBER (parent
);
2531 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
2532 /* No need to protect DISPLAY because that's not used after passing
2533 it to make_frame_without_minibuffer. */
2535 GCPRO4 (parms
, parent
, name
, frame
);
2536 tem
= mac_get_arg (parms
, Qminibuffer
, "minibuffer", "Minibuffer",
2538 if (EQ (tem
, Qnone
) || NILP (tem
))
2539 f
= make_frame_without_minibuffer (Qnil
, kb
, display
);
2540 else if (EQ (tem
, Qonly
))
2542 f
= make_minibuffer_frame ();
2543 minibuffer_only
= 1;
2545 else if (WINDOWP (tem
))
2546 f
= make_frame_without_minibuffer (tem
, kb
, display
);
2550 if (EQ (name
, Qunbound
) || NILP (name
))
2552 sprintf (x_frame_name
, "F%d", x_frame_count
++);
2553 f
->name
= build_string (x_frame_name
);
2554 f
->explicit_name
= 0;
2559 f
->explicit_name
= 1;
2562 XSETFRAME (frame
, f
);
2564 /* Note that X Windows does support scroll bars. */
2565 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
2567 f
->output_method
= output_mac
;
2568 f
->output_data
.mac
= (struct mac_output
*) xmalloc (sizeof (struct mac_output
));
2569 bzero (f
->output_data
.mac
, sizeof (struct mac_output
));
2570 FRAME_FONTSET (f
) = -1;
2571 record_unwind_protect (unwind_create_frame
, frame
);
2574 = mac_get_arg (parms
, Qicon_name
, "iconName", "Title", RES_TYPE_STRING
);
2575 if (! STRINGP (f
->icon_name
))
2576 f
->icon_name
= Qnil
;
2578 /* FRAME_W32_DISPLAY_INFO (f) = dpyinfo; */
2580 FRAME_KBOARD (f
) = kb
;
2583 /* Specify the parent under which to make this window. */
2587 f
->output_data
.mac
->parent_desc
= (Window
) XFASTINT (parent
);
2588 f
->output_data
.mac
->explicit_parent
= 1;
2592 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
2593 f
->output_data
.mac
->explicit_parent
= 0;
2596 /* Set the name; the functions to which we pass f expect the name to
2598 if (EQ (name
, Qunbound
) || NILP (name
))
2600 f
->name
= build_string (dpyinfo
->mac_id_name
);
2601 f
->explicit_name
= 0;
2606 f
->explicit_name
= 1;
2607 /* use the frame's title when getting resources for this frame. */
2608 specbind (Qx_resource_name
, name
);
2611 /* Extract the window parameters from the supplied values
2612 that are needed to determine window geometry. */
2616 font
= mac_get_arg (parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
2619 /* First, try whatever font the caller has specified. */
2622 tem
= Fquery_fontset (font
, Qnil
);
2624 font
= x_new_fontset (f
, SDATA (tem
));
2626 font
= x_new_font (f
, SDATA (font
));
2629 /* Try out a font which we hope has bold and italic variations. */
2630 if (! STRINGP (font
))
2631 font
= x_new_font (f
, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
2632 /* If those didn't work, look for something which will at least work. */
2633 if (! STRINGP (font
))
2634 font
= x_new_font (f
, "-*-monaco-*-12-*-mac-roman");
2635 if (! STRINGP (font
))
2636 font
= x_new_font (f
, "-*-courier-*-10-*-mac-roman");
2637 if (! STRINGP (font
))
2638 error ("Cannot find any usable font");
2641 x_default_parameter (f
, parms
, Qfont
, font
,
2642 "font", "Font", RES_TYPE_STRING
);
2645 x_default_parameter (f
, parms
, Qborder_width
, make_number (0),
2646 "borderwidth", "BorderWidth", RES_TYPE_NUMBER
);
2647 /* This defaults to 2 in order to match xterm. We recognize either
2648 internalBorderWidth or internalBorder (which is what xterm calls
2650 if (NILP (Fassq (Qinternal_border_width
, parms
)))
2654 value
= mac_get_arg (parms
, Qinternal_border_width
,
2655 "internalBorder", "InternalBorder", RES_TYPE_NUMBER
);
2656 if (! EQ (value
, Qunbound
))
2657 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
2660 /* Default internalBorderWidth to 0 on Windows to match other programs. */
2661 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (0),
2662 "internalBorderWidth", "InternalBorder", RES_TYPE_NUMBER
);
2663 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qright
,
2664 "verticalScrollBars", "ScrollBars", RES_TYPE_SYMBOL
);
2666 /* Also do the stuff which must be set before the window exists. */
2667 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
2668 "foreground", "Foreground", RES_TYPE_STRING
);
2669 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
2670 "background", "Background", RES_TYPE_STRING
);
2671 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
2672 "pointerColor", "Foreground", RES_TYPE_STRING
);
2673 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
2674 "cursorColor", "Foreground", RES_TYPE_STRING
);
2675 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
2676 "borderColor", "BorderColor", RES_TYPE_STRING
);
2677 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
2678 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
2679 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
2680 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
2681 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
2682 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
2683 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
2684 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
2687 /* Init faces before x_default_parameter is called for scroll-bar
2688 parameters because that function calls x_set_scroll_bar_width,
2689 which calls change_frame_size, which calls Fset_window_buffer,
2690 which runs hooks, which call Fvertical_motion. At the end, we
2691 end up in init_iterator with a null face cache, which should not
2693 init_frame_faces (f
);
2695 x_default_parameter (f
, parms
, Qmenu_bar_lines
, make_number (1),
2696 "menuBar", "MenuBar", RES_TYPE_NUMBER
);
2697 x_default_parameter (f
, parms
, Qtool_bar_lines
, make_number (1),
2698 "toolBar", "ToolBar", RES_TYPE_NUMBER
);
2699 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
2700 "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL
);
2701 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
2702 "title", "Title", RES_TYPE_STRING
);
2704 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
2706 #if TARGET_API_MAC_CARBON
2707 f
->output_data
.mac
->text_cursor
= kThemeIBeamCursor
;
2708 f
->output_data
.mac
->nontext_cursor
= kThemeArrowCursor
;
2709 f
->output_data
.mac
->modeline_cursor
= kThemeArrowCursor
;
2710 f
->output_data
.mac
->hand_cursor
= kThemePointingHandCursor
;
2711 f
->output_data
.mac
->hourglass_cursor
= kThemeWatchCursor
;
2712 f
->output_data
.mac
->horizontal_drag_cursor
= kThemeResizeLeftRightCursor
;
2714 f
->output_data
.mac
->text_cursor
= GetCursor (iBeamCursor
);
2715 f
->output_data
.mac
->nontext_cursor
= &arrow_cursor
;
2716 f
->output_data
.mac
->modeline_cursor
= &arrow_cursor
;
2717 f
->output_data
.mac
->hand_cursor
= &arrow_cursor
;
2718 f
->output_data
.mac
->hourglass_cursor
= GetCursor (watchCursor
);
2719 f
->output_data
.mac
->horizontal_drag_cursor
= &arrow_cursor
;
2722 /* Compute the size of the window. */
2723 window_prompting
= x_figure_window_size (f
, parms
, 1);
2725 tem
= mac_get_arg (parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
2726 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
2728 /* mac_window (f, window_prompting, minibuffer_only); */
2734 /* Now consider the frame official. */
2735 FRAME_MAC_DISPLAY_INFO (f
)->reference_count
++;
2736 Vframe_list
= Fcons (frame
, Vframe_list
);
2738 /* We need to do this after creating the window, so that the
2739 icon-creation functions can say whose icon they're describing. */
2740 x_default_parameter (f
, parms
, Qicon_type
, Qnil
,
2741 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
2743 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
2744 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
2745 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
2746 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
2747 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
2748 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
2749 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
2750 "scrollBarWidth", "ScrollBarWidth",
2753 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
2754 Change will not be effected unless different from the current
2756 width
= FRAME_COLS (f
);
2757 height
= FRAME_LINES (f
);
2759 SET_FRAME_COLS (f
, 0);
2760 FRAME_LINES (f
) = 0;
2761 change_frame_size (f
, height
, width
, 1, 0, 0);
2763 #if 0 /* MAC_TODO: when we have window manager hints */
2764 /* Tell the server what size and position, etc, we want, and how
2765 badly we want them. This should be done after we have the menu
2766 bar so that its size can be taken into account. */
2768 x_wm_set_size_hint (f
, window_prompting
, 0);
2772 /* Make the window appear on the frame and enable display, unless
2773 the caller says not to. However, with explicit parent, Emacs
2774 cannot control visibility, so don't try. */
2775 if (! f
->output_data
.mac
->explicit_parent
)
2777 Lisp_Object visibility
;
2779 visibility
= mac_get_arg (parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
);
2780 if (EQ (visibility
, Qunbound
))
2783 #if 0 /* MAC_TODO: really no iconify on Mac */
2784 if (EQ (visibility
, Qicon
))
2785 x_iconify_frame (f
);
2788 if (! NILP (visibility
))
2789 x_make_frame_visible (f
);
2791 /* Must have been Qnil. */
2796 /* Make sure windows on this frame appear in calls to next-window
2797 and similar functions. */
2798 Vwindow_list
= Qnil
;
2800 return unbind_to (count
, frame
);
2803 /* FRAME is used only to get a handle on the X display. We don't pass the
2804 display info directly because we're called from frame.c, which doesn't
2805 know about that structure. */
2807 x_get_focus_frame (frame
)
2808 struct frame
*frame
;
2810 struct mac_display_info
*dpyinfo
= FRAME_MAC_DISPLAY_INFO (frame
);
2812 if (! dpyinfo
->x_focus_frame
)
2815 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
2819 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
2820 doc
: /* Internal function called by `color-defined-p', which see. */)
2822 Lisp_Object color
, frame
;
2825 FRAME_PTR f
= check_x_frame (frame
);
2827 CHECK_STRING (color
);
2829 if (mac_defined_color (f
, SDATA (color
), &foo
, 0))
2835 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
2836 doc
: /* Internal function called by `color-values', which see. */)
2838 Lisp_Object color
, frame
;
2841 FRAME_PTR f
= check_x_frame (frame
);
2843 CHECK_STRING (color
);
2845 if (mac_defined_color (f
, SDATA (color
), &foo
, 0))
2849 rgb
[0] = make_number (foo
.red
);
2850 rgb
[1] = make_number (foo
.green
);
2851 rgb
[2] = make_number (foo
.blue
);
2852 return Flist (3, rgb
);
2858 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
2859 doc
: /* Internal function called by `display-color-p', which see. */)
2861 Lisp_Object display
;
2863 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2865 if (!dpyinfo
->color_p
)
2871 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
2873 doc
: /* Return t if the X display supports shades of gray.
2874 Note that color displays do support shades of gray.
2875 The optional argument DISPLAY specifies which display to ask about.
2876 DISPLAY should be either a frame or a display name (a string).
2877 If omitted or nil, that stands for the selected frame's display. */)
2879 Lisp_Object display
;
2881 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2883 if (dpyinfo
->n_planes
<= 1)
2889 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
2891 doc
: /* Returns the width in pixels of the X display DISPLAY.
2892 The optional argument DISPLAY specifies which display to ask about.
2893 DISPLAY should be either a frame or a display name (a string).
2894 If omitted or nil, that stands for the selected frame's display. */)
2896 Lisp_Object display
;
2898 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2900 return make_number (dpyinfo
->width
);
2903 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
2904 Sx_display_pixel_height
, 0, 1, 0,
2905 doc
: /* Returns the height in pixels of the X display DISPLAY.
2906 The optional argument DISPLAY specifies which display to ask about.
2907 DISPLAY should be either a frame or a display name (a string).
2908 If omitted or nil, that stands for the selected frame's display. */)
2910 Lisp_Object display
;
2912 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2914 return make_number (dpyinfo
->height
);
2917 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
2919 doc
: /* Returns the number of bitplanes of the display DISPLAY.
2920 The optional argument DISPLAY specifies which display to ask about.
2921 DISPLAY should be either a frame or a display name (a string).
2922 If omitted or nil, that stands for the selected frame's display. */)
2924 Lisp_Object display
;
2926 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2928 return make_number (dpyinfo
->n_planes
);
2931 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
2933 doc
: /* Returns the number of color cells of the display DISPLAY.
2934 The optional argument DISPLAY specifies which display to ask about.
2935 DISPLAY should be either a frame or a display name (a string).
2936 If omitted or nil, that stands for the selected frame's display. */)
2938 Lisp_Object display
;
2940 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2942 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2943 return make_number (1 << min (dpyinfo
->n_planes
, 24));
2946 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
2947 Sx_server_max_request_size
,
2949 doc
: /* Returns the maximum request size of the server of display DISPLAY.
2950 The optional argument DISPLAY specifies which display to ask about.
2951 DISPLAY should be either a frame or a display name (a string).
2952 If omitted or nil, that stands for the selected frame's display. */)
2954 Lisp_Object display
;
2956 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2958 return make_number (1);
2961 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
2962 doc
: /* Returns the vendor ID string of the Mac OS system (Apple).
2963 The optional argument DISPLAY specifies which display to ask about.
2964 DISPLAY should be either a frame or a display name (a string).
2965 If omitted or nil, that stands for the selected frame's display. */)
2967 Lisp_Object display
;
2969 return build_string ("Apple Computers");
2972 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
2973 doc
: /* Returns the version numbers of the server of display DISPLAY.
2974 The value is a list of three integers: the major and minor
2975 version numbers, and the vendor-specific release
2976 number. See also the function `x-server-vendor'.
2978 The optional argument DISPLAY specifies which display to ask about.
2979 DISPLAY should be either a frame or a display name (a string).
2980 If omitted or nil, that stands for the selected frame's display. */)
2982 Lisp_Object display
;
2984 int mac_major_version
, mac_minor_version
;
2987 if (Gestalt (gestaltSystemVersion
, &response
) != noErr
)
2988 error ("Cannot get Mac OS version");
2990 mac_major_version
= (response
>> 8) & 0xf;
2991 mac_minor_version
= (response
>> 4) & 0xf;
2993 return Fcons (make_number (mac_major_version
),
2994 Fcons (make_number (mac_minor_version
), Qnil
));
2997 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
2998 doc
: /* Return the number of screens on the server of display DISPLAY.
2999 The optional argument DISPLAY specifies which display to ask about.
3000 DISPLAY should be either a frame or a display name (a string).
3001 If omitted or nil, that stands for the selected frame's display. */)
3003 Lisp_Object display
;
3005 return make_number (1);
3008 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
3009 doc
: /* Return the height in millimeters of the X display DISPLAY.
3010 The optional argument DISPLAY specifies which display to ask about.
3011 DISPLAY should be either a frame or a display name (a string).
3012 If omitted or nil, that stands for the selected frame's display. */)
3014 Lisp_Object display
;
3016 /* MAC_TODO: this is an approximation, and only of the main display */
3018 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
3020 return make_number ((int) (dpyinfo
->height
* 25.4 / dpyinfo
->resy
));
3023 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
3024 doc
: /* Return the width in millimeters of the X display DISPLAY.
3025 The optional argument DISPLAY specifies which display to ask about.
3026 DISPLAY should be either a frame or a display name (a string).
3027 If omitted or nil, that stands for the selected frame's display. */)
3029 Lisp_Object display
;
3031 /* MAC_TODO: this is an approximation, and only of the main display */
3033 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
3035 return make_number ((int) (dpyinfo
->width
* 25.4 / dpyinfo
->resx
));
3038 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
3039 Sx_display_backing_store
, 0, 1, 0,
3040 doc
: /* Returns an indication of whether display DISPLAY does backing store.
3041 The value may be `always', `when-mapped', or `not-useful'.
3042 The optional argument DISPLAY specifies which display to ask about.
3043 DISPLAY should be either a frame or a display name (a string).
3044 If omitted or nil, that stands for the selected frame's display. */)
3046 Lisp_Object display
;
3048 return intern ("not-useful");
3051 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
3052 Sx_display_visual_class
, 0, 1, 0,
3053 doc
: /* Returns the visual class of the display DISPLAY.
3054 The value is one of the symbols `static-gray', `gray-scale',
3055 `static-color', `pseudo-color', `true-color', or `direct-color'.
3057 The optional argument DISPLAY specifies which display to ask about.
3058 DISPLAY should be either a frame or a display name (a string).
3059 If omitted or nil, that stands for the selected frame's display. */)
3061 Lisp_Object display
;
3063 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
3066 switch (dpyinfo
->visual
->class)
3068 case StaticGray
: return (intern ("static-gray"));
3069 case GrayScale
: return (intern ("gray-scale"));
3070 case StaticColor
: return (intern ("static-color"));
3071 case PseudoColor
: return (intern ("pseudo-color"));
3072 case TrueColor
: return (intern ("true-color"));
3073 case DirectColor
: return (intern ("direct-color"));
3075 error ("Display has an unknown visual class");
3079 return (intern ("true-color"));
3082 DEFUN ("x-display-save-under", Fx_display_save_under
,
3083 Sx_display_save_under
, 0, 1, 0,
3084 doc
: /* Returns t if the display DISPLAY supports the save-under feature.
3085 The optional argument DISPLAY specifies which display to ask about.
3086 DISPLAY should be either a frame or a display name (a string).
3087 If omitted or nil, that stands for the selected frame's display. */)
3089 Lisp_Object display
;
3096 register struct frame
*f
;
3098 return FRAME_PIXEL_WIDTH (f
);
3103 register struct frame
*f
;
3105 return FRAME_PIXEL_HEIGHT (f
);
3110 register struct frame
*f
;
3112 return FRAME_COLUMN_WIDTH (f
);
3117 register struct frame
*f
;
3119 return FRAME_LINE_HEIGHT (f
);
3124 register struct frame
*f
;
3126 return FRAME_MAC_DISPLAY_INFO (f
)->n_planes
;
3129 /* Return the display structure for the display named NAME.
3130 Open a new connection if necessary. */
3132 struct mac_display_info
*
3133 x_display_info_for_name (name
)
3137 struct mac_display_info
*dpyinfo
;
3139 CHECK_STRING (name
);
3141 for (dpyinfo
= &one_mac_display_info
, names
= x_display_name_list
;
3143 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
3146 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
3151 /* Use this general default value to start with. */
3152 Vx_resource_name
= Vinvocation_name
;
3154 validate_x_resource_name ();
3156 dpyinfo
= mac_term_init (name
, (unsigned char *) 0,
3157 (char *) SDATA (Vx_resource_name
));
3160 error ("Cannot connect to server %s", SDATA (name
));
3163 XSETFASTINT (Vwindow_system_version
, 3);
3168 #if 0 /* MAC_TODO: implement network support */
3169 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
3171 doc
: /* Open a connection to a server.
3172 DISPLAY is the name of the display to connect to.
3173 Optional second arg XRM-STRING is a string of resources in xrdb format.
3174 If the optional third arg MUST-SUCCEED is non-nil,
3175 terminate Emacs if we can't open the connection. */)
3176 (display
, xrm_string
, must_succeed
)
3177 Lisp_Object display
, xrm_string
, must_succeed
;
3179 unsigned char *xrm_option
;
3180 struct mac_display_info
*dpyinfo
;
3182 CHECK_STRING (display
);
3183 if (! NILP (xrm_string
))
3184 CHECK_STRING (xrm_string
);
3186 if (! EQ (Vwindow_system
, intern ("mac")))
3187 error ("Not using Mac OS");
3189 if (! NILP (xrm_string
))
3190 xrm_option
= (unsigned char *) SDATA (xrm_string
);
3192 xrm_option
= (unsigned char *) 0;
3194 validate_x_resource_name ();
3196 /* This is what opens the connection and sets x_current_display.
3197 This also initializes many symbols, such as those used for input. */
3198 dpyinfo
= mac_term_init (display
, xrm_option
,
3199 (char *) SDATA (Vx_resource_name
));
3203 if (!NILP (must_succeed
))
3204 fatal ("Cannot connect to server %s.\n",
3207 error ("Cannot connect to server %s", SDATA (display
));
3212 XSETFASTINT (Vwindow_system_version
, 3);
3216 DEFUN ("x-close-connection", Fx_close_connection
,
3217 Sx_close_connection
, 1, 1, 0,
3218 doc
: /* Close the connection to DISPLAY's server.
3219 For DISPLAY, specify either a frame or a display name (a string).
3220 If DISPLAY is nil, that stands for the selected frame's display. */)
3222 Lisp_Object display
;
3224 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
3227 if (dpyinfo
->reference_count
> 0)
3228 error ("Display still has frames on it");
3231 /* Free the fonts in the font table. */
3232 for (i
= 0; i
< dpyinfo
->n_fonts
; i
++)
3233 if (dpyinfo
->font_table
[i
].name
)
3235 if (dpyinfo
->font_table
[i
].name
!= dpyinfo
->font_table
[i
].full_name
)
3236 xfree (dpyinfo
->font_table
[i
].full_name
);
3237 xfree (dpyinfo
->font_table
[i
].name
);
3238 x_unload_font (dpyinfo
, dpyinfo
->font_table
[i
].font
);
3240 x_destroy_all_bitmaps (dpyinfo
);
3242 x_delete_display (dpyinfo
);
3249 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
3250 doc
: /* Return the list of display names that Emacs has connections to. */)
3253 Lisp_Object tail
, result
;
3256 for (tail
= x_display_name_list
; ! NILP (tail
); tail
= XCDR (tail
))
3257 result
= Fcons (XCAR (XCAR (tail
)), result
);
3262 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
3263 doc
: /* If ON is non-nil, report errors as soon as the erring request is made.
3264 If ON is nil, allow buffering of requests.
3265 This is a noop on Mac OS systems.
3266 The optional second argument DISPLAY specifies which display to act on.
3267 DISPLAY should be either a frame or a display name (a string).
3268 If DISPLAY is omitted or nil, that stands for the selected frame's display. */)
3270 Lisp_Object display
, on
;
3276 /***********************************************************************
3278 ***********************************************************************/
3280 DEFUN ("x-change-window-property", Fx_change_window_property
,
3281 Sx_change_window_property
, 2, 6, 0,
3282 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
3283 VALUE may be a string or a list of conses, numbers and/or strings.
3284 If an element in the list is a string, it is converted to
3285 an Atom and the value of the Atom is used. If an element is a cons,
3286 it is converted to a 32 bit number where the car is the 16 top bits and the
3287 cdr is the lower 16 bits.
3288 FRAME nil or omitted means use the selected frame.
3289 If TYPE is given and non-nil, it is the name of the type of VALUE.
3290 If TYPE is not given or nil, the type is STRING.
3291 FORMAT gives the size in bits of each element if VALUE is a list.
3292 It must be one of 8, 16 or 32.
3293 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
3294 If OUTER_P is non-nil, the property is changed for the outer X window of
3295 FRAME. Default is to change on the edit X window.
3298 (prop
, value
, frame
, type
, format
, outer_p
)
3299 Lisp_Object prop
, value
, frame
, type
, format
, outer_p
;
3301 #if 0 /* MAC_TODO : port window properties to Mac */
3302 struct frame
*f
= check_x_frame (frame
);
3305 CHECK_STRING (prop
);
3306 CHECK_STRING (value
);
3309 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3310 XChangeProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3311 prop_atom
, XA_STRING
, 8, PropModeReplace
,
3312 SDATA (value
), SCHARS (value
));
3314 /* Make sure the property is set when we return. */
3315 XFlush (FRAME_W32_DISPLAY (f
));
3318 #endif /* MAC_TODO */
3324 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
3325 Sx_delete_window_property
, 1, 2, 0,
3326 doc
: /* Remove window property PROP from X window of FRAME.
3327 FRAME nil or omitted means use the selected frame. Value is PROP. */)
3329 Lisp_Object prop
, frame
;
3331 #if 0 /* MAC_TODO : port window properties to Mac */
3333 struct frame
*f
= check_x_frame (frame
);
3336 CHECK_STRING (prop
);
3338 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3339 XDeleteProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
), prop_atom
);
3341 /* Make sure the property is removed when we return. */
3342 XFlush (FRAME_W32_DISPLAY (f
));
3344 #endif /* MAC_TODO */
3350 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
3352 doc
: /* Value is the value of window property PROP on FRAME.
3353 If FRAME is nil or omitted, use the selected frame. Value is nil
3354 if FRAME hasn't a property with name PROP or if PROP has no string
3357 Lisp_Object prop
, frame
;
3359 #if 0 /* MAC_TODO : port window properties to Mac */
3361 struct frame
*f
= check_x_frame (frame
);
3364 Lisp_Object prop_value
= Qnil
;
3365 char *tmp_data
= NULL
;
3368 unsigned long actual_size
, bytes_remaining
;
3370 CHECK_STRING (prop
);
3372 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3373 rc
= XGetWindowProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3374 prop_atom
, 0, 0, False
, XA_STRING
,
3375 &actual_type
, &actual_format
, &actual_size
,
3376 &bytes_remaining
, (unsigned char **) &tmp_data
);
3379 int size
= bytes_remaining
;
3384 rc
= XGetWindowProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3385 prop_atom
, 0, bytes_remaining
,
3387 &actual_type
, &actual_format
,
3388 &actual_size
, &bytes_remaining
,
3389 (unsigned char **) &tmp_data
);
3391 prop_value
= make_string (tmp_data
, size
);
3400 #endif /* MAC_TODO */
3406 /***********************************************************************
3408 ***********************************************************************/
3410 /* If non-null, an asynchronous timer that, when it expires, displays
3411 an hourglass cursor on all frames. */
3413 static struct atimer
*hourglass_atimer
;
3415 /* Non-zero means an hourglass cursor is currently shown. */
3417 static int hourglass_shown_p
;
3419 /* Number of seconds to wait before displaying an hourglass cursor. */
3421 static Lisp_Object Vhourglass_delay
;
3423 /* Default number of seconds to wait before displaying an hourglass
3426 #define DEFAULT_HOURGLASS_DELAY 1
3428 /* Function prototypes. */
3430 static void show_hourglass
P_ ((struct atimer
*));
3431 static void hide_hourglass
P_ ((void));
3434 /* Cancel a currently active hourglass timer, and start a new one. */
3439 #if 0 /* MAC_TODO: cursor shape changes. */
3441 int secs
, usecs
= 0;
3443 cancel_hourglass ();
3445 if (INTEGERP (Vhourglass_delay
)
3446 && XINT (Vhourglass_delay
) > 0)
3447 secs
= XFASTINT (Vhourglass_delay
);
3448 else if (FLOATP (Vhourglass_delay
)
3449 && XFLOAT_DATA (Vhourglass_delay
) > 0)
3452 tem
= Ftruncate (Vhourglass_delay
, Qnil
);
3453 secs
= XFASTINT (tem
);
3454 usecs
= (XFLOAT_DATA (Vhourglass_delay
) - secs
) * 1000000;
3457 secs
= DEFAULT_HOURGLASS_DELAY
;
3459 EMACS_SET_SECS_USECS (delay
, secs
, usecs
);
3460 hourglass_atimer
= start_atimer (ATIMER_RELATIVE
, delay
,
3461 show_hourglass
, NULL
);
3462 #endif /* MAC_TODO */
3466 /* Cancel the hourglass cursor timer if active, hide an hourglass
3472 if (hourglass_atimer
)
3474 cancel_atimer (hourglass_atimer
);
3475 hourglass_atimer
= NULL
;
3478 if (hourglass_shown_p
)
3483 /* Timer function of hourglass_atimer. TIMER is equal to
3486 Display an hourglass cursor on all frames by mapping the frames'
3487 hourglass_window. Set the hourglass_p flag in the frames'
3488 output_data.x structure to indicate that an hourglass cursor is
3489 shown on the frames. */
3492 show_hourglass (timer
)
3493 struct atimer
*timer
;
3495 #if 0 /* MAC_TODO: cursor shape changes. */
3496 /* The timer implementation will cancel this timer automatically
3497 after this function has run. Set hourglass_atimer to null
3498 so that we know the timer doesn't have to be canceled. */
3499 hourglass_atimer
= NULL
;
3501 if (!hourglass_shown_p
)
3503 Lisp_Object rest
, frame
;
3507 FOR_EACH_FRAME (rest
, frame
)
3508 if (FRAME_W32_P (XFRAME (frame
)))
3510 struct frame
*f
= XFRAME (frame
);
3512 f
->output_data
.w32
->hourglass_p
= 1;
3514 if (!f
->output_data
.w32
->hourglass_window
)
3516 unsigned long mask
= CWCursor
;
3517 XSetWindowAttributes attrs
;
3519 attrs
.cursor
= f
->output_data
.w32
->hourglass_cursor
;
3521 f
->output_data
.w32
->hourglass_window
3522 = XCreateWindow (FRAME_X_DISPLAY (f
),
3523 FRAME_OUTER_WINDOW (f
),
3524 0, 0, 32000, 32000, 0, 0,
3530 XMapRaised (FRAME_X_DISPLAY (f
),
3531 f
->output_data
.w32
->hourglass_window
);
3532 XFlush (FRAME_X_DISPLAY (f
));
3535 hourglass_shown_p
= 1;
3538 #endif /* MAC_TODO */
3542 /* Hide the hourglass cursor on all frames, if it is currently shown. */
3547 #if 0 /* MAC_TODO: cursor shape changes. */
3548 if (hourglass_shown_p
)
3550 Lisp_Object rest
, frame
;
3553 FOR_EACH_FRAME (rest
, frame
)
3555 struct frame
*f
= XFRAME (frame
);
3558 /* Watch out for newly created frames. */
3559 && f
->output_data
.x
->hourglass_window
)
3561 XUnmapWindow (FRAME_X_DISPLAY (f
),
3562 f
->output_data
.x
->hourglass_window
);
3563 /* Sync here because XTread_socket looks at the
3564 hourglass_p flag that is reset to zero below. */
3565 XSync (FRAME_X_DISPLAY (f
), False
);
3566 f
->output_data
.x
->hourglass_p
= 0;
3570 hourglass_shown_p
= 0;
3573 #endif /* MAC_TODO */
3578 /***********************************************************************
3580 ***********************************************************************/
3582 static Lisp_Object x_create_tip_frame
P_ ((struct mac_display_info
*,
3583 Lisp_Object
, Lisp_Object
));
3584 static void compute_tip_xy
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
,
3585 Lisp_Object
, int, int, int *, int *));
3587 /* The frame of a currently visible tooltip. */
3589 Lisp_Object tip_frame
;
3591 /* If non-nil, a timer started that hides the last tooltip when it
3594 Lisp_Object tip_timer
;
3597 /* If non-nil, a vector of 3 elements containing the last args
3598 with which x-show-tip was called. See there. */
3600 Lisp_Object last_show_tip_args
;
3602 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
3604 Lisp_Object Vx_max_tooltip_size
;
3608 unwind_create_tip_frame (frame
)
3611 Lisp_Object deleted
;
3613 deleted
= unwind_create_frame (frame
);
3614 if (EQ (deleted
, Qt
))
3624 /* Create a frame for a tooltip on the display described by DPYINFO.
3625 PARMS is a list of frame parameters. TEXT is the string to
3626 display in the tip frame. Value is the frame.
3628 Note that functions called here, esp. x_default_parameter can
3629 signal errors, for instance when a specified color name is
3630 undefined. We have to make sure that we're in a consistent state
3631 when this happens. */
3634 x_create_tip_frame (dpyinfo
, parms
, text
)
3635 struct mac_display_info
*dpyinfo
;
3636 Lisp_Object parms
, text
;
3639 Lisp_Object frame
, tem
;
3641 long window_prompting
= 0;
3643 int count
= SPECPDL_INDEX ();
3644 struct gcpro gcpro1
, gcpro2
, gcpro3
;
3646 int face_change_count_before
= face_change_count
;
3648 struct buffer
*old_buffer
;
3652 /* Use this general default value to start with until we know if
3653 this frame has a specified name. */
3654 Vx_resource_name
= Vinvocation_name
;
3657 kb
= dpyinfo
->kboard
;
3659 kb
= &the_only_kboard
;
3662 /* Get the name of the frame to use for resource lookup. */
3663 name
= mac_get_arg (parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3665 && !EQ (name
, Qunbound
)
3667 error ("Invalid frame name--not a string or nil");
3668 Vx_resource_name
= name
;
3671 GCPRO3 (parms
, name
, frame
);
3673 XSETFRAME (frame
, f
);
3675 buffer
= Fget_buffer_create (build_string (" *tip*"));
3676 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
3677 old_buffer
= current_buffer
;
3678 set_buffer_internal_1 (XBUFFER (buffer
));
3679 current_buffer
->truncate_lines
= Qnil
;
3680 specbind (Qinhibit_read_only
, Qt
);
3681 specbind (Qinhibit_modification_hooks
, Qt
);
3684 set_buffer_internal_1 (old_buffer
);
3686 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
3687 record_unwind_protect (unwind_create_tip_frame
, frame
);
3689 /* By setting the output method, we're essentially saying that
3690 the frame is live, as per FRAME_LIVE_P. If we get a signal
3691 from this point on, x_destroy_window might screw up reference
3693 f
->output_method
= output_mac
;
3694 f
->output_data
.mac
=
3695 (struct mac_output
*) xmalloc (sizeof (struct mac_output
));
3696 bzero (f
->output_data
.mac
, sizeof (struct mac_output
));
3698 FRAME_FONTSET (f
) = -1;
3699 f
->icon_name
= Qnil
;
3701 #if 0 /* GLYPH_DEBUG TODO: image support. */
3702 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
3703 dpyinfo_refcount
= dpyinfo
->reference_count
;
3704 #endif /* GLYPH_DEBUG */
3706 FRAME_KBOARD (f
) = kb
;
3708 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
3709 f
->output_data
.mac
->explicit_parent
= 0;
3711 /* Set the name; the functions to which we pass f expect the name to
3713 if (EQ (name
, Qunbound
) || NILP (name
))
3715 f
->name
= build_string (dpyinfo
->mac_id_name
);
3716 f
->explicit_name
= 0;
3721 f
->explicit_name
= 1;
3722 /* use the frame's title when getting resources for this frame. */
3723 specbind (Qx_resource_name
, name
);
3726 /* Extract the window parameters from the supplied values that are
3727 needed to determine window geometry. */
3731 font
= mac_get_arg (parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3734 /* First, try whatever font the caller has specified. */
3737 tem
= Fquery_fontset (font
, Qnil
);
3739 font
= x_new_fontset (f
, SDATA (tem
));
3741 font
= x_new_font (f
, SDATA (font
));
3744 /* Try out a font which we hope has bold and italic variations. */
3745 if (! STRINGP (font
))
3746 font
= x_new_font (f
, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
3747 /* If those didn't work, look for something which will at least work. */
3748 if (! STRINGP (font
))
3749 font
= x_new_font (f
, "-*-monaco-*-12-*-mac-roman");
3750 if (! STRINGP (font
))
3751 font
= x_new_font (f
, "-*-courier-*-10-*-mac-roman");
3753 if (! STRINGP (font
))
3754 error ("Cannot find any usable font");
3756 x_default_parameter (f
, parms
, Qfont
, font
,
3757 "font", "Font", RES_TYPE_STRING
);
3760 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
3761 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
3763 /* This defaults to 2 in order to match xterm. We recognize either
3764 internalBorderWidth or internalBorder (which is what xterm calls
3766 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3770 value
= mac_get_arg (parms
, Qinternal_border_width
,
3771 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
3772 if (! EQ (value
, Qunbound
))
3773 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
3777 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
3778 "internalBorderWidth", "internalBorderWidth",
3781 /* Also do the stuff which must be set before the window exists. */
3782 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3783 "foreground", "Foreground", RES_TYPE_STRING
);
3784 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3785 "background", "Background", RES_TYPE_STRING
);
3786 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3787 "pointerColor", "Foreground", RES_TYPE_STRING
);
3788 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3789 "cursorColor", "Foreground", RES_TYPE_STRING
);
3790 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3791 "borderColor", "BorderColor", RES_TYPE_STRING
);
3793 /* Init faces before x_default_parameter is called for scroll-bar
3794 parameters because that function calls x_set_scroll_bar_width,
3795 which calls change_frame_size, which calls Fset_window_buffer,
3796 which runs hooks, which call Fvertical_motion. At the end, we
3797 end up in init_iterator with a null face cache, which should not
3799 init_frame_faces (f
);
3801 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
3803 window_prompting
= x_figure_window_size (f
, parms
, 0);
3809 SetRect (&r
, 0, 0, 1, 1);
3810 if (CreateNewWindow (kHelpWindowClass
,
3811 #ifdef MAC_OS_X_VERSION_10_2
3812 kWindowIgnoreClicksAttribute
|
3814 kWindowNoActivatesAttribute
,
3815 &r
, &tip_window
) == noErr
)
3817 FRAME_MAC_WINDOW (f
) = tip_window
;
3818 SetWRefCon (tip_window
, (long) f
->output_data
.mac
);
3819 /* so that update events can find this mac_output struct */
3820 f
->output_data
.mac
->mFP
= f
;
3821 ShowWindow (tip_window
);
3828 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3829 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3830 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3831 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3832 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3833 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3835 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3836 Change will not be effected unless different from the current
3838 width
= FRAME_COLS (f
);
3839 height
= FRAME_LINES (f
);
3840 SET_FRAME_COLS (f
, 0);
3841 FRAME_LINES (f
) = 0;
3842 change_frame_size (f
, height
, width
, 1, 0, 0);
3844 /* Add `tooltip' frame parameter's default value. */
3845 if (NILP (Fframe_parameter (frame
, intern ("tooltip"))))
3846 Fmodify_frame_parameters (frame
, Fcons (Fcons (intern ("tooltip"), Qt
),
3849 /* Set up faces after all frame parameters are known. This call
3850 also merges in face attributes specified for new frames.
3852 Frame parameters may be changed if .Xdefaults contains
3853 specifications for the default font. For example, if there is an
3854 `Emacs.default.attributeBackground: pink', the `background-color'
3855 attribute of the frame get's set, which let's the internal border
3856 of the tooltip frame appear in pink. Prevent this. */
3858 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
3860 /* Set tip_frame here, so that */
3862 call1 (Qface_set_after_frame_default
, frame
);
3864 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
3865 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
3873 /* It is now ok to make the frame official even if we get an error
3874 below. And the frame needs to be on Vframe_list or making it
3875 visible won't work. */
3876 Vframe_list
= Fcons (frame
, Vframe_list
);
3878 /* Now that the frame is official, it counts as a reference to
3880 FRAME_MAC_DISPLAY_INFO (f
)->reference_count
++;
3882 /* Setting attributes of faces of the tooltip frame from resources
3883 and similar will increment face_change_count, which leads to the
3884 clearing of all current matrices. Since this isn't necessary
3885 here, avoid it by resetting face_change_count to the value it
3886 had before we created the tip frame. */
3887 face_change_count
= face_change_count_before
;
3889 /* Discard the unwind_protect. */
3890 return unbind_to (count
, frame
);
3894 /* Compute where to display tip frame F. PARMS is the list of frame
3895 parameters for F. DX and DY are specified offsets from the current
3896 location of the mouse. WIDTH and HEIGHT are the width and height
3897 of the tooltip. Return coordinates relative to the root window of
3898 the display in *ROOT_X, and *ROOT_Y. */
3901 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, root_x
, root_y
)
3903 Lisp_Object parms
, dx
, dy
;
3905 int *root_x
, *root_y
;
3907 Lisp_Object left
, top
;
3909 /* User-specified position? */
3910 left
= Fcdr (Fassq (Qleft
, parms
));
3911 top
= Fcdr (Fassq (Qtop
, parms
));
3913 /* Move the tooltip window where the mouse pointer is. Resize and
3915 if (!INTEGERP (left
) || !INTEGERP (top
))
3920 GetMouse (&mouse_pos
);
3921 LocalToGlobal (&mouse_pos
);
3922 *root_x
= mouse_pos
.h
;
3923 *root_y
= mouse_pos
.v
;
3928 *root_y
= XINT (top
);
3929 else if (*root_y
+ XINT (dy
) - height
< 0)
3930 *root_y
-= XINT (dy
);
3934 *root_y
+= XINT (dy
);
3937 if (INTEGERP (left
))
3938 *root_x
= XINT (left
);
3939 else if (*root_x
+ XINT (dx
) + width
<= FRAME_MAC_DISPLAY_INFO (f
)->width
)
3940 /* It fits to the right of the pointer. */
3941 *root_x
+= XINT (dx
);
3942 else if (width
+ XINT (dx
) <= *root_x
)
3943 /* It fits to the left of the pointer. */
3944 *root_x
-= width
+ XINT (dx
);
3946 /* Put it left-justified on the screen -- it ought to fit that way. */
3951 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
3952 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
3953 A tooltip window is a small X window displaying a string.
3955 FRAME nil or omitted means use the selected frame.
3957 PARMS is an optional list of frame parameters which can be used to
3958 change the tooltip's appearance.
3960 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
3961 means use the default timeout of 5 seconds.
3963 If the list of frame parameters PARAMS contains a `left' parameters,
3964 the tooltip is displayed at that x-position. Otherwise it is
3965 displayed at the mouse position, with offset DX added (default is 5 if
3966 DX isn't specified). Likewise for the y-position; if a `top' frame
3967 parameter is specified, it determines the y-position of the tooltip
3968 window, otherwise it is displayed at the mouse position, with offset
3969 DY added (default is -10).
3971 A tooltip's maximum size is specified by `x-max-tooltip-size'.
3972 Text larger than the specified size is clipped. */)
3973 (string
, frame
, parms
, timeout
, dx
, dy
)
3974 Lisp_Object string
, frame
, parms
, timeout
, dx
, dy
;
3979 struct buffer
*old_buffer
;
3980 struct text_pos pos
;
3981 int i
, width
, height
;
3982 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3983 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
3984 int count
= SPECPDL_INDEX ();
3986 specbind (Qinhibit_redisplay
, Qt
);
3988 GCPRO4 (string
, parms
, frame
, timeout
);
3990 CHECK_STRING (string
);
3991 f
= check_x_frame (frame
);
3993 timeout
= make_number (5);
3995 CHECK_NATNUM (timeout
);
3998 dx
= make_number (5);
4003 dy
= make_number (-10);
4007 if (NILP (last_show_tip_args
))
4008 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
4010 if (!NILP (tip_frame
))
4012 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
4013 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
4014 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
4016 if (EQ (frame
, last_frame
)
4017 && !NILP (Fequal (last_string
, string
))
4018 && !NILP (Fequal (last_parms
, parms
)))
4020 struct frame
*f
= XFRAME (tip_frame
);
4022 /* Only DX and DY have changed. */
4023 if (!NILP (tip_timer
))
4025 Lisp_Object timer
= tip_timer
;
4027 call1 (Qcancel_timer
, timer
);
4031 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
4032 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
4033 MoveWindow (FRAME_MAC_WINDOW (f
), root_x
, root_y
, false);
4039 /* Hide a previous tip, if any. */
4042 ASET (last_show_tip_args
, 0, string
);
4043 ASET (last_show_tip_args
, 1, frame
);
4044 ASET (last_show_tip_args
, 2, parms
);
4046 /* Add default values to frame parameters. */
4047 if (NILP (Fassq (Qname
, parms
)))
4048 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
4049 if (NILP (Fassq (Qinternal_border_width
, parms
)))
4050 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
4051 if (NILP (Fassq (Qborder_width
, parms
)))
4052 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
4053 if (NILP (Fassq (Qborder_color
, parms
)))
4054 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
4055 if (NILP (Fassq (Qbackground_color
, parms
)))
4056 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
4059 /* Create a frame for the tooltip, and record it in the global
4060 variable tip_frame. */
4061 frame
= x_create_tip_frame (FRAME_MAC_DISPLAY_INFO (f
), parms
, string
);
4064 /* Set up the frame's root window. */
4065 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
4066 w
->left_col
= w
->top_line
= make_number (0);
4068 if (CONSP (Vx_max_tooltip_size
)
4069 && INTEGERP (XCAR (Vx_max_tooltip_size
))
4070 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
4071 && INTEGERP (XCDR (Vx_max_tooltip_size
))
4072 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
4074 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
4075 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
4079 w
->total_cols
= make_number (80);
4080 w
->total_lines
= make_number (40);
4083 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
4085 w
->pseudo_window_p
= 1;
4087 /* Display the tooltip text in a temporary buffer. */
4088 old_buffer
= current_buffer
;
4089 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
4090 current_buffer
->truncate_lines
= Qnil
;
4091 clear_glyph_matrix (w
->desired_matrix
);
4092 clear_glyph_matrix (w
->current_matrix
);
4093 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
4094 try_window (FRAME_ROOT_WINDOW (f
), pos
);
4096 /* Compute width and height of the tooltip. */
4098 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
4100 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
4104 /* Stop at the first empty row at the end. */
4105 if (!row
->enabled_p
|| !row
->displays_text_p
)
4108 /* Let the row go over the full width of the frame. */
4109 row
->full_width_p
= 1;
4111 /* There's a glyph at the end of rows that is used to place
4112 the cursor there. Don't include the width of this glyph. */
4113 if (row
->used
[TEXT_AREA
])
4115 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
4116 row_width
= row
->pixel_width
- last
->pixel_width
;
4119 row_width
= row
->pixel_width
;
4121 height
+= row
->height
;
4122 width
= max (width
, row_width
);
4125 /* Add the frame's internal border to the width and height the X
4126 window should have. */
4127 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
4128 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
4130 /* Move the tooltip window where the mouse pointer is. Resize and
4132 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
4135 MoveWindow (FRAME_MAC_WINDOW (f
), root_x
, root_y
, false);
4136 SizeWindow (FRAME_MAC_WINDOW (f
), width
, height
, true);
4137 BringToFront (FRAME_MAC_WINDOW (f
));
4140 /* Draw into the window. */
4141 w
->must_be_updated_p
= 1;
4142 update_single_window (w
, 1);
4144 /* Restore original current buffer. */
4145 set_buffer_internal_1 (old_buffer
);
4146 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
4149 /* Let the tip disappear after timeout seconds. */
4150 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
4151 intern ("x-hide-tip"));
4154 return unbind_to (count
, Qnil
);
4158 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
4159 doc
: /* Hide the current tooltip window, if there is any.
4160 Value is t if tooltip was open, nil otherwise. */)
4164 Lisp_Object deleted
, frame
, timer
;
4165 struct gcpro gcpro1
, gcpro2
;
4167 /* Return quickly if nothing to do. */
4168 if (NILP (tip_timer
) && NILP (tip_frame
))
4173 GCPRO2 (frame
, timer
);
4174 tip_frame
= tip_timer
= deleted
= Qnil
;
4176 count
= SPECPDL_INDEX ();
4177 specbind (Qinhibit_redisplay
, Qt
);
4178 specbind (Qinhibit_quit
, Qt
);
4181 call1 (Qcancel_timer
, timer
);
4185 Fdelete_frame (frame
, Qnil
);
4190 return unbind_to (count
, deleted
);
4195 /***********************************************************************
4196 File selection dialog
4197 ***********************************************************************/
4199 #if 0 /* MAC_TODO: can standard file dialog */
4200 extern Lisp_Object Qfile_name_history
;
4202 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 4, 0,
4203 doc
: /* Read file name, prompting with PROMPT in directory DIR.
4204 Use a file selection dialog.
4205 Select DEFAULT-FILENAME in the dialog's file selection box, if
4206 specified. Don't let the user enter a file name in the file
4207 selection dialog's entry field, if MUSTMATCH is non-nil. */)
4208 (prompt
, dir
, default_filename
, mustmatch
)
4209 Lisp_Object prompt
, dir
, default_filename
, mustmatch
;
4211 struct frame
*f
= SELECTED_FRAME ();
4212 Lisp_Object file
= Qnil
;
4213 int count
= SPECPDL_INDEX ();
4214 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
4215 char filename
[MAX_PATH
+ 1];
4216 char init_dir
[MAX_PATH
+ 1];
4217 int use_dialog_p
= 1;
4219 GCPRO5 (prompt
, dir
, default_filename
, mustmatch
, file
);
4220 CHECK_STRING (prompt
);
4223 /* Create the dialog with PROMPT as title, using DIR as initial
4224 directory and using "*" as pattern. */
4225 dir
= Fexpand_file_name (dir
, Qnil
);
4226 strncpy (init_dir
, SDATA (dir
), MAX_PATH
);
4227 init_dir
[MAX_PATH
] = '\0';
4228 unixtodos_filename (init_dir
);
4230 if (STRINGP (default_filename
))
4232 char *file_name_only
;
4233 char *full_path_name
= SDATA (default_filename
);
4235 unixtodos_filename (full_path_name
);
4237 file_name_only
= strrchr (full_path_name
, '\\');
4238 if (!file_name_only
)
4239 file_name_only
= full_path_name
;
4244 /* If default_file_name is a directory, don't use the open
4245 file dialog, as it does not support selecting
4247 if (!(*file_name_only
))
4251 strncpy (filename
, file_name_only
, MAX_PATH
);
4252 filename
[MAX_PATH
] = '\0';
4259 OPENFILENAME file_details
;
4260 char *filename_file
;
4262 /* Prevent redisplay. */
4263 specbind (Qinhibit_redisplay
, Qt
);
4266 bzero (&file_details
, sizeof (file_details
));
4267 file_details
.lStructSize
= sizeof (file_details
);
4268 file_details
.hwndOwner
= FRAME_W32_WINDOW (f
);
4269 file_details
.lpstrFile
= filename
;
4270 file_details
.nMaxFile
= sizeof (filename
);
4271 file_details
.lpstrInitialDir
= init_dir
;
4272 file_details
.lpstrTitle
= SDATA (prompt
);
4273 file_details
.Flags
= OFN_HIDEREADONLY
| OFN_NOCHANGEDIR
;
4275 if (!NILP (mustmatch
))
4276 file_details
.Flags
|= OFN_FILEMUSTEXIST
| OFN_PATHMUSTEXIST
;
4278 if (GetOpenFileName (&file_details
))
4280 dostounix_filename (filename
);
4281 file
= build_string (filename
);
4287 file
= unbind_to (count
, file
);
4289 /* Open File dialog will not allow folders to be selected, so resort
4290 to minibuffer completing reads for directories. */
4292 file
= Fcompleting_read (prompt
, intern ("read-file-name-internal"),
4293 dir
, mustmatch
, dir
, Qfile_name_history
,
4294 default_filename
, Qnil
);
4298 /* Make "Cancel" equivalent to C-g. */
4300 Fsignal (Qquit
, Qnil
);
4302 return unbind_to (count
, file
);
4304 #endif /* MAC_TODO */
4308 /***********************************************************************
4310 ***********************************************************************/
4312 /* Keep this list in the same order as frame_parms in frame.c.
4313 Use 0 for unsupported frame parameters. */
4315 frame_parm_handler mac_frame_parm_handlers
[] =
4319 x_set_background_color
,
4325 x_set_foreground_color
,
4327 0, /* MAC_TODO: x_set_icon_type, */
4328 x_set_internal_border_width
,
4329 x_set_menu_bar_lines
,
4331 x_explicitly_set_name
,
4332 x_set_scroll_bar_width
,
4335 x_set_vertical_scroll_bars
,
4337 x_set_tool_bar_lines
,
4338 0, /* MAC_TODO: x_set_scroll_bar_foreground, */
4339 0, /* MAC_TODO: x_set_scroll_bar_background, */
4342 0, /* MAC_TODO: x_set_fringe_width, */
4343 0, /* MAC_TODO: x_set_fringe_width, */
4344 0, /* x_set_wait_for_wm, */
4345 0, /* MAC_TODO: x_set_fullscreen, */
4351 /* Certainly running on Mac. */
4354 /* The section below is built by the lisp expression at the top of the file,
4355 just above where these variables are declared. */
4356 /*&&& init symbols here &&&*/
4357 Qnone
= intern ("none");
4359 Qsuppress_icon
= intern ("suppress-icon");
4360 staticpro (&Qsuppress_icon
);
4361 Qundefined_color
= intern ("undefined-color");
4362 staticpro (&Qundefined_color
);
4363 Qcancel_timer
= intern ("cancel-timer");
4364 staticpro (&Qcancel_timer
);
4366 Qhyper
= intern ("hyper");
4367 staticpro (&Qhyper
);
4368 Qsuper
= intern ("super");
4369 staticpro (&Qsuper
);
4370 Qmeta
= intern ("meta");
4372 Qalt
= intern ("alt");
4374 Qctrl
= intern ("ctrl");
4376 Qcontrol
= intern ("control");
4377 staticpro (&Qcontrol
);
4378 Qshift
= intern ("shift");
4379 staticpro (&Qshift
);
4380 /* This is the end of symbol initialization. */
4382 /* Text property `display' should be nonsticky by default. */
4383 Vtext_property_default_nonsticky
4384 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
4386 Qface_set_after_frame_default
= intern ("face-set-after-frame-default");
4387 staticpro (&Qface_set_after_frame_default
);
4389 Fput (Qundefined_color
, Qerror_conditions
,
4390 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
4391 Fput (Qundefined_color
, Qerror_message
,
4392 build_string ("Undefined color"));
4394 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
4395 doc
: /* The shape of the pointer when over text.
4396 Changing the value does not affect existing frames
4397 unless you set the mouse color. */);
4398 Vx_pointer_shape
= Qnil
;
4400 Vx_nontext_pointer_shape
= Qnil
;
4402 Vx_mode_pointer_shape
= Qnil
;
4404 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
4405 doc
: /* The shape of the pointer when Emacs is hourglass.
4406 This variable takes effect when you create a new frame
4407 or when you set the mouse color. */);
4408 Vx_hourglass_pointer_shape
= Qnil
;
4410 DEFVAR_BOOL ("display-hourglass", &display_hourglass_p
,
4411 doc
: /* Non-zero means Emacs displays an hourglass pointer on window systems. */);
4412 display_hourglass_p
= 1;
4414 DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay
,
4415 doc
: /* *Seconds to wait before displaying an hourglass pointer.
4416 Value must be an integer or float. */);
4417 Vhourglass_delay
= make_number (DEFAULT_HOURGLASS_DELAY
);
4419 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
4420 &Vx_sensitive_text_pointer_shape
,
4421 doc
: /* The shape of the pointer when over mouse-sensitive text.
4422 This variable takes effect when you create a new frame
4423 or when you set the mouse color. */);
4424 Vx_sensitive_text_pointer_shape
= Qnil
;
4426 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
4427 doc
: /* A string indicating the foreground color of the cursor box. */);
4428 Vx_cursor_fore_pixel
= Qnil
;
4430 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
4431 doc
: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS).
4432 Text larger than this is clipped. */);
4433 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
4435 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
4436 doc
: /* Non-nil if no window manager is in use.
4437 Emacs doesn't try to figure this out; this is always nil
4438 unless you set it to something else. */);
4439 /* We don't have any way to find this out, so set it to nil
4440 and maybe the user would like to set it to t. */
4441 Vx_no_window_manager
= Qnil
;
4443 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
4444 &Vx_pixel_size_width_font_regexp
,
4445 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
4447 Since Emacs gets width of a font matching with this regexp from
4448 PIXEL_SIZE field of the name, font finding mechanism gets faster for
4449 such a font. This is especially effective for such large fonts as
4450 Chinese, Japanese, and Korean. */);
4451 Vx_pixel_size_width_font_regexp
= Qnil
;
4453 /* X window properties. */
4454 defsubr (&Sx_change_window_property
);
4455 defsubr (&Sx_delete_window_property
);
4456 defsubr (&Sx_window_property
);
4458 defsubr (&Sxw_display_color_p
);
4459 defsubr (&Sx_display_grayscale_p
);
4460 defsubr (&Sxw_color_defined_p
);
4461 defsubr (&Sxw_color_values
);
4462 defsubr (&Sx_server_max_request_size
);
4463 defsubr (&Sx_server_vendor
);
4464 defsubr (&Sx_server_version
);
4465 defsubr (&Sx_display_pixel_width
);
4466 defsubr (&Sx_display_pixel_height
);
4467 defsubr (&Sx_display_mm_width
);
4468 defsubr (&Sx_display_mm_height
);
4469 defsubr (&Sx_display_screens
);
4470 defsubr (&Sx_display_planes
);
4471 defsubr (&Sx_display_color_cells
);
4472 defsubr (&Sx_display_visual_class
);
4473 defsubr (&Sx_display_backing_store
);
4474 defsubr (&Sx_display_save_under
);
4475 defsubr (&Sx_create_frame
);
4476 #if 0 /* MAC_TODO: implement network support */
4477 defsubr (&Sx_open_connection
);
4478 defsubr (&Sx_close_connection
);
4480 defsubr (&Sx_display_list
);
4481 defsubr (&Sx_synchronize
);
4483 /* Setting callback functions for fontset handler. */
4484 get_font_info_func
= x_get_font_info
;
4486 #if 0 /* This function pointer doesn't seem to be used anywhere.
4487 And the pointer assigned has the wrong type, anyway. */
4488 list_fonts_func
= x_list_fonts
;
4491 load_font_func
= x_load_font
;
4492 find_ccl_program_func
= x_find_ccl_program
;
4493 query_font_func
= x_query_font
;
4494 set_frame_fontset_func
= x_set_font
;
4495 check_window_system_func
= check_mac
;
4497 hourglass_atimer
= NULL
;
4498 hourglass_shown_p
= 0;
4500 defsubr (&Sx_show_tip
);
4501 defsubr (&Sx_hide_tip
);
4503 staticpro (&tip_timer
);
4505 staticpro (&tip_frame
);
4507 last_show_tip_args
= Qnil
;
4508 staticpro (&last_show_tip_args
);
4510 #if 0 /* MAC_TODO */
4511 defsubr (&Sx_file_dialog
);
4515 /* arch-tag: d7591289-f374-4377-b245-12f5dbbb8edc
4516 (do not change this comment) */