davemds pushed a commit to branch master. http://git.enlightenment.org/enlightenment/modules/penguins.git/commit/?id=5b0af124e4090dd75b70f4a0c8d6bcc4c7b32af1
commit 5b0af124e4090dd75b70f4a0c8d6bcc4c7b32af1 Author: davemds <[email protected]> Date: Sat Jan 25 00:20:29 2014 +0100 Keep a static reference to the Population struct. This simplify stuff as I do not need to pass the pointer around and save some memory in the Actor struct. --- src/e_mod_config.c | 2 +- src/e_mod_main.c | 15 +---- src/e_mod_penguins.c | 180 +++++++++++++++++++++++++-------------------------- src/e_mod_penguins.h | 8 +-- 4 files changed, 97 insertions(+), 108 deletions(-) diff --git a/src/e_mod_config.c b/src/e_mod_config.c index ee264a9..8c67321 100644 --- a/src/e_mod_config.c +++ b/src/e_mod_config.c @@ -148,6 +148,6 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_config_save_queue(); - penguins_reload(pop); + penguins_reload(); return 1; } diff --git a/src/e_mod_main.c b/src/e_mod_main.c index dab7e6e..72c1c00 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -37,27 +37,18 @@ e_modapi_init(E_Module *m) EAPI int e_modapi_shutdown(E_Module *m) { - Penguins_Population *pop; - e_configure_registry_item_del("appearance/penguins"); e_configure_registry_category_del("appearance"); - - if ((pop = m->data)) - { - E_FREE_FUNC(pop->config_dialog, e_object_del); - penguins_shutdown(pop); - } + penguins_shutdown(); return 1; } EAPI int e_modapi_save(E_Module *m) { - Penguins_Population *pop; + Penguins_Population *pop = m->data; - pop = m->data; - if (!pop) return 1; - e_config_domain_save("module.penguins", pop->conf_edd, pop->conf); + if (pop) e_config_domain_save("module.penguins", pop->conf_edd, pop->conf); return 1; } diff --git a/src/e_mod_penguins.c b/src/e_mod_penguins.c index ae09824..1d41ac0 100644 --- a/src/e_mod_penguins.c +++ b/src/e_mod_penguins.c @@ -21,13 +21,15 @@ // _RAND(prob) is true one time every prob #define _RAND(prob) ( ( random() % prob ) == 0 ) +static Penguins_Population* population = NULL; + /* module private routines */ static int _is_inside_any_win(Penguins_Actor *tux, int x, int y, int ret_value); static Eina_Bool _cb_animator(void *data); -static void _population_load(Penguins_Population *pop); -static void _population_free(Penguins_Population *pop); -static void _theme_load(Penguins_Population *pop); +static void _population_load(void); +static void _population_free(void); +static void _theme_load(void); static void _start_walking_at(Penguins_Actor *tux, int at_y); static void _start_climbing_at(Penguins_Actor *tux, int at_x); static void _start_falling_at(Penguins_Actor *tux, int at_x); @@ -47,33 +49,32 @@ static Eina_Bool _cb_zone_changed(void *data, int type EINA_UNUSED, void *event Penguins_Population * penguins_init(E_Module *m) { - Penguins_Population *pop; char buf[PATH_MAX]; - pop = E_NEW(Penguins_Population, 1); - if (!pop) return NULL; + population = E_NEW(Penguins_Population, 1); + if (!population) return NULL; // Init module persistent config - pop->module = m; - pop->conf_edd = E_CONFIG_DD_NEW("Penguins_Config", Penguins_Config); + population->module = m; + population->conf_edd = E_CONFIG_DD_NEW("Penguins_Config", Penguins_Config); #undef T #undef D #define T Penguins_Config -#define D pop->conf_edd +#define D population->conf_edd E_CONFIG_VAL(D, T, zoom, DOUBLE); E_CONFIG_VAL(D, T, penguins_count, INT); E_CONFIG_VAL(D, T, theme, STR); E_CONFIG_VAL(D, T, alpha, INT); - pop->conf = e_config_domain_load("module.penguins", pop->conf_edd); - if (!pop->conf) + population->conf = e_config_domain_load("module.penguins", population->conf_edd); + if (!population->conf) { - pop->conf = E_NEW(Penguins_Config, 1); - pop->conf->zoom = 1; - pop->conf->penguins_count = 3; - pop->conf->alpha = 200; + population->conf = E_NEW(Penguins_Config, 1); + population->conf->zoom = 1; + population->conf->penguins_count = 3; + population->conf->alpha = 200; snprintf(buf, sizeof(buf), "%s/themes/default.edj", e_module_dir_get(m)); - pop->conf->theme = eina_stringshare_add(buf); + population->conf->theme = eina_stringshare_add(buf); } // Search available themes @@ -92,7 +93,7 @@ penguins_init(E_Module *m) if ((name = edje_file_data_get(buf, "PopulationName"))) { printf("PENGUINS: Theme: %s (%s)\n", filename, name); - pop->themes = eina_list_append(pop->themes, strdup(buf)); + population->themes = eina_list_append(population->themes, strdup(buf)); free(name); } } @@ -100,41 +101,42 @@ penguins_init(E_Module *m) } // be notified when zones changes - E_LIST_HANDLER_APPEND(pop->handlers, E_EVENT_ZONE_ADD, _cb_zone_changed, pop); - E_LIST_HANDLER_APPEND(pop->handlers, E_EVENT_ZONE_DEL, _cb_zone_changed, pop); + E_LIST_HANDLER_APPEND(population->handlers, E_EVENT_ZONE_ADD, _cb_zone_changed, NULL); + E_LIST_HANDLER_APPEND(population->handlers, E_EVENT_ZONE_DEL, _cb_zone_changed, NULL); // bootstrap - _theme_load(pop); - _population_load(pop); - pop->animator = ecore_animator_add(_cb_animator, pop); + _theme_load(); + _population_load(); + population->animator = ecore_animator_add(_cb_animator, population); - return pop; + return population; } void -penguins_shutdown(Penguins_Population *pop) +penguins_shutdown(void) { printf("PENGUINS: KILL 'EM ALL\n"); - _population_free(pop); + _population_free(); - E_FREE_LIST(pop->handlers, ecore_event_handler_del); - E_FREE_FUNC(pop->animator, ecore_animator_del); - E_FREE_LIST(pop->themes, free); + E_FREE_LIST(population->handlers, ecore_event_handler_del); + E_FREE_FUNC(population->animator, ecore_animator_del); + E_FREE_LIST(population->themes, free); - E_FREE_FUNC(pop->conf->theme, eina_stringshare_del); - E_FREE(pop->conf); - E_CONFIG_DD_FREE(pop->conf_edd); + E_FREE_FUNC(population->config_dialog, e_object_del); + E_FREE_FUNC(population->conf->theme, eina_stringshare_del); + E_FREE(population->conf); + E_CONFIG_DD_FREE(population->conf_edd); - E_FREE(pop); + E_FREE(population); } void -penguins_reload(Penguins_Population *pop) +penguins_reload(void) { - _population_free(pop); - _theme_load(pop); - _population_load(pop); + _population_free(); + _theme_load(); + _population_load(); } /* module private routines */ @@ -148,7 +150,7 @@ _action_free(Penguins_Action *a) } static void -_population_free(Penguins_Population *pop) +_population_free(void) { Penguins_Actor *tux; Penguins_Custom_Action *act; @@ -156,14 +158,14 @@ _population_free(Penguins_Population *pop) // printf("PENGUINS: Free Population\n"); - EINA_LIST_FREE(pop->penguins, tux) + EINA_LIST_FREE(population->penguins, tux) { // printf("PENGUINS: Free TUX :)\n"); E_FREE_FUNC(tux->obj, evas_object_del); E_FREE(tux); } - EINA_LIST_FREE(pop->customs, act) + EINA_LIST_FREE(population->customs, act) { // printf("PENGUINS: Free Custom Action\n"); E_FREE(act->name); @@ -175,20 +177,20 @@ _population_free(Penguins_Population *pop) for (i = 0; i < AID_LAST; i++) { // printf("PENGUINS: Free Action\n"); - E_FREE_FUNC(pop->actions[i], _action_free); + E_FREE_FUNC(population->actions[i], _action_free); } } static Penguins_Action * -_load_action(Penguins_Population *pop, char *name, int id) +_load_action(char *name, int id) { Penguins_Action *act; int w, h, speed, ret; char *data; - pop->actions[id] = NULL; + population->actions[id] = NULL; - data = edje_file_data_get(pop->conf->theme, name); + data = edje_file_data_get(population->conf->theme, name); if (!data) return NULL; ret = sscanf(data, "%d %d %d", &w, &h, &speed); @@ -200,23 +202,23 @@ _load_action(Penguins_Population *pop, char *name, int id) act->name = strdup(name); act->id = id; - act->w = w * pop->conf->zoom; - act->h = h * pop->conf->zoom; - act->speed = speed * pop->conf->zoom; + act->w = w * population->conf->zoom; + act->h = h * population->conf->zoom; + act->speed = speed * population->conf->zoom; - pop->actions[id] = act; + population->actions[id] = act; return act; } static Penguins_Custom_Action * -_load_custom_action(Penguins_Population *pop, char *name) +_load_custom_action(char *name) { Penguins_Custom_Action *c; int w, h, h_speed, v_speed, r_min, r_max, ret; char *data; char buf[25]; - data = edje_file_data_get(pop->conf->theme, name); + data = edje_file_data_get(population->conf->theme, name); if (!data) return NULL; ret = sscanf(data, "%d %d %d %d %d %d", @@ -228,54 +230,54 @@ _load_custom_action(Penguins_Population *pop, char *name) if (!c) return NULL; c->name = strdup(name); - c->w = w * pop->conf->zoom; - c->h = h * pop->conf->zoom; - c->h_speed = h_speed * pop->conf->zoom; - c->v_speed = v_speed * pop->conf->zoom; + c->w = w * population->conf->zoom; + c->h = h * population->conf->zoom; + c->h_speed = h_speed * population->conf->zoom; + c->v_speed = v_speed * population->conf->zoom; c->r_min = r_min; c->r_max = r_max; - pop->customs = eina_list_append(pop->customs, c); + population->customs = eina_list_append(population->customs, c); - snprintf(buf, sizeof(buf), "start_custom_%d_left", eina_list_count(pop->customs)); + snprintf(buf, sizeof(buf), "start_custom_%d_left", eina_list_count(population->customs)); c->left_program_name = strdup(buf); - snprintf(buf, sizeof(buf), "start_custom_%d_right", eina_list_count(pop->customs)); + snprintf(buf, sizeof(buf), "start_custom_%d_right", eina_list_count(population->customs)); c->right_program_name = strdup(buf); return c; } static void -_theme_load(Penguins_Population *pop) +_theme_load(void) { char *name; char buf[15]; int i = 1; - name = edje_file_data_get(pop->conf->theme, "PopulationName"); + name = edje_file_data_get(population->conf->theme, "PopulationName"); if (!name) return; //printf("PENGUINS: Load theme: %s (%s)\n", name, pop->conf->theme); free(name); // load standard actions - _load_action(pop, "Walker", AID_WALKER); - _load_action(pop, "Faller", AID_FALLER); - _load_action(pop, "Climber", AID_CLIMBER); - _load_action(pop, "Floater", AID_FLOATER); - _load_action(pop, "Bomber", AID_BOMBER); - _load_action(pop, "Splatter", AID_SPLATTER); - _load_action(pop, "Flyer", AID_FLYER); - _load_action(pop, "Angel", AID_ANGEL); + _load_action("Walker", AID_WALKER); + _load_action("Faller", AID_FALLER); + _load_action("Climber", AID_CLIMBER); + _load_action("Floater", AID_FLOATER); + _load_action("Bomber", AID_BOMBER); + _load_action("Splatter", AID_SPLATTER); + _load_action("Flyer", AID_FLYER); + _load_action("Angel", AID_ANGEL); // load custom actions do { snprintf(buf, sizeof(buf), "Custom_%d", i++); - } while (_load_custom_action(pop, buf)); + } while (_load_custom_action(buf)); } static void -_population_load(Penguins_Population *pop) +_population_load(void) { Penguins_Actor *tux; E_Comp *comp; @@ -296,19 +298,17 @@ _population_load(Penguins_Population *pop) } // Create one object for each penguin - printf("PENGUINS: Creating %d penguins\n", pop->conf->penguins_count); - for (i = 0; i < pop->conf->penguins_count; i++) + printf("PENGUINS: Creating %d penguins\n", population->conf->penguins_count); + for (i = 0; i < population->conf->penguins_count; i++) { tux = E_NEW(Penguins_Actor, 1); if (!tux) return; tux->zone = eina_list_nth(zones, i % eina_list_count(zones)); - tux->pop = pop; - tux->obj = edje_object_add(tux->zone->comp->evas); - edje_object_file_set(tux->obj, pop->conf->theme, "anims"); - evas_object_color_set(tux->obj, pop->conf->alpha, pop->conf->alpha, - pop->conf->alpha, pop->conf->alpha); + edje_object_file_set(tux->obj, population->conf->theme, "anims"); + evas_object_color_set(tux->obj, population->conf->alpha, population->conf->alpha, + population->conf->alpha, population->conf->alpha); evas_object_pass_events_set(tux->obj, EINA_FALSE); evas_object_layer_set(tux->obj, E_LAYER_DESKTOP_TOP + 10); edje_object_signal_callback_add(tux->obj, "click_l", "penguins", _cb_click_l, tux); @@ -327,7 +327,7 @@ _delay_born(void *data) { Penguins_Actor *tux = data; - tux->pop->penguins = eina_list_append(tux->pop->penguins, tux); + population->penguins = eina_list_append(population->penguins, tux); _reborn(tux); return ECORE_CALLBACK_CANCEL; @@ -358,7 +358,7 @@ static Eina_Bool _cb_zone_changed(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) { // printf("PENGUINS: ZONES CHANGED\n"); - penguins_reload((Penguins_Population*)data); + penguins_reload(); return ECORE_CALLBACK_PASS_ON; } @@ -368,7 +368,7 @@ _reborn(Penguins_Actor *tux) printf("PENGUINS: Reborn on zone: %s (%d,%d @ %dx%d)\n", tux->zone->name, tux->zone->x, tux->zone->y, tux->zone->w, tux->zone->h); tux->custom = NULL; - tux->action = tux->pop->actions[AID_FALLER]; + tux->action = population->actions[AID_FALLER]; tux->reverse = random() % (2); tux->x = tux->zone->x + (random() % (tux->zone->w - tux->action->w)); tux->y = tux->zone->y - 100; @@ -620,7 +620,7 @@ static void _start_walking_at(Penguins_Actor *tux, int at_y) { //printf("PENGUINS: Start walking...at %d\n", at_y); - tux->action = tux->pop->actions[AID_WALKER]; + tux->action = population->actions[AID_WALKER]; tux->custom = NULL; tux->y = at_y - tux->action->h; @@ -636,7 +636,7 @@ static void _start_climbing_at(Penguins_Actor *tux, int at_x) { //printf("PENGUINS: Start climbing...at: %d\n", at_x); - tux->action = tux->pop->actions[AID_CLIMBER]; + tux->action = population->actions[AID_CLIMBER]; evas_object_resize(tux->obj, tux->action->w, tux->action->h); if (tux->reverse) @@ -657,7 +657,7 @@ _start_falling_at(Penguins_Actor *tux, int at_x) if (_RAND(FALLING_PROB)) { //printf("PENGUINS: Start falling...\n"); - tux->action = tux->pop->actions[AID_FALLER]; + tux->action = population->actions[AID_FALLER]; evas_object_resize(tux->obj, tux->action->w, tux->action->h); if (tux->reverse) @@ -674,7 +674,7 @@ _start_falling_at(Penguins_Actor *tux, int at_x) else { //printf("Start floating...\n"); - tux->action = tux->pop->actions[AID_FLOATER]; + tux->action = population->actions[AID_FLOATER]; evas_object_resize(tux->obj, tux->action->w, tux->action->h); if (tux->reverse) @@ -695,7 +695,7 @@ _start_falling_at(Penguins_Actor *tux, int at_x) static void _start_flying_at(Penguins_Actor *tux, int at_y) { - tux->action = tux->pop->actions[AID_FLYER]; + tux->action = population->actions[AID_FLYER]; evas_object_resize(tux->obj, tux->action->w, tux->action->h); tux->y = at_y - tux->action->h; if (tux->reverse) @@ -707,13 +707,13 @@ _start_flying_at(Penguins_Actor *tux, int at_y) static void _start_angel_at(Penguins_Actor *tux, int at_y) { - if (!tux->pop->actions[AID_ANGEL]) + if (!population->actions[AID_ANGEL]) { _reborn(tux); return; } - tux->action = tux->pop->actions[AID_ANGEL]; + tux->action = population->actions[AID_ANGEL]; tux->custom = NULL; tux->x = tux->x - (tux->action->w / 2); tux->y = at_y - 10; @@ -737,7 +737,7 @@ _start_splatting_at(Penguins_Actor *tux, int at_x, int at_y) { // printf("PENGUINS: Start splatting...\n"); - tux->action = tux->pop->actions[AID_SPLATTER]; + tux->action = population->actions[AID_SPLATTER]; evas_object_resize(tux->obj, tux->action->w, tux->action->h); tux->y = at_y - tux->action->h; tux->x = at_x - tux->action->w / 2; @@ -777,7 +777,7 @@ _start_bombing_at(Penguins_Actor *tux, int at_y) edje_object_signal_emit(tux->obj, "start_bombing_right", "epenguins"); tux->x = tux->x + (tux->action->w / 2); - tux->action = tux->pop->actions[AID_BOMBER]; + tux->action = population->actions[AID_BOMBER]; tux->x = tux->x - (tux->action->w / 2); tux->y = at_y - tux->action->h; @@ -816,11 +816,11 @@ _start_custom_at(Penguins_Actor *tux, int at_y) { int ran; - if (eina_list_count(tux->pop->customs) < 1) + if (eina_list_count(population->customs) < 1) return; - ran = random() % (eina_list_count(tux->pop->customs)); - tux->custom = eina_list_nth(tux->pop->customs, ran); + ran = random() % (eina_list_count(population->customs)); + tux->custom = eina_list_nth(population->customs, ran); if (!tux->custom) return; evas_object_resize(tux->obj, tux->custom->w, tux->custom->h); diff --git a/src/e_mod_penguins.h b/src/e_mod_penguins.h index ef8b7cb..49ee843 100644 --- a/src/e_mod_penguins.h +++ b/src/e_mod_penguins.h @@ -62,20 +62,18 @@ typedef struct _Penguins_Actor { Evas_Object *obj; E_Zone *zone; - int reverse; double x, y; + int reverse; int faller_h; int r_count; Penguins_Action *action; Penguins_Custom_Action *custom; - Penguins_Population *pop; // TODO: REMOVEME } Penguins_Actor; - Penguins_Population *penguins_init(E_Module *m); -void penguins_shutdown(Penguins_Population *pop); -void penguins_reload(Penguins_Population *pop); +void penguins_shutdown(void); +void penguins_reload(void); #endif --
