Mercurial > hg > xemacs-beta
comparison src/frame-msw.c @ 276:6330739388db r21-0b36
Import from CVS: tag r21-0b36
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:30:37 +0200 |
parents | ca9a9ec9c1c1 |
children | 90d73dddcdc4 |
comparison
equal
deleted
inserted
replaced
275:a68ae4439f57 | 276:6330739388db |
---|---|
36 #include "glyphs-msw.h" | 36 #include "glyphs-msw.h" |
37 #include "events.h" | 37 #include "events.h" |
38 #include "faces.h" | 38 #include "faces.h" |
39 #include "frame.h" | 39 #include "frame.h" |
40 #include "redisplay.h" | 40 #include "redisplay.h" |
41 #include "window.h" | |
41 | 42 |
42 #define MSWINDOWS_FRAME_STYLE (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) | 43 #define MSWINDOWS_FRAME_STYLE (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) |
43 #define MSWINDOWS_POPUP_STYLE (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP \ | 44 #define MSWINDOWS_POPUP_STYLE (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP \ |
44 | WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX) | 45 | WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX) |
45 | 46 |
66 /* Lisp_Object Qname, Qheight, Qwidth, Qinitially_unmapped, Qpopup, Qtop, Qleft; */ | 67 /* Lisp_Object Qname, Qheight, Qwidth, Qinitially_unmapped, Qpopup, Qtop, Qleft; */ |
67 Lisp_Object Qinitially_unmapped, Qpopup; | 68 Lisp_Object Qinitially_unmapped, Qpopup; |
68 | 69 |
69 /* This does not need to be GC protected, as it holds a | 70 /* This does not need to be GC protected, as it holds a |
70 frame Lisp_Object already protected by Fmake_frame */ | 71 frame Lisp_Object already protected by Fmake_frame */ |
71 Lisp_Object mswindows_frame_being_created; | 72 Lisp_Object Vmswindows_frame_being_created; |
72 | 73 |
73 /* Geometry, in characters, as specified by proplist during frame | 74 /* Geometry, in characters, as specified by proplist during frame |
74 creation. Memebers are set to -1 for unspecified */ | 75 creation. Memebers are set to -1 for unspecified */ |
75 XEMACS_RECT_WH mswindows_frame_target_rect; | 76 XEMACS_RECT_WH mswindows_frame_target_rect; |
76 | 77 |
128 FRAME_MSWINDOWS_DATA(f)->button2_need_rbutton = 0; | 129 FRAME_MSWINDOWS_DATA(f)->button2_need_rbutton = 0; |
129 FRAME_MSWINDOWS_DATA(f)->button2_is_down = 0; | 130 FRAME_MSWINDOWS_DATA(f)->button2_is_down = 0; |
130 FRAME_MSWINDOWS_DATA(f)->ignore_next_lbutton_up = 0; | 131 FRAME_MSWINDOWS_DATA(f)->ignore_next_lbutton_up = 0; |
131 FRAME_MSWINDOWS_DATA(f)->ignore_next_rbutton_up = 0; | 132 FRAME_MSWINDOWS_DATA(f)->ignore_next_rbutton_up = 0; |
132 FRAME_MSWINDOWS_DATA(f)->sizing = 0; | 133 FRAME_MSWINDOWS_DATA(f)->sizing = 0; |
133 | |
134 FRAME_MSWINDOWS_MENU_HASHTABLE(f) = Qnil; | 134 FRAME_MSWINDOWS_MENU_HASHTABLE(f) = Qnil; |
135 #ifdef HAVE_TOOLBARS | |
136 FRAME_MSWINDOWS_TOOLBAR_HASHTABLE(f) = Fmake_hashtable (make_int (50), | |
137 Qequal); | |
138 #endif | |
135 | 139 |
136 /* Will initialize these in WM_SIZE handler. We cannot do it now, | 140 /* Will initialize these in WM_SIZE handler. We cannot do it now, |
137 because we do not know what is CW_USEDEFAULT height and width */ | 141 because we do not know what is CW_USEDEFAULT height and width */ |
138 FRAME_WIDTH (f) = 0; | 142 FRAME_WIDTH (f) = 0; |
139 FRAME_HEIGHT (f) = 0; | 143 FRAME_HEIGHT (f) = 0; |
173 | 177 |
174 AdjustWindowRectEx(&rect, style, ADJR_MENUFLAG, exstyle); | 178 AdjustWindowRectEx(&rect, style, ADJR_MENUFLAG, exstyle); |
175 | 179 |
176 XSETFRAME (frame_obj, f); | 180 XSETFRAME (frame_obj, f); |
177 | 181 |
178 mswindows_frame_being_created = frame_obj; | 182 Vmswindows_frame_being_created = frame_obj; |
179 | 183 |
180 hwnd = CreateWindowEx (exstyle, | 184 hwnd = CreateWindowEx (exstyle, |
181 XEMACS_CLASS, | 185 XEMACS_CLASS, |
182 STRINGP(f->name) ? XSTRING_DATA(f->name) : | 186 STRINGP(f->name) ? XSTRING_DATA(f->name) : |
183 (STRINGP(name) ? XSTRING_DATA(name) : XEMACS_CLASS), | 187 (STRINGP(name) ? XSTRING_DATA(name) : XEMACS_CLASS), |
184 style, | 188 style, |
185 rect_default.left, rect_default.top, | 189 rect_default.left, rect_default.top, |
186 rect_default.width, rect_default.height, | 190 rect_default.width, rect_default.height, |
187 hwnd_parent, NULL, NULL, NULL); | 191 hwnd_parent, NULL, NULL, NULL); |
188 | 192 |
189 mswindows_frame_being_created = Qnil; | 193 Vmswindows_frame_being_created = Qnil; |
190 | 194 |
191 if (hwnd == NULL) | 195 if (hwnd == NULL) |
192 error ("System call to create frame failed"); | 196 error ("System call to create frame failed"); |
193 | 197 |
194 FRAME_MSWINDOWS_HANDLE(f) = hwnd; | 198 FRAME_MSWINDOWS_HANDLE(f) = hwnd; |
233 | 237 |
234 static void | 238 static void |
235 mswindows_mark_frame (struct frame *f, void (*markobj) (Lisp_Object)) | 239 mswindows_mark_frame (struct frame *f, void (*markobj) (Lisp_Object)) |
236 { | 240 { |
237 ((markobj) (FRAME_MSWINDOWS_MENU_HASHTABLE (f))); | 241 ((markobj) (FRAME_MSWINDOWS_MENU_HASHTABLE (f))); |
242 #ifdef HAVE_TOOLBARS | |
243 ((markobj) (FRAME_MSWINDOWS_TOOLBAR_HASHTABLE (f))); | |
244 #endif | |
238 } | 245 } |
239 | 246 |
240 static void | 247 static void |
241 mswindows_focus_on_frame (struct frame *f) | 248 mswindows_focus_on_frame (struct frame *f) |
242 { | 249 { |
302 ShowWindow (FRAME_MSWINDOWS_HANDLE(f), SW_HIDE); | 309 ShowWindow (FRAME_MSWINDOWS_HANDLE(f), SW_HIDE); |
303 f->visible = -1; | 310 f->visible = -1; |
304 } | 311 } |
305 | 312 |
306 static int | 313 static int |
314 mswindows_frame_totally_visible_p (struct frame *f) | |
315 { | |
316 RECT rc_me, rc_other, rc_temp; | |
317 HWND hwnd = FRAME_MSWINDOWS_HANDLE(f); | |
318 | |
319 /* We test against not a whole window rectangle, only agaist its | |
320 client part. So, if non-client are is covered and client area is | |
321 not, we return true. */ | |
322 GetClientRect (hwnd, &rc_me); | |
323 MapWindowPoints (hwnd, HWND_DESKTOP, (LPPOINT)&rc_me, 2); | |
324 | |
325 /* First see if we're off the desktop */ | |
326 GetWindowRect (GetDesktopWindow(), &rc_other); | |
327 UnionRect(&rc_temp, &rc_me, &rc_other); | |
328 if (!EqualRect (&rc_temp, &rc_other)) | |
329 return 0; | |
330 | |
331 /* Then see if any window above us obscures us */ | |
332 while ((hwnd = GetWindow (hwnd, GW_HWNDPREV)) != NULL) | |
333 if (IsWindowVisible (hwnd)) | |
334 { | |
335 GetWindowRect (hwnd, &rc_other); | |
336 if (IntersectRect(&rc_temp, &rc_me, &rc_other)) | |
337 return 0; | |
338 } | |
339 | |
340 return 1; | |
341 } | |
342 | |
343 static int | |
307 mswindows_frame_visible_p (struct frame *f) | 344 mswindows_frame_visible_p (struct frame *f) |
308 { | 345 { |
309 return IsWindowVisible (FRAME_MSWINDOWS_HANDLE(f)) | 346 return IsWindowVisible (FRAME_MSWINDOWS_HANDLE(f)) |
310 && !IsIconic (FRAME_MSWINDOWS_HANDLE(f)); | 347 && !IsIconic (FRAME_MSWINDOWS_HANDLE(f)); |
311 } | 348 } |
331 if (IMAGE_INSTANCEP (f->icon) | 368 if (IMAGE_INSTANCEP (f->icon) |
332 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (f->icon))) | 369 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (f->icon))) |
333 { | 370 { |
334 if (!XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)) | 371 if (!XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)) |
335 { | 372 { |
336 ICONINFO x_icon; | 373 mswindows_create_icon_from_image(f->icon, f, 16); |
337 | |
338 x_icon.fIcon=TRUE; | |
339 x_icon.xHotspot=XIMAGE_INSTANCE_PIXMAP_HOTSPOT_X (f->icon); | |
340 x_icon.yHotspot=XIMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (f->icon); | |
341 x_icon.hbmMask=XIMAGE_INSTANCE_MSWINDOWS_BITMAP (f->icon); | |
342 x_icon.hbmColor=XIMAGE_INSTANCE_MSWINDOWS_MASK (f->icon); | |
343 | |
344 XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)= | |
345 CreateIconIndirect (&x_icon); | |
346 } | 374 } |
347 | 375 |
348 SetClassLong (FRAME_MSWINDOWS_HANDLE (f), GCL_HICON, | 376 SetClassLong (FRAME_MSWINDOWS_HANDLE (f), GCL_HICON, |
349 (LONG) XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)); | 377 (LONG) XIMAGE_INSTANCE_MSWINDOWS_ICON (f->icon)); |
350 } | 378 } |
357 XDefineCursor (XtDisplay (FRAME_X_TEXT_WIDGET (f)), | 385 XDefineCursor (XtDisplay (FRAME_X_TEXT_WIDGET (f)), |
358 XtWindow (FRAME_X_TEXT_WIDGET (f)), | 386 XtWindow (FRAME_X_TEXT_WIDGET (f)), |
359 XIMAGE_INSTANCE_X_CURSOR (f->pointer)); | 387 XIMAGE_INSTANCE_X_CURSOR (f->pointer)); |
360 XSync (XtDisplay (FRAME_X_TEXT_WIDGET (f)), 0); | 388 XSync (XtDisplay (FRAME_X_TEXT_WIDGET (f)), 0); |
361 #endif | 389 #endif |
390 } | |
391 | |
392 | |
393 static void | |
394 mswindows_set_mouse_position (struct window *w, int x, int y) | |
395 { | |
396 struct frame *f = XFRAME (w->frame); | |
397 POINT pt; | |
398 | |
399 pt.x = w->pixel_left + x; | |
400 pt.y = w->pixel_top + y; | |
401 ClientToScreen (FRAME_MSWINDOWS_HANDLE(f), &pt); | |
402 SetCursorPos (pt.x, pt.y); | |
403 } | |
404 | |
405 static int | |
406 mswindows_get_mouse_position (struct device *d, Lisp_Object *frame, int *x, int *y) | |
407 { | |
408 POINT pt; | |
409 HWND hwnd; | |
410 | |
411 GetCursorPos (&pt); | |
412 | |
413 /* What's under cursor? */ | |
414 hwnd = WindowFromPoint (pt); | |
415 if (hwnd == NULL) | |
416 return 0; | |
417 | |
418 /* Get grandest parent of the window */ | |
419 { | |
420 HWND hwnd_parent; | |
421 while ((hwnd_parent = GetParent (hwnd)) != NULL) | |
422 hwnd = hwnd_parent; | |
423 } | |
424 | |
425 /* Make sure it belongs to us */ | |
426 if (GetWindowThreadProcessId (hwnd, NULL) != GetCurrentThreadId ()) | |
427 return 0; | |
428 | |
429 /* And that the window is an XEmacs frame */ | |
430 { | |
431 char class_name [sizeof(XEMACS_CLASS) + 1]; | |
432 if (!GetClassName (hwnd, class_name, sizeof(XEMACS_CLASS)) | |
433 || strcmp (class_name, XEMACS_CLASS) != 0) | |
434 return 0; | |
435 } | |
436 | |
437 /* Yippie! */ | |
438 ScreenToClient (hwnd, &pt); | |
439 VOID_TO_LISP (*frame, GetWindowLong (hwnd, XWL_FRAMEOBJ)); | |
440 *x = pt.x; | |
441 *y = pt.y; | |
442 return 1; | |
362 } | 443 } |
363 | 444 |
364 static void | 445 static void |
365 mswindows_raise_frame (struct frame *f) | 446 mswindows_raise_frame (struct frame *f) |
366 { | 447 { |
587 CONSOLE_HAS_METHOD (mswindows, init_frame_3); | 668 CONSOLE_HAS_METHOD (mswindows, init_frame_3); |
588 CONSOLE_HAS_METHOD (mswindows, after_init_frame); | 669 CONSOLE_HAS_METHOD (mswindows, after_init_frame); |
589 CONSOLE_HAS_METHOD (mswindows, mark_frame); | 670 CONSOLE_HAS_METHOD (mswindows, mark_frame); |
590 CONSOLE_HAS_METHOD (mswindows, focus_on_frame); | 671 CONSOLE_HAS_METHOD (mswindows, focus_on_frame); |
591 CONSOLE_HAS_METHOD (mswindows, delete_frame); | 672 CONSOLE_HAS_METHOD (mswindows, delete_frame); |
592 /* CONSOLE_HAS_METHOD (mswindows, get_mouse_position); */ | 673 CONSOLE_HAS_METHOD (mswindows, get_mouse_position); |
593 /* CONSOLE_HAS_METHOD (mswindows, set_mouse_position); */ | 674 CONSOLE_HAS_METHOD (mswindows, set_mouse_position); |
594 CONSOLE_HAS_METHOD (mswindows, raise_frame); | 675 CONSOLE_HAS_METHOD (mswindows, raise_frame); |
595 CONSOLE_HAS_METHOD (mswindows, lower_frame); | 676 CONSOLE_HAS_METHOD (mswindows, lower_frame); |
596 CONSOLE_HAS_METHOD (mswindows, make_frame_visible); | 677 CONSOLE_HAS_METHOD (mswindows, make_frame_visible); |
597 CONSOLE_HAS_METHOD (mswindows, make_frame_invisible); | 678 CONSOLE_HAS_METHOD (mswindows, make_frame_invisible); |
598 CONSOLE_HAS_METHOD (mswindows, iconify_frame); | 679 CONSOLE_HAS_METHOD (mswindows, iconify_frame); |
603 CONSOLE_HAS_METHOD (mswindows, frame_properties); | 684 CONSOLE_HAS_METHOD (mswindows, frame_properties); |
604 CONSOLE_HAS_METHOD (mswindows, set_frame_properties); | 685 CONSOLE_HAS_METHOD (mswindows, set_frame_properties); |
605 CONSOLE_HAS_METHOD (mswindows, set_title_from_bufbyte); | 686 CONSOLE_HAS_METHOD (mswindows, set_title_from_bufbyte); |
606 /* CONSOLE_HAS_METHOD (mswindows, set_icon_name_from_bufbyte); */ | 687 /* CONSOLE_HAS_METHOD (mswindows, set_icon_name_from_bufbyte); */ |
607 CONSOLE_HAS_METHOD (mswindows, frame_visible_p); | 688 CONSOLE_HAS_METHOD (mswindows, frame_visible_p); |
608 /* CONSOLE_HAS_METHOD (mswindows, frame_totally_visible_p); */ | 689 CONSOLE_HAS_METHOD (mswindows, frame_totally_visible_p); |
609 CONSOLE_HAS_METHOD (mswindows, frame_iconified_p); | 690 CONSOLE_HAS_METHOD (mswindows, frame_iconified_p); |
610 CONSOLE_HAS_METHOD (mswindows, set_frame_pointer); | 691 CONSOLE_HAS_METHOD (mswindows, set_frame_pointer); |
611 CONSOLE_HAS_METHOD (mswindows, set_frame_icon); | 692 CONSOLE_HAS_METHOD (mswindows, set_frame_icon); |
612 CONSOLE_HAS_METHOD (mswindows, get_frame_parent); | 693 CONSOLE_HAS_METHOD (mswindows, get_frame_parent); |
613 CONSOLE_HAS_METHOD (mswindows, update_frame_external_traits); | 694 CONSOLE_HAS_METHOD (mswindows, update_frame_external_traits); |
619 } | 700 } |
620 | 701 |
621 void | 702 void |
622 vars_of_frame_mswindows (void) | 703 vars_of_frame_mswindows (void) |
623 { | 704 { |
624 mswindows_frame_being_created = Qnil; | 705 /* Needn't staticpro -- see comment above. */ |
625 staticpro (&mswindows_frame_being_created); | 706 Vmswindows_frame_being_created = Qnil; |
626 | 707 |
627 DEFVAR_LISP ("default-mswindows-frame-plist", &Vdefault_mswindows_frame_plist /* | 708 DEFVAR_LISP ("default-mswindows-frame-plist", &Vdefault_mswindows_frame_plist /* |
628 Plist of default frame-creation properties for mswindows frames. | 709 Plist of default frame-creation properties for mswindows frames. |
629 These override what is specified in `default-frame-plist', but are | 710 These override what is specified in `default-frame-plist', but are |
630 overridden by the arguments to the particular call to `make-frame'. | 711 overridden by the arguments to the particular call to `make-frame'. |