diff --git a/gui-libs/wlroots-pureos/Manifest b/gui-libs/wlroots/Manifest similarity index 100% rename from gui-libs/wlroots-pureos/Manifest rename to gui-libs/wlroots/Manifest diff --git a/gui-libs/wlroots/files/13fcdba75cf5f21cfd49c1a05f4fa62f77619b40.patch b/gui-libs/wlroots/files/13fcdba75cf5f21cfd49c1a05f4fa62f77619b40.patch new file mode 100644 index 0000000..29b855a --- /dev/null +++ b/gui-libs/wlroots/files/13fcdba75cf5f21cfd49c1a05f4fa62f77619b40.patch @@ -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); diff --git a/gui-libs/wlroots/files/17b2b06633729f1826715c1d0b84614aa3cedb3a.patch b/gui-libs/wlroots/files/17b2b06633729f1826715c1d0b84614aa3cedb3a.patch new file mode 100644 index 0000000..6611efd --- /dev/null +++ b/gui-libs/wlroots/files/17b2b06633729f1826715c1d0b84614aa3cedb3a.patch @@ -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); + } diff --git a/gui-libs/wlroots/files/8dec751a6d84335fb04288b8efab6dd5c90288d3.patch b/gui-libs/wlroots/files/8dec751a6d84335fb04288b8efab6dd5c90288d3.patch new file mode 100644 index 0000000..0138e32 --- /dev/null +++ b/gui-libs/wlroots/files/8dec751a6d84335fb04288b8efab6dd5c90288d3.patch @@ -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; diff --git a/gui-libs/wlroots/files/dd03d839ab56c3e5d7c607a8d76e58e0b75edb85.patch b/gui-libs/wlroots/files/dd03d839ab56c3e5d7c607a8d76e58e0b75edb85.patch new file mode 100644 index 0000000..f659c27 --- /dev/null +++ b/gui-libs/wlroots/files/dd03d839ab56c3e5d7c607a8d76e58e0b75edb85.patch @@ -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); diff --git a/gui-libs/wlroots-pureos/files/wlroots-0.15.1-tinywl-dont-crash-upon-missing-keyboard.patch b/gui-libs/wlroots/files/wlroots-0.15.1-tinywl-dont-crash-upon-missing-keyboard.patch similarity index 100% rename from gui-libs/wlroots-pureos/files/wlroots-0.15.1-tinywl-dont-crash-upon-missing-keyboard.patch rename to gui-libs/wlroots/files/wlroots-0.15.1-tinywl-dont-crash-upon-missing-keyboard.patch diff --git a/gui-libs/wlroots-pureos/wlroots-pureos-0.15.1.ebuild b/gui-libs/wlroots/wlroots-0.15.1-r2.ebuild similarity index 69% rename from gui-libs/wlroots-pureos/wlroots-pureos-0.15.1.ebuild rename to gui-libs/wlroots/wlroots-0.15.1-r2.ebuild index 337e441..b2b2881 100644 --- a/gui-libs/wlroots-pureos/wlroots-pureos-0.15.1.ebuild +++ b/gui-libs/wlroots/wlroots-0.15.1-r2.ebuild @@ -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?) diff --git a/x11-wm/phoc/phoc-0.21.1.ebuild b/x11-wm/phoc/phoc-0.21.1.ebuild index 41f91dd..f3ca3ee 100755 --- a/x11-wm/phoc/phoc-0.21.1.ebuild +++ b/x11-wm/phoc/phoc-0.21.1.ebuild @@ -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="