diff --git a/.gitignore b/.gitignore index d9f0c39..3d8297c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ /wlroots-*.tar.gz -/wlroots-*.tar.gz.sig diff --git a/Revert-layer-shell-error-on-0-dimension-without-anch.patch b/Revert-layer-shell-error-on-0-dimension-without-anch.patch deleted file mode 100644 index a9112d9..0000000 --- a/Revert-layer-shell-error-on-0-dimension-without-anch.patch +++ /dev/null @@ -1,33 +0,0 @@ -From e021326f7de0505fcae85f5732885848b21edf9c Mon Sep 17 00:00:00 2001 -From: Aleksei Bavshin -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 - diff --git a/data-device-multiple_per_seat.patch b/data-device-multiple_per_seat.patch new file mode 100644 index 0000000..1a9847f --- /dev/null +++ b/data-device-multiple_per_seat.patch @@ -0,0 +1,464 @@ +From 5d26da9d15d4874c383bbc9948a802fcd605dc8b Mon Sep 17 00:00:00 2001 +From: emersion +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 + #include + +-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, diff --git a/data-device-no_cancel_on_destroy.patch b/data-device-no_cancel_on_destroy.patch new file mode 100644 index 0000000..541ed56 --- /dev/null +++ b/data-device-no_cancel_on_destroy.patch @@ -0,0 +1,24 @@ +From 4423f88fac1d82756bab451f451b159fa6d0e9f5 Mon Sep 17 00:00:00 2001 +From: emersion +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: diff --git a/examples.meson.build b/examples.meson.build deleted file mode 100644 index b738157..0000000 --- a/examples.meson.build +++ /dev/null @@ -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 diff --git a/gpgkey-0FDE7BE0E88F5E48.gpg b/gpgkey-0FDE7BE0E88F5E48.gpg deleted file mode 100644 index 3530f32..0000000 Binary files a/gpgkey-0FDE7BE0E88F5E48.gpg and /dev/null differ diff --git a/gtk-primary-selection-track_resources.patch b/gtk-primary-selection-track_resources.patch new file mode 100644 index 0000000..afc6efb --- /dev/null +++ b/gtk-primary-selection-track_resources.patch @@ -0,0 +1,84 @@ +From eaafd65a12d6b15cc8e503ef6e9e99a65bd1e791 Mon Sep 17 00:00:00 2001 +From: emersion +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); + } diff --git a/gtk-primary-selection_multiple_devices.patch b/gtk-primary-selection_multiple_devices.patch new file mode 100644 index 0000000..3f61934 --- /dev/null +++ b/gtk-primary-selection_multiple_devices.patch @@ -0,0 +1,215 @@ +From b9a2e4ba4c92cd4c19f8cf5ed7e6603731eca9ab Mon Sep 17 00:00:00 2001 +From: emersion +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, + >k_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, +- >k_primary_selection_device_manager_interface, 1, manager, +- primary_selection_device_manager_bind); ++ >k_primary_selection_device_manager_interface, DEVICE_MANAGER_VERSION, ++ manager, primary_selection_device_manager_bind); + if (manager->global == NULL) { + free(manager); + return NULL; diff --git a/pkgconfig_version.patch b/pkgconfig_version.patch new file mode 100644 index 0000000..acf21b6 --- /dev/null +++ b/pkgconfig_version.patch @@ -0,0 +1,22 @@ +From be6210cf8216c08a91e085dac0ec11d0e34fb217 Mon Sep 17 00:00:00 2001 +From: emersion +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: [ diff --git a/sources b/sources index c7cac09..6687118 100644 --- a/sources +++ b/sources @@ -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 diff --git a/wlroots.spec b/wlroots.spec index 0ce3b16..430e048 100644 --- a/wlroots.spec +++ b/wlroots.spec @@ -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 -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 - 0.20.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild - -* Tue Jul 07 2026 Aleksei Bavshin - 0.20.2-1 -- Update to 0.20.2 (#2497891) - -* Tue May 19 2026 Aleksei Bavshin - 0.20.1-1 -- Update to 0.20.1 (#2480014) - -* Thu Mar 26 2026 Aleksei Bavshin - 0.20.0-1 -- Update to 0.20.0 (#2435845) - -* Thu Mar 19 2026 Aleksei Bavshin - 0.20.0~rc5-1 -- Update to 0.20.0-rc5 - -* Sat Feb 14 2026 Aleksei Bavshin - 0.20.0~rc2-1 -- Update to 0.20.0-rc2 - -* Thu Feb 12 2026 Aleksei Bavshin - 0.19.2-4 -- Apply upstream patch for libinput 1.31 compatibility - -* Sat Jan 24 2026 Aleksei Bavshin - 0.19.2-3 -- Rebuild for libdisplay-info 0.3.0 - -* Sat Jan 17 2026 Fedora Release Engineering - 0.19.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Tue Oct 21 2025 Aleksei Bavshin - 0.19.2-1 -- Update to 0.19.2 (#2405567) - -* Sun Sep 28 2025 Aleksei Bavshin - 0.19.1-2 -- Apply upstream patch for crash on disabling outputs - -* Sun Sep 21 2025 Aleksei Bavshin - 0.19.1-1 -- Update to 0.19.1 (#2397203) - -* Fri Jul 25 2025 Fedora Release Engineering - 0.19.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Fri May 16 2025 Aleksei Bavshin - 0.19.0-1 -- Update to 0.19.0 (#2359256) - -* Sat Feb 15 2025 Sam Day - 0.18.2-4 -- Add wlroots!4985 patch needed by phoc 0.45.0 - -* Mon Feb 10 2025 Neal Gompa - 0.18.2-3 -- Rebuild for libdisplay-info 0.2.0 - -* Sun Jan 19 2025 Fedora Release Engineering - 0.18.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Wed Dec 11 2024 Aleksei Bavshin - 0.18.2-1 -- Update to 0.18.2 (#2331871) - -* Fri Sep 20 2024 Aleksei Bavshin - 0.18.1-1 -- Update to 0.18.1 (#2313753) - -* Thu Aug 08 2024 Aleksei Bavshin - 0.18.0-1 -- Update to 0.18.0 (#2297921) - -* Sat Jul 20 2024 Fedora Release Engineering - 0.17.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Sat Jun 29 2024 Aleksei Bavshin - 0.17.4-1 -- Update to 0.17.4 (#2294793) - -* Fri Apr 26 2024 Aleksei Bavshin - 0.17.3-1 -- Update to 0.17.3 - -* Mon Mar 11 2024 Aleksei Bavshin - 0.17.2-1 -- Update to 0.17.2 (#2269046) - -* Sat Jan 27 2024 Fedora Release Engineering - 0.17.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Thu Dec 21 2023 Aleksei Bavshin - 0.17.1-1 -- Update to 0.17.1 (#2255547) - -* Tue Nov 21 2023 Aleksei Bavshin - 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 - 0.16.2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Sun Apr 16 2023 Aleksei Bavshin - 0.16.2-2 -- Apply upstream patch to remove hardcoded Vulkan validation layers - -* Fri Feb 10 2023 Aleksei Bavshin - 0.16.2-1 -- Update to 0.16.2 (#2168992) - -* Sat Jan 21 2023 Fedora Release Engineering - 0.16.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Sun Dec 25 2022 Aleksei Bavshin - 0.16.1-1 -- Update to 0.16.1 - -* Fri Dec 02 2022 Aleksei Bavshin - 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 - 0.15.1-5 -- Backport upstream crash fix (#2142447) -- Convert license to SPDX - -* Sat Jul 23 2022 Fedora Release Engineering - 0.15.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Sun Jun 26 2022 Aleksei Bavshin - 0.15.1-3 -- Add patches required for phoc 0.20 - -* Wed Jun 01 2022 Aleksei Bavshin - 0.15.1-2 -- Drop patches for wayland 1.19 compatibility - -* Sat Feb 05 2022 Aleksei Bavshin - 0.15.1-1 -- Update to 0.15.1 (#2050408) - -* Tue Jan 25 2022 Aleksei Bavshin - 0.15.0-3 -- Backport fix for permission popups in Firefox - -* Sat Jan 22 2022 Fedora Release Engineering - 0.15.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Sun Jan 16 2022 Aleksei Bavshin - 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 - 0.14.1-3 -- Add patch for disappearing cursor issue (#2027431) - -* Fri Jul 23 2021 Fedora Release Engineering - 0.14.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Thu Jul 08 2021 Aleksei Bavshin - 0.14.1-1 -- Update to wlroots 0.14.1 - -* Wed Jul 07 2021 Aleksei Bavshin - 0.14.0-2 -- Add patch for a few more issues with cursors, multi-GPUs and nouveau - -* Wed Jun 23 2021 Aleksei Bavshin - 0.14.0-1 -- Update to 0.14.0 -- Add upstream patch for cursor issues on scaled outputs - -* Tue Jun 01 2021 Aleksei Bavshin - 0.13.0-2 -- Enable libseat session backend - -* Wed Apr 07 2021 Aleksei Bavshin - 0.13.0-1 -- Update to 0.13.0 (#1947218) - -* Wed Jan 27 2021 Fedora Release Engineering - 0.12.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Sun Nov 08 2020 Aleksei Bavshin - 0.12.0-1 -- Updated to version 0.12.0 - -* Wed Jul 29 2020 Fedora Release Engineering - 0.11.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Wed Jul 15 2020 Aleksei Bavshin - 0.11.0-1 -- Updated to version 0.11.0 - -* Sat May 09 2020 Till Hofmann - 0.10.1-2 -- Add patch from upstream #2167 to fix #1829212 - -* Tue Mar 24 2020 Nikhil Jha - 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 - 0.10.0-6 -- Propagate mesa-libEGL-devel workaround to -devel requirements - -* Sat Feb 08 2020 Simone Caronni - 0.10.0-5 -- RDP backend is no longer in wlroots 0.10. - -* Fri Feb 07 2020 Simone Caronni - 0.10.0-4 -- Rebuild for updated FreeRDP. - -* Tue Feb 04 2020 Jan Staněk - 0.10.0-3 -- Disable -Werror compilation flag on s390x - (https://github.com/swaywm/wlroots/issues/2018) - -* Wed Jan 29 2020 Jan Staněk - 0.10.0-2 -- Backport fix for compilation with GCC 10 - -* Tue Jan 28 2020 Joe Walker - 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 - 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 - 0.7.0-2 -- Spec file cleanup - -* Thu Aug 29 2019 Jeff Peeler - 0.7.0-1 -- Updated to version 0.7.0 - -* Sat Jul 27 2019 Fedora Release Engineering - 0.6.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Thu May 09 2019 Jan Pokorný - 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 - 0.5.0-2 -- Rebuild with Meson fix for #1699099 - -* Thu Mar 14 2019 Jan Pokorný - 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 - 0.1-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild