diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 938593a96..229f8674e 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -940,7 +940,7 @@ static int _e_border_cb_window_destroy(void *data, int ev_type, void *ev) e = ev; bd = e_border_find_by_client_window(e->win); if (!bd) return 1; - + e_border_hide(bd); e_object_del(E_OBJECT(bd)); return 1; } @@ -950,6 +950,7 @@ _e_border_cb_window_hide(void *data, int ev_type, void *ev) { E_Border *bd; Ecore_X_Event_Window_Hide *e; + int was_iconic = 0, was_visible = 0; // printf("in hide cb\n"); bd = data; @@ -962,8 +963,10 @@ _e_border_cb_window_hide(void *data, int ev_type, void *ev) return 1; } /* Don't delete hidden or iconified windows */ - if (!(bd->iconic) && (bd->visible)) e_object_del(E_OBJECT(bd)); - + was_iconic = bd->iconic; + was_visible = bd->visible; + e_border_hide(bd); + if (!(was_iconic) && (was_visible)) e_object_del(E_OBJECT(bd)); return 1; } @@ -978,6 +981,7 @@ _e_border_cb_window_reparent(void *data, int ev_type, void *ev) bd = e_border_find_by_client_window(e->win); if (!bd) return 1; if (e->parent == bd->client.shell_win) return 1; + e_border_hide(bd); e_object_del(E_OBJECT(bd)); return 1; } @@ -1485,6 +1489,7 @@ _e_border_cb_signal_action(void *data, Evas_Object *obj, const char *emission, c ecore_x_kill(bd->client.win); ecore_x_sync(); // ecore_x_window_del(bd->client.win); + e_border_hide(bd); e_object_del(E_OBJECT(bd)); } } @@ -2780,6 +2785,7 @@ _e_border_menu_cb_close(void *data, E_Menu *m, E_Menu_Item *mi) ecore_x_kill(bd->client.win); ecore_x_sync(); // ecore_x_window_del(bd->client.win); + e_border_hide(bd); e_object_del(E_OBJECT(bd)); } } diff --git a/src/bin/e_gadman.c b/src/bin/e_gadman.c index 683bfb0cc..f9aef6309 100644 --- a/src/bin/e_gadman.c +++ b/src/bin/e_gadman.c @@ -5,6 +5,7 @@ /* local subsystem functions */ static void _e_gadman_free(E_Gadman *gm); +static void _e_gadman_client_free(E_Gadman_Client *gmc); /* externally accessible functions */ int @@ -30,9 +31,117 @@ e_gadman_new(E_Container *con) return gm; } +E_Gadman_Client * +e_gadman_client_new(E_Gadman *gm) +{ + E_Gadman_Client *gmc; + E_OBJECT_CHECK_RETURN(gm, NULL); + + gmc = E_OBJECT_ALLOC(E_Gadman_Client, _e_gadman_client_free); + if (!gmc) return NULL; + gmc->gadman = gm; + gmc->policy = E_GADMAN_POLICY_ANYWHERE; + gmc->minw = 1; + gmc->minh = 1; + gmc->maxw = 0; + gmc->maxh = 0; + gmc->ax = 0.0; + gmc->ay = 1.0; + gmc->mina = 0.0; + gmc->maxa = 9999999.0; + gm->clients = evas_list_append(gm->clients, gmc); + return gmc; +} + +void +e_gadman_client_domain_set(E_Gadman_Client *gmc, char *domain, int instance) +{ + E_OBJECT_CHECK(gmc); + if (gmc->domain) free(gmc->domain); + gmc->domain = strdup(domain); + gmc->instance = instance; +} + +void +e_gadman_client_save(E_Gadman_Client *gmc, char *domain, int instance) +{ + E_OBJECT_CHECK(gmc); +} + +void +e_gadman_client_load(E_Gadman_Client *gmc, char *domain, int instance) +{ + E_OBJECT_CHECK(gmc); +} + +void +e_gadman_client_policy_set(E_Gadman_Client *gmc, E_Gadman_Policy pol) +{ + E_OBJECT_CHECK(gmc); + gmc->policy = pol; +} + +void +e_gadman_client_min_size_set(E_Gadman_Client *gmc, Evas_Coord minw, Evas_Coord minh) +{ + E_OBJECT_CHECK(gmc); + gmc->minw = minw; + gmc->minh = minh; +} + +void +e_gadman_client_max_size_set(E_Gadman_Client *gmc, Evas_Coord maxw, Evas_Coord maxh) +{ + E_OBJECT_CHECK(gmc); + gmc->maxw = maxw; + gmc->maxh = maxh; +} + +void +e_gadman_client_align_set(E_Gadman_Client *gmc, double xalign, double yalign) +{ + E_OBJECT_CHECK(gmc); + gmc->ax = xalign; + gmc->ay = yalign; +} + +void +e_gadman_client_aspect_set(E_Gadman_Client *gmc, double mina, double maxa) +{ + E_OBJECT_CHECK(gmc); + gmc->mina = mina; + gmc->maxa = maxa; +} + +void +e_gadman_client_geometry_get(E_Gadman_Client *gmc, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + E_OBJECT_CHECK(gmc); + if (x) *x = gmc->x; + if (y) *y = gmc->y; + if (w) *w = gmc->w; + if (h) *h = gmc->h; +} + +void +e_gadman_client_change_func_set(E_Gadman_Client *gmc, void (*func) (void *data, E_Gadman_Client *gmc, E_Gadman_Change change), void *data) +{ + E_OBJECT_CHECK(gmc); + gmc->func = func; + gmc->data = data; +} + /* local subsystem functions */ static void _e_gadman_free(E_Gadman *gm) { free(gm); } + +static void +_e_gadman_client_free(E_Gadman_Client *gmc) +{ + gmc->gadman->clients = evas_list_remove(gmc->gadman->clients, gmc); + if (gmc->domain) free(gmc->domain); + free(gmc); +} diff --git a/src/bin/e_gadman.h b/src/bin/e_gadman.h index bcdcce234..a9e3535d9 100644 --- a/src/bin/e_gadman.h +++ b/src/bin/e_gadman.h @@ -3,20 +3,26 @@ typedef enum _E_Gadman_Policy { /* type */ - E_GADMAN_ANYWHERE = 0, - E_GADMAN_EDGES = 1, - E_GADMAN_LEFT_EDGE = 2, - E_GADMAN_RIGHT_EDGE = 3, - E_GADMAN_TOP_EDGE = 4, - E_GADMAN_BOTTOM_EDGE = 5, + E_GADMAN_POLICY_ANYWHERE = 0, + E_GADMAN_POLICY_EDGES = 1, + E_GADMAN_POLICY_LEFT_EDGE = 2, + E_GADMAN_POLICY_RIGHT_EDGE = 3, + E_GADMAN_POLICY_TOP_EDGE = 4, + E_GADMAN_POLICY_BOTTOM_EDGE = 5, /* extra flags */ - E_GADMAN_FIXED_ZONE = 1 << 8, - E_GADMAN_HSIZE = 1 << 9, - E_GADMAN_VSIZE = 1 << 10, - E_GADMAN_HMOVE = 1 << 11, - E_GADMAN_VMOVE = 1 << 12 + E_GADMAN_POLICY_FIXED_ZONE = 1 << 8, + E_GADMAN_POLICY_HSIZE = 1 << 9, + E_GADMAN_POLICY_VSIZE = 1 << 10, + E_GADMAN_POLICY_HMOVE = 1 << 11, + E_GADMAN_POLICY_VMOVE = 1 << 12 } E_Gadman_Policy; +typedef enum _E_Gadman_Change +{ + E_GADMAN_CHANGE_MOVE, + E_GADMAN_CHANGE_RESIZE, +} E_Gadman_Change; + typedef struct _E_Gadman E_Gadman; typedef struct _E_Gadman_Client E_Gadman_Client; @@ -27,7 +33,6 @@ typedef struct _E_Gadman_Client E_Gadman_Client; struct _E_Gadman { E_Object e_obj_inherit; - E_Container *container; Evas_List *clients; }; @@ -35,18 +40,34 @@ struct _E_Gadman struct _E_Gadman_Client { E_Object e_obj_inherit; - E_Gadman *gadman; + + Evas_Object *control_object; + char *domain; + int instance; + E_Gadman_Policy policy; + Evas_Coord x, y, w, h; + Evas_Coord minw, minh, maxw, maxh; + double ax, ay; + double mina, maxa; + void (*func) (void *data, E_Gadman_Client *gmc, E_Gadman_Change change); + void *data; }; EAPI int e_gadman_init(void); EAPI int e_gadman_shutdown(void); EAPI E_Gadman *e_gadman_new(E_Container *con); EAPI E_Gadman_Client *e_gadman_client_new(E_Gadman *gm); +EAPI void e_gadman_client_domain_set(E_Gadman_Client *gmc, char *domain, int instance); +EAPI void e_gadman_client_save(E_Gadman_Client *gmc, char *domain, int instance); +EAPI void e_gadman_client_load(E_Gadman_Client *gmc, char *domain, int instance); EAPI void e_gadman_client_policy_set(E_Gadman_Client *gmc, E_Gadman_Policy pol); EAPI void e_gadman_client_min_size_set(E_Gadman_Client *gmc, Evas_Coord minw, Evas_Coord minh); -EAPI void e_gadman_client_max_size_set(E_Gadman_Client *gmc, Evas_Coord minw, Evas_Coord minh); -EAPI void e_gadman_client_default_align_set(E_Gadman_Client *gmc, double xalign, double yalign); - +EAPI void e_gadman_client_max_size_set(E_Gadman_Client *gmc, Evas_Coord maxw, Evas_Coord maxh); +EAPI void e_gadman_client_align_set(E_Gadman_Client *gmc, double xalign, double yalign); +EAPI void e_gadman_client_aspect_set(E_Gadman_Client *gmc, double mina, double maxa); +EAPI void e_gadman_client_geometry_get(E_Gadman_Client *gmc, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); +EAPI void e_gadman_client_change_func_set(E_Gadman_Client *gmc, void (*func) (void *data, E_Gadman_Client *gmc, E_Gadman_Change change), void *data); + #endif #endif