Compare commits

..

No commits in common. "rawhide" and "f30" have entirely different histories.

11 changed files with 902 additions and 490 deletions

1
.gitignore vendored
View file

@ -1,2 +1 @@
/wlroots-*.tar.gz
/wlroots-*.tar.gz.sig

View file

@ -1,33 +0,0 @@
From e021326f7de0505fcae85f5732885848b21edf9c Mon Sep 17 00:00:00 2001
From: Aleksei Bavshin <alebastr89@gmail.com>
Date: Sat, 25 Jun 2022 21:22:08 -0700
Subject: [PATCH] Revert "layer-shell: error on 0 dimension without anchors"
This reverts commit 8dec751a6d84335fb04288b8efab6dd5c90288d3.
---
types/wlr_layer_shell_v1.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/types/wlr_layer_shell_v1.c b/types/wlr_layer_shell_v1.c
index 2d838498..c3c50d78 100644
--- a/types/wlr_layer_shell_v1.c
+++ b/types/wlr_layer_shell_v1.c
@@ -358,6 +358,7 @@ static void layer_surface_role_client_commit(struct wlr_surface *wlr_surface) {
uint32_t anchor = surface->pending.anchor;
+#if 0
const uint32_t horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
if (surface->pending.desired_width == 0 && (anchor & horiz) != horiz) {
@@ -375,6 +376,7 @@ static void layer_surface_role_client_commit(struct wlr_surface *wlr_surface) {
"height 0 requested without setting top and bottom anchors");
return;
}
+#endif
if ((anchor & surface->pending.exclusive_edge) != surface->pending.exclusive_edge) {
wlr_surface_reject_pending(wlr_surface, surface->resource,
--
2.49.0

View file

@ -0,0 +1,464 @@
From 5d26da9d15d4874c383bbc9948a802fcd605dc8b Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Wed, 21 Nov 2018 21:32:54 +0100
Subject: [PATCH] data-device: allow multiple devices for the same seat
This commit makes it possible for a single client to have multiple data devices
for the same seat. This fixes issues with Firefox.
This mainly removes wlr_data_source.offer. We make sure we create one data
offer per device. We now make the offer inert when the source is destroyed.
Fixes the second half of https://github.com/swaywm/wlroots/issues/1041
---
include/types/wlr_data_device.h | 3 +-
include/wlr/types/wlr_data_device.h | 13 ++-
types/data_device/wlr_data_device.c | 33 ++++----
types/data_device/wlr_data_offer.c | 123 +++++++++++++++-------------
types/data_device/wlr_data_source.c | 35 ++------
types/data_device/wlr_drag.c | 46 ++++-------
6 files changed, 112 insertions(+), 141 deletions(-)
diff --git a/include/types/wlr_data_device.h b/include/types/wlr_data_device.h
index 388e91a5e..376c5f09f 100644
--- a/include/types/wlr_data_device.h
+++ b/include/types/wlr_data_device.h
@@ -19,6 +19,7 @@ extern const struct wlr_surface_role drag_icon_surface_role;
struct wlr_data_offer *data_offer_create(struct wl_client *client,
struct wlr_data_source *source, uint32_t version);
void data_offer_update_action(struct wlr_data_offer *offer);
+void data_offer_destroy(struct wlr_data_offer *offer);
struct wlr_client_data_source *client_data_source_create(
struct wl_client *client, uint32_t version, uint32_t id,
@@ -26,7 +27,7 @@ struct wlr_client_data_source *client_data_source_create(
struct wlr_client_data_source *client_data_source_from_resource(
struct wl_resource *resource);
struct wlr_data_offer *data_source_send_offer(struct wlr_data_source *source,
- struct wlr_seat_client *target);
+ struct wl_resource *device_resource);
void data_source_notify_finish(struct wlr_data_source *source);
bool seat_client_start_drag(struct wlr_seat_client *client,
diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h
index 9ce8f400f..9c4ce995e 100644
--- a/include/wlr/types/wlr_data_device.h
+++ b/include/wlr/types/wlr_data_device.h
@@ -12,14 +12,14 @@
#include <wayland-server.h>
#include <wlr/types/wlr_seat.h>
-extern const struct
-wlr_pointer_grab_interface wlr_data_device_pointer_drag_interface;
+extern const struct wlr_pointer_grab_interface
+ wlr_data_device_pointer_drag_interface;
-extern const struct
-wlr_keyboard_grab_interface wlr_data_device_keyboard_drag_interface;
+extern const struct wlr_keyboard_grab_interface
+ wlr_data_device_keyboard_drag_interface;
-extern const struct
-wlr_touch_grab_interface wlr_data_device_touch_drag_interface;
+extern const struct wlr_touch_grab_interface
+ wlr_data_device_touch_drag_interface;
struct wlr_data_device_manager {
struct wl_global *global;
@@ -72,7 +72,6 @@ struct wlr_data_source {
// source status
bool accepted;
- struct wlr_data_offer *offer;
// drag'n'drop status
enum wl_data_device_manager_dnd_action current_dnd_action;
diff --git a/types/data_device/wlr_data_device.c b/types/data_device/wlr_data_device.c
index a50f0b4ae..f868ea370 100644
--- a/types/data_device/wlr_data_device.c
+++ b/types/data_device/wlr_data_device.c
@@ -94,25 +94,24 @@ static void data_device_handle_resource_destroy(struct wl_resource *resource) {
void wlr_seat_client_send_selection(struct wlr_seat_client *seat_client) {
- if (wl_list_empty(&seat_client->data_devices)) {
- return;
+ struct wlr_data_source *source = seat_client->seat->selection_source;
+ if (source != NULL) {
+ source->accepted = false;
}
- if (seat_client->seat->selection_source) {
- struct wlr_data_offer *offer = data_source_send_offer(
- seat_client->seat->selection_source, seat_client);
- if (offer == NULL) {
- return;
- }
-
- struct wl_resource *resource;
- wl_resource_for_each(resource, &seat_client->data_devices) {
- wl_data_device_send_selection(resource, offer->resource);
- }
- } else {
- struct wl_resource *resource;
- wl_resource_for_each(resource, &seat_client->data_devices) {
- wl_data_device_send_selection(resource, NULL);
+ struct wl_resource *device_resource;
+ wl_resource_for_each(device_resource, &seat_client->data_devices) {
+ if (source != NULL) {
+ struct wlr_data_offer *offer =
+ data_source_send_offer(source, device_resource);
+ if (offer == NULL) {
+ wl_client_post_no_memory(seat_client->client);
+ return;
+ }
+
+ wl_data_device_send_selection(device_resource, offer->resource);
+ } else {
+ wl_data_device_send_selection(device_resource, NULL);
}
}
}
diff --git a/types/data_device/wlr_data_offer.c b/types/data_device/wlr_data_offer.c
index 9847e07c2..6135ffe33 100644
--- a/types/data_device/wlr_data_offer.c
+++ b/types/data_device/wlr_data_offer.c
@@ -55,15 +55,10 @@ static uint32_t data_offer_choose_action(struct wlr_data_offer *offer) {
}
void data_offer_update_action(struct wlr_data_offer *offer) {
- if (!offer->source) {
- return;
- }
-
uint32_t action = data_offer_choose_action(offer);
if (offer->source->current_dnd_action == action) {
return;
}
-
offer->source->current_dnd_action = action;
if (offer->in_ask) {
@@ -78,50 +73,80 @@ void data_offer_update_action(struct wlr_data_offer *offer) {
}
}
-static void data_offer_accept(struct wl_client *client,
+static void data_offer_handle_accept(struct wl_client *client,
struct wl_resource *resource, uint32_t serial, const char *mime_type) {
struct wlr_data_offer *offer = data_offer_from_resource(resource);
-
- if (!offer->source || offer != offer->source->offer) {
+ if (offer == NULL) {
return;
}
- // TODO check that client is currently focused by the input device
-
wlr_data_source_accept(offer->source, serial, mime_type);
}
-static void data_offer_receive(struct wl_client *client,
+static void data_offer_handle_receive(struct wl_client *client,
struct wl_resource *resource, const char *mime_type, int32_t fd) {
struct wlr_data_offer *offer = data_offer_from_resource(resource);
-
- if (offer->source && offer == offer->source->offer) {
- wlr_data_source_send(offer->source, mime_type, fd);
- } else {
+ if (offer == NULL) {
close(fd);
+ return;
}
+
+ wlr_data_source_send(offer->source, mime_type, fd);
}
-static void data_offer_destroy(struct wl_client *client,
+static void data_offer_dnd_finish(struct wlr_data_offer *offer) {
+ struct wlr_data_source *source = offer->source;
+ if (source->actions < 0) {
+ return;
+ }
+
+ if (offer->in_ask) {
+ wlr_data_source_dnd_action(source, source->current_dnd_action);
+ }
+
+ wlr_data_source_dnd_finish(source);
+}
+
+static void data_offer_handle_destroy(struct wl_client *client,
struct wl_resource *resource) {
+ struct wlr_data_offer *offer = data_offer_from_resource(resource);
+ if (offer == NULL) {
+ goto out;
+ }
+
+ // If the drag destination has version < 3, wl_data_offer.finish
+ // won't be called, so do this here as a safety net, because
+ // we still want the version >= 3 drag source to be happy.
+ if (wl_resource_get_version(offer->resource) <
+ WL_DATA_OFFER_ACTION_SINCE_VERSION) {
+ data_offer_dnd_finish(offer);
+ } else if (offer->source->impl->dnd_finish) {
+ // wlr_data_source_cancel can free the source
+ wlr_data_source_cancel(offer->source);
+ }
+
+out:
wl_resource_destroy(resource);
}
-static void data_offer_finish(struct wl_client *client,
+static void data_offer_handle_finish(struct wl_client *client,
struct wl_resource *resource) {
struct wlr_data_offer *offer = data_offer_from_resource(resource);
-
- if (!offer->source || offer->source->offer != offer) {
+ if (offer == NULL) {
return;
}
- data_source_notify_finish(offer->source);
+ data_offer_dnd_finish(offer);
+ data_offer_destroy(offer);
}
-static void data_offer_set_actions(struct wl_client *client,
+static void data_offer_handle_set_actions(struct wl_client *client,
struct wl_resource *resource, uint32_t actions,
uint32_t preferred_action) {
struct wlr_data_offer *offer = data_offer_from_resource(resource);
+ if (offer == NULL) {
+ return;
+ }
if (actions & ~DATA_DEVICE_ALL_ACTIONS) {
wl_resource_post_error(offer->resource,
@@ -144,52 +169,36 @@ static void data_offer_set_actions(struct wl_client *client,
data_offer_update_action(offer);
}
-static void data_offer_handle_resource_destroy(struct wl_resource *resource) {
- struct wlr_data_offer *offer = data_offer_from_resource(resource);
-
- if (!offer->source) {
- goto out;
+void data_offer_destroy(struct wlr_data_offer *offer) {
+ if (offer == NULL) {
+ return;
}
wl_list_remove(&offer->source_destroy.link);
- if (offer->source->offer != offer) {
- goto out;
- }
-
- // If the drag destination has version < 3, wl_data_offer.finish
- // won't be called, so do this here as a safety net, because
- // we still want the version >= 3 drag source to be happy.
- if (wl_resource_get_version(offer->resource) <
- WL_DATA_OFFER_ACTION_SINCE_VERSION) {
- data_source_notify_finish(offer->source);
- offer->source->offer = NULL;
- } else if (offer->source->impl->dnd_finish) {
- // source->cancel can free the source
- offer->source->offer = NULL;
- wlr_data_source_cancel(offer->source);
- } else {
- offer->source->offer = NULL;
- }
-
-out:
+ // Make the resource inert
+ wl_resource_set_user_data(offer->resource, NULL);
free(offer);
}
static const struct wl_data_offer_interface data_offer_impl = {
- .accept = data_offer_accept,
- .receive = data_offer_receive,
- .destroy = data_offer_destroy,
- .finish = data_offer_finish,
- .set_actions = data_offer_set_actions,
+ .accept = data_offer_handle_accept,
+ .receive = data_offer_handle_receive,
+ .destroy = data_offer_handle_destroy,
+ .finish = data_offer_handle_finish,
+ .set_actions = data_offer_handle_set_actions,
};
-static void handle_offer_source_destroyed(struct wl_listener *listener,
+static void data_offer_handle_resource_destroy(struct wl_resource *resource) {
+ struct wlr_data_offer *offer = data_offer_from_resource(resource);
+ data_offer_destroy(offer);
+}
+
+static void data_offer_handle_source_destroy(struct wl_listener *listener,
void *data) {
struct wlr_data_offer *offer =
wl_container_of(listener, offer, source_destroy);
-
- offer->source = NULL;
+ data_offer_destroy(offer);
}
struct wlr_data_offer *data_offer_create(struct wl_client *client,
@@ -200,8 +209,8 @@ struct wlr_data_offer *data_offer_create(struct wl_client *client,
}
offer->source = source;
- offer->resource = wl_resource_create(client,
- &wl_data_offer_interface, version, 0);
+ offer->resource =
+ wl_resource_create(client, &wl_data_offer_interface, version, 0);
if (offer->resource == NULL) {
free(offer);
return NULL;
@@ -209,7 +218,7 @@ struct wlr_data_offer *data_offer_create(struct wl_client *client,
wl_resource_set_implementation(offer->resource, &data_offer_impl, offer,
data_offer_handle_resource_destroy);
- offer->source_destroy.notify = handle_offer_source_destroyed;
+ offer->source_destroy.notify = data_offer_handle_source_destroy;
wl_signal_add(&source->events.destroy, &offer->source_destroy);
return offer;
diff --git a/types/data_device/wlr_data_source.c b/types/data_device/wlr_data_source.c
index 64db3a706..413f461a2 100644
--- a/types/data_device/wlr_data_source.c
+++ b/types/data_device/wlr_data_source.c
@@ -11,47 +11,22 @@
#include "types/wlr_data_device.h"
#include "util/signal.h"
-void data_source_notify_finish(struct wlr_data_source *source) {
- assert(source->offer);
- if (source->actions < 0) {
- return;
- }
-
- if (source->offer->in_ask) {
- wlr_data_source_dnd_action(source, source->current_dnd_action);
- }
-
- source->offer = NULL;
- wlr_data_source_dnd_finish(source);
-}
-
struct wlr_data_offer *data_source_send_offer(struct wlr_data_source *source,
- struct wlr_seat_client *target) {
- if (wl_list_empty(&target->data_devices)) {
- return NULL;
- }
-
- uint32_t version = wl_resource_get_version(
- wl_resource_from_link(target->data_devices.next));
-
- struct wlr_data_offer *offer =
- data_offer_create(target->client, source, version);
+ struct wl_resource *device_resource) {
+ struct wl_client *client = wl_resource_get_client(device_resource);
+ uint32_t version = wl_resource_get_version(device_resource);
+ struct wlr_data_offer *offer = data_offer_create(client, source, version);
if (offer == NULL) {
return NULL;
}
- struct wl_resource *target_resource;
- wl_resource_for_each(target_resource, &target->data_devices) {
- wl_data_device_send_data_offer(target_resource, offer->resource);
- }
+ wl_data_device_send_data_offer(device_resource, offer->resource);
char **p;
wl_array_for_each(p, &source->mime_types) {
wl_data_offer_send_offer(offer->resource, *p);
}
- source->offer = offer;
- source->accepted = false;
return offer;
}
diff --git a/types/data_device/wlr_drag.c b/types/data_device/wlr_drag.c
index 8ed6e034d..8e737597b 100644
--- a/types/data_device/wlr_drag.c
+++ b/types/data_device/wlr_drag.c
@@ -47,25 +47,27 @@ static void drag_set_focus(struct wlr_drag *drag,
return;
}
- if (drag->source && drag->source->offer) {
- // unlink the offer from the source
- wl_list_remove(&drag->source->offer->source_destroy.link);
- drag->source->offer->source = NULL;
- drag->source->offer = NULL;
- }
-
struct wlr_seat_client *focus_client = wlr_seat_client_for_wl_client(
drag->seat_client->seat, wl_resource_get_client(surface->resource));
if (!focus_client) {
return;
}
- struct wl_resource *offer_resource = NULL;
- if (drag->source) {
+ if (drag->source != NULL) {
drag->source->accepted = false;
- struct wlr_data_offer *offer = data_source_send_offer(drag->source,
- focus_client);
- if (offer != NULL) {
+
+ uint32_t serial =
+ wl_display_next_serial(drag->seat_client->seat->display);
+
+ struct wl_resource *device_resource;
+ wl_resource_for_each(device_resource, &focus_client->data_devices) {
+ struct wlr_data_offer *offer =
+ data_source_send_offer(drag->source, device_resource);
+ if (offer == NULL) {
+ wl_resource_post_no_memory(device_resource);
+ return;
+ }
+
data_offer_update_action(offer);
if (wl_resource_get_version(offer->resource) >=
@@ -74,18 +76,10 @@ static void drag_set_focus(struct wlr_drag *drag,
drag->source->actions);
}
- offer_resource = offer->resource;
- }
- }
-
- if (!wl_list_empty(&focus_client->data_devices)) {
- uint32_t serial =
- wl_display_next_serial(drag->seat_client->seat->display);
- struct wl_resource *resource;
- wl_resource_for_each(resource, &focus_client->data_devices) {
- wl_data_device_send_enter(resource, serial, surface->resource,
+ wl_data_device_send_enter(device_resource, serial,
+ surface->resource,
wl_fixed_from_double(sx), wl_fixed_from_double(sy),
- offer_resource);
+ offer->resource);
}
}
@@ -174,12 +168,6 @@ static uint32_t drag_handle_pointer_button(struct wlr_seat_pointer_grab *grab,
}
wlr_data_source_dnd_drop(drag->source);
- if (drag->source->offer != NULL) {
- drag->source->offer->in_ask =
- drag->source->current_dnd_action ==
- WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK;
- }
-
struct wlr_drag_drop_event event = {
.drag = drag,
.time = time,

View file

@ -0,0 +1,24 @@
From 4423f88fac1d82756bab451f451b159fa6d0e9f5 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Mon, 26 Nov 2018 12:32:39 +0100
Subject: [PATCH] data-device: never cancel the source when offer is destroyed
The source could be used in another offer.
---
types/data_device/wlr_data_offer.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/types/data_device/wlr_data_offer.c b/types/data_device/wlr_data_offer.c
index 6135ffe33..b8cec091b 100644
--- a/types/data_device/wlr_data_offer.c
+++ b/types/data_device/wlr_data_offer.c
@@ -120,9 +120,6 @@ static void data_offer_handle_destroy(struct wl_client *client,
if (wl_resource_get_version(offer->resource) <
WL_DATA_OFFER_ACTION_SINCE_VERSION) {
data_offer_dnd_finish(offer);
- } else if (offer->source->impl->dnd_finish) {
- // wlr_data_source_cancel can free the source
- wlr_data_source_cancel(offer->source);
}
out:

View file

@ -1,139 +0,0 @@
# Client examples are now available from a separate repository,
# https://gitlab.freedesktop.org/wlroots/wlr-clients
project(
'wlroots-examples',
'c',
meson_version: '>=0.58.0',
default_options: [
'c_std=c11',
'warning_level=2',
'werror=false',
],
)
add_project_arguments([
'-D_POSIX_C_SOURCE=200809L',
'-DWLR_USE_UNSTABLE',
], language: 'c')
cc = meson.get_compiler('c')
add_project_arguments(cc.get_supported_arguments([
'-Wno-missing-braces',
'-Wno-missing-field-initializers',
'-Wno-unused-parameter'
]), language: 'c')
cairo = dependency('cairo')
drm = dependency('libdrm')
egl = dependency('egl')
glesv2 = dependency('glesv2')
# Only needed for drm_fourcc.h
libdrm = dependency('libdrm').partial_dependency(compile_args: true, includes: true)
wayland_client = dependency('wayland-client')
wayland_egl = dependency('wayland-egl')
wayland_protos = dependency('wayland-protocols', version: '>=1.27')
wayland_scanner_dep = dependency('wayland-scanner', native: true)
wayland_scanner = find_program(
wayland_scanner_dep.get_variable('wayland_scanner'),
native: true,
)
wayland_server = dependency('wayland-server')
wlroots = dependency('wlroots-0.20')
xkbcommon = dependency('xkbcommon')
wl_protocol_dir = wayland_protos.get_variable('pkgdatadir')
protocols = {
# Stable upstream protocols
'xdg-shell': wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml',
}
protocols_code = {}
protocols_server_header = {}
protocols_client_header = {}
foreach name, path : protocols
code = custom_target(
name.underscorify() + '_c',
input: path,
output: '@BASENAME@-protocol.c',
command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
)
server_header = custom_target(
name.underscorify() + '_server_h',
input: path,
output: '@BASENAME@-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'],
)
client_header = custom_target(
name.underscorify() + '_client_h',
input: path,
output: '@BASENAME@-client-protocol.h',
command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
build_by_default: false,
)
protocols_code += { name: code }
protocols_server_header += { name: server_header }
protocols_client_header += { name: client_header }
endforeach
compositors = {
'simple': {
'src': 'simple.c',
},
'pointer': {
'src': 'pointer.c',
},
'touch': {
'src': ['touch.c', 'cat.c'],
},
'tablet': {
'src': 'tablet.c',
},
'rotation': {
'src': ['rotation.c', 'cat.c'],
},
'output-layout': {
'src': ['output-layout.c', 'cat.c'],
},
'scene-graph': {
'src': 'scene-graph.c',
'proto': ['xdg-shell'],
},
'output-layers': {
'src': 'output-layers.c',
'proto': [
'xdg-shell',
],
},
'cairo-buffer': {
'src': 'cairo-buffer.c',
'dep': cairo,
},
'embedded': {
'src': [
'embedded.c',
protocols_code['xdg-shell'],
protocols_client_header['xdg-shell'],
],
'dep': [wayland_client, wayland_egl, egl, glesv2],
},
}
foreach name, info : compositors
extra_src = []
foreach p : info.get('proto', [])
extra_src += protocols_server_header[p]
endforeach
executable(
name,
[info.get('src'), extra_src],
dependencies: [libdrm, wlroots, wayland_server, xkbcommon, info.get('dep', [])],
)
endforeach

Binary file not shown.

View file

@ -0,0 +1,84 @@
From eaafd65a12d6b15cc8e503ef6e9e99a65bd1e791 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Wed, 21 Nov 2018 11:15:35 +0100
Subject: [PATCH] gtk-primary-selection: track resources
---
include/wlr/types/wlr_primary_selection.h | 1 +
types/wlr_primary_selection.c | 18 +++++++++++++++---
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/include/wlr/types/wlr_primary_selection.h b/include/wlr/types/wlr_primary_selection.h
index c11e2fabb..192bfc02f 100644
--- a/include/wlr/types/wlr_primary_selection.h
+++ b/include/wlr/types/wlr_primary_selection.h
@@ -14,6 +14,7 @@
struct wlr_primary_selection_device_manager {
struct wl_global *global;
+ struct wl_list resources;
struct wl_listener display_destroy;
diff --git a/types/wlr_primary_selection.c b/types/wlr_primary_selection.c
index 0539773b0..743125406 100644
--- a/types/wlr_primary_selection.c
+++ b/types/wlr_primary_selection.c
@@ -212,6 +212,7 @@ void wlr_seat_set_primary_selection(struct wlr_seat *seat,
return;
}
+ // TODO: make all offers inert
if (seat->primary_selection_source) {
wl_list_remove(&seat->primary_selection_source_destroy.link);
seat->primary_selection_source->cancel(seat->primary_selection_source);
@@ -349,12 +350,17 @@ static void device_manager_handle_destroy(struct wl_client *client,
}
static const struct gtk_primary_selection_device_manager_interface
-device_manager_impl = {
+ device_manager_impl = {
.create_source = device_manager_handle_create_source,
.get_device = device_manager_handle_get_device,
.destroy = device_manager_handle_destroy,
};
+static void device_manager_handle_resource_destroy(
+ struct wl_resource *resource) {
+ wl_list_remove(wl_resource_get_link(resource));
+}
+
static void primary_selection_device_manager_bind(struct wl_client *client,
void *data, uint32_t version, uint32_t id) {
@@ -367,7 +373,9 @@ static void primary_selection_device_manager_bind(struct wl_client *client,
return;
}
wl_resource_set_implementation(resource, &device_manager_impl, manager,
- NULL);
+ device_manager_handle_resource_destroy);
+
+ wl_list_insert(&manager->resources, wl_resource_get_link(resource));
}
static void handle_display_destroy(struct wl_listener *listener, void *data) {
@@ -392,6 +400,7 @@ struct wlr_primary_selection_device_manager *
return NULL;
}
+ wl_list_init(&manager->resources);
wl_signal_init(&manager->events.destroy);
manager->display_destroy.notify = handle_display_destroy;
@@ -407,7 +416,10 @@ void wlr_primary_selection_device_manager_destroy(
}
wlr_signal_emit_safe(&manager->events.destroy, manager);
wl_list_remove(&manager->display_destroy.link);
- // TODO: free resources
+ struct wl_resource *resource, *resource_tmp;
+ wl_resource_for_each_safe(resource, resource_tmp, &manager->resources) {
+ wl_resource_destroy(resource);
+ }
wl_global_destroy(manager->global);
free(manager);
}

View file

@ -0,0 +1,215 @@
From b9a2e4ba4c92cd4c19f8cf5ed7e6603731eca9ab Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Wed, 21 Nov 2018 10:59:11 +0100
Subject: [PATCH] gtk-primary-selection: support multiple devices
When a client was creating multiple data devices for the same seat, we were
only creating one resource. This is a protocol error.
Instead, create one offer per data device.
This commit also makes offers inert when their source is destroyed.
Fixes part of https://github.com/swaywm/wlroots/issues/1041
Supersedes https://github.com/swaywm/wlroots/pull/1113
---
include/wlr/types/wlr_primary_selection.h | 3 -
types/wlr_primary_selection.c | 96 ++++++++++-------------
2 files changed, 40 insertions(+), 59 deletions(-)
diff --git a/include/wlr/types/wlr_primary_selection.h b/include/wlr/types/wlr_primary_selection.h
index f33f6368d..c11e2fabb 100644
--- a/include/wlr/types/wlr_primary_selection.h
+++ b/include/wlr/types/wlr_primary_selection.h
@@ -24,8 +24,6 @@ struct wlr_primary_selection_device_manager {
void *data;
};
-struct wlr_primary_selection_offer;
-
struct wlr_primary_selection_source {
// source metadata
struct wl_array mime_types;
@@ -36,7 +34,6 @@ struct wlr_primary_selection_source {
void (*cancel)(struct wlr_primary_selection_source *source);
// source status
- struct wlr_primary_selection_offer *offer;
struct wlr_seat_client *seat_client;
struct {
diff --git a/types/wlr_primary_selection.c b/types/wlr_primary_selection.c
index 3fed0f642..0539773b0 100644
--- a/types/wlr_primary_selection.c
+++ b/types/wlr_primary_selection.c
@@ -9,6 +9,8 @@
#include "gtk-primary-selection-protocol.h"
#include "util/signal.h"
+#define DEVICE_MANAGER_VERSION 1
+
static const struct gtk_primary_selection_offer_interface offer_impl;
static struct wlr_primary_selection_offer *offer_from_resource(
@@ -21,12 +23,12 @@ static struct wlr_primary_selection_offer *offer_from_resource(
static void offer_handle_receive(struct wl_client *client,
struct wl_resource *resource, const char *mime_type, int32_t fd) {
struct wlr_primary_selection_offer *offer = offer_from_resource(resource);
-
- if (offer->source && offer == offer->source->offer) {
- offer->source->send(offer->source, mime_type, fd);
- } else {
+ if (offer == NULL) {
close(fd);
+ return;
}
+
+ offer->source->send(offer->source, mime_type, fd);
}
static void offer_handle_destroy(struct wl_client *client,
@@ -39,31 +41,26 @@ static const struct gtk_primary_selection_offer_interface offer_impl = {
.destroy = offer_handle_destroy,
};
-static void offer_resource_handle_destroy(struct wl_resource *resource) {
- struct wlr_primary_selection_offer *offer = offer_from_resource(resource);
-
- if (!offer->source) {
- goto out;
+static void offer_destroy(struct wlr_primary_selection_offer *offer) {
+ if (offer == NULL) {
+ return;
}
-
+ // Make resource inert
+ wl_resource_set_user_data(offer->resource, NULL);
wl_list_remove(&offer->source_destroy.link);
-
- if (offer->source->offer != offer) {
- goto out;
- }
-
- offer->source->offer = NULL;
-
-out:
free(offer);
}
+static void offer_handle_resource_destroy(struct wl_resource *resource) {
+ struct wlr_primary_selection_offer *offer = offer_from_resource(resource);
+ offer_destroy(offer);
+}
+
static void offer_handle_source_destroy(struct wl_listener *listener,
void *data) {
struct wlr_primary_selection_offer *offer =
wl_container_of(listener, offer, source_destroy);
-
- offer->source = NULL;
+ offer_destroy(offer);
}
@@ -85,38 +82,32 @@ static void client_source_cancel(
gtk_primary_selection_source_send_cancelled(source->resource);
}
-static struct wlr_primary_selection_offer *source_send_offer(
- struct wlr_primary_selection_source *source,
- struct wlr_seat_client *target) {
- if (wl_list_empty(&target->primary_selection_devices)) {
- return NULL;
- }
-
+static void source_send_offer(struct wlr_primary_selection_source *source,
+ struct wl_resource *device_resource) {
struct wlr_primary_selection_offer *offer =
calloc(1, sizeof(struct wlr_primary_selection_offer));
if (offer == NULL) {
- return NULL;
+ wl_resource_post_no_memory(device_resource);
+ return;
}
- uint32_t version = wl_resource_get_version(
- wl_resource_from_link(target->primary_selection_devices.next));
- offer->resource = wl_resource_create(target->client,
+ struct wl_client *client = wl_resource_get_client(device_resource);
+ uint32_t version = wl_resource_get_version(device_resource);
+ offer->resource = wl_resource_create(client,
&gtk_primary_selection_offer_interface, version, 0);
if (offer->resource == NULL) {
free(offer);
- return NULL;
+ wl_resource_post_no_memory(device_resource);
+ return;
}
wl_resource_set_implementation(offer->resource, &offer_impl, offer,
- offer_resource_handle_destroy);
+ offer_handle_resource_destroy);
offer->source_destroy.notify = offer_handle_source_destroy;
wl_signal_add(&source->events.destroy, &offer->source_destroy);
- struct wl_resource *target_resource;
- wl_resource_for_each(target_resource, &target->primary_selection_devices) {
- gtk_primary_selection_device_send_data_offer(target_resource,
- offer->resource);
- }
+ gtk_primary_selection_device_send_data_offer(device_resource,
+ offer->resource);
char **p;
wl_array_for_each(p, &source->mime_types) {
@@ -124,9 +115,9 @@ static struct wlr_primary_selection_offer *source_send_offer(
}
offer->source = source;
- source->offer = offer;
- return offer;
+ gtk_primary_selection_device_send_selection(device_resource,
+ offer->resource);
}
static const struct gtk_primary_selection_source_interface source_impl;
@@ -179,20 +170,13 @@ void wlr_seat_client_send_primary_selection(
return;
}
- if (seat_client->seat->primary_selection_source) {
- struct wlr_primary_selection_offer *offer = source_send_offer(
- seat_client->seat->primary_selection_source, seat_client);
- if (offer == NULL) {
- return;
- }
-
- struct wl_resource *resource;
- wl_resource_for_each(resource, &seat_client->primary_selection_devices) {
- gtk_primary_selection_device_send_selection(resource, offer->resource);
- }
- } else {
- struct wl_resource *resource;
- wl_resource_for_each(resource, &seat_client->primary_selection_devices) {
+ struct wlr_primary_selection_source *source =
+ seat_client->seat->primary_selection_source;
+ struct wl_resource *resource;
+ wl_resource_for_each(resource, &seat_client->primary_selection_devices) {
+ if (source) {
+ source_send_offer(source, resource);
+ } else {
gtk_primary_selection_device_send_selection(resource, NULL);
}
}
@@ -401,8 +385,8 @@ struct wlr_primary_selection_device_manager *
return NULL;
}
manager->global = wl_global_create(display,
- &gtk_primary_selection_device_manager_interface, 1, manager,
- primary_selection_device_manager_bind);
+ &gtk_primary_selection_device_manager_interface, DEVICE_MANAGER_VERSION,
+ manager, primary_selection_device_manager_bind);
if (manager->global == NULL) {
free(manager);
return NULL;

22
pkgconfig_version.patch Normal file
View file

@ -0,0 +1,22 @@
From be6210cf8216c08a91e085dac0ec11d0e34fb217 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Sun, 21 Oct 2018 00:17:22 +0200
Subject: [PATCH] Update version to 0.1
---
meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index 9d40dbfcf..9517168a1 100644
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,7 @@
project(
'wlroots',
'c',
- version: '0.0.1',
+ version: '0.1.0',
license: 'MIT',
meson_version: '>=0.48.0',
default_options: [

View file

@ -1,2 +1 @@
SHA512 (wlroots-0.20.2.tar.gz) = 634345e23d0b6c28cb501c0dd0ef9c50d529a92ae5c8455e99e876f3f37ee244ac19dd097f76416b2ae4fd7c3f02e39a92a9322cf5a0caf8da21c31cd900e508
SHA512 (wlroots-0.20.2.tar.gz.sig) = e74dc0abfabed7f40ba4f0e5edfc30ef92b95ebcf4a6aca3b2a605b04b5f2345a6a842cdf56819ce1f050c6181b646eae19dbef835354df7b09562cebbdaa474
SHA512 (wlroots-0.1.tar.gz) = 43897ac5a512ea26ad9703182dab5de9c714a087449b108472f638148538a632a67cfc778edf3e77940fdd7bdba91d64a4dc4e4ed1903a150f13ca59237ce01e

View file

@ -1,88 +1,64 @@
# Version of the .so library
%global abi_ver 0.20
# libliftoff does not bump soname on API changes
%global liftoff_ver 0.5.0
%global commit 0.1
%global gitdate %{nil}
%global gitrel %{nil}
%global gitver %{nil}
# Keep the below around for possible snapshot times (was a must prior to 0.1)
#global scommit #(c=#{commit}; echo ${c:0:7})
#global gitrel .#{gitdate}git#{scommit}
#global gitver -#{gitdate}git#{scommit}
%global api_ver 0
Name: wlroots
Version: 0.20.2
Release: 2%{?dist}
Version: 0.1
Release: 5%{?gitrel}%{?dist}
Summary: A modular Wayland compositor library
%global tag %{gsub %{version} ~ -}
# Source files/overall project licensed as MIT, but
# - HPND-sell-variant
# * protocol/drm.xml
# * protocol/wlr-data-control-unstable-v1.xml
# * protocol/wlr-foreign-toplevel-management-unstable-v1.xml
# All files in the sources are licensed as MIT, but
# - LGPL (v2.1 or later)
# * protocol/idle.xml
# * protocol/server-decoration.xml
# - NTP (legal disclaimer)
# * protocol/gamma-control.xml
# * protocol/text-input-unstable-v3.xml
# * protocol/wlr-gamma-control-unstable-v1.xml
# * protocol/wlr-input-inhibitor-unstable-v1.xml
# * protocol/wlr-layer-shell-unstable-v1.xml
# * protocol/wlr-output-management-unstable-v1.xml
# - LGPL-2.1-or-later
# * protocol/server-decoration.xml
# Those files are processed to C-compilable files by the
# `wayland-scanner` binary during build and don't alter
# the main license of the binaries linking with them by
# the underlying licenses.
#
# Those files are processed to c-compilable files by the
# `wayland-scanner` binary during build and don't alter the
# main license of the binaries linking with them by the
# underlying licenses.
License: MIT
URL: https://gitlab.freedesktop.org/wlroots/wlroots
Source0: %{url}/-/releases/%{tag}/downloads/%{name}-%{tag}.tar.gz
Source1: %{url}/-/releases/%{tag}/downloads/%{name}-%{tag}.tar.gz.sig
# 0FDE7BE0E88F5E48: emersion <contact@emersion.fr>
Source2: https://emersion.fr/.well-known/openpgpkey/hu/dj3498u4hyyarh35rkjfnghbjxug6b19#/gpgkey-0FDE7BE0E88F5E48.gpg
URL: https://github.com/swaywm/%{name}
Source0: %{url}/archive/%{commit}.tar.gz#/%{name}-%{version}%{?gitver}.tar.gz
Patch0: %{url}/commit/be6210cf8216c08a91e085dac0ec11d0e34fb217.patch#/pkgconfig_version.patch
Patch1: %{url}/commit/5d26da9d15d4874c383bbc9948a802fcd605dc8b.patch#/data-device-multiple_per_seat.patch
Patch2: %{url}/commit/4423f88fac1d82756bab451f451b159fa6d0e9f5.patch#/data-device-no_cancel_on_destroy.patch
Patch3: %{url}/commit/b9a2e4ba4c92cd4c19f8cf5ed7e6603731eca9ab.patch#/gtk-primary-selection_multiple_devices.patch
Patch4: %{url}/commit/eaafd65a12d6b15cc8e503ef6e9e99a65bd1e791.patch#/gtk-primary-selection-track_resources.patch
# this file is a modification of examples/meson.build so as to:
# - make it self-contained
# - only has targets for examples known to compile well (cf. "examples) global)
Source3: examples.meson.build
# Upstream patches
# Fedora patches
# Following patch is required for phoc.
Patch: Revert-layer-shell-error-on-0-dimension-without-anch.patch
BuildRequires: gcc
BuildRequires: glslang
BuildRequires: gnupg2
BuildRequires: meson >= 1.3
BuildRequires: (pkgconfig(libliftoff) >= %{liftoff_ver} with pkgconfig(libliftoff) < 0.6)
BuildRequires: pkgconfig(egl)
BuildRequires: pkgconfig(gbm) >= 21.1
BuildRequires: pkgconfig(glesv2)
BuildRequires: pkgconfig(hwdata)
BuildRequires: pkgconfig(lcms2)
BuildRequires: pkgconfig(libdisplay-info) >= 0.2.0
BuildRequires: pkgconfig(libdrm) >= 2.4.129
BuildRequires: pkgconfig(libinput) >= 1.21.0
BuildRequires: pkgconfig(libseat)
BuildRequires: pkgconfig(libudev)
BuildRequires: pkgconfig(pixman-1) >= 0.46.0
BuildRequires: pkgconfig(vulkan) >= 1.2.182
BuildRequires: pkgconfig(wayland-client)
BuildRequires: pkgconfig(wayland-protocols) >= 1.47
BuildRequires: pkgconfig(wayland-scanner)
BuildRequires: pkgconfig(wayland-server) >= 1.24.0
BuildRequires: pkgconfig(x11-xcb)
BuildRequires: pkgconfig(xcb)
BuildRequires: pkgconfig(xcb-composite)
BuildRequires: pkgconfig(xcb-dri3)
BuildRequires: pkgconfig(xcb-errors)
BuildRequires: pkgconfig(xcb-ewmh)
BuildRequires: pkgconfig(xcb-icccm)
BuildRequires: pkgconfig(xcb-present)
BuildRequires: pkgconfig(xcb-render)
BuildRequires: pkgconfig(xcb-renderutil)
BuildRequires: pkgconfig(xcb-res)
BuildRequires: pkgconfig(xcb-shm)
BuildRequires: pkgconfig(xcb-xfixes) >= 1.15
BuildRequires: pkgconfig(xcb-xinput)
BuildRequires: pkgconfig(xkbcommon) >= 1.8.0
BuildRequires: pkgconfig(xwayland)
# libliftoff does not bump soname on API changes
Requires: libliftoff%{?_isa} >= %{liftoff_ver}
BuildRequires: libcap-devel
BuildRequires: libinput-devel
BuildRequires: libpng
BuildRequires: libxkbcommon-devel
BuildRequires: mesa-libEGL-devel
BuildRequires: mesa-libGLES-devel
BuildRequires: mesa-libgbm-devel
BuildRequires: mesa-libwayland-egl-devel
BuildRequires: meson
BuildRequires: pixman-devel
BuildRequires: systemd-devel
BuildRequires: wayland-devel
BuildRequires: wayland-protocols-devel
BuildRequires: xcb-util-image-devel
BuildRequires: xcb-util-wm-devel
# patch application
BuildRequires: git
%description
%{summary}.
@ -90,274 +66,75 @@ Requires: libliftoff%{?_isa} >= %{liftoff_ver}
%package devel
Summary: Development files for %{name}
Requires: %{name}%{?_isa} == %{version}-%{release}
# not required per se, so not picked up automatically by RPM
Recommends: pkgconfig(xcb-icccm)
# for examples
Suggests: gcc
Suggests: meson >= 0.58.0
Suggests: pkgconfig(wayland-egl)
Requires: libinput-devel%{?_isa}
Requires: libxcb-devel%{?_isa}
Requires: libxkbcommon-devel%{?_isa}
Requires: mesa-libEGL-devel%{?_isa}
Requires: pixman-devel%{?_isa}
Requires: systemd-devel%{?_isa}
Requires: wayland-devel%{?_isa}
Requires: xcb-util-wm-devel%{?_isa}
%description devel
Development files for %{name}.
%prep
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
%autosetup -N -n %{name}-%{tag}
# apply unconditional patches (0..99)
%autopatch -p1 -M99
# apply conditional patches (100..)
%define __scm git_am
%autosetup -n %{name}-%{commit} -p 1
%build
MESON_OPTIONS=(
# Disable options requiring extra/unpackaged dependencies
-Dexamples=false
)
%{meson} "${MESON_OPTIONS[@]}"
%{meson_build}
# Needed since xcb-errors is not packaged (yet?)
%global __meson_auto_features auto
%ifarch %{arm} %{ix86}
export CFLAGS="%{optflags} -Wno-error=format="
export CXXFLAGS="%{optflags} -Wno-error=format="
%endif
%meson
%meson_build
%install
%{meson_install}
install -pm0644 -Dt '%{buildroot}/%{_pkgdocdir}/examples' examples/*.[ch]
install -pm0644 -D '%{SOURCE3}' '%{buildroot}/%{_pkgdocdir}/examples/meson.build'
%meson_install
# %%doc && examples.
%{__mkdir} -p %{buildroot}%{_pkgdocdir}
%{__cp} -pr README.md examples %{buildroot}%{_pkgdocdir}
# Cleanup.
for f in '.*ignore*' meson.build; do
%{_bindir}/find %{buildroot} -type f -name "$f" -print -delete
done
%check
%{meson_test}
%meson_test
# Needed only for < F28
%ldconfig_scriptlets
%files
%doc %dir %{_pkgdocdir}
%doc %{_pkgdocdir}/README.md
%license LICENSE
%doc README.md
%{_libdir}/libwlroots-%{abi_ver}.so
%{_libdir}/lib%{name}.so.%{api_ver}*
%files devel
%files devel
%doc %{_pkgdocdir}/examples
%{_includedir}/wlroots-%{abi_ver}/wlr
%{_libdir}/pkgconfig/wlroots-%{abi_ver}.pc
%{_includedir}/wlr
%{_libdir}/lib%{name}.so
%{_libdir}/pkgconfig/%{name}.pc
%changelog
* Fri Jul 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 0.20.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
* Tue Jul 07 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.20.2-1
- Update to 0.20.2 (#2497891)
* Tue May 19 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.20.1-1
- Update to 0.20.1 (#2480014)
* Thu Mar 26 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.20.0-1
- Update to 0.20.0 (#2435845)
* Thu Mar 19 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.20.0~rc5-1
- Update to 0.20.0-rc5
* Sat Feb 14 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.20.0~rc2-1
- Update to 0.20.0-rc2
* Thu Feb 12 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.19.2-4
- Apply upstream patch for libinput 1.31 compatibility
* Sat Jan 24 2026 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.19.2-3
- Rebuild for libdisplay-info 0.3.0
* Sat Jan 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 0.19.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Tue Oct 21 2025 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.19.2-1
- Update to 0.19.2 (#2405567)
* Sun Sep 28 2025 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.19.1-2
- Apply upstream patch for crash on disabling outputs
* Sun Sep 21 2025 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.19.1-1
- Update to 0.19.1 (#2397203)
* Fri Jul 25 2025 Fedora Release Engineering <releng@fedoraproject.org> - 0.19.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Fri May 16 2025 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.19.0-1
- Update to 0.19.0 (#2359256)
* Sat Feb 15 2025 Sam Day <me@samcday.com> - 0.18.2-4
- Add wlroots!4985 patch needed by phoc 0.45.0
* Mon Feb 10 2025 Neal Gompa <ngompa@fedoraproject.org> - 0.18.2-3
- Rebuild for libdisplay-info 0.2.0
* Sun Jan 19 2025 Fedora Release Engineering <releng@fedoraproject.org> - 0.18.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Wed Dec 11 2024 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.18.2-1
- Update to 0.18.2 (#2331871)
* Fri Sep 20 2024 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.18.1-1
- Update to 0.18.1 (#2313753)
* Thu Aug 08 2024 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.18.0-1
- Update to 0.18.0 (#2297921)
* Sat Jul 20 2024 Fedora Release Engineering <releng@fedoraproject.org> - 0.17.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Sat Jun 29 2024 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.17.4-1
- Update to 0.17.4 (#2294793)
* Fri Apr 26 2024 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.17.3-1
- Update to 0.17.3
* Mon Mar 11 2024 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.17.2-1
- Update to 0.17.2 (#2269046)
* Sat Jan 27 2024 Fedora Release Engineering <releng@fedoraproject.org> - 0.17.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Thu Dec 21 2023 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.17.1-1
- Update to 0.17.1 (#2255547)
* Tue Nov 21 2023 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.17.0-1
- Update to 0.17.0 (#2250885)
- Use xcb-errors util library
- Apply patches from 0.17.x bugfix branch
* Sat Jul 22 2023 Fedora Release Engineering <releng@fedoraproject.org> - 0.16.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Sun Apr 16 2023 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.16.2-2
- Apply upstream patch to remove hardcoded Vulkan validation layers
* Fri Feb 10 2023 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.16.2-1
- Update to 0.16.2 (#2168992)
* Sat Jan 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 0.16.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Sun Dec 25 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.16.1-1
- Update to 0.16.1
* Fri Dec 02 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.16.0-1
- Update to 0.16.0 (#2142159)
- Add patch for compatibility with older libdrm
- Sync examples.meson.build with upstream, include all available examples
* Mon Nov 14 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.15.1-5
- Backport upstream crash fix (#2142447)
- Convert license to SPDX
* Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 0.15.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sun Jun 26 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.15.1-3
- Add patches required for phoc 0.20
* Wed Jun 01 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.15.1-2
- Drop patches for wayland 1.19 compatibility
* Sat Feb 05 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.15.1-1
- Update to 0.15.1 (#2050408)
* Tue Jan 25 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.15.0-3
- Backport fix for permission popups in Firefox
* Sat Jan 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 0.15.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Sun Jan 16 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.15.0-1
- Update to 0.15.0 (#2033651)
- Update upstream URL to gitlab.freedesktop.org
- Backport some patches from 0.15.1 milestone
* Mon Dec 13 2021 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.14.1-3
- Add patch for disappearing cursor issue (#2027431)
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.14.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Thu Jul 08 2021 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.14.1-1
- Update to wlroots 0.14.1
* Wed Jul 07 2021 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.14.0-2
- Add patch for a few more issues with cursors, multi-GPUs and nouveau
* Wed Jun 23 2021 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.14.0-1
- Update to 0.14.0
- Add upstream patch for cursor issues on scaled outputs
* Tue Jun 01 2021 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.13.0-2
- Enable libseat session backend
* Wed Apr 07 2021 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.13.0-1
- Update to 0.13.0 (#1947218)
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.12.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Sun Nov 08 2020 Aleksei Bavshin <alebastr@fedoraproject.org> - 0.12.0-1
- Updated to version 0.12.0
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.11.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Wed Jul 15 2020 Aleksei Bavshin <alebastr89@gmail.com> - 0.11.0-1
- Updated to version 0.11.0
* Sat May 09 2020 Till Hofmann <thofmann@fedoraproject.org> - 0.10.1-2
- Add patch from upstream #2167 to fix #1829212
* Tue Mar 24 2020 Nikhil Jha <hi@nikhiljha.com> - 0.10.1-1
- Updated to version 0.10.1 (https://github.com/swaywm/wlroots/releases/tag/0.10.1)
* Mon Feb 10 2020 Jan Staněk <jstanek@redhat.com> - 0.10.0-6
- Propagate mesa-libEGL-devel workaround to -devel requirements
* Sat Feb 08 2020 Simone Caronni <negativo17@gmail.com> - 0.10.0-5
- RDP backend is no longer in wlroots 0.10.
* Fri Feb 07 2020 Simone Caronni <negativo17@gmail.com> - 0.10.0-4
- Rebuild for updated FreeRDP.
* Tue Feb 04 2020 Jan Staněk <jstanek@redhat.com> - 0.10.0-3
- Disable -Werror compilation flag on s390x
(https://github.com/swaywm/wlroots/issues/2018)
* Wed Jan 29 2020 Jan Staněk <jstanek@redhat.com> - 0.10.0-2
- Backport fix for compilation with GCC 10
* Tue Jan 28 2020 Joe Walker <grumpey0@gmail.com> - 0.10.0
- Updated to version 0.10.0 (https://github.com/swaywm/wlroots/releases/tag/0.10.0)
Mon Jan 20 2020 Jan Staněk <jstanek@redhat.com> - 0.9.1-1
- Upgrade to version 0.9.1 (https://github.com/swaywm/wlroots/releases/tag/0.9.1)
* Thu Sep 12 2019 Jan Staněk <jstanek@redhat.com> - 0.7.0-2
- Spec file cleanup
* Thu Aug 29 2019 Jeff Peeler <jpeeler@redhat.com> - 0.7.0-1
- Updated to version 0.7.0
* Sat Jul 27 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.6.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Thu May 09 2019 Jan Pokorný <jpokorny+rpm-wlroots@fedoraproject.org> - 0.6.0-1
- Updated to version 0.6.0
(see https://github.com/swaywm/wlroots/releases/tag/0.6.0)
- Overhaul dependencies and shipped examples in -devel
* Tue Apr 16 2019 Adam Williamson <awilliam@redhat.com> - 0.5.0-2
- Rebuild with Meson fix for #1699099
* Thu Mar 14 2019 Jan Pokorný <jpokorny+rpm-wlroots@fedoraproject.org> - 0.5.0-1
- Updated to version 0.5.0 (0.2, 0.3, 0.4, 0.4.1 releases effectively skipped)
- Avoid building some parts that are not shipped in binary form, anyway
- Minor spec cleanup (clarify the licensing comment, licensecheck's NTP ~ MIT,
ldconfig_scriptlets no longer relevant, arch-specific tweak no longer needed)
* Sun Feb 03 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.1-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild