Mercurial > emacs
annotate src/w32fns.c @ 15013:aad88afa6a0c libc-960413 libc-960414 libc-960415 libc-960416 libc-960417 libc-960418 libc-960419 libc-960420 libc-960421 libc-960422 libc-960423 libc-960424 libc-960425 libc-960426 libc-960427 libc-960428 libc-960429 libc-960430 libc-960501 libc-960502 libc-960503 libc-960504 libc-960505 libc-960506 libc-960507 libc-960508 libc-960509 libc-960510 libc-960511 libc-960512 libc-960513 libc-960514 libc-960515 libc-960516 libc-960517 libc-960518 libc-960519 libc-960520
* config.guess: Combine two OSF1 rules.
Also recognize field test versions. From mjr@zk3.dec.com.
* config.guess (dgux): Use /usr/bin/uname rather than uname,
because GNU uname does not support -p. From pmr@pajato.com.
author | Per Bothner <bothner@cygnus.com> |
---|---|
date | Sat, 13 Apr 1996 00:06:54 +0000 |
parents | 88b23d545848 |
children | fb947ec168a8 |
rev | line source |
---|---|
13434 | 1 /* Functions for the Win32 window system. |
2 Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation. | |
3 | |
4 This file is part of GNU Emacs. | |
5 | |
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) | |
9 any later version. | |
10 | |
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. | |
15 | |
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 | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
13434
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
13434
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
13434 | 20 |
21 /* Added by Kevin Gallo */ | |
22 | |
23 #include <signal.h> | |
24 #include <config.h> | |
25 #include <stdio.h> | |
26 | |
27 #include "lisp.h" | |
28 #include "w32term.h" | |
29 #include "frame.h" | |
30 #include "window.h" | |
31 #include "buffer.h" | |
32 #include "dispextern.h" | |
33 #include "keyboard.h" | |
34 #include "blockinput.h" | |
35 #include "paths.h" | |
36 #include "ntheap.h" | |
37 #include "termhooks.h" | |
38 | |
39 #include <commdlg.h> | |
40 | |
41 extern void abort (); | |
42 extern void free_frame_menubar (); | |
43 extern struct scroll_bar *x_window_to_scroll_bar (); | |
44 | |
45 /* The colormap for converting color names to RGB values */ | |
46 Lisp_Object Vwin32_color_map; | |
47 | |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
48 /* Non nil if alt key presses are passed on to Windows. */ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
49 Lisp_Object Vwin32_pass_alt_to_system; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
50 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
51 /* Non nil if left window, right window, and application key events |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
52 are passed on to Windows. */ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
53 Lisp_Object Vwin32_pass_optional_keys_to_system; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
54 |
13434 | 55 /* The name we're using in resource queries. */ |
56 Lisp_Object Vx_resource_name; | |
57 | |
58 /* Non nil if no window manager is in use. */ | |
59 Lisp_Object Vx_no_window_manager; | |
60 | |
61 /* The background and shape of the mouse pointer, and shape when not | |
62 over text or in the modeline. */ | |
63 Lisp_Object Vx_pointer_shape, Vx_nontext_pointer_shape, Vx_mode_pointer_shape; | |
64 /* The shape when over mouse-sensitive text. */ | |
65 Lisp_Object Vx_sensitive_text_pointer_shape; | |
66 | |
67 /* Color of chars displayed in cursor box. */ | |
68 Lisp_Object Vx_cursor_fore_pixel; | |
69 | |
70 /* Search path for bitmap files. */ | |
71 Lisp_Object Vx_bitmap_file_path; | |
72 | |
73 /* Evaluate this expression to rebuild the section of syms_of_w32fns | |
74 that initializes and staticpros the symbols declared below. Note | |
75 that Emacs 18 has a bug that keeps C-x C-e from being able to | |
76 evaluate this expression. | |
77 | |
78 (progn | |
79 ;; Accumulate a list of the symbols we want to initialize from the | |
80 ;; declarations at the top of the file. | |
81 (goto-char (point-min)) | |
82 (search-forward "/\*&&& symbols declared here &&&*\/\n") | |
83 (let (symbol-list) | |
84 (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)") | |
85 (setq symbol-list | |
86 (cons (buffer-substring (match-beginning 1) (match-end 1)) | |
87 symbol-list)) | |
88 (forward-line 1)) | |
89 (setq symbol-list (nreverse symbol-list)) | |
90 ;; Delete the section of syms_of_... where we initialize the symbols. | |
91 (search-forward "\n /\*&&& init symbols here &&&*\/\n") | |
92 (let ((start (point))) | |
93 (while (looking-at "^ Q") | |
94 (forward-line 2)) | |
95 (kill-region start (point))) | |
96 ;; Write a new symbol initialization section. | |
97 (while symbol-list | |
98 (insert (format " %s = intern (\"" (car symbol-list))) | |
99 (let ((start (point))) | |
100 (insert (substring (car symbol-list) 1)) | |
101 (subst-char-in-region start (point) ?_ ?-)) | |
102 (insert (format "\");\n staticpro (&%s);\n" (car symbol-list))) | |
103 (setq symbol-list (cdr symbol-list))))) | |
104 | |
105 */ | |
106 | |
107 /*&&& symbols declared here &&&*/ | |
108 Lisp_Object Qauto_raise; | |
109 Lisp_Object Qauto_lower; | |
110 Lisp_Object Qbackground_color; | |
111 Lisp_Object Qbar; | |
112 Lisp_Object Qborder_color; | |
113 Lisp_Object Qborder_width; | |
114 Lisp_Object Qbox; | |
115 Lisp_Object Qcursor_color; | |
116 Lisp_Object Qcursor_type; | |
117 Lisp_Object Qfont; | |
118 Lisp_Object Qforeground_color; | |
119 Lisp_Object Qgeometry; | |
120 Lisp_Object Qicon_left; | |
121 Lisp_Object Qicon_top; | |
122 Lisp_Object Qicon_type; | |
123 Lisp_Object Qicon_name; | |
124 Lisp_Object Qinternal_border_width; | |
125 Lisp_Object Qleft; | |
126 Lisp_Object Qmouse_color; | |
127 Lisp_Object Qnone; | |
128 Lisp_Object Qparent_id; | |
129 Lisp_Object Qscroll_bar_width; | |
130 Lisp_Object Qsuppress_icon; | |
131 Lisp_Object Qtop; | |
132 Lisp_Object Qundefined_color; | |
133 Lisp_Object Qvertical_scroll_bars; | |
134 Lisp_Object Qvisibility; | |
135 Lisp_Object Qwindow_id; | |
136 Lisp_Object Qx_frame_parameter; | |
137 Lisp_Object Qx_resource_name; | |
138 Lisp_Object Quser_position; | |
139 Lisp_Object Quser_size; | |
140 Lisp_Object Qdisplay; | |
141 | |
142 /* The below are defined in frame.c. */ | |
143 extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth; | |
144 extern Lisp_Object Qunsplittable, Qmenu_bar_lines; | |
145 | |
146 extern Lisp_Object Vwindow_system_version; | |
147 | |
148 extern Lisp_Object last_mouse_scroll_bar; | |
149 extern int last_mouse_scroll_bar_pos; | |
150 Time last_mouse_movement_time; | |
151 | |
152 | |
153 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame | |
154 and checking validity for Win32. */ | |
155 | |
156 FRAME_PTR | |
157 check_x_frame (frame) | |
158 Lisp_Object frame; | |
159 { | |
160 FRAME_PTR f; | |
161 | |
162 if (NILP (frame)) | |
163 f = selected_frame; | |
164 else | |
165 { | |
166 CHECK_LIVE_FRAME (frame, 0); | |
167 f = XFRAME (frame); | |
168 } | |
169 if (! FRAME_WIN32_P (f)) | |
170 error ("non-win32 frame used"); | |
171 return f; | |
172 } | |
173 | |
174 /* Let the user specify an display with a frame. | |
175 nil stands for the selected frame--or, if that is not a win32 frame, | |
176 the first display on the list. */ | |
177 | |
178 static struct win32_display_info * | |
179 check_x_display_info (frame) | |
180 Lisp_Object frame; | |
181 { | |
182 if (NILP (frame)) | |
183 { | |
184 if (FRAME_WIN32_P (selected_frame)) | |
185 return FRAME_WIN32_DISPLAY_INFO (selected_frame); | |
186 else | |
187 return &one_win32_display_info; | |
188 } | |
189 else if (STRINGP (frame)) | |
190 return x_display_info_for_name (frame); | |
191 else | |
192 { | |
193 FRAME_PTR f; | |
194 | |
195 CHECK_LIVE_FRAME (frame, 0); | |
196 f = XFRAME (frame); | |
197 if (! FRAME_WIN32_P (f)) | |
198 error ("non-win32 frame used"); | |
199 return FRAME_WIN32_DISPLAY_INFO (f); | |
200 } | |
201 } | |
202 | |
203 /* Return the Emacs frame-object corresponding to an win32 window. | |
204 It could be the frame's main window or an icon window. */ | |
205 | |
206 /* This function can be called during GC, so use GC_xxx type test macros. */ | |
207 | |
208 struct frame * | |
209 x_window_to_frame (dpyinfo, wdesc) | |
210 struct win32_display_info *dpyinfo; | |
211 HWND wdesc; | |
212 { | |
213 Lisp_Object tail, frame; | |
214 struct frame *f; | |
215 | |
216 for (tail = Vframe_list; GC_CONSP (tail); tail = XCONS (tail)->cdr) | |
217 { | |
218 frame = XCONS (tail)->car; | |
219 if (!GC_FRAMEP (frame)) | |
220 continue; | |
221 f = XFRAME (frame); | |
222 if (f->output_data.nothing == 1 | |
223 || FRAME_WIN32_DISPLAY_INFO (f) != dpyinfo) | |
224 continue; | |
225 if (FRAME_WIN32_WINDOW (f) == wdesc) | |
226 return f; | |
227 } | |
228 return 0; | |
229 } | |
230 | |
231 | |
232 | |
233 /* Code to deal with bitmaps. Bitmaps are referenced by their bitmap | |
234 id, which is just an int that this section returns. Bitmaps are | |
235 reference counted so they can be shared among frames. | |
236 | |
237 Bitmap indices are guaranteed to be > 0, so a negative number can | |
238 be used to indicate no bitmap. | |
239 | |
240 If you use x_create_bitmap_from_data, then you must keep track of | |
241 the bitmaps yourself. That is, creating a bitmap from the same | |
242 data more than once will not be caught. */ | |
243 | |
244 | |
245 /* Functions to access the contents of a bitmap, given an id. */ | |
246 | |
247 int | |
248 x_bitmap_height (f, id) | |
249 FRAME_PTR f; | |
250 int id; | |
251 { | |
252 return FRAME_WIN32_DISPLAY_INFO (f)->bitmaps[id - 1].height; | |
253 } | |
254 | |
255 int | |
256 x_bitmap_width (f, id) | |
257 FRAME_PTR f; | |
258 int id; | |
259 { | |
260 return FRAME_WIN32_DISPLAY_INFO (f)->bitmaps[id - 1].width; | |
261 } | |
262 | |
263 int | |
264 x_bitmap_pixmap (f, id) | |
265 FRAME_PTR f; | |
266 int id; | |
267 { | |
268 return (int) FRAME_WIN32_DISPLAY_INFO (f)->bitmaps[id - 1].pixmap; | |
269 } | |
270 | |
271 | |
272 /* Allocate a new bitmap record. Returns index of new record. */ | |
273 | |
274 static int | |
275 x_allocate_bitmap_record (f) | |
276 FRAME_PTR f; | |
277 { | |
278 struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (f); | |
279 int i; | |
280 | |
281 if (dpyinfo->bitmaps == NULL) | |
282 { | |
283 dpyinfo->bitmaps_size = 10; | |
284 dpyinfo->bitmaps | |
285 = (struct win32_bitmap_record *) xmalloc (dpyinfo->bitmaps_size * sizeof (struct win32_bitmap_record)); | |
286 dpyinfo->bitmaps_last = 1; | |
287 return 1; | |
288 } | |
289 | |
290 if (dpyinfo->bitmaps_last < dpyinfo->bitmaps_size) | |
291 return ++dpyinfo->bitmaps_last; | |
292 | |
293 for (i = 0; i < dpyinfo->bitmaps_size; ++i) | |
294 if (dpyinfo->bitmaps[i].refcount == 0) | |
295 return i + 1; | |
296 | |
297 dpyinfo->bitmaps_size *= 2; | |
298 dpyinfo->bitmaps | |
299 = (struct win32_bitmap_record *) xrealloc (dpyinfo->bitmaps, | |
300 dpyinfo->bitmaps_size * sizeof (struct win32_bitmap_record)); | |
301 return ++dpyinfo->bitmaps_last; | |
302 } | |
303 | |
304 /* Add one reference to the reference count of the bitmap with id ID. */ | |
305 | |
306 void | |
307 x_reference_bitmap (f, id) | |
308 FRAME_PTR f; | |
309 int id; | |
310 { | |
311 ++FRAME_WIN32_DISPLAY_INFO (f)->bitmaps[id - 1].refcount; | |
312 } | |
313 | |
314 /* Create a bitmap for frame F from a HEIGHT x WIDTH array of bits at BITS. */ | |
315 | |
316 int | |
317 x_create_bitmap_from_data (f, bits, width, height) | |
318 struct frame *f; | |
319 char *bits; | |
320 unsigned int width, height; | |
321 { | |
322 struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (f); | |
323 Pixmap bitmap; | |
324 int id; | |
325 | |
326 bitmap = CreateBitmap (width, height, | |
327 FRAME_WIN32_DISPLAY_INFO (XFRAME (frame))->n_planes, | |
328 FRAME_WIN32_DISPLAY_INFO (XFRAME (frame))->n_cbits, | |
329 bits); | |
330 | |
331 if (! bitmap) | |
332 return -1; | |
333 | |
334 id = x_allocate_bitmap_record (f); | |
335 dpyinfo->bitmaps[id - 1].pixmap = bitmap; | |
336 dpyinfo->bitmaps[id - 1].file = NULL; | |
337 dpyinfo->bitmaps[id - 1].hinst = NULL; | |
338 dpyinfo->bitmaps[id - 1].refcount = 1; | |
339 dpyinfo->bitmaps[id - 1].depth = 1; | |
340 dpyinfo->bitmaps[id - 1].height = height; | |
341 dpyinfo->bitmaps[id - 1].width = width; | |
342 | |
343 return id; | |
344 } | |
345 | |
346 /* Create bitmap from file FILE for frame F. */ | |
347 | |
348 int | |
349 x_create_bitmap_from_file (f, file) | |
350 struct frame *f; | |
351 Lisp_Object file; | |
352 { | |
353 return -1; | |
354 #if 0 | |
355 struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (f); | |
356 unsigned int width, height; | |
357 Pixmap bitmap; | |
358 int xhot, yhot, result, id; | |
359 Lisp_Object found; | |
360 int fd; | |
361 char *filename; | |
362 HINSTANCE hinst; | |
363 | |
364 /* Look for an existing bitmap with the same name. */ | |
365 for (id = 0; id < dpyinfo->bitmaps_last; ++id) | |
366 { | |
367 if (dpyinfo->bitmaps[id].refcount | |
368 && dpyinfo->bitmaps[id].file | |
369 && !strcmp (dpyinfo->bitmaps[id].file, (char *) XSTRING (file)->data)) | |
370 { | |
371 ++dpyinfo->bitmaps[id].refcount; | |
372 return id + 1; | |
373 } | |
374 } | |
375 | |
376 /* Search bitmap-file-path for the file, if appropriate. */ | |
377 fd = openp (Vx_bitmap_file_path, file, "", &found, 0); | |
378 if (fd < 0) | |
379 return -1; | |
380 close (fd); | |
381 | |
382 filename = (char *) XSTRING (found)->data; | |
383 | |
384 hinst = LoadLibraryEx (filename, NULL, LOAD_LIBRARY_AS_DATAFILE); | |
385 | |
386 if (hinst == NULL) | |
387 return -1; | |
388 | |
389 | |
390 result = XReadBitmapFile (FRAME_WIN32_DISPLAY (f), FRAME_WIN32_WINDOW (f), | |
391 filename, &width, &height, &bitmap, &xhot, &yhot); | |
392 if (result != BitmapSuccess) | |
393 return -1; | |
394 | |
395 id = x_allocate_bitmap_record (f); | |
396 dpyinfo->bitmaps[id - 1].pixmap = bitmap; | |
397 dpyinfo->bitmaps[id - 1].refcount = 1; | |
398 dpyinfo->bitmaps[id - 1].file = (char *) xmalloc (XSTRING (file)->size + 1); | |
399 dpyinfo->bitmaps[id - 1].depth = 1; | |
400 dpyinfo->bitmaps[id - 1].height = height; | |
401 dpyinfo->bitmaps[id - 1].width = width; | |
402 strcpy (dpyinfo->bitmaps[id - 1].file, XSTRING (file)->data); | |
403 | |
404 return id; | |
405 #endif | |
406 } | |
407 | |
408 /* Remove reference to bitmap with id number ID. */ | |
409 | |
410 int | |
411 x_destroy_bitmap (f, id) | |
412 FRAME_PTR f; | |
413 int id; | |
414 { | |
415 struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (f); | |
416 | |
417 if (id > 0) | |
418 { | |
419 --dpyinfo->bitmaps[id - 1].refcount; | |
420 if (dpyinfo->bitmaps[id - 1].refcount == 0) | |
421 { | |
422 BLOCK_INPUT; | |
423 DeleteObject (dpyinfo->bitmaps[id - 1].pixmap); | |
424 if (dpyinfo->bitmaps[id - 1].file) | |
425 { | |
426 free (dpyinfo->bitmaps[id - 1].file); | |
427 dpyinfo->bitmaps[id - 1].file = NULL; | |
428 } | |
429 UNBLOCK_INPUT; | |
430 } | |
431 } | |
432 } | |
433 | |
434 /* Free all the bitmaps for the display specified by DPYINFO. */ | |
435 | |
436 static void | |
437 x_destroy_all_bitmaps (dpyinfo) | |
438 struct win32_display_info *dpyinfo; | |
439 { | |
440 int i; | |
441 for (i = 0; i < dpyinfo->bitmaps_last; i++) | |
442 if (dpyinfo->bitmaps[i].refcount > 0) | |
443 { | |
444 DeleteObject (dpyinfo->bitmaps[i].pixmap); | |
445 if (dpyinfo->bitmaps[i].file) | |
446 free (dpyinfo->bitmaps[i].file); | |
447 } | |
448 dpyinfo->bitmaps_last = 0; | |
449 } | |
450 | |
451 /* Connect the frame-parameter names for Win32 frames | |
452 to the ways of passing the parameter values to the window system. | |
453 | |
454 The name of a parameter, as a Lisp symbol, | |
455 has an `x-frame-parameter' property which is an integer in Lisp | |
456 but can be interpreted as an `enum x_frame_parm' in C. */ | |
457 | |
458 enum x_frame_parm | |
459 { | |
460 X_PARM_FOREGROUND_COLOR, | |
461 X_PARM_BACKGROUND_COLOR, | |
462 X_PARM_MOUSE_COLOR, | |
463 X_PARM_CURSOR_COLOR, | |
464 X_PARM_BORDER_COLOR, | |
465 X_PARM_ICON_TYPE, | |
466 X_PARM_FONT, | |
467 X_PARM_BORDER_WIDTH, | |
468 X_PARM_INTERNAL_BORDER_WIDTH, | |
469 X_PARM_NAME, | |
470 X_PARM_AUTORAISE, | |
471 X_PARM_AUTOLOWER, | |
472 X_PARM_VERT_SCROLL_BAR, | |
473 X_PARM_VISIBILITY, | |
474 X_PARM_MENU_BAR_LINES | |
475 }; | |
476 | |
477 | |
478 struct x_frame_parm_table | |
479 { | |
480 char *name; | |
481 void (*setter)( /* struct frame *frame, Lisp_Object val, oldval */ ); | |
482 }; | |
483 | |
484 void x_set_foreground_color (); | |
485 void x_set_background_color (); | |
486 void x_set_mouse_color (); | |
487 void x_set_cursor_color (); | |
488 void x_set_border_color (); | |
489 void x_set_cursor_type (); | |
490 void x_set_icon_type (); | |
491 void x_set_icon_name (); | |
492 void x_set_font (); | |
493 void x_set_border_width (); | |
494 void x_set_internal_border_width (); | |
495 void x_explicitly_set_name (); | |
496 void x_set_autoraise (); | |
497 void x_set_autolower (); | |
498 void x_set_vertical_scroll_bars (); | |
499 void x_set_visibility (); | |
500 void x_set_menu_bar_lines (); | |
501 void x_set_scroll_bar_width (); | |
502 void x_set_unsplittable (); | |
503 | |
504 static struct x_frame_parm_table x_frame_parms[] = | |
505 { | |
506 "foreground-color", x_set_foreground_color, | |
507 "background-color", x_set_background_color, | |
508 "mouse-color", x_set_mouse_color, | |
509 "cursor-color", x_set_cursor_color, | |
510 "border-color", x_set_border_color, | |
511 "cursor-type", x_set_cursor_type, | |
512 "icon-type", x_set_icon_type, | |
513 "icon-name", x_set_icon_name, | |
514 "font", x_set_font, | |
515 "border-width", x_set_border_width, | |
516 "internal-border-width", x_set_internal_border_width, | |
517 "name", x_explicitly_set_name, | |
518 "auto-raise", x_set_autoraise, | |
519 "auto-lower", x_set_autolower, | |
520 "vertical-scroll-bars", x_set_vertical_scroll_bars, | |
521 "visibility", x_set_visibility, | |
522 "menu-bar-lines", x_set_menu_bar_lines, | |
523 "scroll-bar-width", x_set_scroll_bar_width, | |
524 "unsplittable", x_set_unsplittable, | |
525 }; | |
526 | |
527 /* Attach the `x-frame-parameter' properties to | |
528 the Lisp symbol names of parameters relevant to Win32. */ | |
529 | |
530 init_x_parm_symbols () | |
531 { | |
532 int i; | |
533 | |
534 for (i = 0; i < sizeof (x_frame_parms) / sizeof (x_frame_parms[0]); i++) | |
535 Fput (intern (x_frame_parms[i].name), Qx_frame_parameter, | |
536 make_number (i)); | |
537 } | |
538 | |
539 /* Change the parameters of FRAME as specified by ALIST. | |
540 If a parameter is not specially recognized, do nothing; | |
541 otherwise call the `x_set_...' function for that parameter. */ | |
542 | |
543 void | |
544 x_set_frame_parameters (f, alist) | |
545 FRAME_PTR f; | |
546 Lisp_Object alist; | |
547 { | |
548 Lisp_Object tail; | |
549 | |
550 /* If both of these parameters are present, it's more efficient to | |
551 set them both at once. So we wait until we've looked at the | |
552 entire list before we set them. */ | |
553 Lisp_Object width, height; | |
554 | |
555 /* Same here. */ | |
556 Lisp_Object left, top; | |
557 | |
558 /* Same with these. */ | |
559 Lisp_Object icon_left, icon_top; | |
560 | |
561 /* Record in these vectors all the parms specified. */ | |
562 Lisp_Object *parms; | |
563 Lisp_Object *values; | |
564 int i; | |
565 int left_no_change = 0, top_no_change = 0; | |
566 int icon_left_no_change = 0, icon_top_no_change = 0; | |
567 | |
568 i = 0; | |
569 for (tail = alist; CONSP (tail); tail = Fcdr (tail)) | |
570 i++; | |
571 | |
572 parms = (Lisp_Object *) alloca (i * sizeof (Lisp_Object)); | |
573 values = (Lisp_Object *) alloca (i * sizeof (Lisp_Object)); | |
574 | |
575 /* Extract parm names and values into those vectors. */ | |
576 | |
577 i = 0; | |
578 for (tail = alist; CONSP (tail); tail = Fcdr (tail)) | |
579 { | |
580 Lisp_Object elt, prop, val; | |
581 | |
582 elt = Fcar (tail); | |
583 parms[i] = Fcar (elt); | |
584 values[i] = Fcdr (elt); | |
585 i++; | |
586 } | |
587 | |
588 width = height = top = left = Qunbound; | |
589 icon_left = icon_top = Qunbound; | |
590 | |
591 /* Now process them in reverse of specified order. */ | |
592 for (i--; i >= 0; i--) | |
593 { | |
594 Lisp_Object prop, val; | |
595 | |
596 prop = parms[i]; | |
597 val = values[i]; | |
598 | |
599 if (EQ (prop, Qwidth)) | |
600 width = val; | |
601 else if (EQ (prop, Qheight)) | |
602 height = val; | |
603 else if (EQ (prop, Qtop)) | |
604 top = val; | |
605 else if (EQ (prop, Qleft)) | |
606 left = val; | |
607 else if (EQ (prop, Qicon_top)) | |
608 icon_top = val; | |
609 else if (EQ (prop, Qicon_left)) | |
610 icon_left = val; | |
611 else | |
612 { | |
613 register Lisp_Object param_index, old_value; | |
614 | |
615 param_index = Fget (prop, Qx_frame_parameter); | |
616 old_value = get_frame_param (f, prop); | |
617 store_frame_param (f, prop, val); | |
618 if (NATNUMP (param_index) | |
619 && (XFASTINT (param_index) | |
620 < sizeof (x_frame_parms)/sizeof (x_frame_parms[0]))) | |
14353 | 621 (*x_frame_parms[XINT (param_index)].setter)(f, val, old_value); |
13434 | 622 } |
623 } | |
624 | |
625 /* Don't die if just one of these was set. */ | |
626 if (EQ (left, Qunbound)) | |
627 { | |
628 left_no_change = 1; | |
629 if (f->output_data.win32->left_pos < 0) | |
630 left = Fcons (Qplus, Fcons (make_number (f->output_data.win32->left_pos), Qnil)); | |
631 else | |
632 XSETINT (left, f->output_data.win32->left_pos); | |
633 } | |
634 if (EQ (top, Qunbound)) | |
635 { | |
636 top_no_change = 1; | |
637 if (f->output_data.win32->top_pos < 0) | |
638 top = Fcons (Qplus, Fcons (make_number (f->output_data.win32->top_pos), Qnil)); | |
639 else | |
640 XSETINT (top, f->output_data.win32->top_pos); | |
641 } | |
642 | |
643 /* If one of the icon positions was not set, preserve or default it. */ | |
644 if (EQ (icon_left, Qunbound) || ! INTEGERP (icon_left)) | |
645 { | |
646 icon_left_no_change = 1; | |
647 icon_left = Fcdr (Fassq (Qicon_left, f->param_alist)); | |
648 if (NILP (icon_left)) | |
649 XSETINT (icon_left, 0); | |
650 } | |
651 if (EQ (icon_top, Qunbound) || ! INTEGERP (icon_top)) | |
652 { | |
653 icon_top_no_change = 1; | |
654 icon_top = Fcdr (Fassq (Qicon_top, f->param_alist)); | |
655 if (NILP (icon_top)) | |
656 XSETINT (icon_top, 0); | |
657 } | |
658 | |
659 /* Don't die if just one of these was set. */ | |
660 if (EQ (width, Qunbound)) | |
661 XSETINT (width, FRAME_WIDTH (f)); | |
662 if (EQ (height, Qunbound)) | |
663 XSETINT (height, FRAME_HEIGHT (f)); | |
664 | |
665 /* Don't set these parameters unless they've been explicitly | |
666 specified. The window might be mapped or resized while we're in | |
667 this function, and we don't want to override that unless the lisp | |
668 code has asked for it. | |
669 | |
670 Don't set these parameters unless they actually differ from the | |
671 window's current parameters; the window may not actually exist | |
672 yet. */ | |
673 { | |
674 Lisp_Object frame; | |
675 | |
676 check_frame_size (f, &height, &width); | |
677 | |
678 XSETFRAME (frame, f); | |
679 | |
680 if ((NUMBERP (width) && XINT (width) != FRAME_WIDTH (f)) | |
681 || (NUMBERP (height) && XINT (height) != FRAME_HEIGHT (f))) | |
682 Fset_frame_size (frame, width, height); | |
683 | |
684 if ((!NILP (left) || !NILP (top)) | |
685 && ! (left_no_change && top_no_change) | |
686 && ! (NUMBERP (left) && XINT (left) == f->output_data.win32->left_pos | |
687 && NUMBERP (top) && XINT (top) == f->output_data.win32->top_pos)) | |
688 { | |
689 int leftpos = 0; | |
690 int toppos = 0; | |
691 | |
692 /* Record the signs. */ | |
693 f->output_data.win32->size_hint_flags &= ~ (XNegative | YNegative); | |
694 if (EQ (left, Qminus)) | |
695 f->output_data.win32->size_hint_flags |= XNegative; | |
696 else if (INTEGERP (left)) | |
697 { | |
698 leftpos = XINT (left); | |
699 if (leftpos < 0) | |
700 f->output_data.win32->size_hint_flags |= XNegative; | |
701 } | |
702 else if (CONSP (left) && EQ (XCONS (left)->car, Qminus) | |
703 && CONSP (XCONS (left)->cdr) | |
704 && INTEGERP (XCONS (XCONS (left)->cdr)->car)) | |
705 { | |
706 leftpos = - XINT (XCONS (XCONS (left)->cdr)->car); | |
707 f->output_data.win32->size_hint_flags |= XNegative; | |
708 } | |
709 else if (CONSP (left) && EQ (XCONS (left)->car, Qplus) | |
710 && CONSP (XCONS (left)->cdr) | |
711 && INTEGERP (XCONS (XCONS (left)->cdr)->car)) | |
712 { | |
713 leftpos = XINT (XCONS (XCONS (left)->cdr)->car); | |
714 } | |
715 | |
716 if (EQ (top, Qminus)) | |
717 f->output_data.win32->size_hint_flags |= YNegative; | |
718 else if (INTEGERP (top)) | |
719 { | |
720 toppos = XINT (top); | |
721 if (toppos < 0) | |
722 f->output_data.win32->size_hint_flags |= YNegative; | |
723 } | |
724 else if (CONSP (top) && EQ (XCONS (top)->car, Qminus) | |
725 && CONSP (XCONS (top)->cdr) | |
726 && INTEGERP (XCONS (XCONS (top)->cdr)->car)) | |
727 { | |
728 toppos = - XINT (XCONS (XCONS (top)->cdr)->car); | |
729 f->output_data.win32->size_hint_flags |= YNegative; | |
730 } | |
731 else if (CONSP (top) && EQ (XCONS (top)->car, Qplus) | |
732 && CONSP (XCONS (top)->cdr) | |
733 && INTEGERP (XCONS (XCONS (top)->cdr)->car)) | |
734 { | |
735 toppos = XINT (XCONS (XCONS (top)->cdr)->car); | |
736 } | |
737 | |
738 | |
739 /* Store the numeric value of the position. */ | |
740 f->output_data.win32->top_pos = toppos; | |
741 f->output_data.win32->left_pos = leftpos; | |
742 | |
743 f->output_data.win32->win_gravity = NorthWestGravity; | |
744 | |
745 /* Actually set that position, and convert to absolute. */ | |
746 x_set_offset (f, leftpos, toppos, -1); | |
747 } | |
748 | |
749 if ((!NILP (icon_left) || !NILP (icon_top)) | |
750 && ! (icon_left_no_change && icon_top_no_change)) | |
751 x_wm_set_icon_position (f, XINT (icon_left), XINT (icon_top)); | |
752 } | |
753 } | |
754 | |
755 /* Store the screen positions of frame F into XPTR and YPTR. | |
756 These are the positions of the containing window manager window, | |
757 not Emacs's own window. */ | |
758 | |
759 void | |
760 x_real_positions (f, xptr, yptr) | |
761 FRAME_PTR f; | |
762 int *xptr, *yptr; | |
763 { | |
764 POINT pt; | |
14353 | 765 |
766 { | |
767 RECT rect; | |
13434 | 768 |
14353 | 769 GetClientRect(FRAME_WIN32_WINDOW(f), &rect); |
770 AdjustWindowRect(&rect, f->output_data.win32->dwStyle, FRAME_EXTERNAL_MENU_BAR(f)); | |
13434 | 771 |
14353 | 772 pt.x = rect.left; |
773 pt.y = rect.top; | |
774 } | |
775 | |
776 ClientToScreen (FRAME_WIN32_WINDOW(f), &pt); | |
13434 | 777 |
778 *xptr = pt.x; | |
779 *yptr = pt.y; | |
780 } | |
781 | |
782 /* Insert a description of internally-recorded parameters of frame X | |
783 into the parameter alist *ALISTPTR that is to be given to the user. | |
784 Only parameters that are specific to Win32 | |
785 and whose values are not correctly recorded in the frame's | |
786 param_alist need to be considered here. */ | |
787 | |
788 x_report_frame_params (f, alistptr) | |
789 struct frame *f; | |
790 Lisp_Object *alistptr; | |
791 { | |
792 char buf[16]; | |
793 Lisp_Object tem; | |
794 | |
795 /* Represent negative positions (off the top or left screen edge) | |
796 in a way that Fmodify_frame_parameters will understand correctly. */ | |
797 XSETINT (tem, f->output_data.win32->left_pos); | |
798 if (f->output_data.win32->left_pos >= 0) | |
799 store_in_alist (alistptr, Qleft, tem); | |
800 else | |
801 store_in_alist (alistptr, Qleft, Fcons (Qplus, Fcons (tem, Qnil))); | |
802 | |
803 XSETINT (tem, f->output_data.win32->top_pos); | |
804 if (f->output_data.win32->top_pos >= 0) | |
805 store_in_alist (alistptr, Qtop, tem); | |
806 else | |
807 store_in_alist (alistptr, Qtop, Fcons (Qplus, Fcons (tem, Qnil))); | |
808 | |
809 store_in_alist (alistptr, Qborder_width, | |
810 make_number (f->output_data.win32->border_width)); | |
811 store_in_alist (alistptr, Qinternal_border_width, | |
812 make_number (f->output_data.win32->internal_border_width)); | |
813 sprintf (buf, "%ld", (long) FRAME_WIN32_WINDOW (f)); | |
814 store_in_alist (alistptr, Qwindow_id, | |
815 build_string (buf)); | |
816 store_in_alist (alistptr, Qicon_name, f->icon_name); | |
817 FRAME_SAMPLE_VISIBILITY (f); | |
818 store_in_alist (alistptr, Qvisibility, | |
819 (FRAME_VISIBLE_P (f) ? Qt | |
820 : FRAME_ICONIFIED_P (f) ? Qicon : Qnil)); | |
821 store_in_alist (alistptr, Qdisplay, | |
822 XCONS (FRAME_WIN32_DISPLAY_INFO (f)->name_list_element)->car); | |
823 } | |
824 | |
825 | |
14353 | 826 #if 0 |
827 DEFUN ("win32-rgb", Fwin32_rgb, Swin32_rgb, 3, 3, 0, | |
828 "Convert RGB numbers to a windows color reference.") | |
829 (red, green, blue) | |
830 Lisp_Object red, green, blue; | |
13434 | 831 { |
832 Lisp_Object rgb; | |
833 | |
834 CHECK_NUMBER (red, 0); | |
835 CHECK_NUMBER (green, 0); | |
836 CHECK_NUMBER (blue, 0); | |
14353 | 837 |
838 XSET (rgb, Lisp_Int, RGB(XUINT(red), XUINT(green), XUINT(blue))); | |
839 | |
840 return (rgb); | |
13434 | 841 } |
842 | |
14353 | 843 |
844 #else | |
13434 | 845 /* The default colors for the win32 color map */ |
846 typedef struct colormap_t | |
847 { | |
848 char *name; | |
849 COLORREF colorref; | |
850 } colormap_t; | |
851 | |
852 colormap_t win32_color_map[] = | |
853 { | |
14983
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
854 {"snow" , PALETTERGB (255,250,250)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
855 {"ghost white" , PALETTERGB (248,248,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
856 {"GhostWhite" , PALETTERGB (248,248,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
857 {"white smoke" , PALETTERGB (245,245,245)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
858 {"WhiteSmoke" , PALETTERGB (245,245,245)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
859 {"gainsboro" , PALETTERGB (220,220,220)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
860 {"floral white" , PALETTERGB (255,250,240)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
861 {"FloralWhite" , PALETTERGB (255,250,240)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
862 {"old lace" , PALETTERGB (253,245,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
863 {"OldLace" , PALETTERGB (253,245,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
864 {"linen" , PALETTERGB (250,240,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
865 {"antique white" , PALETTERGB (250,235,215)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
866 {"AntiqueWhite" , PALETTERGB (250,235,215)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
867 {"papaya whip" , PALETTERGB (255,239,213)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
868 {"PapayaWhip" , PALETTERGB (255,239,213)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
869 {"blanched almond" , PALETTERGB (255,235,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
870 {"BlanchedAlmond" , PALETTERGB (255,235,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
871 {"bisque" , PALETTERGB (255,228,196)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
872 {"peach puff" , PALETTERGB (255,218,185)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
873 {"PeachPuff" , PALETTERGB (255,218,185)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
874 {"navajo white" , PALETTERGB (255,222,173)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
875 {"NavajoWhite" , PALETTERGB (255,222,173)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
876 {"moccasin" , PALETTERGB (255,228,181)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
877 {"cornsilk" , PALETTERGB (255,248,220)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
878 {"ivory" , PALETTERGB (255,255,240)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
879 {"lemon chiffon" , PALETTERGB (255,250,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
880 {"LemonChiffon" , PALETTERGB (255,250,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
881 {"seashell" , PALETTERGB (255,245,238)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
882 {"honeydew" , PALETTERGB (240,255,240)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
883 {"mint cream" , PALETTERGB (245,255,250)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
884 {"MintCream" , PALETTERGB (245,255,250)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
885 {"azure" , PALETTERGB (240,255,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
886 {"alice blue" , PALETTERGB (240,248,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
887 {"AliceBlue" , PALETTERGB (240,248,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
888 {"lavender" , PALETTERGB (230,230,250)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
889 {"lavender blush" , PALETTERGB (255,240,245)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
890 {"LavenderBlush" , PALETTERGB (255,240,245)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
891 {"misty rose" , PALETTERGB (255,228,225)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
892 {"MistyRose" , PALETTERGB (255,228,225)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
893 {"white" , PALETTERGB (255,255,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
894 {"black" , PALETTERGB ( 0, 0, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
895 {"dark slate gray" , PALETTERGB ( 47, 79, 79)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
896 {"DarkSlateGray" , PALETTERGB ( 47, 79, 79)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
897 {"dark slate grey" , PALETTERGB ( 47, 79, 79)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
898 {"DarkSlateGrey" , PALETTERGB ( 47, 79, 79)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
899 {"dim gray" , PALETTERGB (105,105,105)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
900 {"DimGray" , PALETTERGB (105,105,105)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
901 {"dim grey" , PALETTERGB (105,105,105)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
902 {"DimGrey" , PALETTERGB (105,105,105)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
903 {"slate gray" , PALETTERGB (112,128,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
904 {"SlateGray" , PALETTERGB (112,128,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
905 {"slate grey" , PALETTERGB (112,128,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
906 {"SlateGrey" , PALETTERGB (112,128,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
907 {"light slate gray" , PALETTERGB (119,136,153)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
908 {"LightSlateGray" , PALETTERGB (119,136,153)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
909 {"light slate grey" , PALETTERGB (119,136,153)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
910 {"LightSlateGrey" , PALETTERGB (119,136,153)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
911 {"gray" , PALETTERGB (190,190,190)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
912 {"grey" , PALETTERGB (190,190,190)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
913 {"light grey" , PALETTERGB (211,211,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
914 {"LightGrey" , PALETTERGB (211,211,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
915 {"light gray" , PALETTERGB (211,211,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
916 {"LightGray" , PALETTERGB (211,211,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
917 {"midnight blue" , PALETTERGB ( 25, 25,112)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
918 {"MidnightBlue" , PALETTERGB ( 25, 25,112)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
919 {"navy" , PALETTERGB ( 0, 0,128)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
920 {"navy blue" , PALETTERGB ( 0, 0,128)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
921 {"NavyBlue" , PALETTERGB ( 0, 0,128)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
922 {"cornflower blue" , PALETTERGB (100,149,237)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
923 {"CornflowerBlue" , PALETTERGB (100,149,237)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
924 {"dark slate blue" , PALETTERGB ( 72, 61,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
925 {"DarkSlateBlue" , PALETTERGB ( 72, 61,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
926 {"slate blue" , PALETTERGB (106, 90,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
927 {"SlateBlue" , PALETTERGB (106, 90,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
928 {"medium slate blue" , PALETTERGB (123,104,238)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
929 {"MediumSlateBlue" , PALETTERGB (123,104,238)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
930 {"light slate blue" , PALETTERGB (132,112,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
931 {"LightSlateBlue" , PALETTERGB (132,112,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
932 {"medium blue" , PALETTERGB ( 0, 0,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
933 {"MediumBlue" , PALETTERGB ( 0, 0,205)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
934 {"royal blue" , PALETTERGB ( 65,105,225)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
935 {"RoyalBlue" , PALETTERGB ( 65,105,225)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
936 {"blue" , PALETTERGB ( 0, 0,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
937 {"dodger blue" , PALETTERGB ( 30,144,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
938 {"DodgerBlue" , PALETTERGB ( 30,144,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
939 {"deep sky blue" , PALETTERGB ( 0,191,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
940 {"DeepSkyBlue" , PALETTERGB ( 0,191,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
941 {"sky blue" , PALETTERGB (135,206,235)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
942 {"SkyBlue" , PALETTERGB (135,206,235)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
943 {"light sky blue" , PALETTERGB (135,206,250)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
944 {"LightSkyBlue" , PALETTERGB (135,206,250)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
945 {"steel blue" , PALETTERGB ( 70,130,180)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
946 {"SteelBlue" , PALETTERGB ( 70,130,180)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
947 {"light steel blue" , PALETTERGB (176,196,222)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
948 {"LightSteelBlue" , PALETTERGB (176,196,222)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
949 {"light blue" , PALETTERGB (173,216,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
950 {"LightBlue" , PALETTERGB (173,216,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
951 {"powder blue" , PALETTERGB (176,224,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
952 {"PowderBlue" , PALETTERGB (176,224,230)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
953 {"pale turquoise" , PALETTERGB (175,238,238)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
954 {"PaleTurquoise" , PALETTERGB (175,238,238)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
955 {"dark turquoise" , PALETTERGB ( 0,206,209)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
956 {"DarkTurquoise" , PALETTERGB ( 0,206,209)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
957 {"medium turquoise" , PALETTERGB ( 72,209,204)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
958 {"MediumTurquoise" , PALETTERGB ( 72,209,204)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
959 {"turquoise" , PALETTERGB ( 64,224,208)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
960 {"cyan" , PALETTERGB ( 0,255,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
961 {"light cyan" , PALETTERGB (224,255,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
962 {"LightCyan" , PALETTERGB (224,255,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
963 {"cadet blue" , PALETTERGB ( 95,158,160)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
964 {"CadetBlue" , PALETTERGB ( 95,158,160)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
965 {"medium aquamarine" , PALETTERGB (102,205,170)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
966 {"MediumAquamarine" , PALETTERGB (102,205,170)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
967 {"aquamarine" , PALETTERGB (127,255,212)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
968 {"dark green" , PALETTERGB ( 0,100, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
969 {"DarkGreen" , PALETTERGB ( 0,100, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
970 {"dark olive green" , PALETTERGB ( 85,107, 47)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
971 {"DarkOliveGreen" , PALETTERGB ( 85,107, 47)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
972 {"dark sea green" , PALETTERGB (143,188,143)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
973 {"DarkSeaGreen" , PALETTERGB (143,188,143)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
974 {"sea green" , PALETTERGB ( 46,139, 87)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
975 {"SeaGreen" , PALETTERGB ( 46,139, 87)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
976 {"medium sea green" , PALETTERGB ( 60,179,113)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
977 {"MediumSeaGreen" , PALETTERGB ( 60,179,113)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
978 {"light sea green" , PALETTERGB ( 32,178,170)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
979 {"LightSeaGreen" , PALETTERGB ( 32,178,170)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
980 {"pale green" , PALETTERGB (152,251,152)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
981 {"PaleGreen" , PALETTERGB (152,251,152)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
982 {"spring green" , PALETTERGB ( 0,255,127)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
983 {"SpringGreen" , PALETTERGB ( 0,255,127)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
984 {"lawn green" , PALETTERGB (124,252, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
985 {"LawnGreen" , PALETTERGB (124,252, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
986 {"green" , PALETTERGB ( 0,255, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
987 {"chartreuse" , PALETTERGB (127,255, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
988 {"medium spring green" , PALETTERGB ( 0,250,154)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
989 {"MediumSpringGreen" , PALETTERGB ( 0,250,154)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
990 {"green yellow" , PALETTERGB (173,255, 47)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
991 {"GreenYellow" , PALETTERGB (173,255, 47)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
992 {"lime green" , PALETTERGB ( 50,205, 50)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
993 {"LimeGreen" , PALETTERGB ( 50,205, 50)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
994 {"yellow green" , PALETTERGB (154,205, 50)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
995 {"YellowGreen" , PALETTERGB (154,205, 50)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
996 {"forest green" , PALETTERGB ( 34,139, 34)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
997 {"ForestGreen" , PALETTERGB ( 34,139, 34)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
998 {"olive drab" , PALETTERGB (107,142, 35)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
999 {"OliveDrab" , PALETTERGB (107,142, 35)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1000 {"dark khaki" , PALETTERGB (189,183,107)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1001 {"DarkKhaki" , PALETTERGB (189,183,107)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1002 {"khaki" , PALETTERGB (240,230,140)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1003 {"pale goldenrod" , PALETTERGB (238,232,170)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1004 {"PaleGoldenrod" , PALETTERGB (238,232,170)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1005 {"light goldenrod yellow" , PALETTERGB (250,250,210)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1006 {"LightGoldenrodYellow" , PALETTERGB (250,250,210)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1007 {"light yellow" , PALETTERGB (255,255,224)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1008 {"LightYellow" , PALETTERGB (255,255,224)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1009 {"yellow" , PALETTERGB (255,255, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1010 {"gold" , PALETTERGB (255,215, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1011 {"light goldenrod" , PALETTERGB (238,221,130)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1012 {"LightGoldenrod" , PALETTERGB (238,221,130)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1013 {"goldenrod" , PALETTERGB (218,165, 32)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1014 {"dark goldenrod" , PALETTERGB (184,134, 11)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1015 {"DarkGoldenrod" , PALETTERGB (184,134, 11)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1016 {"rosy brown" , PALETTERGB (188,143,143)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1017 {"RosyBrown" , PALETTERGB (188,143,143)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1018 {"indian red" , PALETTERGB (205, 92, 92)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1019 {"IndianRed" , PALETTERGB (205, 92, 92)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1020 {"saddle brown" , PALETTERGB (139, 69, 19)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1021 {"SaddleBrown" , PALETTERGB (139, 69, 19)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1022 {"sienna" , PALETTERGB (160, 82, 45)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1023 {"peru" , PALETTERGB (205,133, 63)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1024 {"burlywood" , PALETTERGB (222,184,135)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1025 {"beige" , PALETTERGB (245,245,220)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1026 {"wheat" , PALETTERGB (245,222,179)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1027 {"sandy brown" , PALETTERGB (244,164, 96)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1028 {"SandyBrown" , PALETTERGB (244,164, 96)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1029 {"tan" , PALETTERGB (210,180,140)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1030 {"chocolate" , PALETTERGB (210,105, 30)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1031 {"firebrick" , PALETTERGB (178,34, 34)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1032 {"brown" , PALETTERGB (165,42, 42)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1033 {"dark salmon" , PALETTERGB (233,150,122)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1034 {"DarkSalmon" , PALETTERGB (233,150,122)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1035 {"salmon" , PALETTERGB (250,128,114)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1036 {"light salmon" , PALETTERGB (255,160,122)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1037 {"LightSalmon" , PALETTERGB (255,160,122)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1038 {"orange" , PALETTERGB (255,165, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1039 {"dark orange" , PALETTERGB (255,140, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1040 {"DarkOrange" , PALETTERGB (255,140, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1041 {"coral" , PALETTERGB (255,127, 80)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1042 {"light coral" , PALETTERGB (240,128,128)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1043 {"LightCoral" , PALETTERGB (240,128,128)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1044 {"tomato" , PALETTERGB (255, 99, 71)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1045 {"orange red" , PALETTERGB (255, 69, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1046 {"OrangeRed" , PALETTERGB (255, 69, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1047 {"red" , PALETTERGB (255, 0, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1048 {"hot pink" , PALETTERGB (255,105,180)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1049 {"HotPink" , PALETTERGB (255,105,180)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1050 {"deep pink" , PALETTERGB (255, 20,147)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1051 {"DeepPink" , PALETTERGB (255, 20,147)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1052 {"pink" , PALETTERGB (255,192,203)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1053 {"light pink" , PALETTERGB (255,182,193)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1054 {"LightPink" , PALETTERGB (255,182,193)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1055 {"pale violet red" , PALETTERGB (219,112,147)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1056 {"PaleVioletRed" , PALETTERGB (219,112,147)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1057 {"maroon" , PALETTERGB (176, 48, 96)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1058 {"medium violet red" , PALETTERGB (199, 21,133)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1059 {"MediumVioletRed" , PALETTERGB (199, 21,133)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1060 {"violet red" , PALETTERGB (208, 32,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1061 {"VioletRed" , PALETTERGB (208, 32,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1062 {"magenta" , PALETTERGB (255, 0,255)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1063 {"violet" , PALETTERGB (238,130,238)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1064 {"plum" , PALETTERGB (221,160,221)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1065 {"orchid" , PALETTERGB (218,112,214)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1066 {"medium orchid" , PALETTERGB (186, 85,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1067 {"MediumOrchid" , PALETTERGB (186, 85,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1068 {"dark orchid" , PALETTERGB (153, 50,204)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1069 {"DarkOrchid" , PALETTERGB (153, 50,204)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1070 {"dark violet" , PALETTERGB (148, 0,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1071 {"DarkViolet" , PALETTERGB (148, 0,211)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1072 {"blue violet" , PALETTERGB (138, 43,226)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1073 {"BlueViolet" , PALETTERGB (138, 43,226)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1074 {"purple" , PALETTERGB (160, 32,240)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1075 {"medium purple" , PALETTERGB (147,112,219)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1076 {"MediumPurple" , PALETTERGB (147,112,219)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1077 {"thistle" , PALETTERGB (216,191,216)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1078 {"gray0" , PALETTERGB ( 0, 0, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1079 {"grey0" , PALETTERGB ( 0, 0, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1080 {"dark grey" , PALETTERGB (169,169,169)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1081 {"DarkGrey" , PALETTERGB (169,169,169)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1082 {"dark gray" , PALETTERGB (169,169,169)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1083 {"DarkGray" , PALETTERGB (169,169,169)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1084 {"dark blue" , PALETTERGB ( 0, 0,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1085 {"DarkBlue" , PALETTERGB ( 0, 0,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1086 {"dark cyan" , PALETTERGB ( 0,139,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1087 {"DarkCyan" , PALETTERGB ( 0,139,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1088 {"dark magenta" , PALETTERGB (139, 0,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1089 {"DarkMagenta" , PALETTERGB (139, 0,139)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1090 {"dark red" , PALETTERGB (139, 0, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1091 {"DarkRed" , PALETTERGB (139, 0, 0)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1092 {"light green" , PALETTERGB (144,238,144)}, |
88b23d545848
(win32_color_map): Use PALETTERGB instead of RGB.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14810
diff
changeset
|
1093 {"LightGreen" , PALETTERGB (144,238,144)}, |
13434 | 1094 }; |
1095 | |
1096 DEFUN ("win32-default-color-map", Fwin32_default_color_map, Swin32_default_color_map, | |
1097 0, 0, 0, "Return the default color map.") | |
1098 () | |
1099 { | |
1100 int i; | |
1101 colormap_t *pc = win32_color_map; | |
1102 Lisp_Object cmap; | |
1103 | |
1104 BLOCK_INPUT; | |
1105 | |
1106 cmap = Qnil; | |
1107 | |
1108 for (i = 0; i < sizeof (win32_color_map) / sizeof (win32_color_map[0]); | |
1109 pc++, i++) | |
1110 cmap = Fcons (Fcons (build_string (pc->name), | |
1111 make_number (pc->colorref)), | |
1112 cmap); | |
1113 | |
1114 UNBLOCK_INPUT; | |
1115 | |
1116 return (cmap); | |
1117 } | |
14353 | 1118 #endif |
13434 | 1119 |
1120 Lisp_Object | |
1121 win32_to_x_color (rgb) | |
1122 Lisp_Object rgb; | |
1123 { | |
1124 Lisp_Object color; | |
1125 | |
1126 CHECK_NUMBER (rgb, 0); | |
1127 | |
1128 BLOCK_INPUT; | |
1129 | |
1130 color = Frassq (rgb, Vwin32_color_map); | |
1131 | |
1132 UNBLOCK_INPUT; | |
1133 | |
1134 if (!NILP (color)) | |
1135 return (Fcar (color)); | |
1136 else | |
1137 return Qnil; | |
1138 } | |
1139 | |
1140 COLORREF | |
1141 x_to_win32_color (colorname) | |
1142 char * colorname; | |
1143 { | |
1144 register Lisp_Object tail, ret = Qnil; | |
1145 | |
1146 BLOCK_INPUT; | |
1147 | |
1148 for (tail = Vwin32_color_map; !NILP (tail); tail = Fcdr (tail)) | |
1149 { | |
1150 register Lisp_Object elt, tem; | |
1151 | |
1152 elt = Fcar (tail); | |
1153 if (!CONSP (elt)) continue; | |
1154 | |
1155 tem = Fcar (elt); | |
1156 | |
1157 if (lstrcmpi (XSTRING (tem)->data, colorname) == 0) | |
1158 { | |
1159 ret = XUINT(Fcdr (elt)); | |
1160 break; | |
1161 } | |
1162 | |
1163 QUIT; | |
1164 } | |
1165 | |
1166 UNBLOCK_INPUT; | |
1167 | |
1168 return ret; | |
1169 } | |
1170 | |
1171 /* Decide if color named COLOR is valid for the display associated with | |
1172 the selected frame; if so, return the rgb values in COLOR_DEF. | |
1173 If ALLOC is nonzero, allocate a new colormap cell. */ | |
1174 | |
1175 int | |
1176 defined_color (f, color, color_def, alloc) | |
1177 FRAME_PTR f; | |
1178 char *color; | |
1179 COLORREF *color_def; | |
1180 int alloc; | |
1181 { | |
1182 register Lisp_Object tem; | |
14353 | 1183 |
13434 | 1184 tem = x_to_win32_color (color); |
14353 | 1185 |
13434 | 1186 if (!NILP (tem)) |
1187 { | |
14353 | 1188 *color_def = XUINT (tem); |
13434 | 1189 return 1; |
14353 | 1190 } |
13434 | 1191 else |
14353 | 1192 { |
1193 return 0; | |
1194 } | |
13434 | 1195 } |
1196 | |
1197 /* Given a string ARG naming a color, compute a pixel value from it | |
1198 suitable for screen F. | |
1199 If F is not a color screen, return DEF (default) regardless of what | |
1200 ARG says. */ | |
1201 | |
1202 int | |
1203 x_decode_color (f, arg, def) | |
1204 FRAME_PTR f; | |
1205 Lisp_Object arg; | |
1206 int def; | |
1207 { | |
1208 COLORREF cdef; | |
1209 | |
1210 CHECK_STRING (arg, 0); | |
1211 | |
1212 if (strcmp (XSTRING (arg)->data, "black") == 0) | |
1213 return BLACK_PIX_DEFAULT (f); | |
1214 else if (strcmp (XSTRING (arg)->data, "white") == 0) | |
1215 return WHITE_PIX_DEFAULT (f); | |
1216 | |
1217 if ((FRAME_WIN32_DISPLAY_INFO (f)->n_planes * FRAME_WIN32_DISPLAY_INFO (f)->n_cbits) == 1) | |
1218 return def; | |
1219 | |
1220 /* defined_color is responsible for coping with failures | |
1221 by looking for a near-miss. */ | |
1222 if (defined_color (f, XSTRING (arg)->data, &cdef, 1)) | |
1223 return cdef; | |
1224 | |
1225 /* defined_color failed; return an ultimate default. */ | |
1226 return def; | |
1227 } | |
1228 | |
1229 /* Functions called only from `x_set_frame_param' | |
1230 to set individual parameters. | |
1231 | |
1232 If FRAME_WIN32_WINDOW (f) is 0, | |
1233 the frame is being created and its window does not exist yet. | |
1234 In that case, just record the parameter's new value | |
1235 in the standard place; do not attempt to change the window. */ | |
1236 | |
1237 void | |
1238 x_set_foreground_color (f, arg, oldval) | |
1239 struct frame *f; | |
1240 Lisp_Object arg, oldval; | |
1241 { | |
1242 f->output_data.win32->foreground_pixel | |
1243 = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); | |
1244 if (FRAME_WIN32_WINDOW (f) != 0) | |
1245 { | |
1246 recompute_basic_faces (f); | |
1247 if (FRAME_VISIBLE_P (f)) | |
1248 redraw_frame (f); | |
1249 } | |
1250 } | |
1251 | |
1252 void | |
1253 x_set_background_color (f, arg, oldval) | |
1254 struct frame *f; | |
1255 Lisp_Object arg, oldval; | |
1256 { | |
1257 Pixmap temp; | |
1258 int mask; | |
1259 | |
1260 f->output_data.win32->background_pixel | |
1261 = x_decode_color (f, arg, WHITE_PIX_DEFAULT (f)); | |
1262 | |
1263 if (FRAME_WIN32_WINDOW (f) != 0) | |
1264 { | |
1265 SetWindowLong (FRAME_WIN32_WINDOW (f), WND_BACKGROUND_INDEX, f->output_data.win32->background_pixel); | |
1266 | |
1267 recompute_basic_faces (f); | |
1268 | |
1269 if (FRAME_VISIBLE_P (f)) | |
1270 redraw_frame (f); | |
1271 } | |
1272 } | |
1273 | |
1274 void | |
1275 x_set_mouse_color (f, arg, oldval) | |
1276 struct frame *f; | |
1277 Lisp_Object arg, oldval; | |
1278 { | |
1279 #if 0 | |
1280 Cursor cursor, nontext_cursor, mode_cursor, cross_cursor; | |
1281 #endif | |
1282 int mask_color; | |
1283 | |
1284 if (!EQ (Qnil, arg)) | |
1285 f->output_data.win32->mouse_pixel | |
1286 = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); | |
1287 mask_color = f->output_data.win32->background_pixel; | |
1288 /* No invisible pointers. */ | |
1289 if (mask_color == f->output_data.win32->mouse_pixel | |
1290 && mask_color == f->output_data.win32->background_pixel) | |
1291 f->output_data.win32->mouse_pixel = f->output_data.win32->foreground_pixel; | |
1292 | |
1293 #if 0 | |
1294 BLOCK_INPUT; | |
1295 | |
1296 /* It's not okay to crash if the user selects a screwy cursor. */ | |
1297 x_catch_errors (FRAME_WIN32_DISPLAY (f)); | |
1298 | |
1299 if (!EQ (Qnil, Vx_pointer_shape)) | |
1300 { | |
1301 CHECK_NUMBER (Vx_pointer_shape, 0); | |
1302 cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), XINT (Vx_pointer_shape)); | |
1303 } | |
1304 else | |
1305 cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), XC_xterm); | |
1306 x_check_errors (FRAME_WIN32_DISPLAY (f), "bad text pointer cursor: %s"); | |
1307 | |
1308 if (!EQ (Qnil, Vx_nontext_pointer_shape)) | |
1309 { | |
1310 CHECK_NUMBER (Vx_nontext_pointer_shape, 0); | |
1311 nontext_cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), | |
1312 XINT (Vx_nontext_pointer_shape)); | |
1313 } | |
1314 else | |
1315 nontext_cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), XC_left_ptr); | |
1316 x_check_errors (FRAME_WIN32_DISPLAY (f), "bad nontext pointer cursor: %s"); | |
1317 | |
1318 if (!EQ (Qnil, Vx_mode_pointer_shape)) | |
1319 { | |
1320 CHECK_NUMBER (Vx_mode_pointer_shape, 0); | |
1321 mode_cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), | |
1322 XINT (Vx_mode_pointer_shape)); | |
1323 } | |
1324 else | |
1325 mode_cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), XC_xterm); | |
1326 x_check_errors (FRAME_WIN32_DISPLAY (f), "bad modeline pointer cursor: %s"); | |
1327 | |
1328 if (!EQ (Qnil, Vx_sensitive_text_pointer_shape)) | |
1329 { | |
1330 CHECK_NUMBER (Vx_sensitive_text_pointer_shape, 0); | |
1331 cross_cursor | |
1332 = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), | |
1333 XINT (Vx_sensitive_text_pointer_shape)); | |
1334 } | |
1335 else | |
1336 cross_cursor = XCreateFontCursor (FRAME_WIN32_DISPLAY (f), XC_crosshair); | |
1337 | |
1338 /* Check and report errors with the above calls. */ | |
1339 x_check_errors (FRAME_WIN32_DISPLAY (f), "can't set cursor shape: %s"); | |
1340 x_uncatch_errors (FRAME_WIN32_DISPLAY (f)); | |
1341 | |
1342 { | |
1343 XColor fore_color, back_color; | |
1344 | |
1345 fore_color.pixel = f->output_data.win32->mouse_pixel; | |
1346 back_color.pixel = mask_color; | |
1347 XQueryColor (FRAME_WIN32_DISPLAY (f), | |
1348 DefaultColormap (FRAME_WIN32_DISPLAY (f), | |
1349 DefaultScreen (FRAME_WIN32_DISPLAY (f))), | |
1350 &fore_color); | |
1351 XQueryColor (FRAME_WIN32_DISPLAY (f), | |
1352 DefaultColormap (FRAME_WIN32_DISPLAY (f), | |
1353 DefaultScreen (FRAME_WIN32_DISPLAY (f))), | |
1354 &back_color); | |
1355 XRecolorCursor (FRAME_WIN32_DISPLAY (f), cursor, | |
1356 &fore_color, &back_color); | |
1357 XRecolorCursor (FRAME_WIN32_DISPLAY (f), nontext_cursor, | |
1358 &fore_color, &back_color); | |
1359 XRecolorCursor (FRAME_WIN32_DISPLAY (f), mode_cursor, | |
1360 &fore_color, &back_color); | |
1361 XRecolorCursor (FRAME_WIN32_DISPLAY (f), cross_cursor, | |
1362 &fore_color, &back_color); | |
1363 } | |
1364 | |
1365 if (FRAME_WIN32_WINDOW (f) != 0) | |
1366 { | |
1367 XDefineCursor (FRAME_WIN32_DISPLAY (f), FRAME_WIN32_WINDOW (f), cursor); | |
1368 } | |
1369 | |
1370 if (cursor != f->output_data.win32->text_cursor && f->output_data.win32->text_cursor != 0) | |
1371 XFreeCursor (FRAME_WIN32_DISPLAY (f), f->output_data.win32->text_cursor); | |
1372 f->output_data.win32->text_cursor = cursor; | |
1373 | |
1374 if (nontext_cursor != f->output_data.win32->nontext_cursor | |
1375 && f->output_data.win32->nontext_cursor != 0) | |
1376 XFreeCursor (FRAME_WIN32_DISPLAY (f), f->output_data.win32->nontext_cursor); | |
1377 f->output_data.win32->nontext_cursor = nontext_cursor; | |
1378 | |
1379 if (mode_cursor != f->output_data.win32->modeline_cursor | |
1380 && f->output_data.win32->modeline_cursor != 0) | |
1381 XFreeCursor (FRAME_WIN32_DISPLAY (f), f->output_data.win32->modeline_cursor); | |
1382 f->output_data.win32->modeline_cursor = mode_cursor; | |
1383 if (cross_cursor != f->output_data.win32->cross_cursor | |
1384 && f->output_data.win32->cross_cursor != 0) | |
1385 XFreeCursor (FRAME_WIN32_DISPLAY (f), f->output_data.win32->cross_cursor); | |
1386 f->output_data.win32->cross_cursor = cross_cursor; | |
1387 | |
1388 XFlush (FRAME_WIN32_DISPLAY (f)); | |
1389 UNBLOCK_INPUT; | |
1390 #endif | |
1391 } | |
1392 | |
1393 void | |
1394 x_set_cursor_color (f, arg, oldval) | |
1395 struct frame *f; | |
1396 Lisp_Object arg, oldval; | |
1397 { | |
1398 unsigned long fore_pixel; | |
1399 | |
1400 if (!EQ (Vx_cursor_fore_pixel, Qnil)) | |
1401 fore_pixel = x_decode_color (f, Vx_cursor_fore_pixel, | |
1402 WHITE_PIX_DEFAULT (f)); | |
1403 else | |
1404 fore_pixel = f->output_data.win32->background_pixel; | |
1405 f->output_data.win32->cursor_pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); | |
1406 | |
1407 /* Make sure that the cursor color differs from the background color. */ | |
1408 if (f->output_data.win32->cursor_pixel == f->output_data.win32->background_pixel) | |
1409 { | |
1410 f->output_data.win32->cursor_pixel = f->output_data.win32->mouse_pixel; | |
1411 if (f->output_data.win32->cursor_pixel == fore_pixel) | |
1412 fore_pixel = f->output_data.win32->background_pixel; | |
1413 } | |
1414 f->output_data.win32->cursor_foreground_pixel = fore_pixel; | |
1415 | |
1416 if (FRAME_WIN32_WINDOW (f) != 0) | |
1417 { | |
1418 if (FRAME_VISIBLE_P (f)) | |
1419 { | |
1420 x_display_cursor (f, 0); | |
1421 x_display_cursor (f, 1); | |
1422 } | |
1423 } | |
1424 } | |
1425 | |
1426 /* Set the border-color of frame F to value described by ARG. | |
1427 ARG can be a string naming a color. | |
1428 The border-color is used for the border that is drawn by the server. | |
1429 Note that this does not fully take effect if done before | |
1430 F has a window; it must be redone when the window is created. */ | |
1431 | |
1432 void | |
1433 x_set_border_color (f, arg, oldval) | |
1434 struct frame *f; | |
1435 Lisp_Object arg, oldval; | |
1436 { | |
1437 unsigned char *str; | |
1438 int pix; | |
1439 | |
1440 CHECK_STRING (arg, 0); | |
1441 str = XSTRING (arg)->data; | |
1442 | |
1443 pix = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); | |
1444 | |
1445 x_set_border_pixel (f, pix); | |
1446 } | |
1447 | |
1448 /* Set the border-color of frame F to pixel value PIX. | |
1449 Note that this does not fully take effect if done before | |
1450 F has an window. */ | |
1451 | |
1452 x_set_border_pixel (f, pix) | |
1453 struct frame *f; | |
1454 int pix; | |
1455 { | |
1456 f->output_data.win32->border_pixel = pix; | |
1457 | |
1458 if (FRAME_WIN32_WINDOW (f) != 0 && f->output_data.win32->border_width > 0) | |
1459 { | |
1460 if (FRAME_VISIBLE_P (f)) | |
1461 redraw_frame (f); | |
1462 } | |
1463 } | |
1464 | |
1465 void | |
1466 x_set_cursor_type (f, arg, oldval) | |
1467 FRAME_PTR f; | |
1468 Lisp_Object arg, oldval; | |
1469 { | |
1470 if (EQ (arg, Qbar)) | |
1471 { | |
1472 FRAME_DESIRED_CURSOR (f) = bar_cursor; | |
1473 f->output_data.win32->cursor_width = 2; | |
1474 } | |
1475 else if (CONSP (arg) && EQ (XCONS (arg)->car, Qbar) | |
1476 && INTEGERP (XCONS (arg)->cdr)) | |
1477 { | |
1478 FRAME_DESIRED_CURSOR (f) = bar_cursor; | |
1479 f->output_data.win32->cursor_width = XINT (XCONS (arg)->cdr); | |
1480 } | |
1481 else | |
1482 /* Treat anything unknown as "box cursor". | |
1483 It was bad to signal an error; people have trouble fixing | |
1484 .Xdefaults with Emacs, when it has something bad in it. */ | |
1485 FRAME_DESIRED_CURSOR (f) = filled_box_cursor; | |
1486 | |
1487 /* Make sure the cursor gets redrawn. This is overkill, but how | |
1488 often do people change cursor types? */ | |
1489 update_mode_lines++; | |
1490 } | |
1491 | |
1492 void | |
1493 x_set_icon_type (f, arg, oldval) | |
1494 struct frame *f; | |
1495 Lisp_Object arg, oldval; | |
1496 { | |
1497 #if 0 | |
1498 Lisp_Object tem; | |
1499 int result; | |
1500 | |
1501 if (STRINGP (arg)) | |
1502 { | |
1503 if (STRINGP (oldval) && EQ (Fstring_equal (oldval, arg), Qt)) | |
1504 return; | |
1505 } | |
1506 else if (!STRINGP (oldval) && EQ (oldval, Qnil) == EQ (arg, Qnil)) | |
1507 return; | |
1508 | |
1509 BLOCK_INPUT; | |
1510 if (NILP (arg)) | |
1511 result = x_text_icon (f, | |
1512 (char *) XSTRING ((!NILP (f->icon_name) | |
1513 ? f->icon_name | |
1514 : f->name))->data); | |
1515 else | |
1516 result = x_bitmap_icon (f, arg); | |
1517 | |
1518 if (result) | |
1519 { | |
1520 UNBLOCK_INPUT; | |
1521 error ("No icon window available"); | |
1522 } | |
1523 | |
1524 /* If the window was unmapped (and its icon was mapped), | |
1525 the new icon is not mapped, so map the window in its stead. */ | |
1526 if (FRAME_VISIBLE_P (f)) | |
1527 { | |
1528 #ifdef USE_X_TOOLKIT | |
1529 XtPopup (f->output_data.win32->widget, XtGrabNone); | |
1530 #endif | |
1531 XMapWindow (FRAME_WIN32_DISPLAY (f), FRAME_WIN32_WINDOW (f)); | |
1532 } | |
1533 | |
1534 XFlush (FRAME_WIN32_DISPLAY (f)); | |
1535 UNBLOCK_INPUT; | |
1536 #endif | |
1537 } | |
1538 | |
1539 /* Return non-nil if frame F wants a bitmap icon. */ | |
1540 | |
1541 Lisp_Object | |
1542 x_icon_type (f) | |
1543 FRAME_PTR f; | |
1544 { | |
1545 Lisp_Object tem; | |
1546 | |
1547 tem = assq_no_quit (Qicon_type, f->param_alist); | |
1548 if (CONSP (tem)) | |
1549 return XCONS (tem)->cdr; | |
1550 else | |
1551 return Qnil; | |
1552 } | |
1553 | |
1554 void | |
1555 x_set_icon_name (f, arg, oldval) | |
1556 struct frame *f; | |
1557 Lisp_Object arg, oldval; | |
1558 { | |
1559 Lisp_Object tem; | |
1560 int result; | |
1561 | |
1562 if (STRINGP (arg)) | |
1563 { | |
1564 if (STRINGP (oldval) && EQ (Fstring_equal (oldval, arg), Qt)) | |
1565 return; | |
1566 } | |
1567 else if (!STRINGP (oldval) && EQ (oldval, Qnil) == EQ (arg, Qnil)) | |
1568 return; | |
1569 | |
1570 f->icon_name = arg; | |
1571 | |
1572 #if 0 | |
1573 if (f->output_data.win32->icon_bitmap != 0) | |
1574 return; | |
1575 | |
1576 BLOCK_INPUT; | |
1577 | |
1578 result = x_text_icon (f, | |
1579 (char *) XSTRING ((!NILP (f->icon_name) | |
1580 ? f->icon_name | |
1581 : f->name))->data); | |
1582 | |
1583 if (result) | |
1584 { | |
1585 UNBLOCK_INPUT; | |
1586 error ("No icon window available"); | |
1587 } | |
1588 | |
1589 /* If the window was unmapped (and its icon was mapped), | |
1590 the new icon is not mapped, so map the window in its stead. */ | |
1591 if (FRAME_VISIBLE_P (f)) | |
1592 { | |
1593 #ifdef USE_X_TOOLKIT | |
1594 XtPopup (f->output_data.win32->widget, XtGrabNone); | |
1595 #endif | |
1596 XMapWindow (FRAME_WIN32_DISPLAY (f), FRAME_WIN32_WINDOW (f)); | |
1597 } | |
1598 | |
1599 XFlush (FRAME_WIN32_DISPLAY (f)); | |
1600 UNBLOCK_INPUT; | |
1601 #endif | |
1602 } | |
1603 | |
1604 extern Lisp_Object x_new_font (); | |
1605 | |
1606 void | |
1607 x_set_font (f, arg, oldval) | |
1608 struct frame *f; | |
1609 Lisp_Object arg, oldval; | |
1610 { | |
1611 Lisp_Object result; | |
1612 | |
1613 CHECK_STRING (arg, 1); | |
1614 | |
1615 BLOCK_INPUT; | |
1616 result = x_new_font (f, XSTRING (arg)->data); | |
1617 UNBLOCK_INPUT; | |
1618 | |
1619 if (EQ (result, Qnil)) | |
1620 error ("Font \"%s\" is not defined", XSTRING (arg)->data); | |
1621 else if (EQ (result, Qt)) | |
1622 error ("the characters of the given font have varying widths"); | |
1623 else if (STRINGP (result)) | |
1624 { | |
1625 recompute_basic_faces (f); | |
1626 store_frame_param (f, Qfont, result); | |
1627 } | |
1628 else | |
1629 abort (); | |
1630 } | |
1631 | |
1632 void | |
1633 x_set_border_width (f, arg, oldval) | |
1634 struct frame *f; | |
1635 Lisp_Object arg, oldval; | |
1636 { | |
1637 CHECK_NUMBER (arg, 0); | |
1638 | |
1639 if (XINT (arg) == f->output_data.win32->border_width) | |
1640 return; | |
1641 | |
1642 if (FRAME_WIN32_WINDOW (f) != 0) | |
1643 error ("Cannot change the border width of a window"); | |
1644 | |
1645 f->output_data.win32->border_width = XINT (arg); | |
1646 } | |
1647 | |
1648 void | |
1649 x_set_internal_border_width (f, arg, oldval) | |
1650 struct frame *f; | |
1651 Lisp_Object arg, oldval; | |
1652 { | |
1653 int mask; | |
1654 int old = f->output_data.win32->internal_border_width; | |
1655 | |
1656 CHECK_NUMBER (arg, 0); | |
1657 f->output_data.win32->internal_border_width = XINT (arg); | |
1658 if (f->output_data.win32->internal_border_width < 0) | |
1659 f->output_data.win32->internal_border_width = 0; | |
1660 | |
1661 if (f->output_data.win32->internal_border_width == old) | |
1662 return; | |
1663 | |
1664 if (FRAME_WIN32_WINDOW (f) != 0) | |
1665 { | |
1666 BLOCK_INPUT; | |
1667 x_set_window_size (f, 0, f->width, f->height); | |
1668 UNBLOCK_INPUT; | |
1669 SET_FRAME_GARBAGED (f); | |
1670 } | |
1671 } | |
1672 | |
1673 void | |
1674 x_set_visibility (f, value, oldval) | |
1675 struct frame *f; | |
1676 Lisp_Object value, oldval; | |
1677 { | |
1678 Lisp_Object frame; | |
1679 XSETFRAME (frame, f); | |
1680 | |
1681 if (NILP (value)) | |
1682 Fmake_frame_invisible (frame, Qt); | |
1683 else if (EQ (value, Qicon)) | |
1684 Ficonify_frame (frame); | |
1685 else | |
1686 Fmake_frame_visible (frame); | |
1687 } | |
1688 | |
1689 void | |
1690 x_set_menu_bar_lines (f, value, oldval) | |
1691 struct frame *f; | |
1692 Lisp_Object value, oldval; | |
1693 { | |
1694 int nlines; | |
1695 int olines = FRAME_MENU_BAR_LINES (f); | |
1696 | |
1697 /* Right now, menu bars don't work properly in minibuf-only frames; | |
1698 most of the commands try to apply themselves to the minibuffer | |
1699 frame itslef, and get an error because you can't switch buffers | |
1700 in or split the minibuffer window. */ | |
1701 if (FRAME_MINIBUF_ONLY_P (f)) | |
1702 return; | |
1703 | |
1704 if (INTEGERP (value)) | |
1705 nlines = XINT (value); | |
1706 else | |
1707 nlines = 0; | |
1708 | |
1709 FRAME_MENU_BAR_LINES (f) = 0; | |
1710 if (nlines) | |
1711 FRAME_EXTERNAL_MENU_BAR (f) = 1; | |
1712 else | |
1713 { | |
1714 if (FRAME_EXTERNAL_MENU_BAR (f) == 1) | |
1715 free_frame_menubar (f); | |
1716 FRAME_EXTERNAL_MENU_BAR (f) = 0; | |
1717 } | |
1718 } | |
1719 | |
1720 /* Change the name of frame F to NAME. If NAME is nil, set F's name to | |
1721 win32_id_name. | |
1722 | |
1723 If EXPLICIT is non-zero, that indicates that lisp code is setting the | |
1724 name; if NAME is a string, set F's name to NAME and set | |
1725 F->explicit_name; if NAME is Qnil, then clear F->explicit_name. | |
1726 | |
1727 If EXPLICIT is zero, that indicates that Emacs redisplay code is | |
1728 suggesting a new name, which lisp code should override; if | |
1729 F->explicit_name is set, ignore the new name; otherwise, set it. */ | |
1730 | |
1731 void | |
1732 x_set_name (f, name, explicit) | |
1733 struct frame *f; | |
1734 Lisp_Object name; | |
1735 int explicit; | |
1736 { | |
1737 /* Make sure that requests from lisp code override requests from | |
1738 Emacs redisplay code. */ | |
1739 if (explicit) | |
1740 { | |
1741 /* If we're switching from explicit to implicit, we had better | |
1742 update the mode lines and thereby update the title. */ | |
1743 if (f->explicit_name && NILP (name)) | |
1744 update_mode_lines = 1; | |
1745 | |
1746 f->explicit_name = ! NILP (name); | |
1747 } | |
1748 else if (f->explicit_name) | |
1749 return; | |
1750 | |
1751 /* If NAME is nil, set the name to the win32_id_name. */ | |
1752 if (NILP (name)) | |
1753 { | |
1754 /* Check for no change needed in this very common case | |
1755 before we do any consing. */ | |
1756 if (!strcmp (FRAME_WIN32_DISPLAY_INFO (f)->win32_id_name, | |
1757 XSTRING (f->name)->data)) | |
1758 return; | |
1759 name = build_string (FRAME_WIN32_DISPLAY_INFO (f)->win32_id_name); | |
1760 } | |
1761 else | |
1762 CHECK_STRING (name, 0); | |
1763 | |
1764 /* Don't change the name if it's already NAME. */ | |
1765 if (! NILP (Fstring_equal (name, f->name))) | |
1766 return; | |
1767 | |
1768 if (FRAME_WIN32_WINDOW (f)) | |
1769 { | |
1770 BLOCK_INPUT; | |
1771 SetWindowText(FRAME_WIN32_WINDOW (f), XSTRING (name)->data); | |
1772 UNBLOCK_INPUT; | |
1773 } | |
1774 | |
1775 f->name = name; | |
1776 } | |
1777 | |
1778 /* This function should be called when the user's lisp code has | |
1779 specified a name for the frame; the name will override any set by the | |
1780 redisplay code. */ | |
1781 void | |
1782 x_explicitly_set_name (f, arg, oldval) | |
1783 FRAME_PTR f; | |
1784 Lisp_Object arg, oldval; | |
1785 { | |
1786 x_set_name (f, arg, 1); | |
1787 } | |
1788 | |
1789 /* This function should be called by Emacs redisplay code to set the | |
1790 name; names set this way will never override names set by the user's | |
1791 lisp code. */ | |
1792 void | |
1793 x_implicitly_set_name (f, arg, oldval) | |
1794 FRAME_PTR f; | |
1795 Lisp_Object arg, oldval; | |
1796 { | |
1797 x_set_name (f, arg, 0); | |
1798 } | |
1799 | |
1800 void | |
1801 x_set_autoraise (f, arg, oldval) | |
1802 struct frame *f; | |
1803 Lisp_Object arg, oldval; | |
1804 { | |
1805 f->auto_raise = !EQ (Qnil, arg); | |
1806 } | |
1807 | |
1808 void | |
1809 x_set_autolower (f, arg, oldval) | |
1810 struct frame *f; | |
1811 Lisp_Object arg, oldval; | |
1812 { | |
1813 f->auto_lower = !EQ (Qnil, arg); | |
1814 } | |
1815 | |
1816 void | |
1817 x_set_unsplittable (f, arg, oldval) | |
1818 struct frame *f; | |
1819 Lisp_Object arg, oldval; | |
1820 { | |
1821 f->no_split = !NILP (arg); | |
1822 } | |
1823 | |
1824 void | |
1825 x_set_vertical_scroll_bars (f, arg, oldval) | |
1826 struct frame *f; | |
1827 Lisp_Object arg, oldval; | |
1828 { | |
1829 if (NILP (arg) != ! FRAME_HAS_VERTICAL_SCROLL_BARS (f)) | |
1830 { | |
1831 FRAME_HAS_VERTICAL_SCROLL_BARS (f) = ! NILP (arg); | |
1832 | |
1833 /* We set this parameter before creating the window for the | |
1834 frame, so we can get the geometry right from the start. | |
1835 However, if the window hasn't been created yet, we shouldn't | |
1836 call x_set_window_size. */ | |
1837 if (FRAME_WIN32_WINDOW (f)) | |
1838 x_set_window_size (f, 0, FRAME_WIDTH (f), FRAME_HEIGHT (f)); | |
1839 } | |
1840 } | |
1841 | |
1842 void | |
1843 x_set_scroll_bar_width (f, arg, oldval) | |
1844 struct frame *f; | |
1845 Lisp_Object arg, oldval; | |
1846 { | |
1847 if (NILP (arg)) | |
1848 { | |
1849 FRAME_SCROLL_BAR_PIXEL_WIDTH (f) = 0; | |
1850 FRAME_SCROLL_BAR_COLS (f) = 2; | |
1851 } | |
1852 else if (INTEGERP (arg) && XINT (arg) > 0 | |
1853 && XFASTINT (arg) != FRAME_SCROLL_BAR_PIXEL_WIDTH (f)) | |
1854 { | |
1855 int wid = FONT_WIDTH (f->output_data.win32->font); | |
1856 FRAME_SCROLL_BAR_PIXEL_WIDTH (f) = XFASTINT (arg); | |
1857 FRAME_SCROLL_BAR_COLS (f) = (XFASTINT (arg) + wid-1) / wid; | |
1858 if (FRAME_WIN32_WINDOW (f)) | |
1859 x_set_window_size (f, 0, FRAME_WIDTH (f), FRAME_HEIGHT (f)); | |
1860 } | |
1861 } | |
1862 | |
1863 /* Subroutines of creating an frame. */ | |
1864 | |
1865 /* Make sure that Vx_resource_name is set to a reasonable value. | |
1866 Fix it up, or set it to `emacs' if it is too hopeless. */ | |
1867 | |
1868 static void | |
1869 validate_x_resource_name () | |
1870 { | |
1871 int len; | |
1872 /* Number of valid characters in the resource name. */ | |
1873 int good_count = 0; | |
1874 /* Number of invalid characters in the resource name. */ | |
1875 int bad_count = 0; | |
1876 Lisp_Object new; | |
1877 int i; | |
1878 | |
1879 if (STRINGP (Vx_resource_name)) | |
1880 { | |
1881 unsigned char *p = XSTRING (Vx_resource_name)->data; | |
1882 int i; | |
1883 | |
1884 len = XSTRING (Vx_resource_name)->size; | |
1885 | |
1886 /* Only letters, digits, - and _ are valid in resource names. | |
1887 Count the valid characters and count the invalid ones. */ | |
1888 for (i = 0; i < len; i++) | |
1889 { | |
1890 int c = p[i]; | |
1891 if (! ((c >= 'a' && c <= 'z') | |
1892 || (c >= 'A' && c <= 'Z') | |
1893 || (c >= '0' && c <= '9') | |
1894 || c == '-' || c == '_')) | |
1895 bad_count++; | |
1896 else | |
1897 good_count++; | |
1898 } | |
1899 } | |
1900 else | |
1901 /* Not a string => completely invalid. */ | |
1902 bad_count = 5, good_count = 0; | |
1903 | |
1904 /* If name is valid already, return. */ | |
1905 if (bad_count == 0) | |
1906 return; | |
1907 | |
1908 /* If name is entirely invalid, or nearly so, use `emacs'. */ | |
1909 if (good_count == 0 | |
1910 || (good_count == 1 && bad_count > 0)) | |
1911 { | |
1912 Vx_resource_name = build_string ("emacs"); | |
1913 return; | |
1914 } | |
1915 | |
1916 /* Name is partly valid. Copy it and replace the invalid characters | |
1917 with underscores. */ | |
1918 | |
1919 Vx_resource_name = new = Fcopy_sequence (Vx_resource_name); | |
1920 | |
1921 for (i = 0; i < len; i++) | |
1922 { | |
1923 int c = XSTRING (new)->data[i]; | |
1924 if (! ((c >= 'a' && c <= 'z') | |
1925 || (c >= 'A' && c <= 'Z') | |
1926 || (c >= '0' && c <= '9') | |
1927 || c == '-' || c == '_')) | |
1928 XSTRING (new)->data[i] = '_'; | |
1929 } | |
1930 } | |
1931 | |
1932 | |
1933 extern char *x_get_string_resource (); | |
1934 | |
1935 DEFUN ("x-get-resource", Fx_get_resource, Sx_get_resource, 2, 4, 0, | |
1936 "Return the value of ATTRIBUTE, of class CLASS, from the X defaults database.\n\ | |
1937 This uses `INSTANCE.ATTRIBUTE' as the key and `Emacs.CLASS' as the\n\ | |
1938 class, where INSTANCE is the name under which Emacs was invoked, or\n\ | |
1939 the name specified by the `-name' or `-rn' command-line arguments.\n\ | |
1940 \n\ | |
1941 The optional arguments COMPONENT and SUBCLASS add to the key and the\n\ | |
1942 class, respectively. You must specify both of them or neither.\n\ | |
1943 If you specify them, the key is `INSTANCE.COMPONENT.ATTRIBUTE'\n\ | |
1944 and the class is `Emacs.CLASS.SUBCLASS'.") | |
1945 (attribute, class, component, subclass) | |
1946 Lisp_Object attribute, class, component, subclass; | |
1947 { | |
1948 register char *value; | |
1949 char *name_key; | |
1950 char *class_key; | |
1951 | |
1952 CHECK_STRING (attribute, 0); | |
1953 CHECK_STRING (class, 0); | |
1954 | |
1955 if (!NILP (component)) | |
1956 CHECK_STRING (component, 1); | |
1957 if (!NILP (subclass)) | |
1958 CHECK_STRING (subclass, 2); | |
1959 if (NILP (component) != NILP (subclass)) | |
1960 error ("x-get-resource: must specify both COMPONENT and SUBCLASS or neither"); | |
1961 | |
1962 validate_x_resource_name (); | |
1963 | |
1964 /* Allocate space for the components, the dots which separate them, | |
1965 and the final '\0'. Make them big enough for the worst case. */ | |
1966 name_key = (char *) alloca (XSTRING (Vx_resource_name)->size | |
1967 + (STRINGP (component) | |
1968 ? XSTRING (component)->size : 0) | |
1969 + XSTRING (attribute)->size | |
1970 + 3); | |
1971 | |
1972 class_key = (char *) alloca ((sizeof (EMACS_CLASS) - 1) | |
1973 + XSTRING (class)->size | |
1974 + (STRINGP (subclass) | |
1975 ? XSTRING (subclass)->size : 0) | |
1976 + 3); | |
1977 | |
1978 /* Start with emacs.FRAMENAME for the name (the specific one) | |
1979 and with `Emacs' for the class key (the general one). */ | |
1980 strcpy (name_key, XSTRING (Vx_resource_name)->data); | |
1981 strcpy (class_key, EMACS_CLASS); | |
1982 | |
1983 strcat (class_key, "."); | |
1984 strcat (class_key, XSTRING (class)->data); | |
1985 | |
1986 if (!NILP (component)) | |
1987 { | |
1988 strcat (class_key, "."); | |
1989 strcat (class_key, XSTRING (subclass)->data); | |
1990 | |
1991 strcat (name_key, "."); | |
1992 strcat (name_key, XSTRING (component)->data); | |
1993 } | |
1994 | |
1995 strcat (name_key, "."); | |
1996 strcat (name_key, XSTRING (attribute)->data); | |
1997 | |
1998 value = x_get_string_resource (Qnil, | |
1999 name_key, class_key); | |
2000 | |
2001 if (value != (char *) 0) | |
2002 return build_string (value); | |
2003 else | |
2004 return Qnil; | |
2005 } | |
2006 | |
2007 /* Used when C code wants a resource value. */ | |
2008 | |
2009 char * | |
2010 x_get_resource_string (attribute, class) | |
2011 char *attribute, *class; | |
2012 { | |
2013 register char *value; | |
2014 char *name_key; | |
2015 char *class_key; | |
2016 | |
2017 /* Allocate space for the components, the dots which separate them, | |
2018 and the final '\0'. */ | |
2019 name_key = (char *) alloca (XSTRING (Vinvocation_name)->size | |
2020 + strlen (attribute) + 2); | |
2021 class_key = (char *) alloca ((sizeof (EMACS_CLASS) - 1) | |
2022 + strlen (class) + 2); | |
2023 | |
2024 sprintf (name_key, "%s.%s", | |
2025 XSTRING (Vinvocation_name)->data, | |
2026 attribute); | |
2027 sprintf (class_key, "%s.%s", EMACS_CLASS, class); | |
2028 | |
2029 return x_get_string_resource (selected_frame, | |
2030 name_key, class_key); | |
2031 } | |
2032 | |
2033 /* Types we might convert a resource string into. */ | |
2034 enum resource_types | |
2035 { | |
2036 number, boolean, string, symbol | |
2037 }; | |
2038 | |
2039 /* Return the value of parameter PARAM. | |
2040 | |
2041 First search ALIST, then Vdefault_frame_alist, then the X defaults | |
2042 database, using ATTRIBUTE as the attribute name and CLASS as its class. | |
2043 | |
2044 Convert the resource to the type specified by desired_type. | |
2045 | |
2046 If no default is specified, return Qunbound. If you call | |
2047 x_get_arg, make sure you deal with Qunbound in a reasonable way, | |
2048 and don't let it get stored in any Lisp-visible variables! */ | |
2049 | |
2050 static Lisp_Object | |
2051 x_get_arg (alist, param, attribute, class, type) | |
2052 Lisp_Object alist, param; | |
2053 char *attribute; | |
2054 char *class; | |
2055 enum resource_types type; | |
2056 { | |
2057 register Lisp_Object tem; | |
2058 | |
2059 tem = Fassq (param, alist); | |
2060 if (EQ (tem, Qnil)) | |
2061 tem = Fassq (param, Vdefault_frame_alist); | |
2062 if (EQ (tem, Qnil)) | |
2063 { | |
2064 | |
2065 if (attribute) | |
2066 { | |
2067 tem = Fx_get_resource (build_string (attribute), | |
2068 build_string (class), | |
2069 Qnil, Qnil); | |
2070 | |
2071 if (NILP (tem)) | |
2072 return Qunbound; | |
2073 | |
2074 switch (type) | |
2075 { | |
2076 case number: | |
2077 return make_number (atoi (XSTRING (tem)->data)); | |
2078 | |
2079 case boolean: | |
2080 tem = Fdowncase (tem); | |
2081 if (!strcmp (XSTRING (tem)->data, "on") | |
2082 || !strcmp (XSTRING (tem)->data, "true")) | |
2083 return Qt; | |
2084 else | |
2085 return Qnil; | |
2086 | |
2087 case string: | |
2088 return tem; | |
2089 | |
2090 case symbol: | |
2091 /* As a special case, we map the values `true' and `on' | |
2092 to Qt, and `false' and `off' to Qnil. */ | |
2093 { | |
2094 Lisp_Object lower; | |
2095 lower = Fdowncase (tem); | |
2096 if (!strcmp (XSTRING (lower)->data, "on") | |
2097 || !strcmp (XSTRING (lower)->data, "true")) | |
2098 return Qt; | |
2099 else if (!strcmp (XSTRING (lower)->data, "off") | |
2100 || !strcmp (XSTRING (lower)->data, "false")) | |
2101 return Qnil; | |
2102 else | |
2103 return Fintern (tem, Qnil); | |
2104 } | |
2105 | |
2106 default: | |
2107 abort (); | |
2108 } | |
2109 } | |
2110 else | |
2111 return Qunbound; | |
2112 } | |
2113 return Fcdr (tem); | |
2114 } | |
2115 | |
2116 /* Record in frame F the specified or default value according to ALIST | |
2117 of the parameter named PARAM (a Lisp symbol). | |
2118 If no value is specified for PARAM, look for an X default for XPROP | |
2119 on the frame named NAME. | |
2120 If that is not found either, use the value DEFLT. */ | |
2121 | |
2122 static Lisp_Object | |
2123 x_default_parameter (f, alist, prop, deflt, xprop, xclass, type) | |
2124 struct frame *f; | |
2125 Lisp_Object alist; | |
2126 Lisp_Object prop; | |
2127 Lisp_Object deflt; | |
2128 char *xprop; | |
2129 char *xclass; | |
2130 enum resource_types type; | |
2131 { | |
2132 Lisp_Object tem; | |
2133 | |
2134 tem = x_get_arg (alist, prop, xprop, xclass, type); | |
2135 if (EQ (tem, Qunbound)) | |
2136 tem = deflt; | |
2137 x_set_frame_parameters (f, Fcons (Fcons (prop, tem), Qnil)); | |
2138 return tem; | |
2139 } | |
2140 | |
2141 DEFUN ("x-parse-geometry", Fx_parse_geometry, Sx_parse_geometry, 1, 1, 0, | |
2142 "Parse an X-style geometry string STRING.\n\ | |
2143 Returns an alist of the form ((top . TOP), (left . LEFT) ... ).\n\ | |
2144 The properties returned may include `top', `left', `height', and `width'.\n\ | |
2145 The value of `left' or `top' may be an integer,\n\ | |
2146 or a list (+ N) meaning N pixels relative to top/left corner,\n\ | |
2147 or a list (- N) meaning -N pixels relative to bottom/right corner.") | |
2148 (string) | |
2149 Lisp_Object string; | |
2150 { | |
2151 int geometry, x, y; | |
2152 unsigned int width, height; | |
2153 Lisp_Object result; | |
2154 | |
2155 CHECK_STRING (string, 0); | |
2156 | |
2157 geometry = XParseGeometry ((char *) XSTRING (string)->data, | |
2158 &x, &y, &width, &height); | |
2159 | |
2160 result = Qnil; | |
2161 if (geometry & XValue) | |
2162 { | |
2163 Lisp_Object element; | |
2164 | |
2165 if (x >= 0 && (geometry & XNegative)) | |
2166 element = Fcons (Qleft, Fcons (Qminus, Fcons (make_number (-x), Qnil))); | |
2167 else if (x < 0 && ! (geometry & XNegative)) | |
2168 element = Fcons (Qleft, Fcons (Qplus, Fcons (make_number (x), Qnil))); | |
2169 else | |
2170 element = Fcons (Qleft, make_number (x)); | |
2171 result = Fcons (element, result); | |
2172 } | |
2173 | |
2174 if (geometry & YValue) | |
2175 { | |
2176 Lisp_Object element; | |
2177 | |
2178 if (y >= 0 && (geometry & YNegative)) | |
2179 element = Fcons (Qtop, Fcons (Qminus, Fcons (make_number (-y), Qnil))); | |
2180 else if (y < 0 && ! (geometry & YNegative)) | |
2181 element = Fcons (Qtop, Fcons (Qplus, Fcons (make_number (y), Qnil))); | |
2182 else | |
2183 element = Fcons (Qtop, make_number (y)); | |
2184 result = Fcons (element, result); | |
2185 } | |
2186 | |
2187 if (geometry & WidthValue) | |
2188 result = Fcons (Fcons (Qwidth, make_number (width)), result); | |
2189 if (geometry & HeightValue) | |
2190 result = Fcons (Fcons (Qheight, make_number (height)), result); | |
2191 | |
2192 return result; | |
2193 } | |
2194 | |
2195 /* Calculate the desired size and position of this window, | |
2196 and return the flags saying which aspects were specified. | |
2197 | |
2198 This function does not make the coordinates positive. */ | |
2199 | |
2200 #define DEFAULT_ROWS 40 | |
2201 #define DEFAULT_COLS 80 | |
2202 | |
2203 static int | |
2204 x_figure_window_size (f, parms) | |
2205 struct frame *f; | |
2206 Lisp_Object parms; | |
2207 { | |
2208 register Lisp_Object tem0, tem1, tem2; | |
2209 int height, width, left, top; | |
2210 register int geometry; | |
2211 long window_prompting = 0; | |
2212 | |
2213 /* Default values if we fall through. | |
2214 Actually, if that happens we should get | |
2215 window manager prompting. */ | |
2216 f->width = DEFAULT_COLS; | |
2217 f->height = DEFAULT_ROWS; | |
2218 /* Window managers expect that if program-specified | |
2219 positions are not (0,0), they're intentional, not defaults. */ | |
2220 f->output_data.win32->top_pos = 0; | |
2221 f->output_data.win32->left_pos = 0; | |
2222 | |
2223 tem0 = x_get_arg (parms, Qheight, 0, 0, number); | |
2224 tem1 = x_get_arg (parms, Qwidth, 0, 0, number); | |
2225 tem2 = x_get_arg (parms, Quser_size, 0, 0, number); | |
2226 if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound)) | |
2227 { | |
2228 if (!EQ (tem0, Qunbound)) | |
2229 { | |
2230 CHECK_NUMBER (tem0, 0); | |
2231 f->height = XINT (tem0); | |
2232 } | |
2233 if (!EQ (tem1, Qunbound)) | |
2234 { | |
2235 CHECK_NUMBER (tem1, 0); | |
2236 f->width = XINT (tem1); | |
2237 } | |
2238 if (!NILP (tem2) && !EQ (tem2, Qunbound)) | |
2239 window_prompting |= USSize; | |
2240 else | |
2241 window_prompting |= PSize; | |
2242 } | |
2243 | |
2244 f->output_data.win32->vertical_scroll_bar_extra | |
2245 = (!FRAME_HAS_VERTICAL_SCROLL_BARS (f) | |
2246 ? 0 | |
2247 : FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0 | |
2248 ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f) | |
2249 : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->output_data.win32->font))); | |
2250 f->output_data.win32->pixel_width = CHAR_TO_PIXEL_WIDTH (f, f->width); | |
2251 f->output_data.win32->pixel_height = CHAR_TO_PIXEL_HEIGHT (f, f->height); | |
2252 | |
2253 tem0 = x_get_arg (parms, Qtop, 0, 0, number); | |
2254 tem1 = x_get_arg (parms, Qleft, 0, 0, number); | |
2255 tem2 = x_get_arg (parms, Quser_position, 0, 0, number); | |
2256 if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound)) | |
2257 { | |
2258 if (EQ (tem0, Qminus)) | |
2259 { | |
2260 f->output_data.win32->top_pos = 0; | |
2261 window_prompting |= YNegative; | |
2262 } | |
2263 else if (CONSP (tem0) && EQ (XCONS (tem0)->car, Qminus) | |
2264 && CONSP (XCONS (tem0)->cdr) | |
2265 && INTEGERP (XCONS (XCONS (tem0)->cdr)->car)) | |
2266 { | |
2267 f->output_data.win32->top_pos = - XINT (XCONS (XCONS (tem0)->cdr)->car); | |
2268 window_prompting |= YNegative; | |
2269 } | |
2270 else if (CONSP (tem0) && EQ (XCONS (tem0)->car, Qplus) | |
2271 && CONSP (XCONS (tem0)->cdr) | |
2272 && INTEGERP (XCONS (XCONS (tem0)->cdr)->car)) | |
2273 { | |
2274 f->output_data.win32->top_pos = XINT (XCONS (XCONS (tem0)->cdr)->car); | |
2275 } | |
2276 else if (EQ (tem0, Qunbound)) | |
2277 f->output_data.win32->top_pos = 0; | |
2278 else | |
2279 { | |
2280 CHECK_NUMBER (tem0, 0); | |
2281 f->output_data.win32->top_pos = XINT (tem0); | |
2282 if (f->output_data.win32->top_pos < 0) | |
2283 window_prompting |= YNegative; | |
2284 } | |
2285 | |
2286 if (EQ (tem1, Qminus)) | |
2287 { | |
2288 f->output_data.win32->left_pos = 0; | |
2289 window_prompting |= XNegative; | |
2290 } | |
2291 else if (CONSP (tem1) && EQ (XCONS (tem1)->car, Qminus) | |
2292 && CONSP (XCONS (tem1)->cdr) | |
2293 && INTEGERP (XCONS (XCONS (tem1)->cdr)->car)) | |
2294 { | |
2295 f->output_data.win32->left_pos = - XINT (XCONS (XCONS (tem1)->cdr)->car); | |
2296 window_prompting |= XNegative; | |
2297 } | |
2298 else if (CONSP (tem1) && EQ (XCONS (tem1)->car, Qplus) | |
2299 && CONSP (XCONS (tem1)->cdr) | |
2300 && INTEGERP (XCONS (XCONS (tem1)->cdr)->car)) | |
2301 { | |
2302 f->output_data.win32->left_pos = XINT (XCONS (XCONS (tem1)->cdr)->car); | |
2303 } | |
2304 else if (EQ (tem1, Qunbound)) | |
2305 f->output_data.win32->left_pos = 0; | |
2306 else | |
2307 { | |
2308 CHECK_NUMBER (tem1, 0); | |
2309 f->output_data.win32->left_pos = XINT (tem1); | |
2310 if (f->output_data.win32->left_pos < 0) | |
2311 window_prompting |= XNegative; | |
2312 } | |
2313 | |
2314 if (!NILP (tem2) && ! EQ (tem2, Qunbound)) | |
2315 window_prompting |= USPosition; | |
2316 else | |
2317 window_prompting |= PPosition; | |
2318 } | |
2319 | |
2320 return window_prompting; | |
2321 } | |
2322 | |
2323 | |
2324 | |
2325 extern LRESULT CALLBACK win32_wnd_proc (); | |
2326 | |
2327 BOOL | |
2328 win32_init_class (hinst) | |
2329 HINSTANCE hinst; | |
2330 { | |
2331 WNDCLASS wc; | |
2332 | |
14353 | 2333 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; |
13434 | 2334 wc.lpfnWndProc = (WNDPROC) win32_wnd_proc; |
2335 wc.cbClsExtra = 0; | |
2336 wc.cbWndExtra = WND_EXTRA_BYTES; | |
2337 wc.hInstance = hinst; | |
2338 wc.hIcon = LoadIcon (hinst, EMACS_CLASS); | |
2339 wc.hCursor = LoadCursor (NULL, IDC_ARROW); | |
2340 wc.hbrBackground = NULL; // GetStockObject (WHITE_BRUSH); | |
2341 wc.lpszMenuName = NULL; | |
2342 wc.lpszClassName = EMACS_CLASS; | |
2343 | |
2344 return (RegisterClass (&wc)); | |
2345 } | |
2346 | |
2347 HWND | |
2348 win32_createscrollbar (f, bar) | |
2349 struct frame *f; | |
2350 struct scroll_bar * bar; | |
2351 { | |
2352 return (CreateWindow ("SCROLLBAR", "", SBS_VERT | WS_CHILD | WS_VISIBLE, | |
2353 /* Position and size of scroll bar. */ | |
2354 XINT(bar->left), XINT(bar->top), | |
2355 XINT(bar->width), XINT(bar->height), | |
2356 FRAME_WIN32_WINDOW (f), | |
2357 NULL, | |
2358 hinst, | |
2359 NULL)); | |
2360 } | |
2361 | |
2362 void | |
2363 win32_createwindow (f) | |
2364 struct frame *f; | |
2365 { | |
2366 HWND hwnd; | |
2367 | |
2368 /* Do first time app init */ | |
2369 | |
2370 if (!hprevinst) | |
2371 { | |
2372 win32_init_class (hinst); | |
2373 } | |
2374 | |
2375 FRAME_WIN32_WINDOW (f) = hwnd = CreateWindow (EMACS_CLASS, | |
2376 f->namebuf, | |
2377 f->output_data.win32->dwStyle | WS_CLIPCHILDREN, | |
2378 f->output_data.win32->left_pos, | |
2379 f->output_data.win32->top_pos, | |
2380 PIXEL_WIDTH (f), | |
2381 PIXEL_HEIGHT (f), | |
2382 NULL, | |
2383 NULL, | |
2384 hinst, | |
2385 NULL); | |
2386 | |
2387 if (hwnd) | |
2388 { | |
2389 SetWindowLong (hwnd, WND_X_UNITS_INDEX, FONT_WIDTH (f->output_data.win32->font)); | |
2390 SetWindowLong (hwnd, WND_Y_UNITS_INDEX, f->output_data.win32->line_height); | |
2391 SetWindowLong (hwnd, WND_BACKGROUND_INDEX, f->output_data.win32->background_pixel); | |
2392 } | |
2393 } | |
2394 | |
2395 DWORD | |
2396 win_msg_worker (dw) | |
2397 DWORD dw; | |
2398 { | |
2399 MSG msg; | |
2400 | |
2401 /* Ensure our message queue is created */ | |
2402 | |
2403 PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE); | |
2404 | |
2405 PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, 0, 0); | |
2406 | |
2407 while (GetMessage (&msg, NULL, 0, 0)) | |
2408 { | |
2409 if (msg.hwnd == NULL) | |
2410 { | |
2411 switch (msg.message) | |
2412 { | |
2413 case WM_EMACS_CREATEWINDOW: | |
2414 win32_createwindow ((struct frame *) msg.wParam); | |
2415 PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, 0, 0); | |
2416 break; | |
2417 case WM_EMACS_CREATESCROLLBAR: | |
2418 { | |
2419 HWND hwnd = win32_createscrollbar ((struct frame *) msg.wParam, | |
2420 (struct scroll_bar *) msg.lParam); | |
2421 PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, (WPARAM)hwnd, 0); | |
2422 } | |
2423 break; | |
2424 case WM_EMACS_KILL: | |
2425 return (0); | |
2426 } | |
2427 } | |
2428 else | |
2429 { | |
2430 DispatchMessage (&msg); | |
2431 } | |
2432 } | |
2433 | |
2434 return (0); | |
2435 } | |
2436 | |
14353 | 2437 HDC |
2438 map_mode (hdc) | |
2439 HDC hdc; | |
2440 { | |
2441 if (hdc) | |
2442 { | |
2443 #if 0 | |
2444 /* Make mapping mode be in 1/20 of point */ | |
2445 | |
2446 SetMapMode (hdc, MM_ANISOTROPIC); | |
2447 SetWindowExtEx (hdc, 1440, 1440, NULL); | |
2448 SetViewportExtEx (hdc, | |
2449 GetDeviceCaps (hdc, LOGPIXELSX), | |
2450 GetDeviceCaps (hdc, LOGPIXELSY), | |
2451 NULL); | |
2452 #endif | |
2453 } | |
2454 return (hdc); | |
2455 } | |
2456 | |
13434 | 2457 /* Convert between the modifier bits Win32 uses and the modifier bits |
2458 Emacs uses. */ | |
2459 unsigned int | |
2460 win32_get_modifiers () | |
2461 { | |
2462 return (((GetKeyState (VK_SHIFT)&0x8000) ? shift_modifier : 0) | | |
2463 ((GetKeyState (VK_CONTROL)&0x8000) ? ctrl_modifier : 0) | | |
2464 ((GetKeyState (VK_MENU)&0x8000) ? meta_modifier : 0)); | |
2465 } | |
2466 | |
2467 void | |
2468 my_post_msg (wmsg, hwnd, msg, wParam, lParam) | |
2469 Win32Msg * wmsg; | |
2470 HWND hwnd; | |
2471 UINT msg; | |
2472 WPARAM wParam; | |
2473 LPARAM lParam; | |
2474 { | |
2475 wmsg->msg.hwnd = hwnd; | |
2476 wmsg->msg.message = msg; | |
2477 wmsg->msg.wParam = wParam; | |
2478 wmsg->msg.lParam = lParam; | |
2479 wmsg->msg.time = GetMessageTime (); | |
2480 | |
2481 post_msg (wmsg); | |
2482 } | |
2483 | |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2484 /* GetKeyState and MapVirtualKey on Win95 do not actually distinguish |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2485 between left and right keys as advertised. We test for this |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2486 support dynamically, and set a flag when the support is absent. If |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2487 absent, we keep track of the left and right control and alt keys |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2488 ourselves. This is particularly necessary on keyboards that rely |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2489 upon the AltGr key, which is represented as having the left control |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2490 and right alt keys pressed. For these keyboards, we need to know |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2491 when the left alt key has been pressed in addition to the AltGr key |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2492 so that we can properly support M-AltGr-key sequences (such as M-@ |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2493 on Swedish keyboards). */ |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2494 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2495 #define EMACS_LCONTROL 0 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2496 #define EMACS_RCONTROL 1 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2497 #define EMACS_LMENU 2 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2498 #define EMACS_RMENU 3 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2499 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2500 static int modifiers[4]; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2501 static int modifiers_recorded; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2502 static int modifier_key_support_tested; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2503 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2504 static void |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2505 test_modifier_support (unsigned int wparam) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2506 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2507 unsigned int l, r; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2508 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2509 if (wparam != VK_CONTROL && wparam != VK_MENU) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2510 return; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2511 if (wparam == VK_CONTROL) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2512 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2513 l = VK_LCONTROL; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2514 r = VK_RCONTROL; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2515 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2516 else |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2517 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2518 l = VK_LMENU; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2519 r = VK_RMENU; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2520 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2521 if (!(GetKeyState (l) & 0x8000) && !(GetKeyState (r) & 0x8000)) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2522 modifiers_recorded = 1; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2523 else |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2524 modifiers_recorded = 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2525 modifier_key_support_tested = 1; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2526 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2527 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2528 static void |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2529 record_keydown (unsigned int wparam, unsigned int lparam) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2530 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2531 int i; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2532 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2533 if (!modifier_key_support_tested) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2534 test_modifier_support (wparam); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2535 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2536 if ((wparam != VK_CONTROL && wparam != VK_MENU) || !modifiers_recorded) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2537 return; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2538 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2539 if (wparam == VK_CONTROL) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2540 i = (lparam & 0x1000000) ? EMACS_RCONTROL : EMACS_LCONTROL; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2541 else |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2542 i = (lparam & 0x1000000) ? EMACS_RMENU : EMACS_LMENU; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2543 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2544 modifiers[i] = 1; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2545 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2546 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2547 static void |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2548 record_keyup (unsigned int wparam, unsigned int lparam) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2549 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2550 int i; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2551 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2552 if ((wparam != VK_CONTROL && wparam != VK_MENU) || !modifiers_recorded) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2553 return; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2554 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2555 if (wparam == VK_CONTROL) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2556 i = (lparam & 0x1000000) ? EMACS_RCONTROL : EMACS_LCONTROL; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2557 else |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2558 i = (lparam & 0x1000000) ? EMACS_RMENU : EMACS_LMENU; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2559 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2560 modifiers[i] = 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2561 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2562 |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2563 /* Emacs can lose focus while a modifier key has been pressed. When |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2564 it regains focus, be conservative and clear all modifiers since |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2565 we cannot reconstruct the left and right modifier state. */ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2566 static void |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2567 reset_modifiers () |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2568 { |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2569 if (!modifiers_recorded) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2570 return; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2571 bzero (modifiers, sizeof (modifiers)); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2572 } |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2573 |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2574 static int |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2575 modifier_set (int vkey) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2576 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2577 if (!modifiers_recorded) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2578 return (GetKeyState (vkey) & 0x8000); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2579 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2580 switch (vkey) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2581 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2582 case VK_LCONTROL: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2583 return modifiers[EMACS_LCONTROL]; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2584 case VK_RCONTROL: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2585 return modifiers[EMACS_RCONTROL]; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2586 case VK_LMENU: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2587 return modifiers[EMACS_LMENU]; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2588 case VK_RMENU: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2589 return modifiers[EMACS_RMENU]; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2590 case VK_CAPITAL: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2591 return (GetKeyState (vkey) & 0x1); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2592 default: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2593 break; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2594 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2595 return (GetKeyState (vkey) & 0x8000); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2596 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2597 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2598 /* We map the VK_* modifiers into console modifier constants |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2599 so that we can use the same routines to handle both console |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2600 and window input. */ |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2601 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2602 static int |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2603 construct_modifiers (unsigned int wparam, unsigned int lparam) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2604 { |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2605 int mods; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2606 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2607 if (wparam != VK_CONTROL && wparam != VK_MENU) |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2608 mods = GetLastError (); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2609 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2610 mods = 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2611 mods |= (modifier_set (VK_SHIFT)) ? SHIFT_PRESSED : 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2612 mods |= (modifier_set (VK_CAPITAL)) ? CAPSLOCK_ON : 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2613 mods |= (modifier_set (VK_LCONTROL)) ? LEFT_CTRL_PRESSED : 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2614 mods |= (modifier_set (VK_RCONTROL)) ? RIGHT_CTRL_PRESSED : 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2615 mods |= (modifier_set (VK_LMENU)) ? LEFT_ALT_PRESSED : 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2616 mods |= (modifier_set (VK_RMENU)) ? RIGHT_ALT_PRESSED : 0; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2617 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2618 return mods; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2619 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2620 |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2621 static unsigned int |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2622 map_keypad_keys (unsigned int wparam, unsigned int lparam) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2623 { |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2624 unsigned int extended = (lparam & 0x1000000L); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2625 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2626 if (wparam < VK_CLEAR || wparam > VK_DELETE) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2627 return wparam; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2628 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2629 if (wparam == VK_RETURN) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2630 return (extended ? VK_NUMPAD_ENTER : VK_RETURN); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2631 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2632 if (wparam >= VK_PRIOR && wparam <= VK_DOWN) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2633 return (!extended ? (VK_NUMPAD_PRIOR + (wparam - VK_PRIOR)) : wparam); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2634 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2635 if (wparam == VK_INSERT || wparam == VK_DELETE) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2636 return (!extended ? (VK_NUMPAD_INSERT + (wparam - VK_INSERT)) : wparam); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2637 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2638 if (wparam == VK_CLEAR) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2639 return (!extended ? VK_NUMPAD_CLEAR : wparam); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2640 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2641 return wparam; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2642 } |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2643 |
13434 | 2644 /* Main window procedure */ |
2645 | |
2646 extern char *lispy_function_keys[]; | |
2647 | |
2648 LRESULT CALLBACK | |
2649 win32_wnd_proc (hwnd, msg, wParam, lParam) | |
2650 HWND hwnd; | |
2651 UINT msg; | |
2652 WPARAM wParam; | |
2653 LPARAM lParam; | |
2654 { | |
2655 struct frame *f; | |
2656 LRESULT ret = 1; | |
2657 struct win32_display_info *dpyinfo = &one_win32_display_info; | |
2658 Win32Msg wmsg; | |
2659 | |
2660 switch (msg) | |
2661 { | |
2662 case WM_ERASEBKGND: | |
2663 { | |
14353 | 2664 HBRUSH hb; |
2665 HANDLE oldobj; | |
2666 RECT rect; | |
2667 | |
2668 GetClientRect (hwnd, &rect); | |
2669 | |
2670 hb = CreateSolidBrush (GetWindowLong (hwnd, WND_BACKGROUND_INDEX)); | |
2671 | |
2672 oldobj = SelectObject ((HDC)wParam, hb); | |
2673 | |
2674 FillRect((HDC)wParam, &rect, hb); | |
2675 | |
2676 SelectObject((HDC)wParam, oldobj); | |
2677 | |
2678 DeleteObject (hb); | |
2679 | |
2680 return (0); | |
13434 | 2681 } |
2682 case WM_PAINT: | |
2683 { | |
2684 PAINTSTRUCT paintStruct; | |
14353 | 2685 |
13434 | 2686 BeginPaint (hwnd, &paintStruct); |
2687 wmsg.rect = paintStruct.rcPaint; | |
2688 EndPaint (hwnd, &paintStruct); | |
14353 | 2689 |
13434 | 2690 my_post_msg (&wmsg, hwnd, msg, wParam, lParam); |
2691 | |
2692 return (0); | |
2693 } | |
14353 | 2694 |
2695 case WM_CREATE: | |
2696 { | |
2697 HDC hdc = my_get_dc (hwnd); | |
2698 | |
2699 /* Make mapping mode be in 1/20 of point */ | |
2700 | |
2701 map_mode (hdc); | |
2702 | |
2703 ReleaseDC (hwnd, hdc); | |
2704 } | |
2705 | |
2706 return (0); | |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2707 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2708 case WM_KEYUP: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2709 case WM_SYSKEYUP: |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2710 record_keyup (wParam, lParam); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2711 goto dflt; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2712 |
13434 | 2713 case WM_KEYDOWN: |
2714 case WM_SYSKEYDOWN: | |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2715 record_keydown (wParam, lParam); |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2716 |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2717 wParam = map_keypad_keys (wParam, lParam); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2718 |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2719 switch (wParam) { |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2720 case VK_LWIN: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2721 case VK_RWIN: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2722 case VK_APPS: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2723 /* More support for these keys will likely be necessary. */ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2724 if (!NILP (Vwin32_pass_optional_keys_to_system)) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2725 goto dflt; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2726 break; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2727 case VK_MENU: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2728 if (NILP (Vwin32_pass_alt_to_system)) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2729 return 0; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2730 else |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2731 goto dflt; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2732 case VK_CONTROL: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2733 case VK_CAPITAL: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2734 case VK_SHIFT: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2735 /* Pass on to Windows. */ |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2736 goto dflt; |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2737 default: |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2738 /* If not defined as a function key, change it to a WM_CHAR message. */ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2739 if (lispy_function_keys[wParam] == 0) |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2740 msg = WM_CHAR; |
14353 | 2741 break; |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2742 } |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2743 |
13434 | 2744 /* Fall through */ |
2745 | |
2746 case WM_SYSCHAR: | |
2747 case WM_CHAR: | |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
2748 wmsg.dwModifiers = construct_modifiers (wParam, lParam); |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2749 |
13434 | 2750 my_post_msg (&wmsg, hwnd, msg, wParam, lParam); |
2751 break; | |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2752 |
13434 | 2753 case WM_LBUTTONDOWN: |
2754 case WM_LBUTTONUP: | |
2755 case WM_MBUTTONDOWN: | |
2756 case WM_MBUTTONUP: | |
2757 case WM_RBUTTONDOWN: | |
2758 case WM_RBUTTONUP: | |
2759 { | |
2760 BOOL up; | |
2761 | |
2762 if (parse_button (msg, NULL, &up)) | |
2763 { | |
2764 if (up) ReleaseCapture (); | |
2765 else SetCapture (hwnd); | |
2766 } | |
2767 } | |
2768 | |
2769 wmsg.dwModifiers = win32_get_modifiers (); | |
2770 | |
2771 my_post_msg (&wmsg, hwnd, msg, wParam, lParam); | |
2772 goto dflt; | |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2773 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2774 case WM_SETFOCUS: |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
2775 reset_modifiers (); |
13434 | 2776 case WM_MOUSEMOVE: |
2777 case WM_MOVE: | |
2778 case WM_SIZE: | |
2779 case WM_KILLFOCUS: | |
2780 case WM_CLOSE: | |
2781 case WM_VSCROLL: | |
2782 case WM_SYSCOMMAND: | |
2783 case WM_COMMAND: | |
2784 my_post_msg (&wmsg, hwnd, msg, wParam, lParam); | |
2785 goto dflt; | |
2786 case WM_WINDOWPOSCHANGING: | |
2787 { | |
2788 WINDOWPLACEMENT wp; | |
2789 LPWINDOWPOS lppos = (WINDOWPOS *) lParam; | |
14353 | 2790 |
13434 | 2791 GetWindowPlacement (hwnd, &wp); |
2792 | |
2793 if (wp.showCmd != SW_SHOWMINIMIZED && ! (lppos->flags & SWP_NOSIZE)) | |
2794 { | |
2795 RECT rect; | |
2796 int wdiff; | |
2797 int hdiff; | |
2798 DWORD dwXUnits; | |
2799 DWORD dwYUnits; | |
2800 RECT wr; | |
2801 | |
2802 GetWindowRect (hwnd, &wr); | |
2803 | |
14353 | 2804 enter_crit (); |
13434 | 2805 |
2806 dwXUnits = GetWindowLong (hwnd, WND_X_UNITS_INDEX); | |
2807 dwYUnits = GetWindowLong (hwnd, WND_Y_UNITS_INDEX); | |
2808 | |
14353 | 2809 leave_crit (); |
13434 | 2810 |
2811 memset (&rect, 0, sizeof (rect)); | |
2812 AdjustWindowRect (&rect, GetWindowLong (hwnd, GWL_STYLE), | |
2813 GetMenu (hwnd) != NULL); | |
2814 | |
2815 /* All windows have an extra pixel so subtract 1 */ | |
2816 | |
2817 wdiff = (lppos->cx - (rect.right - rect.left) - 0) % dwXUnits; | |
2818 hdiff = (lppos->cy - (rect.bottom - rect.top) - 0) % dwYUnits; | |
2819 | |
2820 if (wdiff || hdiff) | |
2821 { | |
2822 /* For right/bottom sizing we can just fix the sizes. | |
2823 However for top/left sizing we will need to fix the X | |
2824 and Y positions as well. */ | |
2825 | |
2826 lppos->cx -= wdiff; | |
2827 lppos->cy -= hdiff; | |
2828 | |
2829 if (wp.showCmd != SW_SHOWMAXIMIZED | |
2830 && ! (lppos->flags & SWP_NOMOVE)) | |
2831 { | |
2832 if (lppos->x != wr.left || lppos->y != wr.top) | |
2833 { | |
2834 lppos->x += wdiff; | |
2835 lppos->y += hdiff; | |
2836 } | |
2837 else | |
2838 { | |
2839 lppos->flags |= SWP_NOMOVE; | |
2840 } | |
2841 } | |
2842 | |
2843 ret = 0; | |
2844 } | |
2845 } | |
2846 } | |
2847 | |
2848 if (ret == 0) return (0); | |
2849 | |
2850 goto dflt; | |
2851 case WM_EMACS_DESTROYWINDOW: | |
2852 DestroyWindow ((HWND) wParam); | |
2853 break; | |
2854 default: | |
2855 dflt: | |
2856 return DefWindowProc (hwnd, msg, wParam, lParam); | |
2857 } | |
2858 | |
2859 return (1); | |
2860 } | |
2861 | |
2862 void | |
2863 my_create_window (f) | |
2864 struct frame * f; | |
2865 { | |
2866 MSG msg; | |
2867 | |
2868 PostThreadMessage (dwWinThreadId, WM_EMACS_CREATEWINDOW, (WPARAM)f, 0); | |
2869 GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE); | |
2870 } | |
2871 | |
2872 /* Create and set up the win32 window for frame F. */ | |
2873 | |
2874 static void | |
2875 win32_window (f, window_prompting, minibuffer_only) | |
2876 struct frame *f; | |
2877 long window_prompting; | |
2878 int minibuffer_only; | |
2879 { | |
2880 BLOCK_INPUT; | |
2881 | |
2882 /* Use the resource name as the top-level window name | |
2883 for looking up resources. Make a non-Lisp copy | |
2884 for the window manager, so GC relocation won't bother it. | |
2885 | |
2886 Elsewhere we specify the window name for the window manager. */ | |
2887 | |
2888 { | |
2889 char *str = (char *) XSTRING (Vx_resource_name)->data; | |
2890 f->namebuf = (char *) xmalloc (strlen (str) + 1); | |
2891 strcpy (f->namebuf, str); | |
2892 } | |
2893 | |
2894 my_create_window (f); | |
2895 | |
2896 validate_x_resource_name (); | |
2897 | |
2898 /* x_set_name normally ignores requests to set the name if the | |
2899 requested name is the same as the current name. This is the one | |
2900 place where that assumption isn't correct; f->name is set, but | |
2901 the server hasn't been told. */ | |
2902 { | |
2903 Lisp_Object name; | |
2904 int explicit = f->explicit_name; | |
2905 | |
2906 f->explicit_name = 0; | |
2907 name = f->name; | |
2908 f->name = Qnil; | |
2909 x_set_name (f, name, explicit); | |
2910 } | |
2911 | |
2912 UNBLOCK_INPUT; | |
2913 | |
2914 if (!minibuffer_only && FRAME_EXTERNAL_MENU_BAR (f)) | |
2915 initialize_frame_menubar (f); | |
2916 | |
2917 if (FRAME_WIN32_WINDOW (f) == 0) | |
2918 error ("Unable to create window"); | |
2919 } | |
2920 | |
2921 /* Handle the icon stuff for this window. Perhaps later we might | |
2922 want an x_set_icon_position which can be called interactively as | |
2923 well. */ | |
2924 | |
2925 static void | |
2926 x_icon (f, parms) | |
2927 struct frame *f; | |
2928 Lisp_Object parms; | |
2929 { | |
2930 Lisp_Object icon_x, icon_y; | |
2931 | |
2932 /* Set the position of the icon. Note that win95 groups all | |
2933 icons in the tray. */ | |
2934 icon_x = x_get_arg (parms, Qicon_left, 0, 0, number); | |
2935 icon_y = x_get_arg (parms, Qicon_top, 0, 0, number); | |
2936 if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound)) | |
2937 { | |
2938 CHECK_NUMBER (icon_x, 0); | |
2939 CHECK_NUMBER (icon_y, 0); | |
2940 } | |
2941 else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound)) | |
2942 error ("Both left and top icon corners of icon must be specified"); | |
2943 | |
2944 BLOCK_INPUT; | |
2945 | |
2946 if (! EQ (icon_x, Qunbound)) | |
2947 x_wm_set_icon_position (f, XINT (icon_x), XINT (icon_y)); | |
2948 | |
2949 UNBLOCK_INPUT; | |
2950 } | |
2951 | |
2952 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, | |
2953 1, 1, 0, | |
2954 "Make a new window, which is called a \"frame\" in Emacs terms.\n\ | |
2955 Returns an Emacs frame object.\n\ | |
2956 ALIST is an alist of frame parameters.\n\ | |
2957 If the parameters specify that the frame should not have a minibuffer,\n\ | |
2958 and do not specify a specific minibuffer window to use,\n\ | |
2959 then `default-minibuffer-frame' must be a frame whose minibuffer can\n\ | |
2960 be shared by the new frame.\n\ | |
2961 \n\ | |
2962 This function is an internal primitive--use `make-frame' instead.") | |
2963 (parms) | |
2964 Lisp_Object parms; | |
2965 { | |
2966 struct frame *f; | |
2967 Lisp_Object frame, tem; | |
2968 Lisp_Object name; | |
2969 int minibuffer_only = 0; | |
2970 long window_prompting = 0; | |
2971 int width, height; | |
2972 int count = specpdl_ptr - specpdl; | |
2973 struct gcpro gcpro1; | |
2974 Lisp_Object display; | |
2975 struct win32_display_info *dpyinfo; | |
2976 Lisp_Object parent; | |
2977 struct kboard *kb; | |
2978 | |
2979 /* Use this general default value to start with | |
2980 until we know if this frame has a specified name. */ | |
2981 Vx_resource_name = Vinvocation_name; | |
2982 | |
2983 display = x_get_arg (parms, Qdisplay, 0, 0, string); | |
2984 if (EQ (display, Qunbound)) | |
2985 display = Qnil; | |
2986 dpyinfo = check_x_display_info (display); | |
2987 #ifdef MULTI_KBOARD | |
2988 kb = dpyinfo->kboard; | |
2989 #else | |
2990 kb = &the_only_kboard; | |
2991 #endif | |
2992 | |
2993 name = x_get_arg (parms, Qname, "title", "Title", string); | |
2994 if (!STRINGP (name) | |
2995 && ! EQ (name, Qunbound) | |
2996 && ! NILP (name)) | |
2997 error ("Invalid frame name--not a string or nil"); | |
2998 | |
2999 if (STRINGP (name)) | |
3000 Vx_resource_name = name; | |
3001 | |
3002 /* See if parent window is specified. */ | |
3003 parent = x_get_arg (parms, Qparent_id, NULL, NULL, number); | |
3004 if (EQ (parent, Qunbound)) | |
3005 parent = Qnil; | |
3006 if (! NILP (parent)) | |
3007 CHECK_NUMBER (parent, 0); | |
3008 | |
3009 tem = x_get_arg (parms, Qminibuffer, 0, 0, symbol); | |
3010 if (EQ (tem, Qnone) || NILP (tem)) | |
3011 f = make_frame_without_minibuffer (Qnil, kb, display); | |
3012 else if (EQ (tem, Qonly)) | |
3013 { | |
3014 f = make_minibuffer_frame (); | |
3015 minibuffer_only = 1; | |
3016 } | |
3017 else if (WINDOWP (tem)) | |
3018 f = make_frame_without_minibuffer (tem, kb, display); | |
3019 else | |
3020 f = make_frame (1); | |
3021 | |
3022 /* Note that Windows does support scroll bars. */ | |
3023 FRAME_CAN_HAVE_SCROLL_BARS (f) = 1; | |
3024 | |
3025 XSETFRAME (frame, f); | |
3026 GCPRO1 (frame); | |
3027 | |
3028 f->output_method = output_win32; | |
3029 f->output_data.win32 = (struct win32_output *) xmalloc (sizeof (struct win32_output)); | |
3030 bzero (f->output_data.win32, sizeof (struct win32_output)); | |
3031 | |
3032 /* FRAME_WIN32_DISPLAY_INFO (f) = dpyinfo; */ | |
3033 #ifdef MULTI_KBOARD | |
3034 FRAME_KBOARD (f) = kb; | |
3035 #endif | |
3036 | |
3037 /* Specify the parent under which to make this window. */ | |
3038 | |
3039 if (!NILP (parent)) | |
3040 { | |
3041 f->output_data.win32->parent_desc = (Window) parent; | |
3042 f->output_data.win32->explicit_parent = 1; | |
3043 } | |
3044 else | |
3045 { | |
3046 f->output_data.win32->parent_desc = FRAME_WIN32_DISPLAY_INFO (f)->root_window; | |
3047 f->output_data.win32->explicit_parent = 0; | |
3048 } | |
3049 | |
3050 /* Note that the frame has no physical cursor right now. */ | |
3051 f->phys_cursor_x = -1; | |
3052 | |
3053 /* Set the name; the functions to which we pass f expect the name to | |
3054 be set. */ | |
3055 if (EQ (name, Qunbound) || NILP (name)) | |
3056 { | |
3057 f->name = build_string (dpyinfo->win32_id_name); | |
3058 f->explicit_name = 0; | |
3059 } | |
3060 else | |
3061 { | |
3062 f->name = name; | |
3063 f->explicit_name = 1; | |
3064 /* use the frame's title when getting resources for this frame. */ | |
3065 specbind (Qx_resource_name, name); | |
3066 } | |
3067 | |
3068 /* Extract the window parameters from the supplied values | |
3069 that are needed to determine window geometry. */ | |
3070 { | |
3071 Lisp_Object font; | |
3072 | |
3073 font = x_get_arg (parms, Qfont, "font", "Font", string); | |
3074 BLOCK_INPUT; | |
3075 /* First, try whatever font the caller has specified. */ | |
3076 if (STRINGP (font)) | |
3077 font = x_new_font (f, XSTRING (font)->data); | |
3078 #if 0 | |
3079 /* Try out a font which we hope has bold and italic variations. */ | |
3080 if (!STRINGP (font)) | |
3081 font = x_new_font (f, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1"); | |
3082 if (! STRINGP (font)) | |
3083 font = x_new_font (f, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1"); | |
3084 if (! STRINGP (font)) | |
3085 /* This was formerly the first thing tried, but it finds too many fonts | |
3086 and takes too long. */ | |
3087 font = x_new_font (f, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1"); | |
3088 /* If those didn't work, look for something which will at least work. */ | |
3089 if (! STRINGP (font)) | |
3090 font = x_new_font (f, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1"); | |
3091 if (! STRINGP (font)) | |
3092 font = x_new_font (f, "-*-system-medium-r-normal-*-*-200-*-*-c-120-*-*"); | |
3093 #endif | |
3094 if (! STRINGP (font)) | |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
3095 font = x_new_font (f, "-*-Fixedsys-*-r-*-*-12-90-*-*-c-*-*-*"); |
13434 | 3096 UNBLOCK_INPUT; |
3097 if (! STRINGP (font)) | |
3098 font = build_string ("-*-system"); | |
3099 | |
3100 x_default_parameter (f, parms, Qfont, font, | |
3101 "font", "Font", string); | |
3102 } | |
3103 | |
3104 x_default_parameter (f, parms, Qborder_width, make_number (2), | |
3105 "borderwidth", "BorderWidth", number); | |
3106 /* This defaults to 2 in order to match xterm. We recognize either | |
3107 internalBorderWidth or internalBorder (which is what xterm calls | |
3108 it). */ | |
3109 if (NILP (Fassq (Qinternal_border_width, parms))) | |
3110 { | |
3111 Lisp_Object value; | |
3112 | |
3113 value = x_get_arg (parms, Qinternal_border_width, | |
3114 "internalBorder", "BorderWidth", number); | |
3115 if (! EQ (value, Qunbound)) | |
3116 parms = Fcons (Fcons (Qinternal_border_width, value), | |
3117 parms); | |
3118 } | |
3119 x_default_parameter (f, parms, Qinternal_border_width, make_number (0), | |
3120 "internalBorderWidth", "BorderWidth", number); | |
3121 x_default_parameter (f, parms, Qvertical_scroll_bars, Qt, | |
3122 "verticalScrollBars", "ScrollBars", boolean); | |
3123 | |
3124 /* Also do the stuff which must be set before the window exists. */ | |
3125 x_default_parameter (f, parms, Qforeground_color, build_string ("black"), | |
3126 "foreground", "Foreground", string); | |
3127 x_default_parameter (f, parms, Qbackground_color, build_string ("white"), | |
3128 "background", "Background", string); | |
3129 x_default_parameter (f, parms, Qmouse_color, build_string ("black"), | |
3130 "pointerColor", "Foreground", string); | |
3131 x_default_parameter (f, parms, Qcursor_color, build_string ("black"), | |
3132 "cursorColor", "Foreground", string); | |
3133 x_default_parameter (f, parms, Qborder_color, build_string ("black"), | |
3134 "borderColor", "BorderColor", string); | |
3135 | |
3136 x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1), | |
3137 "menuBar", "MenuBar", number); | |
3138 x_default_parameter (f, parms, Qscroll_bar_width, Qnil, | |
3139 "scrollBarWidth", "ScrollBarWidth", number); | |
3140 | |
3141 f->output_data.win32->dwStyle = WS_OVERLAPPEDWINDOW; | |
3142 f->output_data.win32->parent_desc = FRAME_WIN32_DISPLAY_INFO (f)->root_window; | |
3143 window_prompting = x_figure_window_size (f, parms); | |
3144 | |
3145 if (window_prompting & XNegative) | |
3146 { | |
3147 if (window_prompting & YNegative) | |
3148 f->output_data.win32->win_gravity = SouthEastGravity; | |
3149 else | |
3150 f->output_data.win32->win_gravity = NorthEastGravity; | |
3151 } | |
3152 else | |
3153 { | |
3154 if (window_prompting & YNegative) | |
3155 f->output_data.win32->win_gravity = SouthWestGravity; | |
3156 else | |
3157 f->output_data.win32->win_gravity = NorthWestGravity; | |
3158 } | |
3159 | |
3160 f->output_data.win32->size_hint_flags = window_prompting; | |
3161 | |
3162 win32_window (f, window_prompting, minibuffer_only); | |
3163 x_icon (f, parms); | |
3164 init_frame_faces (f); | |
3165 | |
3166 /* We need to do this after creating the window, so that the | |
3167 icon-creation functions can say whose icon they're describing. */ | |
3168 x_default_parameter (f, parms, Qicon_type, Qnil, | |
3169 "bitmapIcon", "BitmapIcon", symbol); | |
3170 | |
3171 x_default_parameter (f, parms, Qauto_raise, Qnil, | |
3172 "autoRaise", "AutoRaiseLower", boolean); | |
3173 x_default_parameter (f, parms, Qauto_lower, Qnil, | |
3174 "autoLower", "AutoRaiseLower", boolean); | |
3175 x_default_parameter (f, parms, Qcursor_type, Qbox, | |
3176 "cursorType", "CursorType", symbol); | |
3177 | |
3178 /* Dimensions, especially f->height, must be done via change_frame_size. | |
3179 Change will not be effected unless different from the current | |
3180 f->height. */ | |
3181 width = f->width; | |
3182 height = f->height; | |
3183 f->height = f->width = 0; | |
3184 change_frame_size (f, height, width, 1, 0); | |
3185 | |
3186 /* Tell the server what size and position, etc, we want, | |
3187 and how badly we want them. */ | |
3188 BLOCK_INPUT; | |
3189 x_wm_set_size_hint (f, window_prompting, 0); | |
3190 UNBLOCK_INPUT; | |
3191 | |
3192 tem = x_get_arg (parms, Qunsplittable, 0, 0, boolean); | |
3193 f->no_split = minibuffer_only || EQ (tem, Qt); | |
3194 | |
3195 UNGCPRO; | |
3196 | |
3197 /* It is now ok to make the frame official | |
3198 even if we get an error below. | |
3199 And the frame needs to be on Vframe_list | |
3200 or making it visible won't work. */ | |
3201 Vframe_list = Fcons (frame, Vframe_list); | |
3202 | |
3203 /* Now that the frame is official, it counts as a reference to | |
3204 its display. */ | |
3205 FRAME_WIN32_DISPLAY_INFO (f)->reference_count++; | |
3206 | |
3207 /* Make the window appear on the frame and enable display, | |
3208 unless the caller says not to. However, with explicit parent, | |
3209 Emacs cannot control visibility, so don't try. */ | |
3210 if (! f->output_data.win32->explicit_parent) | |
3211 { | |
3212 Lisp_Object visibility; | |
3213 | |
3214 visibility = x_get_arg (parms, Qvisibility, 0, 0, symbol); | |
3215 if (EQ (visibility, Qunbound)) | |
3216 visibility = Qt; | |
3217 | |
3218 if (EQ (visibility, Qicon)) | |
3219 x_iconify_frame (f); | |
3220 else if (! NILP (visibility)) | |
3221 x_make_frame_visible (f); | |
3222 else | |
3223 /* Must have been Qnil. */ | |
3224 ; | |
3225 } | |
3226 | |
3227 return unbind_to (count, frame); | |
3228 } | |
3229 | |
3230 /* FRAME is used only to get a handle on the X display. We don't pass the | |
3231 display info directly because we're called from frame.c, which doesn't | |
3232 know about that structure. */ | |
3233 Lisp_Object | |
3234 x_get_focus_frame (frame) | |
3235 struct frame *frame; | |
3236 { | |
3237 struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (frame); | |
3238 Lisp_Object xfocus; | |
3239 if (! dpyinfo->win32_focus_frame) | |
3240 return Qnil; | |
3241 | |
3242 XSETFRAME (xfocus, dpyinfo->win32_focus_frame); | |
3243 return xfocus; | |
3244 } | |
3245 | |
3246 DEFUN ("focus-frame", Ffocus_frame, Sfocus_frame, 1, 1, 0, | |
3247 "Set the focus on FRAME.") | |
3248 (frame) | |
3249 Lisp_Object frame; | |
3250 { | |
3251 CHECK_LIVE_FRAME (frame, 0); | |
3252 | |
3253 if (FRAME_WIN32_P (XFRAME (frame))) | |
3254 { | |
3255 BLOCK_INPUT; | |
3256 x_focus_on_frame (XFRAME (frame)); | |
3257 UNBLOCK_INPUT; | |
3258 return frame; | |
3259 } | |
3260 | |
3261 return Qnil; | |
3262 } | |
3263 | |
3264 DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0, | |
3265 "If a frame has been focused, release it.") | |
3266 () | |
3267 { | |
3268 if (FRAME_WIN32_P (selected_frame)) | |
3269 { | |
3270 struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (selected_frame); | |
3271 | |
3272 if (dpyinfo->win32_focus_frame) | |
3273 { | |
3274 BLOCK_INPUT; | |
3275 x_unfocus_frame (dpyinfo->win32_focus_frame); | |
3276 UNBLOCK_INPUT; | |
3277 } | |
3278 } | |
3279 | |
3280 return Qnil; | |
3281 } | |
3282 | |
14353 | 3283 XFontStruct |
3284 *win32_load_font (dpyinfo,name) | |
3285 struct win32_display_info *dpyinfo; | |
3286 char * name; | |
13434 | 3287 { |
3288 XFontStruct * font = NULL; | |
3289 BOOL ok; | |
14353 | 3290 |
3291 { | |
3292 LOGFONT lf; | |
3293 | |
3294 if (!name || !x_to_win32_font(name, &lf)) | |
3295 return (NULL); | |
3296 | |
3297 font = (XFontStruct *) xmalloc (sizeof (XFontStruct)); | |
3298 | |
3299 if (!font) return (NULL); | |
3300 | |
3301 BLOCK_INPUT; | |
3302 | |
3303 font->hfont = CreateFontIndirect(&lf); | |
13434 | 3304 } |
14353 | 3305 |
3306 if (font->hfont == NULL) | |
3307 { | |
3308 ok = FALSE; | |
3309 } | |
3310 else | |
3311 { | |
3312 HDC hdc; | |
3313 HANDLE oldobj; | |
3314 | |
3315 hdc = my_get_dc (dpyinfo->root_window); | |
3316 | |
3317 oldobj = SelectObject (hdc, font->hfont); | |
3318 | |
3319 ok = GetTextMetrics (hdc, &font->tm); | |
3320 | |
3321 SelectObject (hdc, oldobj); | |
3322 | |
3323 ReleaseDC (dpyinfo->root_window, hdc); | |
3324 } | |
3325 | |
13434 | 3326 UNBLOCK_INPUT; |
14353 | 3327 |
13434 | 3328 if (ok) return (font); |
14353 | 3329 |
3330 win32_unload_font(dpyinfo, font); | |
13434 | 3331 return (NULL); |
3332 } | |
3333 | |
3334 void | |
3335 win32_unload_font (dpyinfo, font) | |
3336 struct win32_display_info *dpyinfo; | |
3337 XFontStruct * font; | |
3338 { | |
3339 if (font) | |
3340 { | |
14353 | 3341 if (font->hfont) DeleteObject(font->hfont); |
13434 | 3342 xfree (font); |
3343 } | |
3344 } | |
3345 | |
3346 /* The font conversion stuff between x and win32 */ | |
3347 | |
3348 /* X font string is as follows (from faces.el) | |
3349 * (let ((- "[-?]") | |
3350 * (foundry "[^-]+") | |
3351 * (family "[^-]+") | |
3352 * (weight "\\(bold\\|demibold\\|medium\\)") ; 1 | |
3353 * (weight\? "\\([^-]*\\)") ; 1 | |
3354 * (slant "\\([ior]\\)") ; 2 | |
3355 * (slant\? "\\([^-]?\\)") ; 2 | |
3356 * (swidth "\\([^-]*\\)") ; 3 | |
3357 * (adstyle "[^-]*") ; 4 | |
3358 * (pixelsize "[0-9]+") | |
3359 * (pointsize "[0-9][0-9]+") | |
3360 * (resx "[0-9][0-9]+") | |
3361 * (resy "[0-9][0-9]+") | |
3362 * (spacing "[cmp?*]") | |
3363 * (avgwidth "[0-9]+") | |
3364 * (registry "[^-]+") | |
3365 * (encoding "[^-]+") | |
3366 * ) | |
3367 * (setq x-font-regexp | |
3368 * (concat "\\`\\*?[-?*]" | |
3369 * foundry - family - weight\? - slant\? - swidth - adstyle - | |
3370 * pixelsize - pointsize - resx - resy - spacing - registry - | |
3371 * encoding "[-?*]\\*?\\'" | |
3372 * )) | |
3373 * (setq x-font-regexp-head | |
3374 * (concat "\\`[-?*]" foundry - family - weight\? - slant\? | |
3375 * "\\([-*?]\\|\\'\\)")) | |
3376 * (setq x-font-regexp-slant (concat - slant -)) | |
3377 * (setq x-font-regexp-weight (concat - weight -)) | |
3378 * nil) | |
3379 */ | |
3380 | |
3381 #define FONT_START "[-?]" | |
3382 #define FONT_FOUNDRY "[^-]+" | |
3383 #define FONT_FAMILY "\\([^-]+\\)" /* 1 */ | |
3384 #define FONT_WEIGHT "\\(bold\\|demibold\\|medium\\)" /* 2 */ | |
3385 #define FONT_WEIGHT_Q "\\([^-]*\\)" /* 2 */ | |
3386 #define FONT_SLANT "\\([ior]\\)" /* 3 */ | |
3387 #define FONT_SLANT_Q "\\([^-]?\\)" /* 3 */ | |
3388 #define FONT_SWIDTH "\\([^-]*\\)" /* 4 */ | |
3389 #define FONT_ADSTYLE "[^-]*" | |
3390 #define FONT_PIXELSIZE "[^-]*" | |
3391 #define FONT_POINTSIZE "\\([0-9][0-9]+\\|\\*\\)" /* 5 */ | |
3392 #define FONT_RESX "[0-9][0-9]+" | |
3393 #define FONT_RESY "[0-9][0-9]+" | |
3394 #define FONT_SPACING "[cmp?*]" | |
3395 #define FONT_AVGWIDTH "[0-9]+" | |
3396 #define FONT_REGISTRY "[^-]+" | |
3397 #define FONT_ENCODING "[^-]+" | |
3398 | |
3399 #define FONT_REGEXP ("\\`\\*?[-?*]" \ | |
3400 FONT_FOUNDRY "-" \ | |
3401 FONT_FAMILY "-" \ | |
3402 FONT_WEIGHT_Q "-" \ | |
3403 FONT_SLANT_Q "-" \ | |
3404 FONT_SWIDTH "-" \ | |
3405 FONT_ADSTYLE "-" \ | |
3406 FONT_PIXELSIZE "-" \ | |
3407 FONT_POINTSIZE "-" \ | |
3408 "[-?*]\\|\\'") | |
3409 | |
3410 #define FONT_REGEXP_HEAD ("\\`[-?*]" \ | |
3411 FONT_FOUNDRY "-" \ | |
3412 FONT_FAMILY "-" \ | |
3413 FONT_WEIGHT_Q "-" \ | |
3414 FONT_SLANT_Q \ | |
3415 "\\([-*?]\\|\\'\\)") | |
3416 | |
3417 #define FONT_REGEXP_SLANT "-" FONT_SLANT "-" | |
3418 #define FONT_REGEXP_WEIGHT "-" FONT_WEIGHT "-" | |
3419 | |
3420 LONG | |
3421 x_to_win32_weight (lpw) | |
3422 char * lpw; | |
3423 { | |
3424 if (!lpw) return (FW_DONTCARE); | |
3425 | |
14353 | 3426 if (stricmp (lpw, "bold") == 0) |
13434 | 3427 return (FW_BOLD); |
3428 else if (stricmp (lpw, "demibold") == 0) | |
3429 return (FW_SEMIBOLD); | |
3430 else if (stricmp (lpw, "medium") == 0) | |
3431 return (FW_MEDIUM); | |
3432 else if (stricmp (lpw, "normal") == 0) | |
3433 return (FW_NORMAL); | |
3434 else | |
3435 return (FW_DONTCARE); | |
3436 } | |
3437 | |
3438 char * | |
3439 win32_to_x_weight (fnweight) | |
3440 int fnweight; | |
3441 { | |
14353 | 3442 if (fnweight >= FW_BOLD) |
3443 return ("bold"); | |
3444 else if (fnweight >= FW_SEMIBOLD) | |
3445 return ("demibold"); | |
3446 else if (fnweight >= FW_MEDIUM) | |
3447 return ("medium"); | |
3448 else | |
3449 return ("normal"); | |
13434 | 3450 } |
3451 | |
3452 BOOL | |
3453 win32_to_x_font (lplogfont, lpxstr, len) | |
3454 LOGFONT * lplogfont; | |
3455 char * lpxstr; | |
3456 int len; | |
3457 { | |
3458 if (!lpxstr) return (FALSE); | |
3459 | |
14353 | 3460 if (lplogfont) |
13434 | 3461 { |
14353 | 3462 int height = (lplogfont->lfHeight * 1440) |
3463 / one_win32_display_info.height_in; | |
3464 int width = (lplogfont->lfWidth * 1440) | |
3465 / one_win32_display_info.width_in; | |
3466 | |
3467 height = abs (height); | |
13434 | 3468 _snprintf (lpxstr, len - 1, |
14353 | 3469 "-*-%s-%s-%c-%s-%s-*-%d-*-*-%c-%d-*-*-", |
13434 | 3470 lplogfont->lfFaceName, |
3471 win32_to_x_weight (lplogfont->lfWeight), | |
3472 lplogfont->lfItalic ? 'i' : 'r', | |
14353 | 3473 "*", "*", |
3474 height, | |
13434 | 3475 ((lplogfont->lfPitchAndFamily & 0x3) == VARIABLE_PITCH) ? 'p' : 'c', |
14353 | 3476 width); |
3477 } | |
3478 else | |
13434 | 3479 { |
3480 strncpy (lpxstr, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-", len - 1); | |
3481 } | |
14353 | 3482 |
13434 | 3483 lpxstr[len - 1] = 0; /* just to be sure */ |
3484 return (TRUE); | |
3485 } | |
3486 | |
3487 BOOL | |
3488 x_to_win32_font (lpxstr, lplogfont) | |
3489 char * lpxstr; | |
3490 LOGFONT * lplogfont; | |
3491 { | |
3492 if (!lplogfont) return (FALSE); | |
3493 | |
3494 memset (lplogfont, 0, sizeof (*lplogfont)); | |
3495 | |
14353 | 3496 lplogfont->lfCharSet = OEM_CHARSET; |
13434 | 3497 lplogfont->lfOutPrecision = OUT_DEFAULT_PRECIS; |
3498 lplogfont->lfClipPrecision = CLIP_DEFAULT_PRECIS; | |
3499 lplogfont->lfQuality = DEFAULT_QUALITY; | |
3500 | |
14353 | 3501 if (lpxstr && *lpxstr == '-') lpxstr++; |
13434 | 3502 |
14353 | 3503 { |
3504 int fields; | |
3505 char name[50], weight[20], slant, pitch, height[10], width[10]; | |
3506 | |
3507 fields = (lpxstr | |
3508 ? sscanf (lpxstr, | |
3509 "%*[^-]-%[^-]-%[^-]-%c-%*[^-]-%*[^-]-%*[^-]-%[^-]-%*[^-]-%*[^-]-%c-%[^-]", | |
3510 name, weight, &slant, height, &pitch, width) | |
3511 : 0); | |
3512 | |
3513 if (fields == EOF) return (FALSE); | |
3514 | |
3515 if (fields > 0 && name[0] != '*') | |
3516 { | |
3517 strncpy (lplogfont->lfFaceName, name, LF_FACESIZE); | |
3518 } | |
3519 else | |
3520 { | |
14243
df4d211a0522
(Vwin32_enable_italics, Vwin32_enable_palette):
Geoff Voelker <voelker@cs.washington.edu>
parents:
14186
diff
changeset
|
3521 lplogfont->lfFaceName[0] = 0; |
13434 | 3522 } |
14353 | 3523 |
3524 fields--; | |
3525 | |
3526 lplogfont->lfWeight = x_to_win32_weight((fields > 0 ? weight : "")); | |
3527 | |
3528 fields--; | |
3529 | |
3530 lplogfont->lfItalic = (fields > 0 && slant == 'i'); | |
3531 | |
3532 fields--; | |
3533 | |
3534 if (fields > 0 && height[0] != '*') | |
3535 lplogfont->lfHeight = (atoi (height) * one_win32_display_info.height_in) / 1440; | |
3536 | |
3537 fields--; | |
3538 | |
3539 lplogfont->lfPitchAndFamily = (fields > 0 && pitch == 'p') ? VARIABLE_PITCH : FIXED_PITCH; | |
3540 | |
3541 fields--; | |
3542 | |
3543 if (fields > 0 && width[0] != '*') | |
3544 lplogfont->lfWidth = (atoi (width) * one_win32_display_info.width_in) / 1440; | |
14461
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
3545 |
4fe9540be594
(modifiers, modifier_key_support_tested,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14353
diff
changeset
|
3546 lplogfont->lfCharSet = ANSI_CHARSET; |
14353 | 3547 } |
13434 | 3548 |
3549 return (TRUE); | |
3550 } | |
3551 | |
3552 BOOL | |
3553 win32_font_match (lpszfont1, lpszfont2) | |
3554 char * lpszfont1; | |
3555 char * lpszfont2; | |
3556 { | |
3557 char * s1 = lpszfont1, *e1; | |
3558 char * s2 = lpszfont2, *e2; | |
3559 | |
3560 if (s1 == NULL || s2 == NULL) return (FALSE); | |
3561 | |
3562 if (*s1 == '-') s1++; | |
3563 if (*s2 == '-') s2++; | |
3564 | |
3565 while (1) | |
3566 { | |
3567 int len1, len2; | |
3568 | |
3569 e1 = strchr (s1, '-'); | |
3570 e2 = strchr (s2, '-'); | |
3571 | |
3572 if (e1 == NULL || e2 == NULL) return (TRUE); | |
3573 | |
3574 len1 = e1 - s1; | |
3575 len2 = e2 - s2; | |
3576 | |
3577 if (*s1 != '*' && *s2 != '*' | |
3578 && (len1 != len2 || strnicmp (s1, s2, len1) != 0)) | |
3579 return (FALSE); | |
3580 | |
3581 s1 = e1 + 1; | |
3582 s2 = e2 + 1; | |
3583 } | |
3584 } | |
3585 | |
3586 typedef struct enumfont_t | |
3587 { | |
3588 HDC hdc; | |
3589 int numFonts; | |
3590 XFontStruct *size_ref; | |
3591 Lisp_Object *pattern; | |
3592 Lisp_Object *head; | |
3593 Lisp_Object *tail; | |
3594 } enumfont_t; | |
3595 | |
3596 int CALLBACK | |
3597 enum_font_cb2 (lplf, lptm, FontType, lpef) | |
3598 ENUMLOGFONT * lplf; | |
3599 NEWTEXTMETRIC * lptm; | |
3600 int FontType; | |
3601 enumfont_t * lpef; | |
3602 { | |
3603 if (lplf->elfLogFont.lfStrikeOut || lplf->elfLogFont.lfUnderline | |
3604 || (lplf->elfLogFont.lfCharSet != ANSI_CHARSET && lplf->elfLogFont.lfCharSet != OEM_CHARSET)) | |
3605 return (1); | |
3606 | |
3607 /* if (!lpef->size_ref || lptm->tmMaxCharWidth == FONT_WIDTH (lpef->size_ref)) */ | |
3608 { | |
3609 char buf[100]; | |
3610 | |
3611 if (!win32_to_x_font (lplf, buf, 100)) return (0); | |
3612 | |
3613 if (NILP (*(lpef->pattern)) || win32_font_match (buf, XSTRING (*(lpef->pattern))->data)) | |
3614 { | |
3615 *lpef->tail = Fcons (build_string (buf), Qnil); | |
3616 lpef->tail = &XCONS (*lpef->tail)->cdr; | |
3617 lpef->numFonts++; | |
3618 } | |
3619 } | |
3620 | |
3621 return (1); | |
3622 } | |
3623 | |
3624 int CALLBACK | |
3625 enum_font_cb1 (lplf, lptm, FontType, lpef) | |
3626 ENUMLOGFONT * lplf; | |
3627 NEWTEXTMETRIC * lptm; | |
3628 int FontType; | |
3629 enumfont_t * lpef; | |
3630 { | |
3631 return EnumFontFamilies (lpef->hdc, | |
3632 lplf->elfLogFont.lfFaceName, | |
3633 (FONTENUMPROC) enum_font_cb2, | |
3634 (LPARAM) lpef); | |
3635 } | |
3636 | |
3637 | |
3638 DEFUN ("x-list-fonts", Fx_list_fonts, Sx_list_fonts, 1, 3, 0, | |
3639 "Return a list of the names of available fonts matching PATTERN.\n\ | |
3640 If optional arguments FACE and FRAME are specified, return only fonts\n\ | |
3641 the same size as FACE on FRAME.\n\ | |
3642 \n\ | |
3643 PATTERN is a string, perhaps with wildcard characters;\n\ | |
3644 the * character matches any substring, and\n\ | |
3645 the ? character matches any single character.\n\ | |
3646 PATTERN is case-insensitive.\n\ | |
3647 FACE is a face name--a symbol.\n\ | |
3648 \n\ | |
3649 The return value is a list of strings, suitable as arguments to\n\ | |
3650 set-face-font.\n\ | |
3651 \n\ | |
3652 Fonts Emacs can't use (i.e. proportional fonts) may or may not be excluded\n\ | |
3653 even if they match PATTERN and FACE.") | |
3654 (pattern, face, frame) | |
3655 Lisp_Object pattern, face, frame; | |
3656 { | |
3657 int num_fonts; | |
3658 char **names; | |
3659 XFontStruct *info; | |
3660 XFontStruct *size_ref; | |
3661 Lisp_Object namelist; | |
3662 Lisp_Object list; | |
3663 FRAME_PTR f; | |
3664 enumfont_t ef; | |
3665 | |
3666 CHECK_STRING (pattern, 0); | |
3667 if (!NILP (face)) | |
3668 CHECK_SYMBOL (face, 1); | |
3669 | |
3670 f = check_x_frame (frame); | |
3671 | |
3672 /* Determine the width standard for comparison with the fonts we find. */ | |
3673 | |
3674 if (NILP (face)) | |
3675 size_ref = 0; | |
3676 else | |
3677 { | |
3678 int face_id; | |
3679 | |
3680 /* Don't die if we get called with a terminal frame. */ | |
3681 if (! FRAME_WIN32_P (f)) | |
3682 error ("non-win32 frame used in `x-list-fonts'"); | |
3683 | |
3684 face_id = face_name_id_number (f, face); | |
3685 | |
3686 if (face_id < 0 || face_id >= FRAME_N_PARAM_FACES (f) | |
3687 || FRAME_PARAM_FACES (f) [face_id] == 0) | |
3688 size_ref = f->output_data.win32->font; | |
3689 else | |
3690 { | |
3691 size_ref = FRAME_PARAM_FACES (f) [face_id]->font; | |
3692 if (size_ref == (XFontStruct *) (~0)) | |
3693 size_ref = f->output_data.win32->font; | |
3694 } | |
3695 } | |
3696 | |
3697 /* See if we cached the result for this particular query. */ | |
3698 list = Fassoc (pattern, | |
3699 XCONS (FRAME_WIN32_DISPLAY_INFO (f)->name_list_element)->cdr); | |
3700 | |
3701 /* We have info in the cache for this PATTERN. */ | |
3702 if (!NILP (list)) | |
3703 { | |
3704 Lisp_Object tem, newlist; | |
3705 | |
3706 /* We have info about this pattern. */ | |
3707 list = XCONS (list)->cdr; | |
3708 | |
3709 if (size_ref == 0) | |
3710 return list; | |
3711 | |
3712 BLOCK_INPUT; | |
3713 | |
3714 /* Filter the cached info and return just the fonts that match FACE. */ | |
3715 newlist = Qnil; | |
3716 for (tem = list; CONSP (tem); tem = XCONS (tem)->cdr) | |
3717 { | |
3718 XFontStruct *thisinfo; | |
3719 | |
3720 thisinfo = win32_load_font (FRAME_WIN32_DISPLAY_INFO (f), XSTRING (XCONS (tem)->car)->data); | |
3721 | |
3722 if (thisinfo && same_size_fonts (thisinfo, size_ref)) | |
3723 newlist = Fcons (XCONS (tem)->car, newlist); | |
3724 | |
3725 win32_unload_font (FRAME_WIN32_DISPLAY_INFO (f), thisinfo); | |
3726 } | |
3727 | |
3728 UNBLOCK_INPUT; | |
3729 | |
3730 return newlist; | |
3731 } | |
3732 | |
3733 BLOCK_INPUT; | |
3734 | |
3735 namelist = Qnil; | |
3736 ef.pattern = &pattern; | |
3737 ef.tail = ef.head = &namelist; | |
3738 ef.numFonts = 0; | |
3739 | |
3740 { | |
14353 | 3741 ef.hdc = my_get_dc (FRAME_WIN32_WINDOW (f)); |
13434 | 3742 |
3743 EnumFontFamilies (ef.hdc, NULL, (FONTENUMPROC) enum_font_cb1, (LPARAM)&ef); | |
3744 | |
3745 ReleaseDC (FRAME_WIN32_WINDOW (f), ef.hdc); | |
3746 } | |
3747 | |
3748 UNBLOCK_INPUT; | |
3749 | |
3750 if (ef.numFonts) | |
3751 { | |
3752 int i; | |
3753 Lisp_Object cur; | |
3754 | |
3755 /* Make a list of all the fonts we got back. | |
3756 Store that in the font cache for the display. */ | |
3757 XCONS (FRAME_WIN32_DISPLAY_INFO (f)->name_list_element)->cdr | |
3758 = Fcons (Fcons (pattern, namelist), | |
3759 XCONS (FRAME_WIN32_DISPLAY_INFO (f)->name_list_element)->cdr); | |
3760 | |
3761 /* Make a list of the fonts that have the right width. */ | |
3762 list = Qnil; | |
3763 cur=namelist; | |
3764 for (i = 0; i < ef.numFonts; i++) | |
3765 { | |
3766 int keeper; | |
3767 | |
3768 if (!size_ref) | |
3769 keeper = 1; | |
3770 else | |
3771 { | |
3772 XFontStruct *thisinfo; | |
3773 | |
3774 BLOCK_INPUT; | |
3775 thisinfo = win32_load_font (FRAME_WIN32_DISPLAY_INFO (f), XSTRING (Fcar (cur))->data); | |
3776 | |
3777 keeper = thisinfo && same_size_fonts (thisinfo, size_ref); | |
3778 | |
3779 win32_unload_font (FRAME_WIN32_DISPLAY_INFO (f), thisinfo); | |
3780 | |
3781 UNBLOCK_INPUT; | |
3782 } | |
3783 if (keeper) | |
3784 list = Fcons (build_string (XSTRING (Fcar (cur))->data), list); | |
3785 | |
3786 cur = Fcdr (cur); | |
3787 } | |
3788 list = Fnreverse (list); | |
3789 } | |
3790 | |
3791 return list; | |
3792 } | |
3793 | |
3794 DEFUN ("x-color-defined-p", Fx_color_defined_p, Sx_color_defined_p, 1, 2, 0, | |
3795 "Return non-nil if color COLOR is supported on frame FRAME.\n\ | |
3796 If FRAME is omitted or nil, use the selected frame.") | |
3797 (color, frame) | |
3798 Lisp_Object color, frame; | |
3799 { | |
3800 COLORREF foo; | |
3801 FRAME_PTR f = check_x_frame (frame); | |
3802 | |
3803 CHECK_STRING (color, 1); | |
3804 | |
3805 if (defined_color (f, XSTRING (color)->data, &foo, 0)) | |
3806 return Qt; | |
3807 else | |
3808 return Qnil; | |
3809 } | |
3810 | |
3811 DEFUN ("x-color-values", Fx_color_values, Sx_color_values, 1, 2, 0, | |
3812 "Return a description of the color named COLOR on frame FRAME.\n\ | |
3813 The value is a list of integer RGB values--(RED GREEN BLUE).\n\ | |
3814 These values appear to range from 0 to 65280 or 65535, depending\n\ | |
3815 on the system; white is (65280 65280 65280) or (65535 65535 65535).\n\ | |
3816 If FRAME is omitted or nil, use the selected frame.") | |
3817 (color, frame) | |
3818 Lisp_Object color, frame; | |
3819 { | |
3820 COLORREF foo; | |
3821 FRAME_PTR f = check_x_frame (frame); | |
3822 | |
3823 CHECK_STRING (color, 1); | |
3824 | |
3825 if (defined_color (f, XSTRING (color)->data, &foo, 0)) | |
3826 { | |
3827 Lisp_Object rgb[3]; | |
3828 | |
3829 rgb[0] = make_number (GetRValue (foo)); | |
3830 rgb[1] = make_number (GetGValue (foo)); | |
3831 rgb[2] = make_number (GetBValue (foo)); | |
3832 return Flist (3, rgb); | |
3833 } | |
3834 else | |
3835 return Qnil; | |
3836 } | |
3837 | |
3838 DEFUN ("x-display-color-p", Fx_display_color_p, Sx_display_color_p, 0, 1, 0, | |
3839 "Return t if the X display supports color.\n\ | |
3840 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3841 DISPLAY should be either a frame or a display name (a string).\n\ | |
3842 If omitted or nil, that stands for the selected frame's display.") | |
3843 (display) | |
3844 Lisp_Object display; | |
3845 { | |
3846 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3847 | |
3848 if ((dpyinfo->n_planes * dpyinfo->n_cbits) <= 2) | |
3849 return Qnil; | |
3850 | |
3851 return Qt; | |
3852 } | |
3853 | |
3854 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p, | |
3855 0, 1, 0, | |
3856 "Return t if the X display supports shades of gray.\n\ | |
3857 Note that color displays do support shades of gray.\n\ | |
3858 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3859 DISPLAY should be either a frame or a display name (a string).\n\ | |
3860 If omitted or nil, that stands for the selected frame's display.") | |
3861 (display) | |
3862 Lisp_Object display; | |
3863 { | |
3864 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3865 | |
3866 if ((dpyinfo->n_planes * dpyinfo->n_cbits) <= 1) | |
3867 return Qnil; | |
3868 | |
3869 return Qt; | |
3870 } | |
3871 | |
3872 DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width, | |
3873 0, 1, 0, | |
3874 "Returns the width in pixels of the X display DISPLAY.\n\ | |
3875 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3876 DISPLAY should be either a frame or a display name (a string).\n\ | |
3877 If omitted or nil, that stands for the selected frame's display.") | |
3878 (display) | |
3879 Lisp_Object display; | |
3880 { | |
3881 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3882 | |
3883 return make_number (dpyinfo->width); | |
3884 } | |
3885 | |
3886 DEFUN ("x-display-pixel-height", Fx_display_pixel_height, | |
3887 Sx_display_pixel_height, 0, 1, 0, | |
3888 "Returns the height in pixels of the X display DISPLAY.\n\ | |
3889 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3890 DISPLAY should be either a frame or a display name (a string).\n\ | |
3891 If omitted or nil, that stands for the selected frame's display.") | |
3892 (display) | |
3893 Lisp_Object display; | |
3894 { | |
3895 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3896 | |
3897 return make_number (dpyinfo->height); | |
3898 } | |
3899 | |
3900 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes, | |
3901 0, 1, 0, | |
3902 "Returns the number of bitplanes of the display DISPLAY.\n\ | |
3903 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3904 DISPLAY should be either a frame or a display name (a string).\n\ | |
3905 If omitted or nil, that stands for the selected frame's display.") | |
3906 (display) | |
3907 Lisp_Object display; | |
3908 { | |
3909 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3910 | |
3911 return make_number (dpyinfo->n_planes * dpyinfo->n_cbits); | |
3912 } | |
3913 | |
3914 DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells, | |
3915 0, 1, 0, | |
3916 "Returns the number of color cells of the display DISPLAY.\n\ | |
3917 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3918 DISPLAY should be either a frame or a display name (a string).\n\ | |
3919 If omitted or nil, that stands for the selected frame's display.") | |
3920 (display) | |
3921 Lisp_Object display; | |
3922 { | |
3923 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3924 HDC hdc; | |
3925 int cap; | |
3926 | |
14353 | 3927 hdc = my_get_dc (dpyinfo->root_window); |
3928 | |
3929 cap = GetDeviceCaps (hdc,NUMCOLORS); | |
13434 | 3930 |
3931 ReleaseDC (dpyinfo->root_window, hdc); | |
3932 | |
3933 return make_number (cap); | |
3934 } | |
3935 | |
3936 DEFUN ("x-server-max-request-size", Fx_server_max_request_size, | |
3937 Sx_server_max_request_size, | |
3938 0, 1, 0, | |
3939 "Returns the maximum request size of the server of display DISPLAY.\n\ | |
3940 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3941 DISPLAY should be either a frame or a display name (a string).\n\ | |
3942 If omitted or nil, that stands for the selected frame's display.") | |
3943 (display) | |
3944 Lisp_Object display; | |
3945 { | |
3946 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3947 | |
3948 return make_number (1); | |
3949 } | |
3950 | |
3951 DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0, | |
3952 "Returns the vendor ID string of the Win32 system (Microsoft).\n\ | |
3953 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3954 DISPLAY should be either a frame or a display name (a string).\n\ | |
3955 If omitted or nil, that stands for the selected frame's display.") | |
3956 (display) | |
3957 Lisp_Object display; | |
3958 { | |
3959 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3960 char *vendor = "Microsoft Corp."; | |
3961 | |
3962 if (! vendor) vendor = ""; | |
3963 return build_string (vendor); | |
3964 } | |
3965 | |
3966 DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0, | |
3967 "Returns the version numbers of the server of display DISPLAY.\n\ | |
3968 The value is a list of three integers: the major and minor\n\ | |
3969 version numbers, and the vendor-specific release\n\ | |
3970 number. See also the function `x-server-vendor'.\n\n\ | |
3971 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3972 DISPLAY should be either a frame or a display name (a string).\n\ | |
3973 If omitted or nil, that stands for the selected frame's display.") | |
3974 (display) | |
3975 Lisp_Object display; | |
3976 { | |
3977 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3978 | |
3979 return Fcons (make_number (nt_major_version), | |
3980 Fcons (make_number (nt_minor_version), Qnil)); | |
3981 } | |
3982 | |
3983 DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0, | |
3984 "Returns the number of screens on the server of display DISPLAY.\n\ | |
3985 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3986 DISPLAY should be either a frame or a display name (a string).\n\ | |
3987 If omitted or nil, that stands for the selected frame's display.") | |
3988 (display) | |
3989 Lisp_Object display; | |
3990 { | |
3991 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
3992 | |
3993 return make_number (1); | |
3994 } | |
3995 | |
3996 DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1, 0, | |
3997 "Returns the height in millimeters of the X display DISPLAY.\n\ | |
3998 The optional argument DISPLAY specifies which display to ask about.\n\ | |
3999 DISPLAY should be either a frame or a display name (a string).\n\ | |
4000 If omitted or nil, that stands for the selected frame's display.") | |
4001 (display) | |
4002 Lisp_Object display; | |
4003 { | |
4004 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
4005 HDC hdc; | |
4006 int cap; | |
4007 | |
14353 | 4008 hdc = my_get_dc (dpyinfo->root_window); |
4009 | |
13434 | 4010 cap = GetDeviceCaps (hdc, VERTSIZE); |
14353 | 4011 |
13434 | 4012 ReleaseDC (dpyinfo->root_window, hdc); |
4013 | |
4014 return make_number (cap); | |
4015 } | |
4016 | |
4017 DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0, | |
4018 "Returns the width in millimeters of the X display DISPLAY.\n\ | |
4019 The optional argument DISPLAY specifies which display to ask about.\n\ | |
4020 DISPLAY should be either a frame or a display name (a string).\n\ | |
4021 If omitted or nil, that stands for the selected frame's display.") | |
4022 (display) | |
4023 Lisp_Object display; | |
4024 { | |
4025 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
4026 | |
4027 HDC hdc; | |
4028 int cap; | |
4029 | |
14353 | 4030 hdc = my_get_dc (dpyinfo->root_window); |
4031 | |
13434 | 4032 cap = GetDeviceCaps (hdc, HORZSIZE); |
14353 | 4033 |
13434 | 4034 ReleaseDC (dpyinfo->root_window, hdc); |
4035 | |
4036 return make_number (cap); | |
4037 } | |
4038 | |
4039 DEFUN ("x-display-backing-store", Fx_display_backing_store, | |
4040 Sx_display_backing_store, 0, 1, 0, | |
4041 "Returns an indication of whether display DISPLAY does backing store.\n\ | |
4042 The value may be `always', `when-mapped', or `not-useful'.\n\ | |
4043 The optional argument DISPLAY specifies which display to ask about.\n\ | |
4044 DISPLAY should be either a frame or a display name (a string).\n\ | |
4045 If omitted or nil, that stands for the selected frame's display.") | |
4046 (display) | |
4047 Lisp_Object display; | |
4048 { | |
4049 return intern ("not-useful"); | |
4050 } | |
4051 | |
4052 DEFUN ("x-display-visual-class", Fx_display_visual_class, | |
4053 Sx_display_visual_class, 0, 1, 0, | |
4054 "Returns the visual class of the display DISPLAY.\n\ | |
4055 The value is one of the symbols `static-gray', `gray-scale',\n\ | |
4056 `static-color', `pseudo-color', `true-color', or `direct-color'.\n\n\ | |
4057 The optional argument DISPLAY specifies which display to ask about.\n\ | |
4058 DISPLAY should be either a frame or a display name (a string).\n\ | |
4059 If omitted or nil, that stands for the selected frame's display.") | |
4060 (display) | |
4061 Lisp_Object display; | |
4062 { | |
4063 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
4064 | |
4065 #if 0 | |
4066 switch (dpyinfo->visual->class) | |
4067 { | |
4068 case StaticGray: return (intern ("static-gray")); | |
4069 case GrayScale: return (intern ("gray-scale")); | |
4070 case StaticColor: return (intern ("static-color")); | |
4071 case PseudoColor: return (intern ("pseudo-color")); | |
4072 case TrueColor: return (intern ("true-color")); | |
4073 case DirectColor: return (intern ("direct-color")); | |
4074 default: | |
4075 error ("Display has an unknown visual class"); | |
4076 } | |
4077 #endif | |
4078 | |
4079 error ("Display has an unknown visual class"); | |
4080 } | |
4081 | |
4082 DEFUN ("x-display-save-under", Fx_display_save_under, | |
4083 Sx_display_save_under, 0, 1, 0, | |
4084 "Returns t if the display DISPLAY supports the save-under feature.\n\ | |
4085 The optional argument DISPLAY specifies which display to ask about.\n\ | |
4086 DISPLAY should be either a frame or a display name (a string).\n\ | |
4087 If omitted or nil, that stands for the selected frame's display.") | |
4088 (display) | |
4089 Lisp_Object display; | |
4090 { | |
4091 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
4092 | |
4093 return Qnil; | |
4094 } | |
4095 | |
4096 int | |
4097 x_pixel_width (f) | |
4098 register struct frame *f; | |
4099 { | |
4100 return PIXEL_WIDTH (f); | |
4101 } | |
4102 | |
4103 int | |
4104 x_pixel_height (f) | |
4105 register struct frame *f; | |
4106 { | |
4107 return PIXEL_HEIGHT (f); | |
4108 } | |
4109 | |
4110 int | |
4111 x_char_width (f) | |
4112 register struct frame *f; | |
4113 { | |
4114 return FONT_WIDTH (f->output_data.win32->font); | |
4115 } | |
4116 | |
4117 int | |
4118 x_char_height (f) | |
4119 register struct frame *f; | |
4120 { | |
4121 return f->output_data.win32->line_height; | |
4122 } | |
4123 | |
4124 int | |
4125 x_screen_planes (frame) | |
4126 Lisp_Object frame; | |
4127 { | |
4128 return (FRAME_WIN32_DISPLAY_INFO (XFRAME (frame))->n_planes * | |
4129 FRAME_WIN32_DISPLAY_INFO (XFRAME (frame))->n_cbits); | |
4130 } | |
4131 | |
4132 /* Return the display structure for the display named NAME. | |
4133 Open a new connection if necessary. */ | |
4134 | |
4135 struct win32_display_info * | |
4136 x_display_info_for_name (name) | |
4137 Lisp_Object name; | |
4138 { | |
4139 Lisp_Object names; | |
4140 struct win32_display_info *dpyinfo; | |
4141 | |
4142 CHECK_STRING (name, 0); | |
4143 | |
4144 for (dpyinfo = &one_win32_display_info, names = win32_display_name_list; | |
4145 dpyinfo; | |
4146 dpyinfo = dpyinfo->next, names = XCONS (names)->cdr) | |
4147 { | |
4148 Lisp_Object tem; | |
4149 tem = Fstring_equal (XCONS (XCONS (names)->car)->car, name); | |
4150 if (!NILP (tem)) | |
4151 return dpyinfo; | |
4152 } | |
4153 | |
4154 /* Use this general default value to start with. */ | |
4155 Vx_resource_name = Vinvocation_name; | |
4156 | |
4157 validate_x_resource_name (); | |
4158 | |
4159 dpyinfo = win32_term_init (name, (unsigned char *)0, | |
4160 (char *) XSTRING (Vx_resource_name)->data); | |
4161 | |
4162 if (dpyinfo == 0) | |
4163 error ("Cannot connect to server %s", XSTRING (name)->data); | |
4164 | |
4165 XSETFASTINT (Vwindow_system_version, 3); | |
4166 | |
4167 return dpyinfo; | |
4168 } | |
4169 | |
4170 DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection, | |
4171 1, 3, 0, "Open a connection to a server.\n\ | |
4172 DISPLAY is the name of the display to connect to.\n\ | |
4173 Optional second arg XRM-STRING is a string of resources in xrdb format.\n\ | |
4174 If the optional third arg MUST-SUCCEED is non-nil,\n\ | |
4175 terminate Emacs if we can't open the connection.") | |
4176 (display, xrm_string, must_succeed) | |
4177 Lisp_Object display, xrm_string, must_succeed; | |
4178 { | |
4179 unsigned int n_planes; | |
4180 unsigned char *xrm_option; | |
4181 struct win32_display_info *dpyinfo; | |
4182 | |
4183 CHECK_STRING (display, 0); | |
4184 if (! NILP (xrm_string)) | |
4185 CHECK_STRING (xrm_string, 1); | |
4186 | |
14353 | 4187 Vwin32_color_map = Fwin32_default_color_map (); |
13434 | 4188 |
4189 if (! NILP (xrm_string)) | |
4190 xrm_option = (unsigned char *) XSTRING (xrm_string)->data; | |
4191 else | |
4192 xrm_option = (unsigned char *) 0; | |
4193 | |
4194 /* Use this general default value to start with. */ | |
4195 Vx_resource_name = Vinvocation_name; | |
4196 | |
4197 validate_x_resource_name (); | |
4198 | |
4199 /* This is what opens the connection and sets x_current_display. | |
4200 This also initializes many symbols, such as those used for input. */ | |
4201 dpyinfo = win32_term_init (display, xrm_option, | |
4202 (char *) XSTRING (Vx_resource_name)->data); | |
4203 | |
4204 if (dpyinfo == 0) | |
4205 { | |
4206 if (!NILP (must_succeed)) | |
14353 | 4207 fatal ("Cannot connect to server %s.\n", |
4208 XSTRING (display)->data); | |
13434 | 4209 else |
4210 error ("Cannot connect to server %s", XSTRING (display)->data); | |
4211 } | |
4212 | |
4213 XSETFASTINT (Vwindow_system_version, 3); | |
4214 return Qnil; | |
4215 } | |
4216 | |
4217 DEFUN ("x-close-connection", Fx_close_connection, | |
4218 Sx_close_connection, 1, 1, 0, | |
4219 "Close the connection to DISPLAY's server.\n\ | |
4220 For DISPLAY, specify either a frame or a display name (a string).\n\ | |
4221 If DISPLAY is nil, that stands for the selected frame's display.") | |
4222 (display) | |
4223 Lisp_Object display; | |
4224 { | |
4225 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
4226 struct win32_display_info *tail; | |
4227 int i; | |
4228 | |
4229 if (dpyinfo->reference_count > 0) | |
4230 error ("Display still has frames on it"); | |
4231 | |
4232 BLOCK_INPUT; | |
4233 /* Free the fonts in the font table. */ | |
4234 for (i = 0; i < dpyinfo->n_fonts; i++) | |
4235 { | |
4236 if (dpyinfo->font_table[i].name) | |
4237 free (dpyinfo->font_table[i].name); | |
4238 /* Don't free the full_name string; | |
4239 it is always shared with something else. */ | |
4240 win32_unload_font (dpyinfo, dpyinfo->font_table[i].font); | |
4241 } | |
4242 x_destroy_all_bitmaps (dpyinfo); | |
4243 | |
4244 x_delete_display (dpyinfo); | |
4245 UNBLOCK_INPUT; | |
4246 | |
4247 return Qnil; | |
4248 } | |
4249 | |
4250 DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, | |
4251 "Return the list of display names that Emacs has connections to.") | |
4252 () | |
4253 { | |
4254 Lisp_Object tail, result; | |
4255 | |
4256 result = Qnil; | |
4257 for (tail = win32_display_name_list; ! NILP (tail); tail = XCONS (tail)->cdr) | |
4258 result = Fcons (XCONS (XCONS (tail)->car)->car, result); | |
4259 | |
4260 return result; | |
4261 } | |
4262 | |
4263 DEFUN ("x-synchronize", Fx_synchronize, Sx_synchronize, 1, 2, 0, | |
4264 "If ON is non-nil, report errors as soon as the erring request is made.\n\ | |
4265 If ON is nil, allow buffering of requests.\n\ | |
4266 This is a noop on Win32 systems.\n\ | |
4267 The optional second argument DISPLAY specifies which display to act on.\n\ | |
4268 DISPLAY should be either a frame or a display name (a string).\n\ | |
4269 If DISPLAY is omitted or nil, that stands for the selected frame's display.") | |
4270 (on, display) | |
4271 Lisp_Object display, on; | |
4272 { | |
4273 struct win32_display_info *dpyinfo = check_x_display_info (display); | |
4274 | |
4275 return Qnil; | |
4276 } | |
4277 | |
4278 | |
4279 /* These are the win32 specialized functions */ | |
4280 | |
4281 DEFUN ("win32-select-font", Fwin32_select_font, Swin32_select_font, 0, 1, 0, | |
4282 "This will display the Win32 font dialog and return an X font string corresponding to the selection.") | |
4283 (frame) | |
4284 Lisp_Object frame; | |
4285 { | |
4286 FRAME_PTR f = check_x_frame (frame); | |
4287 CHOOSEFONT cf; | |
4288 LOGFONT lf; | |
4289 char buf[100]; | |
4290 | |
4291 bzero (&cf, sizeof (cf)); | |
4292 | |
4293 cf.lStructSize = sizeof (cf); | |
4294 cf.hwndOwner = FRAME_WIN32_WINDOW (f); | |
4295 cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST | CF_SCREENFONTS; | |
4296 cf.lpLogFont = &lf; | |
4297 | |
4298 if (!ChooseFont (&cf) || !win32_to_x_font (&lf, buf, 100)) | |
14353 | 4299 return Qnil; |
13434 | 4300 |
4301 return build_string (buf); | |
4302 } | |
4303 | |
4304 | |
4305 syms_of_win32fns () | |
4306 { | |
4307 /* The section below is built by the lisp expression at the top of the file, | |
4308 just above where these variables are declared. */ | |
4309 /*&&& init symbols here &&&*/ | |
4310 Qauto_raise = intern ("auto-raise"); | |
4311 staticpro (&Qauto_raise); | |
4312 Qauto_lower = intern ("auto-lower"); | |
4313 staticpro (&Qauto_lower); | |
4314 Qbackground_color = intern ("background-color"); | |
4315 staticpro (&Qbackground_color); | |
4316 Qbar = intern ("bar"); | |
4317 staticpro (&Qbar); | |
4318 Qborder_color = intern ("border-color"); | |
4319 staticpro (&Qborder_color); | |
4320 Qborder_width = intern ("border-width"); | |
4321 staticpro (&Qborder_width); | |
4322 Qbox = intern ("box"); | |
4323 staticpro (&Qbox); | |
4324 Qcursor_color = intern ("cursor-color"); | |
4325 staticpro (&Qcursor_color); | |
4326 Qcursor_type = intern ("cursor-type"); | |
4327 staticpro (&Qcursor_type); | |
4328 Qfont = intern ("font"); | |
4329 staticpro (&Qfont); | |
4330 Qforeground_color = intern ("foreground-color"); | |
4331 staticpro (&Qforeground_color); | |
4332 Qgeometry = intern ("geometry"); | |
4333 staticpro (&Qgeometry); | |
4334 Qicon_left = intern ("icon-left"); | |
4335 staticpro (&Qicon_left); | |
4336 Qicon_top = intern ("icon-top"); | |
4337 staticpro (&Qicon_top); | |
4338 Qicon_type = intern ("icon-type"); | |
4339 staticpro (&Qicon_type); | |
4340 Qicon_name = intern ("icon-name"); | |
4341 staticpro (&Qicon_name); | |
4342 Qinternal_border_width = intern ("internal-border-width"); | |
4343 staticpro (&Qinternal_border_width); | |
4344 Qleft = intern ("left"); | |
4345 staticpro (&Qleft); | |
4346 Qmouse_color = intern ("mouse-color"); | |
4347 staticpro (&Qmouse_color); | |
4348 Qnone = intern ("none"); | |
4349 staticpro (&Qnone); | |
4350 Qparent_id = intern ("parent-id"); | |
4351 staticpro (&Qparent_id); | |
4352 Qscroll_bar_width = intern ("scroll-bar-width"); | |
4353 staticpro (&Qscroll_bar_width); | |
4354 Qsuppress_icon = intern ("suppress-icon"); | |
4355 staticpro (&Qsuppress_icon); | |
4356 Qtop = intern ("top"); | |
4357 staticpro (&Qtop); | |
4358 Qundefined_color = intern ("undefined-color"); | |
4359 staticpro (&Qundefined_color); | |
4360 Qvertical_scroll_bars = intern ("vertical-scroll-bars"); | |
4361 staticpro (&Qvertical_scroll_bars); | |
4362 Qvisibility = intern ("visibility"); | |
4363 staticpro (&Qvisibility); | |
4364 Qwindow_id = intern ("window-id"); | |
4365 staticpro (&Qwindow_id); | |
4366 Qx_frame_parameter = intern ("x-frame-parameter"); | |
4367 staticpro (&Qx_frame_parameter); | |
4368 Qx_resource_name = intern ("x-resource-name"); | |
4369 staticpro (&Qx_resource_name); | |
4370 Quser_position = intern ("user-position"); | |
4371 staticpro (&Quser_position); | |
4372 Quser_size = intern ("user-size"); | |
4373 staticpro (&Quser_size); | |
4374 Qdisplay = intern ("display"); | |
4375 staticpro (&Qdisplay); | |
4376 /* This is the end of symbol initialization. */ | |
4377 | |
4378 Fput (Qundefined_color, Qerror_conditions, | |
4379 Fcons (Qundefined_color, Fcons (Qerror, Qnil))); | |
4380 Fput (Qundefined_color, Qerror_message, | |
4381 build_string ("Undefined color")); | |
4382 | |
4383 DEFVAR_LISP ("win32-color-map", &Vwin32_color_map, | |
4384 "A array of color name mappings for windows."); | |
4385 Vwin32_color_map = Qnil; | |
4386 | |
14810
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4387 DEFVAR_LISP ("win32-pass-alt-to-system", &Vwin32_pass_alt_to_system, |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4388 "Non-nil if alt key presses are passed on to Windows.\n\ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4389 When non-nil, for example, alt pressed and released and then space will\n\ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4390 open the System menu. When nil, Emacs silently swallows alt key events."); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4391 Vwin32_pass_alt_to_system = Qnil; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4392 |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4393 DEFVAR_LISP ("win32-pass-optional-keys-to-system", |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4394 &Vwin32_pass_optional_keys_to_system, |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4395 "Non-nil if the 'optional' keys (left window, right window,\n\ |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4396 and application keys) are passed on to Windows."); |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4397 Vwin32_pass_optional_keys_to_system = Qnil; |
4dd6867765b9
(Vwin32_pass_alt_to_system,
Geoff Voelker <voelker@cs.washington.edu>
parents:
14461
diff
changeset
|
4398 |
13434 | 4399 init_x_parm_symbols (); |
4400 | |
4401 DEFVAR_LISP ("x-bitmap-file-path", &Vx_bitmap_file_path, | |
4402 "List of directories to search for bitmap files for win32."); | |
4403 Vx_bitmap_file_path = decode_env_path ((char *) 0, "PATH"); | |
4404 | |
4405 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape, | |
4406 "The shape of the pointer when over text.\n\ | |
4407 Changing the value does not affect existing frames\n\ | |
4408 unless you set the mouse color."); | |
4409 Vx_pointer_shape = Qnil; | |
4410 | |
4411 DEFVAR_LISP ("x-resource-name", &Vx_resource_name, | |
4412 "The name Emacs uses to look up resources; for internal use only.\n\ | |
4413 `x-get-resource' uses this as the first component of the instance name\n\ | |
4414 when requesting resource values.\n\ | |
4415 Emacs initially sets `x-resource-name' to the name under which Emacs\n\ | |
4416 was invoked, or to the value specified with the `-name' or `-rn'\n\ | |
4417 switches, if present."); | |
4418 Vx_resource_name = Qnil; | |
4419 | |
4420 Vx_nontext_pointer_shape = Qnil; | |
4421 | |
4422 Vx_mode_pointer_shape = Qnil; | |
4423 | |
4424 DEFVAR_INT ("x-sensitive-text-pointer-shape", | |
4425 &Vx_sensitive_text_pointer_shape, | |
4426 "The shape of the pointer when over mouse-sensitive text.\n\ | |
4427 This variable takes effect when you create a new frame\n\ | |
4428 or when you set the mouse color."); | |
4429 Vx_sensitive_text_pointer_shape = Qnil; | |
4430 | |
4431 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel, | |
4432 "A string indicating the foreground color of the cursor box."); | |
4433 Vx_cursor_fore_pixel = Qnil; | |
4434 | |
4435 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager, | |
4436 "Non-nil if no window manager is in use.\n\ | |
4437 Emacs doesn't try to figure this out; this is always nil\n\ | |
4438 unless you set it to something else."); | |
4439 /* We don't have any way to find this out, so set it to nil | |
4440 and maybe the user would like to set it to t. */ | |
4441 Vx_no_window_manager = Qnil; | |
4442 | |
4443 defsubr (&Sx_get_resource); | |
4444 defsubr (&Sx_list_fonts); | |
4445 defsubr (&Sx_display_color_p); | |
4446 defsubr (&Sx_display_grayscale_p); | |
4447 defsubr (&Sx_color_defined_p); | |
4448 defsubr (&Sx_color_values); | |
4449 defsubr (&Sx_server_max_request_size); | |
4450 defsubr (&Sx_server_vendor); | |
4451 defsubr (&Sx_server_version); | |
4452 defsubr (&Sx_display_pixel_width); | |
4453 defsubr (&Sx_display_pixel_height); | |
4454 defsubr (&Sx_display_mm_width); | |
4455 defsubr (&Sx_display_mm_height); | |
4456 defsubr (&Sx_display_screens); | |
4457 defsubr (&Sx_display_planes); | |
4458 defsubr (&Sx_display_color_cells); | |
4459 defsubr (&Sx_display_visual_class); | |
4460 defsubr (&Sx_display_backing_store); | |
4461 defsubr (&Sx_display_save_under); | |
4462 defsubr (&Sx_parse_geometry); | |
4463 defsubr (&Sx_create_frame); | |
4464 defsubr (&Sfocus_frame); | |
4465 defsubr (&Sunfocus_frame); | |
4466 defsubr (&Sx_open_connection); | |
4467 defsubr (&Sx_close_connection); | |
4468 defsubr (&Sx_display_list); | |
4469 defsubr (&Sx_synchronize); | |
4470 | |
4471 /* Win32 specific functions */ | |
4472 | |
4473 defsubr (&Swin32_select_font); | |
4474 } | |
4475 | |
4476 #undef abort | |
4477 | |
4478 void | |
4479 win32_abort() | |
4480 { | |
14353 | 4481 MessageBox (NULL, |
4482 "A fatal error has occurred - aborting!", | |
4483 "Emacs Abort Dialog", | |
4484 MB_OK|MB_ICONEXCLAMATION); | |
4485 abort(); | |
13434 | 4486 } |