1 /***********************************************************
2 * Artsoft Retro-Game Library *
3 *----------------------------------------------------------*
4 * (c) 1994-2006 Artsoft Entertainment *
6 * Detmolder Strasse 189 *
9 * e-mail: info@artsoft.org *
10 *----------------------------------------------------------*
12 ***********************************************************/
17 #if !defined(PLATFORM_MSDOS)
22 #include <X11/Xutil.h>
23 #include <X11/Xatom.h>
25 #include <X11/Intrinsic.h>
26 #include <X11/keysymdef.h>
30 /* system dependent definitions */
32 /* MS-DOS header file also defines "TARGET_STRING" */
34 #define TARGET_STRING "X11"
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()
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
46 #define WINDOW_SCALING_STATUS WINDOW_SCALING_NOT_AVAILABLE
47 #define FULLSCREEN_STATUS FULLSCREEN_NOT_AVAILABLE
49 #define CURSOR_MAX_WIDTH 32
50 #define CURSOR_MAX_HEIGHT 32
53 /* X11 type definitions */
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 */
62 typedef unsigned int KeyMod;
65 typedef XButtonEvent ButtonEvent;
66 typedef XMotionEvent MotionEvent;
67 typedef XKeyEvent KeyEvent;
68 typedef XExposeEvent ExposeEvent;
69 typedef XFocusChangeEvent FocusChangeEvent;
70 typedef XClientMessageEvent ClientMessageEvent;
73 /* structure definitions */
75 struct X11DrawableInfo
77 char *source_filename;
79 unsigned int width, height;
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 */
88 struct MouseCursorInfo
93 char data[CURSOR_MAX_WIDTH * CURSOR_MAX_HEIGHT / 8];
94 char mask[CURSOR_MAX_WIDTH * CURSOR_MAX_HEIGHT / 8];
98 /* X11 symbol definitions */
100 #define BLACK_PIXEL BlackPixel(display, screen)
101 #define WHITE_PIXEL WhitePixel(display, screen)
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
115 #define KSYM_UNDEFINED XK_VoidSymbol
117 #define KSYM_Return XK_Return
118 #define KSYM_Escape XK_Escape
120 #define KSYM_Left XK_Left
121 #define KSYM_Right XK_Right
122 #define KSYM_Up XK_Up
123 #define KSYM_Down XK_Down
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
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
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
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
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
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
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
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
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
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
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
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)
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
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)
332 /* X11 function definitions */
334 void X11InitVideoDisplay(void);
335 void X11InitVideoBuffer(DrawBuffer **, DrawWindow **);
337 void X11CloseWindow(DrawWindow *);
339 void X11ZoomBitmap(Bitmap *, Bitmap *);
340 Bitmap *X11LoadImage(char *);
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 *);
353 #if defined(TARGET_X11_NATIVE)
354 void X11SetMouseCursor(struct MouseCursorInfo *);