annotate src/X_supp.c @ 935:960e2395973d

Fix the bug of crash by abort() when running testsvg.js. The cached coords their pcache areas should be recomputed are also add ro zeroing list. They have no dirty areas. But, their pcache area must be added to parent cached coord.
author Thinker K.F. Li <thinker@codemud.net>
date Fri, 12 Nov 2010 16:03:19 +0800
parents 512204bcafba
children 3fe8054457a8
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>
692
201cc86720a3 Fix compiling time warning about cairo xlib
Thinker K.F. Li <thinker@branda.to>
parents: 691
diff changeset
8 #include <cairo-xlib.h>
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
9 #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
10 #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
11 #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
12 #include "mb_X_supp.h"
694
7e64e0f70cb6 Switch XSHM with autoconf
Thinker K.F. Li <thinker@branda.to>
parents: 693
diff changeset
13 #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
14
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
15 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
16 /* \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
17 #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
18 #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
19 #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
20 #endif
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
21
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
22 #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
23 #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
24
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
25 #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
26
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
27 /*! \ingroup xkb
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
28 * @{
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
29 */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
30 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
31 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
32 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
33 KeySym *syms;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
34 subject_t *kbevents;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
35 ob_factory_t *ob_factory;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
36 };
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
37
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
38 /* @} */
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
39 #define MAX_MONITORS 200
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
40 typedef struct {
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
41 int type;
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
42 int fd;
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
43 mb_eventcb_t f;
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
44 void *arg;
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
45 } monitor_t;
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
46
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
47 struct _X_MB_runtime {
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
48 Display *display;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
49 Window win;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
50 Visual *visual;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
51 mbe_surface_t *surface, *backend_surface;
471
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
52 mbe_pattern_t *surface_ptn;
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
53 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
54 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
55 mb_tman_t *tman;
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
56 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
57 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
58
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
59 X_kb_info_t kbinfo;
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
60 monitor_t monitors[MAX_MONITORS];
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
61 int n_monitor;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
62
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
63 #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
64 /* States */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
65 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
66 #endif
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
67
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
68 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
69 XImage *ximage;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
70 XShmSegmentInfo shminfo;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
71 #endif
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
72
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 };
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
83
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
84 #ifdef XSHM
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
85 static void
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
86 XSHM_update(X_MB_runtime_t *xmb_rt) {
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
87 GC gc;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
88
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
89 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
90 if(xmb_rt->ximage) { /* support XSHM */
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
91 XShmPutImage(xmb_rt->display,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
92 xmb_rt->win,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
93 gc,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
94 xmb_rt->ximage,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
95 0, 0, 0, 0,
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
96 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
97 }
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
98 }
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
99 #endif
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
100
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
101 /*! \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
102 *
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
103 * 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
104 * 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
105 * 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
106 * @{
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
107 */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
108 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
109 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
110 int sym;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
111
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
112 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
113 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
114 return sym;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
115 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
116
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
117 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
118 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
119 int n_syms;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
120 ob_factory_t *factory;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
121 int r;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
123 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
124 &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
125 &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
126 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
127 return ERR;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
128
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
129 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
130 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
131 n_syms,
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
132 &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
133 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
134 return ERR;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
135
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
136 factory = rdman_get_ob_factory(rdman);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
137 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
138 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
139 return ERR;
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 186
diff changeset
140 /*! \todo Make sure ob_factory is still need. */
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
141 kbinfo->ob_factory = factory;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
142
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
143 return OK;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
144 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
145
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
146 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
147 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
148 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
149 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
150
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
151 /*! \brief Accept X keyboard events from handle_x_event() and dispatch it.
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
152 */
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
153 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
154 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
155 int sym;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
156 X_kb_event_t event;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
157
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
158 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
159 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
160 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
161 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
162 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
163 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
164 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
165 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
166 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
167
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 186
diff changeset
168 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
169 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
170
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
171 /* @} */
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
172
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
173 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
174 unsigned int but = 0;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
175
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
176 if(state & Button1Mask)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
177 but |= MOUSE_BUT1;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
178 if(state & Button2Mask)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
179 but |= MOUSE_BUT2;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
180 if(state & Button3Mask)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
181 but |= MOUSE_BUT3;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
182
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
183 return but;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
184 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
185
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
186 static unsigned int get_button(unsigned int button) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
187 switch(button) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
188 case Button1:
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
189 return MOUSE_BUT1;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
190 case Button2:
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
191 return MOUSE_BUT2;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
192 case Button3:
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
193 return MOUSE_BUT3;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
194 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
195 return 0;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
196 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
197
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
198 /*! \brief Notify observers of the shape at specified
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
199 * position for mouse event.
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
200 *
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
201 * 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
202 * 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
203 * 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
204 */
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
205 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
206 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
207 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
208 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
209 unsigned int button) {
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
210 mouse_event_t mouse_event;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
211 subject_t *subject;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
212
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
213 mouse_event.event.type = etype;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
214 mouse_event.x = x;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
215 mouse_event.y = y;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
216 mouse_event.but_state = state;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
217 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
218
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
219 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
220 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
221 else
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
222 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
223
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 186
diff changeset
224 subject_notify(subject, (event_t *)&mouse_event);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
225 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
226
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
227 /*! \brief Handle motion event.
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
228 */
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
229 static void
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
230 handle_motion_event(X_MB_runtime_t *rt) {
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
231 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
232 int x, y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
233 int state;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
234 shape_t *shape;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
235 coord_t *root;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
236 int in_stroke;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
237
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
238 x = rt->mx;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
239 y = rt->my;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
240 state = rt->mbut_state;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
241
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
242 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
243 &in_stroke);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
244 #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
245 if(shape != NULL) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
246 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
247 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
248 } else {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
249 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
250 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
251 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
252 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
253 #else
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
254 if(shape != NULL) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
255 if(rt->last != shape) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
256 if(rt->last)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
257 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
258 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
259 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
260 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
261 rt->last = shape;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
262 } else
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
263 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
264 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
265 } else {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
266 if(rt->last) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
267 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
268 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
269 rt->last = NULL;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
270 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
271 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
272 #endif
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
273
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
274 rt->mflag = 0;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
275 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
276
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
277 /*! \brief Redraw exposed area.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
278 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
279 static void
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
280 handle_expose_event(X_MB_runtime_t *rt) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
281 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
282 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
283
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
284 ex1 = rt->ex1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
285 ey1 = rt->ey1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
286 ex2 = rt->ex2;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
287 ey2 = rt->ey2;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
288
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
289 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
290
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
291 rt->eflag = 0;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
292 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
293
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
294 /*! \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
295 *
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
296 * 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
297 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
298 static void
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
299 handle_single_x_event(X_MB_runtime_t *rt, XEvent *evt) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
300 redraw_man_t *rdman = rt->rdman;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
301 XMotionEvent *mevt;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
302 XButtonEvent *bevt;
81
13fdf205047b Hide shapes and groups
Thinker K.F. Li <thinker@branda.to>
parents: 78
diff changeset
303 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
304 XKeyEvent *xkey;
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
305 int x, y, w, h;
81
13fdf205047b Hide shapes and groups
Thinker K.F. Li <thinker@branda.to>
parents: 78
diff changeset
306
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
307 shape_t *shape;
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
308
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
309 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
310 int in_stroke;
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
311
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
312 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
313 handle_motion_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
314
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
315 switch(evt->type) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
316 case ButtonPress:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
317 bevt = (XButtonEvent *)evt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
318 x = bevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
319 y = bevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
320 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
321 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
322
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
323 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
324 &in_stroke);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
325 if(shape)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
326 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
327 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
328 state, button);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
329 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
330
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
331 case ButtonRelease:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
332 bevt = (XButtonEvent *)evt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
333 x = bevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
334 y = bevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
335 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
336 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
337
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
338 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
339 &in_stroke);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
340 if(shape)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
341 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
342 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
343 state, button);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
344 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
345
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
346 case MotionNotify:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
347 mevt = (XMotionEvent *)evt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
348 rt->mx = mevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
349 rt->my = mevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
350 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
351 rt->mflag = 1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
352 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
353
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
354 case KeyPress:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
355 case KeyRelease:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
356 xkey = &evt->xkey;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
357 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
358 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
359
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
360 case Expose:
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
361 eevt = &evt->xexpose;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
362 x = eevt->x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
363 y = eevt->y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
364 w = eevt->width;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
365 h = eevt->height;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
366
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
367 if(rt->eflag) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
368 if(x < rt->ex1)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
369 rt->ex1 = x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
370 if(y < rt->ey1)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
371 rt->ey1 = y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
372 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
373 rt->ex2 = x + w;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
374 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
375 rt->ey2 = y + h;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
376 } else {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
377 rt->ex1 = x;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
378 rt->ey1 = y;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
379 rt->ex2 = x + w;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
380 rt->ey2 = y + h;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
381 rt->eflag = 1;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
382 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
383 break;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
384 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
385 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
386
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
387 /*! \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
388 *
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
389 * 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
390 * 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
391 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
392 static void
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
393 no_more_event(X_MB_runtime_t *rt) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
394 if(rt->mflag)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
395 handle_motion_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
396 if(rt->eflag)
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
397 handle_expose_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
398 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
399
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
400 /*! \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
401 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
402 static void handle_x_event(X_MB_runtime_t *rt) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
403 Display *display = rt->display;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
404 XEvent evt;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
405 int r;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
406
529
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
407 /* 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
408 * called XEventsQueued() after receiving first Expose event
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
409 * and before redraw for the event.
0160cdabaa51 Add a known issue.
Thinker K.F. Li <thinker@branda.to>
parents: 528
diff changeset
410 */
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
411 while(XEventsQueued(display, QueuedAfterReading) > 0) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
412 r = XNextEvent(display, &evt);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
413 if(r == -1)
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
414 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
415
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
416 handle_single_x_event(rt, &evt);
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
417 }
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
418 no_more_event(rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
419
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
420 #ifdef XSHM
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
421 XSHM_update(rt);
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
422 #endif
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
423 XFlush(display);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
424 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
425
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
426 /*! \brief Handle connection coming data and timeout of timers.
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
427 *
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
428 * \param display is a Display returned by XOpenDisplay().
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
429 * \param rdman is a redraw manager.
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
430 * \param tman is a timer manager.
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
431 *
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
432 * The display is managed by specified rdman and tman. rdman draws
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
433 * on the display, and tman trigger actions according timers.
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
434 */
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
435 void X_MB_handle_connection(void *be) {
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
436 X_MB_runtime_t *rt = (X_MB_runtime_t *) be;
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
437 Display *display = rt->display;
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
438 redraw_man_t *rdman = rt->rdman;
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
439 mb_tman_t *tman = rt->tman;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
440 int fd;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
441 mb_timeval_t now, tmo;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
442 struct timeval tv;
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
443 fd_set rfds,wfds;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
444 int nfds;
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
445 int r, r1,i;
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
446
142
3efe77007127 Do not redraw all at begining, waiting for explosure.
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
447 handle_x_event(rt);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
448
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
449 fd = XConnectionNumber(display);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
450 nfds = fd + 1;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
451 while(1) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
452 FD_ZERO(&rfds);
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
453 FD_ZERO(&wfds);
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
454 FD_SET(fd, &rfds);
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
455 for(i=0;i<rt->n_monitor;i++) {
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
456 if (rt->monitors[i].type == MONITOR_READ)
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
457 FD_SET(rt->monitors[i].fd, &rfds);
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
458 else if (rt->monitors[i].type == MONITOR_WRITE)
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
459 FD_SET(rt->monitors[i].fd, &wfds);
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
460 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
461
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
462 get_now(&now);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
463 r = mb_tman_next_timeout(tman, &now, &tmo);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
464
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
465 if(r == 0) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
466 tv.tv_sec = MB_TIMEVAL_SEC(&tmo);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
467 tv.tv_usec = MB_TIMEVAL_USEC(&tmo);
120
5df7403b6fbc Fix bug of get_now()
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
468 r1 = select(nfds, &rfds, NULL, NULL, &tv);
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
469 } else
120
5df7403b6fbc Fix bug of get_now()
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
470 r1 = select(nfds, &rfds, NULL, NULL, NULL);
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
471
120
5df7403b6fbc Fix bug of get_now()
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
472 if(r1 == -1) {
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
473 perror("select");
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
474 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
475 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
476
120
5df7403b6fbc Fix bug of get_now()
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
477 if(r1 == 0) {
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
478 get_now(&now);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
479 mb_tman_handle_timeout(tman, &now);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
480 rdman_redraw_changed(rdman);
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
481 #ifdef XSHM
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
482 XSHM_update(rt);
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
483 #endif
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
484 XFlush(display);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
485 } else if(FD_ISSET(fd, &rfds)){
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
486 handle_x_event(rt);
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
487 } else {
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
488 for(i=0;i<rt->n_monitor;i++) {
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
489 if (rt->monitors[i].type == MONITOR_READ) {
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
490 if (FD_ISSET(rt->monitors[i].fd, &rfds))
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
491 rt->monitors[i].f(rt->monitors[i].fd,rt->monitors[i].arg);
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
492 } else if (rt->monitors[i].type == MONITOR_WRITE) {
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
493 if (FD_ISSET(rt->monitors[i].fd, &wfds))
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
494 rt->monitors[i].f(rt->monitors[i].fd,rt->monitors[i].arg);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
495 }
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
496 }
77
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
497 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
498 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
499 }
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
500
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
501 #define ERR -1
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
502 #define OK 0
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
503
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
504 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
505 int w, int h,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
506 Display **displayp,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
507 Visual **visualp,
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
508 Window *winp) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
509 Display *display;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
510 Window root, win;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
511 Visual *visual;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
512 int screen;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
513 XSetWindowAttributes wattr;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
514 int depth;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
515 int x, y;
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
516 int draw_root = 0;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
517 const char *disp_name;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
518 char disp_buf[32];
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
519 int cp;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
520 int r;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
521
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
522 /*
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
523 * 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
524 */
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
525 disp_name = display_name;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
526 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
527 draw_root = 1;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
528 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
529 if(cp >= 32)
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
530 cp = 31;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
531 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
532 disp_buf[cp] = 0;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
533 disp_name = disp_buf;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
534 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
535
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
536 display = XOpenDisplay(disp_name);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
537 if(display == NULL)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
538 return ERR;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
539
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
540 screen = DefaultScreen(display);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
541 root = DefaultRootWindow(display);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
542 visual = DefaultVisual(display, screen);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
543 depth = DefaultDepth(display, screen);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
544 wattr.override_redirect = False;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
545 x = 10;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
546 y = 10;
756
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
547 if(draw_root)
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
548 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
549 else {
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
550 win = XCreateWindow(display, root,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
551 x, y,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
552 w, h,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
553 1, depth, InputOutput, visual,
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
554 CWOverrideRedirect, &wattr);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
555 r = XMapWindow(display, win);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
556 if(r == -1) {
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
557 XCloseDisplay(display);
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
558 return ERR;
cceac4ba259e Support drawing at root window for X Window
Thinker K.F. Li <thinker@codemud.net>
parents: 755
diff changeset
559 }
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
560 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
561
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
562 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
563 ButtonPressMask | ButtonReleaseMask |
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
564 KeyPressMask | KeyReleaseMask);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
565 XFlush(display);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
566
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
567 *displayp = display;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
568 *visualp = visual;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
569 *winp = win;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
570
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
571 return OK;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
572 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
573
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
574 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
575 static void
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
576 xshm_destroy(X_MB_runtime_t *xmb_rt) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
577 XShmSegmentInfo *shminfo;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
578
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
579 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
580
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
581 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
582 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
583 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
584
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
585 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
586 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
587 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
588 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
589
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
590 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
591 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
592 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
593 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
594
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
595 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
596 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
597 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
598 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
599 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
600
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
601 static void
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
602 xshm_init(X_MB_runtime_t *xmb_rt) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
603 Display *display;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
604 Visual *visual;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
605 XImage *ximage;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
606 int screen;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
607 int depth;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
608 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
609 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
610 XShmSegmentInfo *shminfo;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
611 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
612
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
613 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
614 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
615 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
616
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
617 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
618 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
619 return;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
620
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
621 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
622 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
623
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
624 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
625 return;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
626
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
627 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
628 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
629 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
630 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
631
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
632 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
633 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
634 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
635 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
636 return;
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
637 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
638
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
639 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
640 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
641
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
642 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
643
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
644 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
645
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
646 switch(depth) {
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
647 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
648 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
649 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
650
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
651 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
652 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
653 surf_fmt,
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
654 xmb_rt->w,
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
655 xmb_rt->h,
82836f1290b6 Remove cairo_* and use mbe_*
Thinker K.F. Li <thinker@codemud.net>
parents: 694
diff changeset
656 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
657 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
658 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
659 }
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
660 #endif /* XSHM */
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
661
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
662 /*! \brief Initialize a MadButterfy runtime for Xlib.
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
663 *
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
664 * This one is very like X_MB_init(), except it accepts a
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
665 * X_MB_runtime_t object initialized with a display connected to a X
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
666 * 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
667 *
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
668 * Following field of the X_MB_runtime_t object should be initialized.
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
669 * - 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
670 * - win
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
671 * - display
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
672 * - visual
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
673 */
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
674 static int
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
675 X_MB_init_with_win_internal(X_MB_runtime_t *xmb_rt) {
265
b42ee279669e Change function name and add comments.
Thinker K.F. Li <thinker@branda.to>
parents: 260
diff changeset
676 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
677 int w, h;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
678
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
679 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
680 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
681
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
682 #ifdef XSHM
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
683 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
684 #endif
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
685
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
686 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
687 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
688
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
689 xmb_rt->surface_ptn =
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
690 mbe_pattern_create_for_surface(xmb_rt->surface);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
691
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
692 if(xmb_rt->backend_surface == NULL) /* xshm_init() may create one */
691
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
693 xmb_rt->backend_surface =
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
694 mbe_xlib_surface_create(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
695 xmb_rt->win,
05a453e07d01 X_supp.c uses XSHM to avoid overhead of transmission
Thinker K.F. Li <thinker@branda.to>
parents: 556
diff changeset
696 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
697 w, h);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
698
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 350
diff changeset
699 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
700 xmb_rt->backend_cr = mbe_create(xmb_rt->backend_surface);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
701
471
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
702 mbe_set_source(xmb_rt->backend_cr, xmb_rt->surface_ptn);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
703
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
704 xmb_rt->rdman = (redraw_man_t *)malloc(sizeof(redraw_man_t));
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
705 redraw_man_init(xmb_rt->rdman, xmb_rt->cr, xmb_rt->backend_cr);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
706 // FIXME: This is a wired loopback reference. This is inly required when we need
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
707 // to get the xmb_rt->tman for the animation. We should relocate the tman
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
708 // to the redraw_man_t instead.
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
709 xmb_rt->rdman->rt = xmb_rt;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
710
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
711 xmb_rt->tman = mb_tman_new();
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
712
346
b391722bf20e sh_image_t::img_data is managed by paint_image_t.
Thinker K.F. Li <thinker@branda.to>
parents: 270
diff changeset
713 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
714 xmb_rt->img_ldr = img_ldr;
b42ee279669e Change function name and add comments.
Thinker K.F. Li <thinker@branda.to>
parents: 260
diff changeset
715 rdman_set_img_ldr(xmb_rt->rdman, img_ldr);
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
716 memset(xmb_rt->monitors,0,sizeof(xmb_rt->monitors));
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
717
224
29e1b2bffe4c X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
718 #ifndef ONLY_MOUSE_MOVE_RAW
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
719 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
720 #endif
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 82
diff changeset
721
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
722 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
723
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
724 return OK;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
725 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
726
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
727 /*! \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
728 *
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
729 * 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
730 * 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
731 */
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
732 static int X_MB_init(X_MB_runtime_t *xmb_rt, const char *display_name,
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
733 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
734 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
735
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
736 memset(xmb_rt, 0, sizeof(X_MB_runtime_t));
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
737
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
738 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
739 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
740 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
741 &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
742 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
743 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
744
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
745 r = X_MB_init_with_win_internal(xmb_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
746
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
747 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
748 }
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
749
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
750 /*! \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
751 *
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
752 * Runtimes initialized with this function should be destroyed with
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
753 * X_MB_destroy_keep_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
754 */
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
755 static int
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
756 X_MB_init_with_win(X_MB_runtime_t *xmb_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
757 Display *display, 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
758 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
759 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
760
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
761 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
762 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
763 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
764
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
765 memset(xmb_rt, 0, sizeof(X_MB_runtime_t));
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
766
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
767 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
768 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
769 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
770 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
771 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
772
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
773 r = X_MB_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
774
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
775 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
776 }
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 756
diff changeset
777
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
778 static void X_MB_destroy(X_MB_runtime_t *xmb_rt) {
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
779 if(xmb_rt->rdman) {
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
780 redraw_man_destroy(xmb_rt->rdman);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
781 free(xmb_rt->rdman);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
782 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
783
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
784 if(xmb_rt->tman)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
785 mb_tman_free(xmb_rt->tman);
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
786
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
787 if(xmb_rt->img_ldr)
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
788 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
789
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
790 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
791 mbe_destroy(xmb_rt->cr);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
792 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
793 mbe_destroy(xmb_rt->backend_cr);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
794
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
795 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
796 mbe_surface_destroy(xmb_rt->surface);
471
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
797 if(xmb_rt->surface_ptn)
e98ae1407ca2 Remove mbe_set_source_surface() from graphic engine.
Thinker K.F. Li <thinker@branda.to>
parents: 462
diff changeset
798 mbe_pattern_destroy(xmb_rt->surface_ptn);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
799 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
800 mbe_surface_destroy(xmb_rt->backend_surface);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
801
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
802 if(xmb_rt->display)
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
803 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
804
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
805 X_kb_destroy(&xmb_rt->kbinfo);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
806 }
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents: 77
diff changeset
807
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
808 /*! \brief Destroy a MadButterfly runtime initialized with
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
809 * X_MB_init_with_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
810 *
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
811 * 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
812 * 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
813 */
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
814 static void
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
815 X_MB_destroy_keep_win(X_MB_runtime_t *xmb_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
816 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
817 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
818
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
819 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
820 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
821 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
822 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
823
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
824 X_MB_destroy(xmb_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
825
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
826 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
827 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
828 }
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
829
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
830 void *X_MB_new(const char *display_name, int w, int h) {
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
831 X_MB_runtime_t *rt;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
832 int r;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
833
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
834 rt = O_ALLOC(X_MB_runtime_t);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
835 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
836 return NULL;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
837
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
838 r = X_MB_init(rt, display_name, w, h);
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
839 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
840 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
841 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
842 }
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
843
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
844 return 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
845 }
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
846
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
847 /*! \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
848 *
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
849 * The object returned by this function must be free with
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
850 * X_MB_free_keep_win() to prevent the window from 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
851 */
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
852 void *X_MB_new_with_win(Display *display, 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
853 X_MB_runtime_t *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
854 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
855
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
856 rt = O_ALLOC(X_MB_runtime_t);
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
857 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
858 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
859
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
860 r = X_MB_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
861 if(r != OK) {
d687d3395264 Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents: 471
diff changeset
862 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
863 return NULL;
528
d687d3395264 Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents: 471
diff changeset
864 }
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
865
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
866 return rt;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
867 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
868
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
869 void X_MB_free(void *rt) {
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
870 X_MB_destroy((X_MB_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
871 free(rt);
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
872 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
873
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
874 /*! \brief Free runtime created with X_MB_new_with_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
875 */
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
876 void
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
877 X_MB_free_keep_win(void *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
878 X_MB_destroy_keep_win((X_MB_runtime_t *) 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
879 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
880 }
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
881
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
882 subject_t *X_MB_kbevents(void *rt) {
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
883 X_MB_runtime_t *xmb_rt = (X_MB_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
884 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
885 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
886
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
887 redraw_man_t *X_MB_rdman(void *rt) {
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
888 X_MB_runtime_t *xmb_rt = (X_MB_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
889 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
890 }
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
891
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
892 mb_tman_t *X_MB_tman(void *rt) {
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
893 X_MB_runtime_t *xmb_rt = (X_MB_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
894 return xmb_rt->tman;
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
895 }
131
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
896
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
897 ob_factory_t *X_MB_ob_factory(void *rt) {
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
898 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *) rt;
131
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
899 ob_factory_t *factory;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
900
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
901 factory = rdman_get_ob_factory(xmb_rt->rdman);
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
902 return factory;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
903 }
259
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
904
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
905 mb_img_ldr_t *X_MB_img_ldr(void *rt) {
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
906 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *) rt;
692
201cc86720a3 Fix compiling time warning about cairo xlib
Thinker K.F. Li <thinker@branda.to>
parents: 691
diff changeset
907 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
908
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
909 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
910
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
911 return img_ldr;
e8a784a306d0 Initialize an image loader for X runtime
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
912 }
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
913
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
914 void X_MB_add_event(void *rt, int type, int fd, mb_eventcb_t f,void *arg)
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
915 {
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
916 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *) rt;
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
917 int i;
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
918
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
919 for(i=0;i<xmb_rt->n_monitor;i++) {
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
920 if (xmb_rt->monitors[i].type == type && xmb_rt->monitors[i].fd == fd) {
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
921 xmb_rt->monitors[i].f = f;
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
922 xmb_rt->monitors[i].arg = arg;
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
923 return;
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
924 }
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
925 }
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
926 for(i=0;i<xmb_rt->n_monitor;i++) {
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
927 if (xmb_rt->monitors[i].type == 0) {
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
928 xmb_rt->monitors[i].type = type;
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
929 xmb_rt->monitors[i].fd = fd;
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
930 xmb_rt->monitors[i].f = f;
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
931 xmb_rt->monitors[i].arg = arg;
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
932 return;
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
933 }
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
934 }
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
935 if (i == MAX_MONITORS) return;
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
936 xmb_rt->monitors[i].type = type;
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
937 xmb_rt->monitors[i].fd = fd;
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
938 xmb_rt->monitors[i].f = f;
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
939 xmb_rt->monitors[i].arg = arg;
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
940 i++;
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
941 xmb_rt->n_monitor=i;
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
942 }
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
943
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
944 void X_MB_remove_event(void *rt, int type, int fd)
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
945 {
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
946 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *) rt;
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
947 int i;
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
948 for(i=0;i<xmb_rt->n_monitor;i++) {
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
949 if (xmb_rt->monitors[i].type == type && xmb_rt->monitors[i].fd == fd) {
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
950 xmb_rt->monitors[i].type = 0;
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
951 return;
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
952 }
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
953 }
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
954 }
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
955 mb_backend_t backend = { X_MB_new,
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
956 X_MB_free,
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
957 X_MB_add_event,
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
958 X_MB_remove_event,
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
959 X_MB_handle_connection,
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
960 X_MB_kbevents,
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
961 X_MB_rdman,
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
962 X_MB_tman,
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
963 X_MB_ob_factory,
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
964 X_MB_img_ldr
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
965 };
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
966 /*! \defgroup x_supp_nodejs_sup Export functions for supporting nodejs plugin.
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
967 *
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
968 * These functions are for internal using.
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
969 * @{
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 757
diff changeset
970 */
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
971 /*! \brief Exported for nodejs plugin to call handle_x_event.
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
972 */
550
127499ab2412 Upgrade ndoejs plugin to level of a new runtime.
Thinker K.F. Li <thinker@branda.to>
parents: 545
diff changeset
973 void _X_MB_handle_x_event_for_nodejs(void *rt) {
127499ab2412 Upgrade ndoejs plugin to level of a new runtime.
Thinker K.F. Li <thinker@branda.to>
parents: 545
diff changeset
974 handle_x_event((X_MB_runtime_t *)rt);
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
975 }
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
976
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
977 /*! \brief Get X connect for nodejs plugin.
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
978 */
550
127499ab2412 Upgrade ndoejs plugin to level of a new runtime.
Thinker K.F. Li <thinker@branda.to>
parents: 545
diff changeset
979 int _X_MB_get_x_conn_for_nodejs(void *rt) {
127499ab2412 Upgrade ndoejs plugin to level of a new runtime.
Thinker K.F. Li <thinker@branda.to>
parents: 545
diff changeset
980 return XConnectionNumber(((X_MB_runtime_t *)rt)->display);
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
981 }
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
982
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
983 /*! \brief Flush buffer for the X connection of a runtime object.
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
984 */
556
c9d23f7279a4 The first testcase that nodejs code can show a MadButterfly window.
Thinker K.F. Li <thinker@branda.to>
parents: 550
diff changeset
985 int _X_MB_flush_x_conn_for_nodejs(void *rt) {
693
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
986 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *)rt;
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
987 #ifdef XSHM
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
988 XSHM_update(xmb_rt);
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
989 #endif
8b7964869f7a Update window with XImage through XSHM
Thinker K.F. Li <thinker@branda.to>
parents: 692
diff changeset
990 return XFlush(xmb_rt->display);
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
991 }
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
992
869
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
993 /*! \brief Handle single X event.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
994 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
995 void
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
996 _X_MB_handle_single_event(void *rt, void *evt) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
997 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *)rt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
998
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
999 handle_single_x_event(xmb_rt, (XEvent *)evt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1000 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1001
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1002 /*! \brief Called at end of an iteration of X event loop.
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1003 */
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1004 void
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1005 _X_MB_no_more_event(void *rt) {
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1006 X_MB_runtime_t *xmb_rt = (X_MB_runtime_t *)rt;
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1007
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1008 no_more_event(xmb_rt);
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1009 }
c18058fb48ee Export API for JS to feed X events.
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
1010
545
49f8f57f184a Preparing for nodejs plugin
Thinker K.F. Li <thinker@branda.to>
parents: 529
diff changeset
1011 /* @} */