forked from enlightenment/efl
ecore-wl2: Implement reference counting for client connected displays
Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
3dc45d4945
commit
8683c6ecf6
|
@ -288,6 +288,10 @@ _ecore_wl2_display_cleanup(Ecore_Wl2_Display *ewd)
|
||||||
Ecore_Wl2_Input *input;
|
Ecore_Wl2_Input *input;
|
||||||
Eina_Inlist *tmp;
|
Eina_Inlist *tmp;
|
||||||
|
|
||||||
|
if (--ewd->refs) return;
|
||||||
|
|
||||||
|
if (ewd->xkb_context) xkb_context_unref(ewd->xkb_context);
|
||||||
|
|
||||||
/* free each input */
|
/* free each input */
|
||||||
EINA_INLIST_FOREACH_SAFE(ewd->inputs, tmp, input)
|
EINA_INLIST_FOREACH_SAFE(ewd->inputs, tmp, input)
|
||||||
_ecore_wl2_input_del(input);
|
_ecore_wl2_input_del(input);
|
||||||
|
@ -296,15 +300,7 @@ _ecore_wl2_display_cleanup(Ecore_Wl2_Display *ewd)
|
||||||
EINA_INLIST_FOREACH_SAFE(ewd->outputs, tmp, output)
|
EINA_INLIST_FOREACH_SAFE(ewd->outputs, tmp, output)
|
||||||
_ecore_wl2_output_del(output);
|
_ecore_wl2_output_del(output);
|
||||||
|
|
||||||
if (ewd->xkb_context) xkb_context_unref(ewd->xkb_context);
|
if (ewd->idle_enterer) ecore_idle_enterer_del(ewd->idle_enterer);
|
||||||
|
|
||||||
if (ewd->idle_enterer)
|
|
||||||
{
|
|
||||||
/* remove this client display from hash */
|
|
||||||
eina_hash_del(_client_displays, ewd->name, ewd);
|
|
||||||
|
|
||||||
ecore_idle_enterer_del(ewd->idle_enterer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ewd->fd_hdl) ecore_main_fd_handler_del(ewd->fd_hdl);
|
if (ewd->fd_hdl) ecore_main_fd_handler_del(ewd->fd_hdl);
|
||||||
|
|
||||||
|
@ -323,6 +319,9 @@ _ecore_wl2_display_cleanup(Ecore_Wl2_Display *ewd)
|
||||||
wl_display_flush(ewd->wl.display);
|
wl_display_flush(ewd->wl.display);
|
||||||
|
|
||||||
if (ewd->name) free(ewd->name);
|
if (ewd->name) free(ewd->name);
|
||||||
|
|
||||||
|
/* remove this client display from hash */
|
||||||
|
eina_hash_del(_client_displays, ewd->name, ewd);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ecore_Wl2_Window *
|
Ecore_Wl2_Window *
|
||||||
|
@ -423,7 +422,7 @@ ecore_wl2_display_connect(const char *name)
|
||||||
|
|
||||||
/* check hash of cached client displays for this name */
|
/* check hash of cached client displays for this name */
|
||||||
ewd = eina_hash_find(_client_displays, n);
|
ewd = eina_hash_find(_client_displays, n);
|
||||||
if (ewd) return ewd;
|
if (ewd) goto found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -432,13 +431,15 @@ ecore_wl2_display_connect(const char *name)
|
||||||
|
|
||||||
/* check hash of cached client displays for this name */
|
/* check hash of cached client displays for this name */
|
||||||
ewd = eina_hash_find(_client_displays, name);
|
ewd = eina_hash_find(_client_displays, name);
|
||||||
if (ewd) return ewd;
|
if (ewd) goto found;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate space for display structure */
|
/* allocate space for display structure */
|
||||||
ewd = calloc(1, sizeof(Ecore_Wl2_Display));
|
ewd = calloc(1, sizeof(Ecore_Wl2_Display));
|
||||||
if (!ewd) return NULL;
|
if (!ewd) return NULL;
|
||||||
|
|
||||||
|
ewd->refs++;
|
||||||
|
|
||||||
if (name)
|
if (name)
|
||||||
ewd->name = strdup(name);
|
ewd->name = strdup(name);
|
||||||
else if (n)
|
else if (n)
|
||||||
|
@ -491,6 +492,10 @@ connect_err:
|
||||||
free(ewd->name);
|
free(ewd->name);
|
||||||
free(ewd);
|
free(ewd);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
found:
|
||||||
|
ewd->refs++;
|
||||||
|
return ewd;
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
@ -498,8 +503,11 @@ ecore_wl2_display_disconnect(Ecore_Wl2_Display *display)
|
||||||
{
|
{
|
||||||
EINA_SAFETY_ON_NULL_RETURN(display);
|
EINA_SAFETY_ON_NULL_RETURN(display);
|
||||||
_ecore_wl2_display_cleanup(display);
|
_ecore_wl2_display_cleanup(display);
|
||||||
wl_display_disconnect(display->wl.display);
|
if (display->refs <= 0)
|
||||||
free(display);
|
{
|
||||||
|
wl_display_disconnect(display->wl.display);
|
||||||
|
free(display);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
|
|
@ -47,6 +47,7 @@ extern int _ecore_wl2_log_dom;
|
||||||
|
|
||||||
struct _Ecore_Wl2_Display
|
struct _Ecore_Wl2_Display
|
||||||
{
|
{
|
||||||
|
int refs;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
|
Loading…
Reference in New Issue