# HG changeset patch
# User wycc
# Date 1231032769 -28800
# Node ID ab8284c8dcee58d3d86aa8e10c94484b918d519d
# Parent 1958bb2a87a2ac6641bbd2c533a9b15029225071
* 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.
* Remove reference to the MBApp from the mb_button_t so that it will be easier for us to generate button inside the sprite.
diff -r 1958bb2a87a2 -r ab8284c8dcee examples/dynamic/button.svg
--- a/examples/dynamic/button.svg Sat Jan 03 08:43:29 2009 +0800
+++ b/examples/dynamic/button.svg Sun Jan 04 09:32:49 2009 +0800
@@ -30,7 +30,7 @@
inkscape:cx="257.06285"
inkscape:cy="365.06674"
inkscape:document-units="px"
- inkscape:current-layer="btn_click"
+ inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1400"
inkscape:window-height="978"
@@ -106,6 +106,7 @@
x="235.71429"
y="282.36218" />
@@ -114,7 +115,7 @@
id="btn_normal"
transform="translate(148.57143,98.571429)"
mbname="btn_normal"
- style="display:none">
+ style="">
Click Me
+
Click Me
+ mbname="btn_click">
rootsprite,en->currentscene + 1);
}
+MyApp_InitContent()
+{
+ mb_button_t *b;
+ mb_sprite_t *sprite;
+
+ sprite = sprite_load("button", myApp->rdman, myApp->rdman->root_coord);
+ b = mb_button_new(myApp->rdman, sprite, "btn");
+ mb_button_add_onClick(b, test,NULL);
+}
+
int main(int argc, char * const argv[]) {
subject_t *subject;
- mb_button_t *b;
mb_obj_t *button;
MyAppData data;
mb_timeval_t tmo,interval;
@@ -129,8 +138,7 @@
myApp = MBApp_Init("scene");
data.currentscene=0;
MBApp_setData(myApp,&data);
- //b = mb_button_new(myApp, myApp->rootsprite, "btn");
- //mb_button_add_onClick(b, test,NULL);
+ MyApp_InitContent();
get_now(&tmo);
MB_TIMEVAL_SET(&interval, 1 ,0);
mb_tman_timeout( MBApp_getTimer(myApp), &tmo, switch_scene, myApp);
diff -r 1958bb2a87a2 -r ab8284c8dcee examples/dynamic/mbapp.c
--- a/examples/dynamic/mbapp.c Sat Jan 03 08:43:29 2009 +0800
+++ b/examples/dynamic/mbapp.c Sun Jan 04 09:32:49 2009 +0800
@@ -10,6 +10,7 @@
app->rt = rt;
app->rdman = X_MB_rdman(rt);
app->rootsprite= sprite_load(module,app->rdman, app->rdman->root_coord);
+ rdman_attach_backend(app->rdman, rt);
return app;
}
diff -r 1958bb2a87a2 -r ab8284c8dcee examples/dynamic/mbbutton.c
--- a/examples/dynamic/mbbutton.c Sat Jan 03 08:43:29 2009 +0800
+++ b/examples/dynamic/mbbutton.c Sun Jan 04 09:32:49 2009 +0800
@@ -7,8 +7,6 @@
#define CMOUSE(e) (coord_get_mouse_event(e))
-#define MBAPP_DATA(app,type) ((type *) ((app)->private))
-#define MBAPP_RDMAN(app) (((MBApp *) app)->rdman)
static void mb_button_pressed(event_t *evt, void *arg);
@@ -22,26 +20,22 @@
void mb_button_refresh(mb_button_t *btn)
{
- rdman_coord_changed(btn->en->rdman,btn->root);
- rdman_redraw_changed(btn->en->rdman);
+ rdman_coord_changed(btn->rdman,btn->root);
+ rdman_redraw_changed(btn->rdman);
}
static void mb_button_move(event_t *evt, void *arg)
{
mb_button_t *btn = (mb_button_t *) arg;
- MBApp *en = btn->en;
printf("Mouse move\n");
- arg = (void *)en;
coord_show(btn->active);
mb_button_refresh(btn);
}
static void mb_button_out(event_t *evt, void *arg)
{
mb_button_t *btn = (mb_button_t *) arg;
- MBApp *en = btn->en;
- arg = (void *) en;
if (btn->progm) {
mb_progm_abort(btn->progm);
@@ -57,7 +51,6 @@
static void mb_button_show_active(event_t *evt, void *arg)
{
mb_button_t *btn = (mb_button_t *) arg;
- MBApp *en = btn->en;
coord_show(btn->active);
mb_button_refresh(btn);
@@ -66,11 +59,9 @@
static void mb_button_pressed(event_t *evt, void *arg)
{
mb_button_t *btn = (mb_button_t *) arg;
- MBApp *en = btn->en;
mb_timeval_t start, playing, now;
mb_progm_t *progm;
mb_word_t *word;
- arg = (void *) en;
printf("Pressed\n");
if (btn->progm) {
@@ -79,10 +70,10 @@
}
coord_show(btn->click);
coord_hide(btn->active);
- rdman_coord_changed(MBAPP_RDMAN(arg),btn->root);
- rdman_redraw_changed(MBAPP_RDMAN(arg));
+ rdman_coord_changed(btn->rdman,btn->root);
+ rdman_redraw_changed(btn->rdman);
- btn->progm = progm = mb_progm_new(1, MBAPP_RDMAN(arg));
+ btn->progm = progm = mb_progm_new(1, btn->rdman);
MB_TIMEVAL_SET(&start, 0, 500000);
MB_TIMEVAL_SET(&playing, 0, 0);
word = mb_progm_next_word(progm, &start, &playing);
@@ -90,15 +81,15 @@
mb_visibility_new(VIS_VISIBLE, btn->active, word);
mb_progm_free_completed(progm);
get_now(&now);
- mb_progm_start(progm, X_MB_tman(en->rt), &now);
+ printf("rt = %x\n", btn->rdman->rt);
+ mb_progm_start(progm, X_MB_tman(btn->rdman->rt), &now);
if (btn->press)
btn->press(btn->arg);
}
-mb_button_t *mb_button_new(MBApp *app,mb_sprite_t *sp, char *name)
+mb_button_t *mb_button_new(redraw_man_t *rdman,mb_sprite_t *sp, char *name)
{
mb_button_t *btn = (mb_button_t *) malloc(sizeof(mb_button_t));
char *buf = (char *) malloc(strlen(name)+5);
- MBApp *arg = app;
btn->root = (coord_t *) MB_SPRITE_GET_OBJ(sp, name);
sprintf(buf, "%s_normal", name);
@@ -128,11 +119,11 @@
btn->normal->matrix[5] = 200;
btn->click->matrix[2] = 200;
btn->click->matrix[5] = 200;
- btn->en = app;
+ btn->rdman = rdman;
btn->obs_move = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_MOVE, mb_button_move,btn);
btn->obs_press = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_BUT_PRESS, mb_button_pressed,btn);
btn->obs_out = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_OUT, mb_button_out,btn);
btn->progm = NULL;
- rdman_redraw_changed(MBAPP_RDMAN(arg));
+ rdman_redraw_changed(rdman);
return btn;
}
diff -r 1958bb2a87a2 -r ab8284c8dcee examples/dynamic/mbbutton.h
--- a/examples/dynamic/mbbutton.h Sat Jan 03 08:43:29 2009 +0800
+++ b/examples/dynamic/mbbutton.h Sun Jan 04 09:32:49 2009 +0800
@@ -2,7 +2,7 @@
#define __MBBUTTON_H
typedef struct _mb_button {
mb_obj_t obj;
- MBApp *en;
+ redraw_man_t *rdman;
int state;
coord_t *root;
coord_t *active;
@@ -13,7 +13,7 @@
observer_t *obs_move,*obs_out,*obs_press;
mb_progm_t *progm;
} mb_button_t;
-mb_button_t *mb_button_new(MBApp *app,mb_sprite_t *sp, char *name);
+mb_button_t *mb_button_new(redraw_man_t *rdman,mb_sprite_t *sp, char *name);
void mb_button_add_onClick(mb_button_t *b, void (*h)(void *arg), void *arg);
#endif
diff -r 1958bb2a87a2 -r ab8284c8dcee include/mb_redraw_man.h
--- a/include/mb_redraw_man.h Sat Jan 03 08:43:29 2009 +0800
+++ b/include/mb_redraw_man.h Sun Jan 04 09:32:49 2009 +0800
@@ -74,6 +74,10 @@
* \see addrm_monitor_hdlr()
*/
mb_obj_t *last_mouse_over;
+ void *rt; /*!< \brief This is a pointer to the current
+ * graphic backend.
+ * \see rdman_attach_backend()
+ */
};
extern int redraw_man_init(redraw_man_t *rdman, cairo_t *cr,
@@ -186,6 +190,10 @@
#define rdman_clear_shape_gl(rdman) \
DARRAY_CLEAN(rdman_get_gen_geos(rdman))
+/*! \brief Attach backend to the redraw manager so that we can hide the backend from the users.
+ *
+ */
+#define rdman_attach_backend(rdman,backend) (((rdman)->rt)=(backend))
/*! \brief Load sprite dymanicly from the shared object module.
*
* The search path can be changed by sprite_set_search_path. The name can have a relative path in the front of it.
@@ -199,5 +207,4 @@
*/
void sprite_set_search_path(char *path);
-
#endif /* __REDRAW_MAN_H_ */
diff -r 1958bb2a87a2 -r ab8284c8dcee src/X_supp.c
--- a/src/X_supp.c Sat Jan 03 08:43:29 2009 +0800
+++ b/src/X_supp.c Sun Jan 04 09:32:49 2009 +0800
@@ -442,6 +442,10 @@
xmb_rt->rdman = (redraw_man_t *)malloc(sizeof(redraw_man_t));
redraw_man_init(xmb_rt->rdman, xmb_rt->cr, xmb_rt->backend_cr);
+ // FIXME: This is a wired loopback reference. This is inly required when we need
+ // to get the xmb_rt->tman for the animation. We should relocate the tman
+ // to the redraw_man_t instead.
+ xmb_rt->rdman->rt = xmb_rt;
xmb_rt->tman = mb_tman_new();