comparison src/frame-msw.c @ 404:2f8bb876ab1d r21-2-32

Import from CVS: tag r21-2-32
author cvs
date Mon, 13 Aug 2007 11:16:07 +0200
parents 74fd4e045ea6
children b8cc9ab3f761
comparison
equal deleted inserted replaced
403:9f011ab08d48 404:2f8bb876ab1d
56 56
57 /* Default popup size, in characters */ 57 /* Default popup size, in characters */
58 #define POPUP_WIDTH 30 58 #define POPUP_WIDTH 30
59 #define POPUP_HEIGHT 10 59 #define POPUP_HEIGHT 10
60 60
61 /* Default popup size, in characters */ 61 /* Default regular frame size, in characters */
62 #define DEFAULT_FRAME_WIDTH 80 62 #define DEFAULT_FRAME_WIDTH 80
63 #define DEFAULT_FRAME_HEIGHT 35 63 #define DEFAULT_FRAME_HEIGHT 35
64 64
65 #ifdef HAVE_MENUBARS 65 #ifdef HAVE_MENUBARS
66 #define ADJR_MENUFLAG TRUE 66 #define ADJR_MENUFLAG TRUE
131 FRAME_MSWINDOWS_DATA(f)->button2_need_rbutton = 0; 131 FRAME_MSWINDOWS_DATA(f)->button2_need_rbutton = 0;
132 FRAME_MSWINDOWS_DATA(f)->button2_is_down = 0; 132 FRAME_MSWINDOWS_DATA(f)->button2_is_down = 0;
133 FRAME_MSWINDOWS_DATA(f)->ignore_next_lbutton_up = 0; 133 FRAME_MSWINDOWS_DATA(f)->ignore_next_lbutton_up = 0;
134 FRAME_MSWINDOWS_DATA(f)->ignore_next_rbutton_up = 0; 134 FRAME_MSWINDOWS_DATA(f)->ignore_next_rbutton_up = 0;
135 FRAME_MSWINDOWS_DATA(f)->sizing = 0; 135 FRAME_MSWINDOWS_DATA(f)->sizing = 0;
136 FRAME_MSWINDOWS_DATA(f)->paint_pending = 0;
136 FRAME_MSWINDOWS_MENU_HASH_TABLE(f) = Qnil; 137 FRAME_MSWINDOWS_MENU_HASH_TABLE(f) = Qnil;
137 #ifdef HAVE_TOOLBARS 138 #ifdef HAVE_TOOLBARS
138 FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) = 139 FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) =
139 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL); 140 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
140 #endif 141 #endif
201 202
202 FRAME_MSWINDOWS_HANDLE(f) = hwnd; 203 FRAME_MSWINDOWS_HANDLE(f) = hwnd;
203 204
204 SetWindowLong (hwnd, XWL_FRAMEOBJ, (LONG)LISP_TO_VOID(frame_obj)); 205 SetWindowLong (hwnd, XWL_FRAMEOBJ, (LONG)LISP_TO_VOID(frame_obj));
205 FRAME_MSWINDOWS_DC(f) = GetDC (hwnd); 206 FRAME_MSWINDOWS_DC(f) = GetDC (hwnd);
206 FRAME_MSWINDOWS_CDC(f) = CreateCompatibleDC (FRAME_MSWINDOWS_CDC(f));
207 SetTextAlign (FRAME_MSWINDOWS_DC(f), TA_BASELINE | TA_LEFT | TA_NOUPDATECP); 207 SetTextAlign (FRAME_MSWINDOWS_DC(f), TA_BASELINE | TA_LEFT | TA_NOUPDATECP);
208 } 208 }
209 209
210 static void 210 static void
211 mswindows_init_frame_2 (struct frame *f, Lisp_Object props) 211 mswindows_init_frame_2 (struct frame *f, Lisp_Object props)
271 static void 271 static void
272 mswindows_delete_frame (struct frame *f) 272 mswindows_delete_frame (struct frame *f)
273 { 273 {
274 if (f->frame_data) 274 if (f->frame_data)
275 { 275 {
276 DeleteDC(FRAME_MSWINDOWS_CDC(f));
277 ReleaseDC(FRAME_MSWINDOWS_HANDLE(f), FRAME_MSWINDOWS_DC(f)); 276 ReleaseDC(FRAME_MSWINDOWS_HANDLE(f), FRAME_MSWINDOWS_DC(f));
278 DestroyWindow(FRAME_MSWINDOWS_HANDLE(f)); 277 DestroyWindow(FRAME_MSWINDOWS_HANDLE(f));
279 xfree (f->frame_data); 278 xfree (f->frame_data);
280 } 279 }
281 f->frame_data = 0; 280 f->frame_data = 0;
608 } 607 }
609 } 608 }
610 609
611 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest) 610 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest)
612 { 611 {
613 RECT rect; 612 RECT rect, ws_rect;
614 int pixel_width, pixel_height; 613 int pixel_width, pixel_height;
615 int size_p = (dest->width >=0 || dest->height >=0); 614 int size_p = (dest->width >=0 || dest->height >=0);
616 int move_p = (dest->top >=0 || dest->left >=0); 615 int move_p = (dest->top >=0 || dest->left >=0);
617 struct device* d = XDEVICE (FRAME_DEVICE (f));
618 char_to_real_pixel_size (f, dest->width, dest->height, &pixel_width, &pixel_height); 616 char_to_real_pixel_size (f, dest->width, dest->height, &pixel_width, &pixel_height);
619 617
620 if (dest->width < 0) 618 if (dest->width < 0)
621 pixel_width = FRAME_PIXWIDTH (f); 619 pixel_width = FRAME_PIXWIDTH (f);
622 if (dest->height < 0) 620 if (dest->height < 0)
635 AdjustWindowRectEx (&rect, 633 AdjustWindowRectEx (&rect,
636 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_STYLE), 634 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_STYLE),
637 GetMenu (FRAME_MSWINDOWS_HANDLE(f)) != NULL, 635 GetMenu (FRAME_MSWINDOWS_HANDLE(f)) != NULL,
638 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_EXSTYLE)); 636 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_EXSTYLE));
639 637
640 /* resize and move the window so that it fits on the screen. This is 638 /* resize and move the window so that it fits in the workspace. This is
641 not restrictive since this will happen later anyway in WM_SIZE. We 639 not restrictive since this will happen later anyway in WM_SIZE. We
642 have to do this after adjusting the rect to account for menubar 640 have to do this after adjusting the rect to account for menubar
643 etc. */ 641 etc. */
642 msw_get_workspace_coords (&ws_rect);
644 pixel_width = rect.right - rect.left; 643 pixel_width = rect.right - rect.left;
645 pixel_height = rect.bottom - rect.top; 644 pixel_height = rect.bottom - rect.top;
646 if (pixel_width > DEVICE_MSWINDOWS_HORZRES(d)) 645 if (pixel_width > ws_rect.right - ws_rect.left)
647 { 646 {
648 pixel_width = DEVICE_MSWINDOWS_HORZRES(d); 647 pixel_width = ws_rect.right - ws_rect.left;
649 size_p=1; 648 size_p=1;
650 } 649 }
651 if (pixel_height > DEVICE_MSWINDOWS_VERTRES(d)) 650 if (pixel_height > ws_rect.bottom - ws_rect.top)
652 { 651 {
653 pixel_height = DEVICE_MSWINDOWS_VERTRES(d); 652 pixel_height = ws_rect.bottom - ws_rect.top;
654 size_p=1; 653 size_p=1;
655 } 654 }
656 655
657 /* adjust position so window is on screen */ 656 /* adjust position so window is in workspace */
658 if (dest->left + pixel_width > DEVICE_MSWINDOWS_HORZRES(d)) 657 if (dest->left + pixel_width > ws_rect.right)
659 { 658 {
660 dest->left = DEVICE_MSWINDOWS_HORZRES(d) - pixel_width; 659 dest->left = ws_rect.right - pixel_width;
661 move_p=1; 660 move_p=1;
662 } 661 }
663 if (dest->top + pixel_height > DEVICE_MSWINDOWS_VERTRES(d)) 662 if (dest->left < ws_rect.left)
664 { 663 {
665 dest->top = DEVICE_MSWINDOWS_VERTRES(d) - pixel_height; 664 dest->left = ws_rect.left;
665 move_p=1;
666 }
667
668 if (dest->top + pixel_height > ws_rect.bottom)
669 {
670 dest->top = ws_rect.bottom - pixel_height;
671 move_p=1;
672 }
673 if (dest->top < ws_rect.top)
674 {
675 dest->top = ws_rect.top;
666 move_p=1; 676 move_p=1;
667 } 677 }
668 678
669 if (IsIconic (FRAME_MSWINDOWS_HANDLE(f)) 679 if (IsIconic (FRAME_MSWINDOWS_HANDLE(f))
670 || IsZoomed (FRAME_MSWINDOWS_HANDLE(f))) 680 || IsZoomed (FRAME_MSWINDOWS_HANDLE(f)))
764 static void 774 static void
765 msprinter_init_frame_3 (struct frame *f) 775 msprinter_init_frame_3 (struct frame *f)
766 { 776 {
767 DOCINFO di; 777 DOCINFO di;
768 struct device *device = XDEVICE (FRAME_DEVICE (f)); 778 struct device *device = XDEVICE (FRAME_DEVICE (f));
769 HDC hdc = DEVICE_MSPRINTER_HDC (device); 779 HDC hdc;
770 int frame_left, frame_top, frame_width, frame_height; 780 int frame_left, frame_top, frame_width, frame_height;
771 781
772 /* Change printer parameters */ 782 /* Change printer parameters */
773 { 783 {
774 DEVMODE* devmode = msprinter_get_devmode_copy (device); 784 DEVMODE* devmode = msprinter_get_devmode_copy (device);
796 devmode->dmDuplex = DMDUP_HORIZONTAL; 806 devmode->dmDuplex = DMDUP_HORIZONTAL;
797 else 807 else
798 abort(); 808 abort();
799 } 809 }
800 810
811 assert (!FRAME_MSPRINTER_PAGE_STARTED (f));
801 msprinter_apply_devmode (device, devmode); 812 msprinter_apply_devmode (device, devmode);
802 } 813 }
814
815 /* DC might be recreated in msprinter_apply_devmode,
816 so do not initialize until now */
817 hdc = DEVICE_MSPRINTER_HDC (device);
803 818
804 /* Compute geometry properties */ 819 /* Compute geometry properties */
805 frame_left = (MulDiv (GetDeviceCaps (hdc, LOGPIXELSX), 820 frame_left = (MulDiv (GetDeviceCaps (hdc, LOGPIXELSX),
806 FRAME_MSPRINTER_LEFT_MARGIN(f), 1440) 821 FRAME_MSPRINTER_LEFT_MARGIN(f), 1440)
807 - GetDeviceCaps (hdc, PHYSICALOFFSETX)); 822 - GetDeviceCaps (hdc, PHYSICALOFFSETX));
876 891
877 if (StartDoc (hdc, &di) <= 0) 892 if (StartDoc (hdc, &di) <= 0)
878 error ("Cannot start print job"); 893 error ("Cannot start print job");
879 894
880 /* Finish frame setup */ 895 /* Finish frame setup */
881 FRAME_MSPRINTER_CDC(f) = CreateCompatibleDC (hdc);
882 FRAME_MSPRINTER_JOB_STARTED (f) = 1; 896 FRAME_MSPRINTER_JOB_STARTED (f) = 1;
883 FRAME_VISIBLE_P(f) = 0; 897 FRAME_VISIBLE_P(f) = 0;
884 } 898 }
885 899
886 static void 900 static void
902 HDC hdc = DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f))); 916 HDC hdc = DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f)));
903 if (FRAME_MSPRINTER_PAGE_STARTED (f)) 917 if (FRAME_MSPRINTER_PAGE_STARTED (f))
904 EndPage (hdc); 918 EndPage (hdc);
905 if (FRAME_MSPRINTER_JOB_STARTED (f)) 919 if (FRAME_MSPRINTER_JOB_STARTED (f))
906 EndDoc (hdc); 920 EndDoc (hdc);
907 if (FRAME_MSPRINTER_CDC(f))
908 DeleteDC (FRAME_MSPRINTER_CDC(f));
909 xfree (f->frame_data); 921 xfree (f->frame_data);
910 } 922 }
911 923
912 f->frame_data = 0; 924 f->frame_data = 0;
913 } 925 }