xdg_shell_v6: Use E_Desktop_Toplevel 82/323182/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 25 Mar 2025 04:18:31 +0000 (13:18 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 24 Apr 2025 02:15:34 +0000 (11:15 +0900)
E_Desktop_Xdg_Shell_V6 creates E_Desktop_Toplevel, as a desktop-style
toplevel abstraction layer, to provide information about shell
protocols.

Change-Id: I9eeb40cd46b94ef036217a7a6bf7374492661c88

src/bin/core/e_client.c
src/bin/server/e_comp_wl.c
src/bin/server/e_desktop_shell.c
src/bin/server/e_desktop_shell_intern.h
src/bin/server/e_desktop_xdg_shell_v6.c

index f7f06d14570d33f09b540065cf1d24aadcd596cc..bb3374129f7a4ec7f37cf633fa84618a6ab94097 100644 (file)
@@ -6745,8 +6745,7 @@ e_client_show(E_Client *ec)
      return;
 
    comp_wl = e_comp_wl_get();
-   if ((ec->comp_data->shell.surface) && (ec->comp_data->shell.map) &&
-       (!ec->ignored))
+   if ((ec->comp_data->shell.surface) && (!ec->ignored))
      {
         ELOGF("E_CLIENT", "Map.", ec);
         _e_client_shell_map(ec);
index ee574c81130328b531f83ff237f6a05c51788671..e1673556169fc3444ba5b56b3386395f6e912635 100644 (file)
@@ -3308,8 +3308,7 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
              e_drag_resize(comp_wl->drag,
                            state->bw, state->bh);
           }
-        else if ((cdata->shell.surface) &&
-                 (cdata->shell.configure))
+        else if (cdata->shell.surface)
           {
              e_comp_wl_commit_sync_configure(ec);
           }
index 4e67c4bfef58b3a223fec56ceb34ab004b187995..2d431bc3a3f16375444c50f230834de278053a16 100644 (file)
@@ -8,6 +8,7 @@
 #include "e_comp_wl_shell_intern.h"
 #include "e_comp_wl_intern.h"
 
+#include <stdbool.h>
 #include <wayland-server.h>
 #include <wayland-util.h>
 
@@ -370,3 +371,38 @@ e_desktop_toplevel_max_size_set(E_Desktop_Toplevel *toplevel, int width, int hei
    ec->icccm.max_h = height;
 }
 
+EINTERN bool
+e_desktop_toplevel_is_fullscreen(E_Desktop_Toplevel *toplevel)
+{
+   E_Client *ec = e_surface_ec_get(toplevel->surface.surface);
+
+   return ec->fullscreen;
+}
+
+EINTERN bool
+e_desktop_toplevel_is_maximized(E_Desktop_Toplevel *toplevel)
+{
+   E_Client *ec = e_surface_ec_get(toplevel->surface.surface);
+
+   return !!ec->maximized;
+}
+
+EINTERN bool
+e_desktop_toplevel_is_activated(E_Desktop_Toplevel *toplevel)
+{
+   E_Client *ec = e_surface_ec_get(toplevel->surface.surface);
+
+   return ec == e_client_focused_get();
+}
+
+EINTERN void
+e_desktop_toplevel_size_get(E_Desktop_Toplevel *toplevel, int32_t *width, int32_t *height)
+{
+   E_Client *ec = e_surface_ec_get(toplevel->surface.surface);
+
+   if (ec->fullscreen)
+     e_client_base_output_resolution_useful_geometry_get(ec, NULL, NULL, width, height);
+   else if (ec->maximized)
+     e_client_maximized_geometry_get(ec, NULL, NULL, width, height);
+}
+
index 4502cbf971a81c75f23d7e229aa365cbc27a987a..765e25e7c323956f39dbb6eb05d356c60587b5f6 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "e_compositor_intern.h"
 
+#include <stdbool.h>
 #include <wayland-server.h>
 
 typedef struct _E_Desktop_Shell E_Desktop_Shell;
@@ -19,5 +20,9 @@ void e_desktop_surface_map(E_Desktop_Surface *surface);
 void e_desktop_surface_unmap(E_Desktop_Surface *surface);
 
 E_Desktop_Toplevel *e_desktop_toplevel_try_from_surface(E_Surface *e_surface);
+bool e_desktop_toplevel_is_fullscreen(E_Desktop_Toplevel *toplevel);
+bool e_desktop_toplevel_is_maximized(E_Desktop_Toplevel *toplevel);
+bool e_desktop_toplevel_is_activated(E_Desktop_Toplevel *toplevel);
+void e_desktop_toplevel_size_get(E_Desktop_Toplevel *toplevel, int32_t *width, int32_t *height);
 
 #endif
index 518de9e3e96700823ff705c760000e9e705df2db..849f6b9766b676f57e372aab4ab498d4686b4f13 100644 (file)
@@ -1,20 +1,17 @@
-#include "e_comp_wl_intern.h"
-#include "e_comp_wl_shell_intern.h"
+#include "e_compositor_intern.h"
+#include "e_desktop_shell_intern.h"
+#include "e_desktop_shell_private.h"
 #include "e_client_intern.h"
-#include "e_config_intern.h"
 
+#include <stdbool.h>
 #include <libds/surface.h>
 #include <libds/types/ds_xdg_shell_v6.h>
 
 #ifdef LOG
 #undef LOG
 #endif
-#ifdef ERR
-#undef ERR
-#endif
 
-#define LOG(f, e, x...)  ELOGF("XDG6 <LOG>", f, e, ##x)
-#define ERR(f, e, x...)  ELOGF("XDG6 <ERR>", f, e, ##x)
+#define LOG(f, x...)  INF("XDG6 <LOG> " f, ##x)
 
 typedef struct _E_Desktop_Xdg_Shell_V6 E_Desktop_Xdg_Shell_V6;
 typedef struct _E_Desktop_Xdg_Toplevel_V6 E_Desktop_Xdg_Toplevel_V6;
@@ -31,6 +28,9 @@ struct _E_Desktop_Xdg_Toplevel_V6
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel;
    E_Client *ec;
+   E_Desktop_Toplevel *toplevel;
+
+   E_Desktop_Surface_Interface impl;
 
    struct wl_listener set_parent;
    struct wl_listener set_title;
@@ -57,11 +57,11 @@ e_desktop_xdg_shell_v6_init(struct wl_display *display)
 {
    static E_Desktop_Xdg_Shell_V6 shell = { .ds_xdg_shell = NULL };
 
-   LOG("Initializing Xdg_Shell_V6", NULL);
+   LOG("Initializing Xdg_Shell_V6");
 
    if (shell.ds_xdg_shell)
      {
-        LOG("Xdg_Shell_V6 already initialized", NULL);
+        LOG("Xdg_Shell_V6 already initialized");
         return EINA_TRUE;
      }
 
@@ -69,7 +69,7 @@ e_desktop_xdg_shell_v6_init(struct wl_display *display)
    shell.ds_xdg_shell = ds_xdg_shell_v6_create(display);
    if (!shell.ds_xdg_shell)
      {
-        ERR("Could not create ds_xdg_shell_v6", NULL);
+        ERR("Could not create ds_xdg_shell_v6");
         return EINA_FALSE;
      }
 
@@ -89,7 +89,7 @@ e_desktop_xdg_shell_v6_xdg_surface_ec_get(struct wl_resource *resource)
    toplevel = _toplevel_from_shell_surface_resource(resource);
    if (!toplevel)
      {
-        ERR("No E_Desktop_Xdg_Toplevel_V6 in wl_resource", NULL);
+        ERR("No E_Desktop_Xdg_Toplevel_V6 in wl_resource");
         return NULL;
      }
 
@@ -101,7 +101,7 @@ _shell_cb_destroy(struct wl_listener *listener, void *data)
 {
    E_Desktop_Xdg_Shell_V6 *shell;
 
-   LOG("Destroy Xdg_Shell_V6", NULL);
+   LOG("Destroy Xdg_Shell_V6");
 
    shell = wl_container_of(listener, shell, destroy);
    wl_list_remove(&shell->destroy.link);
@@ -117,7 +117,7 @@ _shell_cb_new_surface(struct wl_listener *listener, void *data)
    if (ds_xdg_surface->role == DS_XDG_SURFACE_V6_ROLE_TOPLEVEL)
      _toplevel_add(ds_xdg_surface);
    else
-     ERR("Not implemented: xdg_surface_v6(role:%d)", NULL, ds_xdg_surface->role);
+     ERR("Not implemented: xdg_surface_v6(role:%d)", ds_xdg_surface->role);
 }
 
 static E_Desktop_Xdg_Toplevel_V6 *
@@ -143,28 +143,28 @@ static void
 _toplevel_fullscreen_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
-   E_Client *ec = toplevel->ec;
+   bool fullscreen = e_desktop_toplevel_is_fullscreen(toplevel->toplevel);
 
-   if (ds_toplevel->scheduled.fullscreen == ec->fullscreen)
+   if (ds_toplevel->scheduled.fullscreen == fullscreen)
      return;
 
-   LOG("Send fullscreen(%d)", ec, ec->fullscreen);
+   LOG("toplevel_v6(%p) Send fullscreen(%d)", toplevel, fullscreen);
 
-   ds_xdg_toplevel_v6_set_fullscreen(ds_toplevel, ec->fullscreen);
+   ds_xdg_toplevel_v6_set_fullscreen(ds_toplevel, fullscreen);
 }
 
 static void
 _toplevel_maximized_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
-   E_Client *ec = toplevel->ec;
+   bool maximized = e_desktop_toplevel_is_maximized(toplevel->toplevel);
 
-   if (ds_toplevel->scheduled.maximized == !!ec->maximized)
+   if (ds_toplevel->scheduled.maximized == maximized)
      return;
 
-   LOG("Send maximized(%d)", ec, ec->maximized);
+   LOG("toplevel_v6(%p) Send maximized(%d)", toplevel, maximized);
 
-   ds_xdg_toplevel_v6_set_maximized(ds_toplevel, ec->maximized);
+   ds_xdg_toplevel_v6_set_maximized(ds_toplevel, maximized);
 }
 
 static void
@@ -175,7 +175,7 @@ _toplevel_resizing_send(E_Desktop_Xdg_Toplevel_V6 *toplevel, Eina_Bool resizing)
    if (ds_toplevel->scheduled.resizing == resizing)
      return;
 
-   LOG("Send resizing(%d)", toplevel->ec, resizing);
+   LOG("toplevel_v6(%p) Send resizing(%d)", toplevel, resizing);
 
    ds_xdg_toplevel_v6_set_resizing(ds_toplevel, resizing);
 }
@@ -184,16 +184,12 @@ static void
 _toplevel_activated_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
-   E_Client *ec = toplevel->ec, *focused_ec;
-   Eina_Bool activated;
-
-   focused_ec = e_client_focused_get();
-   activated = (focused_ec == ec);
+   bool activated = e_desktop_toplevel_is_activated(toplevel->toplevel);
 
    if (ds_toplevel->scheduled.activated == activated)
      return;
 
-   LOG("Send activated(%d)", ec, activated);
+   LOG("toplevel_v6(%p) Send activated(%d)", toplevel, activated);
 
    ds_xdg_toplevel_v6_set_activated(ds_toplevel, activated);
 }
@@ -201,26 +197,19 @@ _toplevel_activated_send(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 static void
 _toplevel_size_send(E_Desktop_Xdg_Toplevel_V6 *toplevel, int32_t width, int32_t height)
 {
-   E_Client *ec = toplevel->ec;
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
    int32_t configure_width = 0, configure_height = 0;
    int mw, mh;
+   bool fullscreen, maximized;
 
-   if (ec->fullscreen)
-     {
-        e_client_base_output_resolution_useful_geometry_get(ec, NULL, NULL, &mw, &mh);
-        LOG("FORCELY STAY current fullscreen size (%d %d) of E_Client, requested size "
-            "is (%d %d), the state (maximize %d, fullscreen %d)",
-            ec, mw, mh, width, height, ec->maximized, ec->fullscreen);
-        configure_width = mw;
-        configure_height = mh;
-     }
-   else if (ec->maximized)
+   fullscreen = e_desktop_toplevel_is_fullscreen(toplevel->toplevel);
+   maximized = e_desktop_toplevel_is_maximized(toplevel->toplevel);
+   if (fullscreen || maximized)
      {
-        e_client_maximized_geometry_get(ec, NULL, NULL, &mw, &mh);
-        LOG("FORCELY STAY current maximized size (%d %d) of E_Client, requested size "
+        e_desktop_toplevel_size_get(toplevel->toplevel, &mw, &mh);
+        LOG("toplevel_v6(%p) FORCELY STAY current size (%d %d) of E_Client, requested size "
             "is (%d %d), the state (maximize %d, fullscreen %d)",
-            ec, mw, mh, width, height, ec->maximized, ec->fullscreen);
+            toplevel, mw, mh, width, height, maximized, fullscreen);
         configure_width = mw;
         configure_height = mh;
      }
@@ -230,19 +219,17 @@ _toplevel_size_send(E_Desktop_Xdg_Toplevel_V6 *toplevel, int32_t width, int32_t
         configure_height = height;
      }
 
-   LOG("Send size(%dx%d)", ec, configure_width, configure_height);
+   LOG("toplevel_v6(%p) Send size(%dx%d)", toplevel, configure_width, configure_height);
 
    ds_xdg_toplevel_v6_set_size(ds_toplevel, configure_width, configure_height);
 }
 
 static void
-_toplevel_configure_send(struct wl_resource *shsurface_resource,
-                                  uint32_t edges, int32_t width, int32_t height)
+_toplevel_configure_send(E_Desktop_Surface_Interface *iface, uint32_t edges, int32_t width, int32_t height)
 {
-   E_Desktop_Xdg_Toplevel_V6 *toplevel;
+   E_Desktop_Xdg_Toplevel_V6 *toplevel = wl_container_of(iface, toplevel, impl);
 
-   toplevel = _toplevel_from_shell_surface_resource(shsurface_resource);
-   if (!toplevel)
+   if (!toplevel->toplevel)
      return;
 
    _toplevel_fullscreen_send(toplevel);
@@ -253,222 +240,64 @@ _toplevel_configure_send(struct wl_resource *shsurface_resource,
 }
 
 static void
-_toplevel_configure(struct wl_resource *shsurface_resource,
-                             Evas_Coord x, Evas_Coord y,
-                             Evas_Coord w, Evas_Coord h)
-{
-   E_Desktop_Xdg_Toplevel_V6 *toplevel;
-
-   toplevel = _toplevel_from_shell_surface_resource(shsurface_resource);
-   if (!toplevel)
-     return;
-
-   e_client_util_move_resize_without_frame(toplevel->ec, x, y, w, h);
-}
-
-static void
-_toplevel_ping(struct wl_resource *shsurface_resource)
+_toplevel_ping(E_Desktop_Surface_Interface *iface)
 {
-   E_Desktop_Xdg_Toplevel_V6 *toplevel;
-
-   toplevel = _toplevel_from_shell_surface_resource(shsurface_resource);
-   if (!toplevel)
-     return;
+   E_Desktop_Xdg_Toplevel_V6 *toplevel = wl_container_of(iface, toplevel, impl);
 
-   LOG("Ping", toplevel->ec);
+   LOG("toplevel_v6(%p) Ping", toplevel);
 
    ds_xdg_surface_v6_ping(toplevel->ds_toplevel->base);
 }
 
-static void
-_e_xdg_surface_v6_map(struct wl_resource *shsurface_resource)
-{
-   E_Desktop_Xdg_Toplevel_V6 *toplevel;
-
-   toplevel = _toplevel_from_shell_surface_resource(shsurface_resource);
-   if (!toplevel)
-     return;
-
-   LOG("Map", toplevel->ec);
-
-   e_shell_e_client_map(toplevel->ec);
-}
-
-static void
-_toplevel_unmap(struct wl_resource *shsurface_resource)
-{
-   E_Desktop_Xdg_Toplevel_V6 *toplevel;
-
-   toplevel = _toplevel_from_shell_surface_resource(shsurface_resource);
-   if (!toplevel)
-     return;
-
-   LOG("Unmap", toplevel->ec);
-
-   e_shell_e_client_unmap(toplevel->ec);
-}
-
-static E_Shell_Surface_Api shell_xdg_toplevel_v6_api = {
-     .configure_send = _toplevel_configure_send,
-     .configure = _toplevel_configure,
-     .ping = _toplevel_ping,
-     .map = _e_xdg_surface_v6_map,
-     .unmap = _toplevel_unmap,
-};
-
-static void
-_toplevel_role_init(E_Desktop_Xdg_Toplevel_V6 *toplevel)
-{
-   E_Client *ec = toplevel->ec;
-   struct ds_xdg_surface_v6 *ds_xdg_surface = toplevel->ds_toplevel->base;
-
-   e_shell_e_client_shsurface_assign(ec,
-                                     ds_xdg_surface->resource,
-                                     &shell_xdg_toplevel_v6_api);
-
-   e_shell_e_client_toplevel_set(ec);
-   e_comp_wl_shell_surface_ready(toplevel->ec);
-}
-
 static void
 _toplevel_client_parent_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
-   E_Client *ec = toplevel->ec;
-   struct ds_xdg_toplevel_v6 *parent = toplevel->ds_toplevel->parent;
-   struct wl_resource *parent_surface_resource = NULL;
+   E_Desktop_Xdg_Toplevel_V6 *parent = NULL;
 
-   if (parent)
-     {
-        parent_surface_resource =
-           ds_surface_get_wl_resource(parent->base->ds_surface);
-     }
+   if (toplevel->ds_toplevel->parent)
+     parent = _toplevel_from_shell_surface_resource(toplevel->ds_toplevel->parent->base->resource);
 
-   LOG("Set parent: resource(%p)", ec, parent_surface_resource);
+   LOG("toplevel_v6(%p) Set parent(%p)", toplevel, parent);
 
-   e_shell_e_client_parent_set(ec, parent_surface_resource);
-   EC_CHANGED(ec);
+   e_desktop_toplevel_parent_set(toplevel->toplevel, parent ? parent->toplevel : NULL);
 }
 
 static void
 _toplevel_title_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
-   E_Client *ec = toplevel->ec;
    char *title = toplevel->ds_toplevel->title;
 
-   LOG("Set title: %s", ec, title ? title : "(null)");
+   LOG("toplevel_v6(%p) Set title: %s", toplevel, title ? title : "(null)");
 
-   e_shell_e_client_name_title_set(ec, title, title);
+   e_desktop_toplevel_title_set(toplevel->toplevel, title);
 }
 
 static void
 _toplevel_app_id_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
-   E_Client *ec = toplevel->ec;
    char *app_id = toplevel->ds_toplevel->app_id;
-   struct wl_client *client;
-
-   client = wl_resource_get_client(toplevel->ds_toplevel->resource);
-   wl_client_get_credentials(client, &ec->netwm.pid, NULL, NULL);
 
-   LOG("Set app_id: %s, PID(%d)", ec, app_id ? app_id : "(null)", ec->netwm.pid);
+   LOG("toplevel_v6(%p) Set app_id: %s", toplevel, app_id ? app_id : "(null)");
 
-   e_shell_e_client_app_id_set(ec, app_id);
+   e_desktop_toplevel_app_id_set(toplevel->toplevel, app_id);
 }
 
 static void
 _toplevel_move_begin(E_Desktop_Xdg_Toplevel_V6 *toplevel, struct wl_resource *seat_resource)
 {
-   E_Client *ec = toplevel->ec;
-
-   LOG("Begin interactive move", ec);
+   LOG("toplevel_v6(%p) Begin interactive move", toplevel);
 
-   if (!e_shell_e_client_interactive_move(ec, seat_resource))
-     ERR("Failed to move this Toplevel(%p)", ec, toplevel);
+   e_desktop_toplevel_move_begin(toplevel->toplevel, seat_resource);
 }
 
 static void
 _toplevel_resize_begin(E_Desktop_Xdg_Toplevel_V6 *toplevel, struct wl_resource *seat_resource, uint32_t edges)
 {
-   E_Client *ec = toplevel->ec;
    struct wl_resource *toplevel_resource = toplevel->ds_toplevel->resource;
 
-   LOG("Begin interactive resize", ec);
+   LOG("toplevel_v6(%p) Begin interactive resize", toplevel);
 
-   if (!e_shell_e_client_interactive_resize(ec, toplevel_resource, seat_resource, edges))
-     ERR("Failed to move this Toplevel(%p)", ec, toplevel);
-}
-
-static void
-_toplevel_maximize_set(E_Desktop_Xdg_Toplevel_V6 *toplevel)
-{
-   E_Client *ec = toplevel->ec;
-   E_Maximize max = ec->maximize_type | E_MAXIMIZE_BOTH;
-
-   LOG("Set maximize. lock_user_maximize:%d, dir:%d",
-       ec, ec->lock_user_maximize, ec->maximize_dir);
-
-   if (ec->lock_user_maximize)
-     return;
-
-   if ((ec->maximize_dir != E_MAXIMIZE_DIRECTION_ALL) &&
-       (ec->maximize_dir != E_MAXIMIZE_DIRECTION_NONE))
-     return;
-
-   e_client_layout_apply(ec, EINA_FALSE);
-   e_client_maximize(ec, max);
-}
-
-static void
-_toplevel_maximize_unset(E_Desktop_Xdg_Toplevel_V6 *toplevel)
-{
-   E_Client *ec = toplevel->ec;
-
-   LOG("Unset maximize. lock_user_maximize:%d", ec, ec->lock_user_maximize);
-
-   e_client_layout_apply(ec, EINA_FALSE);
-
-   ec->maximize_dir = E_MAXIMIZE_DIRECTION_NONE;
-   /* it's doubtful */
-   e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
-}
-
-static void
-_toplevel_fullscreen_set(E_Desktop_Xdg_Toplevel_V6 *toplevel)
-{
-   E_Client *ec = toplevel->ec;
-
-   LOG("Set fullscreen. lock_user_fullscreen:%d", ec, ec->lock_user_fullscreen);
-
-   if (ec->lock_user_fullscreen)
-     return;
-
-   e_client_fullscreen(ec, e_config->fullscreen_policy);
-}
-
-static void
-_toplevel_fullscreen_unset(E_Desktop_Xdg_Toplevel_V6 *toplevel)
-{
-   E_Client *ec = toplevel->ec;
-
-   LOG("Unset fullscreen. lock_user_fullscreen:%d", ec, ec->lock_user_fullscreen);
-
-   if (ec->lock_user_fullscreen)
-     return;
-
-   e_client_unfullscreen(ec);
-}
-
-static void
-_toplevel_minimize_set(E_Desktop_Xdg_Toplevel_V6 *toplevel)
-{
-   E_Client *ec = toplevel->ec;
-
-   LOG("Set minimize. lock_client_iconify:%d", ec, ec->lock_client_iconify);
-
-   if (ec->lock_client_iconify)
-     return;
-
-   e_client_iconify(ec);
+   e_desktop_toplevel_resize_begin(toplevel->toplevel, toplevel_resource, seat_resource, edges);
 }
 
 static void
@@ -486,8 +315,8 @@ _toplevel_oldest_configure_remove(E_Desktop_Xdg_Toplevel_V6 *toplevel)
                                       oldest_configure,
                                       link);
 
-   LOG("Don't rececive Configure Ack. Remove oldest configure:%p, serial:%d",
-       toplevel->ec, oldest_configure, oldest_configure->serial);
+   LOG("toplevel_v6(%p) Don't rececive Configure Ack. Remove oldest configure:%p, serial:%d",
+       toplevel, oldest_configure, oldest_configure->serial);
 
    wl_list_remove(&oldest_configure->link);
    free(oldest_configure);
@@ -497,32 +326,25 @@ static void
 _toplevel_window_geometry_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
    struct ds_xdg_surface_v6 *ds_xdg_surface = toplevel->ds_toplevel->base;
-   E_Comp_Wl_Client_Data *cdata;
 
-   cdata = e_client_cdata_get(toplevel->ec);
-   if (!cdata)
-     return;
-
-   EINA_RECTANGLE_SET(&cdata->shell.window,
-                      ds_xdg_surface->current.geometry.x,
-                      ds_xdg_surface->current.geometry.y,
-                      ds_xdg_surface->current.geometry.width,
-                      ds_xdg_surface->current.geometry.height);
+   e_desktop_toplevel_window_geometry_set(toplevel->toplevel,
+                                          ds_xdg_surface->current.geometry.x,
+                                          ds_xdg_surface->current.geometry.y,
+                                          ds_xdg_surface->current.geometry.width,
+                                          ds_xdg_surface->current.geometry.height);
 }
 
 static void
 _toplevel_min_max_size_update(E_Desktop_Xdg_Toplevel_V6 *toplevel)
 {
-   E_Client *ec = toplevel->ec;
    struct ds_xdg_toplevel_v6 *ds_toplevel = toplevel->ds_toplevel;
 
-   if (ec->lock_client_size)
-     return;
-
-   ec->icccm.min_w = ds_toplevel->current.min_width;
-   ec->icccm.min_h = ds_toplevel->current.min_height;
-   ec->icccm.max_w = ds_toplevel->current.max_width;
-   ec->icccm.max_h = ds_toplevel->current.max_height;
+   e_desktop_toplevel_min_size_set(toplevel->toplevel,
+                                   ds_toplevel->current.min_width,
+                                   ds_toplevel->current.min_height);
+   e_desktop_toplevel_max_size_set(toplevel->toplevel,
+                                   ds_toplevel->current.max_width,
+                                   ds_toplevel->current.max_height);
 }
 
 static void
@@ -578,10 +400,13 @@ _toplevel_cb_request_maximize(struct wl_listener *listener, void *data)
    E_Desktop_Xdg_Toplevel_V6 *toplevel;
 
    toplevel = wl_container_of(listener, toplevel, request_maximize);
+
+   LOG("toplevel_v6(%p) Request maximize(%d)", toplevel, toplevel->ds_toplevel->requested.maximized);
+
    if (toplevel->ds_toplevel->requested.maximized)
-     _toplevel_maximize_set(toplevel);
+     e_desktop_toplevel_maximize_request(toplevel->toplevel);
    else
-     _toplevel_maximize_unset(toplevel);
+     e_desktop_toplevel_unmaximize_request(toplevel->toplevel);
 }
 
 static void
@@ -590,10 +415,13 @@ _toplevel_cb_request_fullscreen(struct wl_listener *listener, void *data)
    E_Desktop_Xdg_Toplevel_V6 *toplevel;
 
    toplevel = wl_container_of(listener, toplevel, request_fullscreen);
+
+   LOG("toplevel_v6(%p) Request fullscreen(%d)", toplevel, toplevel->ds_toplevel->requested.fullscreen);
+
    if (toplevel->ds_toplevel->requested.fullscreen)
-     _toplevel_fullscreen_set(toplevel);
+     e_desktop_toplevel_fullscreen_request(toplevel->toplevel);
    else
-     _toplevel_fullscreen_unset(toplevel);
+     e_desktop_toplevel_unfullscreen_request(toplevel->toplevel);
 }
 
 static void
@@ -602,7 +430,10 @@ _toplevel_cb_request_minimize(struct wl_listener *listener, void *data)
    E_Desktop_Xdg_Toplevel_V6 *toplevel;
 
    toplevel = wl_container_of(listener, toplevel, request_minimize);
-   _toplevel_minimize_set(toplevel);
+
+   LOG("toplevel_v6(%p) Set minimize", toplevel);
+
+   e_desktop_toplevel_minimize_request(toplevel->toplevel);
 }
 
 static void
@@ -689,40 +520,45 @@ _toplevel_init(E_Desktop_Xdg_Toplevel_V6 *toplevel)
    _toplevel_app_id_update(toplevel);
 
    if (ds_toplevel->requested.maximized)
-     _toplevel_maximize_set(toplevel);
+     e_desktop_toplevel_maximize_request(toplevel->toplevel);
 
    if (ds_toplevel->requested.fullscreen)
-     _toplevel_fullscreen_set(toplevel);
-
-   _toplevel_role_init(toplevel);
+     e_desktop_toplevel_fullscreen_request(toplevel->toplevel);
 }
 
 static void
-_toplevel_finish(E_Desktop_Xdg_Toplevel_V6 *toplevel)
+_toplevel_desktop_surface_interface_init(E_Desktop_Surface_Interface *iface)
 {
-   e_shell_e_client_destroy(toplevel->ec);
+   iface->configure_send = _toplevel_configure_send;
+   iface->ping = _toplevel_ping;
+   iface->configure = NULL;
+   iface->map = NULL;
+   iface->unmap = NULL;
 }
 
 static void
 _toplevel_add(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 = E_NEW(E_Desktop_Xdg_Toplevel_V6, 1);
    if (!toplevel)
      {
-        ERR("Could not create E_Desktop_Xdg_Toplevel_V6", NULL);
+        ERR("Could not create E_Desktop_Xdg_Toplevel_V6");
         return;
      }
 
+   _toplevel_desktop_surface_interface_init(&toplevel->impl);
+
    toplevel->ds_toplevel = ds_xdg_surface->toplevel;
-   toplevel->ec = e_client_from_surface_resource(
-      ds_surface_get_wl_resource(ds_xdg_surface->ds_surface));
+   toplevel->ec = e_surface_ec_get(surface);
+   toplevel->toplevel = e_desktop_toplevel_create(surface, &toplevel->impl, ds_xdg_surface->resource);
 
-   _toplevel_listener_init(toplevel);
    _toplevel_init(toplevel);
+   _toplevel_listener_init(toplevel);
 
-   LOG("Created E_Desktop_Xdg_Toplevel_V6(%p)", toplevel->ec, toplevel);
+   ELOGF("XDG6", "Created E_Desktop_Xdg_Toplevel_V6(%p)", toplevel->ec, toplevel);
 }
 
 static void
@@ -732,9 +568,8 @@ _toplevel_cb_xdg_surface_destroy(struct wl_listener *listener, void *data)
 
    toplevel = wl_container_of(listener, toplevel, destroy);
 
-   LOG("Destroy E_Desktop_Xdg_Toplevel_V6(%p)", toplevel->ec, toplevel);
+   ELOGF("XDG6", "Destroy E_Desktop_Xdg_Toplevel_V6(%p)", toplevel->ec, toplevel);
 
    _toplevel_listener_finish(toplevel);
-   _toplevel_finish(toplevel);
    free(toplevel);
 }