Mercurial > hg > xemacs-beta
annotate src/frame-msw.c @ 5636:07256dcc0c8b
Add missing foreback specifier values to the GUI Element face.
They were missing for an unexplicable reason in my initial patch, leading to
nil color instances in the whole hierarchy of widget faces.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2012-01-03 Didier Verna <didier@xemacs.org>
* faces.c (complex_vars_of_faces): Add missing foreback specifier
values to the GUI Element face.
author | Didier Verna <didier@lrde.epita.fr> |
---|---|
date | Tue, 03 Jan 2012 11:25:06 +0100 |
parents | 56144c8593a8 |
children | 0f2338afbabf |
rev | line source |
---|---|
428 | 1 /* Functions for the mswindows window system. |
2 Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. | |
5043 | 3 Copyright (C) 1995, 1996, 2001, 2002, 2010 Ben Wing. |
428 | 4 |
5 This file is part of XEmacs. | |
6 | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5191
diff
changeset
|
7 XEmacs is free software: you can redistribute it and/or modify it |
428 | 8 under the terms of the GNU General Public License as published by the |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5191
diff
changeset
|
9 Free Software Foundation, either version 3 of the License, or (at your |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5191
diff
changeset
|
10 option) any later version. |
428 | 11 |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5191
diff
changeset
|
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
428 | 19 |
20 /* Synched up with: Not synched with FSF. */ | |
21 | |
771 | 22 /* This file Mule-ized, 8-14-2000. */ |
23 | |
428 | 24 /* Authorship: |
25 | |
26 Ultimately based on FSF. | |
27 Substantially rewritten for XEmacs by Ben Wing. | |
28 Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0. | |
29 Graphics features added and frame resizing fiddled with by Andy Piper. | |
30 */ | |
31 | |
32 #include <config.h> | |
33 #include "lisp.h" | |
34 | |
35 #include "buffer.h" | |
872 | 36 #include "device-impl.h" |
428 | 37 #include "elhash.h" |
38 #include "events.h" | |
39 #include "faces.h" | |
872 | 40 #include "frame-impl.h" |
428 | 41 #include "redisplay.h" |
42 #include "window.h" | |
43 | |
872 | 44 #include "console-msw-impl.h" |
800 | 45 #include "glyphs-msw.h" |
46 | |
428 | 47 #define MSWINDOWS_FRAME_STYLE (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) |
48 #define MSWINDOWS_POPUP_STYLE (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP \ | |
49 | WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX) | |
50 | |
51 #define MSWINDOWS_FRAME_EXSTYLE WS_EX_OVERLAPPEDWINDOW | |
52 #define MSWINDOWS_POPUP_EXSTYLE WS_EX_PALETTEWINDOW | |
53 | |
54 /* Default popup left top corner offset from the same | |
55 corner of the parent frame, in pixel */ | |
56 #define POPUP_OFFSET 30 | |
57 | |
58 /* Default popup size, in characters */ | |
59 #define POPUP_WIDTH 30 | |
60 #define POPUP_HEIGHT 10 | |
61 | |
793 | 62 /* Default regular frame size, in characters; if too big, it will get |
63 shrunk to the workspace size */ | |
428 | 64 #define DEFAULT_FRAME_WIDTH 80 |
793 | 65 #define DEFAULT_FRAME_HEIGHT 50 |
428 | 66 |
67 #ifdef HAVE_MENUBARS | |
68 #define ADJR_MENUFLAG TRUE | |
69 #else | |
70 #define ADJR_MENUFLAG FALSE | |
71 #endif | |
72 | |
73 /* Default properties to use when creating frames. */ | |
74 Lisp_Object Vdefault_mswindows_frame_plist; | |
440 | 75 Lisp_Object Vdefault_msprinter_frame_plist; |
428 | 76 Lisp_Object Vmswindows_use_system_frame_size_defaults; |
77 | |
78 /* This does not need to be GC protected, as it holds a | |
79 frame Lisp_Object already protected by Fmake_frame */ | |
80 Lisp_Object Vmswindows_frame_being_created; | |
81 | |
1204 | 82 static const struct memory_description mswindows_frame_data_description_1 [] = { |
83 #ifdef HAVE_TOOLBARS | |
84 { XD_LISP_OBJECT, offsetof (struct mswindows_frame, toolbar_hash_table) }, | |
85 #endif | |
86 { XD_LISP_OBJECT, offsetof (struct mswindows_frame, menu_hash_table) }, | |
87 { XD_LISP_OBJECT, offsetof (struct mswindows_frame, widget_hash_table1) }, | |
88 { XD_LISP_OBJECT, offsetof (struct mswindows_frame, widget_hash_table2) }, | |
89 { XD_LISP_OBJECT, offsetof (struct mswindows_frame, widget_hash_table3) }, | |
90 { XD_END } | |
91 }; | |
92 | |
3092 | 93 #ifdef NEW_GC |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
94 DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT ("mswindows-frame", mswindows_frame, |
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
95 0, mswindows_frame_data_description_1, |
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
96 Lisp_Mswindows_Frame); |
3092 | 97 #else /* not NEW_GC */ |
1204 | 98 extern const struct sized_memory_description mswindows_frame_data_description; |
99 | |
100 const struct sized_memory_description mswindows_frame_data_description = { | |
101 sizeof (struct mswindows_frame), mswindows_frame_data_description_1 | |
102 }; | |
3092 | 103 #endif /* not NEW_GC */ |
1204 | 104 |
440 | 105 /*---------------------------------------------------------------------*/ |
106 /*----- DISPLAY FRAME -----*/ | |
107 /*---------------------------------------------------------------------*/ | |
108 | |
3022 | 109 static struct frame * |
110 decode_mswindows_frame (Lisp_Object frame) | |
111 { | |
112 if (NILP (frame)) | |
113 frame = wrap_frame (selected_frame ()); | |
114 CHECK_LIVE_FRAME (frame); | |
115 /* this will also catch dead frames, but putting in the above check | |
116 results in a more useful error */ | |
117 CHECK_MSWINDOWS_FRAME (frame); | |
118 return XFRAME (frame); | |
119 } | |
120 | |
442 | 121 HWND |
122 mswindows_get_selected_frame_hwnd (void) | |
123 { | |
124 Lisp_Object frame, device; | |
125 | |
126 device = Ffind_device (Qnil, Qmswindows); | |
127 if (NILP (device)) | |
128 return NULL; | |
129 frame = DEVICE_SELECTED_FRAME (XDEVICE (device)); | |
130 if (NILP (frame)) | |
131 return NULL; | |
132 | |
133 return FRAME_MSWINDOWS_HANDLE (XFRAME (frame)); | |
134 } | |
135 | |
428 | 136 static void |
771 | 137 mswindows_init_frame_1 (struct frame *f, Lisp_Object props, |
2286 | 138 int UNUSED (frame_name_is_defaulted)) |
428 | 139 { |
140 Lisp_Object initially_unmapped; | |
141 Lisp_Object name, height, width, popup, top, left; | |
142 Lisp_Object frame_obj = Qnil; | |
143 RECT rect; | |
144 XEMACS_RECT_WH rect_default; | |
145 DWORD style, exstyle; | |
146 HWND hwnd, hwnd_parent; | |
147 | |
148 /* Pick up relevant properties */ | |
149 initially_unmapped = Fplist_get (props, Qinitially_unmapped, Qnil); | |
150 name = Fplist_get (props, Qname, Qnil); | |
442 | 151 |
428 | 152 popup = Fplist_get (props, Qpopup, Qnil); |
153 if (EQ (popup, Qt)) | |
154 popup = Fselected_frame (Qnil); | |
155 | |
156 left = Fplist_get (props, Qleft, Qnil); | |
157 if (!NILP (left)) | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
158 CHECK_FIXNUM (left); |
428 | 159 |
160 top = Fplist_get (props, Qtop, Qnil); | |
161 if (!NILP (top)) | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
162 CHECK_FIXNUM (top); |
428 | 163 |
164 width = Fplist_get (props, Qwidth, Qnil); | |
165 if (!NILP (width)) | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
166 CHECK_FIXNUM (width); |
428 | 167 |
168 height = Fplist_get (props, Qheight, Qnil); | |
169 if (!NILP (height)) | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
170 CHECK_FIXNUM (height); |
428 | 171 |
3092 | 172 #ifdef NEW_GC |
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
173 f->frame_data = XMSWINDOWS_FRAME (ALLOC_NORMAL_LISP_OBJECT (mswindows_frame)); |
3092 | 174 #else /* not NEW_GC */ |
428 | 175 f->frame_data = xnew_and_zero (struct mswindows_frame); |
3092 | 176 #endif /* not NEW_GC */ |
428 | 177 FRAME_MSWINDOWS_TARGET_RECT (f) = xnew_and_zero (XEMACS_RECT_WH); |
178 | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
179 FRAME_MSWINDOWS_TARGET_RECT (f)->left = NILP (left) ? -1 : abs (XFIXNUM (left)); |
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
180 FRAME_MSWINDOWS_TARGET_RECT (f)->top = NILP (top) ? -1 : abs (XFIXNUM (top)); |
442 | 181 FRAME_MSWINDOWS_TARGET_RECT (f)->width = NILP (width) ? -1 : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
182 abs (XFIXNUM (width)); |
442 | 183 FRAME_MSWINDOWS_TARGET_RECT (f)->height = NILP (height) ? -1 : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
184 abs (XFIXNUM (height)); |
442 | 185 |
428 | 186 /* Misc frame stuff */ |
771 | 187 FRAME_MSWINDOWS_MENU_HASH_TABLE (f) = Qnil; |
428 | 188 #ifdef HAVE_TOOLBARS |
1130 | 189 /* EQ not EQUAL or we will get QUIT crashes, see below. */ |
771 | 190 FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE (f) = |
5191
71ee43b8a74d
Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API
Aidan Kehoe <kehoea@parhasard.net>
parents:
5127
diff
changeset
|
191 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, Qeq); |
428 | 192 #endif |
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
193 /* hashtable of instantiated glyphs on the frame. [[ Make them EQ because |
1123 | 194 we only use ints as keys. Otherwise we run into stickiness in |
195 redisplay because internal_equal() can QUIT. See | |
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
196 enter_redisplay_critical_section(). ]] -- probably not true any more, |
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
197 now that we have internal_equal_trapping_problems(). --ben */ |
442 | 198 FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f) = |
5191
71ee43b8a74d
Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API
Aidan Kehoe <kehoea@parhasard.net>
parents:
5127
diff
changeset
|
199 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, Qeq); |
442 | 200 FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f) = |
5191
71ee43b8a74d
Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API
Aidan Kehoe <kehoea@parhasard.net>
parents:
5127
diff
changeset
|
201 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, Qeq); |
442 | 202 FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f) = |
5191
71ee43b8a74d
Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API
Aidan Kehoe <kehoea@parhasard.net>
parents:
5127
diff
changeset
|
203 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, Qeq); |
428 | 204 /* Will initialize these in WM_SIZE handler. We cannot do it now, |
205 because we do not know what is CW_USEDEFAULT height and width */ | |
206 FRAME_WIDTH (f) = 0; | |
207 FRAME_HEIGHT (f) = 0; | |
208 FRAME_PIXWIDTH (f) = 0; | |
209 FRAME_PIXHEIGHT (f) = 0; | |
210 | |
211 if (NILP (popup)) | |
212 { | |
213 style = MSWINDOWS_FRAME_STYLE; | |
214 exstyle = MSWINDOWS_FRAME_EXSTYLE; | |
215 hwnd_parent = NULL; | |
216 | |
217 rect_default.left = rect_default.top = CW_USEDEFAULT; | |
218 rect_default.width = rect_default.height = CW_USEDEFAULT; | |
219 } | |
220 else | |
221 { | |
222 style = MSWINDOWS_POPUP_STYLE; | |
223 exstyle = MSWINDOWS_POPUP_EXSTYLE; | |
224 | |
225 CHECK_MSWINDOWS_FRAME (popup); | |
226 hwnd_parent = FRAME_MSWINDOWS_HANDLE (XFRAME (popup)); | |
227 assert (IsWindow (hwnd_parent)); | |
228 | |
229 /* We cannot use CW_USEDEFAULT when creating a popup window. | |
230 So by default, we offset the new popup 30 pixels right | |
231 and down from its parent, and give it size of 30x10 characters. | |
232 These dimensions look adequate on both high and low res monitors */ | |
233 GetWindowRect (hwnd_parent, &rect); | |
234 rect_default.left = rect.left + POPUP_OFFSET; | |
235 rect_default.top = rect.top + POPUP_OFFSET; | |
5043 | 236 char_to_pixel_size (f, POPUP_WIDTH, POPUP_HEIGHT, |
428 | 237 &rect_default.width, &rect_default.height); |
442 | 238 FRAME_MSWINDOWS_POPUP (f) = 1; |
428 | 239 } |
240 | |
771 | 241 AdjustWindowRectEx (&rect, style, ADJR_MENUFLAG, exstyle); |
428 | 242 |
793 | 243 frame_obj = wrap_frame (f); |
428 | 244 |
245 Vmswindows_frame_being_created = frame_obj; | |
771 | 246 { |
247 const Extbyte *nameext = 0; | |
428 | 248 |
771 | 249 if (STRINGP (f->name)) |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4962
diff
changeset
|
250 nameext = LISP_STRING_TO_TSTR (f->name); |
771 | 251 else if (STRINGP (name)) |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4962
diff
changeset
|
252 nameext = LISP_STRING_TO_TSTR (name); |
771 | 253 else |
254 nameext = XETEXT (XEMACS_CLASS); | |
255 hwnd = qxeCreateWindowEx (exstyle, | |
256 XETEXT (XEMACS_CLASS), | |
257 nameext, | |
258 style, | |
259 rect_default.left, rect_default.top, | |
260 rect_default.width, rect_default.height, | |
261 hwnd_parent, NULL, NULL, NULL); | |
262 } | |
428 | 263 |
264 Vmswindows_frame_being_created = Qnil; | |
265 | |
266 if (hwnd == NULL) | |
442 | 267 invalid_operation ("System call to create frame failed", |
268 STRINGP (f->name) ? f->name : | |
269 STRINGP (name) ? name : | |
270 Qunbound); | |
771 | 271 |
272 FRAME_MSWINDOWS_HANDLE (f) = hwnd; | |
428 | 273 |
5013 | 274 qxeSetWindowLong (hwnd, XWL_FRAMEOBJ, (LONG)STORE_LISP_IN_VOID (frame_obj)); |
771 | 275 FRAME_MSWINDOWS_DC (f) = GetDC (hwnd); |
276 SetTextAlign (FRAME_MSWINDOWS_DC (f), TA_BASELINE | TA_LEFT | TA_NOUPDATECP); | |
442 | 277 |
771 | 278 #ifdef HAVE_DIALOGS |
442 | 279 if (FRAME_MSWINDOWS_POPUP (f)) |
280 mswindows_register_popup_frame (frame_obj); | |
771 | 281 #endif /* HAVE_DIALOGS */ |
428 | 282 } |
283 | |
284 static void | |
2286 | 285 mswindows_init_frame_2 (struct frame *f, Lisp_Object UNUSED (props)) |
428 | 286 { |
287 if (NILP (Vmswindows_use_system_frame_size_defaults)) | |
288 { | |
289 /* I don't think anything can set the frame size before this | |
290 since we don't have X resources. This may change if we look | |
291 at the registry. Even so these values can get overridden | |
292 later.*/ | |
442 | 293 XEMACS_RECT_WH dest = { -1, -1, DEFAULT_FRAME_WIDTH, |
428 | 294 DEFAULT_FRAME_HEIGHT }; |
295 mswindows_size_frame_internal (f, &dest); | |
296 } | |
297 } | |
298 | |
299 /* Called after frame's properties are set */ | |
300 static void | |
301 mswindows_init_frame_3 (struct frame *f) | |
302 { | |
4139 | 303 /* Don't do this earlier or we get a WM_PAINT before the frame is ready. */ |
304 ShowWindow (FRAME_MSWINDOWS_HANDLE(f), SW_SHOWNORMAL); | |
305 #ifdef CYGWIN | |
306 /* The SW_x parameter in the first call that an app makes to ShowWindow is | |
307 * ignored, and the parameter specified in the caller's STARTUPINFO is | |
308 * substituted instead. That parameter is SW_HIDE if we were started by | |
309 * runemacs, so call this twice. #### runemacs is evil. To see why this | |
310 * second call was restored, see the threads referenced by | |
311 * 20a807210611011157j57ea2b22ue892f4dfcb6aade8@mail.gmail.com and | |
312 * 20a807210708181345m7ac94ff2m43337be71e853d95@mail.gmail.com . */ | |
313 ShowWindow (FRAME_MSWINDOWS_HANDLE(f), SW_SHOWNORMAL); | |
314 #endif | |
315 SetForegroundWindow (FRAME_MSWINDOWS_HANDLE(f)); | |
316 DragAcceptFiles (FRAME_MSWINDOWS_HANDLE(f), TRUE); | |
428 | 317 } |
318 | |
319 static void | |
2286 | 320 mswindows_after_init_frame (struct frame *UNUSED (f), |
321 int UNUSED (first_on_device), int first_on_console) | |
428 | 322 { |
323 /* Windows, unlike X, is very synchronous. After the initial | |
442 | 324 frame is created, it will never be displayed, except for |
428 | 325 hollow border, unless we start pumping messages. Load progress |
326 messages show in the bottom of the hollow frame, which is ugly. | |
327 We redisplay the initial frame here, so modeline and root window | |
328 background show. | |
329 */ | |
330 if (first_on_console) | |
331 redisplay (); | |
332 } | |
333 | |
334 static void | |
335 mswindows_mark_frame (struct frame *f) | |
336 { | |
337 mark_object (FRAME_MSWINDOWS_MENU_HASH_TABLE (f)); | |
338 #ifdef HAVE_TOOLBARS | |
339 mark_object (FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE (f)); | |
340 #endif | |
442 | 341 mark_object (FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f)); |
342 mark_object (FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f)); | |
343 mark_object (FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f)); | |
428 | 344 } |
345 | |
346 static void | |
347 mswindows_focus_on_frame (struct frame *f) | |
348 { | |
771 | 349 SetForegroundWindow (FRAME_MSWINDOWS_HANDLE (f)); |
428 | 350 } |
351 | |
352 static void | |
353 mswindows_delete_frame (struct frame *f) | |
354 { | |
355 if (f->frame_data) | |
356 { | |
771 | 357 #ifdef HAVE_DIALOGS |
358 mswindows_unregister_popup_frame (wrap_frame (f)); | |
359 #endif | |
360 ReleaseDC (FRAME_MSWINDOWS_HANDLE (f), FRAME_MSWINDOWS_DC (f)); | |
361 DestroyWindow (FRAME_MSWINDOWS_HANDLE (f)); | |
4117 | 362 #ifndef NEW_GC |
4976
16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents:
4962
diff
changeset
|
363 xfree (f->frame_data); |
3092 | 364 #endif /* not NEW_GC */ |
428 | 365 } |
366 f->frame_data = 0; | |
367 } | |
368 | |
369 static void | |
370 mswindows_set_frame_size (struct frame *f, int width, int height) | |
371 { | |
372 RECT rect; | |
5043 | 373 int pwidth, pheight; |
374 | |
375 change_frame_size (f, width, height, 0); | |
376 frame_unit_to_pixel_size (f, width, height, &pwidth, &pheight); | |
1395 | 377 |
428 | 378 rect.left = rect.top = 0; |
5043 | 379 rect.right = pwidth; |
380 rect.bottom = pheight; | |
1395 | 381 |
1318 | 382 /* This can call Lisp, because it runs the window procedure, which can |
383 call redisplay() */ | |
428 | 384 AdjustWindowRectEx (&rect, |
771 | 385 qxeGetWindowLong (FRAME_MSWINDOWS_HANDLE (f), GWL_STYLE), |
386 GetMenu (FRAME_MSWINDOWS_HANDLE (f)) != NULL, | |
387 qxeGetWindowLong (FRAME_MSWINDOWS_HANDLE (f), GWL_EXSTYLE)); | |
428 | 388 |
2872 | 389 if (IsIconic (FRAME_MSWINDOWS_HANDLE (f))) |
771 | 390 ShowWindow (FRAME_MSWINDOWS_HANDLE (f), SW_RESTORE); |
428 | 391 |
771 | 392 SetWindowPos (FRAME_MSWINDOWS_HANDLE (f), NULL, |
428 | 393 0, 0, rect.right-rect.left, rect.bottom-rect.top, |
394 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSENDCHANGING | SWP_NOMOVE); | |
395 } | |
396 | |
397 static void | |
398 mswindows_set_frame_position (struct frame *f, int xoff, int yoff) | |
399 { | |
771 | 400 SetWindowPos (FRAME_MSWINDOWS_HANDLE (f), NULL, |
428 | 401 xoff, yoff, 0, 0, |
402 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSENDCHANGING | SWP_NOSIZE); | |
403 } | |
404 | |
405 static void | |
442 | 406 mswindows_make_frame_visible (struct frame *f) |
428 | 407 { |
771 | 408 if (!FRAME_VISIBLE_P (f)) |
409 ShowWindow (FRAME_MSWINDOWS_HANDLE (f), SW_RESTORE); | |
428 | 410 else |
771 | 411 ShowWindow (FRAME_MSWINDOWS_HANDLE (f), SW_SHOW); |
412 SetActiveWindow (FRAME_MSWINDOWS_HANDLE (f)); | |
428 | 413 f->visible = 1; |
414 f->iconified = 0; | |
415 } | |
416 | |
417 static void | |
442 | 418 mswindows_make_frame_invisible (struct frame *f) |
428 | 419 { |
771 | 420 if (!FRAME_VISIBLE_P (f)) |
428 | 421 return; |
422 | |
771 | 423 ShowWindow (FRAME_MSWINDOWS_HANDLE (f), SW_HIDE); |
428 | 424 f->visible = 0; |
425 } | |
426 | |
427 static int | |
428 mswindows_frame_totally_visible_p (struct frame *f) | |
429 { | |
430 RECT rc_me, rc_other, rc_temp; | |
771 | 431 HWND hwnd = FRAME_MSWINDOWS_HANDLE (f); |
428 | 432 |
433 /* We test against not a whole window rectangle, only against its | |
434 client part. So, if non-client are is covered and client area is | |
435 not, we return true. */ | |
436 GetClientRect (hwnd, &rc_me); | |
2367 | 437 MapWindowPoints (hwnd, HWND_DESKTOP, (LPPOINT) (void *) (&rc_me), 2); |
428 | 438 |
439 /* First see if we're off the desktop */ | |
771 | 440 GetWindowRect (GetDesktopWindow (), &rc_other); |
441 UnionRect (&rc_temp, &rc_me, &rc_other); | |
428 | 442 if (!EqualRect (&rc_temp, &rc_other)) |
443 return 0; | |
442 | 444 |
428 | 445 /* Then see if any window above us obscures us */ |
446 while ((hwnd = GetWindow (hwnd, GW_HWNDPREV)) != NULL) | |
447 if (IsWindowVisible (hwnd)) | |
448 { | |
449 GetWindowRect (hwnd, &rc_other); | |
771 | 450 if (IntersectRect (&rc_temp, &rc_me, &rc_other)) |
428 | 451 return 0; |
452 } | |
453 | |
454 return 1; | |
455 } | |
456 | |
457 static int | |
458 mswindows_frame_visible_p (struct frame *f) | |
459 { | |
771 | 460 return IsWindowVisible (FRAME_MSWINDOWS_HANDLE (f)) |
461 && !IsIconic (FRAME_MSWINDOWS_HANDLE (f)); | |
428 | 462 } |
463 | |
464 | |
465 static void | |
466 mswindows_iconify_frame (struct frame *f) | |
467 { | |
771 | 468 ShowWindow (FRAME_MSWINDOWS_HANDLE (f), SW_MINIMIZE); |
428 | 469 f->visible = 0; |
470 f->iconified = 1; | |
471 } | |
472 | |
473 static int | |
474 mswindows_frame_iconified_p (struct frame *f) | |
475 { | |
771 | 476 return IsIconic (FRAME_MSWINDOWS_HANDLE (f)); |
428 | 477 } |
478 | |
479 static void | |
480 mswindows_set_frame_icon (struct frame *f) | |
481 { | |
482 if (IMAGE_INSTANCEP (f->icon) | |
483 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (f->icon))) | |
484 { | |
485 if (!XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)) | |
486 { | |
442 | 487 mswindows_initialize_image_instance_icon (XIMAGE_INSTANCE (f->icon), |
428 | 488 FALSE); |
489 } | |
442 | 490 |
771 | 491 qxeSetClassLong (FRAME_MSWINDOWS_HANDLE (f), GCL_HICON, |
492 (LONG) XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)); | |
428 | 493 } |
494 } | |
495 | |
496 static void | |
497 mswindows_set_frame_pointer (struct frame *f) | |
498 { | |
499 if (IMAGE_INSTANCEP (f->pointer) | |
500 && IMAGE_INSTANCE_TYPE (XIMAGE_INSTANCE (f->pointer)) == IMAGE_POINTER) | |
501 { | |
771 | 502 qxeSetClassLong (FRAME_MSWINDOWS_HANDLE (f), GCL_HCURSOR, |
503 (LONG) XIMAGE_INSTANCE_MSWINDOWS_ICON (f->pointer)); | |
428 | 504 /* we only have to do this because GC doesn't cause a mouse |
505 event and doesn't give time to event processing even if it | |
506 did. */ | |
507 SetCursor (XIMAGE_INSTANCE_MSWINDOWS_ICON (f->pointer)); | |
508 } | |
509 } | |
510 | |
511 static void | |
512 mswindows_set_mouse_position (struct window *w, int x, int y) | |
513 { | |
514 struct frame *f = XFRAME (w->frame); | |
515 POINT pt; | |
516 | |
517 pt.x = w->pixel_left + x; | |
518 pt.y = w->pixel_top + y; | |
771 | 519 ClientToScreen (FRAME_MSWINDOWS_HANDLE (f), &pt); |
428 | 520 SetCursorPos (pt.x, pt.y); |
521 } | |
522 | |
523 static int | |
2286 | 524 mswindows_get_mouse_position (struct device *UNUSED (d), Lisp_Object *frame, |
525 int *x, int *y) | |
428 | 526 { |
527 POINT pt; | |
528 HWND hwnd; | |
529 | |
530 GetCursorPos (&pt); | |
531 | |
532 /* What's under cursor? */ | |
533 hwnd = WindowFromPoint (pt); | |
534 if (hwnd == NULL) | |
535 return 0; | |
536 | |
537 /* Get grandest parent of the window */ | |
538 { | |
539 HWND hwnd_parent; | |
540 while ((hwnd_parent = GetParent (hwnd)) != NULL) | |
541 hwnd = hwnd_parent; | |
542 } | |
543 | |
544 /* Make sure it belongs to us */ | |
545 if (GetWindowThreadProcessId (hwnd, NULL) != GetCurrentThreadId ()) | |
546 return 0; | |
547 | |
548 /* And that the window is an XEmacs frame */ | |
771 | 549 if (!mswindows_window_is_xemacs (hwnd)) |
550 return 0; | |
428 | 551 |
552 /* Yippie! */ | |
553 ScreenToClient (hwnd, &pt); | |
5013 | 554 *frame = GET_LISP_FROM_VOID ((void *) qxeGetWindowLong (hwnd, XWL_FRAMEOBJ)); |
428 | 555 *x = pt.x; |
556 *y = pt.y; | |
557 return 1; | |
558 } | |
559 | |
560 static void | |
561 mswindows_raise_frame (struct frame *f) | |
562 { | |
771 | 563 BringWindowToTop (FRAME_MSWINDOWS_HANDLE (f)); |
428 | 564 } |
565 | |
566 static void | |
567 mswindows_lower_frame (struct frame *f) | |
568 { | |
771 | 569 SetWindowPos (FRAME_MSWINDOWS_HANDLE (f), HWND_BOTTOM, 0, 0, 0, 0, |
428 | 570 SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING); |
571 } | |
572 | |
573 static void | |
442 | 574 mswindows_enable_frame (struct frame *f) |
575 { | |
576 EnableWindow (FRAME_MSWINDOWS_HANDLE (f), TRUE); | |
577 } | |
578 | |
579 static void | |
580 mswindows_disable_frame (struct frame *f) | |
581 { | |
582 EnableWindow (FRAME_MSWINDOWS_HANDLE (f), FALSE); | |
583 } | |
584 | |
585 static void | |
867 | 586 mswindows_set_title_from_ibyte (struct frame *f, Ibyte *title) |
428 | 587 { |
771 | 588 unsigned int new_checksum = hash_string (title, qxestrlen (title)); |
593 | 589 if (new_checksum != FRAME_MSWINDOWS_TITLE_CHECKSUM (f)) |
428 | 590 { |
593 | 591 Extbyte *title_ext; |
592 | |
593 FRAME_MSWINDOWS_TITLE_CHECKSUM (f) = new_checksum; | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4962
diff
changeset
|
594 title_ext = ITEXT_TO_TSTR (title); |
771 | 595 qxeSetWindowText (FRAME_MSWINDOWS_HANDLE (f), title_ext); |
428 | 596 } |
597 } | |
598 | |
599 static Lisp_Object | |
3022 | 600 mswindows_window_id (Lisp_Object frame) |
601 { | |
602 Ibyte str[255]; | |
603 struct frame *f = decode_mswindows_frame (frame); | |
604 | |
3023 | 605 qxesprintf (str, "%lu", (unsigned long) FRAME_MSWINDOWS_HANDLE (f)); |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
606 return build_istring (str); |
3022 | 607 } |
608 | |
609 static Lisp_Object | |
428 | 610 mswindows_frame_property (struct frame *f, Lisp_Object property) |
611 { | |
612 if (EQ (Qleft, property) || EQ (Qtop, property)) | |
613 { | |
614 RECT rc; | |
771 | 615 GetWindowRect (FRAME_MSWINDOWS_HANDLE (f), &rc); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
616 return make_fixnum (EQ (Qtop, property) ? rc.top : rc.left); |
428 | 617 } |
3022 | 618 if (EQ (Qwindow_id, property)) |
619 return mswindows_window_id (wrap_frame (f)); | |
620 | |
428 | 621 return Qunbound; |
622 } | |
623 | |
624 static int | |
2286 | 625 mswindows_internal_frame_property_p (struct frame *UNUSED (f), |
626 Lisp_Object property) | |
428 | 627 { |
628 return EQ (property, Qleft) | |
3022 | 629 || EQ (property, Qtop) |
630 || EQ (property, Qwindow_id); | |
428 | 631 /* #### frame-x.c has also this. Why? |
632 || STRINGP (property); | |
633 */ | |
634 } | |
635 | |
636 static Lisp_Object | |
637 mswindows_frame_properties (struct frame *f) | |
638 { | |
639 Lisp_Object props = Qnil; | |
640 RECT rc; | |
771 | 641 GetWindowRect (FRAME_MSWINDOWS_HANDLE (f), &rc); |
428 | 642 |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
643 props = cons3 (Qtop, make_fixnum (rc.top), props); |
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
644 props = cons3 (Qleft, make_fixnum (rc.left), props); |
3022 | 645 props = cons3 (Qwindow_id, mswindows_window_id (wrap_frame (f)), props); |
428 | 646 |
647 return props; | |
648 } | |
649 | |
650 static void | |
651 mswindows_set_frame_properties (struct frame *f, Lisp_Object plist) | |
652 { | |
653 int x=-1, y=-1; | |
654 int width = -1, height = -1; | |
655 BOOL width_specified_p = FALSE; | |
656 BOOL height_specified_p = FALSE; | |
657 BOOL x_specified_p = FALSE; | |
658 BOOL y_specified_p = FALSE; | |
659 Lisp_Object tail; | |
660 | |
661 /* Extract the properties from plist */ | |
662 for (tail = plist; !NILP (tail); tail = Fcdr (Fcdr (tail))) | |
663 { | |
664 Lisp_Object prop = Fcar (tail); | |
665 Lisp_Object val = Fcar (Fcdr (tail)); | |
666 | |
667 if (SYMBOLP (prop)) | |
668 { | |
669 /* Kludge to handle the font property. */ | |
670 if (EQ (prop, Qfont)) | |
671 { | |
672 /* If the value is not a string we silently ignore it. */ | |
673 if (STRINGP (val)) | |
674 { | |
675 Lisp_Object frm, font_spec; | |
442 | 676 |
793 | 677 frm = wrap_frame (f); |
428 | 678 font_spec = Fget (Fget_face (Qdefault), Qfont, Qnil); |
679 | |
680 Fadd_spec_to_specifier (font_spec, val, frm, Qnil, Qnil); | |
681 update_frame_face_values (f); | |
682 } | |
683 } | |
684 else if (EQ (prop, Qwidth)) | |
685 { | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
686 CHECK_FIXNUM (val); |
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
687 width = XFIXNUM (val); |
428 | 688 width_specified_p = TRUE; |
689 } | |
690 else if (EQ (prop, Qheight)) | |
691 { | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
692 CHECK_FIXNUM (val); |
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
693 height = XFIXNUM (val); |
428 | 694 height_specified_p = TRUE; |
695 } | |
696 else if (EQ (prop, Qleft)) | |
697 { | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
698 CHECK_FIXNUM (val); |
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
699 x = XFIXNUM (val); |
428 | 700 x_specified_p = TRUE; |
701 } | |
702 else if (EQ (prop, Qtop)) | |
703 { | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
704 CHECK_FIXNUM (val); |
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
705 y = XFIXNUM (val); |
428 | 706 y_specified_p = TRUE; |
707 } | |
708 } | |
709 } | |
710 | |
711 /* Now we've extracted the properties, apply them. | |
712 Do not apply geometric properties during frame creation. This | |
442 | 713 is excessive anyways, and this loses because WM_SIZE has not |
428 | 714 been sent yet, so frame width and height fields are not initialized. |
442 | 715 |
428 | 716 unfortunately WM_SIZE loses as well since the resize is only |
717 applied once and the first time WM_SIZE is applied not everything | |
718 is initialised in the frame (toolbars for instance). enabling | |
719 this always makes no visible difference and fixes a whole host of | |
720 bugs (and is more consistent with X) so I am going to reenable it. | |
721 --andyp */ | |
722 if ( FRAME_PIXWIDTH (f) && FRAME_PIXHEIGHT (f) | |
440 | 723 && (width_specified_p || height_specified_p |
724 || x_specified_p || y_specified_p)) | |
428 | 725 { |
726 XEMACS_RECT_WH dest = { x, y, width, height }; | |
727 | |
728 mswindows_size_frame_internal (f, &dest); | |
729 } | |
730 } | |
731 | |
506 | 732 void |
771 | 733 mswindows_size_frame_internal (struct frame *f, XEMACS_RECT_WH *dest) |
428 | 734 { |
442 | 735 RECT rect, ws_rect; |
428 | 736 int pixel_width, pixel_height; |
737 int size_p = (dest->width >=0 || dest->height >=0); | |
738 int move_p = (dest->top >=0 || dest->left >=0); | |
5043 | 739 char_to_pixel_size (f, dest->width, dest->height, &pixel_width, |
506 | 740 &pixel_height); |
442 | 741 |
428 | 742 if (dest->width < 0) |
743 pixel_width = FRAME_PIXWIDTH (f); | |
744 if (dest->height < 0) | |
745 pixel_height = FRAME_PIXHEIGHT (f); | |
746 | |
771 | 747 GetWindowRect (FRAME_MSWINDOWS_HANDLE (f), &rect); |
428 | 748 if (dest->left < 0) |
749 dest->left = rect.left; | |
750 if (dest->top < 0) | |
751 dest->top = rect.top; | |
442 | 752 |
428 | 753 rect.left = rect.top = 0; |
754 rect.right = pixel_width; | |
755 rect.bottom = pixel_height; | |
756 | |
757 AdjustWindowRectEx (&rect, | |
771 | 758 qxeGetWindowLong (FRAME_MSWINDOWS_HANDLE (f), GWL_STYLE), |
759 GetMenu (FRAME_MSWINDOWS_HANDLE (f)) != NULL, | |
760 qxeGetWindowLong (FRAME_MSWINDOWS_HANDLE (f), GWL_EXSTYLE)); | |
428 | 761 |
442 | 762 /* resize and move the window so that it fits in the workspace. This is |
428 | 763 not restrictive since this will happen later anyway in WM_SIZE. We |
764 have to do this after adjusting the rect to account for menubar | |
765 etc. */ | |
442 | 766 mswindows_get_workspace_coords (&ws_rect); |
428 | 767 pixel_width = rect.right - rect.left; |
768 pixel_height = rect.bottom - rect.top; | |
442 | 769 if (pixel_width > ws_rect.right - ws_rect.left) |
428 | 770 { |
442 | 771 pixel_width = ws_rect.right - ws_rect.left; |
428 | 772 size_p=1; |
773 } | |
442 | 774 if (pixel_height > ws_rect.bottom - ws_rect.top) |
428 | 775 { |
442 | 776 pixel_height = ws_rect.bottom - ws_rect.top; |
428 | 777 size_p=1; |
778 } | |
779 | |
442 | 780 /* adjust position so window is in workspace */ |
781 if (dest->left + pixel_width > ws_rect.right) | |
428 | 782 { |
442 | 783 dest->left = ws_rect.right - pixel_width; |
428 | 784 move_p=1; |
785 } | |
442 | 786 if (dest->left < ws_rect.left) |
428 | 787 { |
442 | 788 dest->left = ws_rect.left; |
428 | 789 move_p=1; |
790 } | |
791 | |
442 | 792 if (dest->top + pixel_height > ws_rect.bottom) |
793 { | |
794 dest->top = ws_rect.bottom - pixel_height; | |
795 move_p=1; | |
796 } | |
797 if (dest->top < ws_rect.top) | |
798 { | |
799 dest->top = ws_rect.top; | |
800 move_p=1; | |
801 } | |
802 | |
771 | 803 if (IsIconic (FRAME_MSWINDOWS_HANDLE (f)) |
804 || IsZoomed (FRAME_MSWINDOWS_HANDLE (f))) | |
805 ShowWindow (FRAME_MSWINDOWS_HANDLE (f), SW_RESTORE); | |
428 | 806 |
771 | 807 SetWindowPos (FRAME_MSWINDOWS_HANDLE (f), NULL, |
428 | 808 dest->left, dest->top, pixel_width, pixel_height, |
809 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSENDCHANGING | |
810 | (size_p ? 0 : SWP_NOSIZE) | |
811 | (move_p ? 0 : SWP_NOMOVE)); | |
812 } | |
813 | |
814 static Lisp_Object | |
815 mswindows_get_frame_parent (struct frame *f) | |
816 { | |
771 | 817 HWND hwnd = FRAME_MSWINDOWS_HANDLE (f); |
428 | 818 hwnd = GetParent (hwnd); |
819 if (hwnd) | |
820 { | |
821 Lisp_Object parent; | |
5013 | 822 parent = GET_LISP_FROM_VOID ((void *) qxeGetWindowLong (hwnd, XWL_FRAMEOBJ)); |
428 | 823 assert (FRAME_MSWINDOWS_P (XFRAME (parent))); |
824 return parent; | |
825 } | |
826 else | |
827 return Qnil; | |
828 } | |
829 | |
830 static void | |
2286 | 831 mswindows_update_frame_external_traits (struct frame *UNUSED (frm), |
832 Lisp_Object UNUSED (name)) | |
428 | 833 { |
834 } | |
835 | |
836 static int | |
837 mswindows_frame_size_fixed_p (struct frame *f) | |
838 { | |
839 /* Frame size cannot change if the frame is maximized */ | |
840 return IsZoomed (FRAME_MSWINDOWS_HANDLE (f)); | |
841 } | |
842 | |
440 | 843 /*---------------------------------------------------------------------*/ |
844 /*----- PRINTER FRAME -----*/ | |
845 /*---------------------------------------------------------------------*/ | |
846 | |
442 | 847 /* |
848 * With some driver/os combination (I discovered this with HP drivers | |
849 * under W2K), DC geometry is reset upon StartDoc and EndPage | |
850 * calls. This is called every time one of these calls is made. | |
851 */ | |
852 static void | |
853 apply_dc_geometry (struct frame* f) | |
854 { | |
855 HDC hdc = DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f))); | |
856 SetTextAlign (hdc, TA_BASELINE | TA_LEFT | TA_NOUPDATECP); | |
857 SetViewportOrgEx (hdc, FRAME_MSPRINTER_PIXLEFT(f), | |
858 FRAME_MSPRINTER_PIXTOP(f), NULL); | |
859 } | |
860 | |
861 void | |
862 msprinter_start_page (struct frame *f) | |
863 { | |
864 if (!FRAME_MSPRINTER_PAGE_STARTED (f)) | |
865 { | |
866 FRAME_MSPRINTER_PAGE_STARTED (f) = 1; | |
867 StartPage (DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f)))); | |
868 apply_dc_geometry (f); | |
869 } | |
870 } | |
440 | 871 |
872 static void | |
873 error_frame_unsizable (struct frame *f) | |
874 { | |
793 | 875 Lisp_Object frame = wrap_frame (f); |
876 | |
442 | 877 invalid_change ("Cannot resize frame (margins) after print job has started.", |
878 frame); | |
440 | 879 } |
880 | |
881 static void | |
882 maybe_error_if_job_active (struct frame *f) | |
883 { | |
884 if (FRAME_MSPRINTER_JOB_STARTED (f)) | |
885 error_frame_unsizable (f); | |
886 } | |
887 | |
888 static void | |
2286 | 889 msprinter_init_frame_1 (struct frame *f, Lisp_Object UNUSED (props), |
890 int UNUSED (frame_name_is_defaulted)) | |
440 | 891 { |
892 /* Make sure this is the only frame on device. Windows printer can | |
893 handle only one job at a time. */ | |
894 if (!NILP (DEVICE_FRAME_LIST (XDEVICE (FRAME_DEVICE (f))))) | |
442 | 895 invalid_operation ("Only one frame (print job) at a time is allowed on " |
896 "this printer device", FRAME_DEVICE (f)); | |
440 | 897 |
898 f->frame_data = xnew_and_zero (struct msprinter_frame); | |
899 | |
506 | 900 FRAME_MSPRINTER_TOP_MARGIN (f) = |
901 mswindows_get_default_margin (Qtop_margin); | |
902 FRAME_MSPRINTER_BOTTOM_MARGIN (f) = | |
903 mswindows_get_default_margin (Qbottom_margin); | |
904 FRAME_MSPRINTER_LEFT_MARGIN (f) = | |
905 mswindows_get_default_margin (Qleft_margin); | |
906 FRAME_MSPRINTER_RIGHT_MARGIN (f) = | |
907 mswindows_get_default_margin (Qright_margin); | |
440 | 908 |
909 /* Negative for "uinspecified" */ | |
506 | 910 FRAME_MSPRINTER_CHARWIDTH (f) = -1; |
911 FRAME_MSPRINTER_CHARHEIGHT (f) = -1; | |
440 | 912 } |
913 | |
914 static void | |
915 msprinter_init_frame_3 (struct frame *f) | |
916 { | |
771 | 917 DOCINFOW di; |
440 | 918 struct device *device = XDEVICE (FRAME_DEVICE (f)); |
919 int frame_left, frame_top, frame_width, frame_height; | |
903 | 920 |
442 | 921 /* DC might be recreated in msprinter_apply_devmode, |
922 so do not initialize until now */ | |
903 | 923 HDC hdc = DEVICE_MSPRINTER_HDC (device); |
924 int logpixelsx = GetDeviceCaps (hdc, LOGPIXELSX); | |
925 int logpixelsy = GetDeviceCaps (hdc, LOGPIXELSY); | |
926 int physicaloffsetx = GetDeviceCaps (hdc, PHYSICALOFFSETX); | |
927 int physicaloffsety = GetDeviceCaps (hdc, PHYSICALOFFSETY); | |
928 int physicalheight = GetDeviceCaps (hdc, PHYSICALHEIGHT); | |
929 int physicalwidth = GetDeviceCaps (hdc, PHYSICALWIDTH); | |
440 | 930 |
903 | 931 /* Compute geometry properties. |
932 Conversion is from TWIPS -> inches -> pixels. */ | |
933 frame_left = MulDiv (logpixelsx, FRAME_MSPRINTER_LEFT_MARGIN(f), 1440) | |
934 - physicaloffsetx; | |
935 | |
771 | 936 if (FRAME_MSPRINTER_CHARWIDTH (f) > 0) |
440 | 937 { |
5043 | 938 char_to_pixel_size (f, FRAME_MSPRINTER_CHARWIDTH (f), 0, |
440 | 939 &frame_width, NULL); |
903 | 940 FRAME_MSPRINTER_RIGHT_MARGIN(f) = |
941 MulDiv (physicalwidth - (frame_left + frame_width), 1440, | |
942 logpixelsx); | |
442 | 943 } |
440 | 944 else |
903 | 945 frame_width = physicalwidth - frame_left |
946 - MulDiv (logpixelsx, FRAME_MSPRINTER_RIGHT_MARGIN(f), 1440) | |
947 - physicaloffsetx; | |
440 | 948 |
903 | 949 frame_top = MulDiv (logpixelsy, FRAME_MSPRINTER_TOP_MARGIN(f), 1440) |
950 - physicaloffsety; | |
440 | 951 |
771 | 952 if (FRAME_MSPRINTER_CHARHEIGHT (f) > 0) |
440 | 953 { |
5043 | 954 char_to_pixel_size (f, 0, FRAME_MSPRINTER_CHARHEIGHT (f), |
440 | 955 NULL, &frame_height); |
956 | |
903 | 957 FRAME_MSPRINTER_BOTTOM_MARGIN(f) = |
958 MulDiv (physicalheight - (frame_top + frame_height), 1440, | |
959 logpixelsy); | |
442 | 960 } |
440 | 961 else |
903 | 962 frame_height = physicalheight - frame_top |
963 - MulDiv (logpixelsy, FRAME_MSPRINTER_BOTTOM_MARGIN(f), 1440) | |
964 - physicaloffsety; | |
440 | 965 |
966 /* Geometry sanity checks */ | |
967 if (!frame_pixsize_valid_p (f, frame_width, frame_height)) | |
442 | 968 invalid_operation ("Area inside print margins has shrunk to naught", |
969 STRINGP (f->name) ? f->name : Qunbound); | |
440 | 970 |
971 if (frame_left < 0 | |
972 || frame_top < 0 | |
973 || frame_left + frame_width > GetDeviceCaps (hdc, HORZRES) | |
974 || frame_top + frame_height > GetDeviceCaps (hdc, VERTRES)) | |
546 | 975 invalid_operation ("Print area is outside of the printer's " |
442 | 976 "hardware printable area", |
977 STRINGP (f->name) ? f->name : Qunbound); | |
440 | 978 |
979 /* Apply XEmacs frame geometry and layout windows */ | |
980 { | |
981 int rows, columns; | |
771 | 982 FRAME_PIXWIDTH (f) = frame_width; |
983 FRAME_PIXHEIGHT (f) = frame_height; | |
5043 | 984 pixel_to_frame_unit_size (f, frame_width, frame_height, &columns, &rows); |
985 change_frame_size (f, columns, rows, 0); | |
440 | 986 } |
987 | |
442 | 988 FRAME_MSPRINTER_PIXLEFT(f) = frame_left; |
989 FRAME_MSPRINTER_PIXTOP(f) = frame_top; | |
440 | 990 |
991 /* Start print job */ | |
992 di.cbSize = sizeof (di); | |
771 | 993 { |
994 const Extbyte *nameext; | |
995 | |
996 if (STRINGP (f->name)) | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4962
diff
changeset
|
997 nameext = LISP_STRING_TO_TSTR (f->name); |
771 | 998 else |
999 nameext = XETEXT ("XEmacs print document"); | |
1000 di.lpszDocName = (XELPTSTR) nameext; | |
1001 } | |
440 | 1002 di.lpszOutput = NULL; |
1003 di.lpszDatatype = NULL; | |
1004 di.fwType = 0; | |
1005 | |
771 | 1006 if (qxeStartDoc (hdc, &di) <= 0) |
442 | 1007 invalid_operation ("Cannot start print job", |
1008 STRINGP (f->name) ? f->name : Qunbound); | |
1009 | |
1010 apply_dc_geometry (f); | |
440 | 1011 |
1012 /* Finish frame setup */ | |
1013 FRAME_MSPRINTER_JOB_STARTED (f) = 1; | |
771 | 1014 FRAME_VISIBLE_P (f) = 0; |
440 | 1015 } |
1016 | |
1017 static void | |
2286 | 1018 msprinter_mark_frame (struct frame *UNUSED (f)) |
440 | 1019 { |
1020 } | |
1021 | |
1022 static void | |
1023 msprinter_delete_frame (struct frame *f) | |
1024 { | |
1025 if (f->frame_data) | |
1026 { | |
442 | 1027 HDC hdc = DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f))); |
1028 if (FRAME_MSPRINTER_PAGE_STARTED (f)) | |
1029 EndPage (hdc); | |
440 | 1030 if (FRAME_MSPRINTER_JOB_STARTED (f)) |
442 | 1031 EndDoc (hdc); |
4976
16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents:
4962
diff
changeset
|
1032 xfree (f->frame_data); |
440 | 1033 } |
1034 | |
1035 f->frame_data = 0; | |
1036 } | |
1037 | |
1038 static Lisp_Object | |
1039 msprinter_frame_property (struct frame *f, Lisp_Object property) | |
1040 { | |
1041 if (EQ (Qleft_margin, property)) | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1042 return make_fixnum (FRAME_MSPRINTER_LEFT_MARGIN (f)); |
440 | 1043 else if (EQ (Qtop_margin, property)) |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1044 return make_fixnum (FRAME_MSPRINTER_TOP_MARGIN (f)); |
440 | 1045 if (EQ (Qright_margin, property)) |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1046 return make_fixnum (FRAME_MSPRINTER_RIGHT_MARGIN (f)); |
440 | 1047 else if (EQ (Qbottom_margin, property)) |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1048 return make_fixnum (FRAME_MSPRINTER_BOTTOM_MARGIN (f)); |
440 | 1049 else |
1050 return Qunbound; | |
1051 } | |
1052 | |
1053 static int | |
2286 | 1054 msprinter_internal_frame_property_p (struct frame *UNUSED (f), |
1055 Lisp_Object property) | |
440 | 1056 { |
1057 return (EQ (Qleft_margin, property) || EQ (Qtop_margin, property) || | |
442 | 1058 EQ (Qright_margin, property) || EQ (Qbottom_margin, property)); |
440 | 1059 } |
1060 | |
1061 static Lisp_Object | |
1062 msprinter_frame_properties (struct frame *f) | |
1063 { | |
1064 Lisp_Object props = Qnil; | |
1065 props = cons3 (Qbottom_margin, | |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1066 make_fixnum (FRAME_MSPRINTER_BOTTOM_MARGIN (f)), props); |
440 | 1067 props = cons3 (Qright_margin, |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1068 make_fixnum (FRAME_MSPRINTER_RIGHT_MARGIN (f)), props); |
440 | 1069 props = cons3 (Qtop_margin, |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1070 make_fixnum (FRAME_MSPRINTER_TOP_MARGIN (f)), props); |
440 | 1071 props = cons3 (Qleft_margin, |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1072 make_fixnum (FRAME_MSPRINTER_LEFT_MARGIN (f)), props); |
440 | 1073 return props; |
1074 } | |
1075 | |
1076 static void | |
1077 msprinter_set_frame_properties (struct frame *f, Lisp_Object plist) | |
1078 { | |
1079 Lisp_Object tail; | |
1080 | |
1081 /* Extract the properties from plist */ | |
1082 for (tail = plist; !NILP (tail); tail = Fcdr (Fcdr (tail))) | |
1083 { | |
1084 Lisp_Object prop = Fcar (tail); | |
1085 Lisp_Object val = Fcar (Fcdr (tail)); | |
1086 | |
1087 if (SYMBOLP (prop)) | |
1088 { | |
1089 if (EQ (prop, Qwidth)) | |
1090 { | |
1091 maybe_error_if_job_active (f); | |
1092 if (!NILP (val)) | |
1093 { | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1094 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1095 check_integer_range (val, Qzero, make_integer (INT_MAX)); |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1096 FRAME_MSPRINTER_CHARWIDTH (f) = |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1097 BIGNUMP (val) ? bignum_to_int (XBIGNUM_DATA (val)) : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1098 XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1099 #else |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1100 CHECK_NATNUM (val); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1101 FRAME_MSPRINTER_CHARWIDTH (f) = XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1102 #endif |
440 | 1103 } |
1104 } | |
1105 if (EQ (prop, Qheight)) | |
1106 { | |
1107 maybe_error_if_job_active (f); | |
1108 if (!NILP (val)) | |
1109 { | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1110 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1111 check_integer_range (val, Qzero, make_integer (INT_MAX)); |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1112 FRAME_MSPRINTER_CHARHEIGHT (f) = |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1113 BIGNUMP (val) ? bignum_to_int (XBIGNUM_DATA (val)) : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1114 XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1115 #else |
440 | 1116 CHECK_NATNUM (val); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1117 FRAME_MSPRINTER_CHARHEIGHT (f) = XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1118 #endif |
440 | 1119 } |
1120 } | |
1121 else if (EQ (prop, Qleft_margin)) | |
1122 { | |
1123 maybe_error_if_job_active (f); | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1124 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1125 check_integer_range (val, Qzero, make_integer (INT_MAX)); |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1126 FRAME_MSPRINTER_LEFT_MARGIN (f) = |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1127 BIGNUMP (val) ? bignum_to_int (XBIGNUM_DATA (val)) : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1128 XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1129 #else |
440 | 1130 CHECK_NATNUM (val); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1131 FRAME_MSPRINTER_LEFT_MARGIN (f) = XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1132 #endif |
440 | 1133 } |
1134 else if (EQ (prop, Qtop_margin)) | |
1135 { | |
1136 maybe_error_if_job_active (f); | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1137 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1138 check_integer_range (val, Qzero, make_integer (INT_MAX)); |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1139 FRAME_MSPRINTER_TOP_MARGIN (f) = |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1140 BIGNUMP (val) ? bignum_to_int (XBIGNUM_DATA (val)) : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1141 XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1142 #else |
440 | 1143 CHECK_NATNUM (val); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1144 FRAME_MSPRINTER_TOP_MARGIN (f) = XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1145 #endif |
440 | 1146 } |
1147 else if (EQ (prop, Qright_margin)) | |
1148 { | |
1149 maybe_error_if_job_active (f); | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1150 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1151 check_integer_range (val, Qzero, make_integer (INT_MAX)); |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1152 FRAME_MSPRINTER_RIGHT_MARGIN (f) = |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1153 BIGNUMP (val) ? bignum_to_int (XBIGNUM_DATA (val)) : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1154 XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1155 #else |
440 | 1156 CHECK_NATNUM (val); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1157 FRAME_MSPRINTER_RIGHT_MARGIN (f) = XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1158 #endif |
440 | 1159 } |
1160 else if (EQ (prop, Qbottom_margin)) | |
1161 { | |
1162 maybe_error_if_job_active (f); | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1163 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1164 check_integer_range (val, Qzero, make_integer (INT_MAX)); |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1165 FRAME_MSPRINTER_BOTTOM_MARGIN (f) = |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1166 BIGNUMP (val) ? bignum_to_int (XBIGNUM_DATA (val)) : |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1167 XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1168 #else |
440 | 1169 CHECK_NATNUM (val); |
5581
56144c8593a8
Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5438
diff
changeset
|
1170 FRAME_MSPRINTER_BOTTOM_MARGIN (f) = XFIXNUM (val); |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5191
diff
changeset
|
1171 #endif |
440 | 1172 } |
1173 } | |
1174 } | |
1175 } | |
1176 | |
1177 static void | |
2286 | 1178 msprinter_set_frame_size (struct frame *f, int UNUSED (width), |
1179 int UNUSED (height)) | |
440 | 1180 { |
1181 /* We're absolutely unsizeable */ | |
1182 error_frame_unsizable (f); | |
1183 } | |
1184 | |
442 | 1185 static void |
1186 msprinter_eject_page (struct frame *f) | |
1187 { | |
1188 /* #### Should we eject empty pages? */ | |
1189 if (FRAME_MSPRINTER_PAGE_STARTED (f)) | |
1190 { | |
1191 FRAME_MSPRINTER_PAGE_STARTED (f) = 0; | |
1192 EndPage (DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f)))); | |
1193 apply_dc_geometry (f); | |
1194 } | |
1195 } | |
1196 | |
1197 | |
428 | 1198 void |
1199 console_type_create_frame_mswindows (void) | |
1200 { | |
440 | 1201 /* Display frames */ |
428 | 1202 CONSOLE_HAS_METHOD (mswindows, init_frame_1); |
442 | 1203 CONSOLE_HAS_METHOD (mswindows, init_frame_2); |
428 | 1204 CONSOLE_HAS_METHOD (mswindows, init_frame_3); |
1205 CONSOLE_HAS_METHOD (mswindows, after_init_frame); | |
1206 CONSOLE_HAS_METHOD (mswindows, mark_frame); | |
1207 CONSOLE_HAS_METHOD (mswindows, focus_on_frame); | |
1208 CONSOLE_HAS_METHOD (mswindows, delete_frame); | |
1209 CONSOLE_HAS_METHOD (mswindows, get_mouse_position); | |
1210 CONSOLE_HAS_METHOD (mswindows, set_mouse_position); | |
1211 CONSOLE_HAS_METHOD (mswindows, raise_frame); | |
1212 CONSOLE_HAS_METHOD (mswindows, lower_frame); | |
442 | 1213 CONSOLE_HAS_METHOD (mswindows, enable_frame); |
1214 CONSOLE_HAS_METHOD (mswindows, disable_frame); | |
428 | 1215 CONSOLE_HAS_METHOD (mswindows, make_frame_visible); |
1216 CONSOLE_HAS_METHOD (mswindows, make_frame_invisible); | |
1217 CONSOLE_HAS_METHOD (mswindows, iconify_frame); | |
1218 CONSOLE_HAS_METHOD (mswindows, set_frame_size); | |
1219 CONSOLE_HAS_METHOD (mswindows, set_frame_position); | |
1220 CONSOLE_HAS_METHOD (mswindows, frame_property); | |
1221 CONSOLE_HAS_METHOD (mswindows, internal_frame_property_p); | |
1222 CONSOLE_HAS_METHOD (mswindows, frame_properties); | |
1223 CONSOLE_HAS_METHOD (mswindows, set_frame_properties); | |
867 | 1224 CONSOLE_HAS_METHOD (mswindows, set_title_from_ibyte); |
1225 /* CONSOLE_HAS_METHOD (mswindows, set_icon_name_from_ibyte); */ | |
428 | 1226 CONSOLE_HAS_METHOD (mswindows, frame_visible_p); |
1227 CONSOLE_HAS_METHOD (mswindows, frame_totally_visible_p); | |
1228 CONSOLE_HAS_METHOD (mswindows, frame_iconified_p); | |
442 | 1229 CONSOLE_HAS_METHOD (mswindows, set_frame_pointer); |
1230 CONSOLE_HAS_METHOD (mswindows, set_frame_icon); | |
428 | 1231 CONSOLE_HAS_METHOD (mswindows, get_frame_parent); |
1232 CONSOLE_HAS_METHOD (mswindows, update_frame_external_traits); | |
1233 CONSOLE_HAS_METHOD (mswindows, frame_size_fixed_p); | |
440 | 1234 |
1235 /* Printer frames, aka print jobs */ | |
1236 CONSOLE_HAS_METHOD (msprinter, init_frame_1); | |
1237 CONSOLE_HAS_METHOD (msprinter, init_frame_3); | |
1238 CONSOLE_HAS_METHOD (msprinter, mark_frame); | |
1239 CONSOLE_HAS_METHOD (msprinter, delete_frame); | |
1240 CONSOLE_HAS_METHOD (msprinter, frame_property); | |
1241 CONSOLE_HAS_METHOD (msprinter, internal_frame_property_p); | |
1242 CONSOLE_HAS_METHOD (msprinter, frame_properties); | |
1243 CONSOLE_HAS_METHOD (msprinter, set_frame_properties); | |
1244 CONSOLE_HAS_METHOD (msprinter, set_frame_size); | |
442 | 1245 CONSOLE_HAS_METHOD (msprinter, eject_page); |
428 | 1246 } |
1247 | |
1248 void | |
1249 syms_of_frame_mswindows (void) | |
1250 { | |
3092 | 1251 #ifdef NEW_GC |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4139
diff
changeset
|
1252 INIT_LISP_OBJECT (mswindows_frame); |
3092 | 1253 #endif /* NEW_GC */ |
428 | 1254 } |
1255 | |
1256 void | |
1257 reinit_vars_of_frame_mswindows (void) | |
1258 { | |
1259 /* Needn't staticpro -- see comment above. */ | |
1260 Vmswindows_frame_being_created = Qnil; | |
1261 } | |
1262 | |
1263 void | |
1264 vars_of_frame_mswindows (void) | |
1265 { | |
1266 DEFVAR_LISP ("mswindows-use-system-frame-size-defaults", &Vmswindows_use_system_frame_size_defaults /* | |
1267 Controls whether to use system or XEmacs defaults for frame size. | |
442 | 1268 If nil then reasonable defaults are used for initial frame sizes. If t |
428 | 1269 then the system will choose default sizes for the frame. |
1270 */ ); | |
1271 Vmswindows_use_system_frame_size_defaults = Qnil; | |
442 | 1272 |
428 | 1273 DEFVAR_LISP ("default-mswindows-frame-plist", &Vdefault_mswindows_frame_plist /* |
1274 Plist of default frame-creation properties for mswindows frames. | |
1275 These override what is specified in `default-frame-plist', but are | |
1276 overridden by the arguments to the particular call to `make-frame'. | |
1277 | |
1278 Note: In many cases, properties of a frame are available as specifiers | |
1279 instead of through the frame-properties mechanism. | |
1280 | |
1281 Here is a list of recognized frame properties, other than those | |
1282 documented in `set-frame-properties' (they can be queried and | |
1283 set at any time, except as otherwise noted): | |
1284 | |
1285 initially-unmapped If non-nil, the frame will not be visible | |
1286 when it is created. In this case, you | |
1287 need to call `make-frame-visible' to make | |
1288 the frame appear. | |
1289 popup If non-nil, it should be a frame, and this | |
1290 frame will be created as a "popup" frame | |
1291 whose parent is the given frame. This | |
1292 will make the window manager treat the | |
1293 frame as a dialog box, which may entail | |
1294 doing different things (e.g. not asking | |
1295 for positioning, and not iconifying | |
1296 separate from its parent). | |
1297 top Y position (in pixels) of the upper-left | |
1298 outermost corner of the frame (i.e. the | |
1299 upper-left of the window-manager | |
1300 decorations). | |
1301 left X position (in pixels) of the upper-left | |
1302 outermost corner of the frame (i.e. the | |
1303 upper-left of the window-manager | |
1304 decorations). | |
3022 | 1305 window-id Window handle (HWND) of the frame. |
1306 Cannot be set. | |
428 | 1307 |
1308 See also `default-frame-plist', which specifies properties which apply | |
1309 to all frames, not just mswindows frames. | |
1310 */ ); | |
1311 Vdefault_mswindows_frame_plist = Qnil; | |
1312 | |
1313 mswindows_console_methods->device_specific_frame_props = | |
1314 &Vdefault_mswindows_frame_plist; | |
440 | 1315 |
1316 DEFVAR_LISP ("default-msprinter-frame-plist", &Vdefault_msprinter_frame_plist /* | |
1317 Plist of default frame-creation properties for msprinter print job frames. | |
1318 These override what is specified in `default-frame-plist', but are | |
1319 overridden by the arguments to the particular call to `make-frame'. | |
1320 | |
1321 Note: In many cases, properties of a frame are available as specifiers | |
1322 instead of through the frame-properties mechanism. | |
1323 | |
1324 Here is a list of recognized frame properties, other than those | |
1325 documented in `set-frame-properties' (they can be queried and | |
1326 set at any time, except as otherwise noted): | |
1327 | |
1328 left-margin Margin of the page, in twips. Twip is a | |
1329 top-margin typographical unit of measurement, | |
1330 right-margin equal to 1/1440 of an inch, or 1/20 of a | |
1331 bottom-margin point, and roughly equal to 7/400 of a | |
506 | 1332 millimeter. If not specified, the left |
1333 and right margins default to 1 inch | |
1334 (25.4 mm) and the top and bottom margins | |
1335 to 0.5 inch (12.7 mm). | |
440 | 1336 |
1337 MARGINS NOTE. right-margin and bottom-margin are overridden by | |
1338 the height and width properties. If you want to specify size | |
1339 of the printable area in character, as with the rest of XEmacs, | |
1340 use these properties. If height and/or width are nil, then | |
1341 corresponding margin setting is taken into account. If you | |
1342 specify height and/or width in `default-frame-plist', but still | |
1343 want to specify right/bottom margins, set height/width in this | |
1344 plist to nil, as in this example: | |
1345 | |
506 | 1346 (setq default-frame-plist '(height 55 width 80) |
1347 default-msprinter-frame-plist '(height nil width nil)) | |
440 | 1348 |
1349 See also `default-frame-plist', which specifies properties which apply | |
1350 to all frames, not just mswindows frames. | |
1351 */ ); | |
1352 Vdefault_msprinter_frame_plist = Qnil; | |
1353 | |
1354 msprinter_console_methods->device_specific_frame_props = | |
1355 &Vdefault_msprinter_frame_plist; | |
428 | 1356 } |