This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository enlightenment.
View the commit online.
commit 3773e52cf2605af437bb1e3b3cf6f8816bb7b54d
Author: Alastair Poole <[email protected]>
AuthorDate: Sat Apr 18 11:15:58 2026 +0100
tasks/ibox: keep iconified previews live via explicit iconic-preview visibility
Add compositor and module changes so iconified previews can stay live instead of
freezing after minimiz.
What changed:
- Add `iconic_preview_visible` refcount + API in `e_comp_object`.
- Make `e_comp_x` hide/show logic honor iconic preview visibility.
- Add `live_preview` config + UI toggle in Tasks and IBox:
“Keep iconified windows updating”.
- Tasks preview popup now prefers frame mirror, with fallback mirror.
- Tasks now separates temporary (popup-hover) and persistent (setting-driven)
live-preview refs to avoid dropping visibility too early.
- Add defaults for new ibox config key in profile sources.
Caveats:
- Off by default; enabling it increases CPU/GPU/power usage.
- X11 path is explicitly handled here (`e_comp_x`).
- Some CSD/self-bordered apps may still appear static when iconified because
the app stops rendering while minimized; mirrors then only show the last frame.
---
data/config/standard/module.ibox.src | 2 +
data/config/tiling/module.ibox.src | 2 +
src/bin/e_comp_object.c | 39 +++++++++++++++--
src/bin/e_comp_object.h | 4 +-
src/bin/e_comp_x.c | 17 +++-----
src/modules/ibox/e_mod_config.c | 29 +++++++++++--
src/modules/ibox/e_mod_main.c | 17 +++++++-
src/modules/ibox/e_mod_main.h | 1 +
src/modules/tasks/e_mod_config.c | 35 ++++++++++++----
src/modules/tasks/e_mod_main.c | 81 +++++++++++++++++++++++++++++++-----
src/modules/tasks/e_mod_main.h | 1 +
11 files changed, 189 insertions(+), 39 deletions(-)
diff --git a/data/config/standard/module.ibox.src b/data/config/standard/module.ibox.src
index 1126554a1..2e4e2a464 100644
--- a/data/config/standard/module.ibox.src
+++ b/data/config/standard/module.ibox.src
@@ -6,6 +6,7 @@ group "IBox_Config" struct {
value "show_zone" int: 1;
value "show_desk" int: 0;
value "icon_label" int: 0;
+ value "live_preview" int: 0;
}
}
group "items" list {
@@ -15,6 +16,7 @@ group "IBox_Config" struct {
value "show_zone" int: 1;
value "show_desk" int: 0;
value "icon_label" int: 0;
+ value "live_preview" int: 0;
}
}
}
diff --git a/data/config/tiling/module.ibox.src b/data/config/tiling/module.ibox.src
index 1126554a1..2e4e2a464 100644
--- a/data/config/tiling/module.ibox.src
+++ b/data/config/tiling/module.ibox.src
@@ -6,6 +6,7 @@ group "IBox_Config" struct {
value "show_zone" int: 1;
value "show_desk" int: 0;
value "icon_label" int: 0;
+ value "live_preview" int: 0;
}
}
group "items" list {
@@ -15,6 +16,7 @@ group "IBox_Config" struct {
value "show_zone" int: 1;
value "show_desk" int: 0;
value "icon_label" int: 0;
+ value "live_preview" int: 0;
}
}
}
diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c
index 55e15a53e..457fc7632 100644
--- a/src/bin/e_comp_object.c
+++ b/src/bin/e_comp_object.c
@@ -103,6 +103,7 @@ typedef struct _E_Comp_Object
unsigned int animating; // it's busy animating
unsigned int failures; //number of consecutive e_pixmap_image_draw() failures
unsigned int force_visible; //number of visible obj_mirror objects
+ unsigned int iconic_preview_visible; //number of forced iconic live previews
Eina_Bool deleted E_BITFIELD; // deleted
Eina_Bool defer_hide E_BITFIELD; // flag to get hide to work on deferred hide
Eina_Bool showing E_BITFIELD; // object is currently in "show" animation
@@ -233,7 +234,7 @@ _e_comp_object_cb_mirror_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
{
E_Comp_Object *cw = data;
- if ((!cw->force_visible) && (!cw->deleted) && (!e_object_is_del(E_OBJECT(cw->ec))))
+ if ((!cw->force_visible) && (!cw->iconic_preview_visible) && (!cw->deleted) && (!e_object_is_del(E_OBJECT(cw->ec))))
evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
cw->force_visible++;
if ((!cw->native) && cw->pending_updates && (!cw->update) && cw->real_hid)
@@ -246,7 +247,7 @@ _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
E_Comp_Object *cw = data;
cw->force_visible--;
- if ((!cw->force_visible) && (!cw->deleted) && (!e_object_is_del(E_OBJECT(cw->ec))))
+ if ((!cw->force_visible) && (!cw->iconic_preview_visible) && (!cw->deleted) && (!e_object_is_del(E_OBJECT(cw->ec))))
evas_object_smart_callback_call(cw->smart_obj, "visibility_normal", cw->ec);
}
@@ -2772,7 +2773,39 @@ E_API Eina_Bool
e_comp_object_mirror_visibility_check(Evas_Object *obj)
{
API_ENTRY EINA_FALSE;
- return !!cw->force_visible;
+ return !!(cw->force_visible || cw->iconic_preview_visible);
+}
+
+E_API Eina_Bool
+e_comp_object_iconic_preview_visibility_check(Evas_Object *obj)
+{
+ API_ENTRY EINA_FALSE;
+ return !!cw->iconic_preview_visible;
+}
+
+E_API void
+e_comp_object_iconic_preview_add(Evas_Object *obj)
+{
+ API_ENTRY;
+
+ if (!cw->ec) return;
+ if ((!cw->force_visible) && (!cw->iconic_preview_visible) &&
+ (!cw->deleted) && (!e_object_is_del(E_OBJECT(cw->ec))))
+ evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
+ cw->iconic_preview_visible++;
+}
+
+E_API void
+e_comp_object_iconic_preview_del(Evas_Object *obj)
+{
+ API_ENTRY;
+
+ if (!cw->ec) return;
+ if (!cw->iconic_preview_visible) return;
+ cw->iconic_preview_visible--;
+ if ((!cw->force_visible) && (!cw->iconic_preview_visible) &&
+ (!cw->deleted) && (!e_object_is_del(E_OBJECT(cw->ec))))
+ evas_object_smart_callback_call(cw->smart_obj, "visibility_normal", cw->ec);
}
/////////////////////////////////////////////////////////
diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h
index 10f4b563f..ac582bfde 100644
--- a/src/bin/e_comp_object.h
+++ b/src/bin/e_comp_object.h
@@ -38,6 +38,9 @@ extern E_API int E_EVENT_COMP_OBJECT_ADD;
E_API void e_comp_object_zoomap_set(Evas_Object *obj, Eina_Bool enabled);
E_API Eina_Bool e_comp_object_mirror_visibility_check(Evas_Object *obj);
+E_API Eina_Bool e_comp_object_iconic_preview_visibility_check(Evas_Object *obj);
+E_API void e_comp_object_iconic_preview_add(Evas_Object *obj);
+E_API void e_comp_object_iconic_preview_del(Evas_Object *obj);
E_API Evas_Object *e_comp_object_client_add(E_Client *ec);
E_API Evas_Object *e_comp_object_util_mirror_add(Evas_Object *obj);
E_API Evas_Object *e_comp_object_util_frame_mirror_add(Evas_Object *obj);
@@ -103,4 +106,3 @@ E_API void e_comp_object_shape_input_update(Evas_Object *obj);
#endif
#endif
-
diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index 0fcf20150..59a9a0211 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -1096,15 +1096,8 @@ _e_comp_x_client_hide(E_Client *ec)
if ((!ec->iconic) && (!ec->override))
ecore_x_window_prop_card32_set(e_client_util_win_get(ec), E_ATOM_MAPPED, &visible, 1);
- _e_comp_x_client_data_get(ec)->iconic = ec->iconic
-// XXX: if we tell apps they are iconic.. they may stop rendering and this
-// means our miniatures we use in ibar, ibox and winlist alt-tab dont udpate
-// ... we could i guess setn fake wm state changes to normal when these are
-// visible and then toggle iconic on and off while still visually hiding
-// the client... but clients that assume they will be iconic when they ask
-// are mistaken ... so for now disable this until we have a debate on it
-// && (!e_comp_object_mirror_visibility_check(ec->frame))
- ;
+ _e_comp_x_client_data_get(ec)->iconic =
+ ec->iconic && (!e_comp_object_iconic_preview_visibility_check(ec->frame));
// printf("HINT: 0x%x set hidden because of client hide\n", (int)e_client_util_win_get(ec));
ec->netwm.state.hidden = 1;
e_hints_window_state_set(ec);
@@ -1329,7 +1322,8 @@ _e_comp_x_evas_mirror_hidden(void *data, Evas_Object *obj EINA_UNUSED, void *eve
E_Client *ec = data;
if (!_e_comp_x_client_data_get(ec)) return;
- if ((!ec->iconic) || (!_e_comp_x_client_data_get(ec)->iconic)) return;
+ if ((!ec->iconic) || (_e_comp_x_client_data_get(ec)->iconic)) return;
+ if (e_comp_object_iconic_preview_visibility_check(ec->frame)) return;
_e_comp_x_client_hide(ec);
}
@@ -1339,7 +1333,8 @@ _e_comp_x_evas_mirror_visible(void *data, Evas_Object *obj EINA_UNUSED, void *ev
E_Client *ec = data;
if (!_e_comp_x_client_data_get(ec)) return;
- if ((!ec->iconic) || _e_comp_x_client_data_get(ec)->iconic) return;
+ if ((!ec->iconic) || (!_e_comp_x_client_data_get(ec)->iconic)) return;
+ if (!e_comp_object_iconic_preview_visibility_check(ec->frame)) return;
_e_comp_x_client_show(ec);
}
diff --git a/src/modules/ibox/e_mod_config.c b/src/modules/ibox/e_mod_config.c
index 83fc2feba..d66618df1 100644
--- a/src/modules/ibox/e_mod_config.c
+++ b/src/modules/ibox/e_mod_config.c
@@ -9,6 +9,8 @@ struct _E_Config_Dialog_Data
int icon_label;
int expand_on_desktop;
int show_preview;
+ int live_preview;
+ Evas_Object *o_preview_live;
struct
{
Evas_Object *o_desk_show_all;
@@ -25,6 +27,7 @@ static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Co
static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static void _cb_disable_check_list(void *data, Evas_Object *obj);
static void _cb_zone_policy_change(void *data, Evas_Object *obj);
+static void _cb_preview_change(void *data, Evas_Object *obj);
// unused
//static void _cb_disable_check(void *data, Evas_Object *obj);
void
@@ -62,6 +65,7 @@ _fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata)
cfdata->icon_label = ci->icon_label;
cfdata->expand_on_desktop = ci->expand_on_desktop;
cfdata->show_preview = ci->show_preview;
+ cfdata->live_preview = ci->live_preview;
}
static void *
@@ -89,16 +93,22 @@ static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
{
E_Radio_Group *rg;
- Evas_Object *o, *of, *ob;
+ Evas_Object *o, *of, *ob, *preview_check;
Evas_Object *show_check = NULL;
int zone_count = 0;
o = e_widget_list_add(evas, 0, 0);
- of = e_widget_framelist_add(evas, _("General Settings"), 0);
-
- ob = e_widget_check_add(evas, _("Preview"), &(cfdata->show_preview));
+ of = e_widget_framelist_add(evas, _("Preview"), 0);
+ preview_check = e_widget_check_add(evas, _("Show previews"), &(cfdata->show_preview));
+ e_widget_framelist_object_append(of, preview_check);
+ cfdata->o_preview_live = ob = e_widget_check_add(evas, _("Keep iconified windows updating"), &(cfdata->live_preview));
e_widget_framelist_object_append(of, ob);
+ e_widget_on_change_hook_set(preview_check, _cb_preview_change, cfdata);
+ _cb_preview_change(cfdata, preview_check);
+ e_widget_list_object_append(o, of, 1, 1, 0.5);
+
+ of = e_widget_framelist_add(evas, _("General Settings"), 0);
ob = e_widget_check_add(evas, _("Expand When On Desktop"), &(cfdata->expand_on_desktop));
e_widget_framelist_object_append(of, ob);
@@ -185,6 +195,7 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
ci->show_desk = cfdata->desk_policy;
ci->expand_on_desktop = cfdata->expand_on_desktop;
ci->show_preview = cfdata->show_preview;
+ ci->live_preview = cfdata->live_preview;
_ibox_config_update(ci);
e_config_save_queue();
@@ -213,6 +224,16 @@ _cb_zone_policy_change(void *data, Evas_Object *obj EINA_UNUSED)
}
}
+static void
+_cb_preview_change(void *data, Evas_Object *obj)
+{
+ E_Config_Dialog_Data *cfdata = data;
+
+ e_widget_disabled_set(cfdata->o_preview_live,
+ !e_widget_check_checked_get(obj));
+}
+
+
/*!
* @param data A Evas_Object to chain together with the checkbox
* @param obj A Evas_Object checkbox created with e_widget_check_add()
diff --git a/src/modules/ibox/e_mod_main.c b/src/modules/ibox/e_mod_main.c
index f50924f25..8a3a9caf9 100644
--- a/src/modules/ibox/e_mod_main.c
+++ b/src/modules/ibox/e_mod_main.c
@@ -62,6 +62,7 @@ struct _IBox_Icon
Evas_Object *o_icon2;
E_Client *client;
Ecore_Timer *fill_timer;
+ Eina_Bool live_preview E_BITFIELD;
struct
{
unsigned char start E_BITFIELD;
@@ -191,6 +192,8 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
inst->ibox = b;
o = b->o_box;
gcc = e_gadcon_client_new(gc, name, id, style, o);
+ /* Match tasks behavior: keep autoscroll enabled when contents overflow. */
+ e_gadcon_client_autoscroll_toggle_disabled_set(gcc, 1);
gcc->data = ""
ci->gcc = gcc;
@@ -608,6 +611,11 @@ _ibox_icon_fill_preview(IBox_Icon *ic, Eina_Bool is_retry)
int w, h;
ec = ic->client;
+ if (ic->ibox->inst->ci->live_preview && ec->iconic && (!ic->live_preview))
+ {
+ e_comp_object_iconic_preview_add(ec->frame);
+ ic->live_preview = EINA_TRUE;
+ }
img = e_comp_object_util_frame_mirror_add(ec->frame);
if ((!img) && (!is_retry))
@@ -692,6 +700,11 @@ _ibox_icon_fill_label(IBox_Icon *ic)
static void
_ibox_icon_empty(IBox_Icon *ic)
{
+ if (ic->live_preview)
+ {
+ e_comp_object_iconic_preview_del(ic->client->frame);
+ ic->live_preview = EINA_FALSE;
+ }
if (ic->o_icon) evas_object_del(ic->o_icon);
if (ic->o_icon2) evas_object_del(ic->o_icon2);
ic->o_icon = NULL;
@@ -1314,6 +1327,7 @@ _ibox_config_item_get(const char *id)
ci->show_zone = 1;
ci->show_desk = 0;
ci->icon_label = 0;
+ ci->live_preview = 0;
ibox_config->items = eina_list_append(ibox_config->items, ci);
return ci;
}
@@ -1379,6 +1393,7 @@ e_modapi_init(E_Module *m)
E_CONFIG_VAL(D, T, show_desk, INT);
E_CONFIG_VAL(D, T, icon_label, INT);
E_CONFIG_VAL(D, T, show_preview, INT);
+ E_CONFIG_VAL(D, T, live_preview, INT);
conf_edd = E_CONFIG_DD_NEW("IBox_Config", Config);
#undef T
@@ -1400,6 +1415,7 @@ e_modapi_init(E_Module *m)
ci->show_zone = 1;
ci->show_desk = 0;
ci->icon_label = 0;
+ ci->live_preview = 0;
ibox_config->items = eina_list_append(ibox_config->items, ci);
}
@@ -1466,4 +1482,3 @@ e_modapi_save(E_Module *m EINA_UNUSED)
e_config_domain_save("module.ibox", conf_edd, ibox_config);
return 1;
}
-
diff --git a/src/modules/ibox/e_mod_main.h b/src/modules/ibox/e_mod_main.h
index 58d79998d..ea13aa8d7 100644
--- a/src/modules/ibox/e_mod_main.h
+++ b/src/modules/ibox/e_mod_main.h
@@ -23,6 +23,7 @@ struct _Config_Item
int icon_label;
int expand_on_desktop;
int show_preview;
+ int live_preview;
E_Gadcon_Client *gcc;
};
diff --git a/src/modules/tasks/e_mod_config.c b/src/modules/tasks/e_mod_config.c
index 880881b1a..00319b2ad 100644
--- a/src/modules/tasks/e_mod_config.c
+++ b/src/modules/tasks/e_mod_config.c
@@ -4,6 +4,7 @@
struct _E_Config_Dialog_Data
{
Evas_Object *icon, *text;
+ Evas_Object *preview_live_obj, *preview_size_obj, *preview_size_label_obj;
int show_all_desktops;
int show_all_screens;
int minw, minh;
@@ -11,6 +12,7 @@ struct _E_Config_Dialog_Data
int text_only;
int preview;
int preview_size;
+ int live_preview;
};
/* Protos */
@@ -18,6 +20,7 @@ static void *_create_data(E_Config_Dialog *cfd);
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
+static void _toggle_preview(void *data, Evas_Object *obj);
void
_config_tasks_module(Config_Item *ci)
@@ -50,6 +53,7 @@ _fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata)
cfdata->text_only = ci->text_only;
cfdata->preview = ci->preview;
cfdata->preview_size = ci->preview_size;
+ cfdata->live_preview = ci->live_preview;
}
static void *
@@ -80,10 +84,21 @@ _toggle_check(void *data, Evas_Object *obj EINA_UNUSED)
e_widget_disabled_set(cfdata->icon, cfdata->text_only);
}
+static void
+_toggle_preview(void *data, Evas_Object *obj)
+{
+ E_Config_Dialog_Data *cfdata = data;
+ Eina_Bool enabled = e_widget_check_checked_get(obj);
+
+ e_widget_disabled_set(cfdata->preview_live_obj, !enabled);
+ e_widget_disabled_set(cfdata->preview_size_label_obj, !enabled);
+ e_widget_disabled_set(cfdata->preview_size_obj, !enabled);
+}
+
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
{
- Evas_Object *o, *of, *ob, *ow;
+ Evas_Object *o, *of, *ob, *ow, *preview_check;
o = e_widget_list_add(evas, 0, 0);
@@ -116,16 +131,20 @@ _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dia
e_widget_list_object_append(o, of, 1, 1, 0.5);
- e_widget_framelist_object_append(of, ob);
of = e_widget_framelist_add(evas, _("Preview"), 0);
- ob = e_widget_check_add(evas, _("Show"),
- &(cfdata->preview));
+ preview_check = e_widget_check_add(evas, _("Show previews"),
+ &(cfdata->preview));
+ e_widget_framelist_object_append(of, preview_check);
+ cfdata->preview_live_obj = ob = e_widget_check_add(evas, _("Keep iconified windows updating"),
+ &(cfdata->live_preview));
e_widget_framelist_object_append(of, ob);
- ow = e_widget_label_add(evas, _("Preview Size"));
+ cfdata->preview_size_label_obj = ow = e_widget_label_add(evas, _("Preview Size"));
e_widget_framelist_object_append(of, ow);
- ow = e_widget_slider_add(evas, 1, 0, _("%1.0f px"), 20, 420, 1, 0,
- NULL, &(cfdata->preview_size), 100);
+ cfdata->preview_size_obj = ow = e_widget_slider_add(evas, 1, 0, _("%1.0f px"), 20, 420, 1, 0,
+ NULL, &(cfdata->preview_size), 100);
e_widget_framelist_object_append(of, ow);
+ e_widget_on_change_hook_set(preview_check, _toggle_preview, cfdata);
+ _toggle_preview(cfdata, preview_check);
_toggle_check(cfdata, NULL);
e_widget_list_object_append(o, of, 1, 1, 0.5);
@@ -146,8 +165,8 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
ci->text_only = cfdata->text_only;
ci->preview = cfdata->preview;
ci->preview_size = cfdata->preview_size;
+ ci->live_preview = cfdata->live_preview;
e_config_save_queue();
_tasks_config_updated(ci);
return 1;
}
-
diff --git a/src/modules/tasks/e_mod_main.c b/src/modules/tasks/e_mod_main.c
index 01b72e67a..a991d8706 100644
--- a/src/modules/tasks/e_mod_main.c
+++ b/src/modules/tasks/e_mod_main.c
@@ -54,6 +54,8 @@ struct _Tasks_Item
Eina_Bool urgent E_BITFIELD;
Eina_Bool iconified E_BITFIELD;
Eina_Bool iconifying E_BITFIELD;
+ Eina_Bool live_preview_perm E_BITFIELD;
+ Eina_Bool live_preview_temp E_BITFIELD;
Eina_Bool delete_me E_BITFIELD;
};
@@ -78,6 +80,7 @@ static void _tasks_item_free(Tasks_Item *item);
static void _tasks_item_signal_emit(Tasks_Item *item, char *sig, char *src);
static void _tasks_item_preview_add(Tasks_Item *item);
static void _tasks_item_preview_del(Tasks_Item *item);
+static void _tasks_item_live_preview_eval(Tasks_Item *item);
static Config_Item *_tasks_config_item_get(const char *id);
@@ -134,6 +137,7 @@ e_modapi_init(E_Module *m)
E_CONFIG_VAL(D, T, icon_only, UCHAR);
E_CONFIG_VAL(D, T, text_only, UCHAR);
E_CONFIG_VAL(D, T, preview, UCHAR);
+ E_CONFIG_VAL(D, T, live_preview, UCHAR);
conf_edd = E_CONFIG_DD_NEW("Tasks_Config", Config);
@@ -158,6 +162,7 @@ e_modapi_init(E_Module *m)
config->minh = 32;
config->preview = 0;
config->preview_size = 240;
+ config->live_preview = 0;
tasks_config->items = eina_list_append(tasks_config->items, config);
}
@@ -736,6 +741,28 @@ _tasks_item_preview_del(Tasks_Item *item)
_tasks_cb_timer_del(item);
}
+static void
+_tasks_item_live_preview_eval(Tasks_Item *item)
+{
+ Eina_Bool want_perm;
+
+ if (!item) return;
+ if (!item->tasks || !item->tasks->config) return;
+
+ want_perm = item->tasks->config->live_preview &&
+ e_client_stack_iconified_get(item->client);
+
+ if (want_perm == item->live_preview_perm) return;
+ item->live_preview_perm = want_perm;
+ if (item->live_preview_perm)
+ {
+ if (!item->live_preview_temp)
+ e_comp_object_iconic_preview_add(item->client->frame);
+ }
+ else if (!item->live_preview_temp)
+ e_comp_object_iconic_preview_del(item->client->frame);
+}
+
static void
_tasks_item_free(Tasks_Item *item)
{
@@ -747,6 +774,12 @@ _tasks_item_free(Tasks_Item *item)
if (e_object_is_del(E_OBJECT(item->client)))
item->tasks->clients = eina_list_remove(item->tasks->clients, item->client);
e_object_unref(E_OBJECT(item->client));
+ if (item->live_preview_temp || item->live_preview_perm)
+ {
+ e_comp_object_iconic_preview_del(item->client->frame);
+ item->live_preview_temp = 0;
+ item->live_preview_perm = 0;
+ }
_tasks_item_preview_del(item);
if (item->o_item)
{
@@ -805,6 +838,7 @@ _tasks_iconified_eval(Tasks_Item *item)
else
_tasks_item_signal_emit(item, "e,state,uniconified", "e");
}
+ _tasks_item_live_preview_eval(item);
}
static void
@@ -895,6 +929,7 @@ _tasks_config_item_get(const char *id)
config->show_all_screens = 0;
config->minw = 100;
config->minh = 32;
+ config->live_preview = 0;
tasks_config->items = eina_list_append(tasks_config->items, config);
@@ -986,6 +1021,12 @@ _tasks_cb_timer_del(void *data)
{
Tasks_Item *item = data;
+ if (item->live_preview_temp)
+ {
+ item->live_preview_temp = 0;
+ if (!item->live_preview_perm)
+ e_comp_object_iconic_preview_del(item->client->frame);
+ }
if (item->o_preview)
evas_object_del(item->o_preview);
if (item->timer)
@@ -1002,6 +1043,7 @@ _tasks_item_preview_add(Tasks_Item *item)
Evas_Object *o, *ot, *or, *img;
Evas_Coord ox, oy, ow, oh, size;
double n;
+ int w, h;
if (item->o_preview) _tasks_cb_timer_del(item);
@@ -1020,26 +1062,43 @@ _tasks_item_preview_add(Tasks_Item *item)
evas_object_show(ot);
ec = item->client;
- img = e_comp_object_util_mirror_add(ec->frame);
- evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_BOTH, ec->client.w, ec->client.h);
+ if (ec->iconic && (!item->live_preview_temp))
+ {
+ if (!item->live_preview_perm)
+ e_comp_object_iconic_preview_add(ec->frame);
+ item->live_preview_temp = 1;
+ }
+ img = e_comp_object_util_frame_mirror_add(ec->frame);
+ if (!img) img = e_comp_object_util_mirror_add(ec->frame);
+ if (!img)
+ {
+ _tasks_cb_timer_del(item);
+ return;
+ }
+
+ w = ec->client.w;
+ h = ec->client.h;
+ if (ec->shaded)
+ evas_object_geometry_get(ec->frame_object, NULL, NULL, &w, &h);
+ evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_BOTH, w, h);
evas_object_show(img);
or = evas_object_rectangle_add(evas_object_evas_get(o));
size = item->tasks->config->preview_size;
- if (ec->client.w > ec->client.h)
+ if (w > h)
{
- n = size * (1.0 / ec->client.w);
- evas_object_size_hint_min_set(img, size, n * ec->client.h);
- evas_object_size_hint_max_set(img, size, n * ec->client.h);
- evas_object_size_hint_min_set(or, size + 1, (n * ec->client.h) + 1);
+ n = size * (1.0 / w);
+ evas_object_size_hint_min_set(img, size, n * h);
+ evas_object_size_hint_max_set(img, size, n * h);
+ evas_object_size_hint_min_set(or, size + 1, (n * h) + 1);
}
else
{
- n = size * (1.0 / ec->client.h);
- evas_object_size_hint_min_set(img, n * ec->client.w, size);
- evas_object_size_hint_max_set(img, n * ec->client.w, size);
- evas_object_size_hint_min_set(or, (n * ec->client.w) + 1, size + 1);
+ n = size * (1.0 / h);
+ evas_object_size_hint_min_set(img, n * w, size);
+ evas_object_size_hint_max_set(img, n * w, size);
+ evas_object_size_hint_min_set(or, (n * w) + 1, size + 1);
}
elm_table_pack(ot, or, 0, 0, 1, 1);
diff --git a/src/modules/tasks/e_mod_main.h b/src/modules/tasks/e_mod_main.h
index 60c90d97e..fa97e2298 100644
--- a/src/modules/tasks/e_mod_main.h
+++ b/src/modules/tasks/e_mod_main.h
@@ -25,6 +25,7 @@ struct _Config_Item
Eina_Bool icon_only;
Eina_Bool text_only;
Eina_Bool preview;
+ Eina_Bool live_preview;
};
E_API extern E_Module_Api e_modapi;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.