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.

Reply via email to