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 }