forked from enlightenment/enlightenment
e pixmap - follow on from previous commit to finally fix pixmap tracking
follow on form 4c7b798b45
- really
remove from the alias hash. the alias id is different and should ave
been stored in the pixmap and be deleted when pixmap is freed. i had
it right to remove from the aliases hash too, but i used the wrong id
- i used the "core" pixmap id, not alias. this tracks and uses that
alias.
this means internal windows are reliable now and dont crash...
@fix.
This commit is contained in:
parent
4c7b798b45
commit
154c42926d
|
@ -31,6 +31,7 @@ struct _E_Pixmap
|
||||||
E_Pixmap_Type type;
|
E_Pixmap_Type type;
|
||||||
|
|
||||||
int64_t win;
|
int64_t win;
|
||||||
|
int64_t alias;
|
||||||
Ecore_Window parent;
|
Ecore_Window parent;
|
||||||
|
|
||||||
int w, h;
|
int w, h;
|
||||||
|
@ -266,7 +267,7 @@ _e_pixmap_find(E_Pixmap_Type type, va_list *l)
|
||||||
int64_t id;
|
int64_t id;
|
||||||
#endif
|
#endif
|
||||||
E_Pixmap *cp;
|
E_Pixmap *cp;
|
||||||
|
|
||||||
if (!pixmaps[type]) return NULL;
|
if (!pixmaps[type]) return NULL;
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
|
@ -294,27 +295,32 @@ _e_pixmap_find(E_Pixmap_Type type, va_list *l)
|
||||||
E_API int
|
E_API int
|
||||||
e_pixmap_free(E_Pixmap *cp)
|
e_pixmap_free(E_Pixmap *cp)
|
||||||
{
|
{
|
||||||
|
#ifndef HAVE_WAYLAND_ONLY
|
||||||
|
Ecore_X_Window xwin = cp ? cp->win : 0;
|
||||||
|
Ecore_X_Window alias_xwin = cp ? cp->alias : 0;
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
int64_t id = cp ? cp->win : 0;
|
||||||
|
int64_t alias_id = cp ? cp->alias : 0;
|
||||||
|
#endif
|
||||||
|
E_Pixmap_Type type;
|
||||||
|
|
||||||
if (!cp) return 0;
|
if (!cp) return 0;
|
||||||
if (--cp->refcount) return cp->refcount;
|
if (--cp->refcount) return cp->refcount;
|
||||||
|
type = cp->type;
|
||||||
e_pixmap_image_clear(cp, EINA_FALSE);
|
e_pixmap_image_clear(cp, EINA_FALSE);
|
||||||
switch (cp->type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case E_PIXMAP_TYPE_X:
|
case E_PIXMAP_TYPE_X:
|
||||||
#ifndef HAVE_WAYLAND_ONLY
|
#ifndef HAVE_WAYLAND_ONLY
|
||||||
{
|
if (alias_xwin) eina_hash_del(aliases[type], &alias_xwin, cp);
|
||||||
Ecore_X_Window xwin = cp->win;
|
eina_hash_del(pixmaps[type], &xwin, cp);
|
||||||
eina_hash_del_by_key(pixmaps[cp->type], &xwin);
|
|
||||||
eina_hash_del_by_key(aliases[cp->type], &xwin);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case E_PIXMAP_TYPE_WL:
|
case E_PIXMAP_TYPE_WL:
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
{
|
if (alias_id) eina_hash_del(aliases[type], &alias_id, cp);
|
||||||
int64_t id = cp->win;
|
eina_hash_del(pixmaps[type], &id, cp);
|
||||||
eina_hash_del_by_key(pixmaps[cp->type], &id);
|
|
||||||
eina_hash_del_by_key(aliases[cp->type], &id);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -1095,6 +1101,7 @@ e_pixmap_image_opaque_get(E_Pixmap *cp, int *x, int *y, int *w, int *h)
|
||||||
E_API void
|
E_API void
|
||||||
e_pixmap_alias(E_Pixmap *cp, E_Pixmap_Type type, ...)
|
e_pixmap_alias(E_Pixmap *cp, E_Pixmap_Type type, ...)
|
||||||
{
|
{
|
||||||
|
E_Pixmap *cp2;
|
||||||
va_list l;
|
va_list l;
|
||||||
#ifndef HAVE_WAYLAND_ONLY
|
#ifndef HAVE_WAYLAND_ONLY
|
||||||
Ecore_X_Window xwin;
|
Ecore_X_Window xwin;
|
||||||
|
@ -1111,6 +1118,9 @@ e_pixmap_alias(E_Pixmap *cp, E_Pixmap_Type type, ...)
|
||||||
xwin = va_arg(l, uint32_t);
|
xwin = va_arg(l, uint32_t);
|
||||||
if (!aliases[type])
|
if (!aliases[type])
|
||||||
aliases[type] = eina_hash_int32_new(NULL);
|
aliases[type] = eina_hash_int32_new(NULL);
|
||||||
|
cp2 = eina_hash_find(aliases[type], &xwin);
|
||||||
|
if ((cp2) && (!cp)) cp2->alias = 0;
|
||||||
|
else if (cp) cp->alias = xwin;
|
||||||
eina_hash_set(aliases[type], &xwin, cp);
|
eina_hash_set(aliases[type], &xwin, cp);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
@ -1119,6 +1129,9 @@ e_pixmap_alias(E_Pixmap *cp, E_Pixmap_Type type, ...)
|
||||||
id = va_arg(l, int64_t);
|
id = va_arg(l, int64_t);
|
||||||
if (!aliases[type])
|
if (!aliases[type])
|
||||||
aliases[type] = eina_hash_int64_new(NULL);
|
aliases[type] = eina_hash_int64_new(NULL);
|
||||||
|
cp2 = eina_hash_find(aliases[type], &xwin);
|
||||||
|
if ((cp2) && (!cp)) cp2->alias = 0;
|
||||||
|
else if (cp) cp->alias = id;
|
||||||
eina_hash_set(aliases[type], &id, cp);
|
eina_hash_set(aliases[type], &id, cp);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue