Mercurial > MadButterfly
annotate examples/calculator/main.c @ 335:01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
author | wycc |
---|---|
date | Sat, 07 Mar 2009 14:24:55 +0800 |
parents | c8b6ca46950b |
children | 331467b8e778 |
rev | line source |
---|---|
88 | 1 #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
|
2 #include <mb.h> |
88 | 3 #include "calculator_scr.h" |
4 | |
94 | 5 typedef struct _calc_data calc_data_t; |
6 struct _calc_data { | |
88 | 7 X_MB_runtime_t *rt; |
8 calculator_scr_t *code; | |
9 }; | |
10 | |
11 static struct { | |
12 int c; | |
13 int off; | |
14 } tgt_list[] = { | |
15 { 0, OFFSET(calculator_scr_t, but_0) }, | |
16 { 1, OFFSET(calculator_scr_t, but_1) }, | |
17 { 2, OFFSET(calculator_scr_t, but_2) }, | |
18 { 3, OFFSET(calculator_scr_t, but_3) }, | |
19 { 4, OFFSET(calculator_scr_t, but_4) }, | |
20 { 5, OFFSET(calculator_scr_t, but_5) }, | |
21 { 6, OFFSET(calculator_scr_t, but_6) }, | |
22 { 7, OFFSET(calculator_scr_t, but_7) }, | |
23 { 8, OFFSET(calculator_scr_t, but_8) }, | |
24 { 9, OFFSET(calculator_scr_t, but_9) }, | |
25 { '+', OFFSET(calculator_scr_t, but_add) }, | |
26 { '-', OFFSET(calculator_scr_t, but_minus) }, | |
27 { '*', OFFSET(calculator_scr_t, but_mul) }, | |
28 { '/', OFFSET(calculator_scr_t, but_div) }, | |
29 { '=', OFFSET(calculator_scr_t, but_eq) }, | |
30 { 'c', OFFSET(calculator_scr_t, but_clr) } | |
31 }; | |
32 | |
33 static int real_compute(int op, int v1, int v2) { | |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
34 int r = v1; |
88 | 35 |
36 switch(op) { | |
37 case '+': | |
38 r = v1 + v2; | |
39 break; | |
40 case '-': | |
41 r = v1 - v2; | |
42 break; | |
43 case '*': | |
44 r = v1 * v2; | |
45 break; | |
46 case '/': | |
93 | 47 r = v1; |
89
90428161fc61
Prevent divide by zero error
Thinker K.F. Li <thinker@branda.to>
parents:
88
diff
changeset
|
48 if(v2) |
93 | 49 r /= v2; |
88 | 50 break; |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
51 case 'n': |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
52 r = v2; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
53 break; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
54 case 'N': |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
55 break; |
88 | 56 } |
57 | |
58 return r; | |
59 } | |
60 | |
94 | 61 static void show_text(calc_data_t *calc_data, int num, int saved, int op, |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
62 const char *suffix) { |
88 | 63 char buf[20]; |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
64 redraw_man_t *rdman; |
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
65 |
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
66 rdman = X_MB_rdman(calc_data->rt); |
88 | 67 |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
68 sprintf(buf, "%d%s", num, suffix); |
278
a90fd749af82
Implement the whole tspan attribute. Currently, we can accept font family/font style/font weight and font size.
wycc
parents:
192
diff
changeset
|
69 sh_text_set_text(calc_data->code->screen_text_u, buf); |
a90fd749af82
Implement the whole tspan attribute. Currently, we can accept font family/font style/font weight and font size.
wycc
parents:
192
diff
changeset
|
70 rdman_shape_changed(rdman, calc_data->code->screen_text_u); |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
71 |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
72 if(op == 'n') |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
73 sprintf(buf, "None"); |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
74 else |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
75 sprintf(buf, "%d%c", saved, op); |
94 | 76 sh_text_set_text(calc_data->code->saved_text, buf); |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
77 rdman_shape_changed(rdman, calc_data->code->saved_text); |
88 | 78 } |
79 | |
94 | 80 static void compute(calc_data_t *calc_data, coord_t *tgt) { |
88 | 81 int i; |
82 coord_t **coord_p; | |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
83 redraw_man_t *rdman; |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
84 static int valid_num = 0; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
85 static int factor = 1; |
88 | 86 static int num = 0; |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
87 static int op = 'n'; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
88 static int saved = 0; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
89 char buf[2] = " "; |
88 | 90 |
91 for(i = 0; i < 16; i++) { | |
94 | 92 coord_p = (coord_t **)((void *)calc_data->code + tgt_list[i].off); |
88 | 93 if(*coord_p == (void *)tgt) |
94 break; | |
95 } | |
96 if(i >= 16) return; | |
97 | |
98 if(i < 10) { | |
99 num = num * 10 + i; | |
94 | 100 show_text(calc_data, num * factor, saved, op, ""); |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
101 valid_num = 1; |
88 | 102 } else { |
103 switch(tgt_list[i].c) { | |
104 case 'c': | |
105 saved = num = 0; | |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
106 factor = 1; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
107 valid_num = 0; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
108 op = 'n'; |
94 | 109 show_text(calc_data, 0, saved, op, ""); |
88 | 110 break; |
111 | |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
112 case '-': |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
113 if(!valid_num) { |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
114 factor *= -1; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
115 valid_num = 1; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
116 break; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
117 } |
88 | 118 case '+': |
119 case '*': | |
120 case '/': | |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
121 saved = real_compute(op, saved, num * factor); |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
122 buf[0] = tgt_list[i].c; |
94 | 123 show_text(calc_data, saved, saved, 'n', buf); |
90 | 124 op = tgt_list[i].c; |
88 | 125 num = 0; |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
126 factor = 1; |
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
127 valid_num = 0; |
88 | 128 break; |
129 | |
130 case '=': | |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
131 saved = real_compute(op, saved, num * factor); |
94 | 132 show_text(calc_data, saved, 0, 'n', ""); |
88 | 133 num = 0; |
92
3f619ae03678
Improve calcuator example program.
Thinker K.F. Li <thinker@branda.to>
parents:
90
diff
changeset
|
134 op = 'N'; |
88 | 135 break; |
136 } | |
137 } | |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
138 rdman = X_MB_rdman(calc_data->rt); |
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
139 rdman_redraw_changed(rdman); |
88 | 140 } |
141 | |
142 static void buttons_handler(event_t *evt, void *arg) { | |
94 | 143 calc_data_t *calc_data = (calc_data_t *)arg; |
88 | 144 |
145 switch(evt->type) { | |
146 case EVT_MOUSE_BUT_PRESS: | |
271 | 147 compute(calc_data, (coord_t *)evt->cur_tgt->obj); |
88 | 148 break; |
149 } | |
150 } | |
151 | |
94 | 152 static void setup_observers(calc_data_t *calc_data) { |
88 | 153 calculator_scr_t *calculator_scr; |
154 subject_t *subject; | |
90 | 155 coord_t *coord; |
156 int off; | |
157 int i; | |
88 | 158 |
94 | 159 calculator_scr = calc_data->code; |
88 | 160 |
90 | 161 for(i = 0; i < 16; i++) { |
162 off = tgt_list[i].off; | |
93 | 163 coord = OFF2TYPE(calculator_scr, off, coord_t *); |
90 | 164 subject = coord_get_mouse_event(coord); |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
165 subject_add_observer(subject, buttons_handler, calc_data); |
90 | 166 } |
88 | 167 } |
168 | |
169 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:
108
diff
changeset
|
170 X_MB_runtime_t *rt; |
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
171 redraw_man_t *rdman; |
88 | 172 calculator_scr_t *calculator_scr; |
94 | 173 calc_data_t calc_data; |
88 | 174 |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
175 rt = X_MB_new(":0.0", 300, 400); |
88 | 176 |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
177 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
|
178 calculator_scr = calculator_scr_new(rdman, rdman->root_coord); |
88 | 179 |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
180 calc_data.rt = rt; |
94 | 181 calc_data.code = calculator_scr; |
182 setup_observers(&calc_data); | |
88 | 183 |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
184 X_MB_handle_connection(rt); |
88 | 185 |
186 calculator_scr_free(calculator_scr); | |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
108
diff
changeset
|
187 X_MB_free(rt); |
88 | 188 |
189 return 0; | |
190 } |