1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #ifndef ___UI_H__
4 #define ___UI_H__
5 
6 #if defined(__linux__)
7 #include <linux/input.h>
8 #elif defined(__NetBSD__) || defined(__OpenBSD__)
9 #include <dev/wscons/wsksymdef.h>
10 #endif
11 
12 #include <stdio.h>
13 
14 typedef struct {
15   FILE* fp;
16 
17   /* Actual width, while ui_display_t.width excludes virtual kbd area. */
18   unsigned int width;
19   /* Actual height, while ui_display_t.height excludes virtual kbd area. */
20   unsigned int height;
21 
22   unsigned int col_width;
23   unsigned int line_height;
24 
25   int key_state;
26   int lock_state;
27 
28   struct ef_conv *conv;
29 
30   unsigned char buf[512];
31   unsigned int buf_len;
32   int is_pressing;
33 
34   void *sixel_output;
35   void *sixel_dither;
36 
37   int support_hmargin;
38 
39 } Display;
40 
41 typedef int XIC;      /* dummy */
42 typedef void* XID;      /* dummy */
43 typedef void* Window;   /* dummy */
44 typedef void* Drawable; /* dummy */
45 
46 typedef struct {
47   unsigned char *image;
48   unsigned int width;
49   unsigned int height;
50 
51 } * Pixmap;
52 
53 typedef unsigned char* PixmapMask;
54 typedef int GC;     /* dummy */
55 typedef int Font;   /* dummy */
56 typedef int Cursor; /* dummy */
57 typedef int KeyCode;
58 typedef int KeySym;
59 
60 typedef struct /* Same as definition in X11/X.h */
61     {
62   int max_keypermod;
63   KeyCode *modifiermap;
64 
65 } XModifierKeymap;
66 
67 typedef struct /* Same as definition in X11/X.h */
68     {
69   unsigned char byte1;
70   unsigned char byte2;
71 
72 } XChar2b;
73 
74 typedef struct {
75   int type;
76   unsigned int state;
77   KeySym ksym;
78   unsigned int keycode;
79 
80 } XKeyEvent;
81 
82 typedef unsigned long Time; /* Same as definition in X11/X.h */
83 typedef unsigned long Atom; /* Same as definition in X11/X.h */
84 
85 typedef struct {
86   int type;
87   Time time;
88   int x;
89   int y;
90   unsigned int state;
91   unsigned int button;
92 
93 } XButtonEvent;
94 
95 typedef struct {
96   int type;
97   Time time;
98   int x;
99   int y;
100   unsigned int state;
101 
102 } XMotionEvent;
103 
104 typedef struct {
105   int type;
106   struct ui_window *target;
107 
108 } XSelectionRequestEvent;
109 
110 typedef union {
111   int type;
112   XKeyEvent xkey;
113   XButtonEvent xbutton;
114   XMotionEvent xmotion;
115   XSelectionRequestEvent xselectionrequest;
116 
117 } XEvent;
118 
119 typedef struct { void *dummy; } XFontStruct;
120 
121 typedef int XFontSet; /* dummy */
122 
123 #define None 0L     /* Same as definition in X11/X.h */
124 #define NoSymbol 0L /* Same as definition in X11/X.h */
125 
126 #define CurrentTime 0L /* Same as definition in X11/X.h */
127 
128 /* Same as definition in X11/X.h */
129 #define NoEventMask 0L
130 #define KeyPressMask (1L << 0)
131 #define KeyReleaseMask (1L << 1)
132 #define ButtonPressMask (1L << 2)
133 #define ButtonReleaseMask (1L << 3)
134 #define EnterWindowMask (1L << 4)
135 #define LeaveWindowMask (1L << 5)
136 #define PointerMotionMask (1L << 6)
137 #define PointerMotionHintMask (1L << 7)
138 #define Button1MotionMask (1L << 8)
139 #define Button2MotionMask (1L << 9)
140 #define Button3MotionMask (1L << 10)
141 #define Button4MotionMask (1L << 11)
142 #define Button5MotionMask (1L << 12)
143 #define ButtonMotionMask (1L << 13)
144 #define KeymapStateMask (1L << 14)
145 #define ExposureMask (1L << 15)
146 #define VisibilityChangeMask (1L << 16)
147 #define StructureNotifyMask (1L << 17)
148 #define ResizeRedirectMask (1L << 18)
149 #define SubstructureNotifyMask (1L << 19)
150 #define SubstructureRedirectMask (1L << 20)
151 #define FocusChangeMask (1L << 21)
152 #define PropertyChangeMask (1L << 22)
153 #define ColormapChangeMask (1L << 23)
154 #define OwnerGrabButtonMask (1L << 24)
155 #define ShiftMask (1 << 0)
156 #define LockMask (1 << 1)
157 #define ControlMask (1 << 2)
158 #define Mod1Mask (1 << 3)
159 #define Mod2Mask (1 << 4)
160 #define Mod3Mask (1 << 5)
161 #define Mod4Mask (1 << 6)
162 #define Mod5Mask (1 << 7)
163 #define Button1Mask (1 << 8)
164 #define Button2Mask (1 << 9)
165 #define Button3Mask (1 << 10)
166 #define Button4Mask (1 << 11)
167 #define Button5Mask (1 << 12)
168 #define Button1 1
169 #define Button2 2
170 #define Button3 3
171 #define Button4 4
172 #define Button5 5
173 
174 /* Same as fb/ui.h (to use same inputmethod plugins from both mlterm-fb and
175  * mlterm-con) */
176 #if defined(__NetBSD__) || defined(__OpenBSD__)
177 
178 #define XK_Super_L 0xfffe /* dummy */
179 #define XK_Super_R 0xfffd /* dummy */
180 #define XK_Hyper_L 0xfffc /* dummy */
181 #define XK_Hyper_R 0xfffb /* dummy */
182 #define XK_BackSpace 0x08
183 #define XK_Tab 0x09
184 #define XK_Clear KS_Clear
185 #define XK_Linefeed KS_Linefeed
186 #define XK_Return 0x0d
187 
188 #define XK_Shift_L KS_Shift_L
189 #define XK_Control_L KS_Control_L
190 #define XK_Alt_L KS_Alt_L
191 #define XK_Shift_R KS_Shift_R
192 #define XK_Control_R KS_Control_R
193 #define XK_Alt_R KS_Alt_R
194 
195 #define XK_Meta_L KS_Meta_L
196 #define XK_Meta_R KS_Meta_R
197 
198 #define XK_Pause KS_Pause
199 #define XK_Shift_Lock KS_Shift_Lock
200 #define XK_Caps_Lock KS_Caps_Lock
201 #define XK_Escape KS_Escape
202 #define XK_Prior KS_Prior
203 #define XK_Next KS_Next
204 #define XK_End KS_End
205 #define XK_Home KS_Home
206 #define XK_Left KS_Left
207 #define XK_Up KS_Up
208 #define XK_Right KS_Right
209 #define XK_Down KS_Down
210 #define XK_Select KS_Select
211 #define XK_Print KS_Print_Screen
212 #define XK_Execute KS_Execute
213 #define XK_Insert KS_Insert
214 #define XK_Delete KS_Delete
215 #define XK_Help KS_Help
216 #define XK_F1 KS_F1
217 #define XK_F2 KS_F2
218 #define XK_F3 KS_F3
219 #define XK_F4 KS_F4
220 #define XK_F5 KS_F5
221 #define XK_F6 KS_F6
222 #define XK_F7 KS_F7
223 #define XK_F8 KS_F8
224 #define XK_F9 KS_F9
225 #define XK_F10 KS_F10
226 #define XK_F11 KS_F11
227 #define XK_F12 KS_F12
228 #define XK_F13 KS_F13
229 #define XK_F14 KS_F14
230 #define XK_F15 KS_F15
231 #define XK_F16 KS_F16
232 #define XK_F17 KS_F17
233 #define XK_F18 KS_F18
234 #define XK_F19 KS_F19
235 #define XK_F20 KS_F20
236 #define XK_F21 0xfffa /* dummy */
237 #define XK_F22 0xfff9 /* dummy */
238 #define XK_F23 0xfff8 /* dummy */
239 #define XK_F24 0xfff7 /* dummy */
240 #define XK_FMAX KS_F20
241 #define XK_Num_Lock KS_Num_Lock
242 #define XK_Scroll_Lock KS_Scroll_Lock
243 #define XK_Find KS_Find
244 #define XK_Menu KS_Menu
245 #define XK_Begin 0xfff6 /* dummy */
246 #define XK_Muhenkan KS_Muhenkan
247 #define XK_Henkan_Mode KS_Henkan_Mode
248 #define XK_Zenkaku_Hankaku KS_Zenkaku_Hankaku
249 #define XK_Hiragana_Katakana KS_Hiragana_Katakana
250 
251 #define XK_KP_Prior KS_KP_Prior
252 #define XK_KP_Next KS_KP_Next
253 #define XK_KP_End KS_KP_End
254 #define XK_KP_Home KS_KP_Home
255 #define XK_KP_Left KS_KP_Left
256 #define XK_KP_Up KS_KP_Up
257 #define XK_KP_Right KS_KP_Right
258 #define XK_KP_Down KS_KP_Down
259 #define XK_KP_Insert KS_KP_Insert
260 #define XK_KP_Delete KS_KP_Delete
261 #define XK_KP_F1 KS_KP_F1
262 #define XK_KP_F2 KS_KP_F2
263 #define XK_KP_F3 KS_KP_F3
264 #define XK_KP_F4 KS_KP_F4
265 #define XK_KP_Begin KS_KP_Begin
266 #define XK_KP_Multiply KS_KP_Multiply
267 #define XK_KP_Add KS_KP_Add
268 #define XK_KP_Separator KS_KP_Separator
269 #define XK_KP_Subtract KS_KP_Subtract
270 #define XK_KP_Decimal KS_KP_Decimal
271 #define XK_KP_Divide KS_KP_Divide
272 #define XK_KP_0 KS_KP_0
273 #define XK_KP_1 KS_KP_1
274 #define XK_KP_2 KS_KP_2
275 #define XK_KP_3 KS_KP_3
276 #define XK_KP_4 KS_KP_4
277 #define XK_KP_5 KS_KP_5
278 #define XK_KP_6 KS_KP_6
279 #define XK_KP_7 KS_KP_7
280 #define XK_KP_8 KS_KP_8
281 #define XK_KP_9 KS_KP_9
282 
283 #define IsKeypadKey(ksym) (0xf200 <= (ksym) && (ksym) < 0xf300)
284 #define IsModifierKey(ksym) (KS_Shift_L <= (ksym) && (ksym) <= KS_Alt_R)
285 
286 #else /* if __FreeBSD__ || __linux__ || __darwin__ */
287 
288 #ifndef __linux__ /* FreeBSD / MacOSX etc */
289 
290 #define KEY_CLEAR 0xff    /* dummy */
291 #define KEY_LINEFEED 0xfe /* dummy */
292 #define KEY_LEFTSHIFT 0x02
293 #define KEY_LEFTCTRL 0x09
294 #define KEY_LEFTALT 0x07
295 #define KEY_RIGHTSHIFT 0x03
296 #define KEY_RIGHTCTRL 0x80
297 #define KEY_RIGHTALT 0x81
298 #define KEY_LEFTMETA 0xfd  /* dummy */
299 #define KEY_RIGHTMETA 0xfc /* dummy */
300 #define KEY_CAPSLOCK 0x04
301 #define KEY_PAGEUP 0x4d
302 #define KEY_PAGEDOWN 0x55
303 #define KEY_END 0x53
304 #define KEY_HOME 0x4b
305 #define KEY_LEFT 0x4f
306 #define KEY_UP 0x4c
307 #define KEY_RIGHT 0x51
308 #define KEY_DOWN 0x54
309 #define KEY_SELECT 0xfb /* dummy */
310 #define KEY_PRINT 0x0a
311 #define KEY_INSERT 0x56
312 #define KEY_DELETE 0x57
313 #define KEY_HELP 0xfa /* dummy */
314 #define KEY_F1 0x1b
315 #define KEY_F2 0x1c
316 #define KEY_F3 0x1d
317 #define KEY_F4 0x1e
318 #define KEY_F5 0x1f
319 #define KEY_F6 0x20
320 #define KEY_F7 0x21
321 #define KEY_F8 0x22
322 #define KEY_F9 0x23
323 #define KEY_F10 0x24
324 #define KEY_F11 0x25
325 #define KEY_F12 0x26
326 #define KEY_F13 0xf9 /* dummy */
327 #define KEY_F14 0xf8 /* dummy */
328 #define KEY_F15 0xf7 /* dummy */
329 #define KEY_F16 0xf6 /* dummy */
330 #define KEY_F17 0xf5 /* dummy */
331 #define KEY_F18 0xf4 /* dummy */
332 #define KEY_F19 0xf3 /* dummy */
333 #define KEY_F20 0xf2 /* dummy */
334 #define KEY_F21 0xf1 /* dummy */
335 #define KEY_F22 0xf0 /* dummy */
336 #define KEY_F23 0xef /* dummy */
337 #define KEY_F24 0xee /* dummy */
338 #define KEY_NUMLOCK 0x05
339 #define KEY_SCROLLLOCK 0x06
340 #define KEY_FIND 0xed             /* dummy */
341 #define KEY_MENU 0xec             /* dummy */
342 #define KEY_MUHENKAN 0xeb         /* dummy */
343 #define KEY_HENKAN 0xea           /* dummy */
344 #define KEY_ZENKAKUHANKAKU 0xe9   /* dummy */
345 #define KEY_KATAKANAHIRAGANA 0xe8 /* dummy */
346 #define KEY_KPASTERISK 0xe7       /* dummy */
347 #define KEY_KPPLUS (0x52 + 0x100)
348 #define KEY_KPCOMMA 0xe6 /* dummy */
349 #define KEY_KPMINUS (0x4e + 0x100)
350 #define KEY_KPDOT (0x7f + 0x100)
351 #define KEY_KPSLASH 0xe5 /* dummy */
352 #define KEY_KP0 (0x56 + 0x100)
353 #define KEY_KP1 (0x53 + 0x100)
354 #define KEY_KP2 (0x54 + 0x100)
355 #define KEY_KP3 (0x55 + 0x100)
356 #define KEY_KP4 (0x4f + 0x100)
357 #define KEY_KP5 (0x50 + 0x100)
358 #define KEY_KP6 (0x51 + 0x100)
359 #define KEY_KP7 (0x4b + 0x100)
360 #define KEY_KP8 (0x4c + 0x100)
361 #define KEY_KP9 (0x4d + 0x100)
362 
363 #endif /* FreeBSD */
364 
365 #define XK_Super_L 0xfffe /* dummy */
366 #define XK_Super_R 0xfffd /* dummy */
367 #define XK_Hyper_L 0xfffc /* dummy */
368 #define XK_Hyper_R 0xfffb /* dummy */
369 #define XK_BackSpace 0x08
370 #define XK_Tab 0x09
371 #define XK_Clear (KEY_CLEAR + 0x100)
372 #define XK_Linefeed (KEY_LINEFEED + 0x100)
373 #define XK_Return 0x0d
374 
375 #define XK_Shift_L (KEY_LEFTSHIFT + 0x100)
376 #define XK_Control_L (KEY_LEFTCTRL + 0x100)
377 #define XK_Alt_L (KEY_LEFTALT + 0x100)
378 #define XK_Shift_R (KEY_RIGHTSHIFT + 0x100)
379 #define XK_Control_R (KEY_RIGHTCTRL + 0x100)
380 #define XK_Alt_R (KEY_RIGHTALT + 0x100)
381 
382 #define XK_Meta_L (KEY_LEFTMETA + 0x100)
383 #define XK_Meta_R (KEY_RIGHTMETA + 0x100)
384 
385 #define XK_Pause 0xfff1      /* dummy */
386 #define XK_Shift_Lock 0xfff0 /* dummy */
387 #define XK_Caps_Lock (KEY_CAPSLOCK + 0x100)
388 #define XK_Escape 0x1b
389 #define XK_Prior (KEY_PAGEUP + 0x100)
390 #define XK_Next (KEY_PAGEDOWN + 0x100)
391 #define XK_End (KEY_END + 0x100)
392 #define XK_Home (KEY_HOME + 0x100)
393 #define XK_Left (KEY_LEFT + 0x100)
394 #define XK_Up (KEY_UP + 0x100)
395 #define XK_Right (KEY_RIGHT + 0x100)
396 #define XK_Down (KEY_DOWN + 0x100)
397 #define XK_Select (KEY_SELECT + 0x100)
398 #define XK_Print (KEY_PRINT + 0x100)
399 #define XK_Execute 0xffef /* dummy */
400 #define XK_Insert (KEY_INSERT + 0x100)
401 #define XK_Delete (KEY_DELETE + 0x100)
402 #define XK_Help (KEY_HELP + 0x100)
403 #define XK_F1 (KEY_F1 + 0x100)
404 #define XK_F2 (KEY_F2 + 0x100)
405 #define XK_F3 (KEY_F3 + 0x100)
406 #define XK_F4 (KEY_F4 + 0x100)
407 #define XK_F5 (KEY_F5 + 0x100)
408 #define XK_F6 (KEY_F6 + 0x100)
409 #define XK_F7 (KEY_F7 + 0x100)
410 #define XK_F8 (KEY_F8 + 0x100)
411 #define XK_F9 (KEY_F9 + 0x100)
412 #define XK_F10 (KEY_F10 + 0x100)
413 #define XK_F11 (KEY_F11 + 0x100)
414 #define XK_F12 (KEY_F12 + 0x100)
415 #define XK_F13 (KEY_F13 + 0x100)
416 #define XK_F14 (KEY_F14 + 0x100)
417 #define XK_F15 (KEY_F15 + 0x100)
418 #define XK_F16 (KEY_F16 + 0x100)
419 #define XK_F17 (KEY_F17 + 0x100)
420 #define XK_F18 (KEY_F18 + 0x100)
421 #define XK_F19 (KEY_F19 + 0x100)
422 #define XK_F20 (KEY_F20 + 0x100)
423 #define XK_F21 (KEY_F21 + 0x100)
424 #define XK_F22 (KEY_F22 + 0x100)
425 #define XK_F23 (KEY_F23 + 0x100)
426 #define XK_F24 (KEY_F24 + 0x100)
427 #ifdef __FreeBSD__
428 #define XK_FMAX XK_F12
429 #else
430 #define XK_FMAX XK_F10 /* F11 or later is not sequential number. */
431 #endif
432 #define XK_Num_Lock (KEY_NUMLOCK + 0x100)
433 #define XK_Scroll_Lock (KEY_SCROLLLOCK + 0x100)
434 #define XK_Find (KEY_FIND + 0x100)
435 #define XK_Menu (KEY_MENU + 0x100)
436 #define XK_Begin 0xffee /* dummy */
437 #define XK_Muhenkan (KEY_MUHENKAN + 0x100)
438 #define XK_Henkan_Mode (KEY_HENKAN + 0x100)
439 #define XK_Zenkaku_Hankaku (KEY_ZENKAKUHANKAKU + 0x100)
440 #define XK_Hiragana_Katakana (KEY_KATAKANAHIRAGANA + 0x100)
441 
442 #define XK_KP_Prior (KEY_KP9 + 0x100)
443 #define XK_KP_Next (KEY_KP3 + 0x100)
444 #define XK_KP_End (KEY_KP1 + 0x100)
445 #define XK_KP_Home (KEY_KP7 + 0x100)
446 #define XK_KP_Left (KEY_KP4 + 0x100)
447 #define XK_KP_Up (KEY_KP8 + 0x100)
448 #define XK_KP_Right (KEY_KP6 + 0x100)
449 #define XK_KP_Down (KEY_KP2 + 0x100)
450 #define XK_KP_Insert (KEY_KP0 + 0x100)
451 #define XK_KP_Delete (KEY_KPDOT + 0x100)
452 #define XK_KP_F1 0xffed               /* dummy */
453 #define XK_KP_F2 0xffec               /* dummy */
454 #define XK_KP_F3 0xffeb               /* dummy */
455 #define XK_KP_F4 0xffea               /* dummy */
456 #define XK_KP_Begin (KEY_KP5 + 0x100) /* dummy */
457 #define XK_KP_Multiply (KEY_KPASTERISK + 0x100)
458 #define XK_KP_Add (KEY_KPPLUS + 0x100)
459 #define XK_KP_Separator (KEY_KPCOMMA + 0x100)
460 #define XK_KP_Subtract (KEY_KPMINUS + 0x100)
461 #define XK_KP_Decimal 0xffe9 /* dummy */
462 #define XK_KP_Divide (KEY_KPSLASH + 0x100)
463 #define XK_KP_0 0xffe8 /* dummy */
464 #define XK_KP_1 0xffe7 /* dummy */
465 #define XK_KP_2 0xffe6 /* dummy */
466 #define XK_KP_3 0xffe5 /* dummy */
467 #define XK_KP_4 0xffe4 /* dummy */
468 #define XK_KP_5 0xffe3 /* dummy */
469 #define XK_KP_6 0xffe1 /* dummy */
470 #define XK_KP_7 0xffe0 /* dummy */
471 #define XK_KP_8 0xffdf /* dummy */
472 #define XK_KP_9 0xffde /* dummy */
473 
474 #define IsKeypadKey(ksym) (1)
475 #define IsModifierKey(ksym) (0)
476 
477 #endif /* FreeBSD/Linux/NetBSD */
478 
479 #define XK_ISO_Left_Tab 0xff61 /* dummy */
480 
481 /* Same as definition in X11/X.h */
482 typedef struct {
483   short x;
484   short y;
485 
486 } XPoint;
487 
488 /* XXX dummy */
489 #define XKeysymToKeycode(disp, ks) (ks)
490 #define XKeycodeToKeysym(disp, kc, i) (kc)
491 #define XKeysymToString(ks) ""
492 #define DefaultScreen(disp) (0)
493 
494 #define BlackPixel(disp, screen) (0)
495 #define WhitePixel(disp, screen) (-1)
496 
497 /* Same as definition in X11/cursorfont.h */
498 #define XC_xterm 152
499 #define XC_left_ptr 68
500 
501 /* Same as definition in X11/Xutil.h */
502 #define NoValue 0x0000
503 #define XValue 0x0001
504 #define YValue 0x0002
505 #define WidthValue 0x0004
506 #define HeightValue 0x0008
507 #define AllValues 0x000F
508 #define XNegative 0x0010
509 #define YNegative 0x0020
510 
511 int XParseGeometry(char *str, int *x, int *y, unsigned int *width, unsigned int *height);
512 
513 KeySym XStringToKeysym(char *str);
514 
515 /* === Platform dependent options === */
516 
517 #define UI_COLOR_HAS_RGB
518 #undef SUPPORT_TRUE_TRANSPARENT_BG
519 /* Actually, fonts aren't scalable, but define TYPE_XCORE_SCALABLE to avoid
520  * double drawing. */
521 #define TYPE_XCORE_SCALABLE
522 #define MANAGE_ROOT_WINDOWS_BY_MYSELF
523 #define MANAGE_SUB_WINDOWS_BY_MYSELF
524 /* See also console/ui_display.c where ui_picture_display_closed() is never called. */
525 #define INLINE_PICTURE_MOVABLE_BETWEEN_DISPLAYS
526 #undef SUPPORT_POINT_SIZE_FONT
527 #undef XIM_SPOT_IS_LINE_TOP
528 #undef USE_GC
529 #undef CHANGEABLE_CURSOR
530 /* use same modules as those for framebuffer */
531 #define PLUGIN_MODULE_SUFFIX "fb"
532 #undef KEY_REPEAT_BY_MYSELF
533 #undef ROTATABLE_DISPLAY
534 #undef PSEUDO_COLOR_DISPLAY
535 #undef WALL_PICTURE_SIXEL_REPLACES_SYSTEM_PALETTE
536 #undef SUPPORT_URGENT_BELL
537 #undef FORCE_UNICODE
538 #undef NEED_DISPLAY_SYNC_EVERY_TIME
539 #undef DRAW_SCREEN_IN_PIXELS
540 #undef NO_DRAW_IMAGE_STRING
541 /* libpthread is not linked to mlterm explicitly for now. */
542 #undef HAVE_PTHREAD
543 #undef COMPOSE_DECSP_FONT
544 #undef USE_REAL_VERTICAL_FONT
545 #undef NO_DISPLAY_FD
546 #undef FLICK_SCROLL
547 #undef UIWINDOW_SUPPORTS_PREEDITING
548 
549 #endif
550