Initial revision
[chise/xemacs-chise.git.1] / src / console-msw.h
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.
4
5 This file is part of XEmacs.
6
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
10 later version.
11
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
15 for more details.
16
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.  */
21
22 /* Synched up with: Not in FSF. */
23
24
25 /* Authorship:
26
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.
30  */
31
32 #ifndef INCLUDED_console_msw_h_
33 #define INCLUDED_console_msw_h_
34
35 #include "console.h"
36 #include "syswindows.h"
37 #include "syscommctrl.h"
38
39 #ifdef HAVE_XPM
40 #include <X11/xpm.h>
41 #endif
42
43 /* The name of the main window class */
44 #define XEMACS_CLASS "XEmacs"
45
46 #define XEMACS_CONTROL_CLASS "XEmacsControl"
47
48 /*
49  * Consoles
50  */
51
52 DECLARE_CONSOLE_TYPE (mswindows);
53
54 struct mswindows_console
55 {
56   int infd, outfd;
57 };
58
59 DECLARE_CONSOLE_TYPE (msprinter);
60
61 /*
62  * Printer settings, aka devmode
63  */
64
65 typedef struct Lisp_Devmode
66 {
67   struct lcrecord_header header;
68   
69   /* Pointer to the DEVMODE structure */
70   DEVMODE* devmode;
71
72   /* Full printer name. It can be longer than devmode->dmDeviceName
73      can accomodate, so need to keep it separately */
74   char* printer_name;
75
76   /* Printer device this object is currently selected in, or Qnil
77      if not selected */
78   Lisp_Object device;
79
80 } Lisp_Devmode;
81
82
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)
89
90 #define DEVMODE_SIZE(dm) ((dm)->dmSize + (dm)->dmDriverExtra)
91 #define XDEVMODE_SIZE(x) ((x)->devmode ? DEVMODE_SIZE((x)->devmode) : 0)
92
93 /*
94  * Devices
95  */
96
97 #define MSW_FONTSIZE (LF_FACESIZE*4+12)
98
99 struct mswindows_device
100 {
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
105                                    in event-msw.c */
106 };
107
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)
112
113 struct msprinter_device
114 {
115   HDC hdc, hcdc;                /* Printer and the comp. DCs */
116   HANDLE hprinter;
117   char* name;
118   Lisp_Object devmode;
119   Lisp_Object fontlist;
120 };
121
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)
129
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)
134
135 /* Printer functions in frame-msw.c */
136 void msprinter_start_page (struct frame *f);
137
138 /* Common checks */
139
140 #define DEVICE_MSGDI_P(dev) (DEVICE_MSWINDOWS_P(dev) || DEVICE_MSPRINTER_P(dev))
141 #define CHECK_MSGDI_DEVICE(d)                           \
142   do {                                                  \
143     CHECK_DEVICE (d);                                   \
144     if (!(DEVICEP (d) && DEVICE_MSGDI_P(XDEVICE(d))))   \
145       dead_wrong_type_argument                          \
146         (list3 (Qor, Qmswindows, Qmsprinter), d);       \
147   } while (0)
148 #define CONCHECK_MSGDI_DEVICE(d)                        \
149   do {                                                  \
150     CHECK_DEVICE (d);                                   \
151     if (!(DEVICEP (d) && DEVICE_MSGDI_P(XDEVICE(d))))   \
152       wrong_type_argument                               \
153         (list3 (Qor, Qmswindows, Qmsprinter), d);       \
154   } while (0)
155
156 /*
157  * Frames
158  */
159 typedef struct
160 {
161   int left;
162   int top;
163   int width;
164   int height;
165 } XEMACS_RECT_WH;
166
167 struct mswindows_frame
168 {
169   /* win32 window handle */
170   HWND hwnd;
171
172   /* DC for this win32 window */
173   HDC hdc;
174
175   /* Used with DeferWindowPos */
176   HDWP hdwp;
177
178   /* Time of last click event, for button 2 emul */
179   DWORD last_click_time;
180
181   /* Coordinates of last click event, screen-relative */
182   POINTS last_click_point;
183 #ifdef HAVE_TOOLBARS
184   /* Toolbar hash table. See toolbar-msw.c */
185   Lisp_Object toolbar_hash_table;
186   unsigned int toolbar_checksum[4];
187 #endif
188
189   /* Menu hash table. See menubar-msw.c */
190   Lisp_Object menu_hash_table;
191
192   /* Menu checksum. See menubar-msw.c */
193   unsigned int menu_checksum;
194
195   /* Widget glyphs attached to this frame. See glyphs-msw.c */
196   Lisp_Object widget_hash_table1, widget_hash_table2, widget_hash_table3;
197
198   /* Frame title hash value. See frame-msw.c */
199   unsigned int title_checksum;
200
201   /* Real character width and height of the frame.
202      FRAME_{HEIGHT,WIDTH} do not work for pixel geometry! */
203   int charheight, charwidth;
204
205   /* Misc flags */
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;
211   int sizing : 1;
212   int paint_pending : 1; /* Whether a WM_PAINT magic event has been queued */
213
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;
217 };
218
219 #define FRAME_MSWINDOWS_DATA(f) FRAME_TYPE_DATA (f, mswindows)
220
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)
239
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)
244
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)
249
250 /*
251  * Printer frame, aka printer job
252  */
253
254 struct msprinter_frame
255 {
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 */
260   int job_started : 1;
261   int page_started : 1;
262 };
263
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)
275
276 /*
277  * Events
278  */
279
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)
286
287
288 /*
289  * Random globals
290  */
291
292 /* win32 "Windows" procedure */
293 LRESULT WINAPI mswindows_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam,
294                                    LPARAM lParam);
295 LRESULT WINAPI mswindows_control_wnd_proc (HWND hwnd,
296                                            UINT msg, WPARAM wParam,
297                                            LPARAM lParam);
298
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);
304
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,
313                                           HDDEDATA hdata,
314                                           DWORD dwData1, DWORD dwData2);
315
316 void mswindows_enqueue_dispatch_event (Lisp_Object event);
317 void mswindows_enqueue_misc_user_event (Lisp_Object channel,
318                                         Lisp_Object function,
319                                         Lisp_Object object);
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)
323                                           (Lisp_Object barg),
324                                           Lisp_Object barg);
325 void mswindows_unmodalize_signal_maybe (void);
326
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,
331                                          int flags);
332 USID emacs_mswindows_delete_stream_pair (Lisp_Object instream,
333                                          Lisp_Object outstream);
334
335 #ifdef HAVE_WIN32_PROCESSES
336 HANDLE get_nt_process_handle (Lisp_Process *p);
337 #endif
338
339 extern Lisp_Object Vmswindows_frame_being_created;
340 extern Lisp_Object mswindows_frame_being_created;
341
342 void mswindows_get_workspace_coords (RECT *rc);
343
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);
348
349 Lisp_Object mswindows_enumerate_fonts (HDC hdc);
350
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);
355
356 #ifdef HAVE_TOOLBARS
357 Lisp_Object mswindows_get_toolbar_button_text (struct frame* f,
358                                                int command_id);
359 Lisp_Object mswindows_handle_toolbar_wm_command (struct frame* f,
360                                                  HWND ctrl, WORD id);
361 #endif
362 Lisp_Object mswindows_handle_gui_wm_command (struct frame* f,
363                                              HWND ctrl, LPARAM id);
364
365 int mswindows_windows9x_p (void);
366
367
368 void mswindows_output_last_error (char *frob);
369
370 #endif /* INCLUDED_console_msw_h_ */