desktop_shell: Separate functions for creating and adding toplevel 90/323190/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 21 Apr 2025 08:24:00 +0000 (17:24 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 24 Apr 2025 02:15:34 +0000 (11:15 +0900)
The functions for creating and adding toplevel must be separated.
Otherwise, the `configure_send` cannot work with E_Desktop_Toplevel
because `toplevel->toplevel` is not assigned yet at the time of the
callback. The `configure_send` callback is called by calling
e_comp_wl_shell_surface_ready, which is called during the creation of
E_Desktop_Toplevel.

Additionally , it is logical to emit the `new_toplevel` signal after the
sub-type of E_Desktop_Toplevel is fully initialized.

Change-Id: I96ece8d5ff41796829e423b37961f6bcce655cf0

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

index c4e51e218528e6ce9a4f980f17f35410d71d7eaa..2f08a7d9ce6db19a8206dfcb47b30303496c1558 100644 (file)
@@ -39,8 +39,6 @@ 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)
 {
@@ -92,18 +90,12 @@ 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)
+EINTERN void
+e_desktop_shell_toplevel_add(E_Desktop_Shell *shell, E_Desktop_Toplevel *toplevel)
 {
-   E_Desktop_Toplevel *toplevel;
-
-   toplevel = _toplevel_create(e_surface, iface, shell_surface_resource);
-   if (!toplevel)
-     return NULL;
+   e_comp_wl_shell_surface_ready(e_surface_ec_get(toplevel->surface.surface));
 
    wl_signal_emit(&shell->events.new_toplevel, toplevel);
-
-   return toplevel;
 }
 
 static void _surface_finish(E_Desktop_Surface *surface);
@@ -232,11 +224,10 @@ _toplevel_init(E_Desktop_Toplevel *toplevel, struct wl_resource *shell_surface_r
 
    e_shell_e_client_shsurface_assign(ec, shell_surface_resource, NULL);
    e_shell_e_client_toplevel_set(ec);
-   e_comp_wl_shell_surface_ready(ec);
 }
 
-static E_Desktop_Toplevel *
-_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource)
+EINTERN 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 *toplevel;
 
index a4c32bbfd88f97f80f1360056d89c851ef5f1e3b..a5d5116d5e312bfd5788ef011bfee081c180e65d 100644 (file)
@@ -14,8 +14,9 @@ struct _E_Desktop_Surface_Interface
    void (*unmap)(E_Desktop_Surface_Interface *iface);
 };
 
-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_shell_toplevel_add(E_Desktop_Shell *shell, E_Desktop_Toplevel *toplevel);
 
+E_Desktop_Toplevel *e_desktop_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource);
 void e_desktop_toplevel_destroy(E_Desktop_Toplevel *toplevel);
 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);
index 2b6b4dc9458ef5f305444c0ecdd95aa76ce71975..9bb4690ad6446bf8639792821575781034ce7ea9 100644 (file)
@@ -543,11 +543,13 @@ _toplevel_add(E_Desktop_Xdg_Shell_V6 *shell, struct ds_xdg_surface_v6 *ds_xdg_su
    _toplevel_desktop_surface_interface_init(&toplevel->impl);
 
    toplevel->ds_toplevel = ds_xdg_surface->toplevel;
-   toplevel->toplevel = e_desktop_shell_toplevel_create(shell->desktop_shell, surface, &toplevel->impl, ds_xdg_surface->resource);
+   toplevel->toplevel = e_desktop_toplevel_create(surface, &toplevel->impl, ds_xdg_surface->resource);
 
    _toplevel_init(toplevel);
    _toplevel_listener_init(toplevel);
 
+   e_desktop_shell_toplevel_add(shell->desktop_shell, toplevel->toplevel);
+
    ELOGF("XDG6", "Created E_Desktop_Xdg_Toplevel_V6(%p)", e_surface_ec_get(surface), toplevel);
 }