-#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;
{
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;
{
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;
}
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;
}
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;
}
{
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);
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 *
_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
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);
}
_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);
}
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;
}
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);
}
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
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);
_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
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
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
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
_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
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);
}