fe28e644ce38cbdcc49ddf89dee7df3c08b91be4
[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 #ifdef CONST                    /* I suspect this is safe */
37 #undef CONST
38 #endif
39 #include <windows.h>
40 #include <ddeml.h>      /* DDE management library */
41 #if !defined(__CYGWIN32__) && !defined(__MINGW32__) \
42         || CYGWIN_VERSION_DLL_MAJOR > 20
43 #include <shellapi.h>   /* FileManager/Explorer drag and drop */
44 #include <commctrl.h>
45 #endif
46
47 #ifdef HAVE_XPM
48 #include <X11/xpm.h>
49 #endif
50
51 /*
52  * XXX FIXME: The following X modifier defs in events-mod.h clash with win32
53  * hotkey defs in winuser.h. For the moment lose the win32 versions.
54  * Maybe we should rename all of MOD_* to something that doesn't clash.
55  */
56 #ifdef MOD_CONTROL
57 #  undef MOD_CONTROL
58 #endif  
59 #ifdef MOD_ALT
60 #  undef MOD_ALT
61 #endif  
62 #ifdef MOD_SHIFT
63 #  undef MOD_SHIFT
64 #endif  
65
66
67 /* The name of the main window class */
68 #define XEMACS_CLASS "XEmacs"
69
70 #define XEMACS_CONTROL_CLASS "XEmacsControl"
71
72 /*
73  * Console
74  */
75
76 DECLARE_CONSOLE_TYPE (mswindows);
77
78 struct mswindows_console
79 {
80   int infd, outfd;
81 };
82
83 DECLARE_CONSOLE_TYPE (msprinter);
84
85 /*
86  * Device
87  */
88
89 #define MSW_FONTSIZE (LF_FACESIZE*4+12)
90
91 struct mswindows_device
92 {
93   int logpixelsx, logpixelsy;
94   int planes, cells;
95   int horzres, vertres;         /* Size in pixels */
96   int horzsize, vertsize;       /* Size in mm */
97   int bitspixel;
98   Lisp_Object fontlist;         /* List of strings, device fonts */
99 };
100
101 #define DEVICE_MSWINDOWS_DATA(d) DEVICE_TYPE_DATA (d, mswindows)
102 #define DEVICE_MSWINDOWS_LOGPIXELSX(d)  (DEVICE_MSWINDOWS_DATA (d)->logpixelsx)
103 #define DEVICE_MSWINDOWS_LOGPIXELSY(d)  (DEVICE_MSWINDOWS_DATA (d)->logpixelsy)
104 #define DEVICE_MSWINDOWS_PLANES(d)      (DEVICE_MSWINDOWS_DATA (d)->planes)
105 #define DEVICE_MSWINDOWS_CELLS(d)       (DEVICE_MSWINDOWS_DATA (d)->cells)
106 #define DEVICE_MSWINDOWS_HORZRES(d)     (DEVICE_MSWINDOWS_DATA (d)->horzres)
107 #define DEVICE_MSWINDOWS_VERTRES(d)     (DEVICE_MSWINDOWS_DATA (d)->vertres)
108 #define DEVICE_MSWINDOWS_HORZSIZE(d)    (DEVICE_MSWINDOWS_DATA (d)->horzsize)
109 #define DEVICE_MSWINDOWS_VERTSIZE(d)    (DEVICE_MSWINDOWS_DATA (d)->vertsize)
110 #define DEVICE_MSWINDOWS_BITSPIXEL(d)   (DEVICE_MSWINDOWS_DATA (d)->bitspixel)
111 #define DEVICE_MSWINDOWS_FONTLIST(d)    (DEVICE_MSWINDOWS_DATA (d)->fontlist)
112
113 struct msprinter_device
114 {
115   HDC hdc;
116   HANDLE hprinter;
117   Lisp_Object fontlist;
118   char* name;
119   DEVMODE *devmode, *devmode_mirror;
120   size_t devmode_size;
121 };
122
123 #define DEVICE_MSPRINTER_DATA(d) DEVICE_TYPE_DATA (d, msprinter)
124 #define DEVICE_MSPRINTER_HDC(d)         (DEVICE_MSPRINTER_DATA (d)->hdc)
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 #define DEVICE_MSPRINTER_DEVMODE_MIRROR(d) \
130         (DEVICE_MSPRINTER_DATA (d)->devmode_mirror)
131 #define DEVICE_MSPRINTER_DEVMODE_SIZE(d) \
132         (DEVICE_MSPRINTER_DATA (d)->devmode_size)
133
134 #define CONSOLE_TYPESYM_MSPRINTER_P(typesym) EQ (typesym, Qmsprinter)
135 #define DEVICE_MSPRINTER_P(dev) CONSOLE_TYPESYM_MSPRINTER_P (DEVICE_TYPE (dev))
136 #define CHECK_MSPRINTER_DEVICE(z) CHECK_DEVICE_TYPE (z, msprinter)
137 #define CONCHECK_MSPRINTER_DEVICE(z) CONCHECK_DEVICE_TYPE (z, msprinter)
138
139 /* Printer functions */
140 DEVMODE* msprinter_get_devmode_copy (struct device *d);
141 void msprinter_apply_devmode (struct device *d, DEVMODE *devmode);
142
143 /*
144  * Frame
145  */
146 typedef struct
147 {
148   int left;
149   int top;
150   int width;
151   int height;
152 } XEMACS_RECT_WH;
153
154 struct mswindows_frame
155 {
156   /* win32 window handle */
157   HWND hwnd;
158
159   /* DC for this win32 window */
160   HDC hdc;
161
162   /* compatible DC for bitmap operations */
163   HDC cdc;
164
165   /* Time of last click event, for button 2 emul */
166   DWORD last_click_time;
167
168   /* Coordinates of last click event, screen-relative */
169   POINTS last_click_point;
170 #ifdef HAVE_TOOLBARS
171   /* Toolbar hash table. See toolbar-msw.c */
172   Lisp_Object toolbar_hash_table;
173   unsigned int toolbar_checksum[4];
174 #endif
175
176   /* Menu hash table. See menubar-msw.c */
177   Lisp_Object menu_hash_table;
178
179   /* Menu checksum. See menubar-msw.c */
180   unsigned int menu_checksum;
181
182   /* Widget glyphs attached to this frame. See glyphs-msw.c */
183   Lisp_Object widget_hash_table;
184
185   /* Frame title hash value. See frame-msw.c */
186   unsigned int title_checksum;
187
188   /* Real character width and height of the frame.
189      FRAME_{HEIGHT,WIDTH} do not work for pixel geometry! */
190   int charheight, charwidth;
191
192   /* Misc flags */
193   int button2_need_lbutton : 1;
194   int button2_need_rbutton : 1;
195   int button2_is_down : 1;
196   int ignore_next_lbutton_up : 1;
197   int ignore_next_rbutton_up : 1;
198   int sizing : 1;
199
200   /* Geometry, in characters, as specified by proplist during frame
201      creation. Memebers are set to -1 for unspecified */
202   XEMACS_RECT_WH* target_rect;
203 };
204
205 #define FRAME_MSWINDOWS_DATA(f) FRAME_TYPE_DATA (f, mswindows)
206
207 #define FRAME_MSWINDOWS_HANDLE(f)          (FRAME_MSWINDOWS_DATA (f)->hwnd)
208 #define FRAME_MSWINDOWS_DC(f)              (FRAME_MSWINDOWS_DATA (f)->hdc)
209 #define FRAME_MSWINDOWS_CDC(f)             (FRAME_MSWINDOWS_DATA (f)->cdc)
210 #define FRAME_MSWINDOWS_MENU_HASH_TABLE(f) (FRAME_MSWINDOWS_DATA (f)->menu_hash_table)
211 #define FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) \
212  (FRAME_MSWINDOWS_DATA (f)->toolbar_hash_table)
213 #define FRAME_MSWINDOWS_WIDGET_HASH_TABLE(f) \
214  (FRAME_MSWINDOWS_DATA (f)->widget_hash_table)
215 #define FRAME_MSWINDOWS_TOOLBAR_CHECKSUM(f,pos) \
216  (FRAME_MSWINDOWS_DATA (f)->toolbar_checksum[pos])
217 #define FRAME_MSWINDOWS_MENU_CHECKSUM(f)  (FRAME_MSWINDOWS_DATA (f)->menu_checksum)
218 #define FRAME_MSWINDOWS_TITLE_CHECKSUM(f) (FRAME_MSWINDOWS_DATA (f)->title_checksum)
219 #define FRAME_MSWINDOWS_CHARWIDTH(f)      (FRAME_MSWINDOWS_DATA (f)->charwidth)
220 #define FRAME_MSWINDOWS_CHARHEIGHT(f)     (FRAME_MSWINDOWS_DATA (f)->charheight)
221 #define FRAME_MSWINDOWS_TARGET_RECT(f)    (FRAME_MSWINDOWS_DATA (f)->target_rect)
222
223 /* Frame check and validation macros */
224 #define FRAME_MSWINDOWS_P(frm) CONSOLE_TYPESYM_MSWINDOWS_P (FRAME_TYPE (frm))
225 #define CHECK_MSWINDOWS_FRAME(z) CHECK_FRAME_TYPE (z, mswindows)
226 #define CONCHECK_MSWINDOWS_FRAME(z) CONCHECK_FRAME_TYPE (z, mswindows)
227
228 /* win32 window LONG indices */
229 #define XWL_FRAMEOBJ    0
230 #define XWL_COUNT       1       /* Number of LONGs that we use */
231 #define MSWINDOWS_WINDOW_EXTRA_BYTES    (XWL_COUNT*4)
232
233 /*
234  * Printer frame, aka printer job
235  */
236
237 struct msprinter_frame
238 {
239   HDC hcdc;                             /* Compatoble DC */
240   int left_margin, top_margin,          /* All in twips */
241     right_margin, bottom_margin;
242   int charheight, charwidth;            /* As per proplist or -1 if not gven */
243   Lisp_Object orientation, duplex;      /* nil for printer's default */
244   int job_started : 1;
245 };
246
247 #define FRAME_MSPRINTER_DATA(f) FRAME_TYPE_DATA (f, msprinter)
248 #define FRAME_MSPRINTER_LEFT_MARGIN(f)   (FRAME_MSPRINTER_DATA (f)->left_margin)
249 #define FRAME_MSPRINTER_RIGHT_MARGIN(f)  (FRAME_MSPRINTER_DATA (f)->top_margin)
250 #define FRAME_MSPRINTER_TOP_MARGIN(f)    (FRAME_MSPRINTER_DATA (f)->right_margin)
251 #define FRAME_MSPRINTER_BOTTOM_MARGIN(f) (FRAME_MSPRINTER_DATA (f)->bottom_margin)
252 #define FRAME_MSPRINTER_CDC(f)           (FRAME_MSPRINTER_DATA (f)->hcdc)
253 #define FRAME_MSPRINTER_JOB_STARTED(f)   (FRAME_MSPRINTER_DATA (f)->job_started)
254 #define FRAME_MSPRINTER_ORIENTATION(f)   (FRAME_MSPRINTER_DATA (f)->orientation)
255 #define FRAME_MSPRINTER_DUPLEX(f)        (FRAME_MSPRINTER_DATA (f)->duplex)
256 #define FRAME_MSPRINTER_CHARWIDTH(f)     (FRAME_MSPRINTER_DATA (f)->charheight)
257 #define FRAME_MSPRINTER_CHARHEIGHT(f)    (FRAME_MSPRINTER_DATA (f)->charwidth)
258
259 /*
260  * Events
261  */
262
263 /* win32 messages / magic event types */
264 #define EVENT_MSWINDOWS_MAGIC_TYPE(e)   \
265         ((e)->event.magic.underlying_mswindows_event)
266 #define XM_BUMPQUEUE    (WM_USER + 101)
267 #define XM_MAPFRAME     (WM_USER + 102)
268 #define XM_UNMAPFRAME   (WM_USER + 103)
269
270
271 /*
272  * Random globals
273  */
274
275 /* win32 "Windows" procedure */
276 LRESULT WINAPI mswindows_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam,
277                                    LPARAM lParam);
278 LRESULT WINAPI mswindows_control_wnd_proc (HWND hwnd,
279                                            UINT msg, WPARAM wParam,
280                                            LPARAM lParam);
281
282 void mswindows_redraw_exposed_area (struct frame *f, int x, int y, 
283                                     int width, int height);
284 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest);
285 void mswindows_enqueue_magic_event (HWND hwnd, UINT msg);
286
287 /* win32 DDE management library */
288 #define MSWINDOWS_DDE_ITEM_OPEN "Open"
289 extern DWORD mswindows_dde_mlid;
290 extern HSZ mswindows_dde_service;
291 extern HSZ mswindows_dde_topic_system;
292 extern HSZ mswindows_dde_item_open;
293 HDDEDATA CALLBACK mswindows_dde_callback (UINT uType, UINT uFmt, HCONV hconv,
294                                           HSZ hszTopic, HSZ hszItem, HDDEDATA hdata,
295                                           DWORD dwData1, DWORD dwData2);
296
297 void mswindows_enqueue_misc_user_event (Lisp_Object channel,
298                                         Lisp_Object function,
299                                         Lisp_Object object);
300 Lisp_Object mswindows_cancel_dispatch_event (Lisp_Event* event);
301 Lisp_Object mswindows_pump_outstanding_events (void);
302 Lisp_Object mswindows_protect_modal_loop (Lisp_Object (*bfun) (Lisp_Object barg),
303                                           Lisp_Object barg);
304 void mswindows_unmodalize_signal_maybe (void);
305
306 #ifdef HAVE_TOOLBARS
307 Lisp_Object
308 mswindows_get_toolbar_button_text ( struct frame* f, int command_id );
309 Lisp_Object
310 mswindows_handle_toolbar_wm_command (struct frame* f, HWND ctrl, WORD id);
311 #endif
312 Lisp_Object
313 mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, DWORD id);
314 COLORREF mswindows_string_to_color (CONST char *name);
315 USID emacs_mswindows_create_stream_pair (void* inhandle, void* outhandle,
316                                          Lisp_Object* instream,
317                                          Lisp_Object* outstream,
318                                          int flags);
319 USID emacs_mswindows_delete_stream_pair (Lisp_Object instream,
320                                          Lisp_Object outstream);
321
322 #ifdef HAVE_WIN32_PROCESSES
323 HANDLE get_nt_process_handle (Lisp_Process *p);
324 #endif
325
326 extern Lisp_Object Vmswindows_frame_being_created;
327 extern Lisp_Object mswindows_frame_being_created;
328
329 Lisp_Object mswindows_enumerate_fonts (HDC hdc);
330
331 Lisp_Object mswindows_get_toolbar_button_text (struct frame* f,
332                                                int command_id);
333 Lisp_Object mswindows_handle_toolbar_wm_command (struct frame* f,
334                                                  HWND ctrl, WORD id);
335 Lisp_Object mswindows_handle_gui_wm_command (struct frame* f,
336                                              HWND ctrl, DWORD id);
337
338 #endif /* INCLUDED_console_msw_h_ */