Mercurial > hg > xemacs-beta
comparison src/frame-w32.c @ 209:41ff10fd062f r20-4b3
Import from CVS: tag r20-4b3
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:04:58 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
208:f427b8ec4379 | 209:41ff10fd062f |
---|---|
1 /* Functions for the win32 window system. | |
2 Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. | |
3 Copyright (C) 1995, 1996 Ben Wing. | |
4 | |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
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 | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not synched with FSF. */ | |
23 | |
24 /* Authorship: | |
25 | |
26 Ultimately based on FSF. | |
27 Substantially rewritten for XEmacs by Ben Wing. | |
28 Rewritten for win32 by Jonathan Harris, November 1997 for 20.4. | |
29 */ | |
30 | |
31 #include <config.h> | |
32 #include "lisp.h" | |
33 | |
34 #include "console-w32.h" | |
35 #include "event-w32.h" | |
36 | |
37 #include "buffer.h" | |
38 #include "frame.h" | |
39 #include "events.h" | |
40 | |
41 /* Default properties to use when creating frames. */ | |
42 Lisp_Object Vdefault_w32_frame_plist; | |
43 /* Lisp_Object Qname, Qheight, Qwidth, Qinitially_unmapped, Qpopup, Qtop, Qleft; */ | |
44 Lisp_Object Qinitially_unmapped, Qpopup; | |
45 | |
46 static void | |
47 w32_init_frame_1 (struct frame *f, Lisp_Object props) | |
48 { | |
49 w32_request_type request = { f, &props }; | |
50 Lisp_Object device = FRAME_DEVICE (f); | |
51 struct device *d = XDEVICE (device); | |
52 Lisp_Object lisp_window_id, initially_unmapped; | |
53 initially_unmapped = Fplist_get (props, Qinitially_unmapped, Qnil); | |
54 | |
55 #if 0 | |
56 if (NILP (DEVICE_SELECTED_FRAME (d)) && /* first frame on the device */ | |
57 NILP (initially_unmapped)) | |
58 f->visible = 1; | |
59 #endif | |
60 | |
61 f->frame_data = xnew_and_zero (struct w32_frame); | |
62 FRAME_W32_HANDLE(f) = (HWND)w32_make_request(WM_XEMACS_CREATEWINDOW, | |
63 0, &request); | |
64 FRAME_W32_DC(f) = GetDC(FRAME_W32_HANDLE(f)); | |
65 SetTextAlign(FRAME_W32_DC(f), TA_BASELINE|TA_LEFT|TA_NOUPDATECP); | |
66 | |
67 /* XXX FIXME: This function should be made to do something */ | |
68 update_frame_face_values (f); | |
69 } | |
70 | |
71 /* Called just before frame's properties are set */ | |
72 static void | |
73 w32_init_frame_2 (struct frame *f, Lisp_Object props) | |
74 { | |
75 } | |
76 | |
77 /* Called after frame's properties are set */ | |
78 static void | |
79 w32_init_frame_3 (struct frame *f) | |
80 { | |
81 /* Don't do this earlier or we get a WM_PAINT before the frame is ready*/ | |
82 ShowWindow(FRAME_W32_HANDLE(f), SW_SHOWNORMAL); | |
83 } | |
84 | |
85 static void | |
86 w32_delete_frame (struct frame *f) | |
87 { | |
88 if (f->frame_data) | |
89 { | |
90 ReleaseDC(FRAME_W32_HANDLE(f), FRAME_W32_DC(f)); | |
91 DestroyWindow(FRAME_W32_HANDLE(f)); | |
92 } | |
93 } | |
94 | |
95 static void | |
96 w32_set_frame_size (struct frame *f, int cols, int rows) | |
97 { | |
98 } | |
99 | |
100 | |
101 static void | |
102 w32_set_frame_position (struct frame *f, int xoff, int yoff) | |
103 { | |
104 } | |
105 | |
106 static void | |
107 w32_set_frame_properties (struct frame *f, Lisp_Object plist) | |
108 { | |
109 int x, y; | |
110 int width = 0, height = 0; | |
111 BOOL width_specified_p = FALSE; | |
112 BOOL height_specified_p = FALSE; | |
113 BOOL x_specified_p = FALSE; | |
114 BOOL y_specified_p = FALSE; | |
115 Lisp_Object tail; | |
116 | |
117 /* Extract the properties from plist */ | |
118 for (tail = plist; !NILP (tail); tail = Fcdr (Fcdr (tail))) | |
119 { | |
120 Lisp_Object prop = Fcar (tail); | |
121 Lisp_Object val = Fcar (Fcdr (tail)); | |
122 | |
123 if (SYMBOLP (prop)) | |
124 { | |
125 /* Kludge to handle the font property. */ | |
126 if (EQ (prop, Qfont)) | |
127 { | |
128 /* If the value is not a string we silently ignore it. */ | |
129 if (STRINGP (val)) | |
130 { | |
131 Lisp_Object frm, font_spec; | |
132 | |
133 XSETFRAME (frm, f); | |
134 font_spec = Fget (Fget_face (Qdefault), Qfont, Qnil); | |
135 | |
136 Fadd_spec_to_specifier (font_spec, val, frm, Qnil, Qnil); | |
137 update_frame_face_values (f); | |
138 } | |
139 } | |
140 else if (EQ (prop, Qwidth)) | |
141 { | |
142 CHECK_INT (val); | |
143 width = XINT (val); | |
144 width_specified_p = TRUE; | |
145 } | |
146 else if (EQ (prop, Qheight)) | |
147 { | |
148 CHECK_INT (val); | |
149 height = XINT (val); | |
150 height_specified_p = TRUE; | |
151 } | |
152 else if (EQ (prop, Qleft)) | |
153 { | |
154 CHECK_INT (val); | |
155 x = XINT (val); | |
156 x_specified_p = TRUE; | |
157 } | |
158 else if (EQ (prop, Qtop)) | |
159 { | |
160 CHECK_INT (val); | |
161 y = XINT (val); | |
162 y_specified_p = TRUE; | |
163 } | |
164 } | |
165 } | |
166 | |
167 /* Now we've extracted the properties, apply them */ | |
168 if (width_specified_p || height_specified_p || x_specified_p || y_specified_p) | |
169 { | |
170 Lisp_Object frame; | |
171 RECT rect; | |
172 int pixel_width, pixel_height; | |
173 XSETFRAME (frame, f); | |
174 | |
175 if (!width_specified_p) | |
176 width = FRAME_WIDTH (f); | |
177 if (!height_specified_p) | |
178 height = FRAME_HEIGHT (f); | |
179 char_to_pixel_size (f, width, height, &pixel_width, &pixel_height); | |
180 | |
181 GetWindowRect (FRAME_W32_HANDLE(f), &rect); | |
182 if (!x_specified_p) | |
183 x = rect.left; | |
184 if (!y_specified_p) | |
185 y = rect.top; | |
186 /* XXX FIXME: Should do AdjustWindowRect here like in w32_handle_request */ | |
187 MoveWindow (FRAME_W32_HANDLE(f), x, y, pixel_width, pixel_height, | |
188 (width_specified_p || height_specified_p)); | |
189 } | |
190 } | |
191 | |
192 | |
193 void | |
194 console_type_create_frame_w32 (void) | |
195 { | |
196 /* frame methods */ | |
197 CONSOLE_HAS_METHOD (w32, init_frame_1); | |
198 CONSOLE_HAS_METHOD (w32, init_frame_2); | |
199 CONSOLE_HAS_METHOD (w32, init_frame_3); | |
200 /* CONSOLE_HAS_METHOD (w32, mark_frame); */ | |
201 /* CONSOLE_HAS_METHOD (w32, focus_on_frame); */ | |
202 CONSOLE_HAS_METHOD (w32, delete_frame); | |
203 /* CONSOLE_HAS_METHOD (w32, get_mouse_position); */ | |
204 /* CONSOLE_HAS_METHOD (w32, set_mouse_position); */ | |
205 /* CONSOLE_HAS_METHOD (w32, raise_frame); */ | |
206 /* CONSOLE_HAS_METHOD (w32, lower_frame); */ | |
207 /* CONSOLE_HAS_METHOD (w32, make_frame_visible); */ | |
208 /* CONSOLE_HAS_METHOD (w32, make_frame_invisible); */ | |
209 /* CONSOLE_HAS_METHOD (w32, iconify_frame); */ | |
210 CONSOLE_HAS_METHOD (w32, set_frame_size); | |
211 CONSOLE_HAS_METHOD (w32, set_frame_position); | |
212 /* CONSOLE_HAS_METHOD (w32, frame_property); */ | |
213 /* CONSOLE_HAS_METHOD (w32, internal_frame_property_p); */ | |
214 /* CONSOLE_HAS_METHOD (w32, frame_properties); */ | |
215 CONSOLE_HAS_METHOD (w32, set_frame_properties); | |
216 /* CONSOLE_HAS_METHOD (w32, set_title_from_bufbyte); */ | |
217 /* CONSOLE_HAS_METHOD (w32, set_icon_name_from_bufbyte); */ | |
218 /* CONSOLE_HAS_METHOD (w32, frame_visible_p); */ | |
219 /* CONSOLE_HAS_METHOD (w32, frame_totally_visible_p); */ | |
220 /* CONSOLE_HAS_METHOD (w32, frame_iconified_p); */ | |
221 /* CONSOLE_HAS_METHOD (w32, set_frame_pointer); */ | |
222 /* CONSOLE_HAS_METHOD (w32, set_frame_icon); */ | |
223 /* CONSOLE_HAS_METHOD (w32, get_frame_parent); */ | |
224 } | |
225 | |
226 void | |
227 syms_of_frame_w32 (void) | |
228 { | |
229 #if 0 /* XXX these are in general.c */ | |
230 defsymbol (&Qname, "name"); | |
231 defsymbol (&Qheight, "height"); | |
232 defsymbol (&Qwidth, "width"); | |
233 defsymbol (&Qtop, "top"); | |
234 defsymbol (&Qleft, "left"); | |
235 #endif | |
236 defsymbol (&Qinitially_unmapped, "initially-unmapped"); | |
237 defsymbol (&Qpopup, "popup"); | |
238 } | |
239 | |
240 void | |
241 vars_of_frame_w32 (void) | |
242 { | |
243 DEFVAR_LISP ("default-w32-frame-plist", &Vdefault_w32_frame_plist /* | |
244 Plist of default frame-creation properties for w32 frames. | |
245 These override what is specified in `default-frame-plist', but are | |
246 overridden by the arguments to the particular call to `make-frame'. | |
247 | |
248 Note: In many cases, properties of a frame are available as specifiers | |
249 instead of through the frame-properties mechanism. | |
250 | |
251 Here is a list of recognized frame properties, other than those | |
252 documented in `set-frame-properties' (they can be queried and | |
253 set at any time, except as otherwise noted): | |
254 | |
255 initially-unmapped If non-nil, the frame will not be visible | |
256 when it is created. In this case, you | |
257 need to call `make-frame-visible' to make | |
258 the frame appear. | |
259 popup If non-nil, it should be a frame, and this | |
260 frame will be created as a "popup" frame | |
261 whose parent is the given frame. This | |
262 will make the window manager treat the | |
263 frame as a dialog box, which may entail | |
264 doing different things (e.g. not asking | |
265 for positioning, and not iconifying | |
266 separate from its parent). | |
267 top Y position (in pixels) of the upper-left | |
268 outermost corner of the frame (i.e. the | |
269 upper-left of the window-manager | |
270 decorations). | |
271 left X position (in pixels) of the upper-left | |
272 outermost corner of the frame (i.e. the | |
273 upper-left of the window-manager | |
274 decorations). | |
275 | |
276 See also `default-frame-plist', which specifies properties which apply | |
277 to all frames, not just w32 frames. | |
278 */ ); | |
279 Vdefault_w32_frame_plist = Qnil; | |
280 | |
281 w32_console_methods->device_specific_frame_props = | |
282 &Vdefault_w32_frame_plist; | |
283 } |