XEmacs 21.2.24 "Hecate".
[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 _XEMACS_CONSOLE_MSW_H_
33 #define _XEMACS_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
84 /*
85  * Device
86  */
87
88 #define MSW_FONTSIZE (LF_FACESIZE*4+12)
89
90 struct mswindows_font_enum
91 {
92   char fontname[MSW_FONTSIZE];
93   struct mswindows_font_enum *next;
94 };
95
96 struct mswindows_device
97 {
98   int logpixelsx, logpixelsy;
99   int planes, cells;
100   int horzres, vertres;         /* Size in pixels */
101   int horzsize, vertsize;       /* Size in mm */
102   int bitspixel;
103   struct mswindows_font_enum *fontlist;
104 };
105
106 #define DEVICE_MSWINDOWS_DATA(d) DEVICE_TYPE_DATA (d, mswindows)
107 #define DEVICE_MSWINDOWS_LOGPIXELSX(d)  (DEVICE_MSWINDOWS_DATA (d)->logpixelsx)
108 #define DEVICE_MSWINDOWS_LOGPIXELSY(d)  (DEVICE_MSWINDOWS_DATA (d)->logpixelsy)
109 #define DEVICE_MSWINDOWS_PLANES(d)      (DEVICE_MSWINDOWS_DATA (d)->planes)
110 #define DEVICE_MSWINDOWS_CELLS(d)       (DEVICE_MSWINDOWS_DATA (d)->cells)
111 #define DEVICE_MSWINDOWS_HORZRES(d)     (DEVICE_MSWINDOWS_DATA (d)->horzres)
112 #define DEVICE_MSWINDOWS_VERTRES(d)     (DEVICE_MSWINDOWS_DATA (d)->vertres)
113 #define DEVICE_MSWINDOWS_HORZSIZE(d)    (DEVICE_MSWINDOWS_DATA (d)->horzsize)
114 #define DEVICE_MSWINDOWS_VERTSIZE(d)    (DEVICE_MSWINDOWS_DATA (d)->vertsize)
115 #define DEVICE_MSWINDOWS_BITSPIXEL(d)   (DEVICE_MSWINDOWS_DATA (d)->bitspixel)
116 #define DEVICE_MSWINDOWS_FONTLIST(d)    (DEVICE_MSWINDOWS_DATA (d)->fontlist)
117
118
119 /*
120  * Frame
121  */
122 typedef struct
123 {
124   int left;
125   int top;
126   int width;
127   int height;
128 } XEMACS_RECT_WH;
129
130 struct mswindows_frame
131 {
132   /* win32 window handle */
133   HWND hwnd;
134
135   /* DC for this win32 window */
136   HDC hdc;
137
138   /* compatible DC for bitmap operations */
139   HDC cdc;
140
141   /* Time of last click event, for button 2 emul */
142   DWORD last_click_time;
143
144   /* Coordinates of last click event, screen-relative */
145   POINTS last_click_point;
146 #ifdef HAVE_TOOLBARS
147   /* Toolbar hash table. See toolbar-msw.c */
148   Lisp_Object toolbar_hash_table;
149   unsigned int toolbar_checksum[4];
150 #endif
151
152   /* Menu hash table. See menubar-msw.c */
153   Lisp_Object menu_hash_table;
154
155   /* Menu checksum. See menubar-msw.c */
156   unsigned int menu_checksum;
157
158   /* Widget glyphs attached to this frame. See glyphs-msw.c */
159   Lisp_Object widget_hash_table;
160
161   /* Frame title hash value. See frame-msw.c */
162   unsigned int title_checksum;
163
164   /* Real character width and height of the frame.
165      FRAME_{HEIGHT,WIDTH} do not work for pixel geometry! */
166   int charheight, charwidth;
167
168   /* Misc flags */
169   int button2_need_lbutton : 1;
170   int button2_need_rbutton : 1;
171   int button2_is_down : 1;
172   int ignore_next_lbutton_up : 1;
173   int ignore_next_rbutton_up : 1;
174   int sizing : 1;
175
176   /* Geometry, in characters, as specified by proplist during frame
177      creation. Memebers are set to -1 for unspecified */
178   XEMACS_RECT_WH* target_rect;
179 };
180
181 #define FRAME_MSWINDOWS_DATA(f) FRAME_TYPE_DATA (f, mswindows)
182
183 #define FRAME_MSWINDOWS_HANDLE(f)          (FRAME_MSWINDOWS_DATA (f)->hwnd)
184 #define FRAME_MSWINDOWS_DC(f)              (FRAME_MSWINDOWS_DATA (f)->hdc)
185 #define FRAME_MSWINDOWS_CDC(f)             (FRAME_MSWINDOWS_DATA (f)->cdc)
186 #define FRAME_MSWINDOWS_MENU_HASH_TABLE(f) (FRAME_MSWINDOWS_DATA (f)->menu_hash_table)
187 #define FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) \
188  (FRAME_MSWINDOWS_DATA (f)->toolbar_hash_table)
189 #define FRAME_MSWINDOWS_WIDGET_HASH_TABLE(f) \
190  (FRAME_MSWINDOWS_DATA (f)->widget_hash_table)
191 #define FRAME_MSWINDOWS_TOOLBAR_CHECKSUM(f,pos) \
192  (FRAME_MSWINDOWS_DATA (f)->toolbar_checksum[pos])
193 #define FRAME_MSWINDOWS_MENU_CHECKSUM(f)  (FRAME_MSWINDOWS_DATA (f)->menu_checksum)
194 #define FRAME_MSWINDOWS_TITLE_CHECKSUM(f) (FRAME_MSWINDOWS_DATA (f)->title_checksum)
195 #define FRAME_MSWINDOWS_CHARWIDTH(f)      (FRAME_MSWINDOWS_DATA (f)->charwidth)
196 #define FRAME_MSWINDOWS_CHARHEIGHT(f)     (FRAME_MSWINDOWS_DATA (f)->charheight)
197 #define FRAME_MSWINDOWS_TARGET_RECT(f)    (FRAME_MSWINDOWS_DATA (f)->target_rect)
198
199 /* Frame check and validation macros */
200 #define FRAME_MSWINDOWS_P(frm) CONSOLE_TYPESYM_MSWINDOWS_P (FRAME_TYPE (frm))
201 #define CHECK_MSWINDOWS_FRAME(z) CHECK_FRAME_TYPE (z, mswindows)
202 #define CONCHECK_MSWINDOWS_FRAME(z) CONCHECK_FRAME_TYPE (z, mswindows)
203
204 /* win32 window LONG indices */
205 #define XWL_FRAMEOBJ    0
206 #define XWL_COUNT       1       /* Number of LONGs that we use */
207 #define MSWINDOWS_WINDOW_EXTRA_BYTES    (XWL_COUNT*4)
208
209
210 /*
211  * Events
212  */
213
214 /* win32 messages / magic event types */
215 #define EVENT_MSWINDOWS_MAGIC_TYPE(e)   \
216         ((e)->event.magic.underlying_mswindows_event)
217 #define XM_BUMPQUEUE    (WM_USER + 101)
218 #define XM_MAPFRAME     (WM_USER + 102)
219 #define XM_UNMAPFRAME   (WM_USER + 103)
220
221
222 /*
223  * Random globals
224  */
225
226 /* win32 "Windows" procedure */
227 LRESULT WINAPI mswindows_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam,
228                                    LPARAM lParam);
229 LRESULT WINAPI mswindows_control_wnd_proc (HWND hwnd,
230                                            UINT msg, WPARAM wParam,
231                                            LPARAM lParam);
232
233 void mswindows_redraw_exposed_area (struct frame *f, int x, int y, 
234                                     int width, int height);
235 void mswindows_size_frame_internal (struct frame* f, XEMACS_RECT_WH* dest);
236 void mswindows_enqueue_magic_event (HWND hwnd, UINT message);
237
238 /* win32 DDE management library */
239 #define MSWINDOWS_DDE_ITEM_OPEN "Open"
240 extern DWORD mswindows_dde_mlid;
241 extern HSZ mswindows_dde_service;
242 extern HSZ mswindows_dde_topic_system;
243 extern HSZ mswindows_dde_item_open;
244 HDDEDATA CALLBACK mswindows_dde_callback (UINT uType, UINT uFmt, HCONV hconv,
245                                           HSZ hszTopic, HSZ hszItem, HDDEDATA hdata,
246                                           DWORD dwData1, DWORD dwData2);
247
248 void mswindows_enqueue_misc_user_event (Lisp_Object channel,
249                                         Lisp_Object function,
250                                         Lisp_Object object);
251 Lisp_Object mswindows_cancel_dispatch_event (struct Lisp_Event* event);
252 Lisp_Object mswindows_pump_outstanding_events (void);
253 Lisp_Object mswindows_protect_modal_loop (Lisp_Object (*bfun) (Lisp_Object barg),
254                                           Lisp_Object barg);
255 void mswindows_unmodalize_signal_maybe (void);
256
257 #ifdef HAVE_WIN32_PROCESSES
258 HANDLE get_nt_process_handle (struct Lisp_Process *p);
259 #endif
260
261 extern Lisp_Object Vmswindows_frame_being_created;
262 extern Lisp_Object mswindows_frame_being_created;
263
264 void mswindows_enumerate_fonts (struct device *d);
265
266 #endif /* _XEMACS_CONSOLE_MSW_H_ */