}
else
{
- if (!evas_object_visible_get(ec->frame))
+ if ((!evas_object_visible_get(ec->frame)) &&
+ (ec != e_comp->launchscrn->ec))
{
if (cdata && !cdata->mapped)
{
static void
_e_launchscreen_free(E_Launch_Screen *plscrn)
{
- if(plscrn->shobj) evas_object_del(plscrn->shobj);
+ if (plscrn->shobj)
+ evas_object_del(plscrn->shobj);
+ if (plscrn->ep)
+ e_pixmap_del(plscrn->ep);
+ if (plscrn->ec)
+ e_object_del(E_OBJECT(plscrn->ec));
+
E_FREE(plscrn);
}
evas_object_resize(plscrn->shobj, e_comp->w, e_comp->h);
evas_object_layer_set(plscrn->shobj, E_LAYER_CLIENT_TOP);
edje_object_file_set(plscrn->shobj, conf->launch_file, "e/comp/effects/launch");
+
+ plscrn->ep = e_pixmap_new(E_PIXMAP_TYPE_NONE, 0);
+ EINA_SAFETY_ON_NULL_GOTO(plscrn->ep, error);
+ plscrn->ec = e_client_new(plscrn->ep, 0, 1);
+ EINA_SAFETY_ON_NULL_GOTO(plscrn->ec, error);
+
+ if (plscrn->ec->frame)
+ evas_object_resize(plscrn->ec->frame, plscrn->ec->zone->w, plscrn->ec->zone->h);
+
+ plscrn->ec->netwm.pid = getpid();
+ plscrn->ec->netwm.name = eina_stringshare_add("E-launch_screen");
+ plscrn->ec->ignored = EINA_TRUE;
+
return plscrn;
error:
ERR("Could not initialize launchscreen");
+ if (plscrn)
+ {
+ if (plscrn->shobj)
+ evas_object_del(plscrn->shobj);
+ if (plscrn->ep)
+ e_pixmap_del(plscrn->ep);
+ if (plscrn->ec)
+ e_object_del(E_OBJECT(plscrn->ec));
+ E_FREE(plscrn);
+ }
return NULL;
}
typedef struct _E_Launch_Screen
{
Evas_Object *shobj;
- Ecore_Timer *timeout;
+ E_Pixmap *ep;
+ E_Client *ec;
+ Ecore_Timer *timeout;
} E_Launch_Screen;
typedef struct _E_Comp_Hook E_Comp_Hook;
if (ec->pixmap)
res_id = e_pixmap_res_id_get(ec->pixmap);
+
+ pid = ec->netwm.pid;
#ifdef HAVE_WAYLAND_ONLY
- if (ec->comp_data)
+ if (pid <= 0)
{
- E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
- if (cdata->surface)
- wl_client_get_credentials(wl_resource_get_client(cdata->surface), &pid, NULL, NULL);
+ if (ec->comp_data)
+ {
+ E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+ if (cdata->surface)
+ wl_client_get_credentials(wl_resource_get_client(cdata->surface), &pid, NULL, NULL);
+ }
}
#endif
if (e_comp->hwc)
#include <uuid.h>
-static Eina_Hash *pixmaps[2] = {NULL};
-static Eina_Hash *deleted[2] = {NULL};
+static Eina_Hash *pixmaps[E_PIXMAP_TYPE_MAX] = {NULL};
+static Eina_Hash *deleted[E_PIXMAP_TYPE_MAX] = {NULL};
static Eina_Hash *res_ids = NULL;
static uint32_t res_id = 0;
-static Eina_Hash *aliases[2] = {NULL};
+static Eina_Hash *aliases[E_PIXMAP_TYPE_MAX] = {NULL};
+static uint32_t dummy_pixmap_id = 0;
struct _E_Pixmap
{
uintptr_t id;
E_Pixmap *cp;
- if (type != E_PIXMAP_TYPE_WL) return NULL;
+ if (type == E_PIXMAP_TYPE_X) return NULL;
if (!pixmaps[type]) return NULL;
id = va_arg(*l, uintptr_t);
e_pixmap_del(E_Pixmap *cp)
{
if (!cp) return;
- if (cp->type != E_PIXMAP_TYPE_WL) return;
+ if (cp->type == E_PIXMAP_TYPE_X) return;
+
if (eina_hash_find(pixmaps[cp->type], &cp->win))
{
eina_hash_del_by_key(pixmaps[cp->type], &cp->win);
e_pixmap_is_del(E_Pixmap *cp)
{
if (!cp) return 0;
- if (cp->type != E_PIXMAP_TYPE_WL) return 0;
+ if (cp->type == E_PIXMAP_TYPE_X) return 0;
+
return !!eina_hash_find(deleted[cp->type], &cp->win);
}
va_list l;
uintptr_t id;
- EINA_SAFETY_ON_FALSE_RETURN_VAL(type == E_PIXMAP_TYPE_WL, NULL);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(type == E_PIXMAP_TYPE_X, NULL);
va_start(l, type);
id = va_arg(l, uintptr_t);
+ if (type == E_PIXMAP_TYPE_NONE)
+ {
+ id = dummy_pixmap_id++;
+ }
+
if (pixmaps[type])
{
cp = eina_hash_find(pixmaps[type], &id);
E_PIXMAP_TYPE_X,
E_PIXMAP_TYPE_WL,
E_PIXMAP_TYPE_NONE,
+ E_PIXMAP_TYPE_MAX
} E_Pixmap_Type;
#else