gadman in. clock module poprted. others need porting.

SVN revision: 13042
This commit is contained in:
Carsten Haitzler 2005-01-21 15:45:56 +00:00
parent f8315b82cb
commit 072e32c609
9 changed files with 338 additions and 159 deletions

1
TODO
View File

@ -41,6 +41,7 @@ ISSUES:
* border show/hide needs to show from top down and hide from bottom up
* restart loses window properties (stickyness)
* restart loses zone and container info
* xrandr root window resize needs to propagate from con to zones and gadman
<add more issues as they are found>

View File

@ -212,6 +212,23 @@ e_container_zone_at_point_get(E_Container *con, int x, int y)
return NULL;
}
E_Zone *
e_container_zone_number_get(E_Container *con, int num)
{
Evas_List *l;
E_OBJECT_CHECK_RETURN(con, NULL);
for (l = con->zones; l; l = l->next)
{
E_Zone *zone;
zone = l->data;
if (zone->num == num)
return zone;
}
return NULL;
}
E_Container_Shape *
e_container_shape_add(E_Container *con)
{

View File

@ -80,6 +80,7 @@ EAPI void e_container_lower(E_Container *con);
EAPI Evas_List *e_container_clients_list_get(E_Container *con);
EAPI E_Zone *e_container_zone_at_point_get(E_Container *con, int x, int y);
EAPI E_Zone *e_container_zone_number_get(E_Container *con, int num);
EAPI E_Container_Shape *e_container_shape_add(E_Container *con);
EAPI void e_container_shape_show(E_Container_Shape *es);

View File

@ -7,15 +7,26 @@
/* re-enter edit mode (cant access root menu) */
/* FIXME: resist can still jump on top of other gads... */
/* FIXME: handle save */
/* FIXME: handle load */
/* FIXME: handle resize resist */
/* local subsystem functions */
typedef struct _Gadman_Client_Config Gadman_Client_Config;
struct _Gadman_Client_Config
{
double ax, ay;
int w, h;
int edge;
int zone;
int use_autow, use_autoh;
};
static void _e_gadman_free(E_Gadman *gm);
static void _e_gadman_client_free(E_Gadman_Client *gmc);
static void _e_gadman_client_edit_begin(E_Gadman_Client *gmc);
static void _e_gadman_client_edit_end(E_Gadman_Client *gmc);
static void _e_gadman_client_overlap_deny(E_Gadman_Client *gmc);
static void _e_gadman_client_down_store(E_Gadman_Client *gmc);
static int _e_gadman_client_is_being_modified(E_Gadman_Client *gmc);
static void _e_gadman_client_geometry_to_align(E_Gadman_Client *gmc);
@ -56,16 +67,33 @@ static void _e_gadman_cb_full_height(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_gadman_cb_auto_height(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_gadman_cb_center_vert(void *data, E_Menu *m, E_Menu_Item *mi);
static E_Config_DD *gadman_config_edd = NULL;
/* externally accessible functions */
int
e_gadman_init(void)
{
gadman_config_edd = E_CONFIG_DD_NEW("Gadman_Client_Config", Gadman_Client_Config);
#undef T
#undef D
#define T Gadman_Client_Config
#define D gadman_config_edd
E_CONFIG_VAL(D, T, ax, DOUBLE);
E_CONFIG_VAL(D, T, ay, DOUBLE);
E_CONFIG_VAL(D, T, w, INT);
E_CONFIG_VAL(D, T, h, INT);
E_CONFIG_VAL(D, T, edge, INT);
E_CONFIG_VAL(D, T, zone, INT);
E_CONFIG_VAL(D, T, use_autow, INT);
E_CONFIG_VAL(D, T, use_autoh, INT);
return 1;
}
int
e_gadman_shutdown(void)
{
E_CONFIG_DD_FREE(gadman_config_edd);
gadman_config_edd = NULL;
return 1;
}
@ -118,13 +146,13 @@ e_gadman_client_new(E_Gadman *gm)
gmc->gadman = gm;
gmc->policy = E_GADMAN_POLICY_ANYWHERE | E_GADMAN_POLICY_HSIZE | E_GADMAN_POLICY_VSIZE | E_GADMAN_POLICY_HMOVE | E_GADMAN_POLICY_VMOVE;
gmc->zone = e_zone_current_get(gm->container);
gmc->edge = E_GADMAN_EDGE_BOTTOM;
gmc->edge = E_GADMAN_EDGE_TOP;
gmc->minw = 1;
gmc->minh = 1;
gmc->maxw = 0;
gmc->maxh = 0;
gmc->ax = 0.0;
gmc->ay = 1.0;
gmc->ay = 0.0;
gmc->mina = 0.0;
gmc->maxa = 9999999.0;
gm->clients = evas_list_append(gm->clients, gmc);
@ -134,8 +162,21 @@ e_gadman_client_new(E_Gadman *gm)
void
e_gadman_client_save(E_Gadman_Client *gmc)
{
Gadman_Client_Config cf;
char buf[1024];
E_OBJECT_CHECK(gmc);
/* save all values */
cf.ax = gmc->ax;
cf.ay = gmc->ay;
cf.w = gmc->w;
cf.h = gmc->h;
cf.edge = gmc->edge;
cf.zone = gmc->zone->num;
cf.use_autow = gmc->use_autow;
cf.use_autoh = gmc->use_autoh;
snprintf(buf, sizeof(buf), "gadman.%s.%i", gmc->domain, gmc->instance);
e_config_domain_save(buf, gadman_config_edd, &cf);
}
void
@ -148,9 +189,55 @@ e_client_gadman_edge_set(E_Gadman_Client *gmc, E_Gadman_Edge edge)
void
e_gadman_client_load(E_Gadman_Client *gmc)
{
Gadman_Client_Config *cf;
char buf[1024];
E_OBJECT_CHECK(gmc);
/* load all the vales */
/* implement all the values */
snprintf(buf, sizeof(buf), "gadman.%s.%i", gmc->domain, gmc->instance);
cf = e_config_domain_load(buf, gadman_config_edd);
if (cf)
{
E_Zone *zone;
E_CONFIG_LIMIT(cf->ax, 0.0, 1.0);
E_CONFIG_LIMIT(cf->ay, 0.0, 1.0);
E_CONFIG_LIMIT(cf->w, 0, 10000);
E_CONFIG_LIMIT(cf->h, 0, 10000);
E_CONFIG_LIMIT(cf->edge, E_GADMAN_EDGE_LEFT, E_GADMAN_EDGE_BOTTOM);
gmc->ax = cf->ax;
gmc->ay = cf->ay;
gmc->w = cf->w;
gmc->h = cf->h;
gmc->edge = cf->edge;
gmc->use_autow = cf->use_autow;
gmc->use_autoh = cf->use_autoh;
zone = e_container_zone_number_get(gmc->zone->container, cf->zone);
if (zone) gmc->zone = zone;
if (gmc->use_autow)
{
gmc->w = gmc->autow;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
}
if (gmc->use_autoh)
{
gmc->h = gmc->autoh;
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
}
if (gmc->w > gmc->zone->w) gmc->w = gmc->zone->w;
if (gmc->h > gmc->zone->h) gmc->h = gmc->zone->h;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
free(cf);
}
_e_gadman_client_overlap_deny(gmc);
e_object_ref(E_OBJECT(gmc));
if (!e_object_del_get(E_OBJECT(gmc)))
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_ZONE);
if (!e_object_del_get(E_OBJECT(gmc)))
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_EDGE);
if (!e_object_del_get(E_OBJECT(gmc)))
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
e_object_unref(E_OBJECT(gmc));
}
void
@ -166,7 +253,16 @@ void
e_gadman_client_zone_set(E_Gadman_Client *gmc, E_Zone *zone)
{
E_OBJECT_CHECK(gmc);
if (zone == gmc->zone) return;
gmc->zone = zone;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
e_object_ref(E_OBJECT(gmc));
if (!e_object_del_get(E_OBJECT(gmc)))
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_ZONE);
if (!e_object_del_get(E_OBJECT(gmc)))
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
e_object_unref(E_OBJECT(gmc));
}
void
@ -180,24 +276,52 @@ void
e_gadman_client_min_size_set(E_Gadman_Client *gmc, Evas_Coord minw, Evas_Coord minh)
{
E_OBJECT_CHECK(gmc);
if ((gmc->minw == minw) && (gmc->minh == minh)) return;
gmc->minw = minw;
gmc->minh = minh;
if (gmc->minw > gmc->w)
{
gmc->w = gmc->minw;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
}
if (gmc->minh > gmc->h)
{
gmc->h = gmc->minh;
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
}
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
}
void
e_gadman_client_max_size_set(E_Gadman_Client *gmc, Evas_Coord maxw, Evas_Coord maxh)
{
E_OBJECT_CHECK(gmc);
if ((gmc->maxw == maxw) && (gmc->maxh == maxh)) return;
gmc->maxw = maxw;
gmc->maxh = maxh;
if (gmc->maxw < gmc->w)
{
gmc->w = gmc->maxw;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
}
if (gmc->maxh < gmc->h)
{
gmc->h = gmc->maxh;
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
}
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
}
void
e_gadman_client_align_set(E_Gadman_Client *gmc, double xalign, double yalign)
{
E_OBJECT_CHECK(gmc);
if ((gmc->ax == xalign) && (gmc->ay == yalign)) return;
gmc->ax = xalign;
gmc->ay = yalign;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
}
void
@ -214,6 +338,31 @@ e_gadman_client_auto_size_set(E_Gadman_Client *gmc, Evas_Coord autow, Evas_Coord
E_OBJECT_CHECK(gmc);
gmc->autow = autow;
gmc->autoh = autoh;
if (gmc->use_autow)
{
gmc->w = gmc->autow;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
}
if (gmc->use_autoh)
{
gmc->h = gmc->autoh;
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
}
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
}
void
e_gadman_client_edge_set(E_Gadman_Client *gmc, E_Gadman_Edge edge)
{
E_OBJECT_CHECK(gmc);
gmc->edge = edge;
}
E_Gadman_Edge
e_gadman_client_edge_get(E_Gadman_Client *gmc)
{
E_OBJECT_CHECK_RETURN(gmc, E_GADMAN_EDGE_TOP);
return gmc->edge;
}
void
@ -226,6 +375,20 @@ e_gadman_client_geometry_get(E_Gadman_Client *gmc, Evas_Coord *x, Evas_Coord *y,
if (h) *h = gmc->h;
}
void
e_gadman_client_resize(E_Gadman_Client *gmc, Evas_Coord w, Evas_Coord h)
{
E_OBJECT_CHECK(gmc);
if ((gmc->w == w) && (gmc->h == h)) return;
gmc->w = w;
if (gmc->w > gmc->zone->w) gmc->w = gmc->zone->w;
gmc->x = gmc->zone->x + ((gmc->zone->w - gmc->w) * gmc->ax);
gmc->h = h;
if (gmc->h > gmc->zone->h) gmc->h = gmc->zone->h;
gmc->y = gmc->zone->y + ((gmc->zone->h - gmc->h) * gmc->ay);
_e_gadman_client_callback_call(gmc, E_GADMAN_CHANGE_MOVE_RESIZE);
}
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)
{
@ -421,6 +584,93 @@ _e_gadman_client_edit_end(E_Gadman_Client *gmc)
gmc->event_object = NULL;
}
static void
_e_gadman_client_overlap_deny(E_Gadman_Client *gmc)
{
Evas_List *l;
Evas_Coord ox, oy;
int ok = 0;
int iterate = 0;
ox = gmc->x;
oy = gmc->y;
ok = 0;
while ((!ok) && (iterate < 1000))
{
for (l = gmc->zone->container->gadman->clients; l; l = l->next)
{
E_Gadman_Client *gmc2;
gmc2 = l->data;
if ((E_SPANS_COMMON(gmc->x, gmc->w, gmc2->x, gmc2->w)) &&
(E_SPANS_COMMON(gmc->y, gmc->h, gmc2->y, gmc2->h)))
{
gmc->x = gmc2->x + gmc2->w;
}
}
if ((gmc->x + gmc->w) > (gmc->zone->x + gmc->zone->w))
gmc->x = gmc->zone->x + gmc->zone->w - gmc->w;
ok = 1;
for (l = gmc->zone->container->gadman->clients; l; l = l->next)
{
E_Gadman_Client *gmc2;
gmc2 = l->data;
if ((E_SPANS_COMMON(gmc->x, gmc->w, gmc2->x, gmc2->w)) &&
(E_SPANS_COMMON(gmc->y, gmc->h, gmc2->y, gmc2->h)))
ok = 0;
}
if (ok) break;
for (l = gmc->zone->container->gadman->clients; l; l = l->next)
{
E_Gadman_Client *gmc2;
gmc2 = l->data;
if ((E_SPANS_COMMON(gmc->x, gmc->w, gmc2->x, gmc2->w)) &&
(E_SPANS_COMMON(gmc->y, gmc->h, gmc2->y, gmc2->h)))
{
gmc->x = gmc2->x - gmc->w;
}
}
if (gmc->x < gmc->zone->x)
gmc->x = gmc->zone->x;
ok = 1;
for (l = gmc->zone->container->gadman->clients; l; l = l->next)
{
E_Gadman_Client *gmc2;
gmc2 = l->data;
if ((E_SPANS_COMMON(gmc->x, gmc->w, gmc2->x, gmc2->w)) &&
(E_SPANS_COMMON(gmc->y, gmc->h, gmc2->y, gmc2->h)))
ok = 0;
}
if (ok) break;
if (gmc->y > (gmc->zone->y + (gmc->zone->h / 2)))
gmc->y -= 8;
else
gmc->y += 8;
if (oy < (gmc->zone->y + (gmc->zone->h / 2)))
{
if ((gmc->y - oy) > (gmc->zone->h / 3))
{
gmc->x = ox;
gmc->y = oy;
break;
}
}
else
{
if ((oy - gmc->y) > (gmc->zone->h / 3))
{
gmc->x = ox;
gmc->y = oy;
break;
}
}
iterate++;
}
}
static void
_e_gadman_client_down_store(E_Gadman_Client *gmc)
{
@ -808,7 +1058,7 @@ _e_gadman_cb_signal_resize_left_go(void *data, Evas_Object *obj, const char *emi
/* limit to max size */
if (gmc->maxw > 0)
{
if (gmc->w > gmc->minw)
if (gmc->w > gmc->maxw)
{
gmc->x -= (gmc->maxw - gmc->w);
gmc->w = gmc->maxw;
@ -942,7 +1192,7 @@ _e_gadman_cb_signal_resize_up_go(void *data, Evas_Object *obj, const char *emiss
/* limit to max size */
if (gmc->maxh > 0)
{
if (gmc->h > gmc->minh)
if (gmc->h > gmc->maxh)
{
gmc->y -= (gmc->maxh - gmc->h);
gmc->h = gmc->maxh;

View File

@ -98,7 +98,10 @@ EAPI void e_gadman_client_max_size_set(E_Gadman_Client *gmc, Evas_Co
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_auto_size_set(E_Gadman_Client *gmc, Evas_Coord autow, Evas_Coord autoh);
EAPI void e_gadman_client_edge_set(E_Gadman_Client *gmc, E_Gadman_Edge edge);
EAPI E_Gadman_Edge e_gadman_client_edge_get(E_Gadman_Client *gmc);
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_resize(E_Gadman_Client *gmc, 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);
EAPI E_Menu *e_gadman_client_menu_new(E_Gadman_Client *gmc);

View File

@ -573,7 +573,7 @@ _e_main_screens_init(void)
i);
return 0;
}
/* FIXME: testing... */
/*
{
E_Gadman_Client *gmc;
@ -593,6 +593,8 @@ _e_main_screens_init(void)
e_gadman_client_auto_size_set(gmc, 50, 200);
e_gadman_client_align_set(gmc, 0.0, 0.5);
e_client_gadman_edge_set(gmc, E_GADMAN_EDGE_LEFT);
e_gadman_client_domain_set(gmc, "test", 0);
e_gadman_client_load(gmc);
gmc = e_gadman_client_new(con->gadman);
gmc->x = 0;
@ -610,6 +612,8 @@ _e_main_screens_init(void)
e_gadman_client_auto_size_set(gmc, 50, 200);
e_gadman_client_align_set(gmc, 0.0, 0.5);
e_client_gadman_edge_set(gmc, E_GADMAN_EDGE_LEFT);
e_gadman_client_domain_set(gmc, "test", 1);
e_gadman_client_load(gmc);
gmc = e_gadman_client_new(con->gadman);
gmc->x = 0;
@ -627,7 +631,10 @@ _e_main_screens_init(void)
e_gadman_client_auto_size_set(gmc, 50, 200);
e_gadman_client_align_set(gmc, 0.0, 0.5);
e_client_gadman_edge_set(gmc, E_GADMAN_EDGE_LEFT);
e_gadman_client_domain_set(gmc, "test", 2);
e_gadman_client_load(gmc);
}
*/
}
free(roots);
ecore_x_sync();

View File

@ -233,7 +233,7 @@ e_resist_container_gadman_position(E_Container *con, Evas_List *skiplist,
int *rx, int *ry)
{
int resist = 1;
int gad_resist = 4800;
int gad_resist = 32;
int dx, dy, d, pd;
int resist_x = 0, resist_y = 0;
Evas_List *l, *ll, *rects = NULL;

View File

@ -14,11 +14,8 @@ static E_Menu *_clock_config_menu_new(Clock *e);
static void _clock_config_menu_del(Clock *e, E_Menu *m);
static void _clock_face_init(Clock_Face *ef);
static void _clock_face_free(Clock_Face *ef);
static void _clock_face_reconfigure(Clock_Face *ef);
static void _clock_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change);
static void _clock_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _clock_cb_face_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _clock_cb_face_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
static int _clock_cb_event_container_resize(void *data, int type, void *event);
/* public module routines. all modules must have these */
void *
@ -68,7 +65,7 @@ save(E_Module *m)
Clock *e;
e = m->data;
e_config_domain_save("module.clock", e->conf_edd, e->conf);
/* e_config_domain_save("module.clock", e->conf_edd, e->conf);*/
return 1;
}
@ -100,28 +97,16 @@ _clock_init(E_Module *m)
e = calloc(1, sizeof(Clock));
if (!e) return NULL;
e->conf_edd = E_CONFIG_DD_NEW("Clock_Config", Config);
#undef T
#undef D
#define T Config
#define D e->conf_edd
E_CONFIG_VAL(D, T, width, INT);
E_CONFIG_VAL(D, T, x, DOUBLE);
E_CONFIG_VAL(D, T, y, DOUBLE);
e->conf = e_config_domain_load("module.clock", e->conf_edd);
if (!e->conf)
{
e->conf = E_NEW(Config, 1);
e->conf->width = 64;
e->conf->x = 0.0;
e->conf->y = 1.0;
}
E_CONFIG_LIMIT(e->conf->width, 2, 256);
E_CONFIG_LIMIT(e->conf->x, 0.0, 1.0);
E_CONFIG_LIMIT(e->conf->y, 0.0, 1.0);
/*
e->conf_edd = E_CONFIG_DD_NEW("Clock_Config", Config);
*
e->conf = e_config_domain_load("module.clock", e->conf_edd);
if (!e->conf)
{
e->conf = E_NEW(Config, 1);
}
*/
managers = e_manager_list();
for (l = managers; l; l = l->next)
{
@ -152,8 +137,7 @@ static void
_clock_shutdown(Clock *e)
{
free(e->conf);
E_CONFIG_DD_FREE(e->conf_edd);
/* E_CONFIG_DD_FREE(e->conf_edd);*/
_clock_face_free(e->face);
free(e);
}
@ -187,14 +171,6 @@ _clock_face_init(Clock_Face *ef)
Evas_Coord ww, hh, bw, bh;
Evas_Object *o;
ef->ev_handler_container_resize =
ecore_event_handler_add(E_EVENT_CONTAINER_RESIZE,
_clock_cb_event_container_resize,
ef);
evas_output_viewport_get(ef->evas, NULL, NULL, &ww, &hh);
ef->fx = ef->clock->conf->x * (ww - ef->clock->conf->width);
ef->fy = ef->clock->conf->y * (hh - ef->clock->conf->width);
evas_event_freeze(ef->evas);
o = edje_object_add(ef->evas);
ef->clock_object = o;
@ -210,48 +186,56 @@ _clock_face_init(Clock_Face *ef)
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, _clock_cb_face_down, ef);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _clock_cb_face_up, ef);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _clock_cb_face_move, ef);
evas_object_show(o);
edje_object_size_min_calc(ef->clock_object, &bw, &bh);
ef->minsize = bh;
ef->minsize = bw;
_clock_face_reconfigure(ef);
ef->gmc = e_gadman_client_new(ef->con->gadman);
e_gadman_client_domain_set(ef->gmc, "module.clock", 0);
e_gadman_client_policy_set(ef->gmc,
E_GADMAN_POLICY_ANYWHERE |
E_GADMAN_POLICY_HMOVE |
E_GADMAN_POLICY_VMOVE |
E_GADMAN_POLICY_HSIZE |
E_GADMAN_POLICY_VSIZE);
e_gadman_client_min_size_set(ef->gmc, 4, 4);
e_gadman_client_max_size_set(ef->gmc, 128, 128);
e_gadman_client_auto_size_set(ef->gmc, 64, 64);
e_gadman_client_align_set(ef->gmc, 0.0, 1.0);
e_gadman_client_resize(ef->gmc, 64, 64);
e_gadman_client_change_func_set(ef->gmc, _clock_cb_gmc_change, ef);
e_gadman_client_load(ef->gmc);
evas_event_thaw(ef->evas);
}
static void
_clock_face_free(Clock_Face *ef)
{
ecore_event_handler_del(ef->ev_handler_container_resize);
e_object_del(E_OBJECT(ef->gmc));
evas_object_del(ef->clock_object);
evas_object_del(ef->event_object);
free(ef);
}
static void
_clock_face_reconfigure(Clock_Face *ef)
_clock_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change)
{
Evas_Coord minw, minh, maxw, maxh, ww, hh;
Clock_Face *ef;
Evas_Coord x, y, w, h;
edje_object_size_min_calc(ef->clock_object, &minw, &maxh);
edje_object_size_max_get(ef->clock_object, &maxw, &minh);
evas_output_viewport_get(ef->evas, NULL, NULL, &ww, &hh);
ef->fx = ef->clock->conf->x * (ww - ef->clock->conf->width);
ef->fy = ef->clock->conf->y * (hh - ef->clock->conf->width);
ef->fw = ef->clock->conf->width;
ef->minsize = minw;
ef->maxsize = maxw;
evas_object_move(ef->clock_object, ef->fx, ef->fy);
evas_object_resize(ef->clock_object, ef->clock->conf->width, ef->clock->conf->width);
evas_object_move(ef->event_object, ef->fx, ef->fy);
evas_object_resize(ef->event_object, ef->clock->conf->width, ef->clock->conf->width);
ef = data;
if (change == E_GADMAN_CHANGE_MOVE_RESIZE)
{
e_gadman_client_geometry_get(ef->gmc, &x, &y, &w, &h);
evas_object_move(ef->clock_object, x, y);
evas_object_move(ef->event_object, x, y);
evas_object_resize(ef->clock_object, w, h);
evas_object_resize(ef->event_object, w, h);
}
else if (change == E_GADMAN_CHANGE_RAISE)
{
evas_object_raise(ef->clock_object);
evas_object_raise(ef->event_object);
}
}
static void
@ -269,81 +253,4 @@ _clock_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
E_MENU_POP_DIRECTION_DOWN);
e_util_container_fake_mouse_up_all_later(ef->con);
}
else if (ev->button == 2)
{
ef->resize = 1;
}
else if (ev->button == 1)
{
ef->move = 1;
}
evas_pointer_canvas_xy_get(e, &ef->xx, &ef->yy);
}
static void
_clock_cb_face_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Up *ev;
Clock_Face *ef;
Evas_Coord ww, hh;
ev = event_info;
ef = data;
ef->move = 0;
ef->resize = 0;
evas_output_viewport_get(ef->evas, NULL, NULL, &ww, &hh);
ef->clock->conf->width = ef->fw;
ef->clock->conf->x = (double)ef->fx / (double)(ww - ef->clock->conf->width);
ef->clock->conf->y = (double)ef->fy / (double)(hh - ef->clock->conf->width);
e_config_save_queue();
}
static void
_clock_cb_face_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Move *ev;
Clock_Face *ef;
Evas_Coord cx, cy, sw, sh;
evas_pointer_canvas_xy_get(e, &cx, &cy);
evas_output_viewport_get(e, NULL, NULL, &sw, &sh);
ev = event_info;
ef = data;
if (ef->move)
{
ef->fx += cx - ef->xx;
ef->fy += cy - ef->yy;
if (ef->fx < 0) ef->fx = 0;
if (ef->fy < 0) ef->fy = 0;
if (ef->fx + ef->fw > sw) ef->fx = sw - ef->fw;
if (ef->fy + ef->fw > sh) ef->fy = sh - ef->fw;
evas_object_move(ef->clock_object, ef->fx, ef->fy);
evas_object_move(ef->event_object, ef->fx, ef->fy);
}
else if (ef->resize)
{
Evas_Coord d;
d = cx - ef->xx;
ef->fw += d;
if (ef->fw < ef->minsize) ef->fw = ef->minsize;
if (ef->fw > ef->maxsize) ef->fw = ef->maxsize;
if (ef->fx + ef->fw > sw) ef->fw = sw - ef->fx;
if (ef->fy + ef->fw > sh) ef->fw = sh - ef->fy;
evas_object_resize(ef->clock_object, ef->fw, ef->fw);
evas_object_resize(ef->event_object, ef->fw, ef->fw);
}
ef->xx = ev->cur.canvas.x;
ef->yy = ev->cur.canvas.y;
}
static int
_clock_cb_event_container_resize(void *data, int type, void *event)
{
Clock_Face *ef;
ef = data;
_clock_face_reconfigure(ef);
return 1;
}

View File

@ -7,8 +7,7 @@ typedef struct _Clock_Face Clock_Face;
struct _Config
{
int width;
double x, y;
int dummy; /* just here to hold space */
};
struct _Clock
@ -16,7 +15,7 @@ struct _Clock
E_Menu *config_menu;
Clock_Face *face;
E_Config_DD *conf_edd;
/* E_Config_DD *conf_edd;*/
Config *conf;
};
@ -29,14 +28,8 @@ struct _Clock_Face
Evas_Object *clock_object;
Evas_Object *event_object;
Evas_Coord minsize, maxsize;
unsigned char move : 1;
unsigned char resize : 1;
Evas_Coord xx, yy;
Evas_Coord fx, fy, fw;
Ecore_Event_Handler *ev_handler_container_resize;
E_Gadman_Client *gmc;
/* Ecore_Event_Handler *ev_handler_container_resize;*/
};
EAPI void *init (E_Module *m);