Allow setting bg of desktops from within virtual desktop dialog.

For now, left click on the small desktop.
We'll probably add a menu on click, with the ability to set the desktop name or set bg.


SVN revision: 26700
This commit is contained in:
rephorm 2006-10-20 03:23:46 +00:00 committed by rephorm
parent 73a150fbf8
commit 80478f40d8
6 changed files with 263 additions and 75 deletions

View File

@ -5,10 +5,13 @@
/* local subsystem functions */
static void _e_bg_signal(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _e_bg_event_bg_update_free(void *data, void *event);
/* local subsystem globals */
static int _e_bg_reg_files = 0;
EAPI int E_EVENT_BG_UPDATE = 0;
/* externally accessible functions */
EAPI int
e_bg_init(void)
@ -26,6 +29,7 @@ e_bg_init(void)
e_filereg_register(cfbg->file);
}
E_EVENT_BG_UPDATE = ecore_event_type_new();
return 1;
}
@ -48,16 +52,18 @@ e_bg_shutdown(void)
return 1;
}
EAPI const char *
e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y)
/**
* Find the configuration for a given desktop background
* Use -1 as a wild card for each parameter.
* The most specific match will be returned
*/
EAPI const E_Config_Desktop_Background *
e_bg_config_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 = "";
ok = 0;
current_spec = 0; /* how specific the setting is - we want the least general one that applies */
E_Config_Desktop_Background *bg = NULL;
int current_spec = 0; /* how specific the setting is - we want the least general one that applies */
/* look for desk specific background. */
if (container_num >= 0 || zone_num >= 0 || desk_x >= 0 || desk_y >= 0)
@ -88,24 +94,38 @@ e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y)
{
if (!strcmp(ll->data, "e/desktop/background"))
{
bgfile = cfbg->file;
bg = cfbg;
current_spec = spec;
ok = 1;
}
}
edje_file_collection_list_free(entries);
}
}
}
return bg;
}
EAPI const char *
e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y)
{
const E_Config_Desktop_Background *cfbg;
Evas_List *l, *entries;
const char *bgfile = "";
int ok = 0;
cfbg = e_bg_config_get(container_num, zone_num, desk_x, desk_y);
/* fall back to default */
if (!ok)
if (cfbg)
bgfile = cfbg->file;
else
{
entries = edje_file_collection_list(e_config->desktop_default_background);
if (entries)
{
for (ll = entries; ll; ll = ll->next)
for (l = entries; l; l = l->next)
{
if (!strcmp(ll->data, "e/desktop/background"))
if (!strcmp(l->data, "e/desktop/background"))
{
bgfile = e_config->desktop_default_background;
ok = 1;
@ -119,6 +139,7 @@ e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y)
bgfile = e_theme_edje_file_get("base/theme/background", "e/desktop/background");
}
}
return bgfile;
}
@ -207,25 +228,35 @@ e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition)
EAPI void
e_bg_default_set(char * file)
{
if (e_config->desktop_default_background)
{
e_filereg_deregister(e_config->desktop_default_background);
evas_stringshare_del(e_config->desktop_default_background);
}
E_Event_Bg_Update *ev;
if (file)
{
e_filereg_register(file);
e_config->desktop_default_background = evas_stringshare_add(file);
}
else
e_config->desktop_default_background = NULL;
if (e_config->desktop_default_background)
{
e_filereg_deregister(e_config->desktop_default_background);
evas_stringshare_del(e_config->desktop_default_background);
}
if (file)
{
e_filereg_register(file);
e_config->desktop_default_background = evas_stringshare_add(file);
}
else
e_config->desktop_default_background = NULL;
ev = E_NEW(E_Event_Bg_Update, 1);
ev->container = -1;
ev->zone = -1;
ev->desk_x = -1;
ev->desk_y = -1;
ecore_event_add(E_EVENT_BG_UPDATE, ev, _e_bg_event_bg_update_free, NULL);
}
EAPI void
e_bg_add(int container, int zone, int desk_x, int desk_y, char *file)
{
E_Config_Desktop_Background *cfbg;
E_Event_Bg_Update *ev;
e_bg_del(container, zone, desk_x, desk_y);
cfbg = E_NEW(E_Config_Desktop_Background, 1);
@ -235,13 +266,22 @@ e_bg_add(int container, int zone, int desk_x, int desk_y, char *file)
cfbg->desk_y = desk_y;
cfbg->file = evas_stringshare_add(file);
e_config->desktop_backgrounds = evas_list_append(e_config->desktop_backgrounds, cfbg);
e_filereg_register(cfbg->file);
ev = E_NEW(E_Event_Bg_Update, 1);
ev->container = container;
ev->zone = zone;
ev->desk_x = desk_x;
ev->desk_y = desk_y;
ecore_event_add(E_EVENT_BG_UPDATE, ev, _e_bg_event_bg_update_free, NULL);
}
EAPI void
e_bg_del(int container, int zone, int desk_x, int desk_y)
{
Evas_List *l;
E_Event_Bg_Update *ev;
for (l = e_config->desktop_backgrounds; l; l = l->next)
{
@ -258,6 +298,13 @@ e_bg_del(int container, int zone, int desk_x, int desk_y)
break;
}
}
ev = E_NEW(E_Event_Bg_Update, 1);
ev->container = container;
ev->zone = zone;
ev->desk_x = desk_x;
ev->desk_y = desk_y;
ecore_event_add(E_EVENT_BG_UPDATE, ev, _e_bg_event_bg_update_free, NULL);
}
EAPI void
@ -309,3 +356,8 @@ _e_bg_signal(void *data, Evas_Object *obj, const char *emission, const char *sou
evas_object_show(zone->bg_object);
}
static void
_e_bg_event_bg_update_free(void *data, void *event)
{
free(event);
}

View File

@ -10,19 +10,30 @@ typedef enum {
E_BG_TRANSITION_CHANGE
} E_Bg_Transition;
typedef struct _E_Event_Bg_Update E_Event_Bg_Update;
#else
#ifndef E_BG_H
#define E_BG_H
extern EAPI int E_EVENT_BG_UPDATE;
struct _E_Event_Bg_Update
{
int container;
int zone;
int desk_x;
int desk_y;
};
EAPI int e_bg_init(void);
EAPI int e_bg_shutdown(void);
EAPI const E_Config_Desktop_Background *e_bg_config_get(int container_num, int zone_num, int desk_x, int desk_y);
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);
EAPI void e_bg_default_set(char *file);
EAPI void e_bg_update(void);
#endif
#endif

View File

@ -22,6 +22,7 @@ typedef struct _E_Config_Dialog_Data E_Config_Dialog_Data;
struct _E_Config_Dialog_View
{
int override_auto_apply;
int basic_only;
void *(*create_cfdata) (E_Config_Dialog *cfd);
void (*free_cfdata) (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);

View File

@ -12,6 +12,17 @@ static Evas_Object *_basic_create_widgets (E_Config_Dialog *cfd, Evas *eva
static int _advanced_apply_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_advanced_create_widgets (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
#define E_CONFIG_WALLPAPER_ALL 0
#define E_CONFIG_WALLPAPER_DESK 1
#define E_CONFIG_WALLPAPER_SCREEN 2
struct _E_Config_Wallpaper
{
int specific_config;
int con_num, zone_num;
int desk_x, desk_y;
};
struct _E_Config_Dialog_Data
{
E_Config_Dialog *cfd;
@ -23,9 +34,10 @@ struct _E_Config_Dialog_Data
Evas_Object *o_personal;
Evas_Object *o_system;
int fmdir;
int use_theme_bg;
char *bg;
/* advanced */
int all_this_desk_screen;
/* dialogs */
@ -35,24 +47,49 @@ struct _E_Config_Dialog_Data
EAPI E_Config_Dialog *
e_int_config_wallpaper(E_Container *con)
{
E_Zone *zone;
return e_int_config_wallpaper_desk(-1, -1, -1, -1);
}
EAPI E_Config_Dialog *
e_int_config_wallpaper_desk(int con_num, int zone_num, int desk_x, int desk_y)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
E_Config_Wallpaper *cw;
E_Container *con;
if (e_config_dialog_find("E", "_config_wallpaper_dialog")) return NULL;
v = E_NEW(E_Config_Dialog_View, 1);
cw = E_NEW(E_Config_Wallpaper, 1);
v->create_cfdata = _create_data;
v->free_cfdata = _free_data;
v->basic.apply_cfdata = _basic_apply_data;
v->basic.create_widgets = _basic_create_widgets;
v->advanced.apply_cfdata = _advanced_apply_data;
v->advanced.create_widgets = _advanced_create_widgets;
if (!(con_num == -1 && zone_num == -1 && desk_x == -1 && desk_y == -1))
cw->specific_config = 1;
else
{
v->advanced.apply_cfdata = _advanced_apply_data;
v->advanced.create_widgets = _advanced_create_widgets;
}
v->override_auto_apply = 1;
cw->con_num = con_num;
cw->zone_num = zone_num;
cw->desk_x = desk_x;
cw->desk_y = desk_y;
con = e_container_current_get(e_manager_current_get());
cfd = e_config_dialog_new(con,
_("Wallpaper Settings"),
"E", "_config_wallpaper_dialog",
"enlightenment/background", 0, v, NULL);
"enlightenment/background", 0, v, cw);
return cfd;
}
@ -318,45 +355,52 @@ _cb_gradient(void *data1, void *data2)
static void
_fill_data(E_Config_Dialog_Data *cfdata)
{
E_Zone *z;
E_Desk *d;
Evas_List *l;
char path[4096];
if (e_config->desktop_default_background)
cfdata->bg = strdup(e_config->desktop_default_background);
z = e_zone_current_get(cfdata->cfd->con);
if (!z) return;
d = e_desk_current_get(z);
if (!d) return;
for (l = e_config->desktop_backgrounds; l; l = l->next)
E_Config_Wallpaper *cw;
const E_Config_Desktop_Background *cfbg;
cw = cfdata->cfd->data;
if (cw->specific_config)
{
E_Config_Desktop_Background *cfbg;
cfbg = l->data;
if (((cfbg->container == z->container->num) ||
(cfbg->container < 0)) &&
((cfbg->zone == z->num) ||
(cfbg->zone < 0)) &&
((cfbg->desk_x == d->x) ||
(cfbg->desk_x < 0)) &&
((cfbg->desk_y == d->y) ||
(cfbg->desk_y < 0)))
const char *bg;
/* specific config passed in. set for that only */
bg = e_bg_file_get(cw->con_num, cw->zone_num, cw->desk_x, cw->desk_y);
if (bg) cfdata->bg = strdup(bg);
}
else
{
/* get current desk. advanced mode allows selecting all, screen or desk */
E_Container *c;
E_Zone *z;
E_Desk *d;
c = e_container_current_get(e_manager_current_get());
z = e_zone_current_get(c);
d = e_desk_current_get(z);
cfbg = e_bg_config_get(c->num, z->num, d->x, d->y);
/* if we have a config for this bg, use it. */
if (cfbg)
{
if (cfbg->container >= 0 && cfbg->zone >= 0)
{
if (cfbg->desk_x >= 0 && cfbg->desk_y >= 0)
cfdata->all_this_desk_screen = E_CONFIG_WALLPAPER_DESK;
else
cfdata->all_this_desk_screen = E_CONFIG_WALLPAPER_SCREEN;
}
E_FREE(cfdata->bg);
cfdata->bg = strdup(cfbg->file);
if ((cfbg->container >= 0) ||
(cfbg->zone >= 0))
cfdata->all_this_desk_screen = 2;
if ((cfbg->desk_x >= 0) ||
(cfbg->desk_y >= 0))
cfdata->all_this_desk_screen = 1;
break;
}
}
if (!cfdata->bg) cfdata->use_theme_bg = 1;
if (!cfdata->bg && e_config->desktop_default_background)
cfdata->bg = strdup(e_config->desktop_default_background);
else
cfdata->use_theme_bg = 1;
if (cfdata->bg)
{
snprintf(path, sizeof(path), "%s/data/backgrounds", e_prefix_data_get());
@ -383,6 +427,7 @@ _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
if (cfdata->win_import) e_int_config_wallpaper_del(cfdata->win_import);
if (cfdata->dia_gradient) e_int_config_wallpaper_gradient_del(cfdata->dia_gradient);
E_FREE(cfdata->bg);
E_FREE(cfd->data);
free(cfdata);
}
@ -509,19 +554,33 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
static int
_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
while (e_config->desktop_backgrounds)
E_Config_Wallpaper *cw;
cw = cfd->data;
if (cw->specific_config)
{
E_Config_Desktop_Background *cfbg;
cfbg = e_config->desktop_backgrounds->data;
e_bg_del(cfbg->container, cfbg->zone, cfbg->desk_x, cfbg->desk_y);
/* update a specific config */
e_bg_del(cw->con_num, cw->zone_num, cw->desk_x, cw->desk_y);
e_bg_add(cw->con_num, cw->zone_num, cw->desk_x, cw->desk_y, cfdata->bg);
}
if ((cfdata->use_theme_bg) || (!cfdata->bg))
e_bg_default_set(NULL);
else
e_bg_default_set(cfdata->bg);
cfdata->all_this_desk_screen = 0;
{
/* set the default and nuke individual configs */
while (e_config->desktop_backgrounds)
{
E_Config_Desktop_Background *cfbg;
cfbg = e_config->desktop_backgrounds->data;
e_bg_del(cfbg->container, cfbg->zone, cfbg->desk_x, cfbg->desk_y);
}
if ((cfdata->use_theme_bg) || (!cfdata->bg))
e_bg_default_set(NULL);
else
e_bg_default_set(cfdata->bg);
cfdata->all_this_desk_screen = 0;
}
e_bg_update();
e_config_save_queue();
return 1;
@ -642,11 +701,11 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_framelist_content_align_set(ol, 0.0, 0.0);
rg = e_widget_radio_group_new(&(cfdata->all_this_desk_screen));
o = e_widget_radio_add(evas, _("All Desktops"), 0, rg);
o = e_widget_radio_add(evas, _("All Desktops"), E_CONFIG_WALLPAPER_ALL, rg);
e_widget_framelist_object_append(ol, o);
o = e_widget_radio_add(evas, _("This Desktop"), 1, rg);
o = e_widget_radio_add(evas, _("This Desktop"), E_CONFIG_WALLPAPER_DESK, rg);
e_widget_framelist_object_append(ol, o);
o = e_widget_radio_add(evas, _("This Screen"), 2, rg);
o = e_widget_radio_add(evas, _("This Screen"), E_CONFIG_WALLPAPER_SCREEN, rg);
if (!((e_util_container_zone_number_get(0, 1)) ||
(e_util_container_zone_number_get(1, 0))))
e_widget_disabled_set(o, 1);
@ -683,7 +742,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
}
else
{
if (cfdata->all_this_desk_screen == 0)
if (cfdata->all_this_desk_screen == E_CONFIG_WALLPAPER_ALL)
{
while (e_config->desktop_backgrounds)
{
@ -693,7 +752,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
}
e_bg_default_set(cfdata->bg);
}
else if (cfdata->all_this_desk_screen == 1)
else if (cfdata->all_this_desk_screen == E_CONFIG_WALLPAPER_DESK)
{
e_bg_del(z->container->num, z->num, d->x, d->y);
e_bg_del(z->container->num, -1, d->x, d->y);
@ -702,7 +761,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
e_bg_add(z->container->num, z->num, d->x, d->y, cfdata->bg);
}
else if (cfdata->all_this_desk_screen == 2)
else if (cfdata->all_this_desk_screen == E_CONFIG_WALLPAPER_SCREEN)
{
for (l = e_config->desktop_backgrounds; l; l = l->next)
{

View File

@ -2,11 +2,13 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifdef E_TYPEDEFS
typedef struct _E_Config_Wallpaper E_Config_Wallpaper;
#else
#ifndef E_INT_CONFIG_WALLPAPER_H
#define E_INT_CONFIG_WALLPAPER_H
EAPI E_Config_Dialog *e_int_config_wallpaper(E_Container *con);
EAPI E_Config_Dialog *e_int_config_wallpaper_desk(int con_num, int zone_num, int desk_x, int desk_y);
EAPI void e_int_config_wallpaper_update(E_Config_Dialog *dia, char *file);
EAPI void e_int_config_wallpaper_import_done(E_Config_Dialog *dia);
EAPI void e_int_config_wallpaper_gradient_done(E_Config_Dialog *dia);

View File

@ -15,6 +15,8 @@ struct _E_Widget_Data
Evas_Object *table;
Evas_List *desks;
Ecore_Event_Handler *update_handler;
int w, h;
int cur_x, cur_y; /* currently drawn */
int desk_count_x, desk_count_y;
@ -24,19 +26,32 @@ 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_menu(void *data, Evas_Object *obj, const char *signal, const char *source);
static void _e_wid_cb_bg_update(void *data, int type, void *event);
static void
_e_wid_del_hook(Evas_Object *obj)
{
E_Widget_Data *wd;
Evas_List *l;
wd = e_widget_data_get(obj);
if (!wd) return;
if (wd->update_handler) ecore_event_handler_del(wd->update_handler);
for (l = wd->desks; l; l = l->next)
{
Evas_Object *o;
E_Widget_Desk_Data *dd;
o = l->data;
dd = e_widget_data_get(o);
e_thumb_icon_end(o);
}
evas_list_free(wd->desks);
free(wd);
}
@ -81,6 +96,8 @@ e_widget_deskpreview_desk_add(Evas *evas, E_Zone *zone, int x, int y, int tw, in
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;
@ -92,6 +109,7 @@ e_widget_deskpreview_desk_add(Evas *evas, E_Zone *zone, int x, int y, int tw, in
evas_object_show(o);
e_widget_sub_object_add(obj, o);
overlay = o;
edje_object_signal_callback_add(o, "mouse,down,1", "e.event.menu", _e_wid_desk_cb_menu, dd);
o = e_thumb_icon_add(evas);
e_icon_fill_inside_set(o, 0);
@ -103,6 +121,7 @@ e_widget_deskpreview_desk_add(Evas *evas, E_Zone *zone, int x, int y, int tw, in
e_widget_sub_object_add(obj, o);
dd->thumb = o;
return obj;
}
@ -230,7 +249,51 @@ e_widget_desk_preview_add(Evas *evas, int nx, int ny)
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_menu(void *data, Evas_Object *obj, const char *signal, const char *source)
{
E_Widget_Desk_Data *dd;
dd = data;
/* XXX change this to display a menu with the option to set the desktop name or change the desktop bg */
e_int_config_wallpaper_desk(dd->container, dd->zone, dd->x, dd->y);
}
static void
_e_wid_cb_bg_update(void *data, int type, void *event)
{
E_Event_Bg_Update *ev;
E_Widget_Data *wd;
Evas_List *l;
if (type != E_EVENT_BG_UPDATE) return;
wd = data;
ev = event;
for(l = wd->desks; l; l = l->next)
{
Evas_Object *o;
E_Widget_Desk_Data *dd;
o = l->data;
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);
}
}
}