rnd-20140114-1-src
[rocksndiamonds.git] / src / libgame / x11.h
1 /***********************************************************
2 * Artsoft Retro-Game Library                               *
3 *----------------------------------------------------------*
4 * (c) 1994-2006 Artsoft Entertainment                      *
5 *               Holger Schemel                             *
6 *               Detmolder Strasse 189                      *
7 *               33604 Bielefeld                            *
8 *               Germany                                    *
9 *               e-mail: info@artsoft.org                   *
10 *----------------------------------------------------------*
11 * x11.h                                                    *
12 ***********************************************************/
13
14 #ifndef X11_H
15 #define X11_H
16
17 #if !defined(PLATFORM_MSDOS)
18 #define XK_MISCELLANY
19 #define XK_LATIN1
20
21 #include <X11/Xlib.h>
22 #include <X11/Xutil.h>
23 #include <X11/Xatom.h>
24 #include <X11/Xos.h>
25 #include <X11/Intrinsic.h>
26 #include <X11/keysymdef.h>
27 #endif
28
29
30 /* system dependent definitions */
31
32 /* MS-DOS header file also defines "TARGET_STRING" */
33 #ifndef TARGET_STRING
34 #define TARGET_STRING           "X11"
35 #endif
36
37 #if defined(PLATFORM_UNIX)
38 /* This triggers some stuff that is needed because X11 (XSetClipOrigin(),
39    to be precise) is often very slow when preparing a masked XCopyArea()
40    for big Pixmaps.
41    To prevent this, small (tile-sized) mask Pixmaps are created which will
42    then be set much faster with XSetClipOrigin() and speed things up a lot. */
43 #define TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND
44 #endif
45
46 #define WINDOW_SCALING_STATUS   WINDOW_SCALING_NOT_AVAILABLE
47 #define FULLSCREEN_STATUS       FULLSCREEN_NOT_AVAILABLE
48
49 #define CURSOR_MAX_WIDTH        32
50 #define CURSOR_MAX_HEIGHT       32
51
52
53 /* X11 type definitions */
54
55 typedef struct X11DrawableInfo  Bitmap;
56 typedef struct X11DrawableInfo  DrawWindow;
57 typedef struct X11DrawableInfo  DrawBuffer;
58 /* "Pixel" is already defined */
59 /* "Cursor" is already defined */
60
61 typedef KeySym                  Key;
62 typedef unsigned int            KeyMod;
63
64 typedef XEvent                  Event;
65 typedef XButtonEvent            ButtonEvent;
66 typedef XMotionEvent            MotionEvent;
67 typedef XKeyEvent               KeyEvent;
68 typedef XExposeEvent            ExposeEvent;
69 typedef XFocusChangeEvent       FocusChangeEvent;
70 typedef XClientMessageEvent     ClientMessageEvent;
71
72
73 /* structure definitions */
74
75 struct X11DrawableInfo
76 {
77   char *source_filename;
78
79   unsigned int width, height;
80   Drawable drawable;
81   Drawable clip_mask;
82   GC gc;                /* GC for normal drawing (inheritated from 'window') */
83   GC line_gc[2];        /* GC for foreground and background line drawing     */
84   GC stored_clip_gc;    /* GC for masked drawing (used for whole Pixmap)     */
85   GC clip_gc;           /* can be 'stored_clip_gc' or one-tile-only clip GC  */
86 };
87
88 struct MouseCursorInfo
89 {
90   int width, height;
91   int hot_x, hot_y;
92
93   char data[CURSOR_MAX_WIDTH * CURSOR_MAX_HEIGHT / 8];
94   char mask[CURSOR_MAX_WIDTH * CURSOR_MAX_HEIGHT / 8];
95 };
96
97
98 /* X11 symbol definitions */
99
100 #define BLACK_PIXEL             BlackPixel(display, screen)
101 #define WHITE_PIXEL             WhitePixel(display, screen)
102
103 #define EVENT_BUTTONPRESS       ButtonPress
104 #define EVENT_BUTTONRELEASE     ButtonRelease
105 #define EVENT_MOTIONNOTIFY      MotionNotify
106 #define EVENT_KEYPRESS          KeyPress
107 #define EVENT_KEYRELEASE        KeyRelease
108 #define EVENT_EXPOSE            Expose
109 #define EVENT_FOCUSIN           FocusIn
110 #define EVENT_FOCUSOUT          FocusOut
111 #define EVENT_CLIENTMESSAGE     ClientMessage
112 #define EVENT_MAPNOTIFY         MapNotify
113 #define EVENT_UNMAPNOTIFY       UnmapNotify
114
115 #define KSYM_UNDEFINED          XK_VoidSymbol
116
117 #define KSYM_Return             XK_Return
118 #define KSYM_Escape             XK_Escape
119
120 #define KSYM_Left               XK_Left
121 #define KSYM_Right              XK_Right
122 #define KSYM_Up                 XK_Up
123 #define KSYM_Down               XK_Down
124
125 #ifdef XK_KP_Left
126 #define KSYM_KP_Left            XK_KP_Left
127 #define KSYM_KP_Right           XK_KP_Right
128 #define KSYM_KP_Up              XK_KP_Up
129 #define KSYM_KP_Down            XK_KP_Down
130 #endif
131
132 #ifdef XK_KP_Enter
133 #define KSYM_KP_Enter           XK_KP_Enter
134 #define KSYM_KP_Add             XK_KP_Add
135 #define KSYM_KP_Subtract        XK_KP_Subtract
136 #define KSYM_KP_Multiply        XK_KP_Multiply
137 #define KSYM_KP_Divide          XK_KP_Divide
138 #define KSYM_KP_Separator       XK_KP_Separator
139 #endif
140
141 #define KSYM_Shift_L            XK_Shift_L
142 #define KSYM_Shift_R            XK_Shift_R
143 #define KSYM_Control_L          XK_Control_L
144 #define KSYM_Control_R          XK_Control_R
145 #define KSYM_Meta_L             XK_Meta_L
146 #define KSYM_Meta_R             XK_Meta_R
147 #define KSYM_Alt_L              XK_Alt_L
148 #define KSYM_Alt_R              XK_Alt_R
149 #define KSYM_Super_L            XK_Super_L
150 #define KSYM_Super_R            XK_Super_R
151 #define KSYM_Mode_switch        XK_Mode_switch
152 #define KSYM_Multi_key          XK_Multi_key
153
154 #define KSYM_BackSpace          XK_BackSpace
155 #define KSYM_Delete             XK_Delete
156 #define KSYM_Insert             XK_Insert
157 #define KSYM_Tab                XK_Tab
158 #define KSYM_Home               XK_Home
159 #define KSYM_End                XK_End
160 #define KSYM_Page_Up            XK_Page_Up
161 #define KSYM_Page_Down          XK_Page_Down
162 #define KSYM_Menu               XK_Menu
163
164 #define KSYM_space              XK_space
165 #define KSYM_exclam             XK_exclam
166 #define KSYM_quotedbl           XK_quotedbl
167 #define KSYM_numbersign         XK_numbersign
168 #define KSYM_dollar             XK_dollar
169 #define KSYM_percent            XK_percent
170 #define KSYM_ampersand          XK_ampersand
171 #define KSYM_apostrophe         XK_apostrophe
172 #define KSYM_parenleft          XK_parenleft
173 #define KSYM_parenright         XK_parenright
174 #define KSYM_asterisk           XK_asterisk
175 #define KSYM_plus               XK_plus
176 #define KSYM_comma              XK_comma
177 #define KSYM_minus              XK_minus
178 #define KSYM_period             XK_period
179 #define KSYM_slash              XK_slash
180
181 #define KSYM_colon              XK_colon
182 #define KSYM_semicolon          XK_semicolon
183 #define KSYM_less               XK_less
184 #define KSYM_equal              XK_equal
185 #define KSYM_greater            XK_greater
186 #define KSYM_question           XK_question
187 #define KSYM_at                 XK_at
188
189 #define KSYM_bracketleft        XK_bracketleft
190 #define KSYM_backslash          XK_backslash
191 #define KSYM_bracketright       XK_bracketright
192 #define KSYM_asciicircum        XK_asciicircum
193 #define KSYM_underscore         XK_underscore
194 #define KSYM_grave              XK_grave
195
196 #define KSYM_quoteleft          XK_quoteleft
197 #define KSYM_braceleft          XK_braceleft
198 #define KSYM_bar                XK_bar
199 #define KSYM_braceright         XK_braceright
200 #define KSYM_asciitilde         XK_asciitilde
201
202 #define KSYM_degree             XK_degree
203 #define KSYM_Adiaeresis         XK_Adiaeresis
204 #define KSYM_Odiaeresis         XK_Odiaeresis
205 #define KSYM_Udiaeresis         XK_Udiaeresis
206 #define KSYM_adiaeresis         XK_adiaeresis
207 #define KSYM_odiaeresis         XK_odiaeresis
208 #define KSYM_udiaeresis         XK_udiaeresis
209 #define KSYM_ssharp             XK_ssharp
210
211 #define KSYM_A                  XK_A
212 #define KSYM_B                  XK_B
213 #define KSYM_C                  XK_C
214 #define KSYM_D                  XK_D
215 #define KSYM_E                  XK_E
216 #define KSYM_F                  XK_F
217 #define KSYM_G                  XK_G
218 #define KSYM_H                  XK_H
219 #define KSYM_I                  XK_I
220 #define KSYM_J                  XK_J
221 #define KSYM_K                  XK_K
222 #define KSYM_L                  XK_L
223 #define KSYM_M                  XK_M
224 #define KSYM_N                  XK_N
225 #define KSYM_O                  XK_O
226 #define KSYM_P                  XK_P
227 #define KSYM_Q                  XK_Q
228 #define KSYM_R                  XK_R
229 #define KSYM_S                  XK_S
230 #define KSYM_T                  XK_T
231 #define KSYM_U                  XK_U
232 #define KSYM_V                  XK_V
233 #define KSYM_W                  XK_W
234 #define KSYM_X                  XK_X
235 #define KSYM_Y                  XK_Y
236 #define KSYM_Z                  XK_Z
237
238 #define KSYM_a                  XK_a
239 #define KSYM_b                  XK_b
240 #define KSYM_c                  XK_c
241 #define KSYM_d                  XK_d
242 #define KSYM_e                  XK_e
243 #define KSYM_f                  XK_f
244 #define KSYM_g                  XK_g
245 #define KSYM_h                  XK_h
246 #define KSYM_i                  XK_i
247 #define KSYM_j                  XK_j
248 #define KSYM_k                  XK_k
249 #define KSYM_l                  XK_l
250 #define KSYM_m                  XK_m
251 #define KSYM_n                  XK_n
252 #define KSYM_o                  XK_o
253 #define KSYM_p                  XK_p
254 #define KSYM_q                  XK_q
255 #define KSYM_r                  XK_r
256 #define KSYM_s                  XK_s
257 #define KSYM_t                  XK_t
258 #define KSYM_u                  XK_u
259 #define KSYM_v                  XK_v
260 #define KSYM_w                  XK_w
261 #define KSYM_x                  XK_x
262 #define KSYM_y                  XK_y
263 #define KSYM_z                  XK_z
264
265 #define KSYM_0                  XK_0
266 #define KSYM_1                  XK_1
267 #define KSYM_2                  XK_2
268 #define KSYM_3                  XK_3
269 #define KSYM_4                  XK_4
270 #define KSYM_5                  XK_5
271 #define KSYM_6                  XK_6
272 #define KSYM_7                  XK_7
273 #define KSYM_8                  XK_8
274 #define KSYM_9                  XK_9
275
276 #define KSYM_KP_0               XK_KP_0
277 #define KSYM_KP_1               XK_KP_1
278 #define KSYM_KP_2               XK_KP_2
279 #define KSYM_KP_3               XK_KP_3
280 #define KSYM_KP_4               XK_KP_4
281 #define KSYM_KP_5               XK_KP_5
282 #define KSYM_KP_6               XK_KP_6
283 #define KSYM_KP_7               XK_KP_7
284 #define KSYM_KP_8               XK_KP_8
285 #define KSYM_KP_9               XK_KP_9
286
287 #define KSYM_F1                 XK_F1
288 #define KSYM_F2                 XK_F2
289 #define KSYM_F3                 XK_F3
290 #define KSYM_F4                 XK_F4
291 #define KSYM_F5                 XK_F5
292 #define KSYM_F6                 XK_F6
293 #define KSYM_F7                 XK_F7
294 #define KSYM_F8                 XK_F8
295 #define KSYM_F9                 XK_F9
296 #define KSYM_F10                XK_F10
297 #define KSYM_F11                XK_F11
298 #define KSYM_F12                XK_F12
299 #define KSYM_F13                XK_F13
300 #define KSYM_F14                XK_F14
301 #define KSYM_F15                XK_F15
302 #define KSYM_F16                XK_F16
303 #define KSYM_F17                XK_F17
304 #define KSYM_F18                XK_F18
305 #define KSYM_F19                XK_F19
306 #define KSYM_F20                XK_F20
307 #define KSYM_F21                XK_F21
308 #define KSYM_F22                XK_F22
309 #define KSYM_F23                XK_F23
310 #define KSYM_F24                XK_F24
311
312 #define KSYM_FKEY_FIRST         KSYM_F1
313 #define KSYM_FKEY_LAST          KSYM_F24
314 #define KSYM_NUM_FKEYS          (KSYM_FKEY_LAST - KSYM_FKEY_FIRST + 1)
315
316 #define KMOD_None               None
317 #define KMOD_Shift_L            0x0001
318 #define KMOD_Shift_R            0x0002
319 #define KMOD_Control_L          0x0040
320 #define KMOD_Control_R          0x0080
321 #define KMOD_Meta_L             0x0400
322 #define KMOD_Meta_R             0x0800
323 #define KMOD_Alt_L              0x0100
324 #define KMOD_Alt_R              0x0200
325
326 #define KMOD_Shift              (KMOD_Shift_L   | KMOD_Shift_R)
327 #define KMOD_Control            (KMOD_Control_L | KMOD_Control_R)
328 #define KMOD_Meta               (KMOD_Meta_L    | KMOD_Meta_R)
329 #define KMOD_Alt                (KMOD_Alt_L     | KMOD_Alt_R)
330
331
332 /* X11 function definitions */
333
334 void X11InitVideoDisplay(void);
335 void X11InitVideoBuffer(DrawBuffer **, DrawWindow **);
336
337 void X11CloseWindow(DrawWindow *);
338
339 void X11ZoomBitmap(Bitmap *, Bitmap *);
340 Bitmap *X11LoadImage(char *);
341
342 void X11CreateBitmapContent(Bitmap *, int, int, int);
343 void X11FreeBitmapPointers(Bitmap *);
344 void X11CopyArea(Bitmap *, Bitmap *, int, int, int, int, int, int, int);
345 void X11FillRectangle(Bitmap *, int, int, int, int, Pixel);
346 void X11FadeRectangle(Bitmap *, int, int, int, int, int, int, int,
347                       void (*draw_border_function)(void));
348 void X11DrawSimpleLine(Bitmap *, int, int, int, int, Pixel);
349 Pixel X11GetPixel(Bitmap *, int, int);
350 Pixel X11GetPixelFromRGB(unsigned int, unsigned int, unsigned int);
351 void X11DestroyImage(XImage *);
352
353 #if defined(TARGET_X11_NATIVE)
354 void X11SetMouseCursor(struct MouseCursorInfo *);
355 #endif
356
357 #endif /* X11_H */