annotate examples/svg2code_ex/main.c @ 1161:a7faab54e8f8

Fix broken of running animation - Running animation is stop automatically after a certain time. - It is 300ms according MBScene._updateUI(). - It is caused by notification of changing DOM tree. The notification handlers would call MBScene.updateUI() to update framelines and buttons. - MBScene.updateUI() would call MBScene.show() after 300ms, MBScene.show() calls MBScene.parseScene() in turn. - MBScene.parseScene() would remove duplicate group that is using by code of running animation, MBScene.doRunNext(). It make running animation stop. - fixed by setting MBScene.lockui when a running animation is started or stoped.
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 28 Dec 2010 13:35:34 +0800
parents 71489039406b
children
rev   line source
117
Thinker K.F. Li <thinker@branda.to>
parents: 110
diff changeset
1 /*! \file
110
Thinker K.F. Li <thinker@branda.to>
parents: 108
diff changeset
2 *
Thinker K.F. Li <thinker@branda.to>
parents: 108
diff changeset
3 * svg2code_ex is an example that show programmers how to create a
Thinker K.F. Li <thinker@branda.to>
parents: 108
diff changeset
4 * menu with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 108
diff changeset
5 *
Thinker K.F. Li <thinker@branda.to>
parents: 108
diff changeset
6 */
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
7 #include <stdio.h>
186
530bb7728546 Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
8 #include <mb.h>
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
9 #include "svg2code_ex.h"
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
10
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
11 typedef struct _ex_rt ex_rt_t;
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
12 struct _ex_rt {
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
13 mb_rt_t *rt;
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
14 svg2code_ex_t *code;
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
15 };
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
16
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
17 #define COORD_SHOW(group) do { \
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
18 coord_show(group); \
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
19 rdman_coord_changed(mb_runtime_rdman(ex_rt->rt), group); \
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
20 } while(0)
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
21 #define COORD_HIDE(group) do { \
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
22 coord_hide(group); \
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
23 rdman_coord_changed(mb_runtime_rdman(ex_rt->rt), group); \
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
24 } while(0)
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
25
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
26 static void file_button_handler(event_t *evt, void *arg) {
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
27 ex_rt_t *ex_rt = (ex_rt_t *)arg;
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
28 redraw_man_t *rdman;
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
29
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
30 COORD_SHOW(ex_rt->code->file_menu);
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
31 rdman = mb_runtime_rdman(ex_rt->rt);
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
32 /* Update changed part to UI. */
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
33 rdman_redraw_changed(rdman);
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
34 }
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
35
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
36 static void file_menu_handler(event_t *evt, void *arg) {
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
37 ex_rt_t *ex_rt = (ex_rt_t *)arg;
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
38 redraw_man_t *rdman;
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
39
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
40 COORD_HIDE(ex_rt->code->file_menu);
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
41 rdman = mb_runtime_rdman(ex_rt->rt);
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
42 /* Update changed part to UI. */
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
43 rdman_redraw_changed(rdman);
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
44 }
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
45
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
46 int main(int argc, char * const argv[]) {
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
47 mb_rt_t *rt;
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 117
diff changeset
48 redraw_man_t *rdman;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
49 svg2code_ex_t *svg2code;
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
50 subject_t *subject;
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
51 ex_rt_t ex_rt;
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
52
108
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
53 /*
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
54 * Initialize a runtime with XLib as backend.
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
55 */
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
56 rt = mb_runtime_new(":0.0", 800, 600);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
57
108
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
58 /*
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
59 * Instantiate objects from a SVG file.
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
60 */
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
61 rdman = mb_runtime_rdman(rt);
130
3a4d6179e6a9 change mb_c_source.m4 and mb_c_header.m4 to specify parent for SVG object
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
62 svg2code = svg2code_ex_new(rdman, rdman->root_coord);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
63
108
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
64 /*
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
65 * Register observers to subjects of events for objects.
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
66 */
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
67 subject = coord_get_mouse_event(svg2code->file_button);
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 117
diff changeset
68 ex_rt.rt = rt;
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
69 ex_rt.code = svg2code;
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
70 subject_add_event_observer(subject, EVT_MOUSE_BUT_PRESS, file_button_handler, &ex_rt);
84
42698de1f653 Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents: 83
diff changeset
71 subject = coord_get_mouse_event(svg2code->file_menu);
198
f9d507a3e1d9 Add event observer which listen to one event type only.
wycc@wycc-desktop
parents: 192
diff changeset
72 subject_add_event_observer(subject, EVT_MOUSE_BUT_PRESS, file_menu_handler, &ex_rt);
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
73
108
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
74 /*
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
75 * Start handle connections, includes one to X server.
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
76 * User start to interact with the application.
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
77 */
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
78 mb_runtime_event_loop(rt);
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
79
108
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
80 /*
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
81 * Clean
565b55508c8d More dox
Thinker K.F. Li <thinker@branda.to>
parents: 84
diff changeset
82 */
83
ea758bb3bbe2 example
Thinker K.F. Li <thinker@branda.to>
parents: 79
diff changeset
83 svg2code_ex_free(svg2code);
1029
71489039406b Migrate examples/svg2code_ex to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents: 198
diff changeset
84 mb_runtime_free(rt);
78
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
85
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
86 return 0;
3645e29e4986 Add runtime for Xlib.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
87 }