diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 2f49325fe..4f92b27e5 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -150,7 +150,7 @@ e_sys.h \ e_obj_dialog.h \ e_widget_aspect.h \ e_filereg.h \ -e_widget_desk_preview.h \ +e_widget_deskpreview.h \ e_fm_prop.h \ e_mouse.h \ e_order.h \ @@ -289,7 +289,7 @@ e_color_dialog.c \ e_sys.c \ e_obj_dialog.c \ e_widget_aspect.c \ -e_widget_desk_preview.c \ +e_widget_deskpreview.c \ e_filereg.c \ e_fm_prop.c \ e_mouse.c \ diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 1a399e99f..4f2187d78 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -120,7 +120,7 @@ #include "e_obj_dialog.h" #include "e_filereg.h" #include "e_widget_aspect.h" -#include "e_widget_desk_preview.h" +#include "e_widget_deskpreview.h" #include "e_fm_prop.h" #include "e_mouse.h" #include "e_order.h" diff --git a/src/bin/e_widget_desk_preview.c b/src/bin/e_widget_desk_preview.c deleted file mode 100644 index 0b1dc7923..000000000 --- a/src/bin/e_widget_desk_preview.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 - */ - -#include "e.h" - -typedef struct _E_Widget_Data E_Widget_Data; -struct _E_Widget_Data -{ - Evas_Object *obj; - Evas_Object *aspect; - Evas_Object *table; - Eina_List *desks; - - Ecore_Event_Handler *update_handler; - - int w, h; - int cur_x, cur_y; /* currently drawn */ - int desk_count_x, desk_count_y; -}; - -typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data; -struct _E_Widget_Desk_Data -{ - Evas_Object *thumb; - int container, zone; - int x, y; -}; - -static void _e_wid_reconfigure(E_Widget_Data *wd); -static void _e_wid_desk_cb_config(void *data, Evas *e, Evas_Object *obj, void *event_info); -static int _e_wid_cb_bg_update(void *data, int type, void *event); - -static void -_e_wid_del_hook(Evas_Object *obj) -{ - E_Widget_Data *wd; - Eina_List *l; - Evas_Object *o; - - wd = e_widget_data_get(obj); - if (!wd) return; - - if (wd->update_handler) ecore_event_handler_del(wd->update_handler); - EINA_LIST_FOREACH(wd->desks, l, o) - { - e_thumb_icon_end(o); - } - eina_list_free(wd->desks); - free(wd); -} - -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); -} - -EAPI void -e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny) -{ - E_Widget_Data *wd; - - wd = e_widget_data_get(obj); - if (!wd) return; - - wd->desk_count_x = nx; - wd->desk_count_y = ny; - _e_wid_reconfigure(wd); -} - -EAPI 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->container = zone->container->num; - dd->zone = zone->num; - 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; - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_desk_cb_config, dd); - - 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) -{ - Eina_List *l, *delete = NULL; - Evas_Object *dw; - 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())); - - evas_object_geometry_get(wd->table, NULL, NULL, &aw, &ah); - - if (ny > nx) - { - mh = ah / ny; - mw = (mh * zone->w) / zone->h; - } - else - { - mw = aw / nx; - mh = (mw * zone->h) / zone->w; - } - /* this happens when aw == 0 */ - if (!mw) - { - mw = 10; - mh = (mw * zone->h) / zone->w; - } - e_widget_aspect_aspect_set(wd->aspect, mw * nx, mh * ny); - - if (mw < 50) - tw = 50; - else if (mw < 150) - tw = 150; - else - tw = 300; - th = (tw * zone->h) / zone->w; - - EINA_LIST_FOREACH(wd->desks, l, dw) - { - E_Widget_Desk_Data *dd = e_widget_data_get(dw); - if (dd->x < nx && dd->y < ny) - { - e_widget_size_min_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_rethumb(dd->thumb); - } - else - { - delete = eina_list_append(delete, dw); - } - } - EINA_LIST_FREE(delete, dw) - { - e_widget_table_unpack(wd->table, dw); - evas_object_del(dw); - wd->desks = eina_list_remove(wd->desks, dw); - } - - for (y = 0; y < ny; y++) - { - int sx; - if (y >= wd->cur_y) sx = 0; - else sx = wd->cur_x; - for (x = sx; x < nx; x++) - { - Evas_Object *dw; - - dw = e_widget_deskpreview_desk_add(evas_object_evas_get(wd->obj), zone, x, y, tw, th); - e_widget_size_min_set(dw, mw, mh); - - e_widget_table_object_append(wd->table, dw, x, y, 1, 1, 1, 1, 1, 1); - wd->desks = eina_list_append(wd->desks, dw); - } - } - - wd->cur_x = wd->desk_count_x; - wd->cur_y = wd->desk_count_y; -} - -Evas_Object * -e_widget_desk_preview_add(Evas *evas, int nx, int ny) -{ - Evas_Object *obj, *o; - E_Widget_Data *wd; - E_Zone *zone; - - obj = e_widget_add(evas); - wd = calloc(1, sizeof(E_Widget_Data)); - - wd->obj = obj; - 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); - - wd->update_handler = ecore_event_handler_add(E_EVENT_BG_UPDATE, _e_wid_cb_bg_update, wd); - - return obj; -} - -static void -_e_wid_desk_cb_config(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - E_Widget_Desk_Data *dd; - Evas_Event_Mouse_Down *ev; - - dd = data; - ev = event_info; - if (ev->button == 1) - { - E_Container *con; - char buf[256]; - - con = e_container_current_get(e_manager_current_get()); - snprintf(buf, sizeof(buf), "%i %i %i %i", - dd->container, dd->zone, dd->x, dd->y); - e_configure_registry_call("internal/desk", con, buf); - } -} - -static int -_e_wid_cb_bg_update(void *data, int type, void *event) -{ - E_Event_Bg_Update *ev; - E_Widget_Data *wd; - Eina_List *l; - Evas_Object *o; - - if (type != E_EVENT_BG_UPDATE) return 1; - - wd = data; - ev = event; - - EINA_LIST_FOREACH(wd->desks, l, o) - { - E_Widget_Desk_Data *dd; - dd = e_widget_data_get(o); - - if (!dd) - continue; - - if (((ev->container < 0) || (dd->container == ev->container)) && - ((ev->zone < 0) || (dd->zone == ev->zone)) && - ((ev->desk_x < 0) || (dd->x == ev->desk_x)) && - ((ev->desk_y < 0) || (dd->y == ev->desk_y))) - { - const char *bgfile = e_bg_file_get(dd->container, dd->zone, dd->x, dd->y); - e_thumb_icon_file_set(dd->thumb, bgfile, "e/desktop/background"); - e_thumb_icon_rethumb(dd->thumb); - } - } - return 1; -} diff --git a/src/bin/e_widget_desk_preview.h b/src/bin/e_widget_desk_preview.h deleted file mode 100644 index fc0543c76..000000000 --- a/src/bin/e_widget_desk_preview.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef E_WIDGET_DESK_PREVIEW_H -#define E_WIDGET_DESK_PREVIEW_H - -EAPI Evas_Object *e_widget_desk_preview_add(Evas *evas, int nx, int ny); -EAPI void e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny); - -#endif diff --git a/src/bin/e_widget_deskpreview.c b/src/bin/e_widget_deskpreview.c new file mode 100644 index 000000000..75d79a04b --- /dev/null +++ b/src/bin/e_widget_deskpreview.c @@ -0,0 +1,198 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "e.h" + +typedef struct _E_Widget_Data E_Widget_Data; +struct _E_Widget_Data +{ + Evas_Object *obj, *table; + Eina_List *desks; + int w, h, dx, dy, cx, cy; +}; +typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data; +struct _E_Widget_Desk_Data +{ + Evas_Object *icon, *thumb; + int zone, con, x, y; +}; + +/* local function prototypes */ +static void _e_wid_del_hook(Evas_Object *obj); +static void _e_wid_desk_del_hook(Evas_Object *obj); +static void _e_wid_reconfigure(E_Widget_Data *wd); +static void _e_wid_desk_cb_config(void *data, Evas *evas, Evas_Object *obj, void *event); +static void _e_wid_cb_resize(void *data, Evas *evas, Evas_Object *obj, void *event); + +EAPI Evas_Object * +e_widget_deskpreview_add(Evas *evas, int nx, int ny) +{ + Evas_Object *obj; + E_Widget_Data *wd; + + obj = e_widget_add(evas); + wd = E_NEW(E_Widget_Data, 1); + wd->obj = obj; + wd->dx = nx; + wd->dy = ny; + e_widget_data_set(obj, wd); + e_widget_del_hook_set(obj, _e_wid_del_hook); + + wd->table = evas_object_table_add(evas); + evas_object_table_homogeneous_set(wd->table, EINA_TRUE); + evas_object_table_align_set(wd->table, 0.5, 0.5); + e_widget_resize_object_set(wd->obj, wd->table); + evas_object_show(wd->table); + e_widget_sub_object_add(wd->obj, wd->table); + + e_widget_deskpreview_num_desks_set(obj, wd->dx, wd->dy); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, + _e_wid_cb_resize, NULL); + + return obj; +} + +EAPI void +e_widget_deskpreview_num_desks_set(Evas_Object *obj, int nx, int ny) +{ + E_Widget_Data *wd; + + if (!(wd = e_widget_data_get(obj))) return; + wd->dx = nx; + wd->dy = ny; + _e_wid_reconfigure(wd); +} + +EAPI Evas_Object * +e_widget_deskpreview_desk_add(Evas_Object *obj, E_Zone *zone, int x, int y, int w, int h) +{ + E_Widget_Desk_Data *dd; + const char *bgfile; + + bgfile = e_bg_file_get(zone->container->num, zone->num, x, y); + + dd = E_NEW(E_Widget_Desk_Data, 1); + dd->con = zone->container->num; + dd->zone = zone->num; + dd->x = x; + dd->y = y; + + dd->icon = e_icon_add(evas_object_evas_get(obj)); + evas_object_data_set(dd->icon, "desk_data", dd); + e_icon_fill_inside_set(dd->icon, EINA_FALSE); + e_icon_file_edje_set(dd->icon, bgfile, "e/desktop/background"); + evas_object_size_hint_min_set(dd->icon, w, h); + evas_object_size_hint_max_set(dd->icon, w, h); + evas_object_resize(dd->icon, w, h); + evas_object_show(dd->icon); + + evas_object_event_callback_add(dd->icon, EVAS_CALLBACK_MOUSE_DOWN, + _e_wid_desk_cb_config, dd); + + return dd->icon; +} + +/* local function prototypes */ +static void +_e_wid_del_hook(Evas_Object *obj) +{ + E_Widget_Data *wd; + + if (!(wd = e_widget_data_get(obj))) return; + + E_FREE(wd); +} + +static void +_e_wid_desk_del_hook(Evas_Object *obj) +{ + +} + +static void +_e_wid_reconfigure(E_Widget_Data *wd) +{ + Eina_List *l, *del = NULL; + Evas_Object *dw; + E_Zone *zone; + int tw, th, mw, mh, y; + + zone = e_util_zone_current_get(e_manager_current_get()); + + evas_object_geometry_get(wd->table, NULL, NULL, &tw, &th); + + /* TODO: Make these values an aspect of zone */ + mw = (tw / wd->dx); + mh = (th / wd->dy); + + EINA_LIST_FOREACH(wd->desks, l, dw) + { + E_Widget_Desk_Data *dd; + + if (!(dd = evas_object_data_get(dw, "desk_data"))) continue; + if ((dd->x < wd->dx) && (dd->y < wd->dy)) + { + evas_object_size_hint_min_set(dw, mw, mh); + evas_object_size_hint_max_set(dw, mw, mh); + evas_object_resize(dw, mw, mh); + } + else + del = eina_list_append(del, dw); + } + EINA_LIST_FREE(del, dw) + { + evas_object_table_unpack(wd->table, dw); + evas_object_del(dw); + wd->desks = eina_list_remove(wd->desks, dw); + } + + for (y = 0; y < wd->dy; y++) + { + int x, sx; + + if (y >= wd->cy) sx = 0; + else sx = wd->cx; + for (x = sx; x < wd->dx; x++) + { + Evas_Object *dw; + + dw = e_widget_deskpreview_desk_add(wd->obj, zone, x, y, mw, mh); + evas_object_table_pack(wd->table, dw, x, y, 1, 1); + wd->desks = eina_list_append(wd->desks, dw); + } + } + + wd->cx = wd->dx; + wd->cy = wd->dy; +} + +static void +_e_wid_desk_cb_config(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + E_Widget_Desk_Data *dd; + Evas_Event_Mouse_Down *ev; + + ev = event; + if (!(dd = data)) return; + if (ev->button == 1) + { + E_Container *con; + char buff[256]; + + con = e_container_current_get(e_manager_current_get()); + snprintf(buff, sizeof(buff), "%i %i %i %i", + dd->con, dd->zone, dd->x, dd->y); + e_configure_registry_call("internal/desk", con, buff); + } +} + +static void +_e_wid_cb_resize(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + E_Widget_Data *wd; + + if (!(wd = e_widget_data_get(obj))) return; + _e_wid_reconfigure(wd); +} diff --git a/src/bin/e_widget_deskpreview.h b/src/bin/e_widget_deskpreview.h new file mode 100644 index 000000000..f4caae4af --- /dev/null +++ b/src/bin/e_widget_deskpreview.h @@ -0,0 +1,8 @@ +#ifndef E_WIDGET_DESK_PREVIEW_H +#define E_WIDGET_DESK_PREVIEW_H + +EAPI Evas_Object *e_widget_deskpreview_add(Evas *evas, int nx, int ny); +EAPI void e_widget_deskpreview_num_desks_set(Evas_Object *obj, int nx, int ny); +EAPI Evas_Object *e_widget_deskpreview_desk_add(Evas_Object *obj, E_Zone *zone, int x, int y, int w, int h); + +#endif