annotate src/X_supp.c @ 1293:10bffaffef82

Fix the supporting of removing key tween partially. - For key tween that only middle or right part of the ween being covered by removing range, we shrink the size of the tween and keep the key. - After shrink the size, start removing frames at the frame next to new end frame of the scene after shrinking.
author Thinker K.F. Li <thinker@codemud.net>
date Sat, 15 Jan 2011 22:41:58 +0800
parents 673978a8bc4b
children 84368f4bc988
rev   line source
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
1 // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*-
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
2 // vim: sw=4:ts=8:sts=4
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3 #include <stdio.h>
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
4 #include <stdlib.h>
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
5 #include <string.h>
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
6 #include <X11/Xlib.h>
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
7 #include <X11/Xutil.h>
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
8 #include "mb_graph_engine.h"
186
530bb7728546 Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents: 185
diff changeset
9 #include "mb_redraw_man.h"
530bb7728546 Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents: 185
diff changeset
10 #include "mb_timer.h"
530bb7728546 Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents: 185
diff changeset
11 #include "mb_X_supp.h"
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
12 #include "mb_backend.h"
1018
7ccc094bdbe5 Move the timer manager based on mb_tman_t to timer.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1016
diff changeset
13 #include "mb_backend_utils.h"
694
7e64e0f70cb6 Switch XSHM with autoconf
Thinker K.F. Li <thinker@branda.to>
parents: 693
diff changeset
14 #include "config.h"
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
15
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
16 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
17 /* \sa http://www.xfree86.org/current/mit-shm.html */
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
18 #include <sys/ipc.h>
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
19 #include <sys/shm.h>
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
20 #include <X11/extensions/XShm.h>
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
21 #endif
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
22
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
23 #define ERR -1
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
24 #define OK 0
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
25
1015
c4a567112d29 Mark out functions supprting nodejs in X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1014
diff changeset
26 #define ASSERT(x)
c4a567112d29 Mark out functions supprting nodejs in X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1014
diff changeset
27
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
28 #define ONLY_MOUSE_MOVE_RAW 1
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
29
1018
7ccc094bdbe5 Move the timer manager based on mb_tman_t to timer.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1016
diff changeset
30 static mb_timer_factory_t *_timer_factory = &tman_timer_factory;
7ccc094bdbe5 Move the timer manager based on mb_tman_t to timer.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1016
diff changeset
31
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
32 /*! \ingroup xkb
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
33 * @{
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
34 */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
35 struct _X_kb_info {
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
36 int keycode_min, keycode_max;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
37 int ksym_per_code;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
38 KeySym *syms;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
39 subject_t *kbevents;
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
40 observer_factory_t *observer_factory;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
41 };
1112
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
42 typedef struct _X_kb_info X_kb_info_t;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
43
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
44 /* @} */
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
45
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
46 struct _X_supp_runtime {
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
47 Display *display;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
48 Window win;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
49 Visual *visual;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
50 mbe_surface_t *surface, *backend_surface;
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
51 mbe_t *cr, *backend_cr;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
52 redraw_man_t *rdman;
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
53 mb_img_ldr_t *img_ldr;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
54 int w, h;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
55
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
56 X_kb_info_t kbinfo;
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
57 mb_IO_man_t *io_man;
1003
4b1bef7e5516 Change _X_MB_runtime and fix _x_mb_event_loop()
Thinker K.F. Li <thinker@codemud.net>
parents: 1002
diff changeset
58 mb_timer_man_t *timer_man;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
59
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
60 #ifndef ONLY_MOUSE_MOVE_RAW
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
61 /* States */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
62 shape_t *last;
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
63 #endif
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
64
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
65 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
66 XImage *ximage;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
67 XShmSegmentInfo shminfo;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
68 #endif
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
69
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
70 /* For handle connection */
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
71 int io_hdl;
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
72
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
73 /*
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
74 * Following variables are used by handle_single_x_event()
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
75 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
76 int last_evt_type; /* Type of last event */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
77 int eflag;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
78 int ex1, ey1, ex2, ey2; /* Aggregate expose events */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
79 int mflag;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
80 int mx, my; /* Position of last motion event */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
81 int mbut_state; /* Button state of last motion event */
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
82 };
1112
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
83 typedef struct _X_supp_runtime X_supp_runtime_t;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
84
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
85 static void _x_supp_handle_x_event(X_supp_runtime_t *rt);
1005
714169f33f13 Fix X_init_connection() to match modification of mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1004
diff changeset
86
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
87 /*! \defgroup x_supp_io IO manager for X.
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
88 * @{
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
89 */
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
90 #define MAX_MONITORS 200
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
91
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
92 typedef struct {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
93 int type;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
94 int fd;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
95 mb_IO_cb_t cb;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
96 void *data;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
97 } monitor_t;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
98
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
99 struct _X_supp_IO_man {
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
100 mb_IO_man_t io_man;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
101 monitor_t monitors[MAX_MONITORS];
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
102 int n_monitor;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
103 };
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
104
1000
c92aabb054e2 Declare functions correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 999
diff changeset
105 static int _x_supp_io_man_reg(struct _mb_IO_man *io_man,
c92aabb054e2 Declare functions correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 999
diff changeset
106 int fd, MB_IO_TYPE type,
c92aabb054e2 Declare functions correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 999
diff changeset
107 mb_IO_cb_t cb, void *data);
1001
b462b9e213e8 Fix typo for the name of _mb_IO_man
Thinker K.F. Li <thinker@codemud.net>
parents: 1000
diff changeset
108 static void _x_supp_io_man_unreg(struct _mb_IO_man *io_man, int io_hdl);
1000
c92aabb054e2 Declare functions correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 999
diff changeset
109 static mb_IO_man_t *_x_supp_io_man_new(void);
c92aabb054e2 Declare functions correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 999
diff changeset
110 static void _x_supp_io_man_free(mb_IO_man_t *io_man);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
111
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
112 static mb_IO_factory_t _X_supp_default_io_factory = {
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
113 _x_supp_io_man_new,
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
114 _x_supp_io_man_free
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
115 };
999
d975a59d4504 Fix typo on variable reference
Thinker K.F. Li <thinker@codemud.net>
parents: 998
diff changeset
116 static mb_IO_factory_t *_io_factory = &_X_supp_default_io_factory;
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
117
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
118 static struct _X_supp_IO_man _default_io_man = {
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
119 {_x_supp_io_man_reg, _x_supp_io_man_unreg},
987
bf0da8c7d03f Add default timer factory for X support
Thinker K.F. Li <thinker@codemud.net>
parents: 986
diff changeset
120 {}, /* monitors */
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
121 0 /* n_monitor */
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
122 };
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
123
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
124 static mb_IO_man_t *
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
125 _x_supp_io_man_new(void) {
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
126 return (mb_IO_man_t *)&_default_io_man;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
127 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
128
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
129 static void
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
130 _x_supp_io_man_free(mb_IO_man_t *io_man) {
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
131 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
132
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
133 static int
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
134 _x_supp_io_man_reg(struct _mb_IO_man *io_man,
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
135 int fd, MB_IO_TYPE type, mb_IO_cb_t cb, void *data) {
1002
aa0583e0a96b Fix typo for the naem of struct _X_supp_IO_man
Thinker K.F. Li <thinker@codemud.net>
parents: 1001
diff changeset
136 struct _X_supp_IO_man *xmb_io_man = (struct _X_supp_IO_man *)io_man;
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
137 int i;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
138
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
139 for(i = 0; i < xmb_io_man->n_monitor; i++) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
140 if (xmb_io_man->monitors[i].type == MB_IO_DUMMY)
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
141 break;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
142 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
143 if (i == MAX_MONITORS)
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
144 return ERR;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
145
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
146 xmb_io_man->monitors[i].type = type;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
147 xmb_io_man->monitors[i].fd = fd;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
148 xmb_io_man->monitors[i].cb = cb;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
149 xmb_io_man->monitors[i].data = data;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
150 i++;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
151 if(i > xmb_io_man->n_monitor)
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
152 xmb_io_man->n_monitor = i;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
153 return i - 1;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
154 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
155
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
156 static void
988
bc8cfcd40d0e Rename _x_mb_io_man* to _x_supp_io_man*
Thinker K.F. Li <thinker@codemud.net>
parents: 987
diff changeset
157 _x_supp_io_man_unreg(struct _mb_IO_man *io_man, int io_hdl) {
1002
aa0583e0a96b Fix typo for the naem of struct _X_supp_IO_man
Thinker K.F. Li <thinker@codemud.net>
parents: 1001
diff changeset
158 struct _X_supp_IO_man *xmb_io_man = (struct _X_supp_IO_man *)io_man;
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
159
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
160 ASSERT(io_hdl < xmb_io_man->n_monitor);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
161 xmb_io_man->monitors[io_hdl].type = MB_IO_DUMMY;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
162 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
163
1112
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
164 #ifdef XSHM
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
165 static void XSHM_update(X_supp_runtime_t *xmb_rt);
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
166 #endif
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
167
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
168 /*! \brief Handle connection coming data and timeout of timers.
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
169 *
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
170 * \param display is a Display returned by XOpenDisplay().
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
171 * \param rdman is a redraw manager.
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
172 * \param tman is a timer manager.
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
173 *
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
174 * The display is managed by specified rdman and tman. rdman draws
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
175 * on the display, and tman trigger actions according timers.
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
176 */
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
177 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
178 _x_supp_event_loop(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
179 struct _X_supp_runtime *xmb_rt = (struct _X_supp_runtime *)rt;
1006
3ee2e30b260f Rename xmbrt to xmb_rt
Thinker K.F. Li <thinker@codemud.net>
parents: 1005
diff changeset
180 struct _X_supp_IO_man *io_man = (struct _X_supp_IO_man *)xmb_rt->io_man;
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
181 mb_timer_man_t *timer_man = (mb_timer_man_t *)xmb_rt->timer_man;
1026
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
182 redraw_man_t *rdman;
1018
7ccc094bdbe5 Move the timer manager based on mb_tman_t to timer.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1016
diff changeset
183 mb_tman_t *tman = tman_timer_man_get_tman(timer_man);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
184 mb_timeval_t now, tmo;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
185 struct timeval tv;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
186 fd_set rfds, wfds;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
187 int nfds = 0;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
188 int r, r1,i;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
189
1026
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
190 rdman = mb_runtime_rdman(rt);
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
191
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
192 _x_supp_handle_x_event(xmb_rt);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
193
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
194 while(1) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
195 FD_ZERO(&rfds);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
196 FD_ZERO(&wfds);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
197 for(i = 0; i < io_man->n_monitor; i++) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
198 if(io_man->monitors[i].type == MB_IO_R ||
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
199 io_man->monitors[i].type == MB_IO_RW) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
200 FD_SET(io_man->monitors[i].fd, &rfds);
1004
d6035efd64dc Use MB_MAX()
Thinker K.F. Li <thinker@codemud.net>
parents: 1003
diff changeset
201 nfds = MB_MAX(nfds, io_man->monitors[i].fd + 1);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
202 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
203 if(io_man->monitors[i].type == MB_IO_W ||
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
204 io_man->monitors[i].type == MB_IO_RW) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
205 FD_SET(io_man->monitors[i].fd, &wfds);
1004
d6035efd64dc Use MB_MAX()
Thinker K.F. Li <thinker@codemud.net>
parents: 1003
diff changeset
206 nfds = MB_MAX(nfds, io_man->monitors[i].fd + 1);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
207 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
208 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
209
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
210 get_now(&now);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
211 r = mb_tman_next_timeout(tman, &now, &tmo);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
212
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
213 if(r == 0) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
214 tv.tv_sec = MB_TIMEVAL_SEC(&tmo);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
215 tv.tv_usec = MB_TIMEVAL_USEC(&tmo);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
216 r1 = select(nfds, &rfds, NULL, NULL, &tv);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
217 } else
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
218 r1 = select(nfds, &rfds, NULL, NULL, NULL);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
219
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
220 if(r1 == -1) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
221 perror("select");
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
222 break;
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
223 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
224
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
225 if(r1 == 0) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
226 get_now(&now);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
227 mb_tman_handle_timeout(tman, &now);
1026
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
228 rdman_redraw_changed(rdman);
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
229 #ifdef XSHM
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
230 XSHM_update(xmb_rt);
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
231 #endif
407932b8a160 Redraw changed after handling timeout for X_supp.c
Thinker K.F. Li <thinker@codemud.net>
parents: 1022
diff changeset
232 XFlush(xmb_rt->display);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
233 } else {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
234 for(i = 0; i < io_man->n_monitor; i++) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
235 if(io_man->monitors[i].type == MB_IO_R ||
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
236 io_man->monitors[i].type == MB_IO_RW) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
237 if(FD_ISSET(io_man->monitors[i].fd, &rfds))
1003
4b1bef7e5516 Change _X_MB_runtime and fix _x_mb_event_loop()
Thinker K.F. Li <thinker@codemud.net>
parents: 1002
diff changeset
238 io_man->monitors[i].cb(i, io_man->monitors[i].fd,
4b1bef7e5516 Change _X_MB_runtime and fix _x_mb_event_loop()
Thinker K.F. Li <thinker@codemud.net>
parents: 1002
diff changeset
239 MB_IO_R,
4b1bef7e5516 Change _X_MB_runtime and fix _x_mb_event_loop()
Thinker K.F. Li <thinker@codemud.net>
parents: 1002
diff changeset
240 io_man->monitors[i].data);
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
241 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
242 if(io_man->monitors[i].type == MB_IO_W ||
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
243 io_man->monitors[i].type == MB_IO_RW) {
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
244 if(FD_ISSET(io_man->monitors[i].fd, &wfds))
990
8dd42310dd79 Change signature of callback for IO and timer manager
Thinker K.F. Li <thinker@codemud.net>
parents: 989
diff changeset
245 io_man->monitors[i].cb(i, io_man->monitors[i].fd,
986
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
246 MB_IO_W,
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
247 io_man->monitors[i].data);
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
248 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
249 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
250 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
251 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
252 }
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
253
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
254 /* @} */
c39d14139ca5 Implement IO manager interface for X
Thinker K.F. Li <thinker@codemud.net>
parents: 984
diff changeset
255
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
256 #ifdef XSHM
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
257 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
258 XSHM_update(X_supp_runtime_t *xmb_rt) {
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
259 GC gc;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
260
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
261 gc = DefaultGC(xmb_rt->display, DefaultScreen(xmb_rt->display));
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
262 if(xmb_rt->ximage) { /* support XSHM */
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
263 XShmPutImage(xmb_rt->display,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
264 xmb_rt->win,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
265 gc,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
266 xmb_rt->ximage,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
267 0, 0, 0, 0,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
268 xmb_rt->w, xmb_rt->h, 0);
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
269 }
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
270 }
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
271 #endif
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
272
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
273 /*! \defgroup xkb X Keyboard Handling
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
274 *
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
275 * Accept keyboard events from X server and delivery it to
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
276 * application through observer pattern. There is a subject,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
277 * per X-connection, for that.
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
278 * @{
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
279 */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
280 static int keycode2sym(X_kb_info_t *kbinfo, unsigned int keycode) {
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
281 int sym_idx;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
282 int sym;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
283
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
284 sym_idx = kbinfo->ksym_per_code * (keycode - kbinfo->keycode_min);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
285 sym = kbinfo->syms[sym_idx];
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
286 return sym;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
287 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
288
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
289 static int X_kb_init(X_kb_info_t *kbinfo, Display *display,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
290 redraw_man_t *rdman) {
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
291 int n_syms;
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
292 observer_factory_t *factory;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
293 int r;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
294
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
295 r = XDisplayKeycodes(display,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
296 &kbinfo->keycode_min,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
297 &kbinfo->keycode_max);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
298 if(r == 0)
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
299 return ERR;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
300
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
301 n_syms = kbinfo->keycode_max - kbinfo->keycode_min + 1;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
302 kbinfo->syms = XGetKeyboardMapping(display, kbinfo->keycode_min,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
303 n_syms,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
304 &kbinfo->ksym_per_code);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
305 if(kbinfo->syms == NULL)
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
306 return ERR;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
307
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
308 factory = rdman_get_observer_factory(rdman);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
309 kbinfo->kbevents = subject_new(factory, kbinfo, OBJT_KB);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
310 if(kbinfo->kbevents == NULL)
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
311 return ERR;
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
312 /*! \todo Make sure observer_factory is still need. */
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
313 kbinfo->observer_factory = factory;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
314
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
315 return OK;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
316 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
317
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
318 static void X_kb_destroy(X_kb_info_t *kbinfo) {
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 186
diff changeset
319 subject_free(kbinfo->kbevents);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
320 XFree(kbinfo->syms);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
321 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
322
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
323 /*! \brief Accept X keyboard events from _x_supp_handle_x_event() and
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
324 * dispatch it.
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
325 */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
326 static void X_kb_handle_event(X_kb_info_t *kbinfo, XKeyEvent *xkey) {
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
327 unsigned int code;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
328 int sym;
1112
1993e5ae60aa Rename X_kb_event_t to mb_kb_event_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1110
diff changeset
329 mb_kb_event_t event;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
330
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
331 code = xkey->keycode;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
332 sym = keycode2sym(kbinfo, code);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
333 if(xkey->type == KeyPress)
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
334 event.event.type = EVT_KB_PRESS;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
335 else if(xkey->type == KeyRelease)
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
336 event.event.type = EVT_KB_RELEASE;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
337 event.event.tgt = event.event.cur_tgt = kbinfo->kbevents;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
338 event.keycode = code;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
339 event.sym = sym;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
340
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 186
diff changeset
341 subject_notify(kbinfo->kbevents, &event.event);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
342 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
343 /* @} */
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
344
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
345 static unsigned int get_button_state(unsigned int state) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
346 unsigned int but = 0;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
347
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
348 if(state & Button1Mask)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
349 but |= MOUSE_BUT1;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
350 if(state & Button2Mask)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
351 but |= MOUSE_BUT2;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
352 if(state & Button3Mask)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
353 but |= MOUSE_BUT3;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
354
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
355 return but;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
356 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
357
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
358 static unsigned int get_button(unsigned int button) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
359 switch(button) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
360 case Button1:
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
361 return MOUSE_BUT1;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
362 case Button2:
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
363 return MOUSE_BUT2;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
364 case Button3:
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
365 return MOUSE_BUT3;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
366 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
367 return 0;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
368 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
369
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
370 /*! \brief Notify observers of the shape at specified
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
371 * position for mouse event.
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
372 *
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
373 * Observers of parent shapes may be called if the subject is not
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
374 * with SUBF_STOP_PROPAGATE flag. The subject of mouse event
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
375 * for a shape is returned by sh_get_mouse_event_subject().
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
376 */
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
377 static void notify_coord_or_shape(redraw_man_t *rdman,
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
378 mb_obj_t *obj,
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
379 co_aix x, co_aix y, int etype,
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
380 unsigned int state,
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
381 unsigned int button) {
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
382 mouse_event_t mouse_event;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
383 subject_t *subject;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
384
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
385 mouse_event.event.type = etype;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
386 mouse_event.x = x;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
387 mouse_event.y = y;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
388 mouse_event.but_state = state;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
389 mouse_event.button = button;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
390
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
391 if(IS_MBO_SHAPES(obj))
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
392 subject = sh_get_mouse_event_subject((shape_t *)obj);
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
393 else
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
394 subject = coord_get_mouse_event((coord_t *)obj);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
395
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 186
diff changeset
396 subject_notify(subject, (event_t *)&mouse_event);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
397 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
398
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
399 /*! \brief Handle motion event.
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
400 */
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
401 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
402 handle_motion_event(X_supp_runtime_t *rt) {
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
403 redraw_man_t *rdman = rt->rdman;
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
404 int x, y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
405 int state;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
406 shape_t *shape;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
407 coord_t *root;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
408 int in_stroke;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
409
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
410 x = rt->mx;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
411 y = rt->my;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
412 state = rt->mbut_state;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
413
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
414 shape = find_shape_at_pos(rdman, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
415 &in_stroke);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
416 #ifdef ONLY_MOUSE_MOVE_RAW
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
417 if(shape != NULL) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
418 notify_coord_or_shape(rdman, (mb_obj_t *)shape,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
419 x, y, EVT_MOUSE_MOVE_RAW, state, 0);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
420 } else {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
421 root = rdman_get_root(rdman);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
422 notify_coord_or_shape(rdman, (mb_obj_t *)root,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
423 x, y, EVT_MOUSE_MOVE_RAW, state, 0);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
424 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
425 #else
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
426 if(shape != NULL) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
427 if(rt->last != shape) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
428 if(rt->last)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
429 notify_coord_or_shape(rdman, rt->last, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
430 EVT_MOUSE_OUT, state, 0);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
431 notify_coord_or_shape(rdman, shape, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
432 EVT_MOUSE_OVER, state, 0);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
433 rt->last = shape;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
434 } else
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
435 notify_coord_or_shape(rdman, shape, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
436 EVT_MOUSE_MOVE, state, 0);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
437 } else {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
438 if(rt->last) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
439 notify_coord_or_shape(rdman, rt->last, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
440 EVT_MOUSE_OUT, state, 0);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
441 rt->last = NULL;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
442 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
443 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
444 #endif
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
445
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
446 rt->mflag = 0;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
447 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
448
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
449 /*! \brief Redraw exposed area.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
450 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
451 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
452 handle_expose_event(X_supp_runtime_t *rt) {
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
453 redraw_man_t *rdman = rt->rdman;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
454 int ex1, ey1, ex2, ey2;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
455
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
456 ex1 = rt->ex1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
457 ey1 = rt->ey1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
458 ex2 = rt->ex2;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
459 ey2 = rt->ey2;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
460
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
461 rdman_redraw_area(rdman, ex1, ey1, (ex2 - ex1), (ey2 - ey1));
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
462
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
463 rt->eflag = 0;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
464 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
465
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
466 /*! \brief Handle single X event and maintain internal states.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
467 *
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
468 * It keeps internal state in rt to improve performance.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
469 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
470 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
471 handle_single_x_event(X_supp_runtime_t *rt, XEvent *evt) {
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
472 redraw_man_t *rdman = rt->rdman;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
473 XMotionEvent *mevt;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
474 XButtonEvent *bevt;
81
13fdf205047b Hide shapes and groups
Thinker K.F. Li <thinker@branda.to>
parents: 78
diff changeset
475 XExposeEvent *eevt;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
476 XKeyEvent *xkey;
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
477 int x, y, w, h;
81
13fdf205047b Hide shapes and groups
Thinker K.F. Li <thinker@branda.to>
parents: 78
diff changeset
478
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
479 shape_t *shape;
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
480
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
481 unsigned int state, button;
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
482 int in_stroke;
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
483
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
484 if(evt->type != MotionNotify && rt->mflag)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
485 handle_motion_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
486
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
487 switch(evt->type) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
488 case ButtonPress:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
489 bevt = (XButtonEvent *)evt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
490 x = bevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
491 y = bevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
492 state = get_button_state(bevt->state);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
493 button = get_button(bevt->button);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
494
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
495 shape = find_shape_at_pos(rdman, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
496 &in_stroke);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
497 if(shape)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
498 notify_coord_or_shape(rdman, (mb_obj_t *)shape,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
499 x, y, EVT_MOUSE_BUT_PRESS,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
500 state, button);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
501 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
502
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
503 case ButtonRelease:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
504 bevt = (XButtonEvent *)evt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
505 x = bevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
506 y = bevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
507 state = get_button_state(bevt->state);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
508 button = get_button(bevt->button);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
509
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
510 shape = find_shape_at_pos(rdman, x, y,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
511 &in_stroke);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
512 if(shape)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
513 notify_coord_or_shape(rdman, (mb_obj_t *)shape,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
514 x, y, EVT_MOUSE_BUT_RELEASE,
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
515 state, button);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
516 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
517
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
518 case MotionNotify:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
519 mevt = (XMotionEvent *)evt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
520 rt->mx = mevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
521 rt->my = mevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
522 rt->mbut_state = get_button_state(mevt->state);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
523 rt->mflag = 1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
524 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
525
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
526 case KeyPress:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
527 case KeyRelease:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
528 xkey = &evt->xkey;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
529 X_kb_handle_event(&rt->kbinfo, xkey);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
530 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
531
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
532 case Expose:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
533 eevt = &evt->xexpose;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
534 x = eevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
535 y = eevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
536 w = eevt->width;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
537 h = eevt->height;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
538
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
539 if(rt->eflag) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
540 if(x < rt->ex1)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
541 rt->ex1 = x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
542 if(y < rt->ey1)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
543 rt->ey1 = y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
544 if((x + w) > rt->ex2)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
545 rt->ex2 = x + w;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
546 if((y + h) > rt->ey2)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
547 rt->ey2 = y + h;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
548 } else {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
549 rt->ex1 = x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
550 rt->ey1 = y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
551 rt->ex2 = x + w;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
552 rt->ey2 = y + h;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
553 rt->eflag = 1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
554 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
555 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
556 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
557 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
558
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
559 /*! \brief Call when no more event in an event iteration.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
560 *
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
561 * No more event means event queue is emplty. This function will
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
562 * perform some actions according current internal state.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
563 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
564 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
565 no_more_event(X_supp_runtime_t *rt) {
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
566 if(rt->mflag)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
567 handle_motion_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
568 if(rt->eflag)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
569 handle_expose_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
570 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
571
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
572 /*! \brief Dispatch all X events in the queue.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
573 */
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
574 static void _x_supp_handle_x_event(X_supp_runtime_t *rt) {
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
575 Display *display = rt->display;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
576 XEvent evt;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
577 int r;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
578
529
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
579 /* XXX: For some unknown reason, it causes a segmentation fault to
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
580 * called XEventsQueued() after receiving first Expose event
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
581 * and before redraw for the event.
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
582 */
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
583 while(XEventsQueued(display, QueuedAfterReading) > 0) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
584 r = XNextEvent(display, &evt);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
585 if(r == -1)
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
586 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
587
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
588 handle_single_x_event(rt, &evt);
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
589 }
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
590 no_more_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
591
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
592 #ifdef XSHM
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
593 XSHM_update(rt);
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
594 #endif
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
595 XFlush(display);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
596 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
597
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
598 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
599 _x_supp_handle_connection(int hdl, int fd, MB_IO_TYPE type, void *data) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
600 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *)data;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
601
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
602 _x_supp_handle_x_event(xmb_rt);
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
603 }
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
604
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
605 static int X_init_connection(const char *display_name,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
606 int w, int h,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
607 Display **displayp,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
608 Visual **visualp,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
609 Window *winp) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
610 Display *display;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
611 Window root, win;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
612 Visual *visual;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
613 int screen;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
614 XSetWindowAttributes wattr;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
615 int depth;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
616 int x, y;
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
617 int draw_root = 0;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
618 const char *disp_name;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
619 char disp_buf[32];
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
620 int cp;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
621 int r;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
622
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
623 /*
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
624 * Support drawing on the root window.
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
625 */
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
626 disp_name = display_name;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
627 if(strstr(display_name, ":root") != NULL) {
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
628 draw_root = 1;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
629 cp = strlen(display_name) - 5;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
630 if(cp >= 32)
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
631 cp = 31;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
632 memcpy(disp_buf, display_name, cp);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
633 disp_buf[cp] = 0;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
634 disp_name = disp_buf;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
635 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
636
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
637 display = XOpenDisplay(disp_name);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
638 if(display == NULL)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
639 return ERR;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
640
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
641 screen = DefaultScreen(display);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
642 root = DefaultRootWindow(display);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
643 visual = DefaultVisual(display, screen);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
644 depth = DefaultDepth(display, screen);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
645 wattr.override_redirect = False;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
646 x = 10;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
647 y = 10;
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
648 if(draw_root)
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
649 win = RootWindowOfScreen(ScreenOfDisplay(display, screen));
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
650 else {
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
651 win = XCreateWindow(display, root,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
652 x, y,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
653 w, h,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
654 1, depth, InputOutput, visual,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
655 CWOverrideRedirect, &wattr);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
656 r = XMapWindow(display, win);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
657 if(r == -1) {
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
658 XCloseDisplay(display);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
659 return ERR;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
660 }
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
661 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
662
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
663 XSelectInput(display, win, PointerMotionMask | ExposureMask |
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
664 ButtonPressMask | ButtonReleaseMask |
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
665 KeyPressMask | KeyReleaseMask);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
666 XFlush(display);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
667
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
668 *displayp = display;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
669 *visualp = visual;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
670 *winp = win;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
671
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
672 return OK;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
673 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
674
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
675 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
676 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
677 xshm_destroy(X_supp_runtime_t *xmb_rt) {
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
678 XShmSegmentInfo *shminfo;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
679
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
680 shminfo = &xmb_rt->shminfo;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
681
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
682 if(xmb_rt->shminfo.shmaddr) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
683 XShmDetach(xmb_rt->display, shminfo);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
684 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
685
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
686 if(xmb_rt->ximage) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
687 XDestroyImage(xmb_rt->ximage);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
688 xmb_rt->ximage = NULL;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
689 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
690
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
691 if(shminfo->shmaddr) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
692 shmdt(shminfo->shmaddr);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
693 shminfo->shmaddr = NULL;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
694 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
695
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
696 if(shminfo->shmid) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
697 shmctl(shminfo->shmid, IPC_RMID, 0);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
698 shminfo->shmid = 0;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
699 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
700 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
701
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
702 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
703 xshm_init(X_supp_runtime_t *xmb_rt) {
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
704 Display *display;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
705 Visual *visual;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
706 XImage *ximage;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
707 int screen;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
708 int depth;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
709 int support_shm;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
710 int mem_sz;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
711 XShmSegmentInfo *shminfo;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
712 int surf_fmt;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
713
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
714 display = xmb_rt->display;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
715 visual = xmb_rt->visual;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
716 shminfo = &xmb_rt->shminfo;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
717
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
718 support_shm = XShmQueryExtension(display);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
719 if(!support_shm)
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
720 return;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
721
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
722 screen = DefaultScreen(display);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
723 depth = DefaultDepth(display, screen);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
724
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
725 if(depth != 24 && depth != 32)
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
726 return;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
727
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
728 xmb_rt->ximage = XShmCreateImage(display, visual, depth,
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
729 ZPixmap, NULL, shminfo,
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
730 xmb_rt->w, xmb_rt->h);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
731 ximage = xmb_rt->ximage;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
732
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
733 mem_sz = ximage->bytes_per_line * ximage->height;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
734 shminfo->shmid = shmget(IPC_PRIVATE, mem_sz, IPC_CREAT | 0777);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
735 if(shminfo->shmid == -1) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
736 xshm_destroy(xmb_rt);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
737 return;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
738 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
739
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
740 shminfo->shmaddr = shmat(shminfo->shmid, 0, 0);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
741 ximage->data = shminfo->shmaddr;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
742
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
743 shminfo->readOnly = 0;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
744
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
745 XShmAttach(display, shminfo);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
746
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
747 switch(depth) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
748 case 24: surf_fmt = CAIRO_FORMAT_RGB24; break;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
749 case 32: surf_fmt = CAIRO_FORMAT_ARGB32; break;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
750 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
751
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
752 xmb_rt->backend_surface =
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
753 mbe_image_surface_create_for_data((unsigned char *)ximage->data,
755
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
754 surf_fmt,
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
755 xmb_rt->w,
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
756 xmb_rt->h,
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
757 ximage->bytes_per_line);
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
758 if(xmb_rt->backend_surface == NULL)
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
759 xshm_destroy(xmb_rt);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
760 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
761 #endif /* XSHM */
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
762
1110
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
763 #include <X11/Xlib.h>
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
764 #include <X11/Xutil.h>
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
765
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
766 static int
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
767 _get_img_fmt_from_xvisual(Display *display, Visual *visual) {
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
768 VisualID visual_id;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
769 XVisualInfo temp;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
770 XVisualInfo *infos;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
771 int n;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
772 int fmt = -1;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
773
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
774 visual_id = XVisualIDFromVisual(visual);
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
775 temp.visualid = visual_id;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
776 infos = XGetVisualInfo(display, VisualIDMask, &temp, &n);
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
777 if(n != 1)
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
778 return -1;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
779
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
780 switch(infos->depth) {
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
781 case 32:
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
782 fmt = MB_IFMT_ARGB32;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
783 break;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
784
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
785 case 24:
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
786 fmt = MB_IFMT_RGB24;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
787 break;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
788
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
789 case 16:
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
790 fmt = MB_IFMT_RGB16_565;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
791 break;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
792
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
793 case 8:
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
794 fmt = MB_IFMT_A8;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
795 break;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
796
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
797 case 1:
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
798 fmt = MB_IFMT_A1;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
799 break;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
800 }
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
801
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
802 return fmt;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
803 }
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
804
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
805 /*! \brief Initialize a MadButterfy runtime for Xlib.
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
806 *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
807 * This one is very like _x_supp_init(), except it accepts a
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
808 * X_supp_runtime_t object initialized with a display connected to a X
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
809 * server and an opened window.
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
810 *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
811 * Following field of the X_supp_runtime_t object should be initialized.
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
812 * - w, h
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
813 * - win
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
814 * - display
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
815 * - visual
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
816 */
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
817 static int
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
818 _x_supp_init_with_win_internal(X_supp_runtime_t *xmb_rt) {
265
b42ee279669e Change function name and add comments.
Thinker K.F. Li <thinker@branda.to>
parents: 260
diff changeset
819 mb_img_ldr_t *img_ldr;
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
820 int w, h;
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
821 int disp_fd;
1110
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
822 int fmt;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
823
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
824 w = xmb_rt->w;
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
825 h = xmb_rt->h;
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
826
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
827 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
828 xshm_init(xmb_rt);
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
829 #endif
1073
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
830
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
831 mbe_init();
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
832
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
833 xmb_rt->surface =
450
a417fd980228 Replace cairo_format_t with mb_img_fmt_t.
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
834 mbe_image_surface_create(MB_IFMT_ARGB32, w, h);
471
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
835
1110
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
836 if(xmb_rt->backend_surface == NULL) { /* xshm_init() may create one */
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
837 fmt = _get_img_fmt_from_xvisual(xmb_rt->display, xmb_rt->visual);
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
838 if(fmt == -1)
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
839 return ERR;
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
840
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
841 xmb_rt->backend_surface =
1073
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
842 mbe_win_surface_create(xmb_rt->display,
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
843 xmb_rt->win,
1110
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
844 fmt,
1073
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
845 w, h);
1110
851a062368bd Change signature of mbe_win_surface_create() by using format argument
Thinker K.F. Li <thinker@codemud.net>
parents: 1079
diff changeset
846 }
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
847
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
848 xmb_rt->cr = mbe_create(xmb_rt->surface);
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
849 xmb_rt->backend_cr = mbe_create(xmb_rt->backend_surface);
1079
c5255cc77143 Remove X_supp_runtime_t::surface_ptn
Thinker K.F. Li <thinker@codemud.net>
parents: 1078
diff changeset
850
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
851 xmb_rt->rdman = (redraw_man_t *)malloc(sizeof(redraw_man_t));
1115
673978a8bc4b Assign width and height of a rdman for X backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1112
diff changeset
852 xmb_rt->rdman->w = w;
673978a8bc4b Assign width and height of a rdman for X backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1112
diff changeset
853 xmb_rt->rdman->h = h;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
854 redraw_man_init(xmb_rt->rdman, xmb_rt->cr, xmb_rt->backend_cr);
1073
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
855 /* FIXME: This is a wired loopback reference. This is inly
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
856 * required when we need to get the xmb_rt->tman for the
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
857 * animation. We should relocate the tman to the
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
858 * redraw_man_t instead.
d09f603438d8 Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents: 1067
diff changeset
859 */
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 224
diff changeset
860 xmb_rt->rdman->rt = xmb_rt;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
861
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
862 xmb_rt->io_man = mb_io_man_new(_io_factory);
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
863 xmb_rt->timer_man = mb_timer_man_new(_timer_factory);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
864
346
b391722bf20e sh_image_t::img_data is managed by paint_image_t.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
865 img_ldr = simple_mb_img_ldr_new("");
265
b42ee279669e Change function name and add comments.
Thinker K.F. Li <thinker@branda.to>
parents: 260
diff changeset
866 xmb_rt->img_ldr = img_ldr;
1005
714169f33f13 Fix X_init_connection() to match modification of mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1004
diff changeset
867 /*! \todo Remove rdman_set_img_ldr() */
714169f33f13 Fix X_init_connection() to match modification of mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1004
diff changeset
868 rdman_set_img_ldr(xmb_rt->rdman, img_ldr); /* this is ncessary? */
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
869
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
870 #ifndef ONLY_MOUSE_MOVE_RAW
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
871 xmb_rt->last = NULL;
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
872 #endif
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
873
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
874 X_kb_init(&xmb_rt->kbinfo, xmb_rt->display, xmb_rt->rdman);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
875
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
876 disp_fd = XConnectionNumber(xmb_rt->display);
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
877 xmb_rt->io_hdl = mb_io_man_reg(xmb_rt->io_man, disp_fd,
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
878 MB_IO_R,
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
879 _x_supp_handle_connection,
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
880 xmb_rt);
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
881
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
882 return OK;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
883 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
884
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
885 /*! \brief Initialize a MadButterfy runtime for Xlib.
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
886 *
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
887 * It setups a runtime environment to run MadButterfly with Xlib.
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
888 * Users should specify width and height of the opening window.
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
889 */
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
890 static int _x_supp_init(X_supp_runtime_t *xmb_rt, const char *display_name,
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
891 int w, int h) {
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
892 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
893
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
894 memset(xmb_rt, 0, sizeof(X_supp_runtime_t));
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
895
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
896 xmb_rt->w = w;
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
897 xmb_rt->h = h;
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
898 r = X_init_connection(display_name, w, h, &xmb_rt->display,
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
899 &xmb_rt->visual, &xmb_rt->win);
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
900 if(r != OK)
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
901 return ERR;
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
902
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
903 r = _x_supp_init_with_win_internal(xmb_rt);
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
904
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
905 return r;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
906 }
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
907
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
908 /*! \brief Initialize a MadButterfly runtime for a window of X.
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
909 *
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
910 * Runtimes initialized with this function should be destroyed with
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
911 * x_supp_destroy_keep_win().
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
912 */
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
913 static int
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
914 _x_supp_init_with_win(X_supp_runtime_t *xmb_rt,
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
915 Display *display, Window win) {
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
916 XWindowAttributes attrs;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
917 int r;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
918
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
919 r = XGetWindowAttributes(display, win, &attrs);
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
920 if(r == 0)
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
921 return ERR;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
922
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
923 memset(xmb_rt, 0, sizeof(X_supp_runtime_t));
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
924
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
925 xmb_rt->display = display;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
926 xmb_rt->win = win;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
927 xmb_rt->visual = attrs.visual;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
928 xmb_rt->w = attrs.width;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
929 xmb_rt->h = attrs.height;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
930
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
931 r = _x_supp_init_with_win_internal(xmb_rt);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
932
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
933 return r;
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
934 }
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
935
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
936 static void x_supp_destroy(X_supp_runtime_t *xmb_rt) {
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
937 if(xmb_rt->rdman) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
938 redraw_man_destroy(xmb_rt->rdman);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
939 free(xmb_rt->rdman);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
940 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
941
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
942 if(xmb_rt->io_hdl)
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
943 mb_io_man_unreg(xmb_rt->io_man, xmb_rt->io_hdl);
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
944
1007
4d724f248365 Free IO manager and timer manager when free a X supp runtime
Thinker K.F. Li <thinker@codemud.net>
parents: 1006
diff changeset
945 if(xmb_rt->io_man)
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
946 mb_io_man_free(_io_factory, xmb_rt->io_man);
1007
4d724f248365 Free IO manager and timer manager when free a X supp runtime
Thinker K.F. Li <thinker@codemud.net>
parents: 1006
diff changeset
947 if(xmb_rt->timer_man)
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
948 mb_timer_man_free(_timer_factory, xmb_rt->timer_man);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
949
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
950 if(xmb_rt->img_ldr)
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
951 MB_IMG_LDR_FREE(xmb_rt->img_ldr);
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
952
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
953 if(xmb_rt->cr)
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
954 mbe_destroy(xmb_rt->cr);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
955 if(xmb_rt->backend_cr)
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
956 mbe_destroy(xmb_rt->backend_cr);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
957
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
958 if(xmb_rt->surface)
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
959 mbe_surface_destroy(xmb_rt->surface);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
960 if(xmb_rt->backend_surface)
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
961 mbe_surface_destroy(xmb_rt->backend_surface);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
962
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
963 if(xmb_rt->display)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
964 XCloseDisplay(xmb_rt->display);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
965
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
966 X_kb_destroy(&xmb_rt->kbinfo);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
967 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
968
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
969 /*! \brief Destroy a MadButterfly runtime initialized with
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
970 * _x_supp_init_with_win().
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
971 *
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
972 * Destroying a runtime with this function prevent the window and
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
973 * display associated with the runtime being closed.
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
974 */
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
975 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
976 x_supp_destroy_keep_win(X_supp_runtime_t *xmb_rt) {
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
977 Display *display;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
978 Window win;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
979
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
980 display = xmb_rt->display;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
981 xmb_rt->display = NULL;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
982 win = xmb_rt->win;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
983 xmb_rt->win = 0;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
984
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
985 x_supp_destroy(xmb_rt);
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
986
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
987 xmb_rt->display = display;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
988 xmb_rt->win = win;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
989 }
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
990
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
991 static mb_rt_t *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
992 _x_supp_new(const char *display_name, int w, int h) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
993 X_supp_runtime_t *rt;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
994 int r;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
995
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
996 rt = O_ALLOC(X_supp_runtime_t);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
997 if(rt == NULL)
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
998 return NULL;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
999
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1000 r = _x_supp_init(rt, display_name, w, h);
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1001 if(r != OK) {
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1002 free(rt);
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1003 return NULL;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1004 }
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1005
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
1006 return (mb_rt_t *)rt;
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1007 }
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1008
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1009 /*! \brief Create a new runtime for existed window for X.
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1010 *
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1011 * The object returned by this function must be free with
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1012 * _x_supp_free_keep_win() to prevent the window from closed.
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1013 */
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1014 static mb_rt_t *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1015 _x_supp_new_with_win(MB_DISPLAY display, MB_WINDOW win) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1016 X_supp_runtime_t *rt;
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1017 int r;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1018
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1019 rt = O_ALLOC(X_supp_runtime_t);
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1020 if(rt == NULL)
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1021 return NULL;
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1022
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1023 r = _x_supp_init_with_win(rt, display, win);
528
d687d3395264 Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents: 471
diff changeset
1024 if(r != OK) {
d687d3395264 Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents: 471
diff changeset
1025 free(rt);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1026 return NULL;
528
d687d3395264 Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents: 471
diff changeset
1027 }
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1028
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
1029 return (mb_rt_t *)rt;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1030 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1031
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1032 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1033 _x_supp_free(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1034 x_supp_destroy((X_supp_runtime_t *) rt);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1035 free(rt);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1036 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1037
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1038 /*! \brief Free runtime created with _x_supp_new_with_win().
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1039 */
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1040 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1041 _x_supp_free_keep_win(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1042 x_supp_destroy_keep_win((X_supp_runtime_t *) rt);
870
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1043 free(rt);
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1044 }
512204bcafba Export the function to create a runtime for an existed window for X.
Thinker K.F. Li <thinker@codemud.net>
parents: 869
diff changeset
1045
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1046 static subject_t *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1047 _x_supp_kbevents(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1048 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1049 return xmb_rt->kbinfo.kbevents;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1050 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1051
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1052 static redraw_man_t *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1053 _x_supp_rdman(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1054 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1055 return xmb_rt->rdman;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1056 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1057
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1058 static mb_timer_man_t *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1059 _x_supp_timer_man(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1060 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
1008
789f67288e1c Rename X_MB_tman() to X_MB_timer_man()
Thinker K.F. Li <thinker@codemud.net>
parents: 1007
diff changeset
1061 return xmb_rt->timer_man;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
1062 }
131
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
1063
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
1064 static observer_factory_t *
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
1065 _x_supp_observer_factory(mb_rt_t *rt) {
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1066 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
1067 observer_factory_t *factory;
131
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
1068
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
1069 factory = rdman_get_observer_factory(xmb_rt->rdman);
131
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
1070 return factory;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
1071 }
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
1072
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1073 static mb_img_ldr_t *
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1074 _x_supp_img_ldr(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1075 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
692
201cc86720a3 Fix compiling time warning about cairo xlib
Thinker K.F. Li <thinker@branda.to>
parents: 691
diff changeset
1076 mb_img_ldr_t *img_ldr;
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
1077
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
1078 img_ldr = xmb_rt->img_ldr;
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
1079
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
1080 return img_ldr;
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
1081 }
462
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1082
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1083 static int
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1084 _x_supp_add_event(mb_rt_t *rt, int fd, MB_IO_TYPE type,
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1085 mb_IO_cb_t cb, void *data)
462
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1086 {
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1087 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
1009
595a06fc0157 Change X_MB_add/remove_event() to match new mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1008
diff changeset
1088 mb_IO_man_t *io_man = xmb_rt->io_man;
595a06fc0157 Change X_MB_add/remove_event() to match new mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1008
diff changeset
1089 int hdl;
462
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1090
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
1091 hdl = mb_io_man_reg(io_man, fd, type, cb, data);
1009
595a06fc0157 Change X_MB_add/remove_event() to match new mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1008
diff changeset
1092 return hdl;
462
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1093 }
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1094
1011
02d52058d352 Make functions of X_supp.c static and fill fields of backend.
Thinker K.F. Li <thinker@codemud.net>
parents: 1010
diff changeset
1095 static void
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1096 _x_supp_remove_event(mb_rt_t *rt, int hdl)
462
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1097 {
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1098 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
1009
595a06fc0157 Change X_MB_add/remove_event() to match new mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1008
diff changeset
1099 mb_IO_man_t *io_man = xmb_rt->io_man;
595a06fc0157 Change X_MB_add/remove_event() to match new mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1008
diff changeset
1100
1034
e9a134d75c99 To make backend compatible with C++
Thinker K.F. Li <thinker@codemud.net>
parents: 1026
diff changeset
1101 mb_io_man_unreg(io_man, hdl);
462
af4b506ad56f Add backend layer to seperate the backend with the MBAF. Currently, X is the only backend. If we have more than one backend, we need to modify the Makefile to sleect the backend or implement a backend selection mechanism in the runtime.
wycc@122-116-38-188.HINET-IP.hinet.net
parents: 451
diff changeset
1102 }
1009
595a06fc0157 Change X_MB_add/remove_event() to match new mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1008
diff changeset
1103
1013
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1104 static int
1016
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1105 _x_supp_flush(mb_rt_t *rt) {
7b503c7ed46f Change naming convention from X_MB to X_supp or x_supp
Thinker K.F. Li <thinker@codemud.net>
parents: 1015
diff changeset
1106 X_supp_runtime_t *xmb_rt = (X_supp_runtime_t *) rt;
1013
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1107 int r;
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1108
1014
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
1109 #ifdef XSHM
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
1110 XSHM_update(xmb_rt);
f7bf372a85a3 Register _x_mb_handle_connection() with IO manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1013
diff changeset
1111 #endif
1013
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1112 r = XFlush(xmb_rt->display);
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1113 return r == 0? ERR: OK;
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1114 }
d5b8853767e7 Add flush function to mb_backend_t
Thinker K.F. Li <thinker@codemud.net>
parents: 1012
diff changeset
1115
1043
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1116 static void
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1117 _x_supp_reg_IO_factory(mb_IO_factory_t *io_factory) {
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1118 _io_factory = io_factory;
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1119 }
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1120
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1121 static void
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1122 _x_supp_reg_timer_factory(mb_timer_factory_t *timer_factory) {
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1123 _timer_factory = timer_factory;
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1124 }
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1125
1022
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1126 mb_backend_t mb_dfl_backend = { _x_supp_new,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1127 _x_supp_new_with_win,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1128
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1129 _x_supp_free,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1130 _x_supp_free_keep_win,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1131 _x_supp_add_event,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1132 _x_supp_remove_event,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1133 _x_supp_event_loop,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1134 _x_supp_flush,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1135
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1136 _x_supp_kbevents,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1137 _x_supp_rdman,
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1138 _x_supp_timer_man,
1060
e415c55b4a0d Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents: 1049
diff changeset
1139 _x_supp_observer_factory,
1043
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1140 _x_supp_img_ldr,
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1141
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1142 _x_supp_reg_IO_factory,
769921baf111 Add missed functions: _x_supp_reg_IO_factory and _x_supp_reg_timer_factory
Thinker K.F. Li <thinker@codemud.net>
parents: 1034
diff changeset
1143 _x_supp_reg_timer_factory,
1022
84006acab6af Use macros to hide the default backend
Thinker K.F. Li <thinker@codemud.net>
parents: 1018
diff changeset
1144 };