Mercurial > hg > xemacs-beta
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 } |