From e23367f7227692ff7cb894b56ff02c04e4fa543e Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 10 Feb 2006 09:26:12 +0000 Subject: [PATCH] for now - people will miss their "start" module - as it has now been ursurped for gadcon testing :) mind u - it's a HELL of a lot smaller now :) SVN revision: 20381 --- src/bin/e_gadcon.c | 24 +- src/modules/start/Makefile.am | 4 +- src/modules/start/e_mod_config.c | 101 ------ src/modules/start/e_mod_config.h | 10 - src/modules/start/e_mod_main.c | 528 ++++++++----------------------- src/modules/start/e_mod_main.h | 42 +-- 6 files changed, 153 insertions(+), 556 deletions(-) delete mode 100644 src/modules/start/e_mod_config.c delete mode 100644 src/modules/start/e_mod_config.h diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 0d0bf9900..f4e2ba624 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -87,17 +87,6 @@ e_gadcon_init(void) }; e_gadcon_provider_register(&cc); } - { - static E_Gadcon_Client_Class cc = - { - GADCON_CLIENT_CLASS_VERSION, - "start", - { - __test, __test2, NULL - } - }; - e_gadcon_provider_register(&cc); - } { static E_Gadcon_Client_Class cc = { @@ -756,6 +745,8 @@ struct _E_Smart_Data Evas_Object *obj; Evas_Object *clip; unsigned char horizontal : 1; + unsigned char doing_config : 1; + unsigned char redo_config : 1; Evas_List *items; int frozen; }; @@ -1120,6 +1111,11 @@ _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd) Evas_List *list_s = NULL, *list_m = NULL, *list_e = NULL, *list = NULL; if (sd->frozen) return; + if (sd->doing_config) + { + sd->redo_config = 1; + return; + } x = sd->x; y = sd->y; @@ -1532,6 +1528,12 @@ _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd) evas_object_move(obj, xx, yy); evas_object_resize(obj, bi->w, bi->h); } + sd->doing_config = 0; + if (sd->redo_config) + { + _e_gadcon_layout_smart_reconfigure(sd); + sd->redo_config = 0; + } } static void diff --git a/src/modules/start/Makefile.am b/src/modules/start/Makefile.am index bf2df5082..fc4a7f5fe 100644 --- a/src/modules/start/Makefile.am +++ b/src/modules/start/Makefile.am @@ -20,9 +20,7 @@ INCLUDES = -I. \ pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) pkg_LTLIBRARIES = module.la module_la_SOURCES = e_mod_main.c \ - e_mod_main.h \ - e_mod_config.c \ - e_mod_config.h + e_mod_main.h module_la_LIBADD = @e_libs@ @dlopen_libs@ module_la_LDFLAGS = -module -avoid-version module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/start/e_mod_config.c b/src/modules/start/e_mod_config.c deleted file mode 100644 index ce0098fcf..000000000 --- a/src/modules/start/e_mod_config.c +++ /dev/null @@ -1,101 +0,0 @@ -#include "e.h" -#include "e_mod_main.h" -#include "e_mod_config.h" -#include "config.h" - -typedef struct _Cfg_File_Data Cfg_File_Data; - -struct _E_Config_Dialog_Data -{ - int allow_overlap; -}; - -struct _Cfg_File_Data -{ - E_Config_Dialog *cfd; - char *file; -}; - -/* Protos */ -static void *_create_data(E_Config_Dialog *cfd); -static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); -static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); - -void -_config_start_module(E_Container *con, Start *start) -{ - E_Config_Dialog *cfd; - E_Config_Dialog_View *v; - - v = E_NEW(E_Config_Dialog_View, 1); - - v->create_cfdata = _create_data; - v->free_cfdata = _free_data; - v->basic.apply_cfdata = _basic_apply_data; - v->basic.create_widgets = _basic_create_widgets; - - cfd = e_config_dialog_new(con, _("Start Module Configuration"), NULL, 0, v, start); -} - -static void -_fill_data(Start *s, E_Config_Dialog_Data *cfdata) -{ - cfdata->allow_overlap = s->conf->allow_overlap; -} - -static void * -_create_data(E_Config_Dialog *cfd) -{ - E_Config_Dialog_Data *cfdata; - Start *s; - - s = cfd->data; - cfdata = E_NEW(E_Config_Dialog_Data, 1); - _fill_data(s, cfdata); - return cfdata; -} - -static void -_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) -{ - free(cfdata); -} - -static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) -{ - Evas_Object *o, *of, *ob; - Start *s; - - s = cfd->data; - _fill_data(s, cfdata); - - o = e_widget_list_add(evas, 0, 0); - of = e_widget_framelist_add(evas, _("Extras"), 0); - ob = e_widget_check_add(evas, _("Allow windows to overlap this gadget"), &(cfdata->allow_overlap)); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 1, 0.5); - - return o; -} - -static int -_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) -{ - Start *s; - - s = cfd->data; - e_border_button_bindings_ungrab_all(); - - if (cfdata->allow_overlap && !s->conf->allow_overlap) - s->conf->allow_overlap = 1; - else if (!cfdata->allow_overlap && s->conf->allow_overlap) - s->conf->allow_overlap = 0; - - e_border_button_bindings_grab_all(); - e_config_save_queue(); - - _start_cb_config_updated(s); - return 1; -} diff --git a/src/modules/start/e_mod_config.h b/src/modules/start/e_mod_config.h deleted file mode 100644 index e733f3cd1..000000000 --- a/src/modules/start/e_mod_config.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifdef E_TYPEDEFS -#else -#ifndef E_MOD_CONFIG_H -#define E_MOD_CONFIG_H -#include "e_mod_main.h" - -void _config_start_module(E_Container *con, Start *start); - -#endif -#endif diff --git a/src/modules/start/e_mod_main.c b/src/modules/start/e_mod_main.c index 51be5fb6b..f5e6e383f 100644 --- a/src/modules/start/e_mod_main.c +++ b/src/modules/start/e_mod_main.c @@ -3,28 +3,142 @@ */ #include "e.h" #include "e_mod_main.h" -#include "e_mod_config.h" -//#include "e_int_menus.h" -static Start *_start_new(void); -static Start_Face *_start_face_new(Start *s, E_Container *con); -static void _start_free(Start *e); -static void _start_face_free(Start_Face *face); -static void _start_face_disable(Start_Face *e); -static void _start_config_menu_new(Start *e); -static void _start_face_menu_new(Start_Face *face); -static void _start_face_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi); -static void _start_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change); -static void _start_face_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _start_menu_cb_post_deactivate(void *data, E_Menu *m); +/***************************************************************************/ +/**/ +/* gadcon requirements */ +static E_Gadcon_Client *_gc_init(E_Gadcon *gc, char *name, char *id); +static void _gc_shutdown(E_Gadcon_Client *gcc); +static void _gc_orient(E_Gadcon_Client *gcc); +/* and actually define the gadcon class that this module provides (just 1) */ +static const E_Gadcon_Client_Class _gadcon_class = +{ + GADCON_CLIENT_CLASS_VERSION, + "start", + { + _gc_init, _gc_shutdown, _gc_orient + } +}; +/**/ +/***************************************************************************/ -static void _start_face_cb_menu_configure(void *data, E_Menu *m, E_Menu_Item *mi); -static void _start_cb_update_policy(void *data); +/***************************************************************************/ +/**/ +/* actual module specifics */ -static int button_count; -static E_Config_DD *conf_edd; -static E_Config_DD *conf_face_edd; +typedef struct _Instance Instance; +struct _Instance +{ + E_Gadcon_Client *gcc; + Evas_Object *o_button; + E_Menu *main_menu; +}; + +static void _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _menu_cb_post(void *data, E_Menu *m); + +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, char *name, char *id) +{ + Evas_Object *o; + E_Gadcon_Client *gcc; + Instance *inst; + + printf("CREATE START GADCON %s %s\n", name, id); + inst = E_NEW(Instance, 1); + + o = edje_object_add(gc->evas); + e_theme_edje_object_set(o, "base/theme/modules/start", "modules/start/main"); + edje_object_signal_emit(o, "passive", ""); + + gcc = e_gadcon_client_new(gc, name, id, o); + gcc->data = inst; + + inst->gcc = gcc; + inst->o_button = o; + inst->main_menu = NULL; + + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, + _button_cb_mouse_down, inst); + /* FIXME: add callback to resize - and based off one dimension, request + * another to be the same */ + e_gadcon_client_size_request(gcc, 32, 32); + e_gadcon_client_min_size_set(gcc, 16, 16); + return gcc; +} + +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst; + + inst = gcc->data; + free(inst); +} + +static void +_gc_orient(E_Gadcon_Client *gcc) +{ + Instance *inst; + + inst = gcc->data; + printf("OREINT to %i\n", gcc->gadcon->orient); +} +/**/ +/***************************************************************************/ + +/***************************************************************************/ +/**/ +static void +_button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Instance *inst; + Evas_Event_Mouse_Down *ev; + + inst = data; + ev = event_info; + if (ev->button == 1) + { + Evas_Coord x, y, w, h; + + /* FIXME: need a way of getting screen-relative coords */ + evas_object_geometry_get(inst->o_button, &x, &y, &w, &h); + if (!inst->main_menu) + inst->main_menu = e_int_menus_main_new(); + if (inst->main_menu) + { + e_menu_post_deactivate_callback_set(inst->main_menu, + _menu_cb_post, + inst); + /* FIXME: need a way of getting gadcon zone */ + e_menu_activate_mouse(inst->main_menu, + e_util_zone_current_get(e_manager_current_get()), + x, y, w, h, + E_MENU_POP_DIRECTION_AUTO, ev->timestamp); + edje_object_signal_emit(inst->o_button, "active", ""); + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL); + } + } +} + +static void +_menu_cb_post(void *data, E_Menu *m) +{ + Instance *inst; + + inst = data; + if (!inst->main_menu) return; + edje_object_signal_emit(inst->o_button, "passive", ""); + e_object_del(E_OBJECT(inst->main_menu)); + inst->main_menu = NULL; +} +/**/ +/***************************************************************************/ + +/***************************************************************************/ +/**/ +/* module setup */ EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, @@ -34,34 +148,20 @@ EAPI E_Module_Api e_modapi = EAPI void * e_modapi_init(E_Module *m) { - Start *e; - - /* Create the button */ - e = _start_new(); - m->config_menu = e->config_menu; - return e; + e_gadcon_provider_register(&_gadcon_class); + return NULL; } EAPI int e_modapi_shutdown(E_Module *m) { - Start *e; - - if (m->config_menu) m->config_menu = NULL; - - e = m->data; - if (e) _start_free(e); + e_gadcon_provider_unregister(&_gadcon_class); return 1; } EAPI int e_modapi_save(E_Module *m) { - Start *e; - - e = m->data; - e_config_domain_save("module.start", conf_edd, e->conf); - return 1; } @@ -86,359 +186,7 @@ e_modapi_about(E_Module *m) int e_modapi_config(E_Module *m) { - Start *s; - Start_Face *face; - - s = m->data; - if (!s) return 0; - if (!s->faces) return 0; - - face = s->faces->data; - if (!face) return 0; - - _config_start_module(e_container_current_get(e_manager_current_get()), s); - return 1; + return 0; } - -static Start * -_start_new(void) -{ - Start *e; - Evas_List *managers, *l, *l2, *cl; - E_Menu_Item *mi; - - button_count = 0; - e = E_NEW(Start, 1); - if (!e) return NULL; - - conf_face_edd = E_CONFIG_DD_NEW("Start_Config_Face", Config_Face); -#undef T -#undef D -#define T Config_Face -#define D conf_face_edd - E_CONFIG_VAL(D, T, enabled, UCHAR); - - conf_edd = E_CONFIG_DD_NEW("Start_Config", Config); -#undef T -#undef D -#define T Config -#define D conf_edd - E_CONFIG_LIST(D, T, faces, conf_face_edd); - E_CONFIG_VAL(D, T, allow_overlap, INT); - - e->conf = e_config_domain_load("module.start", conf_edd); - if (!e->conf) - { - e->conf = E_NEW(Config, 1); - e->conf->allow_overlap = 0; - } - E_CONFIG_LIMIT(e->conf->allow_overlap, 0, 1); - - _start_config_menu_new(e); - - managers = e_manager_list(); - cl = e->conf->faces; - for (l = managers; l; l = l->next) - { - E_Manager *man; - - man = l->data; - for (l2 = man->containers; l2; l2 = l2->next) - { - E_Container *con; - Start_Face *face; - - con = l2->data; - face = _start_face_new(e, con); - if (face) - { - face->start = e; - e->faces = evas_list_append(e->faces, face); - /* Config */ - if (!cl) - { - face->conf = E_NEW(Config_Face, 1); - face->conf->enabled = 1; - e->conf->faces = evas_list_append(e->conf->faces, face->conf); - } - else - { - face->conf = cl->data; - cl = cl->next; - } - - /* Menu */ - /* This menu must be initialized after conf */ - _start_face_menu_new(face); - - mi = e_menu_item_new(e->config_menu); - e_menu_item_label_set(mi, _("Configuration")); - e_menu_item_callback_set(mi, _start_face_cb_menu_configure, face); - - mi = e_menu_item_new(e->config_menu); - e_menu_item_label_set(mi, con->name); - - e_menu_item_submenu_set(mi, face->menu); - - /* Setup */ - if (!face->conf->enabled) _start_face_disable(face); - } - } - } - return e; -} - -static Start_Face * -_start_face_new(Start *s, E_Container *con) -{ - Start_Face *face; - Evas_Object *o; - E_Gadman_Policy policy; - - face = E_NEW(Start_Face, 1); - if (!face) return NULL; - - face->con = con; - e_object_ref(E_OBJECT(con)); - - evas_event_freeze(con->bg_evas); - o = edje_object_add(con->bg_evas); - face->button_object = o; - - e_theme_edje_object_set(o, "base/theme/modules/start", "modules/start/main"); - edje_object_signal_emit(o, "passive", ""); - evas_object_show(o); - - o = evas_object_rectangle_add(con->bg_evas); - face->event_object = o; - evas_object_layer_set(o, 2); - evas_object_repeat_events_set(o, 1); - evas_object_color_set(o, 0, 0, 0, 0); - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _start_face_cb_mouse_down, face); - evas_object_show(o); - - face->gmc = e_gadman_client_new(con->gadman); - e_gadman_client_domain_set(face->gmc, "module.start", button_count++); - - policy = E_GADMAN_POLICY_ANYWHERE | - E_GADMAN_POLICY_HMOVE | - E_GADMAN_POLICY_VMOVE | - E_GADMAN_POLICY_HSIZE | - E_GADMAN_POLICY_VSIZE; - - if (s->conf->allow_overlap == 0) - policy &= ~E_GADMAN_POLICY_ALLOW_OVERLAP; - else - policy |= E_GADMAN_POLICY_ALLOW_OVERLAP; - - e_gadman_client_policy_set(face->gmc, policy); - - e_gadman_client_min_size_set(face->gmc, 4, 4); - e_gadman_client_max_size_set(face->gmc, 512, 512); - e_gadman_client_auto_size_set(face->gmc, 40, 40); - e_gadman_client_align_set(face->gmc, 0.0, 1.0); - e_gadman_client_aspect_set(face->gmc, 1.0, 1.0); - e_gadman_client_resize(face->gmc, 40, 40); - e_gadman_client_change_func_set(face->gmc, _start_face_cb_gmc_change, face); - e_gadman_client_load(face->gmc); - - evas_event_thaw(con->bg_evas); - - return face; -} - -static void -_start_face_menu_new(Start_Face *face) -{ - E_Menu *mn; - E_Menu_Item *mi; - - mn = e_menu_new(); - face->menu = mn; - - /* Enabled */ - /* - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Enabled")); - e_menu_item_check_set(mi, 1); - if (face->conf->enabled) e_menu_item_toggle_set(mi, 1); - e_menu_item_callback_set(mi, _clock_face_cb_menu_enabled, face); - */ - - /* Edit */ - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Configuration")); - e_menu_item_callback_set(mi, _start_face_cb_menu_configure, face); - - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Edit Mode")); - e_menu_item_callback_set(mi, _start_face_cb_menu_edit, face); - -} - -static void -_start_free(Start *e) -{ - Evas_List *list; - - E_CONFIG_DD_FREE(conf_edd); - E_CONFIG_DD_FREE(conf_face_edd); - - for (list = e->faces; list; list = list->next) - _start_face_free(list->data); - evas_list_free(e->faces); - - e_object_del(E_OBJECT(e->config_menu)); - - evas_list_free(e->conf->faces); - free(e->conf); - free(e); -} - -static void -_start_face_free(Start_Face *face) -{ - e_object_unref(E_OBJECT(face->con)); - e_object_del(E_OBJECT(face->gmc)); - evas_object_del(face->button_object); - evas_object_del(face->event_object); - e_object_del(E_OBJECT(face->menu)); - if (face->main_menu) e_object_del(E_OBJECT(face->main_menu)); - - free(face->conf); - free(face); - button_count--; -} - -static void -_start_config_menu_new(Start *e) -{ - e->config_menu = e_menu_new(); -} - -static void -_start_face_disable(Start_Face *e) -{ - e->conf->enabled = 0; - evas_object_hide(e->button_object); - evas_object_hide(e->event_object); - e_config_save_queue(); -} - -static void -_start_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) -{ - Start_Face *e; - Evas_Coord x, y, w, h; - - e = data; - switch (change) - { - case E_GADMAN_CHANGE_MOVE_RESIZE: - e_gadman_client_geometry_get(e->gmc, &x, &y, &w, &h); - evas_object_move(e->button_object, x, y); - evas_object_move(e->event_object, x, y); - evas_object_resize(e->button_object, w, h); - evas_object_resize(e->event_object, w, h); - break; - case E_GADMAN_CHANGE_RAISE: - evas_object_raise(e->button_object); - evas_object_raise(e->event_object); - break; - case E_GADMAN_CHANGE_EDGE: - case E_GADMAN_CHANGE_ZONE: - /* FIXME: Must we do something here? */ - break; - } -} - -static void -_start_face_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi) -{ - Start_Face *face; - - face = data; - e_gadman_mode_set(face->gmc->gadman, E_GADMAN_MODE_EDIT); -} - -static void -_start_face_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - Start_Face *face; - Evas_Event_Mouse_Down *ev; - - face = data; - ev = event_info; - if (ev->button == 3) - { - e_menu_activate_mouse(face->menu, e_zone_current_get(face->con), - ev->output.x, ev->output.y, 1, 1, - E_MENU_POP_DIRECTION_AUTO, ev->timestamp); - e_util_container_fake_mouse_up_all_later(face->con); - } - else if (ev->button == 1) - { - Evas_Coord x, y, w, h; - - e_gadman_client_geometry_get(face->gmc, &x, &y, &w, &h); - if (!face->main_menu) - face->main_menu = e_int_menus_main_new(); - e_menu_post_deactivate_callback_set(face->main_menu, _start_menu_cb_post_deactivate, face); - e_menu_activate_mouse(face->main_menu, e_zone_current_get(face->con), - x, y, w, h, - E_MENU_POP_DIRECTION_AUTO, ev->timestamp); - e_util_container_fake_mouse_up_all_later(face->con); - edje_object_signal_emit(face->button_object, "active", ""); - } -} - -static void -_start_menu_cb_post_deactivate(void *data, E_Menu *m) -{ - Start_Face *face; - - face = data; - if (!face->main_menu) return; - edje_object_signal_emit(face->button_object, "passive", ""); - e_object_del(E_OBJECT(face->main_menu)); - face->main_menu = NULL; -} - -void -_start_cb_config_updated(void *data) -{ - _start_cb_update_policy(data); -} - -void -_start_face_cb_menu_configure(void *data, E_Menu *m, E_Menu_Item *mi) -{ - Start_Face *face; - - face = (Start_Face*)data; - if (!face) return; - _config_start_module(face->con, face->start); -} - -static void -_start_cb_update_policy(void *data) -{ - Start *s; - Start_Face *sf; - Evas_List *l; - E_Gadman_Policy policy; - - s = data; - for (l = s->faces; l; l = l->next) - { - sf = l->data; - policy = sf->gmc->policy; - - if (s->conf->allow_overlap == 0) - policy &= E_GADMAN_POLICY_ALLOW_OVERLAP; - else - policy |= E_GADMAN_POLICY_ALLOW_OVERLAP; - e_gadman_client_policy_set(sf->gmc , policy); - } -} - +/**/ +/***************************************************************************/ diff --git a/src/modules/start/e_mod_main.h b/src/modules/start/e_mod_main.h index 7edac6e03..4e5acc824 100644 --- a/src/modules/start/e_mod_main.h +++ b/src/modules/start/e_mod_main.h @@ -1,45 +1,7 @@ #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H -typedef struct _Config Config; -typedef struct _Config_Face Config_Face; -typedef struct _Start Start; -typedef struct _Start_Face Start_Face; - -struct _Config -{ - Evas_List *faces; - int allow_overlap; -}; - -struct _Config_Face -{ - unsigned char enabled; -}; - -struct _Start -{ - Evas_List *faces; - E_Menu *config_menu; - - Config *conf; -}; - -struct _Start_Face -{ - E_Container *con; - E_Menu *menu; - E_Menu *main_menu; - Start *start; - - Config_Face *conf; - - Evas_Object *button_object; - Evas_Object *event_object; - - E_Gadman_Client *gmc; -}; - +/* standard module api calls e looks for */ EAPI extern E_Module_Api e_modapi; EAPI void *e_modapi_init (E_Module *m); @@ -49,6 +11,4 @@ EAPI int e_modapi_info (E_Module *m); EAPI int e_modapi_about (E_Module *m); EAPI int e_modapi_config (E_Module *m); -void _start_cb_config_updated(void *data); - #endif