Mercurial > hg > xemacs-beta
comparison src/frame-msw.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | 11054d720c21 |
comparison
equal
deleted
inserted
replaced
411:12e008d41344 | 412:697ef44129c6 |
---|---|
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 regular frame size, in characters */ | 61 /* Default popup 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 |
68 #define ADJR_MENUFLAG FALSE | 68 #define ADJR_MENUFLAG FALSE |
69 #endif | 69 #endif |
70 | 70 |
71 /* Default properties to use when creating frames. */ | 71 /* Default properties to use when creating frames. */ |
72 Lisp_Object Vdefault_mswindows_frame_plist; | 72 Lisp_Object Vdefault_mswindows_frame_plist; |
73 Lisp_Object Vdefault_msprinter_frame_plist; | |
74 Lisp_Object Vmswindows_use_system_frame_size_defaults; | 73 Lisp_Object Vmswindows_use_system_frame_size_defaults; |
75 | 74 |
76 /* This does not need to be GC protected, as it holds a | 75 /* This does not need to be GC protected, as it holds a |
77 frame Lisp_Object already protected by Fmake_frame */ | 76 frame Lisp_Object already protected by Fmake_frame */ |
78 Lisp_Object Vmswindows_frame_being_created; | 77 Lisp_Object Vmswindows_frame_being_created; |
79 | |
80 /*---------------------------------------------------------------------*/ | |
81 /*----- DISPLAY FRAME -----*/ | |
82 /*---------------------------------------------------------------------*/ | |
83 | |
84 HWND | |
85 mswindows_get_selected_frame_hwnd (void) | |
86 { | |
87 Lisp_Object frame, device; | |
88 | |
89 device = Ffind_device (Qnil, Qmswindows); | |
90 if (NILP (device)) | |
91 return NULL; | |
92 frame = DEVICE_SELECTED_FRAME (XDEVICE (device)); | |
93 if (NILP (frame)) | |
94 return NULL; | |
95 | |
96 return FRAME_MSWINDOWS_HANDLE (XFRAME (frame)); | |
97 } | |
98 | 78 |
99 static void | 79 static void |
100 mswindows_init_frame_1 (struct frame *f, Lisp_Object props) | 80 mswindows_init_frame_1 (struct frame *f, Lisp_Object props) |
101 { | 81 { |
102 Lisp_Object initially_unmapped; | 82 Lisp_Object initially_unmapped; |
140 abs (XINT (width)); | 120 abs (XINT (width)); |
141 FRAME_MSWINDOWS_TARGET_RECT (f)->height = NILP (height) ? -1 : | 121 FRAME_MSWINDOWS_TARGET_RECT (f)->height = NILP (height) ? -1 : |
142 abs (XINT (height)); | 122 abs (XINT (height)); |
143 | 123 |
144 /* Misc frame stuff */ | 124 /* Misc frame stuff */ |
125 FRAME_MSWINDOWS_DATA(f)->button2_need_lbutton = 0; | |
126 FRAME_MSWINDOWS_DATA(f)->button2_need_rbutton = 0; | |
127 FRAME_MSWINDOWS_DATA(f)->button2_is_down = 0; | |
128 FRAME_MSWINDOWS_DATA(f)->ignore_next_lbutton_up = 0; | |
129 FRAME_MSWINDOWS_DATA(f)->ignore_next_rbutton_up = 0; | |
130 FRAME_MSWINDOWS_DATA(f)->sizing = 0; | |
145 FRAME_MSWINDOWS_MENU_HASH_TABLE(f) = Qnil; | 131 FRAME_MSWINDOWS_MENU_HASH_TABLE(f) = Qnil; |
146 #ifdef HAVE_TOOLBARS | 132 #ifdef HAVE_TOOLBARS |
147 FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) = | 133 FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) = |
148 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL); | 134 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL); |
149 #endif | 135 #endif |
150 /* hashtable of instantiated glyphs on the frame. */ | 136 /* hashtable of instantiated glyphs on the frame. */ |
151 FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f) = | 137 FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f) = |
152 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, HASH_TABLE_EQUAL); | |
153 FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f) = | |
154 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, HASH_TABLE_EQUAL); | |
155 FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f) = | |
156 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, HASH_TABLE_EQUAL); | 138 make_lisp_hash_table (50, HASH_TABLE_VALUE_WEAK, HASH_TABLE_EQUAL); |
157 /* Will initialize these in WM_SIZE handler. We cannot do it now, | 139 /* Will initialize these in WM_SIZE handler. We cannot do it now, |
158 because we do not know what is CW_USEDEFAULT height and width */ | 140 because we do not know what is CW_USEDEFAULT height and width */ |
159 FRAME_WIDTH (f) = 0; | 141 FRAME_WIDTH (f) = 0; |
160 FRAME_HEIGHT (f) = 0; | 142 FRAME_HEIGHT (f) = 0; |
198 | 180 |
199 hwnd = CreateWindowEx (exstyle, | 181 hwnd = CreateWindowEx (exstyle, |
200 XEMACS_CLASS, | 182 XEMACS_CLASS, |
201 STRINGP(f->name) ? XSTRING_DATA(f->name) : | 183 STRINGP(f->name) ? XSTRING_DATA(f->name) : |
202 (STRINGP(name) ? | 184 (STRINGP(name) ? |
203 (const Extbyte*)XSTRING_DATA(name) : | 185 (CONST Extbyte*)XSTRING_DATA(name) : |
204 (const Extbyte*)XEMACS_CLASS), | 186 (CONST Extbyte*)XEMACS_CLASS), |
205 style, | 187 style, |
206 rect_default.left, rect_default.top, | 188 rect_default.left, rect_default.top, |
207 rect_default.width, rect_default.height, | 189 rect_default.width, rect_default.height, |
208 hwnd_parent, NULL, NULL, NULL); | 190 hwnd_parent, NULL, NULL, NULL); |
209 | 191 |
214 | 196 |
215 FRAME_MSWINDOWS_HANDLE(f) = hwnd; | 197 FRAME_MSWINDOWS_HANDLE(f) = hwnd; |
216 | 198 |
217 SetWindowLong (hwnd, XWL_FRAMEOBJ, (LONG)LISP_TO_VOID(frame_obj)); | 199 SetWindowLong (hwnd, XWL_FRAMEOBJ, (LONG)LISP_TO_VOID(frame_obj)); |
218 FRAME_MSWINDOWS_DC(f) = GetDC (hwnd); | 200 FRAME_MSWINDOWS_DC(f) = GetDC (hwnd); |
201 FRAME_MSWINDOWS_CDC(f) = CreateCompatibleDC (FRAME_MSWINDOWS_CDC(f)); | |
219 SetTextAlign (FRAME_MSWINDOWS_DC(f), TA_BASELINE | TA_LEFT | TA_NOUPDATECP); | 202 SetTextAlign (FRAME_MSWINDOWS_DC(f), TA_BASELINE | TA_LEFT | TA_NOUPDATECP); |
220 } | 203 } |
221 | 204 |
222 static void | 205 static void |
223 mswindows_init_frame_2 (struct frame *f, Lisp_Object props) | 206 mswindows_init_frame_2 (struct frame *f, Lisp_Object props) |
263 if (first_on_console) | 246 if (first_on_console) |
264 redisplay (); | 247 redisplay (); |
265 } | 248 } |
266 | 249 |
267 static void | 250 static void |
268 mswindows_mark_frame (struct frame *f) | 251 mswindows_mark_frame (struct frame *f, void (*markobj) (Lisp_Object)) |
269 { | 252 { |
270 mark_object (FRAME_MSWINDOWS_MENU_HASH_TABLE (f)); | 253 markobj (FRAME_MSWINDOWS_MENU_HASH_TABLE (f)); |
271 #ifdef HAVE_TOOLBARS | 254 #ifdef HAVE_TOOLBARS |
272 mark_object (FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE (f)); | 255 markobj (FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE (f)); |
273 #endif | 256 #endif |
274 mark_object (FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f)); | 257 markobj (FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f)); |
275 mark_object (FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f)); | |
276 mark_object (FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f)); | |
277 } | 258 } |
278 | 259 |
279 static void | 260 static void |
280 mswindows_focus_on_frame (struct frame *f) | 261 mswindows_focus_on_frame (struct frame *f) |
281 { | 262 { |
285 static void | 266 static void |
286 mswindows_delete_frame (struct frame *f) | 267 mswindows_delete_frame (struct frame *f) |
287 { | 268 { |
288 if (f->frame_data) | 269 if (f->frame_data) |
289 { | 270 { |
271 DeleteDC(FRAME_MSWINDOWS_CDC(f)); | |
290 ReleaseDC(FRAME_MSWINDOWS_HANDLE(f), FRAME_MSWINDOWS_DC(f)); | 272 ReleaseDC(FRAME_MSWINDOWS_HANDLE(f), FRAME_MSWINDOWS_DC(f)); |
291 DestroyWindow(FRAME_MSWINDOWS_HANDLE(f)); | 273 DestroyWindow(FRAME_MSWINDOWS_HANDLE(f)); |
292 xfree (f->frame_data); | 274 xfree (f->frame_data); |
293 } | 275 } |
294 f->frame_data = 0; | 276 f->frame_data = 0; |
610 is initialised in the frame (toolbars for instance). enabling | 592 is initialised in the frame (toolbars for instance). enabling |
611 this always makes no visible difference and fixes a whole host of | 593 this always makes no visible difference and fixes a whole host of |
612 bugs (and is more consistent with X) so I am going to reenable it. | 594 bugs (and is more consistent with X) so I am going to reenable it. |
613 --andyp */ | 595 --andyp */ |
614 if ( FRAME_PIXWIDTH (f) && FRAME_PIXHEIGHT (f) | 596 if ( FRAME_PIXWIDTH (f) && FRAME_PIXHEIGHT (f) |
615 && (width_specified_p || height_specified_p | 597 && (width_specified_p || height_specified_p || x_specified_p || y_specified_p)) |
616 || x_specified_p || y_specified_p)) | |
617 { | 598 { |
618 XEMACS_RECT_WH dest = { x, y, width, height }; | 599 XEMACS_RECT_WH dest = { x, y, width, height }; |
619 | 600 |
620 mswindows_size_frame_internal (f, &dest); | 601 mswindows_size_frame_internal (f, &dest); |
621 } | 602 } |
622 } | 603 } |
623 | 604 |
624 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest) | 605 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest) |
625 { | 606 { |
626 RECT rect, ws_rect; | 607 RECT rect; |
627 int pixel_width, pixel_height; | 608 int pixel_width, pixel_height; |
628 int size_p = (dest->width >=0 || dest->height >=0); | 609 int size_p = (dest->width >=0 || dest->height >=0); |
629 int move_p = (dest->top >=0 || dest->left >=0); | 610 int move_p = (dest->top >=0 || dest->left >=0); |
611 struct device* d = XDEVICE (FRAME_DEVICE (f)); | |
630 char_to_real_pixel_size (f, dest->width, dest->height, &pixel_width, &pixel_height); | 612 char_to_real_pixel_size (f, dest->width, dest->height, &pixel_width, &pixel_height); |
631 | 613 |
632 if (dest->width < 0) | 614 if (dest->width < 0) |
633 pixel_width = FRAME_PIXWIDTH (f); | 615 pixel_width = FRAME_PIXWIDTH (f); |
634 if (dest->height < 0) | 616 if (dest->height < 0) |
647 AdjustWindowRectEx (&rect, | 629 AdjustWindowRectEx (&rect, |
648 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_STYLE), | 630 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_STYLE), |
649 GetMenu (FRAME_MSWINDOWS_HANDLE(f)) != NULL, | 631 GetMenu (FRAME_MSWINDOWS_HANDLE(f)) != NULL, |
650 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_EXSTYLE)); | 632 GetWindowLong (FRAME_MSWINDOWS_HANDLE(f), GWL_EXSTYLE)); |
651 | 633 |
652 /* resize and move the window so that it fits in the workspace. This is | 634 /* resize and move the window so that it fits on the screen. This is |
653 not restrictive since this will happen later anyway in WM_SIZE. We | 635 not restrictive since this will happen later anyway in WM_SIZE. We |
654 have to do this after adjusting the rect to account for menubar | 636 have to do this after adjusting the rect to account for menubar |
655 etc. */ | 637 etc. */ |
656 mswindows_get_workspace_coords (&ws_rect); | |
657 pixel_width = rect.right - rect.left; | 638 pixel_width = rect.right - rect.left; |
658 pixel_height = rect.bottom - rect.top; | 639 pixel_height = rect.bottom - rect.top; |
659 if (pixel_width > ws_rect.right - ws_rect.left) | 640 if (pixel_width > DEVICE_MSWINDOWS_HORZRES(d)) |
660 { | 641 { |
661 pixel_width = ws_rect.right - ws_rect.left; | 642 pixel_width = DEVICE_MSWINDOWS_HORZRES(d); |
662 size_p=1; | 643 size_p=1; |
663 } | 644 } |
664 if (pixel_height > ws_rect.bottom - ws_rect.top) | 645 if (pixel_height > DEVICE_MSWINDOWS_VERTRES(d)) |
665 { | 646 { |
666 pixel_height = ws_rect.bottom - ws_rect.top; | 647 pixel_height = DEVICE_MSWINDOWS_VERTRES(d); |
667 size_p=1; | 648 size_p=1; |
668 } | 649 } |
669 | 650 |
670 /* adjust position so window is in workspace */ | 651 /* adjust position so window is on screen */ |
671 if (dest->left + pixel_width > ws_rect.right) | 652 if (dest->left + pixel_width > DEVICE_MSWINDOWS_HORZRES(d)) |
672 { | 653 { |
673 dest->left = ws_rect.right - pixel_width; | 654 dest->left = DEVICE_MSWINDOWS_HORZRES(d) - pixel_width; |
674 move_p=1; | 655 move_p=1; |
675 } | 656 } |
676 if (dest->left < ws_rect.left) | 657 if (dest->top + pixel_height > DEVICE_MSWINDOWS_VERTRES(d)) |
677 { | 658 { |
678 dest->left = ws_rect.left; | 659 dest->top = DEVICE_MSWINDOWS_VERTRES(d) - pixel_height; |
679 move_p=1; | |
680 } | |
681 | |
682 if (dest->top + pixel_height > ws_rect.bottom) | |
683 { | |
684 dest->top = ws_rect.bottom - pixel_height; | |
685 move_p=1; | |
686 } | |
687 if (dest->top < ws_rect.top) | |
688 { | |
689 dest->top = ws_rect.top; | |
690 move_p=1; | 660 move_p=1; |
691 } | 661 } |
692 | 662 |
693 if (IsIconic (FRAME_MSWINDOWS_HANDLE(f)) | 663 if (IsIconic (FRAME_MSWINDOWS_HANDLE(f)) |
694 || IsZoomed (FRAME_MSWINDOWS_HANDLE(f))) | 664 || IsZoomed (FRAME_MSWINDOWS_HANDLE(f))) |
727 { | 697 { |
728 /* Frame size cannot change if the frame is maximized */ | 698 /* Frame size cannot change if the frame is maximized */ |
729 return IsZoomed (FRAME_MSWINDOWS_HANDLE (f)); | 699 return IsZoomed (FRAME_MSWINDOWS_HANDLE (f)); |
730 } | 700 } |
731 | 701 |
732 /*---------------------------------------------------------------------*/ | |
733 /*----- PRINTER FRAME -----*/ | |
734 /*---------------------------------------------------------------------*/ | |
735 | |
736 /* | |
737 * With some drvier/os combination (I discovered this with HP drviers | |
738 * under W2K), DC geometry is reset upon StartDoc and EndPage | |
739 * calls. This is called every time one of these calls is made. | |
740 */ | |
741 static void | |
742 apply_dc_geometry (struct frame* f) | |
743 { | |
744 HDC hdc = DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f))); | |
745 SetTextAlign (hdc, TA_BASELINE | TA_LEFT | TA_NOUPDATECP); | |
746 SetViewportOrgEx (hdc, FRAME_MSPRINTER_PIXLEFT(f), | |
747 FRAME_MSPRINTER_PIXTOP(f), NULL); | |
748 } | |
749 | |
750 void | |
751 msprinter_start_page (struct frame *f) | |
752 { | |
753 if (!FRAME_MSPRINTER_PAGE_STARTED (f)) | |
754 { | |
755 FRAME_MSPRINTER_PAGE_STARTED (f) = 1; | |
756 StartPage (DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f)))); | |
757 apply_dc_geometry (f); | |
758 } | |
759 } | |
760 | |
761 static void | |
762 error_frame_unsizable (struct frame *f) | |
763 { | |
764 Lisp_Object frame; | |
765 XSETFRAME (frame, f); | |
766 signal_simple_error ("Cannot resize frame (margins)" | |
767 " after print job has started.", frame); | |
768 } | |
769 | |
770 static void | |
771 maybe_error_if_job_active (struct frame *f) | |
772 { | |
773 if (FRAME_MSPRINTER_JOB_STARTED (f)) | |
774 error_frame_unsizable (f); | |
775 } | |
776 | |
777 static void | |
778 msprinter_init_frame_1 (struct frame *f, Lisp_Object props) | |
779 { | |
780 /* Make sure this is the only frame on device. Windows printer can | |
781 handle only one job at a time. */ | |
782 if (!NILP (DEVICE_FRAME_LIST (XDEVICE (FRAME_DEVICE (f))))) | |
783 error ("Only one frame (print job) at a time is allowed on " | |
784 "this printer device."); | |
785 | |
786 f->frame_data = xnew_and_zero (struct msprinter_frame); | |
787 | |
788 /* Default margin size is 1" = 1440 twips */ | |
789 FRAME_MSPRINTER_TOP_MARGIN(f) = 1440; | |
790 FRAME_MSPRINTER_BOTTOM_MARGIN(f) = 1440; | |
791 FRAME_MSPRINTER_LEFT_MARGIN(f) = 1440; | |
792 FRAME_MSPRINTER_RIGHT_MARGIN(f) = 1440; | |
793 | |
794 /* Negative for "uinspecified" */ | |
795 FRAME_MSPRINTER_CHARWIDTH(f) = -1; | |
796 FRAME_MSPRINTER_CHARHEIGHT(f) = -1; | |
797 } | |
798 | |
799 static void | |
800 msprinter_init_frame_3 (struct frame *f) | |
801 { | |
802 DOCINFO di; | |
803 struct device *device = XDEVICE (FRAME_DEVICE (f)); | |
804 HDC hdc; | |
805 int frame_left, frame_top, frame_width, frame_height; | |
806 | |
807 /* DC might be recreated in msprinter_apply_devmode, | |
808 so do not initialize until now */ | |
809 hdc = DEVICE_MSPRINTER_HDC (device); | |
810 | |
811 /* Compute geometry properties */ | |
812 frame_left = (MulDiv (GetDeviceCaps (hdc, LOGPIXELSX), | |
813 FRAME_MSPRINTER_LEFT_MARGIN(f), 1440) | |
814 - GetDeviceCaps (hdc, PHYSICALOFFSETX)); | |
815 | |
816 if (FRAME_MSPRINTER_CHARWIDTH(f) > 0) | |
817 { | |
818 char_to_real_pixel_size (f, FRAME_MSPRINTER_CHARWIDTH(f), 0, | |
819 &frame_width, NULL); | |
820 FRAME_MSPRINTER_RIGHT_MARGIN(f) = | |
821 MulDiv (GetDeviceCaps (hdc, PHYSICALWIDTH) | |
822 - (frame_left + frame_width), 1440, | |
823 GetDeviceCaps (hdc, LOGPIXELSX)); | |
824 } | |
825 else | |
826 frame_width = (GetDeviceCaps (hdc, PHYSICALWIDTH) | |
827 - frame_left | |
828 - MulDiv (GetDeviceCaps (hdc, LOGPIXELSX), | |
829 FRAME_MSPRINTER_RIGHT_MARGIN(f), 1440)); | |
830 | |
831 frame_top = (MulDiv (GetDeviceCaps (hdc, LOGPIXELSY), | |
832 FRAME_MSPRINTER_TOP_MARGIN(f), 1440) | |
833 - GetDeviceCaps (hdc, PHYSICALOFFSETY)); | |
834 | |
835 if (FRAME_MSPRINTER_CHARHEIGHT(f) > 0) | |
836 { | |
837 char_to_real_pixel_size (f, 0, FRAME_MSPRINTER_CHARHEIGHT(f), | |
838 NULL, &frame_height); | |
839 | |
840 FRAME_MSPRINTER_BOTTOM_MARGIN(f) = | |
841 MulDiv (GetDeviceCaps (hdc, PHYSICALHEIGHT) | |
842 - (frame_top + frame_height), 1440, | |
843 GetDeviceCaps (hdc, LOGPIXELSY)); | |
844 } | |
845 else | |
846 frame_height = (GetDeviceCaps (hdc, PHYSICALHEIGHT) | |
847 - frame_top | |
848 - MulDiv (GetDeviceCaps (hdc, LOGPIXELSY), | |
849 FRAME_MSPRINTER_BOTTOM_MARGIN(f), 1440)); | |
850 | |
851 /* Geometry sanity checks */ | |
852 if (!frame_pixsize_valid_p (f, frame_width, frame_height)) | |
853 error ("Area inside print margins has shrunk to naught."); | |
854 | |
855 if (frame_left < 0 | |
856 || frame_top < 0 | |
857 || frame_left + frame_width > GetDeviceCaps (hdc, HORZRES) | |
858 || frame_top + frame_height > GetDeviceCaps (hdc, VERTRES)) | |
859 error ("Print area is ouside of the printer's hardware printable area."); | |
860 | |
861 /* Apply XEmacs frame geometry and layout windows */ | |
862 { | |
863 int rows, columns; | |
864 FRAME_PIXWIDTH(f) = frame_width; | |
865 FRAME_PIXHEIGHT(f) = frame_height; | |
866 pixel_to_char_size (f, frame_width, frame_height, &columns, &rows); | |
867 change_frame_size (f, rows, columns, 0); | |
868 } | |
869 | |
870 FRAME_MSPRINTER_PIXLEFT(f) = frame_left; | |
871 FRAME_MSPRINTER_PIXTOP(f) = frame_top; | |
872 | |
873 /* Start print job */ | |
874 di.cbSize = sizeof (di); | |
875 di.lpszDocName = (STRINGP(f->name) | |
876 ? (char*) XSTRING_DATA(f->name) | |
877 : "XEmacs print document"); | |
878 di.lpszOutput = NULL; | |
879 di.lpszDatatype = NULL; | |
880 di.fwType = 0; | |
881 | |
882 if (StartDoc (hdc, &di) <= 0) | |
883 error ("Cannot start print job"); | |
884 | |
885 apply_dc_geometry (f); | |
886 | |
887 /* Finish frame setup */ | |
888 FRAME_MSPRINTER_JOB_STARTED (f) = 1; | |
889 FRAME_VISIBLE_P(f) = 0; | |
890 } | |
891 | |
892 static void | |
893 msprinter_mark_frame (struct frame *f) | |
894 { | |
895 } | |
896 | |
897 static void | |
898 msprinter_delete_frame (struct frame *f) | |
899 { | |
900 if (f->frame_data) | |
901 { | |
902 HDC hdc = DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f))); | |
903 if (FRAME_MSPRINTER_PAGE_STARTED (f)) | |
904 EndPage (hdc); | |
905 if (FRAME_MSPRINTER_JOB_STARTED (f)) | |
906 EndDoc (hdc); | |
907 xfree (f->frame_data); | |
908 } | |
909 | |
910 f->frame_data = 0; | |
911 } | |
912 | |
913 static Lisp_Object | |
914 msprinter_frame_property (struct frame *f, Lisp_Object property) | |
915 { | |
916 if (EQ (Qleft_margin, property)) | |
917 return make_int (FRAME_MSPRINTER_LEFT_MARGIN(f)); | |
918 else if (EQ (Qtop_margin, property)) | |
919 return make_int (FRAME_MSPRINTER_TOP_MARGIN(f)); | |
920 if (EQ (Qright_margin, property)) | |
921 return make_int (FRAME_MSPRINTER_RIGHT_MARGIN(f)); | |
922 else if (EQ (Qbottom_margin, property)) | |
923 return make_int (FRAME_MSPRINTER_BOTTOM_MARGIN(f)); | |
924 else | |
925 return Qunbound; | |
926 } | |
927 | |
928 static int | |
929 msprinter_internal_frame_property_p (struct frame *f, Lisp_Object property) | |
930 { | |
931 return (EQ (Qleft_margin, property) || EQ (Qtop_margin, property) || | |
932 EQ (Qright_margin, property) || EQ (Qbottom_margin, property)); | |
933 } | |
934 | |
935 static Lisp_Object | |
936 msprinter_frame_properties (struct frame *f) | |
937 { | |
938 Lisp_Object props = Qnil; | |
939 props = cons3 (Qbottom_margin, | |
940 make_int (FRAME_MSPRINTER_BOTTOM_MARGIN(f)), props); | |
941 props = cons3 (Qright_margin, | |
942 make_int (FRAME_MSPRINTER_RIGHT_MARGIN(f)), props); | |
943 props = cons3 (Qtop_margin, | |
944 make_int (FRAME_MSPRINTER_TOP_MARGIN(f)), props); | |
945 props = cons3 (Qleft_margin, | |
946 make_int (FRAME_MSPRINTER_LEFT_MARGIN(f)), props); | |
947 return props; | |
948 } | |
949 | |
950 static void | |
951 msprinter_set_frame_properties (struct frame *f, Lisp_Object plist) | |
952 { | |
953 Lisp_Object tail; | |
954 | |
955 /* Extract the properties from plist */ | |
956 for (tail = plist; !NILP (tail); tail = Fcdr (Fcdr (tail))) | |
957 { | |
958 Lisp_Object prop = Fcar (tail); | |
959 Lisp_Object val = Fcar (Fcdr (tail)); | |
960 | |
961 if (SYMBOLP (prop)) | |
962 { | |
963 if (EQ (prop, Qwidth)) | |
964 { | |
965 maybe_error_if_job_active (f); | |
966 if (!NILP (val)) | |
967 { | |
968 CHECK_NATNUM (val); | |
969 FRAME_MSPRINTER_CHARWIDTH(f) = XINT (val); | |
970 } | |
971 } | |
972 if (EQ (prop, Qheight)) | |
973 { | |
974 maybe_error_if_job_active (f); | |
975 if (!NILP (val)) | |
976 { | |
977 CHECK_NATNUM (val); | |
978 FRAME_MSPRINTER_CHARHEIGHT(f) = XINT (val); | |
979 } | |
980 } | |
981 else if (EQ (prop, Qleft_margin)) | |
982 { | |
983 maybe_error_if_job_active (f); | |
984 CHECK_NATNUM (val); | |
985 FRAME_MSPRINTER_LEFT_MARGIN(f) = XINT (val); | |
986 } | |
987 else if (EQ (prop, Qtop_margin)) | |
988 { | |
989 maybe_error_if_job_active (f); | |
990 CHECK_NATNUM (val); | |
991 FRAME_MSPRINTER_TOP_MARGIN(f) = XINT (val); | |
992 } | |
993 else if (EQ (prop, Qright_margin)) | |
994 { | |
995 maybe_error_if_job_active (f); | |
996 CHECK_NATNUM (val); | |
997 FRAME_MSPRINTER_RIGHT_MARGIN(f) = XINT (val); | |
998 } | |
999 else if (EQ (prop, Qbottom_margin)) | |
1000 { | |
1001 maybe_error_if_job_active (f); | |
1002 CHECK_NATNUM (val); | |
1003 FRAME_MSPRINTER_BOTTOM_MARGIN(f) = XINT (val); | |
1004 } | |
1005 } | |
1006 } | |
1007 } | |
1008 | |
1009 static void | |
1010 msprinter_set_frame_size (struct frame *f, int width, int height) | |
1011 { | |
1012 /* We're absolutely unsizeable */ | |
1013 error_frame_unsizable (f); | |
1014 } | |
1015 | |
1016 static void | |
1017 msprinter_eject_page (struct frame *f) | |
1018 { | |
1019 /* #### Should we eject empty pages? */ | |
1020 if (FRAME_MSPRINTER_PAGE_STARTED (f)) | |
1021 { | |
1022 FRAME_MSPRINTER_PAGE_STARTED (f) = 0; | |
1023 EndPage (DEVICE_MSPRINTER_HDC (XDEVICE (FRAME_DEVICE (f)))); | |
1024 apply_dc_geometry (f); | |
1025 } | |
1026 } | |
1027 | |
1028 | |
1029 void | 702 void |
1030 console_type_create_frame_mswindows (void) | 703 console_type_create_frame_mswindows (void) |
1031 { | 704 { |
1032 /* Display frames */ | 705 /* frame methods */ |
1033 CONSOLE_HAS_METHOD (mswindows, init_frame_1); | 706 CONSOLE_HAS_METHOD (mswindows, init_frame_1); |
1034 CONSOLE_HAS_METHOD (mswindows, init_frame_2); | 707 CONSOLE_HAS_METHOD (mswindows, init_frame_2); |
1035 CONSOLE_HAS_METHOD (mswindows, init_frame_3); | 708 CONSOLE_HAS_METHOD (mswindows, init_frame_3); |
1036 CONSOLE_HAS_METHOD (mswindows, after_init_frame); | 709 CONSOLE_HAS_METHOD (mswindows, after_init_frame); |
1037 CONSOLE_HAS_METHOD (mswindows, mark_frame); | 710 CONSOLE_HAS_METHOD (mswindows, mark_frame); |
1058 CONSOLE_HAS_METHOD (mswindows, set_frame_pointer); | 731 CONSOLE_HAS_METHOD (mswindows, set_frame_pointer); |
1059 CONSOLE_HAS_METHOD (mswindows, set_frame_icon); | 732 CONSOLE_HAS_METHOD (mswindows, set_frame_icon); |
1060 CONSOLE_HAS_METHOD (mswindows, get_frame_parent); | 733 CONSOLE_HAS_METHOD (mswindows, get_frame_parent); |
1061 CONSOLE_HAS_METHOD (mswindows, update_frame_external_traits); | 734 CONSOLE_HAS_METHOD (mswindows, update_frame_external_traits); |
1062 CONSOLE_HAS_METHOD (mswindows, frame_size_fixed_p); | 735 CONSOLE_HAS_METHOD (mswindows, frame_size_fixed_p); |
1063 | |
1064 /* Printer frames, aka print jobs */ | |
1065 CONSOLE_HAS_METHOD (msprinter, init_frame_1); | |
1066 CONSOLE_HAS_METHOD (msprinter, init_frame_3); | |
1067 CONSOLE_HAS_METHOD (msprinter, mark_frame); | |
1068 CONSOLE_HAS_METHOD (msprinter, delete_frame); | |
1069 CONSOLE_HAS_METHOD (msprinter, frame_property); | |
1070 CONSOLE_HAS_METHOD (msprinter, internal_frame_property_p); | |
1071 CONSOLE_HAS_METHOD (msprinter, frame_properties); | |
1072 CONSOLE_HAS_METHOD (msprinter, set_frame_properties); | |
1073 CONSOLE_HAS_METHOD (msprinter, set_frame_size); | |
1074 CONSOLE_HAS_METHOD (msprinter, eject_page); | |
1075 } | 736 } |
1076 | 737 |
1077 void | 738 void |
1078 syms_of_frame_mswindows (void) | 739 syms_of_frame_mswindows (void) |
1079 { | 740 { |
1080 } | 741 } |
1081 | 742 |
1082 void | 743 void |
1083 reinit_vars_of_frame_mswindows (void) | 744 vars_of_frame_mswindows (void) |
1084 { | 745 { |
1085 /* Needn't staticpro -- see comment above. */ | 746 /* Needn't staticpro -- see comment above. */ |
1086 Vmswindows_frame_being_created = Qnil; | 747 Vmswindows_frame_being_created = Qnil; |
1087 } | |
1088 | |
1089 void | |
1090 vars_of_frame_mswindows (void) | |
1091 { | |
1092 reinit_vars_of_frame_mswindows (); | |
1093 | 748 |
1094 DEFVAR_LISP ("mswindows-use-system-frame-size-defaults", &Vmswindows_use_system_frame_size_defaults /* | 749 DEFVAR_LISP ("mswindows-use-system-frame-size-defaults", &Vmswindows_use_system_frame_size_defaults /* |
1095 Controls whether to use system or XEmacs defaults for frame size. | 750 Controls whether to use system or XEmacs defaults for frame size. |
1096 If nil then reasonable defaults are used for intial frame sizes. If t | 751 If nil then reasonable defaults are used for intial frame sizes. If t |
1097 then the system will choose default sizes for the frame. | 752 then the system will choose default sizes for the frame. |
1136 */ ); | 791 */ ); |
1137 Vdefault_mswindows_frame_plist = Qnil; | 792 Vdefault_mswindows_frame_plist = Qnil; |
1138 | 793 |
1139 mswindows_console_methods->device_specific_frame_props = | 794 mswindows_console_methods->device_specific_frame_props = |
1140 &Vdefault_mswindows_frame_plist; | 795 &Vdefault_mswindows_frame_plist; |
1141 | 796 } |
1142 DEFVAR_LISP ("default-msprinter-frame-plist", &Vdefault_msprinter_frame_plist /* | |
1143 Plist of default frame-creation properties for msprinter print job frames. | |
1144 These override what is specified in `default-frame-plist', but are | |
1145 overridden by the arguments to the particular call to `make-frame'. | |
1146 | |
1147 Note: In many cases, properties of a frame are available as specifiers | |
1148 instead of through the frame-properties mechanism. | |
1149 | |
1150 Here is a list of recognized frame properties, other than those | |
1151 documented in `set-frame-properties' (they can be queried and | |
1152 set at any time, except as otherwise noted): | |
1153 | |
1154 left-margin Margin of the page, in twips. Twip is a | |
1155 top-margin typographical unit of measurement, | |
1156 right-margin equal to 1/1440 of an inch, or 1/20 of a | |
1157 bottom-margin point, and roughly equal to 7/400 of a | |
1158 millimeter. If not specifified, each margin | |
1159 defaults to one inch (25.4 mm). | |
1160 | |
1161 MARGINS NOTE. right-margin and bottom-margin are overridden by | |
1162 the height and width properties. If you want to specify size | |
1163 of the printable area in character, as with the rest of XEmacs, | |
1164 use these properties. If height and/or width are nil, then | |
1165 corresponding margin setting is taken into account. If you | |
1166 specify height and/or width in `default-frame-plist', but still | |
1167 want to specify right/bottom margins, set height/width in this | |
1168 plist to nil, as in this example: | |
1169 | |
1170 (setq default-frame-plist '(height 55 'width 80) | |
1171 default-msprinter-frame-plist '(height nil 'width nil)) | |
1172 | |
1173 See also `default-frame-plist', which specifies properties which apply | |
1174 to all frames, not just mswindows frames. | |
1175 */ ); | |
1176 Vdefault_msprinter_frame_plist = Qnil; | |
1177 | |
1178 msprinter_console_methods->device_specific_frame_props = | |
1179 &Vdefault_msprinter_frame_plist; | |
1180 } |