desktop_shell: Emit new_toplevel signal 84/323184/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 1 Apr 2025 01:56:43 +0000 (10:56 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 24 Apr 2025 02:15:34 +0000 (11:15 +0900)
Change-Id: I15c6ce10094be780adcf63e910aa525220fd470e

src/bin/server/e_desktop_shell.c
src/bin/server/e_desktop_shell_private.h
src/bin/server/e_desktop_xdg_shell_v6.c
src/bin/server/e_desktop_xdg_shell_v6_intern.h

index 7691a8dc4e8e52b16fffad4f71e2009bc5425e02..3dfae8347f744c33ebc6cd350b440c245be1687c 100644 (file)
@@ -18,6 +18,12 @@ struct _E_Desktop_Shell
    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
@@ -33,11 +39,15 @@ struct _E_Desktop_Toplevel
    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);
@@ -61,9 +71,12 @@ e_desktop_shell_create(struct wl_display *display)
    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);
 
@@ -79,6 +92,20 @@ err_wl_shell:
    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
@@ -205,8 +232,8 @@ _toplevel_init(E_Desktop_Toplevel *toplevel, struct wl_resource *shell_surface_r
    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;
 
index ccede633242cde0105196c2671834523f8cbb3f0..e9938e6a6b04879a138ac649fc931cb4b5b788aa 100644 (file)
@@ -14,7 +14,8 @@ struct _E_Desktop_Surface_Interface
    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);
index 1df5d341d3d83f6b500657d03203521a6ee7e2a0..b0154dc4ef8cbc3bc871626a898d8af6b29541fa 100644 (file)
@@ -16,6 +16,7 @@ typedef struct _E_Desktop_Xdg_Shell_V6 E_Desktop_Xdg_Shell_V6;
 
 struct _E_Desktop_Xdg_Shell_V6
 {
+   E_Desktop_Shell *desktop_shell;
    struct ds_xdg_shell_v6 *ds_xdg_shell;
 
    struct wl_listener destroy;
@@ -45,12 +46,12 @@ struct _E_Desktop_Xdg_Toplevel_V6
 
 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 };
 
@@ -70,6 +71,8 @@ e_desktop_xdg_shell_v6_init(struct wl_display *display)
         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;
@@ -106,10 +109,11 @@ _shell_cb_destroy(struct wl_listener *listener, void *data)
 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);
 }
@@ -531,7 +535,7 @@ _toplevel_desktop_surface_interface_init(E_Desktop_Surface_Interface *iface)
 }
 
 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);
@@ -546,7 +550,7 @@ _toplevel_add(struct ds_xdg_surface_v6 *ds_xdg_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);
index 74cecac67222b335e496393e688f251aab72ceff..6e53c76d734eb5cb880c1fd34388c110b5f7a79a 100644 (file)
@@ -6,7 +6,7 @@
 
 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);