Trying it with the normal wlroots + patches

This commit is contained in:
Gerben Jan Dijkman 2023-01-10 16:33:37 +01:00
parent e9ad714586
commit 1c3564ed79
8 changed files with 271 additions and 4 deletions

View File

@ -0,0 +1,14 @@
diff --git a/types/wlr_output_layout.c b/types/wlr_output_layout.c
index 28d91e8d42cfb75b9ca151be451e5ba287f33ca0..ef6e2850ca0e81d12b1cac9d1bc059b0f1f93694 100644
--- a/types/wlr_output_layout.c
+++ b/types/wlr_output_layout.c
@@ -231,6 +231,9 @@ bool wlr_output_layout_contains_point(struct wlr_output_layout *layout,
if (reference) {
struct wlr_output_layout_output *l_output =
wlr_output_layout_get(layout, reference);
+ if (!l_output) {
+ return false;
+ }
struct wlr_box output_box;
output_layout_output_get_box(l_output, &output_box);
return wlr_box_contains_point(&output_box, lx, ly);

View File

@ -0,0 +1,121 @@
diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h
index ebbcfd479e2c8bec747f2ef37ca344eb8cb48645..1946873ae846dcb1b26596fa61962b08b1e57228 100644
--- a/include/wlr/types/wlr_seat.h
+++ b/include/wlr/types/wlr_seat.h
@@ -119,9 +119,11 @@ struct wlr_touch_grab_interface {
void (*enter)(struct wlr_seat_touch_grab *grab, uint32_t time_msec,
struct wlr_touch_point *point);
void (*frame)(struct wlr_seat_touch_grab *grab);
- // XXX this will conflict with the actual touch cancel which is different so
- // we need to rename this
+ // Cancel grab
void (*cancel)(struct wlr_seat_touch_grab *grab);
+ // Send wl_touch::cancel
+ void (*wl_cancel)(struct wlr_seat_touch_grab *grab,
+ struct wlr_surface *surface);
};
/**
@@ -613,6 +615,14 @@ void wlr_seat_touch_send_up(struct wlr_seat *seat, uint32_t time_msec,
void wlr_seat_touch_send_motion(struct wlr_seat *seat, uint32_t time_msec,
int32_t touch_id, double sx, double sy);
+/**
+ * Notify the seat that this is a global gesture and the client should cancel
+ * processing it. The event will go to the client for the surface given.
+ * This function does not respect touch grabs: you probably want
+ * `wlr_seat_touch_notify_cancel()` instead.
+ */
+void wlr_seat_touch_send_cancel(struct wlr_seat *seat, struct wlr_surface *surface);
+
void wlr_seat_touch_send_frame(struct wlr_seat *seat);
/**
@@ -639,6 +649,13 @@ void wlr_seat_touch_notify_up(struct wlr_seat *seat, uint32_t time_msec,
void wlr_seat_touch_notify_motion(struct wlr_seat *seat, uint32_t time_msec,
int32_t touch_id, double sx, double sy);
+/**
+ * Notify the seat that this is a global gesture and the client should
+ * cancel processing it. Defers to any grab of the touch device.
+ */
+void wlr_seat_touch_notify_cancel(struct wlr_seat *seat,
+ struct wlr_surface *surface);
+
void wlr_seat_touch_notify_frame(struct wlr_seat *seat);
/**
diff --git a/types/seat/wlr_seat_touch.c b/types/seat/wlr_seat_touch.c
index 65a8c7c06c1d9ec35c68e0cb8e7b46ca3039fb3c..abc17ae2ce7a04bb1d533c794a754f30eb681375 100644
--- a/types/seat/wlr_seat_touch.c
+++ b/types/seat/wlr_seat_touch.c
@@ -41,6 +41,11 @@ static void default_touch_cancel(struct wlr_seat_touch_grab *grab) {
// cannot be cancelled
}
+static void default_touch_wl_cancel(struct wlr_seat_touch_grab *grab,
+ struct wlr_surface *surface) {
+ wlr_seat_touch_send_cancel(grab->seat, surface);
+}
+
const struct wlr_touch_grab_interface default_touch_grab_impl = {
.down = default_touch_down,
.up = default_touch_up,
@@ -48,6 +53,7 @@ const struct wlr_touch_grab_interface default_touch_grab_impl = {
.enter = default_touch_enter,
.frame = default_touch_frame,
.cancel = default_touch_cancel,
+ .wl_cancel = default_touch_wl_cancel,
};
@@ -238,6 +244,26 @@ void wlr_seat_touch_notify_frame(struct wlr_seat *seat) {
}
}
+void wlr_seat_touch_notify_cancel(struct wlr_seat *seat,
+ struct wlr_surface *surface) {
+ struct wlr_seat_touch_grab *grab = seat->touch_state.grab;
+ if (grab->interface->wl_cancel) {
+ grab->interface->wl_cancel(grab, surface);
+ }
+
+ struct wl_client *client = wl_resource_get_client(surface->resource);
+ struct wlr_seat_client *seat_client = wlr_seat_client_for_wl_client(seat, client);
+ if (seat_client == NULL) {
+ return;
+ }
+ struct wlr_touch_point *point, *tmp;
+ wl_list_for_each_safe(point, tmp, &seat->touch_state.touch_points, link) {
+ if (point->client == seat_client) {
+ touch_point_destroy(point);
+ }
+ }
+}
+
static void handle_point_focus_destroy(struct wl_listener *listener,
void *data) {
struct wlr_touch_point *point =
@@ -376,6 +402,22 @@ void wlr_seat_touch_send_frame(struct wlr_seat *seat) {
}
}
+void wlr_seat_touch_send_cancel(struct wlr_seat *seat, struct wlr_surface *surface) {
+ struct wl_client *client = wl_resource_get_client(surface->resource);
+ struct wlr_seat_client *seat_client = wlr_seat_client_for_wl_client(seat, client);
+ if (seat_client == NULL) {
+ return;
+ }
+
+ struct wl_resource *resource;
+ wl_resource_for_each(resource, &seat_client->touches) {
+ if (seat_client_from_touch_resource(resource) == NULL) {
+ continue;
+ }
+ wl_touch_send_cancel(resource);
+ }
+}
+
int wlr_seat_touch_num_points(struct wlr_seat *seat) {
return wl_list_length(&seat->touch_state.touch_points);
}

View File

@ -0,0 +1,31 @@
diff --git a/types/wlr_layer_shell_v1.c b/types/wlr_layer_shell_v1.c
index d83b22b8660273e13178c9d1899fd33c33d2a8d5..bc68111797552f06337eccd612c6230cfdac5f99 100644
--- a/types/wlr_layer_shell_v1.c
+++ b/types/wlr_layer_shell_v1.c
@@ -307,6 +307,26 @@ static void layer_surface_role_commit(struct wlr_surface *wlr_surface) {
return;
}
+ const uint32_t horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
+ ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
+ if (surface->client_pending.desired_width == 0 &&
+ (surface->client_pending.anchor & horiz) != horiz) {
+ wl_resource_post_error(surface->resource,
+ ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE,
+ "width 0 requested without setting left and right anchors");
+ return;
+ }
+
+ const uint32_t vert = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |
+ ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
+ if (surface->client_pending.desired_height == 0 &&
+ (surface->client_pending.anchor & vert) != vert) {
+ wl_resource_post_error(surface->resource,
+ ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE,
+ "height 0 requested without setting top and bottom anchors");
+ return;
+ }
+
if (surface->closed) {
// Ignore commits after the compositor has closed it
return;

View File

@ -0,0 +1,83 @@
diff --git a/types/wlr_xdg_activation_v1.c b/types/wlr_xdg_activation_v1.c
index 02ba9e07f2b60857a3cdc1848f149c2d476161f7..c54364cccae258daea400724d4822bdb72f97fb5 100644
--- a/types/wlr_xdg_activation_v1.c
+++ b/types/wlr_xdg_activation_v1.c
@@ -248,15 +248,11 @@ static void activation_handle_destroy(struct wl_client *client,
wl_resource_destroy(activation_resource);
}
-static void activation_handle_get_activation_token(struct wl_client *client,
- struct wl_resource *activation_resource, uint32_t id) {
- struct wlr_xdg_activation_v1 *activation =
- activation_from_resource(activation_resource);
-
+static struct wlr_xdg_activation_token_v1 *activation_token_create(
+ struct wlr_xdg_activation_v1 *activation) {
struct wlr_xdg_activation_token_v1 *token = calloc(1, sizeof(*token));
if (token == NULL) {
- wl_client_post_no_memory(client);
- return;
+ return NULL;
}
wl_list_init(&token->link);
wl_list_init(&token->seat_destroy.link);
@@ -265,6 +261,20 @@ static void activation_handle_get_activation_token(struct wl_client *client,
token->activation = activation;
+ return token;
+}
+
+static void activation_handle_get_activation_token(struct wl_client *client,
+ struct wl_resource *activation_resource, uint32_t id) {
+ struct wlr_xdg_activation_v1 *activation =
+ activation_from_resource(activation_resource);
+
+ struct wlr_xdg_activation_token_v1 *token = activation_token_create(activation);
+ if (token == NULL) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
uint32_t version = wl_resource_get_version(activation_resource);
token->resource = wl_resource_create(client,
&xdg_activation_token_v1_interface, version, id);
@@ -371,19 +381,12 @@ struct wlr_xdg_activation_v1 *wlr_xdg_activation_v1_create(
struct wlr_xdg_activation_token_v1 *wlr_xdg_activation_token_v1_create(
struct wlr_xdg_activation_v1 *activation) {
- struct wlr_xdg_activation_token_v1 *token = calloc(1, sizeof(*token));
+ struct wlr_xdg_activation_token_v1 *token = activation_token_create(activation);
+
if (token == NULL) {
return NULL;
}
- wl_list_init(&token->link);
- // Currently no way to set seat/surface
- wl_list_init(&token->seat_destroy.link);
- wl_list_init(&token->surface_destroy.link);
- wl_signal_init(&token->events.destroy);
-
- token->activation = activation;
-
if (!token_init(token)) {
wlr_xdg_activation_token_v1_destroy(token);
return NULL;
@@ -412,15 +415,10 @@ struct wlr_xdg_activation_token_v1 *wlr_xdg_activation_v1_add_token(
struct wlr_xdg_activation_v1 *activation, const char *token_str) {
assert(token_str);
- struct wlr_xdg_activation_token_v1 *token = calloc(1, sizeof(*token));
+ struct wlr_xdg_activation_token_v1 *token = activation_token_create(activation);
if (token == NULL) {
return NULL;
}
- wl_list_init(&token->link);
- wl_list_init(&token->seat_destroy.link);
- wl_list_init(&token->surface_destroy.link);
-
- token->activation = activation;
token->token = strdup(token_str);
wl_list_insert(&activation->tokens, &token->link);

View File

@ -8,8 +8,19 @@ inherit meson
DESCRIPTION="Pluggable, composable, unopinionated modules for building a Wayland compositor with updates from pureos (for phoc)"
HOMEPAGE="https://source.puri.sm/Librem5/wlroots"
COMMIT="1f8bb9e0e3058fc31a14866dc52e8f83c1287a09"
SRC_URI="https://source.puri.sm/Librem5/wlroots/-/archive/${COMMIT}/wlroots-${COMMIT}.tar.gz -> ${P}.tar.gz"
#COMMIT="1f8bb9e0e3058fc31a14866dc52e8f83c1287a09"
#SRC_URI="https://source.puri.sm/Librem5/wlroots/-/archive/${COMMIT}/wlroots-${COMMIT}.tar.gz -> ${P}.tar.gz"
if [[ ${PV} == 9999 ]]; then
EGIT_REPO_URI="https://gitlab.freedesktop.org/${PN}/${PN}.git"
inherit git-r3
SLOT="0/9999"
else
SRC_URI="https://gitlab.freedesktop.org/${PN}/${PN}/-/archive/${PV}/${P}.tar.gz"
KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
SLOT="0/$(ver_cut 2)"
fi
KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
SLOT="0/$(ver_cut 2)"
@ -51,7 +62,14 @@ BDEPEND="
virtual/pkgconfig
"
PATCHES=( "${FILESDIR}"/wlroots-0.15.1-tinywl-dont-crash-upon-missing-keyboard.patch )
PATCHES=(
"${FILESDIR}"/wlroots-0.15.1-tinywl-dont-crash-upon-missing-keyboard.patch
"${FILESDIR}"/13fcdba75cf5f21cfd49c1a05f4fa62f77619b40.patch
"${FILESDIR}"/17b2b06633729f1826715c1d0b84614aa3cedb3a.patch
"${FILESDIR}"/8dec751a6d84335fb04288b8efab6dd5c90288d3.patch
"${FILESDIR}"/dd03d839ab56c3e5d7c607a8d76e58e0b75edb85.patch
)
src_configure() {
# xcb-util-errors is not on Gentoo Repository (and upstream seems inactive?)

View File

@ -45,7 +45,7 @@ RDEPEND="
sys-auth/seatd
x11-apps/xkbcomp
x11-libs/libxkbcommon
!gui-libs/wlroots
=gui-libs/wlroots-0.15.1-r2
"
BDEPEND="