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. */
2535 if (! STRINGP (font
))
2536 font
= x_new_font (f
, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
2537 /* If those didn't work, look for something which will at least work. */
2538 if (! STRINGP (font
))
2539 font
= x_new_fontset (f
, "fontset-mac");
2540 if (! STRINGP (font
))
2541 font
= x_new_font (f
, "-*-monaco-*-12-*-mac-roman");
2542 if (! STRINGP (font
))
2543 font
= x_new_font (f
, "-*-courier-*-10-*-mac-roman");
2544 if (! STRINGP (font
))
2545 error ("Cannot find any usable font");
2548 x_default_parameter (f
, parms
, Qfont
, font
,
2549 "font", "Font", RES_TYPE_STRING
);
2552 x_default_parameter (f
, parms
, Qborder_width
, make_number (0),
2553 "borderwidth", "BorderWidth", RES_TYPE_NUMBER
);
2554 /* This defaults to 2 in order to match xterm. We recognize either
2555 internalBorderWidth or internalBorder (which is what xterm calls
2557 if (NILP (Fassq (Qinternal_border_width
, parms
)))
2561 value
= mac_get_arg (parms
, Qinternal_border_width
,
2562 "internalBorder", "InternalBorder", RES_TYPE_NUMBER
);
2563 if (! EQ (value
, Qunbound
))
2564 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
2567 /* Default internalBorderWidth to 0 on Windows to match other programs. */
2568 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (0),
2569 "internalBorderWidth", "InternalBorder", RES_TYPE_NUMBER
);
2570 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qright
,
2571 "verticalScrollBars", "ScrollBars", RES_TYPE_SYMBOL
);
2573 /* Also do the stuff which must be set before the window exists. */
2574 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
2575 "foreground", "Foreground", RES_TYPE_STRING
);
2576 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
2577 "background", "Background", RES_TYPE_STRING
);
2578 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
2579 "pointerColor", "Foreground", RES_TYPE_STRING
);
2580 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
2581 "cursorColor", "Foreground", RES_TYPE_STRING
);
2582 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
2583 "borderColor", "BorderColor", RES_TYPE_STRING
);
2584 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
2585 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
2586 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
2587 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
2588 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
2589 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
2590 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
2591 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
2594 /* Init faces before x_default_parameter is called for scroll-bar
2595 parameters because that function calls x_set_scroll_bar_width,
2596 which calls change_frame_size, which calls Fset_window_buffer,
2597 which runs hooks, which call Fvertical_motion. At the end, we
2598 end up in init_iterator with a null face cache, which should not
2600 init_frame_faces (f
);
2602 x_default_parameter (f
, parms
, Qmenu_bar_lines
, make_number (1),
2603 "menuBar", "MenuBar", RES_TYPE_NUMBER
);
2604 x_default_parameter (f
, parms
, Qtool_bar_lines
, make_number (1),
2605 "toolBar", "ToolBar", RES_TYPE_NUMBER
);
2606 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
2607 "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL
);
2608 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
2609 "title", "Title", RES_TYPE_STRING
);
2610 x_default_parameter (f
, parms
, Qfullscreen
, Qnil
,
2611 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL
);
2613 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
2615 /* Compute the size of the window. */
2616 window_prompting
= x_figure_window_size (f
, parms
, 1);
2618 tem
= mac_get_arg (parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
2619 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
2626 /* Now consider the frame official. */
2627 FRAME_MAC_DISPLAY_INFO (f
)->reference_count
++;
2628 Vframe_list
= Fcons (frame
, Vframe_list
);
2630 /* We need to do this after creating the window, so that the
2631 icon-creation functions can say whose icon they're describing. */
2632 x_default_parameter (f
, parms
, Qicon_type
, Qnil
,
2633 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
2635 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
2636 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
2637 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
2638 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
2639 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
2640 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
2641 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
2642 "scrollBarWidth", "ScrollBarWidth",
2645 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
2646 Change will not be effected unless different from the current
2648 width
= FRAME_COLS (f
);
2649 height
= FRAME_LINES (f
);
2651 SET_FRAME_COLS (f
, 0);
2652 FRAME_LINES (f
) = 0;
2653 change_frame_size (f
, height
, width
, 1, 0, 0);
2655 /* Tell the server what size and position, etc, we want, and how
2656 badly we want them. This should be done after we have the menu
2657 bar so that its size can be taken into account. */
2659 x_wm_set_size_hint (f
, window_prompting
, 0);
2662 /* Make the window appear on the frame and enable display, unless
2663 the caller says not to. However, with explicit parent, Emacs
2664 cannot control visibility, so don't try. */
2665 if (! f
->output_data
.mac
->explicit_parent
)
2667 Lisp_Object visibility
;
2669 visibility
= mac_get_arg (parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
);
2670 if (EQ (visibility
, Qunbound
))
2673 #if 0 /* MAC_TODO: really no iconify on Mac */
2674 if (EQ (visibility
, Qicon
))
2675 x_iconify_frame (f
);
2678 if (! NILP (visibility
))
2679 x_make_frame_visible (f
);
2681 /* Must have been Qnil. */
2686 /* Make sure windows on this frame appear in calls to next-window
2687 and similar functions. */
2688 Vwindow_list
= Qnil
;
2690 return unbind_to (count
, frame
);
2693 /* FRAME is used only to get a handle on the X display. We don't pass the
2694 display info directly because we're called from frame.c, which doesn't
2695 know about that structure. */
2697 x_get_focus_frame (frame
)
2698 struct frame
*frame
;
2700 struct mac_display_info
*dpyinfo
= FRAME_MAC_DISPLAY_INFO (frame
);
2702 if (! dpyinfo
->x_focus_frame
)
2705 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
2709 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
2710 doc
: /* Internal function called by `color-defined-p', which see. */)
2712 Lisp_Object color
, frame
;
2715 FRAME_PTR f
= check_x_frame (frame
);
2717 CHECK_STRING (color
);
2719 if (mac_defined_color (f
, SDATA (color
), &foo
, 0))
2725 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
2726 doc
: /* Internal function called by `color-values', which see. */)
2728 Lisp_Object color
, frame
;
2731 FRAME_PTR f
= check_x_frame (frame
);
2733 CHECK_STRING (color
);
2735 if (mac_defined_color (f
, SDATA (color
), &foo
, 0))
2739 rgb
[0] = make_number (foo
.red
);
2740 rgb
[1] = make_number (foo
.green
);
2741 rgb
[2] = make_number (foo
.blue
);
2742 return Flist (3, rgb
);
2748 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
2749 doc
: /* Internal function called by `display-color-p', which see. */)
2751 Lisp_Object display
;
2753 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2755 if (!dpyinfo
->color_p
)
2761 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
2763 doc
: /* Return t if DISPLAY supports shades of gray.
2764 Note that color displays do support shades of gray.
2765 The optional argument DISPLAY specifies which display to ask about.
2766 DISPLAY should be either a frame or a display name (a string).
2767 If omitted or nil, that stands for the selected frame's display. */)
2769 Lisp_Object display
;
2771 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2773 if (dpyinfo
->n_planes
<= 1)
2779 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
2781 doc
: /* Returns the width in pixels of DISPLAY.
2782 The optional argument DISPLAY specifies which display to ask about.
2783 DISPLAY should be either a frame or a display name (a string).
2784 If omitted or nil, that stands for the selected frame's display. */)
2786 Lisp_Object display
;
2788 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2790 return make_number (dpyinfo
->width
);
2793 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
2794 Sx_display_pixel_height
, 0, 1, 0,
2795 doc
: /* Returns the height in pixels of DISPLAY.
2796 The optional argument DISPLAY specifies which display to ask about.
2797 DISPLAY should be either a frame or a display name (a string).
2798 If omitted or nil, that stands for the selected frame's display. */)
2800 Lisp_Object display
;
2802 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2804 return make_number (dpyinfo
->height
);
2807 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
2809 doc
: /* Returns the number of bitplanes of DISPLAY.
2810 The optional argument DISPLAY specifies which display to ask about.
2811 DISPLAY should be either a frame or a display name (a string).
2812 If omitted or nil, that stands for the selected frame's display. */)
2814 Lisp_Object display
;
2816 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2818 return make_number (dpyinfo
->n_planes
);
2821 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
2823 doc
: /* Returns the number of color cells of DISPLAY.
2824 The optional argument DISPLAY specifies which display to ask about.
2825 DISPLAY should be either a frame or a display name (a string).
2826 If omitted or nil, that stands for the selected frame's display. */)
2828 Lisp_Object display
;
2830 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2832 /* We force 24+ bit depths to 24-bit to prevent an overflow. */
2833 return make_number (1 << min (dpyinfo
->n_planes
, 24));
2836 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
2837 Sx_server_max_request_size
,
2839 doc
: /* Returns the maximum request size of the server of DISPLAY.
2840 The optional argument DISPLAY specifies which display to ask about.
2841 DISPLAY should be either a frame or a display name (a string).
2842 If omitted or nil, that stands for the selected frame's display. */)
2844 Lisp_Object display
;
2846 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2848 return make_number (1);
2851 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
2852 doc
: /* Returns the "vendor ID" string of the Mac OS system (Apple).
2853 The optional argument DISPLAY specifies which display to ask about.
2854 DISPLAY should be either a frame or a display name (a string).
2855 If omitted or nil, that stands for the selected frame's display. */)
2857 Lisp_Object display
;
2859 return build_string ("Apple Computers");
2862 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
2863 doc
: /* Returns the version numbers of the Mac OS system.
2864 The value is a list of three integers: the major and minor
2865 version numbers, and the vendor-specific release
2866 number. See also the function `x-server-vendor'.
2868 The optional argument DISPLAY specifies which display to ask about.
2869 DISPLAY should be either a frame or a display name (a string).
2870 If omitted or nil, that stands for the selected frame's display. */)
2872 Lisp_Object display
;
2874 int mac_major_version
;
2879 err
= Gestalt (gestaltSystemVersion
, &response
);
2883 error ("Cannot get Mac OS version");
2885 mac_major_version
= (response
>> 8) & 0xff;
2886 /* convert BCD to int */
2887 mac_major_version
-= (mac_major_version
>> 4) * 6;
2889 return Fcons (make_number (mac_major_version
),
2890 Fcons (make_number ((response
>> 4) & 0xf),
2891 Fcons (make_number (response
& 0xf),
2895 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
2896 doc
: /* Return the number of screens on the server of DISPLAY.
2897 The optional argument DISPLAY specifies which display to ask about.
2898 DISPLAY should be either a frame or a display name (a string).
2899 If omitted or nil, that stands for the selected frame's display. */)
2901 Lisp_Object display
;
2903 return make_number (1);
2906 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
2907 doc
: /* Return the height in millimeters of DISPLAY.
2908 The optional argument DISPLAY specifies which display to ask about.
2909 DISPLAY should be either a frame or a display name (a string).
2910 If omitted or nil, that stands for the selected frame's display. */)
2912 Lisp_Object display
;
2914 /* MAC_TODO: this is an approximation, and only of the main display */
2916 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2918 return make_number ((int) (dpyinfo
->height
* 25.4 / dpyinfo
->resy
));
2921 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
2922 doc
: /* Return the width in millimeters of DISPLAY.
2923 The optional argument DISPLAY specifies which display to ask about.
2924 DISPLAY should be either a frame or a display name (a string).
2925 If omitted or nil, that stands for the selected frame's display. */)
2927 Lisp_Object display
;
2929 /* MAC_TODO: this is an approximation, and only of the main display */
2931 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2933 return make_number ((int) (dpyinfo
->width
* 25.4 / dpyinfo
->resx
));
2936 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
2937 Sx_display_backing_store
, 0, 1, 0,
2938 doc
: /* Returns an indication of whether DISPLAY does backing store.
2939 The value may be `always', `when-mapped', or `not-useful'.
2940 The optional argument DISPLAY specifies which display to ask about.
2941 DISPLAY should be either a frame or a display name (a string).
2942 If omitted or nil, that stands for the selected frame's display. */)
2944 Lisp_Object display
;
2946 return intern ("not-useful");
2949 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
2950 Sx_display_visual_class
, 0, 1, 0,
2951 doc
: /* Returns the visual class of DISPLAY.
2952 The value is one of the symbols `static-gray', `gray-scale',
2953 `static-color', `pseudo-color', `true-color', or `direct-color'.
2955 The optional argument DISPLAY specifies which display to ask about.
2956 DISPLAY should be either a frame or a display name (a string).
2957 If omitted or nil, that stands for the selected frame's display. */)
2959 Lisp_Object display
;
2961 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
2964 switch (dpyinfo
->visual
->class)
2966 case StaticGray
: return (intern ("static-gray"));
2967 case GrayScale
: return (intern ("gray-scale"));
2968 case StaticColor
: return (intern ("static-color"));
2969 case PseudoColor
: return (intern ("pseudo-color"));
2970 case TrueColor
: return (intern ("true-color"));
2971 case DirectColor
: return (intern ("direct-color"));
2973 error ("Display has an unknown visual class");
2977 return (intern ("true-color"));
2980 DEFUN ("x-display-save-under", Fx_display_save_under
,
2981 Sx_display_save_under
, 0, 1, 0,
2982 doc
: /* Returns t if DISPLAY supports the save-under feature.
2983 The optional argument DISPLAY specifies which display to ask about.
2984 DISPLAY should be either a frame or a display name (a string).
2985 If omitted or nil, that stands for the selected frame's display. */)
2987 Lisp_Object display
;
2994 register struct frame
*f
;
2996 return FRAME_PIXEL_WIDTH (f
);
3001 register struct frame
*f
;
3003 return FRAME_PIXEL_HEIGHT (f
);
3008 register struct frame
*f
;
3010 return FRAME_COLUMN_WIDTH (f
);
3015 register struct frame
*f
;
3017 return FRAME_LINE_HEIGHT (f
);
3022 register struct frame
*f
;
3024 return FRAME_MAC_DISPLAY_INFO (f
)->n_planes
;
3027 /* Return the display structure for the display named NAME.
3028 Open a new connection if necessary. */
3030 struct mac_display_info
*
3031 x_display_info_for_name (name
)
3035 struct mac_display_info
*dpyinfo
;
3037 CHECK_STRING (name
);
3039 if (! EQ (Vwindow_system
, intern ("mac")))
3040 error ("Not using Mac native windows");
3042 for (dpyinfo
= &one_mac_display_info
, names
= x_display_name_list
;
3044 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
3047 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
3052 /* Use this general default value to start with. */
3053 Vx_resource_name
= Vinvocation_name
;
3055 validate_x_resource_name ();
3057 dpyinfo
= mac_term_init (name
, (unsigned char *) 0,
3058 (char *) SDATA (Vx_resource_name
));
3061 error ("Cannot connect to server %s", SDATA (name
));
3064 XSETFASTINT (Vwindow_system_version
, 3);
3069 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
3071 doc
: /* Open a connection to a server.
3072 DISPLAY is the name of the display to connect to.
3073 Optional second arg XRM-STRING is a string of resources in xrdb format.
3074 If the optional third arg MUST-SUCCEED is non-nil,
3075 terminate Emacs if we can't open the connection. */)
3076 (display
, xrm_string
, must_succeed
)
3077 Lisp_Object display
, xrm_string
, must_succeed
;
3079 unsigned char *xrm_option
;
3080 struct mac_display_info
*dpyinfo
;
3082 CHECK_STRING (display
);
3083 if (! NILP (xrm_string
))
3084 CHECK_STRING (xrm_string
);
3086 if (! EQ (Vwindow_system
, intern ("mac")))
3087 error ("Not using Mac native windows");
3089 if (! NILP (xrm_string
))
3090 xrm_option
= (unsigned char *) SDATA (xrm_string
);
3092 xrm_option
= (unsigned char *) 0;
3094 validate_x_resource_name ();
3096 /* This is what opens the connection and sets x_current_display.
3097 This also initializes many symbols, such as those used for input. */
3098 dpyinfo
= mac_term_init (display
, xrm_option
,
3099 (char *) SDATA (Vx_resource_name
));
3103 if (!NILP (must_succeed
))
3104 fatal ("Cannot connect to server %s.\n",
3107 error ("Cannot connect to server %s", SDATA (display
));
3112 XSETFASTINT (Vwindow_system_version
, 3);
3116 DEFUN ("x-close-connection", Fx_close_connection
,
3117 Sx_close_connection
, 1, 1, 0,
3118 doc
: /* Close the connection to DISPLAY's server.
3119 For DISPLAY, specify either a frame or a display name (a string).
3120 If DISPLAY is nil, that stands for the selected frame's display. */)
3122 Lisp_Object display
;
3124 struct mac_display_info
*dpyinfo
= check_x_display_info (display
);
3127 if (dpyinfo
->reference_count
> 0)
3128 error ("Display still has frames on it");
3131 /* Free the fonts in the font table. */
3132 for (i
= 0; i
< dpyinfo
->n_fonts
; i
++)
3133 if (dpyinfo
->font_table
[i
].name
)
3135 mac_unload_font (dpyinfo
, dpyinfo
->font_table
[i
].font
);
3138 x_destroy_all_bitmaps (dpyinfo
);
3140 x_delete_display (dpyinfo
);
3146 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
3147 doc
: /* Return the list of display names that Emacs has connections to. */)
3150 Lisp_Object tail
, result
;
3153 for (tail
= x_display_name_list
; ! NILP (tail
); tail
= XCDR (tail
))
3154 result
= Fcons (XCAR (XCAR (tail
)), result
);
3159 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
3160 doc
: /* This is a noop on Mac OS systems. */)
3162 Lisp_Object display
, on
;
3168 /***********************************************************************
3170 ***********************************************************************/
3172 DEFUN ("x-change-window-property", Fx_change_window_property
,
3173 Sx_change_window_property
, 2, 6, 0,
3174 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
3175 VALUE may be a string or a list of conses, numbers and/or strings.
3176 If an element in the list is a string, it is converted to
3177 an Atom and the value of the Atom is used. If an element is a cons,
3178 it is converted to a 32 bit number where the car is the 16 top bits and the
3179 cdr is the lower 16 bits.
3180 FRAME nil or omitted means use the selected frame.
3181 If TYPE is given and non-nil, it is the name of the type of VALUE.
3182 If TYPE is not given or nil, the type is STRING.
3183 FORMAT gives the size in bits of each element if VALUE is a list.
3184 It must be one of 8, 16 or 32.
3185 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
3186 If OUTER_P is non-nil, the property is changed for the outer X window of
3187 FRAME. Default is to change on the edit X window.
3190 (prop
, value
, frame
, type
, format
, outer_p
)
3191 Lisp_Object prop
, value
, frame
, type
, format
, outer_p
;
3193 #if 0 /* MAC_TODO : port window properties to Mac */
3194 struct frame
*f
= check_x_frame (frame
);
3197 CHECK_STRING (prop
);
3198 CHECK_STRING (value
);
3201 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3202 XChangeProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3203 prop_atom
, XA_STRING
, 8, PropModeReplace
,
3204 SDATA (value
), SCHARS (value
));
3206 /* Make sure the property is set when we return. */
3207 XFlush (FRAME_W32_DISPLAY (f
));
3210 #endif /* MAC_TODO */
3216 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
3217 Sx_delete_window_property
, 1, 2, 0,
3218 doc
: /* Remove window property PROP from X window of FRAME.
3219 FRAME nil or omitted means use the selected frame. Value is PROP. */)
3221 Lisp_Object prop
, frame
;
3223 #if 0 /* MAC_TODO : port window properties to Mac */
3225 struct frame
*f
= check_x_frame (frame
);
3228 CHECK_STRING (prop
);
3230 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3231 XDeleteProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
), prop_atom
);
3233 /* Make sure the property is removed when we return. */
3234 XFlush (FRAME_W32_DISPLAY (f
));
3236 #endif /* MAC_TODO */
3242 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
3244 doc
: /* Value is the value of window property PROP on FRAME.
3245 If FRAME is nil or omitted, use the selected frame. Value is nil
3246 if FRAME hasn't a property with name PROP or if PROP has no string
3249 Lisp_Object prop
, frame
;
3251 #if 0 /* MAC_TODO : port window properties to Mac */
3253 struct frame
*f
= check_x_frame (frame
);
3256 Lisp_Object prop_value
= Qnil
;
3257 char *tmp_data
= NULL
;
3260 unsigned long actual_size
, bytes_remaining
;
3262 CHECK_STRING (prop
);
3264 prop_atom
= XInternAtom (FRAME_W32_DISPLAY (f
), SDATA (prop
), False
);
3265 rc
= XGetWindowProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3266 prop_atom
, 0, 0, False
, XA_STRING
,
3267 &actual_type
, &actual_format
, &actual_size
,
3268 &bytes_remaining
, (unsigned char **) &tmp_data
);
3271 int size
= bytes_remaining
;
3276 rc
= XGetWindowProperty (FRAME_W32_DISPLAY (f
), FRAME_W32_WINDOW (f
),
3277 prop_atom
, 0, bytes_remaining
,
3279 &actual_type
, &actual_format
,
3280 &actual_size
, &bytes_remaining
,
3281 (unsigned char **) &tmp_data
);
3283 prop_value
= make_string (tmp_data
, size
);
3292 #endif /* MAC_TODO */
3298 /***********************************************************************
3300 ***********************************************************************/
3302 /* If non-null, an asynchronous timer that, when it expires, displays
3303 an hourglass cursor on all frames. */
3305 static struct atimer
*hourglass_atimer
;
3307 /* Non-zero means an hourglass cursor is currently shown. */
3309 static int hourglass_shown_p
;
3311 /* Number of seconds to wait before displaying an hourglass cursor. */
3313 static Lisp_Object Vhourglass_delay
;
3315 /* Default number of seconds to wait before displaying an hourglass
3318 #define DEFAULT_HOURGLASS_DELAY 1
3320 /* Function prototypes. */
3322 static void show_hourglass
P_ ((struct atimer
*));
3323 static void hide_hourglass
P_ ((void));
3325 /* Return non-zero if houglass timer has been started or hourglass is shown. */
3328 hourglass_started ()
3330 return hourglass_shown_p
|| hourglass_atimer
!= NULL
;
3334 /* Cancel a currently active hourglass timer, and start a new one. */
3341 int secs
, usecs
= 0;
3343 cancel_hourglass ();
3345 if (INTEGERP (Vhourglass_delay
)
3346 && XINT (Vhourglass_delay
) > 0)
3347 secs
= XFASTINT (Vhourglass_delay
);
3348 else if (FLOATP (Vhourglass_delay
)
3349 && XFLOAT_DATA (Vhourglass_delay
) > 0)
3352 tem
= Ftruncate (Vhourglass_delay
, Qnil
);
3353 secs
= XFASTINT (tem
);
3354 usecs
= (XFLOAT_DATA (Vhourglass_delay
) - secs
) * 1000000;
3357 secs
= DEFAULT_HOURGLASS_DELAY
;
3359 EMACS_SET_SECS_USECS (delay
, secs
, usecs
);
3360 hourglass_atimer
= start_atimer (ATIMER_RELATIVE
, delay
,
3361 show_hourglass
, NULL
);
3362 #endif /* MAC_OSX */
3366 /* Cancel the hourglass cursor timer if active, hide a busy cursor if
3373 if (hourglass_atimer
)
3375 cancel_atimer (hourglass_atimer
);
3376 hourglass_atimer
= NULL
;
3379 if (hourglass_shown_p
)
3381 #endif /* MAC_OSX */
3385 /* Timer function of hourglass_atimer. TIMER is equal to
3388 On Mac, busy status is shown by the progress indicator (chasing
3389 arrows) at the upper-right corner of each frame instead of the
3390 hourglass pointer. */
3393 show_hourglass (timer
)
3394 struct atimer
*timer
;
3396 #if TARGET_API_MAC_CARBON
3397 /* The timer implementation will cancel this timer automatically
3398 after this function has run. Set hourglass_atimer to null
3399 so that we know the timer doesn't have to be canceled. */
3400 hourglass_atimer
= NULL
;
3402 if (!hourglass_shown_p
)
3404 Lisp_Object rest
, frame
;
3408 FOR_EACH_FRAME (rest
, frame
)
3410 struct frame
*f
= XFRAME (frame
);
3412 if (FRAME_LIVE_P (f
) && FRAME_MAC_P (f
)
3413 && FRAME_MAC_WINDOW (f
) != tip_window
)
3415 if (!f
->output_data
.mac
->hourglass_control
)
3417 Window w
= FRAME_MAC_WINDOW (f
);
3421 GetWindowPortBounds (w
, &r
);
3422 r
.left
= r
.right
- HOURGLASS_WIDTH
;
3423 r
.bottom
= r
.top
+ HOURGLASS_HEIGHT
;
3424 if (CreateChasingArrowsControl (w
, &r
, &c
) == noErr
)
3425 f
->output_data
.mac
->hourglass_control
= c
;
3428 if (f
->output_data
.mac
->hourglass_control
)
3429 ShowControl (f
->output_data
.mac
->hourglass_control
);
3433 hourglass_shown_p
= 1;
3436 #endif /* TARGET_API_MAC_CARBON */
3440 /* Hide the progress indicators on all frames, if it is currently
3446 #if TARGET_API_MAC_CARBON
3447 if (hourglass_shown_p
)
3449 Lisp_Object rest
, frame
;
3452 FOR_EACH_FRAME (rest
, frame
)
3454 struct frame
*f
= XFRAME (frame
);
3457 /* Watch out for newly created frames. */
3458 && f
->output_data
.mac
->hourglass_control
)
3459 HideControl (f
->output_data
.mac
->hourglass_control
);
3462 hourglass_shown_p
= 0;
3465 #endif /* TARGET_API_MAC_CARBON */
3470 /***********************************************************************
3472 ***********************************************************************/
3474 static Lisp_Object x_create_tip_frame
P_ ((struct mac_display_info
*,
3475 Lisp_Object
, Lisp_Object
));
3476 static void compute_tip_xy
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
,
3477 Lisp_Object
, int, int, int *, int *));
3479 /* The frame of a currently visible tooltip. */
3481 Lisp_Object tip_frame
;
3483 /* If non-nil, a timer started that hides the last tooltip when it
3486 Lisp_Object tip_timer
;
3489 /* If non-nil, a vector of 3 elements containing the last args
3490 with which x-show-tip was called. See there. */
3492 Lisp_Object last_show_tip_args
;
3494 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
3496 Lisp_Object Vx_max_tooltip_size
;
3500 unwind_create_tip_frame (frame
)
3503 Lisp_Object deleted
;
3505 deleted
= unwind_create_frame (frame
);
3506 if (EQ (deleted
, Qt
))
3516 /* Create a frame for a tooltip on the display described by DPYINFO.
3517 PARMS is a list of frame parameters. TEXT is the string to
3518 display in the tip frame. Value is the frame.
3520 Note that functions called here, esp. x_default_parameter can
3521 signal errors, for instance when a specified color name is
3522 undefined. We have to make sure that we're in a consistent state
3523 when this happens. */
3526 x_create_tip_frame (dpyinfo
, parms
, text
)
3527 struct mac_display_info
*dpyinfo
;
3528 Lisp_Object parms
, text
;
3531 Lisp_Object frame
, tem
;
3533 long window_prompting
= 0;
3535 int count
= SPECPDL_INDEX ();
3536 struct gcpro gcpro1
, gcpro2
, gcpro3
;
3538 int face_change_count_before
= face_change_count
;
3540 struct buffer
*old_buffer
;
3546 kb
= dpyinfo
->kboard
;
3548 kb
= &the_only_kboard
;
3551 /* Get the name of the frame to use for resource lookup. */
3552 name
= mac_get_arg (parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3554 && !EQ (name
, Qunbound
)
3556 error ("Invalid frame name--not a string or nil");
3559 GCPRO3 (parms
, name
, frame
);
3561 XSETFRAME (frame
, f
);
3563 buffer
= Fget_buffer_create (build_string (" *tip*"));
3564 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
3565 old_buffer
= current_buffer
;
3566 set_buffer_internal_1 (XBUFFER (buffer
));
3567 current_buffer
->truncate_lines
= Qnil
;
3568 specbind (Qinhibit_read_only
, Qt
);
3569 specbind (Qinhibit_modification_hooks
, Qt
);
3572 set_buffer_internal_1 (old_buffer
);
3574 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
3575 record_unwind_protect (unwind_create_tip_frame
, frame
);
3577 /* By setting the output method, we're essentially saying that
3578 the frame is live, as per FRAME_LIVE_P. If we get a signal
3579 from this point on, x_destroy_window might screw up reference
3581 f
->output_method
= output_mac
;
3582 f
->output_data
.mac
=
3583 (struct mac_output
*) xmalloc (sizeof (struct mac_output
));
3584 bzero (f
->output_data
.mac
, sizeof (struct mac_output
));
3586 FRAME_FONTSET (f
) = -1;
3587 f
->icon_name
= Qnil
;
3589 #if 0 /* GLYPH_DEBUG TODO: image support. */
3590 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
3591 dpyinfo_refcount
= dpyinfo
->reference_count
;
3592 #endif /* GLYPH_DEBUG */
3594 FRAME_KBOARD (f
) = kb
;
3596 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
3597 f
->output_data
.mac
->explicit_parent
= 0;
3599 /* Set the name; the functions to which we pass f expect the name to
3601 if (EQ (name
, Qunbound
) || NILP (name
))
3603 f
->name
= build_string (dpyinfo
->mac_id_name
);
3604 f
->explicit_name
= 0;
3609 f
->explicit_name
= 1;
3610 /* use the frame's title when getting resources for this frame. */
3611 specbind (Qx_resource_name
, name
);
3614 /* Extract the window parameters from the supplied values that are
3615 needed to determine window geometry. */
3619 font
= mac_get_arg (parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3622 /* First, try whatever font the caller has specified. */
3625 tem
= Fquery_fontset (font
, Qnil
);
3627 font
= x_new_fontset (f
, SDATA (tem
));
3629 font
= x_new_font (f
, SDATA (font
));
3632 /* Try out a font which we hope has bold and italic variations. */
3633 if (! STRINGP (font
))
3634 font
= x_new_font (f
, "-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1");
3635 /* If those didn't work, look for something which will at least work. */
3636 if (! STRINGP (font
))
3637 font
= x_new_fontset (f
, "fontset-mac");
3638 if (! STRINGP (font
))
3639 font
= x_new_font (f
, "-*-monaco-*-12-*-mac-roman");
3640 if (! STRINGP (font
))
3641 font
= x_new_font (f
, "-*-courier-*-10-*-mac-roman");
3643 if (! STRINGP (font
))
3644 error ("Cannot find any usable font");
3646 x_default_parameter (f
, parms
, Qfont
, font
,
3647 "font", "Font", RES_TYPE_STRING
);
3650 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
3651 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
3653 /* This defaults to 2 in order to match xterm. We recognize either
3654 internalBorderWidth or internalBorder (which is what xterm calls
3656 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3660 value
= mac_get_arg (parms
, Qinternal_border_width
,
3661 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
3662 if (! EQ (value
, Qunbound
))
3663 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
3667 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
3668 "internalBorderWidth", "internalBorderWidth",
3671 /* Also do the stuff which must be set before the window exists. */
3672 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3673 "foreground", "Foreground", RES_TYPE_STRING
);
3674 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3675 "background", "Background", RES_TYPE_STRING
);
3676 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3677 "pointerColor", "Foreground", RES_TYPE_STRING
);
3678 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3679 "cursorColor", "Foreground", RES_TYPE_STRING
);
3680 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3681 "borderColor", "BorderColor", RES_TYPE_STRING
);
3683 /* Init faces before x_default_parameter is called for scroll-bar
3684 parameters because that function calls x_set_scroll_bar_width,
3685 which calls change_frame_size, which calls Fset_window_buffer,
3686 which runs hooks, which call Fvertical_motion. At the end, we
3687 end up in init_iterator with a null face cache, which should not
3689 init_frame_faces (f
);
3691 f
->output_data
.mac
->parent_desc
= FRAME_MAC_DISPLAY_INFO (f
)->root_window
;
3693 window_prompting
= x_figure_window_size (f
, parms
, 0);
3699 SetRect (&r
, 0, 0, 1, 1);
3700 #if TARGET_API_MAC_CARBON
3701 if (CreateNewWindow (kHelpWindowClass
,
3702 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
3703 kWindowIgnoreClicksAttribute
|
3705 kWindowNoUpdatesAttribute
|
3706 kWindowNoActivatesAttribute
,
3707 &r
, &tip_window
) == noErr
)
3709 if (tip_window
= NewCWindow (NULL
, &r
, "\p", false, plainDBox
,
3713 FRAME_MAC_WINDOW (f
) = tip_window
;
3714 XSetWindowBackground (FRAME_MAC_DISPLAY(f
), tip_window
,
3715 FRAME_BACKGROUND_PIXEL (f
));
3716 SetWRefCon (tip_window
, (long) f
->output_data
.mac
);
3717 /* so that update events can find this mac_output struct */
3718 f
->output_data
.mac
->mFP
= f
;
3725 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3726 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3727 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3728 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3729 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3730 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3732 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3733 Change will not be effected unless different from the current
3735 width
= FRAME_COLS (f
);
3736 height
= FRAME_LINES (f
);
3737 SET_FRAME_COLS (f
, 0);
3738 FRAME_LINES (f
) = 0;
3739 change_frame_size (f
, height
, width
, 1, 0, 0);
3741 /* Add `tooltip' frame parameter's default value. */
3742 if (NILP (Fframe_parameter (frame
, intern ("tooltip"))))
3743 Fmodify_frame_parameters (frame
, Fcons (Fcons (intern ("tooltip"), Qt
),
3746 /* Set up faces after all frame parameters are known. This call
3747 also merges in face attributes specified for new frames.
3749 Frame parameters may be changed if .Xdefaults contains
3750 specifications for the default font. For example, if there is an
3751 `Emacs.default.attributeBackground: pink', the `background-color'
3752 attribute of the frame get's set, which let's the internal border
3753 of the tooltip frame appear in pink. Prevent this. */
3755 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
3757 /* Set tip_frame here, so that */
3759 call1 (Qface_set_after_frame_default
, frame
);
3761 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
3762 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
3770 /* It is now ok to make the frame official even if we get an error
3771 below. And the frame needs to be on Vframe_list or making it
3772 visible won't work. */
3773 Vframe_list
= Fcons (frame
, Vframe_list
);
3775 /* Now that the frame is official, it counts as a reference to
3777 FRAME_MAC_DISPLAY_INFO (f
)->reference_count
++;
3779 /* Setting attributes of faces of the tooltip frame from resources
3780 and similar will increment face_change_count, which leads to the
3781 clearing of all current matrices. Since this isn't necessary
3782 here, avoid it by resetting face_change_count to the value it
3783 had before we created the tip frame. */
3784 face_change_count
= face_change_count_before
;
3786 /* Discard the unwind_protect. */
3787 return unbind_to (count
, frame
);
3791 /* Compute where to display tip frame F. PARMS is the list of frame
3792 parameters for F. DX and DY are specified offsets from the current
3793 location of the mouse. WIDTH and HEIGHT are the width and height
3794 of the tooltip. Return coordinates relative to the root window of
3795 the display in *ROOT_X, and *ROOT_Y. */
3798 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, root_x
, root_y
)
3800 Lisp_Object parms
, dx
, dy
;
3802 int *root_x
, *root_y
;
3804 Lisp_Object left
, top
;
3806 /* User-specified position? */
3807 left
= Fcdr (Fassq (Qleft
, parms
));
3808 top
= Fcdr (Fassq (Qtop
, parms
));
3810 /* Move the tooltip window where the mouse pointer is. Resize and
3812 if (!INTEGERP (left
) || !INTEGERP (top
))
3817 GetMouse (&mouse_pos
);
3818 LocalToGlobal (&mouse_pos
);
3819 *root_x
= mouse_pos
.h
;
3820 *root_y
= mouse_pos
.v
;
3825 *root_y
= XINT (top
);
3826 else if (*root_y
+ XINT (dy
) - height
< 0)
3827 *root_y
-= XINT (dy
);
3831 *root_y
+= XINT (dy
);
3834 if (INTEGERP (left
))
3835 *root_x
= XINT (left
);
3836 else if (*root_x
+ XINT (dx
) + width
<= FRAME_MAC_DISPLAY_INFO (f
)->width
)
3837 /* It fits to the right of the pointer. */
3838 *root_x
+= XINT (dx
);
3839 else if (width
+ XINT (dx
) <= *root_x
)
3840 /* It fits to the left of the pointer. */
3841 *root_x
-= width
+ XINT (dx
);
3843 /* Put it left-justified on the screen -- it ought to fit that way. */
3848 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
3849 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
3850 A tooltip window is a small window displaying a string.
3852 FRAME nil or omitted means use the selected frame.
3854 PARMS is an optional list of frame parameters which can be used to
3855 change the tooltip's appearance.
3857 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
3858 means use the default timeout of 5 seconds.
3860 If the list of frame parameters PARMS contains a `left' parameter,
3861 the tooltip is displayed at that x-position. Otherwise it is
3862 displayed at the mouse position, with offset DX added (default is 5 if
3863 DX isn't specified). Likewise for the y-position; if a `top' frame
3864 parameter is specified, it determines the y-position of the tooltip
3865 window, otherwise it is displayed at the mouse position, with offset
3866 DY added (default is -10).
3868 A tooltip's maximum size is specified by `x-max-tooltip-size'.
3869 Text larger than the specified size is clipped. */)
3870 (string
, frame
, parms
, timeout
, dx
, dy
)
3871 Lisp_Object string
, frame
, parms
, timeout
, dx
, dy
;
3876 struct buffer
*old_buffer
;
3877 struct text_pos pos
;
3878 int i
, width
, height
;
3879 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3880 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
3881 int count
= SPECPDL_INDEX ();
3883 specbind (Qinhibit_redisplay
, Qt
);
3885 GCPRO4 (string
, parms
, frame
, timeout
);
3887 CHECK_STRING (string
);
3888 f
= check_x_frame (frame
);
3890 timeout
= make_number (5);
3892 CHECK_NATNUM (timeout
);
3895 dx
= make_number (5);
3900 dy
= make_number (-10);
3904 if (NILP (last_show_tip_args
))
3905 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
3907 if (!NILP (tip_frame
))
3909 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
3910 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
3911 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
3913 if (EQ (frame
, last_frame
)
3914 && !NILP (Fequal (last_string
, string
))
3915 && !NILP (Fequal (last_parms
, parms
)))
3917 struct frame
*f
= XFRAME (tip_frame
);
3919 /* Only DX and DY have changed. */
3920 if (!NILP (tip_timer
))
3922 Lisp_Object timer
= tip_timer
;
3924 call1 (Qcancel_timer
, timer
);
3928 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
3929 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
3930 MoveWindow (FRAME_MAC_WINDOW (f
), root_x
, root_y
, false);
3936 /* Hide a previous tip, if any. */
3939 ASET (last_show_tip_args
, 0, string
);
3940 ASET (last_show_tip_args
, 1, frame
);
3941 ASET (last_show_tip_args
, 2, parms
);
3943 /* Add default values to frame parameters. */
3944 if (NILP (Fassq (Qname
, parms
)))
3945 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
3946 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3947 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
3948 if (NILP (Fassq (Qborder_width
, parms
)))
3949 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
3950 if (NILP (Fassq (Qborder_color
, parms
)))
3951 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
3952 if (NILP (Fassq (Qbackground_color
, parms
)))
3953 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
3956 /* Create a frame for the tooltip, and record it in the global
3957 variable tip_frame. */
3958 frame
= x_create_tip_frame (FRAME_MAC_DISPLAY_INFO (f
), parms
, string
);
3961 /* Set up the frame's root window. */
3962 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
3963 w
->left_col
= w
->top_line
= make_number (0);
3965 if (CONSP (Vx_max_tooltip_size
)
3966 && INTEGERP (XCAR (Vx_max_tooltip_size
))
3967 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
3968 && INTEGERP (XCDR (Vx_max_tooltip_size
))
3969 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
3971 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
3972 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
3976 w
->total_cols
= make_number (80);
3977 w
->total_lines
= make_number (40);
3980 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
3982 w
->pseudo_window_p
= 1;
3984 /* Display the tooltip text in a temporary buffer. */
3985 old_buffer
= current_buffer
;
3986 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
3987 current_buffer
->truncate_lines
= Qnil
;
3988 clear_glyph_matrix (w
->desired_matrix
);
3989 clear_glyph_matrix (w
->current_matrix
);
3990 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
3991 try_window (FRAME_ROOT_WINDOW (f
), pos
, 0);
3993 /* Compute width and height of the tooltip. */
3995 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
3997 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
4001 /* Stop at the first empty row at the end. */
4002 if (!row
->enabled_p
|| !row
->displays_text_p
)
4005 /* Let the row go over the full width of the frame. */
4006 row
->full_width_p
= 1;
4008 /* There's a glyph at the end of rows that is used to place
4009 the cursor there. Don't include the width of this glyph. */
4010 if (row
->used
[TEXT_AREA
])
4012 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
4013 row_width
= row
->pixel_width
- last
->pixel_width
;
4016 row_width
= row
->pixel_width
;
4018 height
+= row
->height
;
4019 width
= max (width
, row_width
);
4022 /* Add the frame's internal border to the width and height the X
4023 window should have. */
4024 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
4025 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
4027 /* Move the tooltip window where the mouse pointer is. Resize and
4029 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
4032 MoveWindow (FRAME_MAC_WINDOW (f
), root_x
, root_y
, false);
4033 SizeWindow (FRAME_MAC_WINDOW (f
), width
, height
, true);
4034 ShowWindow (FRAME_MAC_WINDOW (f
));
4035 BringToFront (FRAME_MAC_WINDOW (f
));
4038 /* Draw into the window. */
4039 w
->must_be_updated_p
= 1;
4040 update_single_window (w
, 1);
4042 /* Restore original current buffer. */
4043 set_buffer_internal_1 (old_buffer
);
4044 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
4047 /* Let the tip disappear after timeout seconds. */
4048 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
4049 intern ("x-hide-tip"));
4052 return unbind_to (count
, Qnil
);
4056 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
4057 doc
: /* Hide the current tooltip window, if there is any.
4058 Value is t if tooltip was open, nil otherwise. */)
4062 Lisp_Object deleted
, frame
, timer
;
4063 struct gcpro gcpro1
, gcpro2
;
4065 /* Return quickly if nothing to do. */
4066 if (NILP (tip_timer
) && NILP (tip_frame
))
4071 GCPRO2 (frame
, timer
);
4072 tip_frame
= tip_timer
= deleted
= Qnil
;
4074 count
= SPECPDL_INDEX ();
4075 specbind (Qinhibit_redisplay
, Qt
);
4076 specbind (Qinhibit_quit
, Qt
);
4079 call1 (Qcancel_timer
, timer
);
4083 Fdelete_frame (frame
, Qnil
);
4088 return unbind_to (count
, deleted
);
4093 #if TARGET_API_MAC_CARBON
4094 /***********************************************************************
4095 File selection dialog
4096 ***********************************************************************/
4098 static pascal void mac_nav_event_callback
P_ ((NavEventCallbackMessage
,
4099 NavCBRecPtr
, void *));
4102 There is a relatively standard way to do this using applescript to run
4103 a (choose file) method. However, this doesn't do "the right thing"
4104 by working only if the find-file occurred during a menu or toolbar
4105 click. So we must do the file dialog by hand, using the navigation
4106 manager. This also has more flexibility in determining the default
4107 directory and whether or not we are going to choose a file.
4110 extern Lisp_Object Qfile_name_history
;
4112 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
4113 doc
: /* Read file name, prompting with PROMPT in directory DIR.
4114 Use a file selection dialog.
4115 Select DEFAULT-FILENAME in the dialog's file selection box, if
4116 specified. Ensure that file exists if MUSTMATCH is non-nil.
4117 If ONLY-DIR-P is non-nil, the user can only select directories. */)
4118 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
4119 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
4121 struct frame
*f
= SELECTED_FRAME ();
4122 Lisp_Object file
= Qnil
;
4123 int count
= SPECPDL_INDEX ();
4124 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
4125 char filename
[MAXPATHLEN
];
4126 int default_filter_index
= 1; /* 1: All Files, 2: Directories only */
4127 static NavEventUPP mac_nav_event_callbackUPP
= NULL
;
4129 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, file
, only_dir_p
);
4130 CHECK_STRING (prompt
);
4133 /* Create the dialog with PROMPT as title, using DIR as initial
4134 directory and using "*" as pattern. */
4135 dir
= Fexpand_file_name (dir
, Qnil
);
4139 NavDialogCreationOptions options
;
4140 NavDialogRef dialogRef
;
4141 NavTypeListHandle fileTypes
= NULL
;
4142 NavUserAction userAction
;
4143 CFStringRef message
=NULL
, saveName
= NULL
;
4146 /* No need for a callback function because we are modal */
4147 NavGetDefaultDialogCreationOptions(&options
);
4148 options
.modality
= kWindowModalityAppModal
;
4149 options
.location
.h
= options
.location
.v
= -1;
4150 options
.optionFlags
= kNavDefaultNavDlogOptions
;
4151 options
.optionFlags
|= kNavAllFilesInPopup
; /* All files allowed */
4152 options
.optionFlags
|= kNavSelectAllReadableItem
;
4153 options
.optionFlags
&= ~kNavAllowMultipleFiles
;
4156 message
= cfstring_create_with_string (prompt
);
4157 options
.message
= message
;
4159 /* Don't set the application, let it use default.
4160 options.clientName = CFSTR ("Emacs");
4163 if (mac_nav_event_callbackUPP
== NULL
)
4164 mac_nav_event_callbackUPP
= NewNavEventUPP (mac_nav_event_callback
);
4166 if (!NILP (only_dir_p
))
4167 status
= NavCreateChooseFolderDialog(&options
, mac_nav_event_callbackUPP
,
4168 NULL
, NULL
, &dialogRef
);
4169 else if (NILP (mustmatch
))
4171 /* This is a save dialog */
4172 options
.optionFlags
|= kNavDontConfirmReplacement
;
4173 options
.actionButtonLabel
= CFSTR ("Ok");
4174 options
.windowTitle
= CFSTR ("Enter name");
4176 if (STRINGP (default_filename
))
4178 Lisp_Object utf8
= ENCODE_UTF_8 (default_filename
);
4179 char *begPtr
= SDATA(utf8
);
4180 char *filePtr
= begPtr
+ SBYTES(utf8
);
4181 while (filePtr
!= begPtr
&& !IS_DIRECTORY_SEP(filePtr
[-1]))
4183 saveName
= cfstring_create_with_utf8_cstring (filePtr
);
4184 options
.saveFileName
= saveName
;
4185 options
.optionFlags
|= kNavSelectDefaultLocation
;
4187 status
= NavCreatePutFileDialog(&options
,
4188 'TEXT', kNavGenericSignature
,
4189 mac_nav_event_callbackUPP
, NULL
,
4194 /* This is an open dialog*/
4195 status
= NavCreateChooseFileDialog(&options
, fileTypes
,
4196 mac_nav_event_callbackUPP
, NULL
,
4197 NULL
, NULL
, &dialogRef
);
4200 /* Set the default location and continue*/
4201 if (status
== noErr
)
4206 status
= FSPathMakeRef(SDATA(ENCODE_FILE(dir
)), &defLoc
, NULL
);
4209 status
= posix_pathname_to_fsspec (SDATA (ENCODE_FILE (dir
)), &defLoc
);
4211 if (status
== noErr
)
4214 AECreateDesc(typeFSRef
, &defLoc
, sizeof(FSRef
), &defLocAed
);
4216 AECreateDesc(typeFSS
, &defLoc
, sizeof(FSSpec
), &defLocAed
);
4218 NavCustomControl(dialogRef
, kNavCtlSetLocation
, (void*) &defLocAed
);
4219 AEDisposeDesc(&defLocAed
);
4221 status
= NavDialogRun(dialogRef
);
4224 if (saveName
) CFRelease(saveName
);
4225 if (message
) CFRelease(message
);
4227 if (status
== noErr
) {
4228 userAction
= NavDialogGetUserAction(dialogRef
);
4231 case kNavUserActionNone
:
4232 case kNavUserActionCancel
:
4233 break; /* Treat cancel like C-g */
4234 case kNavUserActionOpen
:
4235 case kNavUserActionChoose
:
4236 case kNavUserActionSaveAs
:
4238 NavReplyRecord reply
;
4245 status
= NavDialogGetReply(dialogRef
, &reply
);
4248 AECoerceDesc(&reply
.selection
, typeFSRef
, &aed
);
4249 AEGetDescData(&aed
, (void *) &fsRef
, sizeof (FSRef
));
4250 FSRefMakePath(&fsRef
, (UInt8
*) filename
, sizeof (filename
));
4252 AECoerceDesc (&reply
.selection
, typeFSS
, &aed
);
4253 AEGetDescData (&aed
, (void *) &fs
, sizeof (FSSpec
));
4254 fsspec_to_posix_pathname (&fs
, filename
, sizeof (filename
) - 1);
4256 AEDisposeDesc(&aed
);
4257 if (reply
.saveFileName
)
4259 /* If it was a saved file, we need to add the file name */
4260 int len
= strlen(filename
);
4261 if (len
&& filename
[len
-1] != '/')
4262 filename
[len
++] = '/';
4263 CFStringGetCString(reply
.saveFileName
, filename
+len
,
4264 sizeof (filename
) - len
,
4266 kCFStringEncodingUTF8
4268 CFStringGetSystemEncoding ()
4272 file
= DECODE_FILE (make_unibyte_string (filename
,
4273 strlen (filename
)));
4274 NavDisposeReply(&reply
);
4278 NavDialogDispose(dialogRef
);
4283 /* Fall back on minibuffer if there was a problem */
4284 file
= Fcompleting_read (prompt
, intern ("read-file-name-internal"),
4285 dir
, mustmatch
, dir
, Qfile_name_history
,
4286 default_filename
, Qnil
);
4292 /* Make "Cancel" equivalent to C-g. */
4294 Fsignal (Qquit
, Qnil
);
4296 return unbind_to (count
, file
);
4300 /* Need to register some event callback function for enabling drag and
4301 drop in Navigation Service dialogs. */
4303 mac_nav_event_callback (selector
, parms
, data
)
4304 NavEventCallbackMessage selector
;
4311 /***********************************************************************
4313 ***********************************************************************/
4315 /* Keep this list in the same order as frame_parms in frame.c.
4316 Use 0 for unsupported frame parameters. */
4318 frame_parm_handler mac_frame_parm_handlers
[] =
4322 x_set_background_color
,
4328 x_set_foreground_color
,
4330 0, /* MAC_TODO: x_set_icon_type, */
4331 x_set_internal_border_width
,
4332 x_set_menu_bar_lines
,
4334 x_explicitly_set_name
,
4335 x_set_scroll_bar_width
,
4338 x_set_vertical_scroll_bars
,
4340 x_set_tool_bar_lines
,
4341 0, /* MAC_TODO: x_set_scroll_bar_foreground, */
4342 0, /* MAC_TODO: x_set_scroll_bar_background, */
4347 0, /* x_set_wait_for_wm, */
4355 /* This is zero if not using Mac native windows. */
4358 /* Certainly running on Mac native windows. */
4362 /* The section below is built by the lisp expression at the top of the file,
4363 just above where these variables are declared. */
4364 /*&&& init symbols here &&&*/
4365 Qnone
= intern ("none");
4367 Qsuppress_icon
= intern ("suppress-icon");
4368 staticpro (&Qsuppress_icon
);
4369 Qundefined_color
= intern ("undefined-color");
4370 staticpro (&Qundefined_color
);
4371 Qcancel_timer
= intern ("cancel-timer");
4372 staticpro (&Qcancel_timer
);
4373 /* This is the end of symbol initialization. */
4375 /* Text property `display' should be nonsticky by default. */
4376 Vtext_property_default_nonsticky
4377 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
4380 Fput (Qundefined_color
, Qerror_conditions
,
4381 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
4382 Fput (Qundefined_color
, Qerror_message
,
4383 build_string ("Undefined color"));
4385 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
4386 doc
: /* The shape of the pointer when over text.
4387 Changing the value does not affect existing frames
4388 unless you set the mouse color. */);
4389 Vx_pointer_shape
= Qnil
;
4391 #if 0 /* This doesn't really do anything. */
4392 DEFVAR_LISP ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
4393 doc
: /* The shape of the pointer when not over text.
4394 This variable takes effect when you create a new frame
4395 or when you set the mouse color. */);
4397 Vx_nontext_pointer_shape
= Qnil
;
4399 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
4400 doc
: /* The shape of the pointer when Emacs is busy.
4401 This variable takes effect when you create a new frame
4402 or when you set the mouse color. */);
4403 Vx_hourglass_pointer_shape
= Qnil
;
4405 DEFVAR_BOOL ("display-hourglass", &display_hourglass_p
,
4406 doc
: /* Non-zero means Emacs displays an hourglass pointer on window systems. */);
4407 display_hourglass_p
= 1;
4409 DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay
,
4410 doc
: /* *Seconds to wait before displaying an hourglass pointer.
4411 Value must be an integer or float. */);
4412 Vhourglass_delay
= make_number (DEFAULT_HOURGLASS_DELAY
);
4414 #if 0 /* This doesn't really do anything. */
4415 DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
4416 doc
: /* The shape of the pointer when over the mode line.
4417 This variable takes effect when you create a new frame
4418 or when you set the mouse color. */);
4420 Vx_mode_pointer_shape
= Qnil
;
4422 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
4423 &Vx_sensitive_text_pointer_shape
,
4424 doc
: /* The shape of the pointer when over mouse-sensitive text.
4425 This variable takes effect when you create a new frame
4426 or when you set the mouse color. */);
4427 Vx_sensitive_text_pointer_shape
= Qnil
;
4429 DEFVAR_LISP ("x-window-horizontal-drag-cursor",
4430 &Vx_window_horizontal_drag_shape
,
4431 doc
: /* Pointer shape to use for indicating a window can be dragged horizontally.
4432 This variable takes effect when you create a new frame
4433 or when you set the mouse color. */);
4434 Vx_window_horizontal_drag_shape
= Qnil
;
4436 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
4437 doc
: /* A string indicating the foreground color of the cursor box. */);
4438 Vx_cursor_fore_pixel
= Qnil
;
4440 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
4441 doc
: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS).
4442 Text larger than this is clipped. */);
4443 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
4445 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
4446 doc
: /* Non-nil if no window manager is in use.
4447 Emacs doesn't try to figure this out; this is always nil
4448 unless you set it to something else. */);
4449 /* We don't have any way to find this out, so set it to nil
4450 and maybe the user would like to set it to t. */
4451 Vx_no_window_manager
= Qnil
;
4453 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
4454 &Vx_pixel_size_width_font_regexp
,
4455 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
4457 Since Emacs gets width of a font matching with this regexp from
4458 PIXEL_SIZE field of the name, font finding mechanism gets faster for
4459 such a font. This is especially effective for such large fonts as
4460 Chinese, Japanese, and Korean. */);
4461 Vx_pixel_size_width_font_regexp
= Qnil
;
4463 /* X window properties. */
4464 defsubr (&Sx_change_window_property
);
4465 defsubr (&Sx_delete_window_property
);
4466 defsubr (&Sx_window_property
);
4468 defsubr (&Sxw_display_color_p
);
4469 defsubr (&Sx_display_grayscale_p
);
4470 defsubr (&Sxw_color_defined_p
);
4471 defsubr (&Sxw_color_values
);
4472 defsubr (&Sx_server_max_request_size
);
4473 defsubr (&Sx_server_vendor
);
4474 defsubr (&Sx_server_version
);
4475 defsubr (&Sx_display_pixel_width
);
4476 defsubr (&Sx_display_pixel_height
);
4477 defsubr (&Sx_display_mm_width
);
4478 defsubr (&Sx_display_mm_height
);
4479 defsubr (&Sx_display_screens
);
4480 defsubr (&Sx_display_planes
);
4481 defsubr (&Sx_display_color_cells
);
4482 defsubr (&Sx_display_visual_class
);
4483 defsubr (&Sx_display_backing_store
);
4484 defsubr (&Sx_display_save_under
);
4485 defsubr (&Sx_create_frame
);
4486 defsubr (&Sx_open_connection
);
4487 defsubr (&Sx_close_connection
);
4488 defsubr (&Sx_display_list
);
4489 defsubr (&Sx_synchronize
);
4491 /* Setting callback functions for fontset handler. */
4492 get_font_info_func
= x_get_font_info
;
4494 #if 0 /* This function pointer doesn't seem to be used anywhere.
4495 And the pointer assigned has the wrong type, anyway. */
4496 list_fonts_func
= x_list_fonts
;
4499 load_font_func
= x_load_font
;
4500 find_ccl_program_func
= x_find_ccl_program
;
4501 query_font_func
= x_query_font
;
4502 set_frame_fontset_func
= x_set_font
;
4503 check_window_system_func
= check_mac
;
4505 hourglass_atimer
= NULL
;
4506 hourglass_shown_p
= 0;
4508 defsubr (&Sx_show_tip
);
4509 defsubr (&Sx_hide_tip
);
4511 staticpro (&tip_timer
);
4513 staticpro (&tip_frame
);
4515 last_show_tip_args
= Qnil
;
4516 staticpro (&last_show_tip_args
);
4518 #if TARGET_API_MAC_CARBON
4519 defsubr (&Sx_file_dialog
);
4523 /* arch-tag: d7591289-f374-4377-b245-12f5dbbb8edc
4524 (do not change this comment) */