struct wl_global *xdg_shell_v5;
struct wl_listener display_destroy;
+
+ struct
+ {
+ struct wl_signal destroy;
+ struct wl_signal new_toplevel;
+ } events;
};
struct _E_Desktop_Surface
E_Desktop_Surface surface;
};
+static E_Desktop_Toplevel *_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource);
+
static void
_shell_cb_display_destroy(struct wl_listener *listener, void *data)
{
E_Desktop_Shell *shell = wl_container_of(listener, shell, display_destroy);
+ wl_signal_emit(&shell->events.destroy, shell);
+
wl_global_destroy(shell->wl_shell);
wl_global_destroy(shell->xdg_shell_v5);
wl_list_remove(&shell->display_destroy.link);
if (!shell->xdg_shell_v5)
goto err_xdg_shell_v5;
- if (!e_desktop_xdg_shell_v6_init(display))
+ if (!e_desktop_xdg_shell_v6_init(display, shell))
goto err_xdg_shell_v6;
+ wl_signal_init(&shell->events.destroy);
+ wl_signal_init(&shell->events.new_toplevel);
+
shell->display_destroy.notify = _shell_cb_display_destroy;
wl_display_add_destroy_listener(display, &shell->display_destroy);
return NULL;
}
+EINTERN E_Desktop_Toplevel *
+e_desktop_shell_toplevel_create(E_Desktop_Shell *shell, E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource)
+{
+ E_Desktop_Toplevel *toplevel;
+
+ toplevel = _toplevel_create(e_surface, iface, shell_surface_resource);
+ if (!toplevel)
+ return NULL;
+
+ wl_signal_emit(&shell->events.new_toplevel, toplevel);
+
+ return toplevel;
+}
+
static void _surface_finish(E_Desktop_Surface *surface);
static void
e_comp_wl_shell_surface_ready(ec);
}
-EINTERN E_Desktop_Toplevel *
-e_desktop_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource)
+static E_Desktop_Toplevel *
+_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource)
{
E_Desktop_Toplevel *toplevel;
void (*unmap)(E_Desktop_Surface_Interface *iface);
};
-E_Desktop_Toplevel *e_desktop_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource);
+E_Desktop_Toplevel *e_desktop_shell_toplevel_create(E_Desktop_Shell *shell, E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource);
+
void e_desktop_toplevel_title_set(E_Desktop_Toplevel *toplevel, const char *title);
void e_desktop_toplevel_app_id_set(E_Desktop_Toplevel *toplevel, const char *app_id);
void e_desktop_toplevel_parent_set(E_Desktop_Toplevel *toplevel, E_Desktop_Toplevel *parent);
struct _E_Desktop_Xdg_Shell_V6
{
+ E_Desktop_Shell *desktop_shell;
struct ds_xdg_shell_v6 *ds_xdg_shell;
struct wl_listener destroy;
static void _shell_cb_destroy(struct wl_listener *listener, void *data);
static void _shell_cb_new_surface(struct wl_listener *listener, void *data);
-static void _toplevel_add(struct ds_xdg_surface_v6 *ds_xdg_surface);
+static void _toplevel_add(E_Desktop_Xdg_Shell_V6 *shell, struct ds_xdg_surface_v6 *ds_xdg_surface);
static void _toplevel_cb_xdg_surface_destroy(struct wl_listener *listener, void *data);
static E_Desktop_Xdg_Toplevel_V6 *_toplevel_from_shell_surface_resource(struct wl_resource *shsurface_resource);
EINTERN Eina_Bool
-e_desktop_xdg_shell_v6_init(struct wl_display *display)
+e_desktop_xdg_shell_v6_init(struct wl_display *display, E_Desktop_Shell *desktop_shell)
{
static E_Desktop_Xdg_Shell_V6 shell = { .ds_xdg_shell = NULL };
return EINA_FALSE;
}
+ shell.desktop_shell = desktop_shell;
+
shell.destroy.notify = _shell_cb_destroy;
ds_xdg_shell_v6_add_destroy_listener(shell.ds_xdg_shell, &shell.destroy);
shell.new_surface.notify = _shell_cb_new_surface;
static void
_shell_cb_new_surface(struct wl_listener *listener, void *data)
{
+ E_Desktop_Xdg_Shell_V6 *shell = wl_container_of(listener, shell, new_surface);
struct ds_xdg_surface_v6 *ds_xdg_surface = data;
if (ds_xdg_surface->role == DS_XDG_SURFACE_V6_ROLE_TOPLEVEL)
- _toplevel_add(ds_xdg_surface);
+ _toplevel_add(shell, ds_xdg_surface);
else
ERR("Not implemented: xdg_surface_v6(role:%d)", ds_xdg_surface->role);
}
}
static void
-_toplevel_add(struct ds_xdg_surface_v6 *ds_xdg_surface)
+_toplevel_add(E_Desktop_Xdg_Shell_V6 *shell, struct ds_xdg_surface_v6 *ds_xdg_surface)
{
E_Desktop_Xdg_Toplevel_V6 *toplevel;
E_Surface *surface = e_surface_from_ds_surface(ds_xdg_surface->ds_surface);
_toplevel_desktop_surface_interface_init(&toplevel->impl);
toplevel->ds_toplevel = ds_xdg_surface->toplevel;
- toplevel->toplevel = e_desktop_toplevel_create(surface, &toplevel->impl, ds_xdg_surface->resource);
+ toplevel->toplevel = e_desktop_shell_toplevel_create(shell->desktop_shell, surface, &toplevel->impl, ds_xdg_surface->resource);
_toplevel_init(toplevel);
_toplevel_listener_init(toplevel);
typedef struct _E_Desktop_Xdg_Toplevel_V6 E_Desktop_Xdg_Toplevel_V6;
-EINTERN Eina_Bool e_desktop_xdg_shell_v6_init(struct wl_display *display);
+EINTERN Eina_Bool e_desktop_xdg_shell_v6_init(struct wl_display *display, E_Desktop_Shell *desktop_shell);
E_Desktop_Xdg_Toplevel_V6 *e_desktop_xdg_toplevel_v6_from_shell_surface_resource(struct wl_resource *shell_surface_resource);
E_Desktop_Toplevel *e_desktop_xdg_toplevel_v6_desktop_toplevel_get(E_Desktop_Xdg_Toplevel_V6 *toplevel);