diff --git a/src/modules/conf_randr/e_smart_randr.c b/src/modules/conf_randr/e_smart_randr.c index f3e746361..c8305ca5a 100644 --- a/src/modules/conf_randr/e_smart_randr.c +++ b/src/modules/conf_randr/e_smart_randr.c @@ -7,12 +7,13 @@ typedef struct _E_Smart_Data E_Smart_Data; struct _E_Smart_Data { + /* base object */ Evas_Object *o_base; + + /* grid object */ Evas_Object *o_grid; - /* layout object */ - /* Evas_Object *o_layout; */ - + /* virtual size */ Evas_Coord vw, vh; /* visible flag */ @@ -32,6 +33,9 @@ static void _e_smart_hide(Evas_Object *obj); static void _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip); static void _e_smart_clip_unset(Evas_Object *obj); +static void _e_smart_randr_grid_cb_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED); +static void _e_smart_randr_grid_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED); + /* external functions exposed by this widget */ Evas_Object * e_smart_randr_add(Evas *evas) @@ -146,6 +150,7 @@ e_smart_randr_monitors_create(Evas_Object *obj) Ecore_X_Window root = 0; Ecore_X_Randr_Crtc *crtcs; int ncrtcs = 0; + Evas_Coord gx = 0, gy = 0, gw = 0, gh = 0; LOGFN(__FILE__, __LINE__, __FUNCTION__); @@ -160,6 +165,9 @@ e_smart_randr_monitors_create(Evas_Object *obj) /* grab the canvas of the grid object */ evas = evas_object_evas_get(sd->o_grid); + /* get the geometry of the grid */ + evas_object_geometry_get(sd->o_grid, &gx, &gy, &gw, &gh); + /* grab the root window */ root = ecore_x_window_root_first_get(); @@ -199,7 +207,10 @@ e_smart_randr_monitors_create(Evas_Object *obj) evas_object_grid_pack(sd->o_grid, mon, cx, cy, cw, ch); /* tell monitor what the virtual grid is */ - e_smart_monitor_grid_set(mon, sd->o_grid); + e_smart_monitor_grid_set(mon, sd->o_grid, gx, gy, gw, gh); + + /* tell monitor what the grid virtual size is */ + e_smart_monitor_virtual_size_set(mon, sd->vw, sd->vh); /* tell monitor what crtc it uses and current position */ e_smart_monitor_crtc_set(mon, crtcs[i], cx, cy, cw, ch); @@ -252,9 +263,16 @@ _e_smart_add(Evas_Object *obj) "e/conf/randr/main"); evas_object_smart_member_add(sd->o_base, obj); + /* create the virtual grid */ sd->o_grid = evas_object_grid_add(evas); edje_object_part_swallow(sd->o_base, "e.swallow.content", sd->o_grid); + /* setup grid move callback */ + evas_object_event_callback_add(sd->o_grid, EVAS_CALLBACK_MOVE, + _e_smart_randr_grid_cb_move, sd); + evas_object_event_callback_add(sd->o_grid, EVAS_CALLBACK_RESIZE, + _e_smart_randr_grid_cb_resize, sd); + /* set the object's smart data */ evas_object_smart_data_set(obj, sd); } @@ -274,6 +292,15 @@ _e_smart_del(Evas_Object *obj) EINA_LIST_FREE(sd->monitors, mon) evas_object_del(mon); + /* remove grid move callback */ + evas_object_event_callback_del(sd->o_grid, EVAS_CALLBACK_MOVE, + _e_smart_randr_grid_cb_move); + evas_object_event_callback_del(sd->o_grid, EVAS_CALLBACK_RESIZE, + _e_smart_randr_grid_cb_resize); + + /* delete the grid object */ + evas_object_del(sd->o_grid); + /* delete the base object */ evas_object_del(sd->o_base); @@ -387,3 +414,41 @@ _e_smart_clip_unset(Evas_Object *obj) /* unset the clip */ evas_object_clip_unset(sd->o_base); } + +static void +_e_smart_randr_grid_cb_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + E_Smart_Data *sd; + Evas_Coord gx = 0, gy = 0, gw = 0, gh = 0; + Eina_List *l = NULL; + Evas_Object *mon; + + /* try to get the smart data */ + if (!(sd = data)) return; + + /* get the grid geometry */ + evas_object_geometry_get(sd->o_grid, &gx, &gy, &gw, &gh); + + /* loop the monitors and update grid geometry */ + EINA_LIST_FOREACH(sd->monitors, l, mon) + e_smart_monitor_grid_set(mon, sd->o_grid, gx, gy, gw, gh); +} + +static void +_e_smart_randr_grid_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + E_Smart_Data *sd; + Evas_Coord gx = 0, gy = 0, gw = 0, gh = 0; + Eina_List *l = NULL; + Evas_Object *mon; + + /* try to get the smart data */ + if (!(sd = data)) return; + + /* get the grid geometry */ + evas_object_geometry_get(sd->o_grid, &gx, &gy, &gw, &gh); + + /* loop the monitors and update grid geometry */ + EINA_LIST_FOREACH(sd->monitors, l, mon) + e_smart_monitor_grid_set(mon, sd->o_grid, gx, gy, gw, gh); +}