forked from mirror/dwl
merge toplevel_from_{wlr_layer_surface,popup} into client_from_wlr_surface
now it is a big function called toplevel_from_wlr_surface
This commit is contained in:
parent
c56bc42eb5
commit
38bd00351a
2 changed files with 52 additions and 66 deletions
108
client.h
108
client.h
|
@ -16,27 +16,6 @@ client_is_x11(Client *c)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Client *
|
|
||||||
client_from_wlr_surface(struct wlr_surface *s)
|
|
||||||
{
|
|
||||||
struct wlr_xdg_surface *surface;
|
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
|
||||||
struct wlr_xwayland_surface *xsurface;
|
|
||||||
if (s && wlr_surface_is_xwayland_surface(s)
|
|
||||||
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s)))
|
|
||||||
return xsurface->data;
|
|
||||||
#endif
|
|
||||||
if (s && wlr_surface_is_xdg_surface(s)
|
|
||||||
&& (surface = wlr_xdg_surface_from_wlr_surface(s))
|
|
||||||
&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
|
|
||||||
return surface->data;
|
|
||||||
|
|
||||||
if (s && wlr_surface_is_subsurface(s))
|
|
||||||
return client_from_wlr_surface(wlr_surface_get_root_surface(s));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
|
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
|
||||||
{
|
{
|
||||||
|
@ -72,6 +51,53 @@ client_surface(Client *c)
|
||||||
return c->surface.xdg->surface;
|
return c->surface.xdg->surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
toplevel_from_wlr_surface(struct wlr_surface *s)
|
||||||
|
{
|
||||||
|
struct wlr_xdg_surface *xdg_surface;
|
||||||
|
struct wlr_surface *root_surface;
|
||||||
|
struct wlr_layer_surface_v1 *layer_surface;
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
struct wlr_xwayland_surface *xsurface;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
return NULL;
|
||||||
|
root_surface = wlr_surface_get_root_surface(s);
|
||||||
|
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (wlr_surface_is_xwayland_surface(root_surface)
|
||||||
|
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(root_surface)))
|
||||||
|
return xsurface->data;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (wlr_surface_is_layer_surface(root_surface)
|
||||||
|
&& (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface)))
|
||||||
|
return layer_surface->data;
|
||||||
|
|
||||||
|
if (wlr_surface_is_xdg_surface(root_surface)
|
||||||
|
&& (xdg_surface = wlr_xdg_surface_from_wlr_surface(root_surface))) {
|
||||||
|
while (1) {
|
||||||
|
switch (xdg_surface->role) {
|
||||||
|
case WLR_XDG_SURFACE_ROLE_POPUP:
|
||||||
|
if (!xdg_surface->popup->parent)
|
||||||
|
return NULL;
|
||||||
|
else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
|
||||||
|
return toplevel_from_wlr_surface(xdg_surface->popup->parent);
|
||||||
|
|
||||||
|
xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
|
||||||
|
break;
|
||||||
|
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
||||||
|
return xdg_surface->data;
|
||||||
|
case WLR_XDG_SURFACE_ROLE_NONE:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* The others */
|
/* The others */
|
||||||
static inline void
|
static inline void
|
||||||
client_activate_surface(struct wlr_surface *s, int activated)
|
client_activate_surface(struct wlr_surface *s, int activated)
|
||||||
|
@ -320,43 +346,3 @@ client_wants_fullscreen(Client *c)
|
||||||
#endif
|
#endif
|
||||||
return c->surface.xdg->toplevel->requested.fullscreen;
|
return c->surface.xdg->toplevel->requested.fullscreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void *
|
|
||||||
toplevel_from_popup(struct wlr_xdg_popup *popup)
|
|
||||||
{
|
|
||||||
struct wlr_xdg_surface *surface = popup->base;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
switch (surface->role) {
|
|
||||||
case WLR_XDG_SURFACE_ROLE_POPUP:
|
|
||||||
if (!surface->popup->parent)
|
|
||||||
return NULL;
|
|
||||||
else if (wlr_surface_is_layer_surface(surface->popup->parent))
|
|
||||||
return wlr_layer_surface_v1_from_wlr_surface(surface->popup->parent)->data;
|
|
||||||
else if (!wlr_surface_is_xdg_surface(surface->popup->parent))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent);
|
|
||||||
break;
|
|
||||||
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
|
||||||
return surface->data;
|
|
||||||
case WLR_XDG_SURFACE_ROLE_NONE:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void *
|
|
||||||
toplevel_from_wlr_layer_surface(struct wlr_surface *s)
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
struct wlr_layer_surface_v1 *wlr_layer_surface;
|
|
||||||
|
|
||||||
if ((c = client_from_wlr_surface(s)))
|
|
||||||
return c;
|
|
||||||
else if (s && wlr_surface_is_layer_surface(s)
|
|
||||||
&& (wlr_layer_surface = wlr_layer_surface_v1_from_wlr_surface(s)))
|
|
||||||
return wlr_layer_surface->data;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
10
dwl.c
10
dwl.c
|
@ -908,7 +908,7 @@ createnotify(struct wl_listener *listener, void *data)
|
||||||
|
|
||||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
||||||
struct wlr_box box;
|
struct wlr_box box;
|
||||||
LayerSurface *l = toplevel_from_popup(xdg_surface->popup);
|
LayerSurface *l = toplevel_from_wlr_surface(xdg_surface->surface);
|
||||||
if (!xdg_surface->popup->parent)
|
if (!xdg_surface->popup->parent)
|
||||||
return;
|
return;
|
||||||
xdg_surface->surface->data = wlr_scene_xdg_surface_create(
|
xdg_surface->surface->data = wlr_scene_xdg_surface_create(
|
||||||
|
@ -1096,7 +1096,7 @@ focusclient(Client *c, int lift)
|
||||||
/* If an overlay is focused, don't focus or activate the client,
|
/* If an overlay is focused, don't focus or activate the client,
|
||||||
* but only update its position in fstack to render its border with focuscolor
|
* but only update its position in fstack to render its border with focuscolor
|
||||||
* and focus it after the overlay is closed. */
|
* and focus it after the overlay is closed. */
|
||||||
Client *w = client_from_wlr_surface(old);
|
Client *w = toplevel_from_wlr_surface(old);
|
||||||
if (wlr_surface_is_layer_surface(old)) {
|
if (wlr_surface_is_layer_surface(old)) {
|
||||||
struct wlr_layer_surface_v1 *wlr_layer_surface =
|
struct wlr_layer_surface_v1 *wlr_layer_surface =
|
||||||
wlr_layer_surface_v1_from_wlr_surface(old);
|
wlr_layer_surface_v1_from_wlr_surface(old);
|
||||||
|
@ -1472,7 +1472,7 @@ motionnotify(uint32_t time)
|
||||||
xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
|
xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
|
||||||
|
|
||||||
if (cursor_mode == CurPressed && !seat->drag) {
|
if (cursor_mode == CurPressed && !seat->drag) {
|
||||||
if ((l = toplevel_from_wlr_layer_surface(
|
if ((l = toplevel_from_wlr_surface(
|
||||||
seat->pointer_state.focused_surface))) {
|
seat->pointer_state.focused_surface))) {
|
||||||
surface = seat->pointer_state.focused_surface;
|
surface = seat->pointer_state.focused_surface;
|
||||||
sx = cursor->x - l->geom.x;
|
sx = cursor->x - l->geom.x;
|
||||||
|
@ -2357,8 +2357,8 @@ void
|
||||||
urgent(struct wl_listener *listener, void *data)
|
urgent(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
struct wlr_xdg_activation_v1_request_activate_event *event = data;
|
struct wlr_xdg_activation_v1_request_activate_event *event = data;
|
||||||
Client *c = client_from_wlr_surface(event->surface);
|
Client *c = toplevel_from_wlr_surface(event->surface);
|
||||||
if (c && c != selclient()) {
|
if (c && c->type != LayerShell && c != selclient()) {
|
||||||
c->isurgent = 1;
|
c->isurgent = 1;
|
||||||
printstatus();
|
printstatus();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue