annotate examples/dynamic/mbbutton.c @ 1467:6927debad4ee

Fix issue and a simple testcase for FSM
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 18 Apr 2011 11:47:52 +0800
parents 26c302b47de1
children
rev   line source
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
1
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
2 #include <stdio.h>
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
3 #include <mb.h>
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
4 #include <string.h>
456
26c302b47de1 Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
5 #include "mb_af.h"
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
6
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
7
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
8
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
9 #define CMOUSE(e) (coord_get_mouse_event(e))
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
10
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
11
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
12 static void mb_button_pressed(event_t *evt, void *arg);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
13 static void mb_button_out(event_t *evt, void *arg);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
14
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
15 void mb_button_add_onClick(mb_button_t *b, void (*h)(void *arg), void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
16 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
17 b->press = h;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
18 b->arg = arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
19 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
20
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
21 void mb_button_refresh(mb_button_t *btn)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
22 {
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: 247
diff changeset
23 rdman_coord_changed(btn->rdman,btn->root);
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: 247
diff changeset
24 rdman_redraw_changed(btn->rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
25 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
26
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
27 static void mb_button_move(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
28 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
29 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
30
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
31
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
32 printf("Mouse move\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
33 coord_show(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
34 mb_button_refresh(btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
35 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
36 static void mb_button_out(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
37 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
38 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
39
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
40 if (btn->progm) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
41 mb_progm_abort(btn->progm);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
42 btn->progm = NULL;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
43 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
44 printf("mouse out\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
45 coord_hide(btn->click);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
46 coord_hide(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
47 coord_show(btn->normal);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
48 mb_button_refresh(btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
49 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
50
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
51 static void mb_button_show_active(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
52 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
53 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
54
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
55 coord_show(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
56 mb_button_refresh(btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
57 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
58
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
59 static void mb_button_pressed(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
60 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
61 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
62 mb_timeval_t start, playing, now;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
63 mb_progm_t *progm;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
64 mb_word_t *word;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
65
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
66 printf("Pressed\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
67 if (btn->progm) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
68 mb_progm_abort(btn->progm);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
69 btn->progm = NULL;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
70 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
71 coord_show(btn->click);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
72 coord_hide(btn->active);
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: 247
diff changeset
73 rdman_coord_changed(btn->rdman,btn->root);
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: 247
diff changeset
74 rdman_redraw_changed(btn->rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
75
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: 247
diff changeset
76 btn->progm = progm = mb_progm_new(1, btn->rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
77 MB_TIMEVAL_SET(&start, 0, 500000);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
78 MB_TIMEVAL_SET(&playing, 0, 0);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
79 word = mb_progm_next_word(progm, &start, &playing);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
80 mb_visibility_new(VIS_HIDDEN, btn->click, word);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
81 mb_visibility_new(VIS_VISIBLE, btn->active, word);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
82 mb_progm_free_completed(progm);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
83 get_now(&now);
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: 247
diff changeset
84 printf("rt = %x\n", btn->rdman->rt);
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: 247
diff changeset
85 mb_progm_start(progm, X_MB_tman(btn->rdman->rt), &now);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
86 if (btn->press)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
87 btn->press(btn->arg);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
88 }
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: 247
diff changeset
89 mb_button_t *mb_button_new(redraw_man_t *rdman,mb_sprite_t *sp, char *name)
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
90 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
91 mb_button_t *btn = (mb_button_t *) malloc(sizeof(mb_button_t));
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
92 char *buf = (char *) malloc(strlen(name)+5);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
93
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
94 btn->root = (coord_t *) MB_SPRITE_GET_OBJ(sp, name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
95 sprintf(buf, "%s_normal", name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
96 btn->normal = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
97 if (btn->normal == NULL) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
98 printf("Missing normal button, this is not a correct button\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
99 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
100 sprintf(buf, "%s_active", name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
101 btn->active = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
102 if (btn->active == NULL) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
103 printf("Missing click button, this is not a correct button\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
104 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
105 sprintf(buf, "%s_click", name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
106 btn->click = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
107 if (btn->active == NULL) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
108 printf("Missing click button, this is not a correct button\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
109 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
110 btn->press = NULL;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
111 // Show only the normal button
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
112 coord_hide(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
113 coord_hide(btn->click);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
114 coord_show(btn->normal);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
115 // Move to the same position
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
116 btn->active->matrix[2] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
117 btn->active->matrix[5] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
118 btn->normal->matrix[2] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
119 btn->normal->matrix[5] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
120 btn->click->matrix[2] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
121 btn->click->matrix[5] = 200;
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: 247
diff changeset
122 btn->rdman = rdman;
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
123 btn->obs_move = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_MOVE, mb_button_move,btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
124 btn->obs_press = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_BUT_PRESS, mb_button_pressed,btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
125 btn->obs_out = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_OUT, mb_button_out,btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
126 btn->progm = NULL;
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: 247
diff changeset
127 rdman_redraw_changed(rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
128 return btn;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
129 }