some more gadman code and make shutdown of borders a little faster :)

SVN revision: 12982
This commit is contained in:
Carsten Haitzler 2005-01-15 15:21:57 +00:00
parent 6e7716f2c1
commit 7f9c92a6e7
3 changed files with 155 additions and 19 deletions

View File

@ -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));
}
}

View File

@ -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);
}

View File

@ -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