1 /* Define mswindows-specific console, device, and frame object for XEmacs.
2 Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
5 This file is part of XEmacs.
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* Synched up with: Not in FSF. */
27 Ultimately based on FSF, then later on JWZ work for Lemacs.
28 Rewritten over time by Ben Wing and Chuck Thompson.
29 Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0.
32 #ifndef INCLUDED_console_msw_h_
33 #define INCLUDED_console_msw_h_
36 #include "syswindows.h"
37 #include "syscommctrl.h"
43 /* The name of the main window class */
44 #define XEMACS_CLASS "XEmacs"
46 #define XEMACS_CONTROL_CLASS "XEmacsControl"
52 DECLARE_CONSOLE_TYPE (mswindows);
54 struct mswindows_console
59 DECLARE_CONSOLE_TYPE (msprinter);
62 * Printer settings, aka devmode
65 typedef struct Lisp_Devmode
67 struct lcrecord_header header;
69 /* Pointer to the DEVMODE structure */
72 /* Full printer name. It can be longer than devmode->dmDeviceName
73 can accomodate, so need to keep it separately */
76 /* Printer device this object is currently selected in, or Qnil
83 DECLARE_LRECORD (devmode, Lisp_Devmode);
84 #define XDEVMODE(x) XRECORD (x, devmode, Lisp_Devmode)
85 #define XSETDEVMODE(x, p) XSETRECORD (x, p, devmode)
86 #define DEVMODEP(x) RECORDP (x, devmode)
87 #define CHECK_DEVMODE(x) CHECK_RECORD (x, devmode)
88 #define CONCHECK_DEVMODE(x) CONCHECK_RECORD (x, devmode)
90 #define DEVMODE_SIZE(dm) ((dm)->dmSize + (dm)->dmDriverExtra)
91 #define XDEVMODE_SIZE(x) ((x)->devmode ? DEVMODE_SIZE((x)->devmode) : 0)
97 #define MSW_FONTSIZE (LF_FACESIZE*4+12)
99 struct mswindows_device
101 Lisp_Object fontlist; /* List of strings, device fonts */
102 HDC hcdc; /* Compatible DC */
103 DWORD update_tick; /* Used when device is modified through
104 Windows mwssages, see WM_DISPLAYCHANGE
108 #define DEVICE_MSWINDOWS_DATA(d) DEVICE_TYPE_DATA (d, mswindows)
109 #define DEVICE_MSWINDOWS_FONTLIST(d) (DEVICE_MSWINDOWS_DATA (d)->fontlist)
110 #define DEVICE_MSWINDOWS_HCDC(d) (DEVICE_MSWINDOWS_DATA (d)->hcdc)
111 #define DEVICE_MSWINDOWS_UPDATE_TICK(d) (DEVICE_MSWINDOWS_DATA (d)->update_tick)
113 struct msprinter_device
115 HDC hdc, hcdc; /* Printer and the comp. DCs */
119 Lisp_Object fontlist;
122 #define DEVICE_MSPRINTER_DATA(d) DEVICE_TYPE_DATA (d, msprinter)
123 #define DEVICE_MSPRINTER_HDC(d) (DEVICE_MSPRINTER_DATA (d)->hdc)
124 #define DEVICE_MSPRINTER_HCDC(d) (DEVICE_MSPRINTER_DATA (d)->hcdc)
125 #define DEVICE_MSPRINTER_HPRINTER(d) (DEVICE_MSPRINTER_DATA (d)->hprinter)
126 #define DEVICE_MSPRINTER_FONTLIST(d) (DEVICE_MSPRINTER_DATA (d)->fontlist)
127 #define DEVICE_MSPRINTER_NAME(d) (DEVICE_MSPRINTER_DATA (d)->name)
128 #define DEVICE_MSPRINTER_DEVMODE(d) (DEVICE_MSPRINTER_DATA (d)->devmode)
130 #define CONSOLE_TYPESYM_MSPRINTER_P(typesym) EQ (typesym, Qmsprinter)
131 #define DEVICE_MSPRINTER_P(dev) CONSOLE_TYPESYM_MSPRINTER_P (DEVICE_TYPE (dev))
132 #define CHECK_MSPRINTER_DEVICE(z) CHECK_DEVICE_TYPE (z, msprinter)
133 #define CONCHECK_MSPRINTER_DEVICE(z) CONCHECK_DEVICE_TYPE (z, msprinter)
135 /* Printer functions in frame-msw.c */
136 void msprinter_start_page (struct frame *f);
140 #define DEVICE_MSGDI_P(dev) (DEVICE_MSWINDOWS_P(dev) || DEVICE_MSPRINTER_P(dev))
141 #define CHECK_MSGDI_DEVICE(d) \
144 if (!(DEVICEP (d) && DEVICE_MSGDI_P(XDEVICE(d)))) \
145 dead_wrong_type_argument \
146 (list3 (Qor, Qmswindows, Qmsprinter), d); \
148 #define CONCHECK_MSGDI_DEVICE(d) \
151 if (!(DEVICEP (d) && DEVICE_MSGDI_P(XDEVICE(d)))) \
152 wrong_type_argument \
153 (list3 (Qor, Qmswindows, Qmsprinter), d); \
167 struct mswindows_frame
169 /* win32 window handle */
172 /* DC for this win32 window */
175 /* Used with DeferWindowPos */
178 /* Time of last click event, for button 2 emul */
179 DWORD last_click_time;
181 /* Coordinates of last click event, screen-relative */
182 POINTS last_click_point;
184 /* Toolbar hash table. See toolbar-msw.c */
185 Lisp_Object toolbar_hash_table;
186 unsigned int toolbar_checksum[4];
189 /* Menu hash table. See menubar-msw.c */
190 Lisp_Object menu_hash_table;
192 /* Menu checksum. See menubar-msw.c */
193 unsigned int menu_checksum;
195 /* Widget glyphs attached to this frame. See glyphs-msw.c */
196 Lisp_Object widget_hash_table1, widget_hash_table2, widget_hash_table3;
198 /* Frame title hash value. See frame-msw.c */
199 unsigned int title_checksum;
201 /* Real character width and height of the frame.
202 FRAME_{HEIGHT,WIDTH} do not work for pixel geometry! */
203 int charheight, charwidth;
206 int button2_need_lbutton : 1;
207 int button2_need_rbutton : 1;
208 int button2_is_down : 1;
209 int ignore_next_lbutton_up : 1;
210 int ignore_next_rbutton_up : 1;
212 int paint_pending : 1; /* Whether a WM_PAINT magic event has been queued */
214 /* Geometry, in characters, as specified by proplist during frame
215 creation. Memebers are set to -1 for unspecified */
216 XEMACS_RECT_WH* target_rect;
219 #define FRAME_MSWINDOWS_DATA(f) FRAME_TYPE_DATA (f, mswindows)
221 #define FRAME_MSWINDOWS_HANDLE(f) (FRAME_MSWINDOWS_DATA (f)->hwnd)
222 #define FRAME_MSWINDOWS_DC(f) (FRAME_MSWINDOWS_DATA (f)->hdc)
223 #define FRAME_MSWINDOWS_MENU_HASH_TABLE(f) (FRAME_MSWINDOWS_DATA (f)->menu_hash_table)
224 #define FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) \
225 (FRAME_MSWINDOWS_DATA (f)->toolbar_hash_table)
226 #define FRAME_MSWINDOWS_WIDGET_HASH_TABLE1(f) \
227 (FRAME_MSWINDOWS_DATA (f)->widget_hash_table1)
228 #define FRAME_MSWINDOWS_WIDGET_HASH_TABLE2(f) \
229 (FRAME_MSWINDOWS_DATA (f)->widget_hash_table2)
230 #define FRAME_MSWINDOWS_WIDGET_HASH_TABLE3(f) \
231 (FRAME_MSWINDOWS_DATA (f)->widget_hash_table3)
232 #define FRAME_MSWINDOWS_TOOLBAR_CHECKSUM(f,pos) \
233 (FRAME_MSWINDOWS_DATA (f)->toolbar_checksum[pos])
234 #define FRAME_MSWINDOWS_MENU_CHECKSUM(f) (FRAME_MSWINDOWS_DATA (f)->menu_checksum)
235 #define FRAME_MSWINDOWS_TITLE_CHECKSUM(f) (FRAME_MSWINDOWS_DATA (f)->title_checksum)
236 #define FRAME_MSWINDOWS_CHARWIDTH(f) (FRAME_MSWINDOWS_DATA (f)->charwidth)
237 #define FRAME_MSWINDOWS_CHARHEIGHT(f) (FRAME_MSWINDOWS_DATA (f)->charheight)
238 #define FRAME_MSWINDOWS_TARGET_RECT(f) (FRAME_MSWINDOWS_DATA (f)->target_rect)
240 /* Frame check and validation macros */
241 #define FRAME_MSWINDOWS_P(frm) CONSOLE_TYPESYM_MSWINDOWS_P (FRAME_TYPE (frm))
242 #define CHECK_MSWINDOWS_FRAME(z) CHECK_FRAME_TYPE (z, mswindows)
243 #define CONCHECK_MSWINDOWS_FRAME(z) CONCHECK_FRAME_TYPE (z, mswindows)
245 /* win32 window LONG indices */
246 #define XWL_FRAMEOBJ 0
247 #define XWL_COUNT 1 /* Number of LONGs that we use */
248 #define MSWINDOWS_WINDOW_EXTRA_BYTES (XWL_COUNT*4)
251 * Printer frame, aka printer job
254 struct msprinter_frame
256 int left_margin, top_margin, /* All in twips */
257 right_margin, bottom_margin;
258 int charheight, charwidth; /* As per proplist or -1 if not gven */
259 int pix_left, pix_top; /* Calculated in init_frame_*, VP offset */
261 int page_started : 1;
264 #define FRAME_MSPRINTER_DATA(f) FRAME_TYPE_DATA (f, msprinter)
265 #define FRAME_MSPRINTER_LEFT_MARGIN(f) (FRAME_MSPRINTER_DATA (f)->left_margin)
266 #define FRAME_MSPRINTER_RIGHT_MARGIN(f) (FRAME_MSPRINTER_DATA (f)->top_margin)
267 #define FRAME_MSPRINTER_TOP_MARGIN(f) (FRAME_MSPRINTER_DATA (f)->right_margin)
268 #define FRAME_MSPRINTER_BOTTOM_MARGIN(f) (FRAME_MSPRINTER_DATA (f)->bottom_margin)
269 #define FRAME_MSPRINTER_JOB_STARTED(f) (FRAME_MSPRINTER_DATA (f)->job_started)
270 #define FRAME_MSPRINTER_PAGE_STARTED(f) (FRAME_MSPRINTER_DATA (f)->page_started)
271 #define FRAME_MSPRINTER_CHARWIDTH(f) (FRAME_MSPRINTER_DATA (f)->charheight)
272 #define FRAME_MSPRINTER_CHARHEIGHT(f) (FRAME_MSPRINTER_DATA (f)->charwidth)
273 #define FRAME_MSPRINTER_PIXLEFT(f) (FRAME_MSPRINTER_DATA (f)->pix_left)
274 #define FRAME_MSPRINTER_PIXTOP(f) (FRAME_MSPRINTER_DATA (f)->pix_top)
280 /* win32 messages / magic event types */
281 #define EVENT_MSWINDOWS_MAGIC_TYPE(e) \
282 ((e)->event.magic.underlying_mswindows_event)
283 #define XM_BUMPQUEUE (WM_USER + 101)
284 #define XM_MAPFRAME (WM_USER + 102)
285 #define XM_UNMAPFRAME (WM_USER + 103)
292 /* win32 "Windows" procedure */
293 LRESULT WINAPI mswindows_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam,
295 LRESULT WINAPI mswindows_control_wnd_proc (HWND hwnd,
296 UINT msg, WPARAM wParam,
299 void mswindows_redraw_exposed_area (struct frame *f, int x, int y,
300 int width, int height);
301 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest);
302 HWND mswindows_get_selected_frame_hwnd (void);
303 void mswindows_enqueue_magic_event (HWND hwnd, UINT msg);
305 /* win32 DDE management library */
306 #define MSWINDOWS_DDE_ITEM_OPEN "Open"
307 extern DWORD mswindows_dde_mlid;
308 extern HSZ mswindows_dde_service;
309 extern HSZ mswindows_dde_topic_system;
310 extern HSZ mswindows_dde_item_open;
311 HDDEDATA CALLBACK mswindows_dde_callback (UINT uType, UINT uFmt, HCONV hconv,
312 HSZ hszTopic, HSZ hszItem,
314 DWORD dwData1, DWORD dwData2);
316 void mswindows_enqueue_dispatch_event (Lisp_Object event);
317 void mswindows_enqueue_misc_user_event (Lisp_Object channel,
318 Lisp_Object function,
320 Lisp_Object mswindows_cancel_dispatch_event (Lisp_Event* event);
321 Lisp_Object mswindows_pump_outstanding_events (void);
322 Lisp_Object mswindows_protect_modal_loop (Lisp_Object (*bfun)
325 void mswindows_unmodalize_signal_maybe (void);
327 COLORREF mswindows_string_to_color (const char *name);
328 USID emacs_mswindows_create_stream_pair (void* inhandle, void* outhandle,
329 Lisp_Object* instream,
330 Lisp_Object* outstream,
332 USID emacs_mswindows_delete_stream_pair (Lisp_Object instream,
333 Lisp_Object outstream);
335 #ifdef HAVE_WIN32_PROCESSES
336 HANDLE get_nt_process_handle (Lisp_Process *p);
339 extern Lisp_Object Vmswindows_frame_being_created;
340 extern Lisp_Object mswindows_frame_being_created;
342 void mswindows_get_workspace_coords (RECT *rc);
344 HWND mswindows_get_console_hwnd (void);
345 void mswindows_hide_console (void);
346 void mswindows_show_console (void);
347 int mswindows_output_console_string (CONST Extbyte *str, Extcount len);
349 Lisp_Object mswindows_enumerate_fonts (HDC hdc);
351 int mswindows_char_is_accelerator (struct frame *f, Emchar ch);
352 Bytecount mswindows_translate_menu_or_dialog_item (Bufbyte *item, Bytecount len,
353 Bytecount maxlen, Emchar *accel,
354 Lisp_Object error_name);
357 Lisp_Object mswindows_get_toolbar_button_text (struct frame* f,
359 Lisp_Object mswindows_handle_toolbar_wm_command (struct frame* f,
362 Lisp_Object mswindows_handle_gui_wm_command (struct frame* f,
363 HWND ctrl, LPARAM id);
365 int mswindows_windows9x_p (void);
368 void mswindows_output_last_error (char *frob);
370 #endif /* INCLUDED_console_msw_h_ */