Mercurial > MadButterfly
annotate examples/svg2code_ex/main.c @ 192:54fdc2a65242
Remove factory from observer APIs.
- Save factory that used to new a subject as subject's attribute.
- Get factory from subject himself instead of passing as an argument.
- It make API of observer more simple and clean.
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Tue, 18 Nov 2008 21:42:30 +0800 |
parents | 530bb7728546 |
children | f9d507a3e1d9 |
rev | line source |
---|---|
117 | 1 /*! \file |
110 | 2 * |
3 * svg2code_ex is an example that show programmers how to create a | |
4 * menu with MadButterfly. | |
5 * | |
6 */ | |
78 | 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 | 9 #include "svg2code_ex.h" |
10 | |
83 | 11 typedef struct _ex_rt ex_rt_t; |
12 struct _ex_rt { | |
13 X_MB_runtime_t *rt; | |
14 svg2code_ex_t *code; | |
15 }; | |
16 | |
17 static void file_button_handler(event_t *evt, void *arg) { | |
18 ex_rt_t *ex_rt = (ex_rt_t *)arg; | |
19 | |
84
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
20 switch(evt->type) { |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
21 case EVT_MOUSE_BUT_PRESS: |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
22 coord_show(ex_rt->code->file_menu); |
108 | 23 /* Tell redraw manager that a coord (group) is chagned. */ |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
24 rdman_coord_changed(X_MB_rdman(ex_rt->rt), ex_rt->code->file_menu); |
108 | 25 /* Update changed part to UI. */ |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
26 rdman_redraw_changed(X_MB_rdman(ex_rt->rt)); |
84
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
27 break; |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
28 } |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
29 } |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
30 |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
31 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
|
32 ex_rt_t *ex_rt = (ex_rt_t *)arg; |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
33 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
|
34 |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
35 rdman = X_MB_rdman(ex_rt->rt); |
84
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
36 switch(evt->type) { |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
37 case EVT_MOUSE_BUT_PRESS: |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
38 coord_hide(ex_rt->code->file_menu); |
108 | 39 /* Tell redraw manager that a coord (group) is chagned. */ |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
40 rdman_coord_changed(rdman, ex_rt->code->file_menu); |
108 | 41 /* Update changed part to UI. */ |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
42 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
|
43 break; |
42698de1f653
Support translate() function for transform attribute of 'g' tag.
Thinker K.F. Li <thinker@branda.to>
parents:
83
diff
changeset
|
44 } |
83 | 45 } |
46 | |
78 | 47 int main(int argc, char * const argv[]) { |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
48 X_MB_runtime_t *rt; |
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
49 redraw_man_t *rdman; |
78 | 50 svg2code_ex_t *svg2code; |
83 | 51 subject_t *subject; |
52 ex_rt_t ex_rt; | |
78 | 53 |
108 | 54 /* |
55 * Initialize a runtime with XLib as backend. | |
56 */ | |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
57 rt = X_MB_new(":0.0", 800, 600); |
78 | 58 |
108 | 59 /* |
60 * Instantiate objects from a SVG file. | |
61 */ | |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
62 rdman = X_MB_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
|
63 svg2code = svg2code_ex_new(rdman, rdman->root_coord); |
78 | 64 |
108 | 65 /* |
66 * Register observers to subjects of events for objects. | |
67 */ | |
83 | 68 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
|
69 ex_rt.rt = rt; |
83 | 70 ex_rt.code = svg2code; |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
71 subject_add_observer(subject, 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
|
72 subject = coord_get_mouse_event(svg2code->file_menu); |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
73 subject_add_observer(subject, file_menu_handler, &ex_rt); |
83 | 74 |
108 | 75 /* |
76 * Start handle connections, includes one to X server. | |
77 * User start to interact with the application. | |
78 */ | |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
79 X_MB_handle_connection(rt); |
83 | 80 |
108 | 81 /* |
82 * Clean | |
83 */ | |
83 | 84 svg2code_ex_free(svg2code); |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
117
diff
changeset
|
85 X_MB_free(rt); |
78 | 86 |
87 return 0; | |
88 } |