mirror of
https://github.com/swaywm/sway.git
synced 2024-12-29 00:16:22 +01:00
Merge pull request #1732 from emersion/view-children
Update for wlroots#824
This commit is contained in:
commit
21aedf1505
7 changed files with 38 additions and 64 deletions
|
@ -59,11 +59,9 @@ struct sway_wl_shell_surface {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sway_view_type {
|
enum sway_view_type {
|
||||||
SWAY_WL_SHELL_VIEW,
|
SWAY_VIEW_WL_SHELL,
|
||||||
SWAY_XDG_SHELL_V6_VIEW,
|
SWAY_VIEW_XDG_SHELL_V6,
|
||||||
SWAY_XWAYLAND_VIEW,
|
SWAY_VIEW_XWAYLAND,
|
||||||
// Keep last
|
|
||||||
SWAY_VIEW_TYPES,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sway_view_prop {
|
enum sway_view_prop {
|
||||||
|
@ -101,9 +99,6 @@ struct sway_view {
|
||||||
struct sway_xwayland_surface *sway_xwayland_surface;
|
struct sway_xwayland_surface *sway_xwayland_surface;
|
||||||
struct sway_wl_shell_surface *sway_wl_shell_surface;
|
struct sway_wl_shell_surface *sway_wl_shell_surface;
|
||||||
};
|
};
|
||||||
|
|
||||||
// only used for unmanaged views (shell specific)
|
|
||||||
struct wl_list unmanaged_view_link; // sway_root::unmanaged_views
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sway_view *view_create(enum sway_view_type type,
|
struct sway_view *view_create(enum sway_view_type type,
|
||||||
|
|
|
@ -188,7 +188,7 @@ static void render_view(struct sway_container *view, void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (sway_view->type) {
|
switch (sway_view->type) {
|
||||||
case SWAY_XDG_SHELL_V6_VIEW: {
|
case SWAY_VIEW_XDG_SHELL_V6: {
|
||||||
int window_offset_x = view->sway_view->wlr_xdg_surface_v6->geometry.x;
|
int window_offset_x = view->sway_view->wlr_xdg_surface_v6->geometry.x;
|
||||||
int window_offset_y = view->sway_view->wlr_xdg_surface_v6->geometry.y;
|
int window_offset_y = view->sway_view->wlr_xdg_surface_v6->geometry.y;
|
||||||
render_surface(surface, wlr_output, when,
|
render_surface(surface, wlr_output, when,
|
||||||
|
@ -197,15 +197,12 @@ static void render_view(struct sway_container *view, void *data) {
|
||||||
when, view->x - window_offset_x, view->y - window_offset_y, 0, alpha);
|
when, view->x - window_offset_x, view->y - window_offset_y, 0, alpha);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SWAY_WL_SHELL_VIEW:
|
case SWAY_VIEW_WL_SHELL:
|
||||||
render_wl_shell_surface(sway_view->wlr_wl_shell_surface, wlr_output,
|
render_wl_shell_surface(sway_view->wlr_wl_shell_surface, wlr_output,
|
||||||
when, view->x, view->y, 0, alpha, false);
|
when, view->x, view->y, 0, alpha, false);
|
||||||
break;
|
break;
|
||||||
case SWAY_XWAYLAND_VIEW:
|
case SWAY_VIEW_XWAYLAND:
|
||||||
render_surface(surface, wlr_output, when, view->x, view->y,
|
render_surface(surface, wlr_output, when, view->x, view->y, 0, alpha);
|
||||||
0, alpha);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
static bool assert_wl_shell(struct sway_view *view) {
|
static bool assert_wl_shell(struct sway_view *view) {
|
||||||
return sway_assert(view->type == SWAY_WL_SHELL_VIEW,
|
return sway_assert(view->type == SWAY_VIEW_WL_SHELL,
|
||||||
"Expecting wl_shell view!");
|
"Expecting wl_shell view!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_view *view = view_create(SWAY_WL_SHELL_VIEW, &view_impl);
|
struct sway_view *view = view_create(SWAY_VIEW_WL_SHELL, &view_impl);
|
||||||
if (!sway_assert(view, "Failed to allocate view")) {
|
if (!sway_assert(view, "Failed to allocate view")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
static bool assert_xdg(struct sway_view *view) {
|
static bool assert_xdg(struct sway_view *view) {
|
||||||
return sway_assert(view->type == SWAY_XDG_SHELL_V6_VIEW,
|
return sway_assert(view->type == SWAY_VIEW_XDG_SHELL_V6,
|
||||||
"Expected xdg shell v6 view!");
|
"Expected xdg shell v6 view!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_view *view = view_create(SWAY_XDG_SHELL_V6_VIEW, &view_impl);
|
struct sway_view *view = view_create(SWAY_VIEW_XDG_SHELL_V6, &view_impl);
|
||||||
if (!sway_assert(view, "Failed to allocate view")) {
|
if (!sway_assert(view, "Failed to allocate view")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ static void create_unmanaged(struct wlr_xwayland_surface *xsurface) {
|
||||||
|
|
||||||
|
|
||||||
static bool assert_xwayland(struct sway_view *view) {
|
static bool assert_xwayland(struct sway_view *view) {
|
||||||
return sway_assert(view->type == SWAY_XWAYLAND_VIEW,
|
return sway_assert(view->type == SWAY_VIEW_XWAYLAND,
|
||||||
"Expected xwayland view!");
|
"Expected xwayland view!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_view *view = view_create(SWAY_XWAYLAND_VIEW, &view_impl);
|
struct sway_view *view = view_create(SWAY_VIEW_XWAYLAND, &view_impl);
|
||||||
if (!sway_assert(view, "Failed to allocate view")) {
|
if (!sway_assert(view, "Failed to allocate view")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ static void seat_send_focus(struct sway_seat *seat,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
struct sway_view *view = con->sway_view;
|
struct sway_view *view = con->sway_view;
|
||||||
if (view->type == SWAY_XWAYLAND_VIEW) {
|
if (view->type == SWAY_VIEW_XWAYLAND) {
|
||||||
struct wlr_xwayland *xwayland =
|
struct wlr_xwayland *xwayland =
|
||||||
seat->input->server->xwayland;
|
seat->input->server->xwayland;
|
||||||
wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
|
wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
|
||||||
|
|
|
@ -412,51 +412,33 @@ struct sway_container *container_at(struct sway_container *parent,
|
||||||
double view_sx = ox - swayc->x;
|
double view_sx = ox - swayc->x;
|
||||||
double view_sy = oy - swayc->y;
|
double view_sy = oy - swayc->y;
|
||||||
|
|
||||||
|
double _sx, _sy;
|
||||||
|
struct wlr_surface *_surface;
|
||||||
switch (sview->type) {
|
switch (sview->type) {
|
||||||
case SWAY_WL_SHELL_VIEW:
|
case SWAY_VIEW_XWAYLAND:
|
||||||
|
_surface = wlr_surface_surface_at(sview->surface,
|
||||||
|
view_sx, view_sy, &_sx, &_sy);
|
||||||
break;
|
break;
|
||||||
case SWAY_XDG_SHELL_V6_VIEW:
|
case SWAY_VIEW_WL_SHELL:
|
||||||
|
_surface = wlr_wl_shell_surface_surface_at(
|
||||||
|
sview->wlr_wl_shell_surface,
|
||||||
|
view_sx, view_sy, &_sx, &_sy);
|
||||||
|
break;
|
||||||
|
case SWAY_VIEW_XDG_SHELL_V6:
|
||||||
// the top left corner of the sway container is the
|
// the top left corner of the sway container is the
|
||||||
// coordinate of the top left corner of the window geometry
|
// coordinate of the top left corner of the window geometry
|
||||||
view_sx += sview->wlr_xdg_surface_v6->geometry.x;
|
view_sx += sview->wlr_xdg_surface_v6->geometry.x;
|
||||||
view_sy += sview->wlr_xdg_surface_v6->geometry.y;
|
view_sy += sview->wlr_xdg_surface_v6->geometry.y;
|
||||||
|
|
||||||
// check for popups
|
_surface = wlr_xdg_surface_v6_surface_at(
|
||||||
double popup_sx, popup_sy;
|
sview->wlr_xdg_surface_v6,
|
||||||
struct wlr_xdg_surface_v6 *popup =
|
view_sx, view_sy, &_sx, &_sy);
|
||||||
wlr_xdg_surface_v6_popup_at(sview->wlr_xdg_surface_v6,
|
|
||||||
view_sx, view_sy, &popup_sx, &popup_sy);
|
|
||||||
|
|
||||||
if (popup) {
|
|
||||||
*sx = view_sx - popup_sx;
|
|
||||||
*sy = view_sy - popup_sy;
|
|
||||||
*surface = popup->surface;
|
|
||||||
return swayc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SWAY_XWAYLAND_VIEW:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (_surface) {
|
||||||
// check for subsurfaces
|
*sx = _sx;
|
||||||
double sub_x, sub_y;
|
*sy = _sy;
|
||||||
struct wlr_subsurface *subsurface =
|
*surface = _surface;
|
||||||
wlr_surface_subsurface_at(sview->surface,
|
|
||||||
view_sx, view_sy, &sub_x, &sub_y);
|
|
||||||
if (subsurface) {
|
|
||||||
*sx = view_sx - sub_x;
|
|
||||||
*sy = view_sy - sub_y;
|
|
||||||
*surface = subsurface->surface;
|
|
||||||
return swayc;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wlr_surface_point_accepts_input(
|
|
||||||
sview->surface, view_sx, view_sy)) {
|
|
||||||
*sx = view_sx;
|
|
||||||
*sy = view_sy;
|
|
||||||
*surface = swayc->sway_view->surface;
|
|
||||||
return swayc;
|
return swayc;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue