diff --git a/src/bin/e_bg.c b/src/bin/e_bg.c index 7e06e34d1..7696810d9 100644 --- a/src/bin/e_bg.c +++ b/src/bin/e_bg.c @@ -10,55 +10,55 @@ static void _e_bg_signal(void *data, Evas_Object *obj, const char *emission, con /* externally accessible functions */ EAPI const char * -e_bg_file_get(E_Zone *zone, E_Desk *desk) +e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y) { Evas_List *l, *ll, *entries; int ok; int current_spec; const char *bgfile = ""; - - if (!zone) zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); - ok = 0; current_spec = 0; /* how specific the setting is - we want the least general one that applies */ - /* look for desk specific background. if desk is NULL this is skipped */ - for (l = e_config->desktop_backgrounds; desk && l; l = l->next) + /* look for desk specific background. */ + if (container_num >= 0 || zone_num >= 0 || desk_x >= 0 || desk_y >= 0) { - E_Config_Desktop_Background *cfbg; - int spec; - - cfbg = l->data; - if ((cfbg->container >= 0) && (zone->container->num != cfbg->container)) continue; - if ((cfbg->zone >= 0) && (zone->num != cfbg->zone)) continue; - if ((cfbg->desk_x >= 0) && (cfbg->desk_x != desk->x)) continue; - if ((cfbg->desk_y >= 0) && (cfbg->desk_y != desk->y)) continue; - - spec = 0; - if (cfbg->container >= 0) spec++; - if (cfbg->zone >= 0) spec++; - if (cfbg->desk_x >= 0) spec++; - if (cfbg->desk_y >= 0) spec++; - - if (spec <= current_spec) continue; - - entries = edje_file_collection_list(cfbg->file); - if (entries) + for (l = e_config->desktop_backgrounds; l; l = l->next) { - for (ll = entries; ll; ll = ll->next) + E_Config_Desktop_Background *cfbg; + int spec; + + cfbg = l->data; + + spec = 0; + if (cfbg->container == container_num) spec++; + else if (cfbg->container >= 0) continue; + if (cfbg->zone == zone_num) spec++; + else if (cfbg->zone >= 0) continue; + if (cfbg->desk_x == desk_x) spec++; + else if (cfbg->desk_x >= 0) continue; + if (cfbg->desk_y == desk_y) spec++; + else if (cfbg->desk_y >= 0) continue; + + if (spec <= current_spec) continue; + + entries = edje_file_collection_list(cfbg->file); + if (entries) { - if (!strcmp(ll->data, "e/desktop/background")) + for (ll = entries; ll; ll = ll->next) { - bgfile = cfbg->file; - current_spec = spec; - ok = 1; + if (!strcmp(ll->data, "e/desktop/background")) + { + bgfile = cfbg->file; + current_spec = spec; + ok = 1; + } } + edje_file_collection_list_free(entries); } - edje_file_collection_list_free(entries); } } - /* fall back to default bg for zone */ + /* fall back to default */ if (!ok) { entries = edje_file_collection_list(e_config->desktop_default_background); @@ -89,13 +89,18 @@ e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition) Evas_Object *o; const char *bgfile = ""; const char *trans = ""; + E_Desk *desk; if (transition == E_BG_TRANSITION_START) trans = e_config->transition_start; else if (transition == E_BG_TRANSITION_DESK) trans = e_config->transition_desk; else if (transition == E_BG_TRANSITION_CHANGE) trans = e_config->transition_change; if ((!trans) || (strlen(trans) < 1)) transition = E_BG_TRANSITION_NONE; - bgfile = e_bg_file_get(zone, e_desk_current_get(zone)); + desk = e_desk_current_get(zone); + if (desk) + bgfile = e_bg_file_get(zone->container->num, zone->num, desk->x, desk->y); + else + bgfile = e_bg_file_get(zone->container->num, zone->num, -1, -1); if (zone->bg_object) { diff --git a/src/bin/e_bg.h b/src/bin/e_bg.h index 594844f09..f1e433446 100644 --- a/src/bin/e_bg.h +++ b/src/bin/e_bg.h @@ -14,7 +14,7 @@ typedef enum { #ifndef E_BG_H #define E_BG_H -EAPI const char *e_bg_file_get(E_Zone *zone, E_Desk *desk); +EAPI const char *e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y); EAPI void e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition); EAPI void e_bg_add(int container, int zone, int desk_x, int desk_y, char *file); EAPI void e_bg_del(int container, int zone, int desk_x, int desk_y); diff --git a/src/bin/e_widget.c b/src/bin/e_widget.c index 1f7349d54..82a77c2da 100644 --- a/src/bin/e_widget.c +++ b/src/bin/e_widget.c @@ -140,7 +140,7 @@ e_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj) printf("----------EEEEEK! dupe sub obj is a sub obj!\n"); abort(); } - */ + */ sd->subobjs = evas_list_append(sd->subobjs, sobj); if (!sd->child_can_focus) { diff --git a/src/bin/e_widget_desk_preview.c b/src/bin/e_widget_desk_preview.c index a28fb7fd9..3c4a061f3 100644 --- a/src/bin/e_widget_desk_preview.c +++ b/src/bin/e_widget_desk_preview.c @@ -2,6 +2,10 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ +/* + * XXX need to detect when bg's change and update + * XXX thumb doesn't properly change size + */ #include "e.h" typedef struct _E_Widget_Data E_Widget_Data; @@ -13,35 +17,18 @@ struct _E_Widget_Data Evas_List *desks; int w, h; + int cur_x, cur_y; /* currently drawn */ int desk_count_x, desk_count_y; }; - -static void -_e_wid_desks_free(E_Widget_Data *wd) +typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data; +struct _E_Widget_Desk_Data { - Evas_List *l; - for (l = wd->desks; l; l = l->next) - { - Evas_Object *desk = l->data; - e_widget_sub_object_del(wd->obj, desk); - evas_object_del(desk); - } - evas_list_free(wd->desks); - wd->desks = NULL; - if (wd->table) - { - e_widget_sub_object_del(wd->obj, wd->table); - evas_object_del(wd->table); - } - wd->table = NULL; - if (wd->aspect) - { - e_widget_sub_object_del(wd->obj, wd->aspect); - evas_object_del(wd->aspect); - } - wd->aspect = NULL; -} + Evas_Object *thumb; + int x, y; +}; + +static void _e_wid_reconfigure(E_Widget_Data *wd); static void _e_wid_del_hook(Evas_Object *obj) @@ -51,47 +38,95 @@ _e_wid_del_hook(Evas_Object *obj) wd = e_widget_data_get(obj); if (!wd) return; - _e_wid_desks_free(wd); + evas_list_free(wd->desks); free(wd); } -/* - * XXX break this into num_desks_set and _reconfigure calls - * XXX don't completely redraw on change just add/del rows/columns and update min sizes - */ +static void +_e_wid_desk_del_hook(Evas_Object *obj) +{ + E_Widget_Desk_Data *dd; + + dd = e_widget_data_get(obj); + if (!dd) return; + + free(dd); +} + void e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny) { E_Widget_Data *wd; - Evas_Object *o; - int x, y; - int aw, ah; /* available */ - int mw, mh; /* min size for each desk */ - int tw, th; /* size to thumb at */ - E_Zone *zone; wd = e_widget_data_get(obj); if (!wd) return; wd->desk_count_x = nx; wd->desk_count_y = ny; + _e_wid_reconfigure(wd); +} - _e_wid_desks_free(wd); +Evas_Object * +e_widget_deskpreview_desk_add(Evas *evas, E_Zone *zone, int x, int y, int tw, int th) +{ + Evas_Object *overlay; + Evas_Object *obj, *o; + const char *bgfile; + E_Widget_Desk_Data *dd = NULL; + + + bgfile = e_bg_file_get(zone->container->num, zone->num, x, y); + + /* wrap desks in a widget (to set min size) */ + obj = e_widget_add(evas); + + dd = calloc(1, sizeof(E_Widget_Desk_Data)); + e_widget_data_set(obj, dd); + dd->x = x; + dd->y = y; + + e_widget_del_hook_set(obj, _e_wid_desk_del_hook); + + o = edje_object_add(evas); + e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/deskpreview/desk"); + e_widget_resize_object_set(obj, o); + evas_object_show(o); + e_widget_sub_object_add(obj, o); + overlay = o; + + o = e_thumb_icon_add(evas); + e_icon_fill_inside_set(o, 0); + e_thumb_icon_file_set(o, bgfile, "e/desktop/background"); + e_thumb_icon_size_set(o, tw, th); + edje_object_part_swallow(overlay, "e.swallow.content", o); + e_thumb_icon_begin(o); + evas_object_show(o); + e_widget_sub_object_add(obj, o); + dd->thumb = o; + + return obj; +} + + +static void +_e_wid_reconfigure(E_Widget_Data *wd) +{ + Evas_List *l, *delete = NULL; + Evas_Object *o; + int x, y; + int aw, ah; /* available */ + int mw, mh; /* min size for each desk */ + int tw, th; /* size to thumb at */ + int nx, ny; + E_Zone *zone; + + if (wd->desk_count_x == wd->cur_x && wd->desk_count_y == wd->cur_y) return; + + nx = wd->desk_count_x; + ny = wd->desk_count_y; zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); - o = e_widget_aspect_add(evas_object_evas_get(obj), zone->w * nx, zone->h * ny); - e_widget_resize_object_set(obj, o); - e_widget_sub_object_add(obj, o); - evas_object_show(o); - wd->aspect = o; - - o = e_widget_table_add(evas_object_evas_get(obj), 1); - e_widget_sub_object_add(obj, o); - evas_object_show(o); - e_widget_aspect_child_set(wd->aspect, o); - wd->table = o; - evas_object_geometry_get(wd->table, NULL, NULL, &aw, &ah); if (ny > nx) @@ -120,45 +155,50 @@ e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny) tw = 300; th = (tw * zone->h) / zone->w; + for (l = wd->desks; l; l = l->next) + { + Evas_Object *dw = l->data; + E_Widget_Desk_Data *dd = e_widget_data_get(dw); + if (dd->x < nx && dd->y < ny) + { + e_widget_min_size_set(dw, mw, mh); + e_widget_table_object_repack(wd->table, dw, dd->x, dd->y, 1, 1, 1, 1, 1, 1); + e_thumb_icon_size_set(dd->thumb, tw, th); + e_thumb_icon_begin(dd->thumb); /* XXX this isn't working - never ggetting new thumb */ + } + else + { + delete = evas_list_append(delete, dw); + } + } + while (delete) + { + Evas_Object *dw = delete->data; + e_widget_table_unpack(wd->table, dw); + evas_object_del(dw); + wd->desks = evas_list_remove(wd->desks, dw); + delete = evas_list_remove_list(delete, delete); + } + for (y = 0; y < ny; y++) { - for (x = 0; x < nx; x++) + int sx; + if (y >= wd->cur_y) sx = 0; + else sx = wd->cur_x; + for (x = sx; x < nx; x++) { - Evas_Object *overlay; Evas_Object *dw; - const char *bgfile; - E_Desk *desk = NULL; - if (x < zone->desk_x_count && y < zone->desk_y_count) - desk = zone->desks[x + (y * zone->desk_x_count)]; - bgfile = e_bg_file_get(zone, desk); - - /* wrap desks in a widget (to set min size) */ - dw = e_widget_add(evas_object_evas_get(obj)); + dw = e_widget_deskpreview_desk_add(evas_object_evas_get(wd->obj), zone, x, y, tw, th); e_widget_min_size_set(dw, mw, mh); - o = edje_object_add(evas_object_evas_get(obj)); - e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/deskpreview/desk"); - e_widget_resize_object_set(dw, o); - e_widget_sub_object_add(dw, o); - - evas_object_show(o); - e_widget_sub_object_add(dw, o); - overlay = o; - - o = e_thumb_icon_add(evas_object_evas_get(obj)); - e_icon_fill_inside_set(o, 0); - e_thumb_icon_file_set(o, bgfile, "e/desktop/background"); - e_thumb_icon_size_set(o, tw, th); - edje_object_part_swallow(overlay, "e.swallow.content", o); - e_thumb_icon_begin(o); - evas_object_show(o); - e_widget_sub_object_add(dw, o); - e_widget_table_object_append(wd->table, dw, x, y, 1, 1, 1, 1, 1, 1); wd->desks = evas_list_append(wd->desks, dw); } } + + wd->cur_x = wd->desk_count_x; + wd->cur_y = wd->desk_count_y; } Evas_Object * @@ -167,6 +207,7 @@ e_widget_desk_preview_add(Evas *evas, int nx, int ny) Evas_Object *obj, *o; E_Widget_Data *wd; Evas_Coord iw, ih; + E_Zone *zone; obj = e_widget_add(evas); wd = calloc(1, sizeof(E_Widget_Data)); @@ -175,6 +216,19 @@ e_widget_desk_preview_add(Evas *evas, int nx, int ny) e_widget_data_set(obj, wd); e_widget_del_hook_set(obj, _e_wid_del_hook); + zone = e_zone_current_get(e_container_current_get(e_manager_current_get())); + o = e_widget_aspect_add(evas, zone->w * nx, zone->h * ny); + e_widget_resize_object_set(wd->obj, o); + e_widget_sub_object_add(wd->obj, o); + evas_object_show(o); + wd->aspect = o; + + o = e_widget_table_add(evas, 1); + e_widget_sub_object_add(wd->obj, o); + evas_object_show(o); + e_widget_aspect_child_set(wd->aspect, o); + wd->table = o; + e_widget_desk_preview_num_desks_set(obj, nx, ny); return obj; diff --git a/src/bin/e_widget_table.c b/src/bin/e_widget_table.c index adbf5c7bd..ff9e97558 100644 --- a/src/bin/e_widget_table.c +++ b/src/bin/e_widget_table.c @@ -81,6 +81,13 @@ e_widget_table_object_repack(Evas_Object *obj, Evas_Object *sobj, int col, int r e_widget_min_size_set(obj, mw, mh); } +EAPI void +e_widget_table_unpack(Evas_Object *obj, Evas_Object *sobj) +{ + e_widget_sub_object_del(obj, sobj); + e_table_unpack(sobj); +} + static void _e_wid_del_hook(Evas_Object *obj) { diff --git a/src/bin/e_widget_table.h b/src/bin/e_widget_table.h index 2e905cd03..fa66b788e 100644 --- a/src/bin/e_widget_table.h +++ b/src/bin/e_widget_table.h @@ -9,6 +9,7 @@ EAPI Evas_Object *e_widget_table_add(Evas *evas, int homogenous); EAPI void e_widget_table_object_append(Evas_Object *obj, Evas_Object *sobj, int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int expand_w, int expand_h); EAPI void e_widget_table_object_repack(Evas_Object *obj, Evas_Object *sobj, int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int expand_w, int expand_h); +EAPI void e_widget_table_unpack(Evas_Object *obj, Evas_Object *sobj); #endif #endif