desktop_shell: Switch to init/finish 92/323192/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 22 Apr 2025 02:18:42 +0000 (11:18 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 24 Apr 2025 02:15:34 +0000 (11:15 +0900)
This change improves flexibility for future protocol extensions by
exposing abstracted data, albeit at the expense of encapsulation.

Change-Id: I7d4337bb6653039c1704eb7225213319c4fa6ab1

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 2f08a7d9ce6db19a8206dfcb47b30303496c1558..42ec56f47fb03b702a8643fd1f15ef731543d07a 100644 (file)
@@ -26,19 +26,6 @@ struct _E_Desktop_Shell
      } events;
 };
 
-struct _E_Desktop_Surface
-{
-   E_Surface *surface;
-   E_Desktop_Surface_Interface *iface;
-
-   struct wl_listener surface_destroy;
-};
-
-struct _E_Desktop_Toplevel
-{
-   E_Desktop_Surface surface;
-};
-
 static void
 _shell_cb_display_destroy(struct wl_listener *listener, void *data)
 {
@@ -100,13 +87,6 @@ e_desktop_shell_toplevel_add(E_Desktop_Shell *shell, E_Desktop_Toplevel *topleve
 
 static void _surface_finish(E_Desktop_Surface *surface);
 
-static void
-_toplevel_destroy(E_Desktop_Toplevel *toplevel)
-{
-   _surface_finish(&toplevel->surface);
-   free(toplevel);
-}
-
 static E_Desktop_Toplevel *
 _toplevel_from_surface(E_Desktop_Surface *surface)
 {
@@ -226,19 +206,17 @@ _toplevel_init(E_Desktop_Toplevel *toplevel, struct wl_resource *shell_surface_r
    e_shell_e_client_toplevel_set(ec);
 }
 
-EINTERN E_Desktop_Toplevel *
-e_desktop_toplevel_create(E_Surface *e_surface, E_Desktop_Surface_Interface *iface, struct wl_resource *shell_surface_resource)
+EINTERN void
+e_desktop_toplevel_init(E_Desktop_Toplevel *toplevel, E_Desktop_Surface_Interface *iface, E_Surface *e_surface, struct wl_resource *shell_surface_resource)
 {
-   E_Desktop_Toplevel *toplevel;
-
-   toplevel = calloc(1, sizeof(*toplevel));
-   if (!toplevel)
-     return NULL;
-
    _surface_init(&toplevel->surface, e_surface, iface);
    _toplevel_init(toplevel, shell_surface_resource);
+}
 
-   return toplevel;
+EINTERN void
+e_desktop_toplevel_finish(E_Desktop_Toplevel *toplevel)
+{
+   _surface_finish(&toplevel->surface);
 }
 
 EINTERN E_Desktop_Toplevel *
@@ -253,12 +231,6 @@ e_desktop_toplevel_try_from_surface(E_Surface *e_surface)
    return _toplevel_from_surface(surface);
 }
 
-EINTERN void
-e_desktop_toplevel_destroy(E_Desktop_Toplevel *toplevel)
-{
-   _toplevel_destroy(toplevel);
-}
-
 EINTERN void
 e_desktop_toplevel_title_set(E_Desktop_Toplevel *toplevel, const char *title)
 {
index a5d5116d5e312bfd5788ef011bfee081c180e65d..0dcfda822e4f6c9ea6cba9af571f4e6abfdcc9fb 100644 (file)
@@ -14,10 +14,23 @@ struct _E_Desktop_Surface_Interface
    void (*unmap)(E_Desktop_Surface_Interface *iface);
 };
 
+struct _E_Desktop_Surface
+{
+   E_Surface *surface;
+   E_Desktop_Surface_Interface *iface;
+
+   struct wl_listener surface_destroy;
+};
+
+struct _E_Desktop_Toplevel
+{
+   E_Desktop_Surface surface;
+};
+
 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_init(E_Desktop_Toplevel *toplevel, E_Desktop_Surface_Interface *iface, E_Surface *e_surface, struct wl_resource *shell_surface_resource);
+void e_desktop_toplevel_finish(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);
 void e_desktop_toplevel_parent_set(E_Desktop_Toplevel *toplevel, E_Desktop_Toplevel *parent);
index e7b359cef7a05628336aad8d46afeb2e8dc3f619..e44067e8af8b74fda5b74e7a61fbf62d24809e42 100644 (file)
@@ -25,10 +25,9 @@ struct _E_Desktop_Xdg_Shell_V6
 
 struct _E_Desktop_Xdg_Toplevel_V6
 {
-   struct ds_xdg_toplevel_v6 *ds_toplevel;
-   E_Desktop_Toplevel *toplevel;
-
+   E_Desktop_Toplevel base;
    E_Desktop_Surface_Interface impl;
+   struct ds_xdg_toplevel_v6 *ds_toplevel;
 
    struct wl_listener set_parent;
    struct wl_listener set_title;
@@ -90,7 +89,7 @@ e_desktop_xdg_toplevel_v6_from_shell_surface_resource(struct wl_resource *shell_
 EINTERN E_Desktop_Toplevel *
 e_desktop_xdg_toplevel_v6_desktop_toplevel_get(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
-   return toplevel->toplevel;
+   return &toplevel->base;
 }
 
 static void
@@ -135,7 +134,7 @@ static void
 _toplevel_fullscreen_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
-   bool fullscreen = e_desktop_toplevel_is_fullscreen(toplevel->toplevel);
+   bool fullscreen = e_desktop_toplevel_is_fullscreen(&toplevel->base);
 
    if (ds_toplevel->scheduled.fullscreen == fullscreen)
      return;
@@ -149,7 +148,7 @@ static void
 _toplevel_maximized_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
-   bool maximized = e_desktop_toplevel_is_maximized(toplevel->toplevel);
+   bool maximized = e_desktop_toplevel_is_maximized(&toplevel->base);
 
    if (ds_toplevel->scheduled.maximized == maximized)
      return;
@@ -176,7 +175,7 @@ static void
 _toplevel_activated_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
-   bool activated = e_desktop_toplevel_is_activated(toplevel->toplevel);
+   bool activated = e_desktop_toplevel_is_activated(&toplevel->base);
 
    if (ds_toplevel->scheduled.activated == activated)
      return;
@@ -192,15 +191,15 @@ _toplevel_size_send(E_Desktop_Xdg_Toplevel_V6 *toplevel, int32_t width, int32_t
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
    int32_t cw = 0, ch = 0;
 
-   if (e_desktop_toplevel_is_fullscreen(toplevel->toplevel))
+   if (e_desktop_toplevel_is_fullscreen(&toplevel->base))
      {
-        e_desktop_toplevel_fullscreen_size_get(toplevel->toplevel, &cw, &ch);
+        e_desktop_toplevel_fullscreen_size_get(&toplevel->base, &cw, &ch);
         LOG("toplevel_v6(%p) FORCELY STAY current size (%d %d) of E_Client, requested size "
             "is (%d %d), the state: fullscreen", toplevel, cw, ch, width, height);
      }
-   else if (e_desktop_toplevel_is_maximized(toplevel->toplevel))
+   else if (e_desktop_toplevel_is_maximized(&toplevel->base))
      {
-        e_desktop_toplevel_maximized_size_get(toplevel->toplevel, &cw, &ch);
+        e_desktop_toplevel_maximized_size_get(&toplevel->base, &cw, &ch);
         LOG("toplevel_v6(%p) FORCELY STAY current size (%d %d) of E_Client, requested size "
             "is (%d %d), the state: maximized", toplevel, cw, ch, width, height);
      }
@@ -220,9 +219,6 @@ _toplevel_configure_send(E_Desktop_Surface_Interface *iface, uint32_t edges, int
 {
    E_Desktop_Xdg_Toplevel_V6 *toplevel = wl_container_of(iface, toplevel, impl);
 
-   if (!toplevel->toplevel)
-     return;
-
    _toplevel_fullscreen_send(toplevel);
    _toplevel_maximized_send(toplevel);
    _toplevel_resizing_send(toplevel, !!edges);
@@ -250,7 +246,7 @@ _toplevel_client_parent_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 
    LOG("toplevel_v6(%p) Set parent(%p)", toplevel, parent);
 
-   e_desktop_toplevel_parent_set(toplevel->toplevel, parent ? parent->toplevel : NULL);
+   e_desktop_toplevel_parent_set(&toplevel->base, parent ? &parent->base : NULL);
 }
 
 static void
@@ -260,7 +256,7 @@ _toplevel_title_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 
    LOG("toplevel_v6(%p) Set title: %s", toplevel, title ? title : "(null)");
 
-   e_desktop_toplevel_title_set(toplevel->toplevel, title);
+   e_desktop_toplevel_title_set(&toplevel->base, title);
 }
 
 static void
@@ -270,7 +266,7 @@ _toplevel_app_id_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 
    LOG("toplevel_v6(%p) Set app_id: %s", toplevel, app_id ? app_id : "(null)");
 
-   e_desktop_toplevel_app_id_set(toplevel->toplevel, app_id);
+   e_desktop_toplevel_app_id_set(&toplevel->base, app_id);
 }
 
 static void
@@ -278,7 +274,7 @@ _toplevel_move_begin(E_Desktop_Xdg_Toplevel_V6 *toplevel, struct wl_resource *se
 {
    LOG("toplevel_v6(%p) Begin interactive move", toplevel);
 
-   e_desktop_toplevel_interactive_move_begin(toplevel->toplevel, seat_resource);
+   e_desktop_toplevel_interactive_move_begin(&toplevel->base, seat_resource);
 }
 
 static void
@@ -288,7 +284,7 @@ _toplevel_resize_begin(E_Desktop_Xdg_Toplevel_V6 *toplevel, struct wl_resource *
 
    LOG("toplevel_v6(%p) Begin interactive resize", toplevel);
 
-   e_desktop_toplevel_interactive_resize_begin(toplevel->toplevel, toplevel_resource, seat_resource, edges);
+   e_desktop_toplevel_interactive_resize_begin(&toplevel->base, toplevel_resource, seat_resource, edges);
 }
 
 static void
@@ -318,7 +314,7 @@ _toplevel_window_geometry_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_surface_v6 *ds_xdg_surface = toplevel->ds_toplevel->base;
 
-   e_desktop_toplevel_window_geometry_set(toplevel->toplevel,
+   e_desktop_toplevel_window_geometry_set(&toplevel->base,
                                           ds_xdg_surface->current.geometry.x,
                                           ds_xdg_surface->current.geometry.y,
                                           ds_xdg_surface->current.geometry.width,
@@ -330,10 +326,10 @@ _toplevel_min_max_size_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
 
-   e_desktop_toplevel_min_size_set(toplevel->toplevel,
+   e_desktop_toplevel_min_size_set(&toplevel->base,
                                    ds_toplevel->current.min_width,
                                    ds_toplevel->current.min_height);
-   e_desktop_toplevel_max_size_set(toplevel->toplevel,
+   e_desktop_toplevel_max_size_set(&toplevel->base,
                                    ds_toplevel->current.max_width,
                                    ds_toplevel->current.max_height);
 }
@@ -395,9 +391,9 @@ _toplevel_cb_request_maximize(struct wl_listener *listener, void *data)
    LOG("toplevel_v6(%p) Request maximize(%d)", toplevel, toplevel->ds_toplevel->requested.maximized);
 
    if (toplevel->ds_toplevel->requested.maximized)
-     e_desktop_toplevel_maximize_request(toplevel->toplevel);
+     e_desktop_toplevel_maximize_request(&toplevel->base);
    else
-     e_desktop_toplevel_unmaximize_request(toplevel->toplevel);
+     e_desktop_toplevel_unmaximize_request(&toplevel->base);
 }
 
 static void
@@ -410,9 +406,9 @@ _toplevel_cb_request_fullscreen(struct wl_listener *listener, void *data)
    LOG("toplevel_v6(%p) Request fullscreen(%d)", toplevel, toplevel->ds_toplevel->requested.fullscreen);
 
    if (toplevel->ds_toplevel->requested.fullscreen)
-     e_desktop_toplevel_fullscreen_request(toplevel->toplevel);
+     e_desktop_toplevel_fullscreen_request(&toplevel->base);
    else
-     e_desktop_toplevel_unfullscreen_request(toplevel->toplevel);
+     e_desktop_toplevel_unfullscreen_request(&toplevel->base);
 }
 
 static void
@@ -424,7 +420,7 @@ _toplevel_cb_request_minimize(struct wl_listener *listener, void *data)
 
    LOG("toplevel_v6(%p) Set minimize", toplevel);
 
-   e_desktop_toplevel_minimize_request(toplevel->toplevel);
+   e_desktop_toplevel_minimize_request(&toplevel->base);
 }
 
 static void
@@ -511,10 +507,10 @@ _toplevel_init(E_Desktop_Xdg_Toplevel_V6 *toplevel)
    _toplevel_app_id_update(toplevel);
 
    if (ds_toplevel->requested.maximized)
-     e_desktop_toplevel_maximize_request(toplevel->toplevel);
+     e_desktop_toplevel_maximize_request(&toplevel->base);
 
    if (ds_toplevel->requested.fullscreen)
-     e_desktop_toplevel_fullscreen_request(toplevel->toplevel);
+     e_desktop_toplevel_fullscreen_request(&toplevel->base);
 }
 
 static void
@@ -540,22 +536,15 @@ _toplevel_add(E_Desktop_Xdg_Shell_V6 *shell, struct ds_xdg_surface_v6 *ds_xdg_su
         return;
      }
 
-   _toplevel_desktop_surface_interface_init(&toplevel->impl);
-
-   toplevel->toplevel = e_desktop_toplevel_create(surface, &toplevel->impl, ds_xdg_surface->resource);
-   if (!toplevel->toplevel)
-     {
-        ERR("Could not create E_Desktop_Shell");
-        free(toplevel);
-        return;
-     }
-
    toplevel->ds_toplevel = ds_xdg_surface->toplevel;
 
+   _toplevel_desktop_surface_interface_init(&toplevel->impl);
+   e_desktop_toplevel_init(&toplevel->base, &toplevel->impl, surface, ds_xdg_surface->resource);
+
    _toplevel_init(toplevel);
    _toplevel_listener_init(toplevel);
 
-   e_desktop_shell_toplevel_add(shell->desktop_shell, toplevel->toplevel);
+   e_desktop_shell_toplevel_add(shell->desktop_shell, &toplevel->base);
 
    ELOGF("XDG6", "Created E_Desktop_Xdg_Toplevel_V6(%p)", e_surface_ec_get(surface), toplevel);
 }
@@ -570,6 +559,6 @@ _toplevel_cb_xdg_surface_destroy(struct wl_listener *listener, void *data)
    LOG("Destroy E_Desktop_Xdg_Toplevel_V6(%p)", toplevel);
 
    _toplevel_listener_finish(toplevel);
-   e_desktop_toplevel_destroy(toplevel->toplevel);
+   e_desktop_toplevel_finish(&toplevel->base);
    free(toplevel);
 }