return source;
}
+static E_Comp_Wl_Remote_Source *
+_remote_source_create(E_Client *ec)
+{
+ E_Comp_Wl_Remote_Source *source;
+
+ source = E_NEW(E_Comp_Wl_Remote_Source, 1);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(source, NULL);
+
+ source->common.ec = ec;
+ eina_hash_add(_rsm->source_hash, &ec, source);
+
+ return source;
+}
+
static void
_remote_source_destroy(E_Comp_Wl_Remote_Source *source)
{
/* if passed */
source = _remote_source_find(ec);
if (!source)
- {
- source = E_NEW(E_Comp_Wl_Remote_Source, 1);
- if (!source) goto fail;
+ source = _remote_source_create(ec);
- source->common.ec = ec;
- eina_hash_add(_rsm->source_hash, &ec, source);
- }
+ EINA_SAFETY_ON_NULL_GOTO(source, fail);
}
else
{
}
static void
-_e_comp_wl_remote_cb_client_iconify(void *data, E_Client *ec)
+_e_comp_wl_remote_cb_evas_show(void *data,
+ Evas *e EINA_UNUSED,
+ Evas_Object *o,
+ void *event_info EINA_UNUSED)
{
E_Comp_Wl_Remote_Source *source;
+ E_Client *ec;
+
+ ec = evas_object_data_get(o, "E_Client");
+ EINA_SAFETY_ON_NULL_RETURN(ec);
- if (!(source = _remote_source_find(ec)))
+ source = _remote_source_find(ec);
+ if (!source)
{
if (ec->ignored) return;
if (!_image_save_type_check(ec)) return;
- source = E_NEW(E_Comp_Wl_Remote_Source, 1);
+ source = _remote_source_create(ec);
EINA_SAFETY_ON_NULL_RETURN(source);
-
- source->common.ec = ec;
- eina_hash_add(_rsm->source_hash, &ec, source);
}
- _remote_source_save_start(source);
+ if (!source->th) return;
+
+ RSMDBG("IMG save could be cancelled. th:%p(cancel:%d) defer_img_save:%d iconic:%d del:%d ec_del:%d",
+ ec->pixmap, ec, "SOURCE", source,
+ source->th, ecore_thread_check(source->th),
+ source->defer_img_save, ec->iconic,
+ source->deleted, e_object_is_del(E_OBJECT(ec)));
+
+ if (!ecore_thread_check(source->th) &&
+ !source->deleted &&
+ !e_object_is_del(E_OBJECT(ec)))
+ {
+ RSMDBG("IMG save CANCELLED.", ec->pixmap, ec, "SOURCE", source);
+ ecore_thread_cancel(source->th);
+ }
}
static void
-_e_comp_wl_remote_cb_client_uniconify(void *data, E_Client *ec)
+_e_comp_wl_remote_cb_evas_hide(void *data EINA_UNUSED,
+ Evas *e EINA_UNUSED,
+ Evas_Object *o,
+ void *event_info EINA_UNUSED)
{
E_Comp_Wl_Remote_Source *source;
+ E_Client *ec;
+
+ ec = evas_object_data_get(o, "E_Client");
+ EINA_SAFETY_ON_NULL_RETURN(ec);
source = _remote_source_find(ec);
- if (!source) return;
- EINA_SAFETY_ON_FALSE_RETURN(ec == source->common.ec);
+ EINA_SAFETY_ON_NULL_RETURN(source);
- if (source->th)
- {
- RSMDBG("IMG save could be cancelled. UNICONIFY th:%p(cancel:%d) defer_img_save:%d iconic:%d del:%d ec_del:%d",
- ec->pixmap, ec, "SOURCE", source,
- source->th, ecore_thread_check(source->th),
- source->defer_img_save, ec->iconic,
- source->deleted, e_object_is_del(E_OBJECT(ec)));
+ if (!e_config->save_win_buffer) return;
+ if (!e_config->hold_prev_win_img) return;
+ if (ec->saved_img) return;
+ if (ec->ignored) return;
+ if (!_image_save_type_check(ec)) return;
- if (!ecore_thread_check(source->th) &&
- !source->deleted &&
- !e_object_is_del(E_OBJECT(ec)))
- {
- RSMDBG("IMG save CANCELLED.", ec->pixmap, ec, "SOURCE", source);
- ecore_thread_cancel(source->th);
- }
- }
+ _remote_source_save_start(source);
+}
+
+static void
+_e_comp_wl_remote_cb_new_client_post(void *data EINA_UNUSED, E_Client *ec)
+{
+ if (!e_config->save_win_buffer) return;
+
+ evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _e_comp_wl_remote_cb_evas_show, NULL);
+ evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE, _e_comp_wl_remote_cb_evas_hide, NULL);
}
static void
E_Comp_Wl_Remote_Source *source;
E_Comp_Wl_Remote_Surface *remote_surface;
- if ((provider = eina_hash_find(_rsm->provider_hash, &ec)))
+ provider = eina_hash_find(_rsm->provider_hash, &ec);
+ if (provider)
{
eina_hash_del(_rsm->provider_hash, &ec, provider);
EINA_LIST_FREE(provider->common.surfaces, remote_surface)
E_FREE(provider);
}
- if ((source = _remote_source_find(ec)))
+ source = _remote_source_find(ec);
+ if (source)
{
+ if (e_config->save_win_buffer)
+ {
+ evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_SHOW, _e_comp_wl_remote_cb_evas_show);
+ evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_HIDE, _e_comp_wl_remote_cb_evas_hide);
+ }
+
_remote_source_destroy(source);
}
- if ((remote_surface = eina_hash_find(_rsm->surface_hash, &ec)))
+ remote_surface = eina_hash_find(_rsm->surface_hash, &ec);
+ if (remote_surface)
{
eina_hash_del(_rsm->surface_hash, &ec, remote_surface);
if (remote_surface->owner == ec)
_remote_provider_onscreen_parent_calculate(remote_surface->provider);
}
- if ((remote_surface = eina_hash_find(_rsm->bind_surface_hash, &ec)))
+ remote_surface = eina_hash_find(_rsm->bind_surface_hash, &ec);
+ if (remote_surface)
{
eina_hash_del(_rsm->surface_hash, &ec, remote_surface);
if (remote_surface->bind_ec == ec)
- _remote_surface_bind_client(remote_surface, NULL);
+ _remote_surface_bind_client(remote_surface, NULL);
}
}
src = _remote_source_find(ec);
if (!src)
- {
- src = E_NEW(E_Comp_Wl_Remote_Source, 1);
- EINA_SAFETY_ON_NULL_GOTO(src, end);
+ src = _remote_source_create(ec);
- src->common.ec = ec;
- eina_hash_add(_rsm->source_hash, &ec, src);
- }
+ EINA_SAFETY_ON_NULL_GOTO(src, end);
_remote_source_save_start(src);
_remote_manager_cb_bind);
/* client hook */
- E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_DEL, _e_comp_wl_remote_cb_client_del, NULL);
- if (e_config->save_win_buffer)
- {
- E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_ICONIFY, _e_comp_wl_remote_cb_client_iconify, NULL);
- E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_UNICONIFY, _e_comp_wl_remote_cb_client_uniconify, NULL);
- }
+ E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_NEW_CLIENT_POST, _e_comp_wl_remote_cb_new_client_post, NULL);
+ E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_DEL, _e_comp_wl_remote_cb_client_del, NULL);
/* client event */
E_LIST_HANDLER_APPEND(rs_manager->event_hdlrs,