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'.