annotate src/dfb_supp.c @ 903:4c7f0ec97ad9

Copy src/dfb_supp.c from src/X_supp.c
author Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
date Sun, 03 Oct 2010 16:54:26 +0800
parents src/X_supp.c@512204bcafba
children f838e5207ec4
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 /* @} */