1 /* Graphical user interface functions for Mac OS.
2 Copyright (C) 2000, 2001, 2002, 2003, 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., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA. */
21 /* Contributed by Andrew Choi (akochoi@mac.com). */
32 #include "intervals.h"
33 #include "dispextern.h"
35 #include "blockinput.h"
41 #include "termhooks.h"
45 #include <sys/types.h>
49 #include <sys/param.h>
51 extern void free_frame_menubar ();
53 /* Non-zero means we're allowed to display an hourglass cursor. */
55 int display_hourglass_p
;
57 /* The background and shape of the mouse pointer, and shape when not
58 over text or in the modeline. */
60 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
61 Lisp_Object Vx_hourglass_pointer_shape
;
63 /* The shape when over mouse-sensitive text. */
65 Lisp_Object Vx_sensitive_text_pointer_shape
;
67 /* If non-nil, the pointer shape to indicate that windows can be
68 dragged horizontally. */
70 Lisp_Object Vx_window_horizontal_drag_shape
;
72 /* Color of chars displayed in cursor box. */
74 Lisp_Object Vx_cursor_fore_pixel
;
76 /* Nonzero if using Windows. */
78 static int mac_in_use
;
80 /* Non nil if no window manager is in use. */
82 Lisp_Object Vx_no_window_manager
;
84 /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
86 Lisp_Object Vx_pixel_size_width_font_regexp
;
89 Lisp_Object Qsuppress_icon
;
90 Lisp_Object Qundefined_color
;
91 Lisp_Object Qcancel_timer
;
95 extern Lisp_Object Vwindow_system_version
;
98 int image_cache_refcount
, dpyinfo_refcount
;
102 #if 0 /* Use xstricmp instead. */
103 /* compare two strings ignoring case */
106 stricmp (const char *s
, const char *t
)
108 for ( ; tolower (*s
) == tolower (*t
); s
++, t
++)
111 return tolower (*s
) - tolower (*t
);
115 /* compare two strings up to n characters, ignoring case */
118 strnicmp (const char *s
, const char *t
, unsigned int n
)
120 for ( ; n
> 0 && tolower (*s
) == tolower (*t
); n
--, s
++, t
++)
123 return n
== 0 ? 0 : tolower (*s
) - tolower (*t
);
127 /* Error if we are not running on Mac OS. */
133 error ("Mac native windows not in use or not initialized");
136 /* Nonzero if we can use mouse menus.
137 You should not call this unless HAVE_MENUS is defined. */
145 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
146 and checking validity for Mac. */
149 check_x_frame (frame
)
155 frame
= selected_frame
;
156 CHECK_LIVE_FRAME (frame
);
158 if (! FRAME_MAC_P (f
))
159 error ("Non-Mac frame used");
163 /* Let the user specify a display with a frame.
164 nil stands for the selected frame--or, if that is not a mac frame,
165 the first display on the list. */
167 struct mac_display_info
*
168 check_x_display_info (frame
)
171 struct mac_display_info
*dpyinfo
= NULL
;
175 struct frame
*sf
= XFRAME (selected_frame
);
177 if (FRAME_MAC_P (sf
) && FRAME_LIVE_P (sf
))
178 dpyinfo
= FRAME_MAC_DISPLAY_INFO (sf
);
179 else if (x_display_list
!= 0)
180 dpyinfo
= x_display_list
;
182 error ("Mac native windows are not in use or not initialized");
184 else if (STRINGP (frame
))
185 dpyinfo
= x_display_info_for_name (frame
);
188 FRAME_PTR f
= check_x_frame (frame
);
189 dpyinfo
= FRAME_MAC_DISPLAY_INFO (f
);
197 static Lisp_Object unwind_create_frame
P_ ((Lisp_Object
));
198 static Lisp_Object unwind_create_tip_frame
P_ ((Lisp_Object
));
200 void x_set_foreground_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
201 void x_set_background_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
202 void x_set_mouse_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
203 void x_set_cursor_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
204 void x_set_border_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
205 void x_set_cursor_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
206 void x_set_icon_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
207 void x_set_icon_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
208 void x_explicitly_set_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
209 void x_set_menu_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
210 void x_set_title
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
211 void x_set_tool_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
212 void x_set_scroll_bar_foreground
P_ ((struct frame
*, Lisp_Object
,
214 void x_set_scroll_bar_background
P_ ((struct frame
*, Lisp_Object
,
216 static Lisp_Object x_default_scroll_bar_color_parameter
P_ ((struct frame
*,
222 extern void mac_get_window_bounds
P_ ((struct frame
*, Rect
*, Rect
*));
226 /* Store the screen positions of frame F into XPTR and YPTR.
227 These are the positions of the containing window manager window,
228 not Emacs's own window. */
231 x_real_positions (f
, xptr
, yptr
)
237 mac_get_window_bounds (f
, &inner
, &outer
);
239 f
->x_pixels_diff
= inner
.left
- outer
.left
;
240 f
->y_pixels_diff
= inner
.top
- outer
.top
;
247 /* The default colors for the Mac color map */
248 typedef struct colormap_t
254 colormap_t mac_color_map
[] =
256 { RGB_TO_ULONG(255, 250, 250), "snow" },
257 { RGB_TO_ULONG(248, 248, 255), "ghost white" },
258 { RGB_TO_ULONG(248, 248, 255), "GhostWhite" },
259 { RGB_TO_ULONG(245, 245, 245), "white smoke" },
260 { RGB_TO_ULONG(245, 245, 245), "WhiteSmoke" },
261 { RGB_TO_ULONG(220, 220, 220), "gainsboro" },
262 { RGB_TO_ULONG(255, 250, 240), "floral white" },
263 { RGB_TO_ULONG(255, 250, 240), "FloralWhite" },
264 { RGB_TO_ULONG(253, 245, 230), "old lace" },
265 { RGB_TO_ULONG(253, 245, 230), "OldLace" },
266 { RGB_TO_ULONG(250, 240, 230), "linen" },
267 { RGB_TO_ULONG(250, 235, 215), "antique white" },
268 { RGB_TO_ULONG(250, 235, 215), "AntiqueWhite" },
269 { RGB_TO_ULONG(255, 239, 213), "papaya whip" },
270 { RGB_TO_ULONG(255, 239, 213), "PapayaWhip" },
271 { RGB_TO_ULONG(255, 235, 205), "blanched almond" },
272 { RGB_TO_ULONG(255, 235, 205), "BlanchedAlmond" },
273 { RGB_TO_ULONG(255, 228, 196), "bisque" },
274 { RGB_TO_ULONG(255, 218, 185), "peach puff" },
275 { RGB_TO_ULONG(255, 218, 185), "PeachPuff" },
276 { RGB_TO_ULONG(255, 222, 173), "navajo white" },
277 { RGB_TO_ULONG(255, 222, 173), "NavajoWhite" },
278 { RGB_TO_ULONG(255, 228, 181), "moccasin" },
279 { RGB_TO_ULONG(255, 248, 220), "cornsilk" },
280 { RGB_TO_ULONG(255, 255, 240), "ivory" },
281 { RGB_TO_ULONG(255, 250, 205), "lemon chiffon" },
282 { RGB_TO_ULONG(255, 250, 205), "LemonChiffon" },
283 { RGB_TO_ULONG(255, 245, 238), "seashell" },
284 { RGB_TO_ULONG(240, 255, 240), "honeydew" },
285 { RGB_TO_ULONG(245, 255, 250), "mint cream" },
286 { RGB_TO_ULONG(245, 255, 250), "MintCream" },
287 { RGB_TO_ULONG(240, 255, 255), "azure" },
288 { RGB_TO_ULONG(240, 248, 255), "alice blue" },
289 { RGB_TO_ULONG(240, 248, 255), "AliceBlue" },
290 { RGB_TO_ULONG(230, 230, 250), "lavender" },
291 { RGB_TO_ULONG(255, 240, 245), "lavender blush" },
292 { RGB_TO_ULONG(255, 240, 245), "LavenderBlush" },
293 { RGB_TO_ULONG(255, 228, 225), "misty rose" },
294 { RGB_TO_ULONG(255, 228, 225), "MistyRose" },
295 { RGB_TO_ULONG(255, 255, 255), "white" },
296 { RGB_TO_ULONG(0 , 0 , 0 ), "black" },
297 { RGB_TO_ULONG(47 , 79 , 79 ), "dark slate gray" },
298 { RGB_TO_ULONG(47 , 79 , 79 ), "DarkSlateGray" },
299 { RGB_TO_ULONG(47 , 79 , 79 ), "dark slate grey" },
300 { RGB_TO_ULONG(47 , 79 , 79 ), "DarkSlateGrey" },
301 { RGB_TO_ULONG(105, 105, 105), "dim gray" },
302 { RGB_TO_ULONG(105, 105, 105), "DimGray" },
303 { RGB_TO_ULONG(105, 105, 105), "dim grey" },
304 { RGB_TO_ULONG(105, 105, 105), "DimGrey" },
305 { RGB_TO_ULONG(112, 128, 144), "slate gray" },
306 { RGB_TO_ULONG(112, 128, 144), "SlateGray" },
307 { RGB_TO_ULONG(112, 128, 144), "slate grey" },
308 { RGB_TO_ULONG(112, 128, 144), "SlateGrey" },
309 { RGB_TO_ULONG(119, 136, 153), "light slate gray" },
310 { RGB_TO_ULONG(119, 136, 153), "LightSlateGray" },
311 { RGB_TO_ULONG(119, 136, 153), "light slate grey" },
312 { RGB_TO_ULONG(119, 136, 153), "LightSlateGrey" },
313 { RGB_TO_ULONG(190, 190, 190), "gray" },
314 { RGB_TO_ULONG(190, 190, 190), "grey" },
315 { RGB_TO_ULONG(211, 211, 211), "light grey" },
316 { RGB_TO_ULONG(211, 211, 211), "LightGrey" },
317 { RGB_TO_ULONG(211, 211, 211), "light gray" },
318 { RGB_TO_ULONG(211, 211, 211), "LightGray" },
319 { RGB_TO_ULONG(25 , 25 , 112), "midnight blue" },
320 { RGB_TO_ULONG(25 , 25 , 112), "MidnightBlue" },
321 { RGB_TO_ULONG(0 , 0 , 128), "navy" },
322 { RGB_TO_ULONG(0 , 0 , 128), "navy blue" },
323 { RGB_TO_ULONG(0 , 0 , 128), "NavyBlue" },
324 { RGB_TO_ULONG(100, 149, 237), "cornflower blue" },
325 { RGB_TO_ULONG(100, 149, 237), "CornflowerBlue" },
326 { RGB_TO_ULONG(72 , 61 , 139), "dark slate blue" },
327 { RGB_TO_ULONG(72 , 61 , 139), "DarkSlateBlue" },
328 { RGB_TO_ULONG(106, 90 , 205), "slate blue" },
329 { RGB_TO_ULONG(106, 90 , 205), "SlateBlue" },
330 { RGB_TO_ULONG(123, 104, 238), "medium slate blue" },
331 { RGB_TO_ULONG(123, 104, 238), "MediumSlateBlue" },
332 { RGB_TO_ULONG(132, 112, 255), "light slate blue" },
333 { RGB_TO_ULONG(132, 112, 255), "LightSlateBlue" },
334 { RGB_TO_ULONG(0 , 0 , 205), "medium blue" },
335 { RGB_TO_ULONG(0 , 0 , 205), "MediumBlue" },
336 { RGB_TO_ULONG(65 , 105, 225), "royal blue" },
337 { RGB_TO_ULONG(65 , 105, 225), "RoyalBlue" },
338 { RGB_TO_ULONG(0 , 0 , 255), "blue" },
339 { RGB_TO_ULONG(30 , 144, 255), "dodger blue" },
340 { RGB_TO_ULONG(30 , 144, 255), "DodgerBlue" },
341 { RGB_TO_ULONG(0 , 191, 255), "deep sky blue" },
342 { RGB_TO_ULONG(0 , 191, 255), "DeepSkyBlue" },
343 { RGB_TO_ULONG(135, 206, 235), "sky blue" },
344 { RGB_TO_ULONG(135, 206, 235), "SkyBlue" },
345 { RGB_TO_ULONG(135, 206, 250), "light sky blue" },
346 { RGB_TO_ULONG(135, 206, 250), "LightSkyBlue" },
347 { RGB_TO_ULONG(70 , 130, 180), "steel blue" },
348 { RGB_TO_ULONG(70 , 130, 180), "SteelBlue" },
349 { RGB_TO_ULONG(176, 196, 222), "light steel blue" },
350 { RGB_TO_ULONG(176, 196, 222), "LightSteelBlue" },
351 { RGB_TO_ULONG(173, 216, 230), "light blue" },
352 { RGB_TO_ULONG(173, 216, 230), "LightBlue" },
353 { RGB_TO_ULONG(176, 224, 230), "powder blue" },
354 { RGB_TO_ULONG(176, 224, 230), "PowderBlue" },
355 { RGB_TO_ULONG(175, 238, 238), "pale turquoise" },
356 { RGB_TO_ULONG(175, 238, 238), "PaleTurquoise" },
357 { RGB_TO_ULONG(0 , 206, 209), "dark turquoise" },
358 { RGB_TO_ULONG(0 , 206, 209), "DarkTurquoise" },
359 { RGB_TO_ULONG(72 , 209, 204), "medium turquoise" },
360 { RGB_TO_ULONG(72 , 209, 204), "MediumTurquoise" },
361 { RGB_TO_ULONG(64 , 224, 208), "turquoise" },
362 { RGB_TO_ULONG(0 , 255, 255), "cyan" },
363 { RGB_TO_ULONG(224, 255, 255), "light cyan" },
364 { RGB_TO_ULONG(224, 255, 255), "LightCyan" },
365 { RGB_TO_ULONG(95 , 158, 160), "cadet blue" },
366 { RGB_TO_ULONG(95 , 158, 160), "CadetBlue" },
367 { RGB_TO_ULONG(102, 205, 170), "medium aquamarine" },
368 { RGB_TO_ULONG(102, 205, 170), "MediumAquamarine" },
369 { RGB_TO_ULONG(127, 255, 212), "aquamarine" },
370 { RGB_TO_ULONG(0 , 100, 0 ), "dark green" },
371 { RGB_TO_ULONG(0 , 100, 0 ), "DarkGreen" },
372 { RGB_TO_ULONG(85 , 107, 47 ), "dark olive green" },
373 { RGB_TO_ULONG(85 , 107, 47 ), "DarkOliveGreen" },
374 { RGB_TO_ULONG(143, 188, 143), "dark sea green" },
375 { RGB_TO_ULONG(143, 188, 143), "DarkSeaGreen" },
376 { RGB_TO_ULONG(46 , 139, 87 ), "sea green" },
377 { RGB_TO_ULONG(46 , 139, 87 ), "SeaGreen" },
378 { RGB_TO_ULONG(60 , 179, 113), "medium sea green" },
379 { RGB_TO_ULONG(60 , 179, 113), "MediumSeaGreen" },
380 { RGB_TO_ULONG(32 , 178, 170), "light sea green" },
381 { RGB_TO_ULONG(32 , 178, 170), "LightSeaGreen" },
382 { RGB_TO_ULONG(152, 251, 152), "pale green" },
383 { RGB_TO_ULONG(152, 251, 152), "PaleGreen" },
384 { RGB_TO_ULONG(0 , 255, 127), "spring green" },
385 { RGB_TO_ULONG(0 , 255, 127), "SpringGreen" },
386 { RGB_TO_ULONG(124, 252, 0 ), "lawn green" },
387 { RGB_TO_ULONG(124, 252, 0 ), "LawnGreen" },
388 { RGB_TO_ULONG(0 , 255, 0 ), "green" },
389 { RGB_TO_ULONG(127, 255, 0 ), "chartreuse" },
390 { RGB_TO_ULONG(0 , 250, 154), "medium spring green" },
391 { RGB_TO_ULONG(0 , 250, 154), "MediumSpringGreen" },
392 { RGB_TO_ULONG(173, 255, 47 ), "green yellow" },
393 { RGB_TO_ULONG(173, 255, 47 ), "GreenYellow" },
394 { RGB_TO_ULONG(50 , 205, 50 ), "lime green" },
395 { RGB_TO_ULONG(50 , 205, 50 ), "LimeGreen" },
396 { RGB_TO_ULONG(154, 205, 50 ), "yellow green" },
397 { RGB_TO_ULONG(154, 205, 50 ), "YellowGreen" },
398 { RGB_TO_ULONG(34 , 139, 34 ), "forest green" },
399 { RGB_TO_ULONG(34 , 139, 34 ), "ForestGreen" },
400 { RGB_TO_ULONG(107, 142, 35 ), "olive drab" },
401 { RGB_TO_ULONG(107, 142, 35 ), "OliveDrab" },
402 { RGB_TO_ULONG(189, 183, 107), "dark khaki" },
403 { RGB_TO_ULONG(189, 183, 107), "DarkKhaki" },
404 { RGB_TO_ULONG(240, 230, 140), "khaki" },
405 { RGB_TO_ULONG(238, 232, 170), "pale goldenrod" },
406 { RGB_TO_ULONG(238, 232, 170), "PaleGoldenrod" },
407 { RGB_TO_ULONG(250, 250, 210), "light goldenrod yellow" },
408 { RGB_TO_ULONG(250, 250, 210), "LightGoldenrodYellow" },
409 { RGB_TO_ULONG(255, 255, 224), "light yellow" },
410 { RGB_TO_ULONG(255, 255, 224), "LightYellow" },
411 { RGB_TO_ULONG(255, 255, 0 ), "yellow" },
412 { RGB_TO_ULONG(255, 215, 0 ), "gold" },
413 { RGB_TO_ULONG(238, 221, 130), "light goldenrod" },
414 { RGB_TO_ULONG(238, 221, 130), "LightGoldenrod" },
415 { RGB_TO_ULONG(218, 165, 32 ), "goldenrod" },
416 { RGB_TO_ULONG(184, 134, 11 ), "dark goldenrod" },
417 { RGB_TO_ULONG(184, 134, 11 ), "DarkGoldenrod" },
418 { RGB_TO_ULONG(188, 143, 143), "rosy brown" },
419 { RGB_TO_ULONG(188, 143, 143), "RosyBrown" },
420 { RGB_TO_ULONG(205, 92 , 92 ), "indian red" },
421 { RGB_TO_ULONG(205, 92 , 92 ), "IndianRed" },
422 { RGB_TO_ULONG(139, 69 , 19 ), "saddle brown" },
423 { RGB_TO_ULONG(139, 69 , 19 ), "SaddleBrown" },
424 { RGB_TO_ULONG(160, 82 , 45 ), "sienna" },
425 { RGB_TO_ULONG(205, 133, 63 ), "peru" },
426 { RGB_TO_ULONG(222, 184, 135), "burlywood" },
427 { RGB_TO_ULONG(245, 245, 220), "beige" },
428 { RGB_TO_ULONG(245, 222, 179), "wheat" },
429 { RGB_TO_ULONG(244, 164, 96 ), "sandy brown" },
430 { RGB_TO_ULONG(244, 164, 96 ), "SandyBrown" },
431 { RGB_TO_ULONG(210, 180, 140), "tan" },
432 { RGB_TO_ULONG(210, 105, 30 ), "chocolate" },
433 { RGB_TO_ULONG(178, 34 , 34 ), "firebrick" },
434 { RGB_TO_ULONG(165, 42 , 42 ), "brown" },
435 { RGB_TO_ULONG(233, 150, 122), "dark salmon" },
436 { RGB_TO_ULONG(233, 150, 122), "DarkSalmon" },
437 { RGB_TO_ULONG(250, 128, 114), "salmon" },
438 { RGB_TO_ULONG(255, 160, 122), "light salmon" },
439 { RGB_TO_ULONG(255, 160, 122), "LightSalmon" },
440 { RGB_TO_ULONG(255, 165, 0 ), "orange" },
441 { RGB_TO_ULONG(255, 140, 0 ), "dark orange" },
442 { RGB_TO_ULONG(255, 140, 0 ), "DarkOrange" },
443 { RGB_TO_ULONG(255, 127, 80 ), "coral" },
444 { RGB_TO_ULONG(240, 128, 128), "light coral" },
445 { RGB_TO_ULONG(240, 128, 128), "LightCoral" },
446 { RGB_TO_ULONG(255, 99 , 71 ), "tomato" },
447 { RGB_TO_ULONG(255, 69 , 0 ), "orange red" },
448 { RGB_TO_ULONG(255, 69 , 0 ), "OrangeRed" },
449 { RGB_TO_ULONG(255, 0 , 0 ), "red" },
450 { RGB_TO_ULONG(255, 105, 180), "hot pink" },
451 { RGB_TO_ULONG(255, 105, 180), "HotPink" },
452 { RGB_TO_ULONG(255, 20 , 147), "deep pink" },
453 { RGB_TO_ULONG(255, 20 , 147), "DeepPink" },
454 { RGB_TO_ULONG(255, 192, 203), "pink" },
455 { RGB_TO_ULONG(255, 182, 193), "light pink" },
456 { RGB_TO_ULONG(255, 182, 193), "LightPink" },
457 { RGB_TO_ULONG(219, 112, 147), "pale violet red" },
458 { RGB_TO_ULONG(219, 112, 147), "PaleVioletRed" },
459 { RGB_TO_ULONG(176, 48 , 96 ), "maroon" },
460 { RGB_TO_ULONG(199, 21 , 133), "medium violet red" },
461 { RGB_TO_ULONG(199, 21 , 133), "MediumVioletRed" },
462 { RGB_TO_ULONG(208, 32 , 144), "violet red" },
463 { RGB_TO_ULONG(208, 32 , 144), "VioletRed" },
464 { RGB_TO_ULONG(255, 0 , 255), "magenta" },
465 { RGB_TO_ULONG(238, 130, 238), "violet" },
466 { RGB_TO_ULONG(221, 160, 221), "plum" },
467 { RGB_TO_ULONG(218, 112, 214), "orchid" },
468 { RGB_TO_ULONG(186, 85 , 211), "medium orchid" },
469 { RGB_TO_ULONG(186, 85 , 211), "MediumOrchid" },
470 { RGB_TO_ULONG(153, 50 , 204), "dark orchid" },
471 { RGB_TO_ULONG(153, 50 , 204), "DarkOrchid" },
472 { RGB_TO_ULONG(148, 0 , 211), "dark violet" },
473 { RGB_TO_ULONG(148, 0 , 211), "DarkViolet" },
474 { RGB_TO_ULONG(138, 43 , 226), "blue violet" },
475 { RGB_TO_ULONG(138, 43 , 226), "BlueViolet" },
476 { RGB_TO_ULONG(160, 32 , 240), "purple" },
477 { RGB_TO_ULONG(147, 112, 219), "medium purple" },
478 { RGB_TO_ULONG(147, 112, 219), "MediumPurple" },
479 { RGB_TO_ULONG(216, 191, 216), "thistle" },
480 { RGB_TO_ULONG(255, 250, 250), "snow1" },
481 { RGB_TO_ULONG(238, 233, 233), "snow2" },
482 { RGB_TO_ULONG(205, 201, 201), "snow3" },
483 { RGB_TO_ULONG(139, 137, 137), "snow4" },
484 { RGB_TO_ULONG(255, 245, 238), "seashell1" },
485 { RGB_TO_ULONG(238, 229, 222), "seashell2" },
486 { RGB_TO_ULONG(205, 197, 191), "seashell3" },
487 { RGB_TO_ULONG(139, 134, 130), "seashell4" },
488 { RGB_TO_ULONG(255, 239, 219), "AntiqueWhite1" },
489 { RGB_TO_ULONG(238, 223, 204), "AntiqueWhite2" },
490 { RGB_TO_ULONG(205, 192, 176), "AntiqueWhite3" },
491 { RGB_TO_ULONG(139, 131, 120), "AntiqueWhite4" },
492 { RGB_TO_ULONG(255, 228, 196), "bisque1" },
493 { RGB_TO_ULONG(238, 213, 183), "bisque2" },
494 { RGB_TO_ULONG(205, 183, 158), "bisque3" },
495 { RGB_TO_ULONG(139, 125, 107), "bisque4" },
496 { RGB_TO_ULONG(255, 218, 185), "PeachPuff1" },
497 { RGB_TO_ULONG(238, 203, 173), "PeachPuff2" },
498 { RGB_TO_ULONG(205, 175, 149), "PeachPuff3" },
499 { RGB_TO_ULONG(139, 119, 101), "PeachPuff4" },
500 { RGB_TO_ULONG(255, 222, 173), "NavajoWhite1" },
501 { RGB_TO_ULONG(238, 207, 161), "NavajoWhite2" },
502 { RGB_TO_ULONG(205, 179, 139), "NavajoWhite3" },
503 { RGB_TO_ULONG(139, 121, 94), "NavajoWhite4" },
504 { RGB_TO_ULONG(255, 250, 205), "LemonChiffon1" },
505 { RGB_TO_ULONG(238, 233, 191), "LemonChiffon2" },
506 { RGB_TO_ULONG(205, 201, 165), "LemonChiffon3" },
507 { RGB_TO_ULONG(139, 137, 112), "LemonChiffon4" },
508 { RGB_TO_ULONG(255, 248, 220), "cornsilk1" },
509 { RGB_TO_ULONG(238, 232, 205), "cornsilk2" },
510 { RGB_TO_ULONG(205, 200, 177), "cornsilk3" },
511 { RGB_TO_ULONG(139, 136, 120), "cornsilk4" },
512 { RGB_TO_ULONG(255, 255, 240), "ivory1" },
513 { RGB_TO_ULONG(238, 238, 224), "ivory2" },
514 { RGB_TO_ULONG(205, 205, 193), "ivory3" },
515 { RGB_TO_ULONG(139, 139, 131), "ivory4" },
516 { RGB_TO_ULONG(240, 255, 240), "honeydew1" },
517 { RGB_TO_ULONG(224, 238, 224), "honeydew2" },
518 { RGB_TO_ULONG(193, 205, 193), "honeydew3" },
519 { RGB_TO_ULONG(131, 139, 131), "honeydew4" },
520 { RGB_TO_ULONG(255, 240, 245), "LavenderBlush1" },
521 { RGB_TO_ULONG(238, 224, 229), "LavenderBlush2" },
522 { RGB_TO_ULONG(205, 193, 197), "LavenderBlush3" },
523 { RGB_TO_ULONG(139, 131, 134), "LavenderBlush4" },
524 { RGB_TO_ULONG(255, 228, 225), "MistyRose1" },
525 { RGB_TO_ULONG(238, 213, 210), "MistyRose2" },
526 { RGB_TO_ULONG(205, 183, 181), "MistyRose3" },
527 { RGB_TO_ULONG(139, 125, 123), "MistyRose4" },
528 { RGB_TO_ULONG(240, 255, 255), "azure1" },
529 { RGB_TO_ULONG(224, 238, 238), "azure2" },
530 { RGB_TO_ULONG(193, 205, 205), "azure3" },
531 { RGB_TO_ULONG(131, 139, 139), "azure4" },
532 { RGB_TO_ULONG(131, 111, 255), "SlateBlue1" },
533 { RGB_TO_ULONG(122, 103, 238), "SlateBlue2" },
534 { RGB_TO_ULONG(105, 89 , 205), "SlateBlue3" },
535 { RGB_TO_ULONG(71 , 60 , 139), "SlateBlue4" },
536 { RGB_TO_ULONG(72 , 118, 255), "RoyalBlue1" },
537 { RGB_TO_ULONG(67 , 110, 238), "RoyalBlue2" },
538 { RGB_TO_ULONG(58 , 95 , 205), "RoyalBlue3" },
539 { RGB_TO_ULONG(39 , 64 , 139), "RoyalBlue4" },
540 { RGB_TO_ULONG(0 , 0 , 255), "blue1" },
541 { RGB_TO_ULONG(0 , 0 , 238), "blue2" },
542 { RGB_TO_ULONG(0 , 0 , 205), "blue3" },
543 { RGB_TO_ULONG(0 , 0 , 139), "blue4" },
544 { RGB_TO_ULONG(30 , 144, 255), "DodgerBlue1" },
545 { RGB_TO_ULONG(28 , 134, 238), "DodgerBlue2" },
546 { RGB_TO_ULONG(24 , 116, 205), "DodgerBlue3" },
547 { RGB_TO_ULONG(16 , 78 , 139), "DodgerBlue4" },
548 { RGB_TO_ULONG(99 , 184, 255), "SteelBlue1" },
549 { RGB_TO_ULONG(92 , 172, 238), "SteelBlue2" },
550 { RGB_TO_ULONG(79 , 148, 205), "SteelBlue3" },
551 { RGB_TO_ULONG(54 , 100, 139), "SteelBlue4" },
552 { RGB_TO_ULONG(0 , 191, 255), "DeepSkyBlue1" },
553 { RGB_TO_ULONG(0 , 178, 238), "DeepSkyBlue2" },
554 { RGB_TO_ULONG(0 , 154, 205), "DeepSkyBlue3" },
555 { RGB_TO_ULONG(0 , 104, 139), "DeepSkyBlue4" },
556 { RGB_TO_ULONG(135, 206, 255), "SkyBlue1" },
557 { RGB_TO_ULONG(126, 192, 238), "SkyBlue2" },
558 { RGB_TO_ULONG(108, 166, 205), "SkyBlue3" },
559 { RGB_TO_ULONG(74 , 112, 139), "SkyBlue4" },
560 { RGB_TO_ULONG(176, 226, 255), "LightSkyBlue1" },
561 { RGB_TO_ULONG(164, 211, 238), "LightSkyBlue2" },
562 { RGB_TO_ULONG(141, 182, 205), "LightSkyBlue3" },
563 { RGB_TO_ULONG(96 , 123, 139), "LightSkyBlue4" },
564 { RGB_TO_ULONG(198, 226, 255), "SlateGray1" },
565 { RGB_TO_ULONG(185, 211, 238), "SlateGray2" },
566 { RGB_TO_ULONG(159, 182, 205), "SlateGray3" },
567 { RGB_TO_ULONG(108, 123, 139), "SlateGray4" },
568 { RGB_TO_ULONG(202, 225, 255), "LightSteelBlue1" },
569 { RGB_TO_ULONG(188, 210, 238), "LightSteelBlue2" },
570 { RGB_TO_ULONG(162, 181, 205), "LightSteelBlue3" },
571 { RGB_TO_ULONG(110, 123, 139), "LightSteelBlue4" },
572 { RGB_TO_ULONG(191, 239, 255), "LightBlue1" },
573 { RGB_TO_ULONG(178, 223, 238), "LightBlue2" },
574 { RGB_TO_ULONG(154, 192, 205), "LightBlue3" },
575 { RGB_TO_ULONG(104, 131, 139), "LightBlue4" },
576 { RGB_TO_ULONG(224, 255, 255), "LightCyan1" },
577 { RGB_TO_ULONG(209, 238, 238), "LightCyan2" },
578 { RGB_TO_ULONG(180, 205, 205), "LightCyan3" },
579 { RGB_TO_ULONG(122, 139, 139), "LightCyan4" },
580 { RGB_TO_ULONG(187, 255, 255), "PaleTurquoise1" },
581 { RGB_TO_ULONG(174, 238, 238), "PaleTurquoise2" },
582 { RGB_TO_ULONG(150, 205, 205), "PaleTurquoise3" },
583 { RGB_TO_ULONG(102, 139, 139), "PaleTurquoise4" },
584 { RGB_TO_ULONG(152, 245, 255), "CadetBlue1" },
585 { RGB_TO_ULONG(142, 229, 238), "CadetBlue2" },
586 { RGB_TO_ULONG(122, 197, 205), "CadetBlue3" },
587 { RGB_TO_ULONG(83 , 134, 139), "CadetBlue4" },
588 { RGB_TO_ULONG(0 , 245, 255), "turquoise1" },
589 { RGB_TO_ULONG(0 , 229, 238), "turquoise2" },
590 { RGB_TO_ULONG(0 , 197, 205), "turquoise3" },
591 { RGB_TO_ULONG(0 , 134, 139), "turquoise4" },
592 { RGB_TO_ULONG(0 , 255, 255), "cyan1" },
593 { RGB_TO_ULONG(0 , 238, 238), "cyan2" },
594 { RGB_TO_ULONG(0 , 205, 205), "cyan3" },
595 { RGB_TO_ULONG(0 , 139, 139), "cyan4" },
596 { RGB_TO_ULONG(151, 255, 255), "DarkSlateGray1" },
597 { RGB_TO_ULONG(141, 238, 238), "DarkSlateGray2" },
598 { RGB_TO_ULONG(121, 205, 205), "DarkSlateGray3" },
599 { RGB_TO_ULONG(82 , 139, 139), "DarkSlateGray4" },
600 { RGB_TO_ULONG(127, 255, 212), "aquamarine1" },
601 { RGB_TO_ULONG(118, 238, 198), "aquamarine2" },
602 { RGB_TO_ULONG(102, 205, 170), "aquamarine3" },
603 { RGB_TO_ULONG(69 , 139, 116), "aquamarine4" },
604 { RGB_TO_ULONG(193, 255, 193), "DarkSeaGreen1" },
605 { RGB_TO_ULONG(180, 238, 180), "DarkSeaGreen2" },
606 { RGB_TO_ULONG(155, 205, 155), "DarkSeaGreen3" },
607 { RGB_TO_ULONG(105, 139, 105), "DarkSeaGreen4" },
608 { RGB_TO_ULONG(84 , 255, 159), "SeaGreen1" },
609 { RGB_TO_ULONG(78 , 238, 148), "SeaGreen2" },
610 { RGB_TO_ULONG(67 , 205, 128), "SeaGreen3" },
611 { RGB_TO_ULONG(46 , 139, 87 ), "SeaGreen4" },
612 { RGB_TO_ULONG(154, 255, 154), "PaleGreen1" },
613 { RGB_TO_ULONG(144, 238, 144), "PaleGreen2" },
614 { RGB_TO_ULONG(124, 205, 124), "PaleGreen3" },
615 { RGB_TO_ULONG(84 , 139, 84 ), "PaleGreen4" },
616 { RGB_TO_ULONG(0 , 255, 127), "SpringGreen1" },
617 { RGB_TO_ULONG(0 , 238, 118), "SpringGreen2" },
618 { RGB_TO_ULONG(0 , 205, 102), "SpringGreen3" },
619 { RGB_TO_ULONG(0 , 139, 69 ), "SpringGreen4" },
620 { RGB_TO_ULONG(0 , 255, 0 ), "green1" },
621 { RGB_TO_ULONG(0 , 238, 0 ), "green2" },
622 { RGB_TO_ULONG(0 , 205, 0 ), "green3" },
623 { RGB_TO_ULONG(0 , 139, 0 ), "green4" },
624 { RGB_TO_ULONG(127, 255, 0 ), "chartreuse1" },
625 { RGB_TO_ULONG(118, 238, 0 ), "chartreuse2" },
626 { RGB_TO_ULONG(102, 205, 0 ), "chartreuse3" },
627 { RGB_TO_ULONG(69 , 139, 0 ), "chartreuse4" },
628 { RGB_TO_ULONG(192, 255, 62 ), "OliveDrab1" },
629 { RGB_TO_ULONG(179, 238, 58 ), "OliveDrab2" },
630 { RGB_TO_ULONG(154, 205, 50 ), "OliveDrab3" },
631 { RGB_TO_ULONG(105, 139, 34 ), "OliveDrab4" },
632 { RGB_TO_ULONG(202, 255, 112), "DarkOliveGreen1" },
633 { RGB_TO_ULONG(188, 238, 104), "DarkOliveGreen2" },
634 { RGB_TO_ULONG(162, 205, 90 ), "DarkOliveGreen3" },
635 { RGB_TO_ULONG(110, 139, 61 ), "DarkOliveGreen4" },
636 { RGB_TO_ULONG(255, 246, 143), "khaki1" },
637 { RGB_TO_ULONG(238, 230, 133), "khaki2" },
638 { RGB_TO_ULONG(205, 198, 115), "khaki3" },
639 { RGB_TO_ULONG(139, 134, 78 ), "khaki4" },
640 { RGB_TO_ULONG(255, 236, 139), "LightGoldenrod1" },
641 { RGB_TO_ULONG(238, 220, 130), "LightGoldenrod2" },
642 { RGB_TO_ULONG(205, 190, 112), "LightGoldenrod3" },
643 { RGB_TO_ULONG(139, 129, 76 ), "LightGoldenrod4" },
644 { RGB_TO_ULONG(255, 255, 224), "LightYellow1" },
645 { RGB_TO_ULONG(238, 238, 209), "LightYellow2" },
646 { RGB_TO_ULONG(205, 205, 180), "LightYellow3" },
647 { RGB_TO_ULONG(139, 139, 122), "LightYellow4" },
648 { RGB_TO_ULONG(255, 255, 0 ), "yellow1" },
649 { RGB_TO_ULONG(238, 238, 0 ), "yellow2" },
650 { RGB_TO_ULONG(205, 205, 0 ), "yellow3" },
651 { RGB_TO_ULONG(139, 139, 0 ), "yellow4" },
652 { RGB_TO_ULONG(255, 215, 0 ), "gold1" },
653 { RGB_TO_ULONG(238, 201, 0 ), "gold2" },
654 { RGB_TO_ULONG(205, 173, 0 ), "gold3" },
655 { RGB_TO_ULONG(139, 117, 0 ), "gold4" },
656 { RGB_TO_ULONG(255, 193, 37 ), "goldenrod1" },
657 { RGB_TO_ULONG(238, 180, 34 ), "goldenrod2" },
658 { RGB_TO_ULONG(205, 155, 29 ), "goldenrod3" },
659 { RGB_TO_ULONG(139, 105, 20 ), "goldenrod4" },
660 { RGB_TO_ULONG(255, 185, 15 ), "DarkGoldenrod1" },
661 { RGB_TO_ULONG(238, 173, 14 ), "DarkGoldenrod2" },
662 { RGB_TO_ULONG(205, 149, 12 ), "DarkGoldenrod3" },
663 { RGB_TO_ULONG(139, 101, 8 ), "DarkGoldenrod4" },
664 { RGB_TO_ULONG(255, 193, 193), "RosyBrown1" },
665 { RGB_TO_ULONG(238, 180, 180), "RosyBrown2" },
666 { RGB_TO_ULONG(205, 155, 155), "RosyBrown3" },
667 { RGB_TO_ULONG(139, 105, 105), "RosyBrown4" },
668 { RGB_TO_ULONG(255, 106, 106), "IndianRed1" },
669 { RGB_TO_ULONG(238, 99 , 99 ), "IndianRed2" },
670 { RGB_TO_ULONG(205, 85 , 85 ), "IndianRed3" },
671 { RGB_TO_ULONG(139, 58 , 58 ), "IndianRed4" },
672 { RGB_TO_ULONG(255, 130, 71 ), "sienna1" },
673 { RGB_TO_ULONG(238, 121, 66 ), "sienna2" },
674 { RGB_TO_ULONG(205, 104, 57 ), "sienna3" },
675 { RGB_TO_ULONG(139, 71 , 38 ), "sienna4" },
676 { RGB_TO_ULONG(255, 211, 155), "burlywood1" },
677 { RGB_TO_ULONG(238, 197, 145), "burlywood2" },
678 { RGB_TO_ULONG(205, 170, 125), "burlywood3" },
679 { RGB_TO_ULONG(139, 115, 85 ), "burlywood4" },
680 { RGB_TO_ULONG(255, 231, 186), "wheat1" },
681 { RGB_TO_ULONG(238, 216, 174), "wheat2" },
682 { RGB_TO_ULONG(205, 186, 150), "wheat3" },
683 { RGB_TO_ULONG(139, 126, 102), "wheat4" },
684 { RGB_TO_ULONG(255, 165, 79 ), "tan1" },
685 { RGB_TO_ULONG(238, 154, 73 ), "tan2" },
686 { RGB_TO_ULONG(205, 133, 63 ), "tan3" },
687 { RGB_TO_ULONG(139, 90 , 43 ), "tan4" },
688 { RGB_TO_ULONG(255, 127, 36 ), "chocolate1" },
689 { RGB_TO_ULONG(238, 118, 33 ), "chocolate2" },
690 { RGB_TO_ULONG(205, 102, 29 ), "chocolate3" },
691 { RGB_TO_ULONG(139, 69 , 19 ), "chocolate4" },
692 { RGB_TO_ULONG(255, 48 , 48 ), "firebrick1" },
693 { RGB_TO_ULONG(238, 44 , 44 ), "firebrick2" },
694 { RGB_TO_ULONG(205, 38 , 38 ), "firebrick3" },
695 { RGB_TO_ULONG(139, 26 , 26 ), "firebrick4" },
696 { RGB_TO_ULONG(255, 64 , 64 ), "brown1" },
697 { RGB_TO_ULONG(238, 59 , 59 ), "brown2" },
698 { RGB_TO_ULONG(205, 51 , 51 ), "brown3" },
699 { RGB_TO_ULONG(139, 35 , 35 ), "brown4" },
700 { RGB_TO_ULONG(255, 140, 105), "salmon1" },
701 { RGB_TO_ULONG(238, 130, 98 ), "salmon2" },
702 { RGB_TO_ULONG(205, 112, 84 ), "salmon3" },
703 { RGB_TO_ULONG(139, 76 , 57 ), "salmon4" },
704 { RGB_TO_ULONG(255, 160, 122), "LightSalmon1" },
705 { RGB_TO_ULONG(238, 149, 114), "LightSalmon2" },
706 { RGB_TO_ULONG(205, 129, 98 ), "LightSalmon3" },
707 { RGB_TO_ULONG(139, 87 , 66 ), "LightSalmon4" },
708 { RGB_TO_ULONG(255, 165, 0 ), "orange1" },
709 { RGB_TO_ULONG(238, 154, 0 ), "orange2" },
710 { RGB_TO_ULONG(205, 133, 0 ), "orange3" },
711 { RGB_TO_ULONG(139, 90 , 0 ), "orange4" },
712 { RGB_TO_ULONG(255, 127, 0 ), "DarkOrange1" },
713 { RGB_TO_ULONG(238, 118, 0 ), "DarkOrange2" },
714 { RGB_TO_ULONG(205, 102, 0 ), "DarkOrange3" },
715 { RGB_TO_ULONG(139, 69 , 0 ), "DarkOrange4" },
716 { RGB_TO_ULONG(255, 114, 86 ), "coral1" },
717 { RGB_TO_ULONG(238, 106, 80 ), "coral2" },
718 { RGB_TO_ULONG(205, 91 , 69 ), "coral3" },
719 { RGB_TO_ULONG(139, 62 , 47 ), "coral4" },
720 { RGB_TO_ULONG(255, 99 , 71 ), "tomato1" },
721 { RGB_TO_ULONG(238, 92 , 66 ), "tomato2" },
722 { RGB_TO_ULONG(205, 79 , 57 ), "tomato3" },
723 { RGB_TO_ULONG(139, 54 , 38 ), "tomato4" },
724 { RGB_TO_ULONG(255, 69 , 0 ), "OrangeRed1" },
725 { RGB_TO_ULONG(238, 64 , 0 ), "OrangeRed2" },
726 { RGB_TO_ULONG(205, 55 , 0 ), "OrangeRed3" },
727 { RGB_TO_ULONG(139, 37 , 0 ), "OrangeRed4" },
728 { RGB_TO_ULONG(255, 0 , 0 ), "red1" },
729 { RGB_TO_ULONG(238, 0 , 0 ), "red2" },
730 { RGB_TO_ULONG(205, 0 , 0 ), "red3" },
731 { RGB_TO_ULONG(139, 0 , 0 ), "red4" },
732 { RGB_TO_ULONG(255, 20 , 147), "DeepPink1" },
733 { RGB_TO_ULONG(238, 18 , 137), "DeepPink2" },
734 { RGB_TO_ULONG(205, 16 , 118), "DeepPink3" },
735 { RGB_TO_ULONG(139, 10 , 80 ), "DeepPink4" },
736 { RGB_TO_ULONG(255, 110, 180), "HotPink1" },
737 { RGB_TO_ULONG(238, 106, 167), "HotPink2" },
738 { RGB_TO_ULONG(205, 96 , 144), "HotPink3" },
739 { RGB_TO_ULONG(139, 58 , 98 ), "HotPink4" },
740 { RGB_TO_ULONG(255, 181, 197), "pink1" },
741 { RGB_TO_ULONG(238, 169, 184), "pink2" },
742 { RGB_TO_ULONG(205, 145, 158), "pink3" },
743 { RGB_TO_ULONG(139, 99 , 108), "pink4" },
744 { RGB_TO_ULONG(255, 174, 185), "LightPink1" },
745 { RGB_TO_ULONG(238, 162, 173), "LightPink2" },
746 { RGB_TO_ULONG(205, 140, 149), "LightPink3" },
747 { RGB_TO_ULONG(139, 95 , 101), "LightPink4" },
748 { RGB_TO_ULONG(255, 130, 171), "PaleVioletRed1" },
749 { RGB_TO_ULONG(238, 121, 159), "PaleVioletRed2" },
750 { RGB_TO_ULONG(205, 104, 137), "PaleVioletRed3" },
751 { RGB_TO_ULONG(139, 71 , 93 ), "PaleVioletRed4" },
752 { RGB_TO_ULONG(255, 52 , 179), "maroon1" },
753 { RGB_TO_ULONG(238, 48 , 167), "maroon2" },
754 { RGB_TO_ULONG(205, 41 , 144), "maroon3" },
755 { RGB_TO_ULONG(139, 28 , 98 ), "maroon4" },
756 { RGB_TO_ULONG(255, 62 , 150), "VioletRed1" },
757 { RGB_TO_ULONG(238, 58 , 140), "VioletRed2" },
758 { RGB_TO_ULONG(205, 50 , 120), "VioletRed3" },
759 { RGB_TO_ULONG(139, 34 , 82 ), "VioletRed4" },
760 { RGB_TO_ULONG(255, 0 , 255), "magenta1" },
761 { RGB_TO_ULONG(238, 0 , 238), "magenta2" },
762 { RGB_TO_ULONG(205, 0 , 205), "magenta3" },
763 { RGB_TO_ULONG(139, 0 , 139), "magenta4" },
764 { RGB_TO_ULONG(255, 131, 250), "orchid1" },
765 { RGB_TO_ULONG(238, 122, 233), "orchid2" },
766 { RGB_TO_ULONG(205, 105, 201), "orchid3" },
767 { RGB_TO_ULONG(139, 71 , 137), "orchid4" },
768 { RGB_TO_ULONG(255, 187, 255), "plum1" },
769 { RGB_TO_ULONG(238, 174, 238), "plum2" },
770 { RGB_TO_ULONG(205, 150, 205), "plum3" },
771 { RGB_TO_ULONG(139, 102, 139), "plum4" },
772 { RGB_TO_ULONG(224, 102, 255), "MediumOrchid1" },
773 { RGB_TO_ULONG(209, 95 , 238), "MediumOrchid2" },
774 { RGB_TO_ULONG(180, 82 , 205), "MediumOrchid3" },
775 { RGB_TO_ULONG(122, 55 , 139), "MediumOrchid4" },
776 { RGB_TO_ULONG(191, 62 , 255), "DarkOrchid1" },
777 { RGB_TO_ULONG(178, 58 , 238), "DarkOrchid2" },
778 { RGB_TO_ULONG(154, 50 , 205), "DarkOrchid3" },
779 { RGB_TO_ULONG(104, 34 , 139), "DarkOrchid4" },
780 { RGB_TO_ULONG(155, 48 , 255), "purple1" },
781 { RGB_TO_ULONG(145, 44 , 238), "purple2" },
782 { RGB_TO_ULONG(125, 38 , 205), "purple3" },
783 { RGB_TO_ULONG(85 , 26 , 139), "purple4" },
784 { RGB_TO_ULONG(171, 130, 255), "MediumPurple1" },
785 { RGB_TO_ULONG(159, 121, 238), "MediumPurple2" },
786 { RGB_TO_ULONG(137, 104, 205), "MediumPurple3" },
787 { RGB_TO_ULONG(93 , 71 , 139), "MediumPurple4" },
788 { RGB_TO_ULONG(255, 225, 255), "thistle1" },
789 { RGB_TO_ULONG(238, 210, 238), "thistle2" },
790 { RGB_TO_ULONG(205, 181, 205), "thistle3" },
791 { RGB_TO_ULONG(139, 123, 139), "thistle4" },
792 { RGB_TO_ULONG(0 , 0 , 0 ), "gray0" },
793 { RGB_TO_ULONG(0 , 0 , 0 ), "grey0" },
794 { RGB_TO_ULONG(3 , 3 , 3 ), "gray1" },
795 { RGB_TO_ULONG(3 , 3 , 3 ), "grey1" },
796 { RGB_TO_ULONG(5 , 5 , 5 ), "gray2" },
797 { RGB_TO_ULONG(5 , 5 , 5 ), "grey2" },
798 { RGB_TO_ULONG(8 , 8 , 8 ), "gray3" },
799 { RGB_TO_ULONG(8 , 8 , 8 ), "grey3" },
800 { RGB_TO_ULONG(10 , 10 , 10 ), "gray4" },
801 { RGB_TO_ULONG(10 , 10 , 10 ), "grey4" },
802 { RGB_TO_ULONG(13 , 13 , 13 ), "gray5" },
803 { RGB_TO_ULONG(13 , 13 , 13 ), "grey5" },
804 { RGB_TO_ULONG(15 , 15 , 15 ), "gray6" },
805 { RGB_TO_ULONG(15 , 15 , 15 ), "grey6" },
806 { RGB_TO_ULONG(18 , 18 , 18 ), "gray7" },
807 { RGB_TO_ULONG(18 , 18 , 18 ), "grey7" },
808 { RGB_TO_ULONG(20 , 20 , 20 ), "gray8" },
809 { RGB_TO_ULONG(20 , 20 , 20 ), "grey8" },
810 { RGB_TO_ULONG(23 , 23 , 23 ), "gray9" },
811 { RGB_TO_ULONG(23 , 23 , 23 ), "grey9" },
812 { RGB_TO_ULONG(26 , 26 , 26 ), "gray10" },
813 { RGB_TO_ULONG(26 , 26 , 26 ), "grey10" },
814 { RGB_TO_ULONG(28 , 28 , 28 ), "gray11" },
815 { RGB_TO_ULONG(28 , 28 , 28 ), "grey11" },
816 { RGB_TO_ULONG(31 , 31 , 31 ), "gray12" },
817 { RGB_TO_ULONG(31 , 31 , 31 ), "grey12" },
818 { RGB_TO_ULONG(33 , 33 , 33 ), "gray13" },
819 { RGB_TO_ULONG(33 , 33 , 33 ), "grey13" },
820 { RGB_TO_ULONG(36 , 36 , 36 ), "gray14" },
821 { RGB_TO_ULONG(36 , 36 , 36 ), "grey14" },
822 { RGB_TO_ULONG(38 , 38 , 38 ), "gray15" },
823 { RGB_TO_ULONG(38 , 38 , 38 ), "grey15" },
824 { RGB_TO_ULONG(41 , 41 , 41 ), "gray16" },
825 { RGB_TO_ULONG(41 , 41 , 41 ), "grey16" },
826 { RGB_TO_ULONG(43 , 43 , 43 ), "gray17" },
827 { RGB_TO_ULONG(43 , 43 , 43 ), "grey17" },
828 { RGB_TO_ULONG(46 , 46 , 46 ), "gray18" },
829 { RGB_TO_ULONG(46 , 46 , 46 ), "grey18" },
830 { RGB_TO_ULONG(48 , 48 , 48 ), "gray19" },
831 { RGB_TO_ULONG(48 , 48 , 48 ), "grey19" },
832 { RGB_TO_ULONG(51 , 51 , 51 ), "gray20" },
833 { RGB_TO_ULONG(51 , 51 , 51 ), "grey20" },
834 { RGB_TO_ULONG(54 , 54 , 54 ), "gray21" },
835 { RGB_TO_ULONG(54 , 54 , 54 ), "grey21" },
836 { RGB_TO_ULONG(56 , 56 , 56 ), "gray22" },
837 { RGB_TO_ULONG(56 , 56 , 56 ), "grey22" },
838 { RGB_TO_ULONG(59 , 59 , 59 ), "gray23" },
839 { RGB_TO_ULONG(59 , 59 , 59 ), "grey23" },
840 { RGB_TO_ULONG(61 , 61 , 61 ), "gray24" },
841 { RGB_TO_ULONG(61 , 61 , 61 ), "grey24" },
842 { RGB_TO_ULONG(64 , 64 , 64 ), "gray25" },
843 { RGB_TO_ULONG(64 , 64 , 64 ), "grey25" },
844 { RGB_TO_ULONG(66 , 66 , 66 ), "gray26" },
845 { RGB_TO_ULONG(66 , 66 , 66 ), "grey26" },
846 { RGB_TO_ULONG(69 , 69 , 69 ), "gray27" },
847 { RGB_TO_ULONG(69 , 69 , 69 ), "grey27" },
848 { RGB_TO_ULONG(71 , 71 , 71 ), "gray28" },
849 { RGB_TO_ULONG(71 , 71 , 71 ), "grey28" },
850 { RGB_TO_ULONG(74 , 74 , 74 ), "gray29" },
851 { RGB_TO_ULONG(74 , 74 , 74 ), "grey29" },
852 { RGB_TO_ULONG(77 , 77 , 77 ), "gray30" },
853 { RGB_TO_ULONG(77 , 77 , 77 ), "grey30" },
854 { RGB_TO_ULONG(79 , 79 , 79 ), "gray31" },
855 { RGB_TO_ULONG(79 , 79 , 79 ), "grey31" },
856 { RGB_TO_ULONG(82 , 82 , 82 ), "gray32" },
857 { RGB_TO_ULONG(82 , 82 , 82 ), "grey32" },
858 { RGB_TO_ULONG(84 , 84 , 84 ), "gray33" },
859 { RGB_TO_ULONG(84 , 84 , 84 ), "grey33" },
860 { RGB_TO_ULONG(87 , 87 , 87 ), "gray34" },
861 { RGB_TO_ULONG(87 , 87 , 87 ), "grey34" },
862 { RGB_TO_ULONG(89 , 89 , 89 ), "gray35" },
863 { RGB_TO_ULONG(89 , 89 , 89 ), "grey35" },
864 { RGB_TO_ULONG(92 , 92 , 92 ), "gray36" },
865 { RGB_TO_ULONG(92 , 92 , 92 ), "grey36" },
866 { RGB_TO_ULONG(94 , 94 , 94 ), "gray37" },
867 { RGB_TO_ULONG(94 , 94 , 94 ), "grey37" },
868 { RGB_TO_ULONG(97 , 97 , 97 ), "gray38" },
869 { RGB_TO_ULONG(97 , 97 , 97 ), "grey38" },
870 { RGB_TO_ULONG(99 , 99 , 99 ), "gray39" },
871 { RGB_TO_ULONG(99 , 99 , 99 ), "grey39" },
872 { RGB_TO_ULONG(102, 102, 102), "gray40" },
873 { RGB_TO_ULONG(102, 102, 102), "grey40" },
874 { RGB_TO_ULONG(105, 105, 105), "gray41" },
875 { RGB_TO_ULONG(105, 105, 105), "grey41" },
876 { RGB_TO_ULONG(107, 107, 107), "gray42" },
877 { RGB_TO_ULONG(107, 107, 107), "grey42" },
878 { RGB_TO_ULONG(110, 110, 110), "gray43" },
879 { RGB_TO_ULONG(110, 110, 110), "grey43" },
880 { RGB_TO_ULONG(112, 112, 112), "gray44" },
881 { RGB_TO_ULONG(112, 112, 112), "grey44" },
882 { RGB_TO_ULONG(115, 115, 115), "gray45" },
883 { RGB_TO_ULONG(115, 115, 115), "grey45" },
884 { RGB_TO_ULONG(117, 117, 117), "gray46" },
885 { RGB_TO_ULONG(117, 117, 117), "grey46" },
886 { RGB_TO_ULONG(120, 120, 120), "gray47" },
887 { RGB_TO_ULONG(120, 120, 120), "grey47" },
888 { RGB_TO_ULONG(122, 122, 122), "gray48" },
889 { RGB_TO_ULONG(122, 122, 122), "grey48" },
890 { RGB_TO_ULONG(125, 125, 125), "gray49" },
891 { RGB_TO_ULONG(125, 125, 125), "grey49" },
892 { RGB_TO_ULONG(127, 127, 127), "gray50" },
893 { RGB_TO_ULONG(127, 127, 127), "grey50" },
894 { RGB_TO_ULONG(130, 130, 130), "gray51" },
895 { RGB_TO_ULONG(130, 130, 130), "grey51" },
896 { RGB_TO_ULONG(133, 133, 133), "gray52" },
897 { RGB_TO_ULONG(133, 133, 133), "grey52" },
898 { RGB_TO_ULONG(135, 135, 135), "gray53" },
899 { RGB_TO_ULONG(135, 135, 135), "grey53" },
900 { RGB_TO_ULONG(138, 138, 138), "gray54" },
901 { RGB_TO_ULONG(138, 138, 138), "grey54" },
902 { RGB_TO_ULONG(140, 140, 140), "gray55" },
903 { RGB_TO_ULONG(140, 140, 140), "grey55" },
904 { RGB_TO_ULONG(143, 143, 143), "gray56" },
905 { RGB_TO_ULONG(143, 143, 143), "grey56" },
906 { RGB_TO_ULONG(145, 145, 145), "gray57" },
907 { RGB_TO_ULONG(145, 145, 145), "grey57" },
908 { RGB_TO_ULONG(148, 148, 148), "gray58" },
909 { RGB_TO_ULONG(148, 148, 148), "grey58" },
910 { RGB_TO_ULONG(150, 150, 150), "gray59" },
911 { RGB_TO_ULONG(150, 150, 150), "grey59" },
912 { RGB_TO_ULONG(153, 153, 153), "gray60" },
913 { RGB_TO_ULONG(153, 153, 153), "grey60" },
914 { RGB_TO_ULONG(156, 156, 156), "gray61" },
915 { RGB_TO_ULONG(156, 156, 156), "grey61" },
916 { RGB_TO_ULONG(158, 158, 158), "gray62" },
917 { RGB_TO_ULONG(158, 158, 158), "grey62" },
918 { RGB_TO_ULONG(161, 161, 161), "gray63" },
919 { RGB_TO_ULONG(161, 161, 161), "grey63" },
920 { RGB_TO_ULONG(163, 163, 163), "gray64" },
921 { RGB_TO_ULONG(163, 163, 163), "grey64" },
922 { RGB_TO_ULONG(166, 166, 166), "gray65" },
923 { RGB_TO_ULONG(166, 166, 166), "grey65" },
924 { RGB_TO_ULONG(168, 168, 168), "gray66" },
925 { RGB_TO_ULONG(168, 168, 168), "grey66" },
926 { RGB_TO_ULONG(171, 171, 171), "gray67" },
927 { RGB_TO_ULONG(171, 171, 171), "grey67" },
928 { RGB_TO_ULONG(173, 173, 173), "gray68" },
929 { RGB_TO_ULONG(173, 173, 173), "grey68" },
930 { RGB_TO_ULONG(176, 176, 176), "gray69" },
931 { RGB_TO_ULONG(176, 176, 176), "grey69" },
932 { RGB_TO_ULONG(179, 179, 179), "gray70" },
933 { RGB_TO_ULONG(179, 179, 179), "grey70" },
934 { RGB_TO_ULONG(181, 181, 181), "gray71" },
935 { RGB_TO_ULONG(181, 181, 181), "grey71" },
936 { RGB_TO_ULONG(184, 184, 184), "gray72" },
937 { RGB_TO_ULONG(184, 184, 184), "grey72" },
938 { RGB_TO_ULONG(186, 186, 186), "gray73" },
939 { RGB_TO_ULONG(186, 186, 186), "grey73" },
940 { RGB_TO_ULONG(189, 189, 189), "gray74" },
941 { RGB_TO_ULONG(189, 189, 189), "grey74" },
942 { RGB_TO_ULONG(191, 191, 191), "gray75" },
943 { RGB_TO_ULONG(191, 191, 191), "grey75" },
944 { RGB_TO_ULONG(194, 194, 194), "gray76" },
945 { RGB_TO_ULONG(194, 194, 194), "grey76" },
946 { RGB_TO_ULONG(196, 196, 196), "gray77" },
947 { RGB_TO_ULONG(196, 196, 196), "grey77" },
948 { RGB_TO_ULONG(199, 199, 199), "gray78" },
949 { RGB_TO_ULONG(199, 199, 199), "grey78" },
950 { RGB_TO_ULONG(201, 201, 201), "gray79" },
951 { RGB_TO_ULONG(201, 201, 201), "grey79" },
952 { RGB_TO_ULONG(204, 204, 204), "gray80" },
953 { RGB_TO_ULONG(204, 204, 204), "grey80" },
954 { RGB_TO_ULONG(207, 207, 207), "gray81" },
955 { RGB_TO_ULONG(207, 207, 207), "grey81" },
956 { RGB_TO_ULONG(209, 209, 209), "gray82" },
957 { RGB_TO_ULONG(209, 209, 209), "grey82" },
958 { RGB_TO_ULONG(212, 212, 212), "gray83" },
959 { RGB_TO_ULONG(212, 212, 212), "grey83" },
960 { RGB_TO_ULONG(214, 214, 214), "gray84" },
961 { RGB_TO_ULONG(214, 214, 214), "grey84" },
962 { RGB_TO_ULONG(217, 217, 217), "gray85" },
963 { RGB_TO_ULONG(217, 217, 217), "grey85" },
964 { RGB_TO_ULONG(219, 219, 219), "gray86" },
965 { RGB_TO_ULONG(219, 219, 219), "grey86" },
966 { RGB_TO_ULONG(222, 222, 222), "gray87" },
967 { RGB_TO_ULONG(222, 222, 222), "grey87" },
968 { RGB_TO_ULONG(224, 224, 224), "gray88" },
969 { RGB_TO_ULONG(224, 224, 224), "grey88" },
970 { RGB_TO_ULONG(227, 227, 227), "gray89" },
971 { RGB_TO_ULONG(227, 227, 227), "grey89" },
972 { RGB_TO_ULONG(229, 229, 229), "gray90" },
973 { RGB_TO_ULONG(229, 229, 229), "grey90" },
974 { RGB_TO_ULONG(232, 232, 232), "gray91" },
975 { RGB_TO_ULONG(232, 232, 232), "grey91" },
976 { RGB_TO_ULONG(235, 235, 235), "gray92" },
977 { RGB_TO_ULONG(235, 235, 235), "grey92" },
978 { RGB_TO_ULONG(237, 237, 237), "gray93" },
979 { RGB_TO_ULONG(237, 237, 237), "grey93" },
980 { RGB_TO_ULONG(240, 240, 240), "gray94" },
981 { RGB_TO_ULONG(240, 240, 240), "grey94" },
982 { RGB_TO_ULONG(242, 242, 242), "gray95" },
983 { RGB_TO_ULONG(242, 242, 242), "grey95" },
984 { RGB_TO_ULONG(245, 245, 245), "gray96" },
985 { RGB_TO_ULONG(245, 245, 245), "grey96" },
986 { RGB_TO_ULONG(247, 247, 247), "gray97" },
987 { RGB_TO_ULONG(247, 247, 247), "grey97" },
988 { RGB_TO_ULONG(250, 250, 250), "gray98" },
989 { RGB_TO_ULONG(250, 250, 250), "grey98" },
990 { RGB_TO_ULONG(252, 252, 252), "gray99" },
991 { RGB_TO_ULONG(252, 252, 252), "grey99" },
992 { RGB_TO_ULONG(255, 255, 255), "gray100" },
993 { RGB_TO_ULONG(255, 255, 255), "grey100" },
994 { RGB_TO_ULONG(169, 169, 169), "dark grey" },
995 { RGB_TO_ULONG(169, 169, 169), "DarkGrey" },
996 { RGB_TO_ULONG(169, 169, 169), "dark gray" },
997 { RGB_TO_ULONG(169, 169, 169), "DarkGray" },
998 { RGB_TO_ULONG(0 , 0 , 139), "dark blue" },
999 { RGB_TO_ULONG(0 , 0 , 139), "DarkBlue" },
1000 { RGB_TO_ULONG(0 , 139, 139), "dark cyan" },
1001 { RGB_TO_ULONG(0 , 139, 139), "DarkCyan" },
1002 { RGB_TO_ULONG(139, 0 , 139), "dark magenta" },
1003 { RGB_TO_ULONG(139, 0 , 139), "DarkMagenta" },
1004 { RGB_TO_ULONG(139, 0 , 0 ), "dark red" },
1005 { RGB_TO_ULONG(139, 0 , 0 ), "DarkRed" },
1006 { RGB_TO_ULONG(144, 238, 144), "light green" },
1007 { RGB_TO_ULONG(144, 238, 144), "LightGreen" }
1011 mac_color_map_lookup (colorname
)
1014 Lisp_Object ret
= Qnil
;
1019 for (i
= 0; i
< sizeof (mac_color_map
) / sizeof (mac_color_map
[0]); i
++)
1020 if (xstricmp (colorname
, mac_color_map
[i
].name
) == 0)
1022 ret
= make_number (mac_color_map
[i
].color
);
1032 x_to_mac_color (colorname
)
1035 register Lisp_Object tail
, ret
= Qnil
;
1039 if (colorname
[0] == '#')
1041 /* Could be an old-style RGB Device specification. */
1044 color
= colorname
+ 1;
1046 size
= strlen(color
);
1047 if (size
== 3 || size
== 6 || size
== 9 || size
== 12)
1049 unsigned long colorval
;
1055 for (i
= 0; i
< 3; i
++)
1059 unsigned long value
;
1061 /* The check for 'x' in the following conditional takes into
1062 account the fact that strtol allows a "0x" in front of
1063 our numbers, and we don't. */
1064 if (!isxdigit(color
[0]) || color
[1] == 'x')
1068 value
= strtoul(color
, &end
, 16);
1070 if (errno
== ERANGE
|| end
- color
!= size
)
1075 value
= value
* 0x10;
1086 colorval
|= (value
<< pos
);
1091 return make_number (colorval
);
1097 else if (strnicmp(colorname
, "rgb:", 4) == 0)
1100 unsigned long colorval
;
1105 color
= colorname
+ 4;
1106 for (i
= 0; i
< 3; i
++)
1109 unsigned long value
;
1111 /* The check for 'x' in the following conditional takes into
1112 account the fact that strtol allows a "0x" in front of
1113 our numbers, and we don't. */
1114 if (!isxdigit(color
[0]) || color
[1] == 'x')
1116 value
= strtoul(color
, &end
, 16);
1117 if (errno
== ERANGE
)
1119 switch (end
- color
)
1122 value
= value
* 0x10 + value
;
1135 if (value
== ULONG_MAX
)
1137 colorval
|= (value
<< pos
);
1144 return make_number (colorval
);
1151 else if (strnicmp(colorname
, "rgbi:", 5) == 0)
1153 /* This is an RGB Intensity specification. */
1155 unsigned long colorval
;
1160 color
= colorname
+ 5;
1161 for (i
= 0; i
< 3; i
++)
1167 value
= strtod(color
, &end
);
1168 if (errno
== ERANGE
)
1170 if (value
< 0.0 || value
> 1.0)
1172 val
= (unsigned long)(0x100 * value
);
1173 /* We used 0x100 instead of 0xFF to give a continuous
1174 range between 0.0 and 1.0 inclusive. The next statement
1175 fixes the 1.0 case. */
1178 colorval
|= (val
<< pos
);
1185 return make_number (colorval
);
1193 ret
= mac_color_map_lookup (colorname
);
1199 /* Gamma-correct COLOR on frame F. */
1202 gamma_correct (f
, color
)
1204 unsigned long *color
;
1208 unsigned long red
, green
, blue
;
1210 red
= pow (RED_FROM_ULONG (*color
) / 255.0, f
->gamma
) * 255.0 + 0.5;
1211 green
= pow (GREEN_FROM_ULONG (*color
) / 255.0, f
->gamma
) * 255.0 + 0.5;
1212 blue
= pow (BLUE_FROM_ULONG (*color
) / 255.0, f
->gamma
) * 255.0 + 0.5;
1213 *color
= RGB_TO_ULONG (red
, green
, blue
);
1217 /* Decide if color named COLOR is valid for the display associated
1218 with the selected frame; if so, return the rgb values in COLOR_DEF.
1219 If ALLOC is nonzero, allocate a new colormap cell. */
1222 mac_defined_color (f
, color
, color_def
, alloc
)
1228 register Lisp_Object tem
;
1229 unsigned long mac_color_ref
;
1231 tem
= x_to_mac_color (color
);
1237 /* Apply gamma correction. */
1238 mac_color_ref
= XUINT (tem
);
1239 gamma_correct (f
, &mac_color_ref
);
1240 XSETINT (tem
, mac_color_ref
);
1243 color_def
->pixel
= mac_color_ref
;
1244 color_def
->red
= RED16_FROM_ULONG (mac_color_ref
);
1245 color_def
->green
= GREEN16_FROM_ULONG (mac_color_ref
);
1246 color_def
->blue
= BLUE16_FROM_ULONG (mac_color_ref
);
1256 /* Given a string ARG naming a color, compute a pixel value from it
1257 suitable for screen F.
1258 If F is not a color screen, return DEF (default) regardless of what
1262 x_decode_color (f
, arg
, def
)
1271 if (strcmp (SDATA (arg
), "black") == 0)
1272 return BLACK_PIX_DEFAULT (f
);
1273 else if (strcmp (SDATA (arg
), "white") == 0)
1274 return WHITE_PIX_DEFAULT (f
);
1277 if (FRAME_MAC_DISPLAY_INFO (f
)->n_planes
) == 1)
1281 if (mac_defined_color (f
, SDATA (arg
), &cdef
, 1))
1284 /* defined_color failed; return an ultimate default. */
1288 /* Functions called only from `x_set_frame_param'
1289 to set individual parameters.
1291 If FRAME_MAC_WINDOW (f) is 0,
1292 the frame is being created and its window does not exist yet.
1293 In that case, just record the parameter's new value
1294 in the standard place; do not attempt to change the window. */
1297 x_set_foreground_color (f
, arg
, oldval
)
1299 Lisp_Object arg
, oldval
;
1301 struct mac_output
*mac
= f
->output_data
.mac
;
1302 unsigned long fg
, old_fg
;
1304 fg
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1305 old_fg
= FRAME_FOREGROUND_PIXEL (f
);
1306 FRAME_FOREGROUND_PIXEL (f
) = fg
;
1308 if (FRAME_MAC_WINDOW (f
) != 0)
1310 Display
*dpy
= FRAME_MAC_DISPLAY (f
);
1313 XSetForeground (dpy
, mac
->normal_gc
, fg
);
1314 XSetBackground (dpy
, mac
->reverse_gc
, fg
);
1316 if (mac
->cursor_pixel
== old_fg
)
1318 unload_color (f
, mac
->cursor_pixel
);
1319 mac
->cursor_pixel
= fg
;
1320 XSetBackground (dpy
, mac
->cursor_gc
, mac
->cursor_pixel
);
1325 update_face_from_frame_parameter (f
, Qforeground_color
, arg
);
1327 if (FRAME_VISIBLE_P (f
))
1331 unload_color (f
, old_fg
);
1335 x_set_background_color (f
, arg
, oldval
)
1337 Lisp_Object arg
, oldval
;
1339 struct mac_output
*mac
= f
->output_data
.mac
;
1342 bg
= x_decode_color (f
, arg
, WHITE_PIX_DEFAULT (f
));
1343 unload_color (f
, FRAME_BACKGROUND_PIXEL (f
));
1344 FRAME_BACKGROUND_PIXEL (f
) = bg
;
1346 if (FRAME_MAC_WINDOW (f
) != 0)
1348 Display
*dpy
= FRAME_MAC_DISPLAY (f
);
1351 XSetBackground (dpy
, mac
->normal_gc
, bg
);
1352 XSetForeground (dpy
, mac
->reverse_gc
, bg
);
1353 XSetWindowBackground (dpy
, FRAME_MAC_WINDOW (f
), bg
);
1354 XSetForeground (dpy
, mac
->cursor_gc
, bg
);
1357 update_face_from_frame_parameter (f
, Qbackground_color
, arg
);
1359 if (FRAME_VISIBLE_P (f
))
1365 x_set_mouse_color (f
, arg
, oldval
)
1367 Lisp_Object arg
, oldval
;
1369 struct x_output
*x
= f
->output_data
.x
;
1370 Display
*dpy
= FRAME_MAC_DISPLAY (f
);
1371 Cursor cursor
, nontext_cursor
, mode_cursor
, hand_cursor
;
1372 Cursor hourglass_cursor
, horizontal_drag_cursor
;
1373 unsigned long pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1374 unsigned long mask_color
= x
->background_pixel
;
1376 /* Don't let pointers be invisible. */
1377 if (mask_color
== pixel
)
1378 pixel
= x
->foreground_pixel
;
1380 f
->output_data
.mac
->mouse_pixel
= pixel
;
1382 if (!NILP (Vx_pointer_shape
))
1384 CHECK_NUMBER (Vx_pointer_shape
);
1385 cursor
= XINT (Vx_pointer_shape
);
1388 cursor
= kThemeIBeamCursor
;
1390 if (!NILP (Vx_nontext_pointer_shape
))
1392 CHECK_NUMBER (Vx_nontext_pointer_shape
);
1393 nontext_cursor
= XINT (Vx_nontext_pointer_shape
);
1396 nontext_cursor
= kThemeArrowCursor
;
1398 if (!NILP (Vx_hourglass_pointer_shape
))
1400 CHECK_NUMBER (Vx_hourglass_pointer_shape
);
1401 hourglass_cursor
= XINT (Vx_hourglass_pointer_shape
);
1404 hourglass_cursor
= kThemeWatchCursor
;
1406 if (!NILP (Vx_mode_pointer_shape
))
1408 CHECK_NUMBER (Vx_mode_pointer_shape
);
1409 mode_cursor
= XINT (Vx_mode_pointer_shape
);
1412 mode_cursor
= kThemeArrowCursor
;
1414 if (!NILP (Vx_sensitive_text_pointer_shape
))
1416 CHECK_NUMBER (Vx_sensitive_text_pointer_shape
);
1417 hand_cursor
= XINT (Vx_sensitive_text_pointer_shape
);
1420 hand_cursor
= kThemePointingHandCursor
;
1422 if (!NILP (Vx_window_horizontal_drag_shape
))
1424 CHECK_NUMBER (Vx_window_horizontal_drag_shape
);
1425 horizontal_drag_cursor
= XINT (Vx_window_horizontal_drag_shape
);
1428 horizontal_drag_cursor
= kThemeResizeLeftRightCursor
;
1430 #if 0 /* MAC_TODO: cursor color changes */
1432 XColor fore_color
, back_color
;
1434 fore_color
.pixel
= f
->output_data
.mac
->mouse_pixel
;
1435 x_query_color (f
, &fore_color
);
1436 back_color
.pixel
= mask_color
;
1437 x_query_color (f
, &back_color
);
1439 XRecolorCursor (dpy
, cursor
, &fore_color
, &back_color
);
1440 XRecolorCursor (dpy
, nontext_cursor
, &fore_color
, &back_color
);
1441 XRecolorCursor (dpy
, mode_cursor
, &fore_color
, &back_color
);
1442 XRecolorCursor (dpy
, hand_cursor
, &fore_color
, &back_color
);
1443 XRecolorCursor (dpy
, hourglass_cursor
, &fore_color
, &back_color
);
1444 XRecolorCursor (dpy
, horizontal_drag_cursor
, &fore_color
, &back_color
);
1450 rif
->define_frame_cursor (f
, cursor
);
1452 f
->output_data
.mac
->text_cursor
= cursor
;
1453 f
->output_data
.mac
->nontext_cursor
= nontext_cursor
;
1454 f
->output_data
.mac
->hourglass_cursor
= hourglass_cursor
;
1455 f
->output_data
.mac
->modeline_cursor
= mode_cursor
;
1456 f
->output_data
.mac
->hand_cursor
= hand_cursor
;
1457 f
->output_data
.mac
->horizontal_drag_cursor
= horizontal_drag_cursor
;
1461 update_face_from_frame_parameter (f
, Qmouse_color
, arg
);
1465 x_set_cursor_color (f
, arg
, oldval
)
1467 Lisp_Object arg
, oldval
;
1469 unsigned long fore_pixel
, pixel
;
1471 if (!NILP (Vx_cursor_fore_pixel
))
1472 fore_pixel
= x_decode_color (f
, Vx_cursor_fore_pixel
,
1473 WHITE_PIX_DEFAULT (f
));
1475 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1477 pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1479 /* Make sure that the cursor color differs from the background color. */
1480 if (pixel
== FRAME_BACKGROUND_PIXEL (f
))
1482 pixel
= f
->output_data
.mac
->mouse_pixel
;
1483 if (pixel
== fore_pixel
)
1484 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1487 f
->output_data
.mac
->cursor_foreground_pixel
= fore_pixel
;
1488 f
->output_data
.mac
->cursor_pixel
= pixel
;
1490 if (FRAME_MAC_WINDOW (f
) != 0)
1493 /* Update frame's cursor_gc. */
1494 XSetBackground (FRAME_MAC_DISPLAY (f
),
1495 f
->output_data
.mac
->cursor_gc
, pixel
);
1496 XSetForeground (FRAME_MAC_DISPLAY (f
),
1497 f
->output_data
.mac
->cursor_gc
, fore_pixel
);
1500 if (FRAME_VISIBLE_P (f
))
1502 x_update_cursor (f
, 0);
1503 x_update_cursor (f
, 1);
1507 update_face_from_frame_parameter (f
, Qcursor_color
, arg
);
1510 /* Set the border-color of frame F to pixel value PIX.
1511 Note that this does not fully take effect if done before
1515 x_set_border_pixel (f
, pix
)
1520 f
->output_data
.mac
->border_pixel
= pix
;
1522 if (FRAME_MAC_WINDOW (f
) != 0 && f
->border_width
> 0)
1524 if (FRAME_VISIBLE_P (f
))
1529 /* Set the border-color of frame F to value described by ARG.
1530 ARG can be a string naming a color.
1531 The border-color is used for the border that is drawn by the server.
1532 Note that this does not fully take effect if done before
1533 F has a window; it must be redone when the window is created. */
1536 x_set_border_color (f
, arg
, oldval
)
1538 Lisp_Object arg
, oldval
;
1543 pix
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1544 x_set_border_pixel (f
, pix
);
1545 update_face_from_frame_parameter (f
, Qborder_color
, arg
);
1550 x_set_cursor_type (f
, arg
, oldval
)
1552 Lisp_Object arg
, oldval
;
1554 set_frame_cursor_types (f
, arg
);
1556 /* Make sure the cursor gets redrawn. */
1557 cursor_type_changed
= 1;
1560 #if 0 /* MAC_TODO: really no icon for Mac */
1562 x_set_icon_type (f
, arg
, oldval
)
1564 Lisp_Object arg
, oldval
;
1568 if (NILP (arg
) && NILP (oldval
))
1571 if (STRINGP (arg
) && STRINGP (oldval
)
1572 && EQ (Fstring_equal (oldval
, arg
), Qt
))
1575 if (SYMBOLP (arg
) && SYMBOLP (oldval
) && EQ (arg
, oldval
))
1580 result
= x_bitmap_icon (f
, arg
);
1584 error ("No icon window available");
1589 #endif /* MAC_TODO */
1592 x_set_icon_name (f
, arg
, oldval
)
1594 Lisp_Object arg
, oldval
;
1600 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1603 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1608 #if 0 /* MAC_TODO */
1609 if (f
->output_data
.w32
->icon_bitmap
!= 0)
1614 result
= x_text_icon (f
,
1615 (char *) SDATA ((!NILP (f
->icon_name
)
1624 error ("No icon window available");
1627 /* If the window was unmapped (and its icon was mapped),
1628 the new icon is not mapped, so map the window in its stead. */
1629 if (FRAME_VISIBLE_P (f
))
1631 #ifdef USE_X_TOOLKIT
1632 XtPopup (f
->output_data
.w32
->widget
, XtGrabNone
);
1634 XMapWindow (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
));
1637 XFlush (FRAME_W32_DISPLAY (f
));
1639 #endif /* MAC_TODO */
1644 x_set_menu_bar_lines (f
, value
, oldval
)
1646 Lisp_Object value
, oldval
;
1649 int olines
= FRAME_MENU_BAR_LINES (f
);
1651 /* Right now, menu bars don't work properly in minibuf-only frames;
1652 most of the commands try to apply themselves to the minibuffer
1653 frame itself, and get an error because you can't switch buffers
1654 in or split the minibuffer window. */
1655 if (FRAME_MINIBUF_ONLY_P (f
))
1658 if (INTEGERP (value
))
1659 nlines
= XINT (value
);
1663 FRAME_MENU_BAR_LINES (f
) = 0;
1665 FRAME_EXTERNAL_MENU_BAR (f
) = 1;
1668 if (FRAME_EXTERNAL_MENU_BAR (f
) == 1)
1669 free_frame_menubar (f
);
1670 FRAME_EXTERNAL_MENU_BAR (f
) = 0;
1672 /* Adjust the frame size so that the client (text) dimensions
1673 remain the same. This depends on FRAME_EXTERNAL_MENU_BAR being
1675 x_set_window_size (f
, 0, FRAME_COLS (f
), FRAME_LINES (f
));
1676 do_pending_window_change (0);
1682 /* Set the number of lines used for the tool bar of frame F to VALUE.
1683 VALUE not an integer, or < 0 means set the lines to zero. OLDVAL
1684 is the old number of tool bar lines. This function changes the
1685 height of all windows on frame F to match the new tool bar height.
1686 The frame's height doesn't change. */
1689 x_set_tool_bar_lines (f
, value
, oldval
)
1691 Lisp_Object value
, oldval
;
1693 int delta
, nlines
, root_height
;
1694 Lisp_Object root_window
;
1696 /* Treat tool bars like menu bars. */
1697 if (FRAME_MINIBUF_ONLY_P (f
))
1700 /* Use VALUE only if an integer >= 0. */
1701 if (INTEGERP (value
) && XINT (value
) >= 0)
1702 nlines
= XFASTINT (value
);
1706 /* Make sure we redisplay all windows in this frame. */
1707 ++windows_or_buffers_changed
;
1709 delta
= nlines
- FRAME_TOOL_BAR_LINES (f
);
1711 /* Don't resize the tool-bar to more than we have room for. */
1712 root_window
= FRAME_ROOT_WINDOW (f
);
1713 root_height
= WINDOW_TOTAL_LINES (XWINDOW (root_window
));
1714 if (root_height
- delta
< 1)
1716 delta
= root_height
- 1;
1717 nlines
= FRAME_TOOL_BAR_LINES (f
) + delta
;
1720 FRAME_TOOL_BAR_LINES (f
) = nlines
;
1721 change_window_heights (root_window
, delta
);
1724 /* We also have to make sure that the internal border at the top of
1725 the frame, below the menu bar or tool bar, is redrawn when the
1726 tool bar disappears. This is so because the internal border is
1727 below the tool bar if one is displayed, but is below the menu bar
1728 if there isn't a tool bar. The tool bar draws into the area
1729 below the menu bar. */
1730 if (FRAME_MAC_WINDOW (f
) && FRAME_TOOL_BAR_LINES (f
) == 0)
1734 clear_current_matrices (f
);
1735 updating_frame
= NULL
;
1738 /* If the tool bar gets smaller, the internal border below it
1739 has to be cleared. It was formerly part of the display
1740 of the larger tool bar, and updating windows won't clear it. */
1743 int height
= FRAME_INTERNAL_BORDER_WIDTH (f
);
1744 int width
= FRAME_PIXEL_WIDTH (f
);
1745 int y
= nlines
* FRAME_LINE_HEIGHT (f
);
1748 XClearArea (FRAME_MAC_DISPLAY (f
), FRAME_MAC_WINDOW (f
),
1749 0, y
, width
, height
, 0);
1752 if (WINDOWP (f
->tool_bar_window
))
1753 clear_glyph_matrix (XWINDOW (f
->tool_bar_window
)->current_matrix
);
1759 /* Set the Mac window title to NAME for frame F. */
1762 x_set_name_internal (f
, name
)
1766 if (FRAME_MAC_WINDOW (f
))
1768 if (STRING_MULTIBYTE (name
))
1769 #if TARGET_API_MAC_CARBON
1770 name
= ENCODE_UTF_8 (name
);
1772 name
= ENCODE_SYSTEM (name
);
1778 #if TARGET_API_MAC_CARBON
1779 CFStringRef windowTitle
=
1780 cfstring_create_with_utf8_cstring (SDATA (name
));
1782 SetWindowTitleWithCFString (FRAME_MAC_WINDOW (f
), windowTitle
);
1783 CFRelease (windowTitle
);
1786 if (strlen (SDATA (name
)) < 255)
1788 strcpy (windowTitle
, SDATA (name
));
1789 c2pstr (windowTitle
);
1790 SetWTitle (FRAME_MAC_WINDOW (f
), windowTitle
);
1799 /* Change the name of frame F to NAME. If NAME is nil, set F's name to
1802 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1803 name; if NAME is a string, set F's name to NAME and set
1804 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1806 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1807 suggesting a new name, which lisp code should override; if
1808 F->explicit_name is set, ignore the new name; otherwise, set it. */
1811 x_set_name (f
, name
, explicit)
1816 /* Make sure that requests from lisp code override requests from
1817 Emacs redisplay code. */
1820 /* If we're switching from explicit to implicit, we had better
1821 update the mode lines and thereby update the title. */
1822 if (f
->explicit_name
&& NILP (name
))
1823 update_mode_lines
= 1;
1825 f
->explicit_name
= ! NILP (name
);
1827 else if (f
->explicit_name
)
1830 /* If NAME is nil, set the name to the mac_id_name. */
1833 /* Check for no change needed in this very common case
1834 before we do any consing. */
1835 if (!strcmp (FRAME_MAC_DISPLAY_INFO (f
)->mac_id_name
,
1838 name
= build_string (FRAME_MAC_DISPLAY_INFO (f
)->mac_id_name
);
1841 CHECK_STRING (name
);
1843 /* Don't change the name if it's already NAME. */
1844 if (! NILP (Fstring_equal (name
, f
->name
)))
1849 /* For setting the frame title, the title parameter should override
1850 the name parameter. */
1851 if (! NILP (f
->title
))
1854 x_set_name_internal (f
, name
);
1857 /* This function should be called when the user's lisp code has
1858 specified a name for the frame; the name will override any set by the
1861 x_explicitly_set_name (f
, arg
, oldval
)
1863 Lisp_Object arg
, oldval
;
1865 x_set_name (f
, arg
, 1);
1868 /* This function should be called by Emacs redisplay code to set the
1869 name; names set this way will never override names set by the user's
1872 x_implicitly_set_name (f
, arg
, oldval
)
1874 Lisp_Object arg
, oldval
;
1876 x_set_name (f
, arg
, 0);
1879 /* Change the title of frame F to NAME.
1880 If NAME is nil, use the frame name as the title.
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_title (f
, name
, old_name
)
1893 Lisp_Object name
, old_name
;
1895 /* Don't change the title if it's already NAME. */
1896 if (EQ (name
, f
->title
))
1899 update_mode_lines
= 1;
1906 CHECK_STRING (name
);
1908 x_set_name_internal (f
, name
);
1912 x_set_scroll_bar_default_width (f
)
1915 /* Imitate X without X Toolkit */
1917 int wid
= FRAME_COLUMN_WIDTH (f
);
1920 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 16; /* Aqua scroll bars. */
1921 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) +
1923 #else /* not MAC_OSX */
1924 /* Make the actual width at least 14 pixels and a multiple of a
1926 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (14 + wid
- 1) / wid
;
1928 /* Use all of that space (aside from required margins) for the
1930 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 0;
1931 #endif /* not MAC_OSX */
1935 /* Subroutines of creating a frame. */
1937 /* Retrieve the string resource specified by NAME with CLASS from
1940 The return value points to the contents of a Lisp string. So it
1941 will not be valid after the next GC where string compaction will
1945 x_get_string_resource (rdb
, name
, class)
1949 Lisp_Object value
= xrm_get_resource (rdb
, name
, class);
1951 if (STRINGP (value
))
1952 return SDATA (value
);
1957 /* Return the value of parameter PARAM.
1959 First search ALIST, then Vdefault_frame_alist, then the X defaults
1960 database, using ATTRIBUTE as the attribute name and CLASS as its class.
1962 Convert the resource to the type specified by desired_type.
1964 If no default is specified, return Qunbound. If you call
1965 mac_get_arg, make sure you deal with Qunbound in a reasonable way,
1966 and don't let it get stored in any Lisp-visible variables! */
1969 mac_get_arg (alist
, param
, attribute
, class, type
)
1970 Lisp_Object alist
, param
;
1973 enum resource_types type
;
1975 return x_get_arg (check_x_display_info (Qnil
),
1976 alist
, param
, attribute
, class, type
);
1980 /* XParseGeometry copied from w32xfns.c */
1983 * XParseGeometry parses strings of the form
1984 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
1985 * width, height, xoffset, and yoffset are unsigned integers.
1986 * Example: "=80x24+300-49"
1987 * The equal sign is optional.
1988 * It returns a bitmask that indicates which of the four values
1989 * were actually found in the string. For each value found,
1990 * the corresponding argument is updated; for each value
1991 * not found, the corresponding argument is left unchanged.
1995 read_integer (string
, NextString
)
1996 register char *string
;
1999 register int Result
= 0;
2004 else if (*string
== '-')
2009 for (; (*string
>= '0') && (*string
<= '9'); string
++)
2011 Result
= (Result
* 10) + (*string
- '0');
2013 *NextString
= string
;
2021 XParseGeometry (string
, x
, y
, width
, height
)
2024 unsigned int *width
, *height
; /* RETURN */
2027 register char *strind
;
2028 unsigned int tempWidth
, tempHeight
;
2030 char *nextCharacter
;
2032 if ((string
== NULL
) || (*string
== '\0')) return (mask
);
2034 string
++; /* ignore possible '=' at beg of geometry spec */
2036 strind
= (char *)string
;
2037 if (*strind
!= '+' && *strind
!= '-' && *strind
!= 'x')
2039 tempWidth
= read_integer (strind
, &nextCharacter
);
2040 if (strind
== nextCharacter
)
2042 strind
= nextCharacter
;
2046 if (*strind
== 'x' || *strind
== 'X')
2049 tempHeight
= read_integer (strind
, &nextCharacter
);
2050 if (strind
== nextCharacter
)
2052 strind
= nextCharacter
;
2053 mask
|= HeightValue
;
2056 if ((*strind
== '+') || (*strind
== '-'))
2061 tempX
= -read_integer (strind
, &nextCharacter
);
2062 if (strind
== nextCharacter
)
2064 strind
= nextCharacter
;
2071 tempX
= read_integer (strind
, &nextCharacter
);
2072 if (strind
== nextCharacter
)
2074 strind
= nextCharacter
;
2077 if ((*strind
== '+') || (*strind
== '-'))
2082 tempY
= -read_integer (strind
, &nextCharacter
);
2083 if (strind
== nextCharacter
)
2085 strind
= nextCharacter
;
2092 tempY
= read_integer (strind
, &nextCharacter
);
2093 if (strind
== nextCharacter
)
2095 strind
= nextCharacter
;
2101 /* If strind isn't at the end of the string the it's an invalid
2102 geometry specification. */
2104 if (*strind
!= '\0') return (0);
2110 if (mask
& WidthValue
)
2112 if (mask
& HeightValue
)
2113 *height
= tempHeight
;
2118 /* Create and set up the Mac window for frame F. */
2128 SetRect (&r
, f
->left_pos
, f
->top_pos
,
2129 f
->left_pos
+ FRAME_PIXEL_WIDTH (f
),
2130 f
->top_pos
+ FRAME_PIXEL_HEIGHT (f
));
2131 #if TARGET_API_MAC_CARBON
2132 CreateNewWindow (kDocumentWindowClass
,
2133 kWindowStandardDocumentAttributes
2134 /* | kWindowToolbarButtonAttribute */,
2135 &r
, &FRAME_MAC_WINDOW (f
));
2136 if (FRAME_MAC_WINDOW (f
))
2138 SetWRefCon (FRAME_MAC_WINDOW (f
), (long) f
->output_data
.mac
);
2139 if (install_window_handler (FRAME_MAC_WINDOW (f
)) != noErr
)
2141 DisposeWindow (FRAME_MAC_WINDOW (f
));
2142 FRAME_MAC_WINDOW (f
) = NULL
;
2146 FRAME_MAC_WINDOW (f
)
2147 = NewCWindow (NULL
, &r
, "\p", false, zoomDocProc
,
2148 (WindowPtr
) -1, 1, (long) f
->output_data
.mac
);
2150 /* so that update events can find this mac_output struct */
2151 f
->output_data
.mac
->mFP
= f
; /* point back to emacs frame */
2154 if (FRAME_MAC_WINDOW (f
))
2156 ControlRef root_control
;
2158 if (CreateRootControl (FRAME_MAC_WINDOW (f
), &root_control
) != noErr
)
2160 DisposeWindow (FRAME_MAC_WINDOW (f
));
2161 FRAME_MAC_WINDOW (f
) = NULL
;
2165 if (FRAME_MAC_WINDOW (f
))
2166 XSetWindowBackground (FRAME_MAC_DISPLAY(f
), FRAME_MAC_WINDOW (f
),
2167 FRAME_BACKGROUND_PIXEL (f
));
2169 validate_x_resource_name ();
2171 /* x_set_name normally ignores requests to set the name if the
2172 requested name is the same as the current name. This is the one
2173 place where that assumption isn't correct; f->name is set, but
2174 the server hasn't been told. */
2177 int explicit = f
->explicit_name
;
2179 f
->explicit_name
= 0;
2182 x_set_name (f
, name
, explicit);
2187 if (FRAME_MAC_WINDOW (f
) == 0)
2188 error ("Unable to create window");
2191 /* Handle the icon stuff for this window. Perhaps later we might
2192 want an x_set_icon_position which can be called interactively as
2200 Lisp_Object icon_x
, icon_y
;
2202 /* Set the position of the icon. Note that Windows 95 groups all
2203 icons in the tray. */
2204 icon_x
= mac_get_arg (parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2205 icon_y
= mac_get_arg (parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2206 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2208 CHECK_NUMBER (icon_x
);
2209 CHECK_NUMBER (icon_y
);
2211 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2212 error ("Both left and top icon corners of icon must be specified");
2216 if (! EQ (icon_x
, Qunbound
))
2217 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
2220 /* Start up iconic or window? */
2221 x_wm_set_window_state
2222 (f
, (EQ (w32_get_arg (parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
), Qicon
)
2226 x_text_icon (f
, (char *) SDATA ((!NILP (f
->icon_name
)
2239 XGCValues gc_values
;
2243 /* Create the GCs of this frame.
2244 Note that many default values are used. */
2247 gc_values
.font
= FRAME_FONT (f
);
2248 gc_values
.foreground
= FRAME_FOREGROUND_PIXEL (f
);
2249 gc_values
.background
= FRAME_BACKGROUND_PIXEL (f
);
2250 f
->output_data
.mac
->normal_gc
= XCreateGC (FRAME_MAC_DISPLAY (f
),
2251 FRAME_MAC_WINDOW (f
),
2252 GCFont
| GCForeground
| GCBackground
,
2255 /* Reverse video style. */
2256 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2257 gc_values
.background
= FRAME_FOREGROUND_PIXEL (f
);
2258 f
->output_data
.mac
->reverse_gc
= XCreateGC (FRAME_MAC_DISPLAY (f
),
2259 FRAME_MAC_WINDOW (f
),
2260 GCFont
| GCForeground
| GCBackground
,
2263 /* Cursor has cursor-color background, background-color foreground. */
2264 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2265 gc_values
.background
= f
->output_data
.mac
->cursor_pixel
;
2266 f
->output_data
.mac
->cursor_gc
= XCreateGC (FRAME_MAC_DISPLAY (f
),
2267 FRAME_MAC_WINDOW (f
),
2268 GCFont
| GCForeground
| GCBackground
,
2272 f
->output_data
.mac
->white_relief
.gc
= 0;
2273 f
->output_data
.mac
->black_relief
.gc
= 0;
2276 /* Create the gray border tile used when the pointer is not in
2277 the frame. Since this depends on the frame's pixel values,
2278 this must be done on a per-frame basis. */
2279 f
->output_data
.x
->border_tile
2280 = (XCreatePixmapFromBitmapData
2281 (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
2282 gray_bits
, gray_width
, gray_height
,
2283 f
->output_data
.x
->foreground_pixel
,
2284 f
->output_data
.x
->background_pixel
,
2285 DefaultDepth (FRAME_X_DISPLAY (f
), FRAME_X_SCREEN_NUMBER (f
))));
2292 /* Free what was was allocated in x_make_gc. */
2298 Display
*dpy
= FRAME_MAC_DISPLAY (f
);
2302 if (f
->output_data
.mac
->normal_gc
)
2304 XFreeGC (dpy
, f
->output_data
.mac
->normal_gc
);
2305 f
->output_data
.mac
->normal_gc
= 0;
2308 if (f
->output_data
.mac
->reverse_gc
)
2310 XFreeGC (dpy
, f
->output_data
.mac
->reverse_gc
);
2311 f
->output_data
.mac
->reverse_gc
= 0;
2314 if (f
->output_data
.mac
->cursor_gc
)
2316 XFreeGC (dpy
, f
->output_data
.mac
->cursor_gc
);
2317 f
->output_data
.mac
->cursor_gc
= 0;
2321 if (f
->output_data
.mac
->border_tile
)
2323 XFreePixmap (dpy
, f
->output_data
.mac
->border_tile
);
2324 f
->output_data
.mac
->border_tile
= 0;
2328 if (f
->output_data
.mac
->white_relief
.gc
)
2330 XFreeGC (dpy
, f
->output_data
.mac
->white_relief
.gc
);
2331 f
->output_data
.mac
->white_relief
.gc
= 0;
2334 if (f
->output_data
.mac
->black_relief
.gc
)
2336 XFreeGC (dpy
, f
->output_data
.mac
->black_relief
.gc
);
2337 f
->output_data
.mac
->black_relief
.gc
= 0;
2344 /* Handler for signals raised during x_create_frame and
2345 x_create_top_frame. FRAME is the frame which is partially
2349 unwind_create_frame (frame
)
2352 struct frame
*f
= XFRAME (frame
);
2354 /* If frame is ``official'', nothing to do. */
2355 if (!CONSP (Vframe_list
) || !EQ (XCAR (Vframe_list
), frame
))
2358 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2361 x_free_frame_resources (f
);
2364 /* Check that reference counts are indeed correct. */
2365 xassert (dpyinfo
->reference_count
== dpyinfo_refcount
);
2366 xassert (dpyinfo
->image_cache
->refcount
== image_cache_refcount
);
2375 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
2377 doc
: /* Make a new window, which is called a "frame" in Emacs terms.
2378 Returns an Emacs frame object.
2379 ALIST is an alist of frame parameters.
2380 If the parameters specify that the frame should not have a minibuffer,
2381 and do not specify a specific minibuffer window to use,
2382 then `default-minibuffer-frame' must be a frame whose minibuffer can
2383 be shared by the new frame.
2385 This function is an internal primitive--use `make-frame' instead. */)
2390 Lisp_Object frame
, tem
;
2392 int minibuffer_only
= 0;
2393 long window_prompting
= 0;
2395 int count
= SPECPDL_INDEX ();
2396 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2397 Lisp_Object display
;
2398 struct mac_display_info
*dpyinfo
= NULL
;
2401 char x_frame_name
[10];
2402 static int x_frame_count
= 2; /* begins at 2 because terminal frame is F1 */
2406 /* Use this general default value to start with
2407 until we know if this frame has a specified name. */
2408 Vx_resource_name
= Vinvocation_name
;
2410 display
= mac_get_arg (parms
, Qdisplay
, 0, 0, RES_TYPE_STRING
);
2411 if (EQ (display
, Qunbound
))
2413 dpyinfo
= check_x_display_info (display
);
2415 kb
= dpyinfo
->kboard
;
2417 kb
= &the_only_kboard
;
2420 name
= mac_get_arg (parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
2422 && ! EQ (name
, Qunbound
)
2424 error ("Invalid frame name--not a string or nil");
2427 Vx_resource_name
= name
;
2429 /* See if parent window is specified. */
2430 parent
= mac_get_arg (parms
, Qparent_id
, NULL
, NULL
, RES_TYPE_NUMBER
);
2431 if (EQ (parent
, Qunbound
))
2433 if (! NILP (parent
))
2434 CHECK_NUMBER (parent
);
2436 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
2437 /* No need to protect DISPLAY because that's not used after passing
2438 it to make_frame_without_minibuffer. */
2440 GCPRO4 (parms
, parent
, name
, frame
);
2441 tem
= mac_get_arg (parms
, Qminibuffer
, "minibuffer", "Minibuffer",
2443 if (EQ (tem
, Qnone
) || NILP (tem
))
2444 f
= make_frame_without_minibuffer (Qnil
, kb
, display
);
2445 else if (EQ (tem
, Qonly
))
2447 f
= make_minibuffer_frame ();
2448 minibuffer_only
= 1;
2450 else if (WINDOWP (tem
))
2451 f
= make_frame_without_minibuffer (tem
, kb
, display
);
2455 if (EQ (name
, Qunbound
) || NILP (name
))
2457 sprintf (x_frame_name
, "F%d", x_frame_count
++);
2458 f
->name
= build_string (x_frame_name
);
2459 f
->explicit_name
= 0;
2464 f
->explicit_name
= 1;
2467 XSETFRAME (frame
, f
);
2469 /* Note that X Windows does support scroll bars. */
2470 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
2472 f
->output_method
= output_mac
;
2473 f
->output_data
.mac
= (struct mac_output
*) xmalloc (sizeof (struct mac_output
));
2474 bzero (f
->output_data
.mac
, sizeof (struct mac_output
));
2475 FRAME_FONTSET (f
) = -1;
2476 record_unwind_protect (unwind_create_frame
, frame
);
2479 = mac_get_arg (parms
, Qicon_name
, "iconName", "Title", RES_TYPE_STRING
);
2480 if (! STRINGP (f
->icon_name
))
2481 f
->icon_name
= Qnil
;
2483 /* FRAME_W32_DISPLAY_INFO (f) = dpyinfo; */
2485 FRAME_KBOARD (f
) = kb
;
2488 /* Specify the parent under which to make this window. */
2492 f
->output_data
.mac
->parent_desc
= (Window
) XFASTINT (parent
);
2493 f
->output_data
.mac
->explicit_parent
= 1;
2497 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
2498 f
->output_data
.mac
->explicit_parent
= 0;
2501 /* Set the name; the functions to which we pass f expect the name to
2503 if (EQ (name
, Qunbound
) || NILP (name
))
2505 f
->name
= build_string (dpyinfo
->mac_id_name
);
2506 f
->explicit_name
= 0;
2511 f
->explicit_name
= 1;
2512 /* use the frame's title when getting resources for this frame. */
2513 specbind (Qx_resource_name
, name
);
2516 /* Extract the window parameters from the supplied values
2517 that are needed to determine window geometry. */
2521 font
= mac_get_arg (parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
2524 /* First, try whatever font the caller has specified. */
2527 tem
= Fquery_fontset (font
, Qnil
);
2529 font
= x_new_fontset (f
, SDATA (tem
));
2531 font
= x_new_font (f
, SDATA (font
));
2534 /* Try out a font which we hope has bold and italic variations. */
2536 if (! STRINGP (font
))
2537 font
= x_new_font (f
, "-*-monaco-medium-r-normal--12-*-*-*-*-*-iso10646-1");
2539 if (! STRINGP (font
))
2540 font
= x_new_font (f
, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
2541 /* If those didn't work, look for something which will at least work. */
2542 if (! STRINGP (font
))
2543 font
= x_new_fontset (f
, "fontset-mac");
2544 if (! STRINGP (font
))
2545 font
= x_new_font (f
, "-*-monaco-*-12-*-mac-roman");
2546 if (! STRINGP (font
))
2547 font
= x_new_font (f
, "-*-courier-*-10-*-mac-roman");
2548 if (! STRINGP (font
))
2549 error ("Cannot find any usable font");
2552 x_default_parameter (f
, parms
, Qfont
, font
,
2553 "font", "Font", RES_TYPE_STRING
);
2556 x_default_parameter (f
, parms
, Qborder_width
, make_number (0),
2557 "borderwidth", "BorderWidth", RES_TYPE_NUMBER
);
2558 /* This defaults to 2 in order to match xterm. We recognize either
2559 internalBorderWidth or internalBorder (which is what xterm calls
2561 if (NILP (Fassq (Qinternal_border_width
, parms
)))
2565 value
= mac_get_arg (parms
, Qinternal_border_width
,
2566 "internalBorder", "InternalBorder", RES_TYPE_NUMBER
);
2567 if (! EQ (value
, Qunbound
))
2568 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
2571 /* Default internalBorderWidth to 0 on Windows to match other programs. */
2572 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (0),
2573 "internalBorderWidth", "InternalBorder", RES_TYPE_NUMBER
);
2574 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qright
,
2575 "verticalScrollBars", "ScrollBars", RES_TYPE_SYMBOL
);
2577 /* Also do the stuff which must be set before the window exists. */
2578 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
2579 "foreground", "Foreground", RES_TYPE_STRING
);
2580 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
2581 "background", "Background", RES_TYPE_STRING
);
2582 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
2583 "pointerColor", "Foreground", RES_TYPE_STRING
);
2584 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
2585 "cursorColor", "Foreground", RES_TYPE_STRING
);
2586 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
2587 "borderColor", "BorderColor", RES_TYPE_STRING
);
2588 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
2589 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
2590 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
2591 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
2592 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
2593 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
2594 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
2595 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
2598 /* Init faces before x_default_parameter is called for scroll-bar
2599 parameters because that function calls x_set_scroll_bar_width,
2600 which calls change_frame_size, which calls Fset_window_buffer,
2601 which runs hooks, which call Fvertical_motion. At the end, we
2602 end up in init_iterator with a null face cache, which should not
2604 init_frame_faces (f
);
2606 x_default_parameter (f
, parms
, Qmenu_bar_lines
, make_number (1),
2607 "menuBar", "MenuBar", RES_TYPE_NUMBER
);
2608 x_default_parameter (f
, parms
, Qtool_bar_lines
, make_number (1),
2609 "toolBar", "ToolBar", RES_TYPE_NUMBER
);
2610 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
2611 "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL
);
2612 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
2613 "title", "Title", RES_TYPE_STRING
);
2614 x_default_parameter (f
, parms
, Qfullscreen
, Qnil
,
2615 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL
);
2617 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
2619 /* Compute the size of the window. */
2620 window_prompting
= x_figure_window_size (f
, parms
, 1);
2622 tem
= mac_get_arg (parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
2623 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
2630 /* Now consider the frame official. */
2631 FRAME_MAC_DISPLAY_INFO (f
)->reference_count
++;
2632 Vframe_list
= Fcons (frame
, Vframe_list
);
2634 /* We need to do this after creating the window, so that the
2635 icon-creation functions can say whose icon they're describing. */
2636 x_default_parameter (f
, parms
, Qicon_type
, Qnil
,
2637 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
2639 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
2640 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
2641 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
2642 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
2643 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
2644 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
2645 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
2646 "scrollBarWidth", "ScrollBarWidth",
2649 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
2650 Change will not be effected unless different from the current
2652 width
= FRAME_COLS (f
);
2653 height
= FRAME_LINES (f
);
2655 SET_FRAME_COLS (f
, 0);
2656 FRAME_LINES (f
) = 0;
2657 change_frame_size (f
, height
, width
, 1, 0, 0);
2659 /* Tell the server what size and position, etc, we want, and how
2660 badly we want them. This should be done after we have the menu
2661 bar so that its size can be taken into account. */
2663 x_wm_set_size_hint (f
, window_prompting
, 0);
2666 /* Make the window appear on the frame and enable display, unless
2667 the caller says not to. However, with explicit parent, Emacs
2668 cannot control visibility, so don't try. */
2669 if (! f
->output_data
.mac
->explicit_parent
)
2671 Lisp_Object visibility
;
2673 visibility
= mac_get_arg (parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
);
2674 if (EQ (visibility
, Qunbound
))
2677 #if 0 /* MAC_TODO: really no iconify on Mac */
2678 if (EQ (visibility
, Qicon
))
2679 x_iconify_frame (f
);
2682 if (! NILP (visibility
))
2683 x_make_frame_visible (f
);
2685 /* Must have been Qnil. */
2690 /* Make sure windows on this frame appear in calls to next-window
2691 and similar functions. */
2692 Vwindow_list
= Qnil
;
2694 return unbind_to (count
, frame
);
2697 /* FRAME is used only to get a handle on the X display. We don't pass the
2698 display info directly because we're called from frame.c, which doesn't
2699 know about that structure. */
2701 x_get_focus_frame (frame
)
2702 struct frame
*frame
;
2704 struct mac_display_info
*dpyinfo
= FRAME_MAC_DISPLAY_INFO (frame
);
2706 if (! dpyinfo
->x_focus_frame
)
2709 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
2713 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
2714 doc
: /* Internal function called by `color-defined-p', which see. */)
2716 Lisp_Object color
, frame
;
2719 FRAME_PTR f
= check_x_frame (frame
);
2721 CHECK_STRING (color
);
2723 if (mac_defined_color (f
, SDATA (color
), &foo
, 0))
2729 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
2730 doc
: /* Internal function called by `color-values', which see. */)
2732 Lisp_Object color
, frame
;
2735 FRAME_PTR f
= check_x_frame (frame
);
2737 CHECK_STRING (color
);
2739 if (mac_defined_color (f
, SDATA (color
), &foo
, 0))
2743 rgb
[0] = make_number (foo
.red
);
2744 rgb
[1] = make_number (foo
.green
);
2745 rgb
[2] = make_number (foo
.blue
);
2746 return Flist (3, rgb
);
2752 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
2753 doc
: /* Internal function called by `display-color-p', which see. */)
2755 Lisp_Object display
;
2757 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2759 if (!dpyinfo
->color_p
)
2765 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
2767 doc
: /* Return t if DISPLAY supports shades of gray.
2768 Note that color displays do support shades of gray.
2769 The optional argument DISPLAY specifies which display to ask about.
2770 DISPLAY should be either a frame or a display name (a string).
2771 If omitted or nil, that stands for the selected frame's display. */)
2773 Lisp_Object display
;
2775 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2777 if (dpyinfo
->n_planes
<= 1)
2783 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
2785 doc
: /* Returns the width in pixels of DISPLAY.
2786 The optional argument DISPLAY specifies which display to ask about.
2787 DISPLAY should be either a frame or a display name (a string).
2788 If omitted or nil, that stands for the selected frame's display. */)
2790 Lisp_Object display
;
2792 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2794 return make_number (dpyinfo
->width
);
2797 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
2798 Sx_display_pixel_height
, 0, 1, 0,
2799 doc
: /* Returns the height in pixels of DISPLAY.
2800 The optional argument DISPLAY specifies which display to ask about.
2801 DISPLAY should be either a frame or a display name (a string).
2802 If omitted or nil, that stands for the selected frame's display. */)
2804 Lisp_Object display
;
2806 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2808 return make_number (dpyinfo
->height
);
2811 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
2813 doc
: /* Returns the number of bitplanes of DISPLAY.
2814 The optional argument DISPLAY specifies which display to ask about.
2815 DISPLAY should be either a frame or a display name (a string).
2816 If omitted or nil, that stands for the selected frame's display. */)
2818 Lisp_Object display
;
2820 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2822 return make_number (dpyinfo
->n_planes
);
2825 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
2827 doc
: /* Returns the number of color cells of DISPLAY.
2828 The optional argument DISPLAY specifies which display to ask about.
2829 DISPLAY should be either a frame or a display name (a string).
2830 If omitted or nil, that stands for the selected frame's display. */)
2832 Lisp_Object display
;
2834 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2836 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2837 return make_number (1 << min (dpyinfo
->n_planes
, 24));
2840 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
2841 Sx_server_max_request_size
,
2843 doc
: /* Returns the maximum request size of the server of DISPLAY.
2844 The optional argument DISPLAY specifies which display to ask about.
2845 DISPLAY should be either a frame or a display name (a string).
2846 If omitted or nil, that stands for the selected frame's display. */)
2848 Lisp_Object display
;
2850 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2852 return make_number (1);
2855 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
2856 doc
: /* Returns the "vendor ID" string of the Mac OS system (Apple).
2857 The optional argument DISPLAY specifies which display to ask about.
2858 DISPLAY should be either a frame or a display name (a string).
2859 If omitted or nil, that stands for the selected frame's display. */)
2861 Lisp_Object display
;
2863 return build_string ("Apple Computers");
2866 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
2867 doc
: /* Returns the version numbers of the Mac OS system.
2868 The value is a list of three integers: the major and minor
2869 version numbers, and the vendor-specific release
2870 number. See also the function `x-server-vendor'.
2872 The optional argument DISPLAY specifies which display to ask about.
2873 DISPLAY should be either a frame or a display name (a string).
2874 If omitted or nil, that stands for the selected frame's display. */)
2876 Lisp_Object display
;
2878 int mac_major_version
;
2883 err
= Gestalt (gestaltSystemVersion
, &response
);
2887 error ("Cannot get Mac OS version");
2889 mac_major_version
= (response
>> 8) & 0xff;
2890 /* convert BCD to int */
2891 mac_major_version
-= (mac_major_version
>> 4) * 6;
2893 return Fcons (make_number (mac_major_version
),
2894 Fcons (make_number ((response
>> 4) & 0xf),
2895 Fcons (make_number (response
& 0xf),
2899 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
2900 doc
: /* Return the number of screens on the server of DISPLAY.
2901 The optional argument DISPLAY specifies which display to ask about.
2902 DISPLAY should be either a frame or a display name (a string).
2903 If omitted or nil, that stands for the selected frame's display. */)
2905 Lisp_Object display
;
2907 return make_number (1);
2910 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
2911 doc
: /* Return the height in millimeters of DISPLAY.
2912 The optional argument DISPLAY specifies which display to ask about.
2913 DISPLAY should be either a frame or a display name (a string).
2914 If omitted or nil, that stands for the selected frame's display. */)
2916 Lisp_Object display
;
2918 /* MAC_TODO: this is an approximation, and only of the main display */
2920 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2922 return make_number ((int) (dpyinfo
->height
* 25.4 / dpyinfo
->resy
));
2925 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
2926 doc
: /* Return the width in millimeters of DISPLAY.
2927 The optional argument DISPLAY specifies which display to ask about.
2928 DISPLAY should be either a frame or a display name (a string).
2929 If omitted or nil, that stands for the selected frame's display. */)
2931 Lisp_Object display
;
2933 /* MAC_TODO: this is an approximation, and only of the main display */
2935 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2937 return make_number ((int) (dpyinfo
->width
* 25.4 / dpyinfo
->resx
));
2940 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
2941 Sx_display_backing_store
, 0, 1, 0,
2942 doc
: /* Returns an indication of whether DISPLAY does backing store.
2943 The value may be `always', `when-mapped', or `not-useful'.
2944 The optional argument DISPLAY specifies which display to ask about.
2945 DISPLAY should be either a frame or a display name (a string).
2946 If omitted or nil, that stands for the selected frame's display. */)
2948 Lisp_Object display
;
2950 return intern ("not-useful");
2953 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
2954 Sx_display_visual_class
, 0, 1, 0,
2955 doc
: /* Returns the visual class of DISPLAY.
2956 The value is one of the symbols `static-gray', `gray-scale',
2957 `static-color', `pseudo-color', `true-color', or `direct-color'.
2959 The optional argument DISPLAY specifies which display to ask about.
2960 DISPLAY should be either a frame or a display name (a string).
2961 If omitted or nil, that stands for the selected frame's display. */)
2963 Lisp_Object display
;
2965 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2968 switch (dpyinfo
->visual
->class)
2970 case StaticGray
: return (intern ("static-gray"));
2971 case GrayScale
: return (intern ("gray-scale"));
2972 case StaticColor
: return (intern ("static-color"));
2973 case PseudoColor
: return (intern ("pseudo-color"));
2974 case TrueColor
: return (intern ("true-color"));
2975 case DirectColor
: return (intern ("direct-color"));
2977 error ("Display has an unknown visual class");
2981 return (intern ("true-color"));
2984 DEFUN ("x-display-save-under", Fx_display_save_under
,
2985 Sx_display_save_under
, 0, 1, 0,
2986 doc
: /* Returns t if DISPLAY supports the save-under feature.
2987 The optional argument DISPLAY specifies which display to ask about.
2988 DISPLAY should be either a frame or a display name (a string).
2989 If omitted or nil, that stands for the selected frame's display. */)
2991 Lisp_Object display
;
2998 register struct frame
*f
;
3000 return FRAME_PIXEL_WIDTH (f
);
3005 register struct frame
*f
;
3007 return FRAME_PIXEL_HEIGHT (f
);
3012 register struct frame
*f
;
3014 return FRAME_COLUMN_WIDTH (f
);
3019 register struct frame
*f
;
3021 return FRAME_LINE_HEIGHT (f
);
3026 register struct frame
*f
;
3028 return FRAME_MAC_DISPLAY_INFO (f
)->n_planes
;
3031 /* Return the display structure for the display named NAME.
3032 Open a new connection if necessary. */
3034 struct mac_display_info
*
3035 x_display_info_for_name (name
)
3039 struct mac_display_info
*dpyinfo
;
3041 CHECK_STRING (name
);
3043 if (! EQ (Vwindow_system
, intern ("mac")))
3044 error ("Not using Mac native windows");
3046 for (dpyinfo
= &one_mac_display_info
, names
= x_display_name_list
;
3048 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
3051 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
3056 /* Use this general default value to start with. */
3057 Vx_resource_name
= Vinvocation_name
;
3059 validate_x_resource_name ();
3061 dpyinfo
= mac_term_init (name
, (unsigned char *) 0,
3062 (char *) SDATA (Vx_resource_name
));
3065 error ("Cannot connect to server %s", SDATA (name
));
3068 XSETFASTINT (Vwindow_system_version
, 3);
3073 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
3075 doc
: /* Open a connection to a server.
3076 DISPLAY is the name of the display to connect to.
3077 Optional second arg XRM-STRING is a string of resources in xrdb format.
3078 If the optional third arg MUST-SUCCEED is non-nil,
3079 terminate Emacs if we can't open the connection. */)
3080 (display
, xrm_string
, must_succeed
)
3081 Lisp_Object display
, xrm_string
, must_succeed
;
3083 unsigned char *xrm_option
;
3084 struct mac_display_info
*dpyinfo
;
3086 CHECK_STRING (display
);
3087 if (! NILP (xrm_string
))
3088 CHECK_STRING (xrm_string
);
3090 if (! EQ (Vwindow_system
, intern ("mac")))
3091 error ("Not using Mac native windows");
3093 if (! NILP (xrm_string
))
3094 xrm_option
= (unsigned char *) SDATA (xrm_string
);
3096 xrm_option
= (unsigned char *) 0;
3098 validate_x_resource_name ();
3100 /* This is what opens the connection and sets x_current_display.
3101 This also initializes many symbols, such as those used for input. */
3102 dpyinfo
= mac_term_init (display
, xrm_option
,
3103 (char *) SDATA (Vx_resource_name
));
3107 if (!NILP (must_succeed
))
3108 fatal ("Cannot connect to server %s.\n",
3111 error ("Cannot connect to server %s", SDATA (display
));
3116 XSETFASTINT (Vwindow_system_version
, 3);
3120 DEFUN ("x-close-connection", Fx_close_connection
,
3121 Sx_close_connection
, 1, 1, 0,
3122 doc
: /* Close the connection to DISPLAY's server.
3123 For DISPLAY, specify either a frame or a display name (a string).
3124 If DISPLAY is nil, that stands for the selected frame's display. */)
3126 Lisp_Object display
;
3128 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
3131 if (dpyinfo
->reference_count
> 0)
3132 error ("Display still has frames on it");
3135 /* Free the fonts in the font table. */
3136 for (i
= 0; i
< dpyinfo
->n_fonts
; i
++)
3137 if (dpyinfo
->font_table
[i
].name
)
3139 mac_unload_font (dpyinfo
, dpyinfo
->font_table
[i
].font
);
3142 x_destroy_all_bitmaps (dpyinfo
);
3144 x_delete_display (dpyinfo
);
3150 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
3151 doc
: /* Return the list of display names that Emacs has connections to. */)
3154 Lisp_Object tail
, result
;
3157 for (tail
= x_display_name_list
; ! NILP (tail
); tail
= XCDR (tail
))
3158 result
= Fcons (XCAR (XCAR (tail
)), result
);
3163 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
3164 doc
: /* This is a noop on Mac OS systems. */)
3166 Lisp_Object display
, on
;
3172 /***********************************************************************
3174 ***********************************************************************/
3176 DEFUN ("x-change-window-property", Fx_change_window_property
,
3177 Sx_change_window_property
, 2, 6, 0,
3178 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
3179 VALUE may be a string or a list of conses, numbers and/or strings.
3180 If an element in the list is a string, it is converted to
3181 an Atom and the value of the Atom is used. If an element is a cons,
3182 it is converted to a 32 bit number where the car is the 16 top bits and the
3183 cdr is the lower 16 bits.
3184 FRAME nil or omitted means use the selected frame.
3185 If TYPE is given and non-nil, it is the name of the type of VALUE.
3186 If TYPE is not given or nil, the type is STRING.
3187 FORMAT gives the size in bits of each element if VALUE is a list.
3188 It must be one of 8, 16 or 32.
3189 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
3190 If OUTER_P is non-nil, the property is changed for the outer X window of
3191 FRAME. Default is to change on the edit X window.
3194 (prop
, value
, frame
, type
, format
, outer_p
)
3195 Lisp_Object prop
, value
, frame
, type
, format
, outer_p
;
3197 #if 0 /* MAC_TODO : port window properties to Mac */
3198 struct frame
*f
= check_x_frame (frame
);
3201 CHECK_STRING (prop
);
3202 CHECK_STRING (value
);
3205 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3206 XChangeProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3207 prop_atom
, XA_STRING
, 8, PropModeReplace
,
3208 SDATA (value
), SCHARS (value
));
3210 /* Make sure the property is set when we return. */
3211 XFlush (FRAME_W32_DISPLAY (f
));
3214 #endif /* MAC_TODO */
3220 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
3221 Sx_delete_window_property
, 1, 2, 0,
3222 doc
: /* Remove window property PROP from X window of FRAME.
3223 FRAME nil or omitted means use the selected frame. Value is PROP. */)
3225 Lisp_Object prop
, frame
;
3227 #if 0 /* MAC_TODO : port window properties to Mac */
3229 struct frame
*f
= check_x_frame (frame
);
3232 CHECK_STRING (prop
);
3234 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3235 XDeleteProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
), prop_atom
);
3237 /* Make sure the property is removed when we return. */
3238 XFlush (FRAME_W32_DISPLAY (f
));
3240 #endif /* MAC_TODO */
3246 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
3248 doc
: /* Value is the value of window property PROP on FRAME.
3249 If FRAME is nil or omitted, use the selected frame. Value is nil
3250 if FRAME hasn't a property with name PROP or if PROP has no string
3253 Lisp_Object prop
, frame
;
3255 #if 0 /* MAC_TODO : port window properties to Mac */
3257 struct frame
*f
= check_x_frame (frame
);
3260 Lisp_Object prop_value
= Qnil
;
3261 char *tmp_data
= NULL
;
3264 unsigned long actual_size
, bytes_remaining
;
3266 CHECK_STRING (prop
);
3268 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3269 rc
= XGetWindowProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3270 prop_atom
, 0, 0, False
, XA_STRING
,
3271 &actual_type
, &actual_format
, &actual_size
,
3272 &bytes_remaining
, (unsigned char **) &tmp_data
);
3275 int size
= bytes_remaining
;
3280 rc
= XGetWindowProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3281 prop_atom
, 0, bytes_remaining
,
3283 &actual_type
, &actual_format
,
3284 &actual_size
, &bytes_remaining
,
3285 (unsigned char **) &tmp_data
);
3287 prop_value
= make_string (tmp_data
, size
);
3296 #endif /* MAC_TODO */
3302 /***********************************************************************
3304 ***********************************************************************/
3306 /* If non-null, an asynchronous timer that, when it expires, displays
3307 an hourglass cursor on all frames. */
3309 static struct atimer
*hourglass_atimer
;
3311 /* Non-zero means an hourglass cursor is currently shown. */
3313 static int hourglass_shown_p
;
3315 /* Number of seconds to wait before displaying an hourglass cursor. */
3317 static Lisp_Object Vhourglass_delay
;
3319 /* Default number of seconds to wait before displaying an hourglass
3322 #define DEFAULT_HOURGLASS_DELAY 1
3324 /* Function prototypes. */
3326 static void show_hourglass
P_ ((struct atimer
*));
3327 static void hide_hourglass
P_ ((void));
3329 /* Return non-zero if houglass timer has been started or hourglass is shown. */
3332 hourglass_started ()
3334 return hourglass_shown_p
|| hourglass_atimer
!= NULL
;
3338 /* Cancel a currently active hourglass timer, and start a new one. */
3345 int secs
, usecs
= 0;
3347 /* Don't bother for ttys. */
3348 if (NILP (Vwindow_system
))
3351 cancel_hourglass ();
3353 if (INTEGERP (Vhourglass_delay
)
3354 && XINT (Vhourglass_delay
) > 0)
3355 secs
= XFASTINT (Vhourglass_delay
);
3356 else if (FLOATP (Vhourglass_delay
)
3357 && XFLOAT_DATA (Vhourglass_delay
) > 0)
3360 tem
= Ftruncate (Vhourglass_delay
, Qnil
);
3361 secs
= XFASTINT (tem
);
3362 usecs
= (XFLOAT_DATA (Vhourglass_delay
) - secs
) * 1000000;
3365 secs
= DEFAULT_HOURGLASS_DELAY
;
3367 EMACS_SET_SECS_USECS (delay
, secs
, usecs
);
3368 hourglass_atimer
= start_atimer (ATIMER_RELATIVE
, delay
,
3369 show_hourglass
, NULL
);
3370 #endif /* MAC_OSX */
3374 /* Cancel the hourglass cursor timer if active, hide a busy cursor if
3381 if (hourglass_atimer
)
3383 cancel_atimer (hourglass_atimer
);
3384 hourglass_atimer
= NULL
;
3387 if (hourglass_shown_p
)
3389 #endif /* MAC_OSX */
3393 /* Timer function of hourglass_atimer. TIMER is equal to
3396 On Mac, busy status is shown by the progress indicator (chasing
3397 arrows) at the upper-right corner of each frame instead of the
3398 hourglass pointer. */
3401 show_hourglass (timer
)
3402 struct atimer
*timer
;
3404 #if TARGET_API_MAC_CARBON
3405 /* The timer implementation will cancel this timer automatically
3406 after this function has run. Set hourglass_atimer to null
3407 so that we know the timer doesn't have to be canceled. */
3408 hourglass_atimer
= NULL
;
3410 if (!hourglass_shown_p
)
3412 Lisp_Object rest
, frame
;
3416 FOR_EACH_FRAME (rest
, frame
)
3418 struct frame
*f
= XFRAME (frame
);
3420 if (FRAME_LIVE_P (f
) && FRAME_MAC_P (f
)
3421 && FRAME_MAC_WINDOW (f
) != tip_window
)
3423 if (!f
->output_data
.mac
->hourglass_control
)
3425 Window w
= FRAME_MAC_WINDOW (f
);
3429 GetWindowPortBounds (w
, &r
);
3430 r
.left
= r
.right
- HOURGLASS_WIDTH
;
3431 r
.bottom
= r
.top
+ HOURGLASS_HEIGHT
;
3432 if (CreateChasingArrowsControl (w
, &r
, &c
) == noErr
)
3433 f
->output_data
.mac
->hourglass_control
= c
;
3436 if (f
->output_data
.mac
->hourglass_control
)
3437 ShowControl (f
->output_data
.mac
->hourglass_control
);
3441 hourglass_shown_p
= 1;
3444 #endif /* TARGET_API_MAC_CARBON */
3448 /* Hide the progress indicators on all frames, if it is currently
3454 #if TARGET_API_MAC_CARBON
3455 if (hourglass_shown_p
)
3457 Lisp_Object rest
, frame
;
3460 FOR_EACH_FRAME (rest
, frame
)
3462 struct frame
*f
= XFRAME (frame
);
3465 /* Watch out for newly created frames. */
3466 && f
->output_data
.mac
->hourglass_control
)
3467 HideControl (f
->output_data
.mac
->hourglass_control
);
3470 hourglass_shown_p
= 0;
3473 #endif /* TARGET_API_MAC_CARBON */
3478 /***********************************************************************
3480 ***********************************************************************/
3482 static Lisp_Object x_create_tip_frame
P_ ((struct mac_display_info
*,
3483 Lisp_Object
, Lisp_Object
));
3484 static void compute_tip_xy
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
,
3485 Lisp_Object
, int, int, int *, int *));
3487 /* The frame of a currently visible tooltip. */
3489 Lisp_Object tip_frame
;
3491 /* If non-nil, a timer started that hides the last tooltip when it
3494 Lisp_Object tip_timer
;
3497 /* If non-nil, a vector of 3 elements containing the last args
3498 with which x-show-tip was called. See there. */
3500 Lisp_Object last_show_tip_args
;
3502 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
3504 Lisp_Object Vx_max_tooltip_size
;
3508 unwind_create_tip_frame (frame
)
3511 Lisp_Object deleted
;
3513 deleted
= unwind_create_frame (frame
);
3514 if (EQ (deleted
, Qt
))
3524 /* Create a frame for a tooltip on the display described by DPYINFO.
3525 PARMS is a list of frame parameters. TEXT is the string to
3526 display in the tip frame. Value is the frame.
3528 Note that functions called here, esp. x_default_parameter can
3529 signal errors, for instance when a specified color name is
3530 undefined. We have to make sure that we're in a consistent state
3531 when this happens. */
3534 x_create_tip_frame (dpyinfo
, parms
, text
)
3535 struct mac_display_info
*dpyinfo
;
3536 Lisp_Object parms
, text
;
3539 Lisp_Object frame
, tem
;
3541 long window_prompting
= 0;
3543 int count
= SPECPDL_INDEX ();
3544 struct gcpro gcpro1
, gcpro2
, gcpro3
;
3546 int face_change_count_before
= face_change_count
;
3548 struct buffer
*old_buffer
;
3554 kb
= dpyinfo
->kboard
;
3556 kb
= &the_only_kboard
;
3559 /* Get the name of the frame to use for resource lookup. */
3560 name
= mac_get_arg (parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3562 && !EQ (name
, Qunbound
)
3564 error ("Invalid frame name--not a string or nil");
3567 GCPRO3 (parms
, name
, frame
);
3569 XSETFRAME (frame
, f
);
3571 buffer
= Fget_buffer_create (build_string (" *tip*"));
3572 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
3573 old_buffer
= current_buffer
;
3574 set_buffer_internal_1 (XBUFFER (buffer
));
3575 current_buffer
->truncate_lines
= Qnil
;
3576 specbind (Qinhibit_read_only
, Qt
);
3577 specbind (Qinhibit_modification_hooks
, Qt
);
3580 set_buffer_internal_1 (old_buffer
);
3582 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
3583 record_unwind_protect (unwind_create_tip_frame
, frame
);
3585 /* By setting the output method, we're essentially saying that
3586 the frame is live, as per FRAME_LIVE_P. If we get a signal
3587 from this point on, x_destroy_window might screw up reference
3589 f
->output_method
= output_mac
;
3590 f
->output_data
.mac
=
3591 (struct mac_output
*) xmalloc (sizeof (struct mac_output
));
3592 bzero (f
->output_data
.mac
, sizeof (struct mac_output
));
3594 FRAME_FONTSET (f
) = -1;
3595 f
->icon_name
= Qnil
;
3598 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
3599 dpyinfo_refcount
= dpyinfo
->reference_count
;
3600 #endif /* GLYPH_DEBUG */
3602 FRAME_KBOARD (f
) = kb
;
3604 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
3605 f
->output_data
.mac
->explicit_parent
= 0;
3607 /* Set the name; the functions to which we pass f expect the name to
3609 if (EQ (name
, Qunbound
) || NILP (name
))
3611 f
->name
= build_string (dpyinfo
->mac_id_name
);
3612 f
->explicit_name
= 0;
3617 f
->explicit_name
= 1;
3618 /* use the frame's title when getting resources for this frame. */
3619 specbind (Qx_resource_name
, name
);
3622 /* Extract the window parameters from the supplied values that are
3623 needed to determine window geometry. */
3627 font
= mac_get_arg (parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3630 /* First, try whatever font the caller has specified. */
3633 tem
= Fquery_fontset (font
, Qnil
);
3635 font
= x_new_fontset (f
, SDATA (tem
));
3637 font
= x_new_font (f
, SDATA (font
));
3640 /* Try out a font which we hope has bold and italic variations. */
3642 if (! STRINGP (font
))
3643 font
= x_new_font (f
, "-*-monaco-medium-r-normal--12-*-*-*-*-*-iso10646-1");
3645 if (! STRINGP (font
))
3646 font
= x_new_font (f
, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
3647 /* If those didn't work, look for something which will at least work. */
3648 if (! STRINGP (font
))
3649 font
= x_new_fontset (f
, "fontset-mac");
3650 if (! STRINGP (font
))
3651 font
= x_new_font (f
, "-*-monaco-*-12-*-mac-roman");
3652 if (! STRINGP (font
))
3653 font
= x_new_font (f
, "-*-courier-*-10-*-mac-roman");
3655 if (! STRINGP (font
))
3656 error ("Cannot find any usable font");
3658 x_default_parameter (f
, parms
, Qfont
, font
,
3659 "font", "Font", RES_TYPE_STRING
);
3662 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
3663 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
3665 /* This defaults to 2 in order to match xterm. We recognize either
3666 internalBorderWidth or internalBorder (which is what xterm calls
3668 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3672 value
= mac_get_arg (parms
, Qinternal_border_width
,
3673 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
3674 if (! EQ (value
, Qunbound
))
3675 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
3679 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
3680 "internalBorderWidth", "internalBorderWidth",
3683 /* Also do the stuff which must be set before the window exists. */
3684 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3685 "foreground", "Foreground", RES_TYPE_STRING
);
3686 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3687 "background", "Background", RES_TYPE_STRING
);
3688 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3689 "pointerColor", "Foreground", RES_TYPE_STRING
);
3690 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3691 "cursorColor", "Foreground", RES_TYPE_STRING
);
3692 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3693 "borderColor", "BorderColor", RES_TYPE_STRING
);
3695 /* Init faces before x_default_parameter is called for scroll-bar
3696 parameters because that function calls x_set_scroll_bar_width,
3697 which calls change_frame_size, which calls Fset_window_buffer,
3698 which runs hooks, which call Fvertical_motion. At the end, we
3699 end up in init_iterator with a null face cache, which should not
3701 init_frame_faces (f
);
3703 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
3705 window_prompting
= x_figure_window_size (f
, parms
, 0);
3711 SetRect (&r
, 0, 0, 1, 1);
3712 #if TARGET_API_MAC_CARBON
3713 if (CreateNewWindow (kHelpWindowClass
,
3714 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
3715 kWindowIgnoreClicksAttribute
|
3717 kWindowNoUpdatesAttribute
|
3718 kWindowNoActivatesAttribute
,
3719 &r
, &tip_window
) == noErr
)
3721 if (tip_window
= NewCWindow (NULL
, &r
, "\p", false, plainDBox
,
3725 FRAME_MAC_WINDOW (f
) = tip_window
;
3726 XSetWindowBackground (FRAME_MAC_DISPLAY(f
), tip_window
,
3727 FRAME_BACKGROUND_PIXEL (f
));
3728 SetWRefCon (tip_window
, (long) f
->output_data
.mac
);
3729 /* so that update events can find this mac_output struct */
3730 f
->output_data
.mac
->mFP
= f
;
3737 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3738 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3739 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3740 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3741 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3742 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3744 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3745 Change will not be effected unless different from the current
3747 width
= FRAME_COLS (f
);
3748 height
= FRAME_LINES (f
);
3749 SET_FRAME_COLS (f
, 0);
3750 FRAME_LINES (f
) = 0;
3751 change_frame_size (f
, height
, width
, 1, 0, 0);
3753 /* Add `tooltip' frame parameter's default value. */
3754 if (NILP (Fframe_parameter (frame
, intern ("tooltip"))))
3755 Fmodify_frame_parameters (frame
, Fcons (Fcons (intern ("tooltip"), Qt
),
3758 /* Set up faces after all frame parameters are known. This call
3759 also merges in face attributes specified for new frames.
3761 Frame parameters may be changed if .Xdefaults contains
3762 specifications for the default font. For example, if there is an
3763 `Emacs.default.attributeBackground: pink', the `background-color'
3764 attribute of the frame get's set, which let's the internal border
3765 of the tooltip frame appear in pink. Prevent this. */
3767 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
3769 /* Set tip_frame here, so that */
3771 call1 (Qface_set_after_frame_default
, frame
);
3773 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
3774 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
3782 /* It is now ok to make the frame official even if we get an error
3783 below. And the frame needs to be on Vframe_list or making it
3784 visible won't work. */
3785 Vframe_list
= Fcons (frame
, Vframe_list
);
3787 /* Now that the frame is official, it counts as a reference to
3789 FRAME_MAC_DISPLAY_INFO (f
)->reference_count
++;
3791 /* Setting attributes of faces of the tooltip frame from resources
3792 and similar will increment face_change_count, which leads to the
3793 clearing of all current matrices. Since this isn't necessary
3794 here, avoid it by resetting face_change_count to the value it
3795 had before we created the tip frame. */
3796 face_change_count
= face_change_count_before
;
3798 /* Discard the unwind_protect. */
3799 return unbind_to (count
, frame
);
3803 /* Compute where to display tip frame F. PARMS is the list of frame
3804 parameters for F. DX and DY are specified offsets from the current
3805 location of the mouse. WIDTH and HEIGHT are the width and height
3806 of the tooltip. Return coordinates relative to the root window of
3807 the display in *ROOT_X, and *ROOT_Y. */
3810 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, root_x
, root_y
)
3812 Lisp_Object parms
, dx
, dy
;
3814 int *root_x
, *root_y
;
3816 Lisp_Object left
, top
;
3818 /* User-specified position? */
3819 left
= Fcdr (Fassq (Qleft
, parms
));
3820 top
= Fcdr (Fassq (Qtop
, parms
));
3822 /* Move the tooltip window where the mouse pointer is. Resize and
3824 if (!INTEGERP (left
) || !INTEGERP (top
))
3829 GetMouse (&mouse_pos
);
3830 LocalToGlobal (&mouse_pos
);
3831 *root_x
= mouse_pos
.h
;
3832 *root_y
= mouse_pos
.v
;
3837 *root_y
= XINT (top
);
3838 else if (*root_y
+ XINT (dy
) - height
< 0)
3839 *root_y
-= XINT (dy
);
3843 *root_y
+= XINT (dy
);
3846 if (INTEGERP (left
))
3847 *root_x
= XINT (left
);
3848 else if (*root_x
+ XINT (dx
) + width
<= FRAME_MAC_DISPLAY_INFO (f
)->width
)
3849 /* It fits to the right of the pointer. */
3850 *root_x
+= XINT (dx
);
3851 else if (width
+ XINT (dx
) <= *root_x
)
3852 /* It fits to the left of the pointer. */
3853 *root_x
-= width
+ XINT (dx
);
3855 /* Put it left-justified on the screen -- it ought to fit that way. */
3860 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
3861 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
3862 A tooltip window is a small window displaying a string.
3864 FRAME nil or omitted means use the selected frame.
3866 PARMS is an optional list of frame parameters which can be used to
3867 change the tooltip's appearance.
3869 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
3870 means use the default timeout of 5 seconds.
3872 If the list of frame parameters PARMS contains a `left' parameter,
3873 the tooltip is displayed at that x-position. Otherwise it is
3874 displayed at the mouse position, with offset DX added (default is 5 if
3875 DX isn't specified). Likewise for the y-position; if a `top' frame
3876 parameter is specified, it determines the y-position of the tooltip
3877 window, otherwise it is displayed at the mouse position, with offset
3878 DY added (default is -10).
3880 A tooltip's maximum size is specified by `x-max-tooltip-size'.
3881 Text larger than the specified size is clipped. */)
3882 (string
, frame
, parms
, timeout
, dx
, dy
)
3883 Lisp_Object string
, frame
, parms
, timeout
, dx
, dy
;
3888 struct buffer
*old_buffer
;
3889 struct text_pos pos
;
3890 int i
, width
, height
;
3891 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3892 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
3893 int count
= SPECPDL_INDEX ();
3895 specbind (Qinhibit_redisplay
, Qt
);
3897 GCPRO4 (string
, parms
, frame
, timeout
);
3899 CHECK_STRING (string
);
3900 f
= check_x_frame (frame
);
3902 timeout
= make_number (5);
3904 CHECK_NATNUM (timeout
);
3907 dx
= make_number (5);
3912 dy
= make_number (-10);
3916 if (NILP (last_show_tip_args
))
3917 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
3919 if (!NILP (tip_frame
))
3921 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
3922 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
3923 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
3925 if (EQ (frame
, last_frame
)
3926 && !NILP (Fequal (last_string
, string
))
3927 && !NILP (Fequal (last_parms
, parms
)))
3929 struct frame
*f
= XFRAME (tip_frame
);
3931 /* Only DX and DY have changed. */
3932 if (!NILP (tip_timer
))
3934 Lisp_Object timer
= tip_timer
;
3936 call1 (Qcancel_timer
, timer
);
3940 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
3941 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
3942 MoveWindow (FRAME_MAC_WINDOW (f
), root_x
, root_y
, false);
3948 /* Hide a previous tip, if any. */
3951 ASET (last_show_tip_args
, 0, string
);
3952 ASET (last_show_tip_args
, 1, frame
);
3953 ASET (last_show_tip_args
, 2, parms
);
3955 /* Add default values to frame parameters. */
3956 if (NILP (Fassq (Qname
, parms
)))
3957 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
3958 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3959 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
3960 if (NILP (Fassq (Qborder_width
, parms
)))
3961 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
3962 if (NILP (Fassq (Qborder_color
, parms
)))
3963 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
3964 if (NILP (Fassq (Qbackground_color
, parms
)))
3965 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
3968 /* Create a frame for the tooltip, and record it in the global
3969 variable tip_frame. */
3970 frame
= x_create_tip_frame (FRAME_MAC_DISPLAY_INFO (f
), parms
, string
);
3973 /* Set up the frame's root window. */
3974 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
3975 w
->left_col
= w
->top_line
= make_number (0);
3977 if (CONSP (Vx_max_tooltip_size
)
3978 && INTEGERP (XCAR (Vx_max_tooltip_size
))
3979 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
3980 && INTEGERP (XCDR (Vx_max_tooltip_size
))
3981 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
3983 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
3984 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
3988 w
->total_cols
= make_number (80);
3989 w
->total_lines
= make_number (40);
3992 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
3994 w
->pseudo_window_p
= 1;
3996 /* Display the tooltip text in a temporary buffer. */
3997 old_buffer
= current_buffer
;
3998 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
3999 current_buffer
->truncate_lines
= Qnil
;
4000 clear_glyph_matrix (w
->desired_matrix
);
4001 clear_glyph_matrix (w
->current_matrix
);
4002 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
4003 try_window (FRAME_ROOT_WINDOW (f
), pos
, 0);
4005 /* Compute width and height of the tooltip. */
4007 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
4009 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
4013 /* Stop at the first empty row at the end. */
4014 if (!row
->enabled_p
|| !row
->displays_text_p
)
4017 /* Let the row go over the full width of the frame. */
4018 row
->full_width_p
= 1;
4020 /* There's a glyph at the end of rows that is used to place
4021 the cursor there. Don't include the width of this glyph. */
4022 if (row
->used
[TEXT_AREA
])
4024 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
4025 row_width
= row
->pixel_width
- last
->pixel_width
;
4028 row_width
= row
->pixel_width
;
4030 height
+= row
->height
;
4031 width
= max (width
, row_width
);
4034 /* Add the frame's internal border to the width and height the X
4035 window should have. */
4036 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
4037 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
4039 /* Move the tooltip window where the mouse pointer is. Resize and
4041 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
4044 MoveWindow (FRAME_MAC_WINDOW (f
), root_x
, root_y
, false);
4045 SizeWindow (FRAME_MAC_WINDOW (f
), width
, height
, true);
4046 ShowWindow (FRAME_MAC_WINDOW (f
));
4047 BringToFront (FRAME_MAC_WINDOW (f
));
4050 /* Draw into the window. */
4051 w
->must_be_updated_p
= 1;
4052 update_single_window (w
, 1);
4054 /* Restore original current buffer. */
4055 set_buffer_internal_1 (old_buffer
);
4056 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
4059 /* Let the tip disappear after timeout seconds. */
4060 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
4061 intern ("x-hide-tip"));
4064 return unbind_to (count
, Qnil
);
4068 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
4069 doc
: /* Hide the current tooltip window, if there is any.
4070 Value is t if tooltip was open, nil otherwise. */)
4074 Lisp_Object deleted
, frame
, timer
;
4075 struct gcpro gcpro1
, gcpro2
;
4077 /* Return quickly if nothing to do. */
4078 if (NILP (tip_timer
) && NILP (tip_frame
))
4083 GCPRO2 (frame
, timer
);
4084 tip_frame
= tip_timer
= deleted
= Qnil
;
4086 count
= SPECPDL_INDEX ();
4087 specbind (Qinhibit_redisplay
, Qt
);
4088 specbind (Qinhibit_quit
, Qt
);
4091 call1 (Qcancel_timer
, timer
);
4095 Fdelete_frame (frame
, Qnil
);
4100 return unbind_to (count
, deleted
);
4105 #if TARGET_API_MAC_CARBON
4106 /***********************************************************************
4107 File selection dialog
4108 ***********************************************************************/
4110 static pascal void mac_nav_event_callback
P_ ((NavEventCallbackMessage
,
4111 NavCBRecPtr
, void *));
4114 There is a relatively standard way to do this using applescript to run
4115 a (choose file) method. However, this doesn't do "the right thing"
4116 by working only if the find-file occurred during a menu or toolbar
4117 click. So we must do the file dialog by hand, using the navigation
4118 manager. This also has more flexibility in determining the default
4119 directory and whether or not we are going to choose a file.
4122 extern Lisp_Object Qfile_name_history
;
4124 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
4125 doc
: /* Read file name, prompting with PROMPT in directory DIR.
4126 Use a file selection dialog.
4127 Select DEFAULT-FILENAME in the dialog's file selection box, if
4128 specified. Ensure that file exists if MUSTMATCH is non-nil.
4129 If ONLY-DIR-P is non-nil, the user can only select directories. */)
4130 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
4131 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
4133 struct frame
*f
= SELECTED_FRAME ();
4134 Lisp_Object file
= Qnil
;
4135 int count
= SPECPDL_INDEX ();
4136 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
4137 char filename
[MAXPATHLEN
];
4138 int default_filter_index
= 1; /* 1: All Files, 2: Directories only */
4139 static NavEventUPP mac_nav_event_callbackUPP
= NULL
;
4141 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, file
, only_dir_p
);
4142 CHECK_STRING (prompt
);
4145 /* Create the dialog with PROMPT as title, using DIR as initial
4146 directory and using "*" as pattern. */
4147 dir
= Fexpand_file_name (dir
, Qnil
);
4151 NavDialogCreationOptions options
;
4152 NavDialogRef dialogRef
;
4153 NavTypeListHandle fileTypes
= NULL
;
4154 NavUserAction userAction
;
4155 CFStringRef message
=NULL
, saveName
= NULL
;
4158 /* No need for a callback function because we are modal */
4159 NavGetDefaultDialogCreationOptions(&options
);
4160 options
.modality
= kWindowModalityAppModal
;
4161 options
.location
.h
= options
.location
.v
= -1;
4162 options
.optionFlags
= kNavDefaultNavDlogOptions
;
4163 options
.optionFlags
|= kNavAllFilesInPopup
; /* All files allowed */
4164 options
.optionFlags
|= kNavSelectAllReadableItem
;
4165 options
.optionFlags
&= ~kNavAllowMultipleFiles
;
4168 message
= cfstring_create_with_string (prompt
);
4169 options
.message
= message
;
4171 /* Don't set the application, let it use default.
4172 options.clientName = CFSTR ("Emacs");
4175 if (mac_nav_event_callbackUPP
== NULL
)
4176 mac_nav_event_callbackUPP
= NewNavEventUPP (mac_nav_event_callback
);
4178 if (!NILP (only_dir_p
))
4179 status
= NavCreateChooseFolderDialog(&options
, mac_nav_event_callbackUPP
,
4180 NULL
, NULL
, &dialogRef
);
4181 else if (NILP (mustmatch
))
4183 /* This is a save dialog */
4184 options
.optionFlags
|= kNavDontConfirmReplacement
;
4185 options
.actionButtonLabel
= CFSTR ("Ok");
4186 options
.windowTitle
= CFSTR ("Enter name");
4188 if (STRINGP (default_filename
))
4190 Lisp_Object utf8
= ENCODE_UTF_8 (default_filename
);
4191 char *begPtr
= SDATA(utf8
);
4192 char *filePtr
= begPtr
+ SBYTES(utf8
);
4193 while (filePtr
!= begPtr
&& !IS_DIRECTORY_SEP(filePtr
[-1]))
4195 saveName
= cfstring_create_with_utf8_cstring (filePtr
);
4196 options
.saveFileName
= saveName
;
4197 options
.optionFlags
|= kNavSelectDefaultLocation
;
4199 status
= NavCreatePutFileDialog(&options
,
4200 'TEXT', kNavGenericSignature
,
4201 mac_nav_event_callbackUPP
, NULL
,
4206 /* This is an open dialog*/
4207 status
= NavCreateChooseFileDialog(&options
, fileTypes
,
4208 mac_nav_event_callbackUPP
, NULL
,
4209 NULL
, NULL
, &dialogRef
);
4212 /* Set the default location and continue*/
4213 if (status
== noErr
)
4218 status
= FSPathMakeRef(SDATA(ENCODE_FILE(dir
)), &defLoc
, NULL
);
4221 status
= posix_pathname_to_fsspec (SDATA (ENCODE_FILE (dir
)), &defLoc
);
4223 if (status
== noErr
)
4226 AECreateDesc(typeFSRef
, &defLoc
, sizeof(FSRef
), &defLocAed
);
4228 AECreateDesc(typeFSS
, &defLoc
, sizeof(FSSpec
), &defLocAed
);
4230 NavCustomControl(dialogRef
, kNavCtlSetLocation
, (void*) &defLocAed
);
4231 AEDisposeDesc(&defLocAed
);
4233 status
= NavDialogRun(dialogRef
);
4236 if (saveName
) CFRelease(saveName
);
4237 if (message
) CFRelease(message
);
4239 if (status
== noErr
) {
4240 userAction
= NavDialogGetUserAction(dialogRef
);
4243 case kNavUserActionNone
:
4244 case kNavUserActionCancel
:
4245 break; /* Treat cancel like C-g */
4246 case kNavUserActionOpen
:
4247 case kNavUserActionChoose
:
4248 case kNavUserActionSaveAs
:
4250 NavReplyRecord reply
;
4257 status
= NavDialogGetReply(dialogRef
, &reply
);
4260 AECoerceDesc(&reply
.selection
, typeFSRef
, &aed
);
4261 AEGetDescData(&aed
, (void *) &fsRef
, sizeof (FSRef
));
4262 FSRefMakePath(&fsRef
, (UInt8
*) filename
, sizeof (filename
));
4264 AECoerceDesc (&reply
.selection
, typeFSS
, &aed
);
4265 AEGetDescData (&aed
, (void *) &fs
, sizeof (FSSpec
));
4266 fsspec_to_posix_pathname (&fs
, filename
, sizeof (filename
) - 1);
4268 AEDisposeDesc(&aed
);
4269 if (reply
.saveFileName
)
4271 /* If it was a saved file, we need to add the file name */
4272 int len
= strlen(filename
);
4273 if (len
&& filename
[len
-1] != '/')
4274 filename
[len
++] = '/';
4275 CFStringGetCString(reply
.saveFileName
, filename
+len
,
4276 sizeof (filename
) - len
,
4278 kCFStringEncodingUTF8
4280 CFStringGetSystemEncoding ()
4284 file
= DECODE_FILE (make_unibyte_string (filename
,
4285 strlen (filename
)));
4286 NavDisposeReply(&reply
);
4290 NavDialogDispose(dialogRef
);
4295 /* Fall back on minibuffer if there was a problem */
4296 file
= Fcompleting_read (prompt
, intern ("read-file-name-internal"),
4297 dir
, mustmatch
, dir
, Qfile_name_history
,
4298 default_filename
, Qnil
);
4304 /* Make "Cancel" equivalent to C-g. */
4306 Fsignal (Qquit
, Qnil
);
4308 return unbind_to (count
, file
);
4312 /* Need to register some event callback function for enabling drag and
4313 drop in Navigation Service dialogs. */
4315 mac_nav_event_callback (selector
, parms
, data
)
4316 NavEventCallbackMessage selector
;
4323 /***********************************************************************
4325 ***********************************************************************/
4327 /* Keep this list in the same order as frame_parms in frame.c.
4328 Use 0 for unsupported frame parameters. */
4330 frame_parm_handler mac_frame_parm_handlers
[] =
4334 x_set_background_color
,
4340 x_set_foreground_color
,
4342 0, /* MAC_TODO: x_set_icon_type, */
4343 x_set_internal_border_width
,
4344 x_set_menu_bar_lines
,
4346 x_explicitly_set_name
,
4347 x_set_scroll_bar_width
,
4350 x_set_vertical_scroll_bars
,
4352 x_set_tool_bar_lines
,
4353 0, /* MAC_TODO: x_set_scroll_bar_foreground, */
4354 0, /* MAC_TODO: x_set_scroll_bar_background, */
4359 0, /* x_set_wait_for_wm, */
4367 /* This is zero if not using Mac native windows. */
4370 /* Certainly running on Mac native windows. */
4374 /* The section below is built by the lisp expression at the top of the file,
4375 just above where these variables are declared. */
4376 /*&&& init symbols here &&&*/
4377 Qnone
= intern ("none");
4379 Qsuppress_icon
= intern ("suppress-icon");
4380 staticpro (&Qsuppress_icon
);
4381 Qundefined_color
= intern ("undefined-color");
4382 staticpro (&Qundefined_color
);
4383 Qcancel_timer
= intern ("cancel-timer");
4384 staticpro (&Qcancel_timer
);
4385 /* This is the end of symbol initialization. */
4387 /* Text property `display' should be nonsticky by default. */
4388 Vtext_property_default_nonsticky
4389 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
4392 Fput (Qundefined_color
, Qerror_conditions
,
4393 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
4394 Fput (Qundefined_color
, Qerror_message
,
4395 build_string ("Undefined color"));
4397 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
4398 doc
: /* The shape of the pointer when over text.
4399 Changing the value does not affect existing frames
4400 unless you set the mouse color. */);
4401 Vx_pointer_shape
= Qnil
;
4403 #if 0 /* This doesn't really do anything. */
4404 DEFVAR_LISP ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
4405 doc
: /* The shape of the pointer when not over text.
4406 This variable takes effect when you create a new frame
4407 or when you set the mouse color. */);
4409 Vx_nontext_pointer_shape
= Qnil
;
4411 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
4412 doc
: /* The shape of the pointer when Emacs is busy.
4413 This variable takes effect when you create a new frame
4414 or when you set the mouse color. */);
4415 Vx_hourglass_pointer_shape
= Qnil
;
4417 DEFVAR_BOOL ("display-hourglass", &display_hourglass_p
,
4418 doc
: /* Non-zero means Emacs displays an hourglass pointer on window systems. */);
4419 display_hourglass_p
= 1;
4421 DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay
,
4422 doc
: /* *Seconds to wait before displaying an hourglass pointer.
4423 Value must be an integer or float. */);
4424 Vhourglass_delay
= make_number (DEFAULT_HOURGLASS_DELAY
);
4426 #if 0 /* This doesn't really do anything. */
4427 DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
4428 doc
: /* The shape of the pointer when over the mode line.
4429 This variable takes effect when you create a new frame
4430 or when you set the mouse color. */);
4432 Vx_mode_pointer_shape
= Qnil
;
4434 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
4435 &Vx_sensitive_text_pointer_shape
,
4436 doc
: /* The shape of the pointer when over mouse-sensitive text.
4437 This variable takes effect when you create a new frame
4438 or when you set the mouse color. */);
4439 Vx_sensitive_text_pointer_shape
= Qnil
;
4441 DEFVAR_LISP ("x-window-horizontal-drag-cursor",
4442 &Vx_window_horizontal_drag_shape
,
4443 doc
: /* Pointer shape to use for indicating a window can be dragged horizontally.
4444 This variable takes effect when you create a new frame
4445 or when you set the mouse color. */);
4446 Vx_window_horizontal_drag_shape
= Qnil
;
4448 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
4449 doc
: /* A string indicating the foreground color of the cursor box. */);
4450 Vx_cursor_fore_pixel
= Qnil
;
4452 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
4453 doc
: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS).
4454 Text larger than this is clipped. */);
4455 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
4457 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
4458 doc
: /* Non-nil if no window manager is in use.
4459 Emacs doesn't try to figure this out; this is always nil
4460 unless you set it to something else. */);
4461 /* We don't have any way to find this out, so set it to nil
4462 and maybe the user would like to set it to t. */
4463 Vx_no_window_manager
= Qnil
;
4465 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
4466 &Vx_pixel_size_width_font_regexp
,
4467 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
4469 Since Emacs gets width of a font matching with this regexp from
4470 PIXEL_SIZE field of the name, font finding mechanism gets faster for
4471 such a font. This is especially effective for such large fonts as
4472 Chinese, Japanese, and Korean. */);
4473 Vx_pixel_size_width_font_regexp
= Qnil
;
4475 /* X window properties. */
4476 defsubr (&Sx_change_window_property
);
4477 defsubr (&Sx_delete_window_property
);
4478 defsubr (&Sx_window_property
);
4480 defsubr (&Sxw_display_color_p
);
4481 defsubr (&Sx_display_grayscale_p
);
4482 defsubr (&Sxw_color_defined_p
);
4483 defsubr (&Sxw_color_values
);
4484 defsubr (&Sx_server_max_request_size
);
4485 defsubr (&Sx_server_vendor
);
4486 defsubr (&Sx_server_version
);
4487 defsubr (&Sx_display_pixel_width
);
4488 defsubr (&Sx_display_pixel_height
);
4489 defsubr (&Sx_display_mm_width
);
4490 defsubr (&Sx_display_mm_height
);
4491 defsubr (&Sx_display_screens
);
4492 defsubr (&Sx_display_planes
);
4493 defsubr (&Sx_display_color_cells
);
4494 defsubr (&Sx_display_visual_class
);
4495 defsubr (&Sx_display_backing_store
);
4496 defsubr (&Sx_display_save_under
);
4497 defsubr (&Sx_create_frame
);
4498 defsubr (&Sx_open_connection
);
4499 defsubr (&Sx_close_connection
);
4500 defsubr (&Sx_display_list
);
4501 defsubr (&Sx_synchronize
);
4503 /* Setting callback functions for fontset handler. */
4504 get_font_info_func
= x_get_font_info
;
4506 #if 0 /* This function pointer doesn't seem to be used anywhere.
4507 And the pointer assigned has the wrong type, anyway. */
4508 list_fonts_func
= x_list_fonts
;
4511 load_font_func
= x_load_font
;
4512 find_ccl_program_func
= x_find_ccl_program
;
4513 query_font_func
= x_query_font
;
4514 set_frame_fontset_func
= x_set_font
;
4515 check_window_system_func
= check_mac
;
4517 hourglass_atimer
= NULL
;
4518 hourglass_shown_p
= 0;
4520 defsubr (&Sx_show_tip
);
4521 defsubr (&Sx_hide_tip
);
4523 staticpro (&tip_timer
);
4525 staticpro (&tip_frame
);
4527 last_show_tip_args
= Qnil
;
4528 staticpro (&last_show_tip_args
);
4530 #if TARGET_API_MAC_CARBON
4531 defsubr (&Sx_file_dialog
);
4535 /* arch-tag: d7591289-f374-4377-b245-12f5dbbb8edc
4536 (do not change this comment) */