Skip to content

Commit 7d761f6

Browse files
committed
Update to wlroots 0.18
1 parent 271ef83 commit 7d761f6

File tree

7 files changed

+99
-55
lines changed

7 files changed

+99
-55
lines changed

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dep_argparse = dependency('argparse', version: '>= 3.0', fallback: ['argparse'])
1818
dep_wayland_protocols = dependency('wayland-protocols', version: '>= 1.31')
1919
dep_wayland_scanner = dependency('wayland-scanner')
2020
dep_wayland_server = dependency('wayland-server')
21-
dep_wlroots = dependency('wlroots', version: ['>= 0.17', '< 0.18.0'], fallback: ['wlroots'], default_options: ['examples=false'])
21+
dep_wlroots = dependency('wlroots-0.18', version: ['>= 0.18.0', '< 0.19.0'], fallback: 'wlroots', default_options: ['examples=false'])
2222
dep_xcb = dependency('xcb')
2323
dep_xkbcommon = dependency('xkbcommon')
2424

src/input/cursor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ static void cursor_axis_notify(wl_listener* listener, void* data) {
117117
const auto* event = static_cast<wlr_pointer_axis_event*>(data);
118118

119119
/* Notify the client with pointer focus of the axis event. */
120-
wlr_seat_pointer_notify_axis(
121-
cursor.seat.wlr, event->time_msec, event->orientation, event->delta, event->delta_discrete, event->source);
120+
wlr_seat_pointer_notify_axis(cursor.seat.wlr, event->time_msec, event->orientation, event->delta, event->delta_discrete,
121+
event->source, event->relative_direction);
122122
}
123123

124124
/* This event is forwarded by the cursor when a pointer emits an frame
@@ -188,7 +188,7 @@ static void cursor_button_notify(wl_listener* listener, void* data) {
188188
wlr_surface* surface = nullptr;
189189
auto magpie_surface = server.surface_at(cursor.wlr.x, cursor.wlr.y, &surface, &sx, &sy).lock();
190190

191-
if (event->state == WLR_BUTTON_RELEASED) {
191+
if (event->state == WL_POINTER_BUTTON_STATE_RELEASED) {
192192
/* If you released any buttons, we exit interactive move/resize mode. */
193193
if (cursor.mode != MAGPIE_CURSOR_PASSTHROUGH) {
194194
cursor.reset_mode();

src/input/seat.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ void Seat::new_input_device(wlr_input_device* device) {
153153
keyboards.push_back(std::make_shared<Keyboard>(*this, *wlr_keyboard_from_input_device(device)));
154154
break;
155155
case WLR_INPUT_DEVICE_POINTER:
156-
case WLR_INPUT_DEVICE_TABLET_TOOL:
156+
case WLR_INPUT_DEVICE_TABLET:
157+
case WLR_INPUT_DEVICE_TABLET_PAD:
157158
case WLR_INPUT_DEVICE_TOUCH:
158159
cursor.attach_input_device(device);
159160
break;

src/server.cpp

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,17 @@ static void new_output_notify(wl_listener* listener, void* data) {
189189
* would let the user configure it. */
190190
if (wl_list_empty(&new_output->modes) == 0) {
191191
wlr_output_mode* mode = wlr_output_preferred_mode(new_output);
192-
wlr_output_set_mode(new_output, mode);
193-
wlr_output_enable(new_output, true);
194-
if (!wlr_output_commit(new_output)) {
192+
wlr_output_state state = {};
193+
wlr_output_state_init(&state);
194+
wlr_output_state_set_mode(&state, mode);
195+
wlr_output_state_set_enabled(&state, true);
196+
if (!wlr_output_commit_state(new_output, &state)) {
197+
wlr_log(WLR_ERROR, "Failed to commit mode to new output %s", new_output->name);
198+
wlr_output_state_finish(&state);
195199
return;
196200
}
201+
202+
wlr_output_state_finish(&state);
197203
}
198204

199205
/* Allocates and configures our state for this output */
@@ -224,37 +230,41 @@ static void output_power_manager_set_mode_notify([[maybe_unused]] wl_listener* l
224230

225231
const auto& event = *static_cast<wlr_output_power_v1_set_mode_event*>(data);
226232

227-
if (event.mode == ZWLR_OUTPUT_POWER_V1_MODE_ON) {
228-
wlr_output_enable(event.output, true);
229-
if (!wlr_output_test(event.output)) {
230-
wlr_output_rollback(event.output);
231-
}
232-
wlr_output_commit(event.output);
233-
} else {
234-
wlr_output_enable(event.output, false);
235-
wlr_output_commit(event.output);
233+
wlr_output_state state = {};
234+
wlr_output_state_init(&state);
235+
wlr_output_state_set_enabled(&state, event.mode == ZWLR_OUTPUT_POWER_V1_MODE_ON);
236+
if (!wlr_output_commit_state(event.output, &state)) {
237+
wlr_log(WLR_ERROR, "Failed to set enabled state %d for output %s", state.enabled, event.output->name);
236238
}
239+
wlr_output_state_finish(&state);
237240
}
238241

239-
/* This event is raised when wlr_xdg_shell receives a new xdg surface from a
240-
* client, either a toplevel (application window) or popup. */
241-
static void new_xdg_surface_notify(wl_listener* listener, void* data) {
242-
wlr_log(WLR_DEBUG, "wlr_xdg_shell.events.new_surface(listener=%p, data=%p)", (void*) listener, data);
242+
static void new_xdg_toplevel_notify(wl_listener* listener, void* data) {
243+
wlr_log(WLR_DEBUG, "wlr_xdg_shell.events.new_toplevel(listener=%p, data=%p)", (void*) listener, data);
243244

244245
if (data == nullptr) {
245-
wlr_log(WLR_ERROR, "No data passed to wlr_xdg_shell.events.new_surface");
246+
wlr_log(WLR_ERROR, "No data passed to wlr_xdg_shell.events.new_toplevel");
246247
return;
247248
}
248249

249-
Server& server = magpie_container_of(listener, server, xdg_shell_new_xdg_surface);
250-
const auto& xdg_surface = *static_cast<wlr_xdg_surface*>(data);
250+
Server& server = magpie_container_of(listener, server, xdg_shell_new_xdg_toplevel);
251+
auto& xdg_toplevel = *static_cast<wlr_xdg_toplevel*>(data);
251252

252-
if (xdg_surface.role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) {
253-
server.views.emplace_back(std::make_shared<XdgView>(server, *xdg_surface.toplevel));
254-
} else if (xdg_surface.role == WLR_XDG_SURFACE_ROLE_POPUP) {
255-
auto* surface = static_cast<Surface*>(xdg_surface.popup->parent->data);
256-
surface->popups.emplace(std::make_shared<Popup>(*surface, *xdg_surface.popup));
253+
server.views.emplace_back(std::make_shared<XdgView>(server, xdg_toplevel));
254+
}
255+
256+
static void new_xdg_popup_notify(wl_listener*, void* data) {
257+
if (data == nullptr) {
258+
wlr_log(WLR_ERROR, "No data passed to wlr_xdg_shell.events.new_popup");
259+
return;
257260
}
261+
262+
auto& xdg_popup = *static_cast<wlr_xdg_popup*>(data);
263+
264+
auto* parent = wlr_xdg_surface_try_from_wlr_surface(xdg_popup.parent);
265+
266+
auto& parent_surface = *static_cast<Surface*>(parent->data);
267+
parent_surface.popups.emplace(std::make_shared<Popup>(parent_surface, xdg_popup));
258268
}
259269

260270
static void new_layer_surface_notify(wl_listener* listener, void* data) {
@@ -344,8 +354,11 @@ static void drm_lease_request_notify(wl_listener* listener, void* data) {
344354
continue;
345355
}
346356

347-
wlr_output_enable(&output->wlr, false);
348-
wlr_output_commit(&output->wlr);
357+
wlr_output_state state = {};
358+
wlr_output_state_init(&state);
359+
wlr_output_state_set_enabled(&state, false);
360+
wlr_output_commit_state(&output->wlr, &state);
361+
wlr_output_state_finish(&state);
349362
wlr_output_layout_remove(server.output_layout, &output->wlr);
350363
output->is_leased = true;
351364
}
@@ -396,25 +409,29 @@ void output_manager_apply_notify(wl_listener* listener, void* data) {
396409
const bool adding = enabled && !output.wlr.enabled;
397410
const bool removing = !enabled && output.wlr.enabled;
398411

399-
wlr_output_enable(&output.wlr, enabled);
412+
wlr_output_state state = {};
413+
wlr_output_state_init(&state);
414+
wlr_output_state_set_enabled(&state, enabled);
415+
400416
if (enabled) {
401417
if (head->state.mode != nullptr) {
402-
wlr_output_set_mode(&output.wlr, head->state.mode);
418+
wlr_output_state_set_mode(&state, head->state.mode);
403419
} else {
404420
const int32_t width = head->state.custom_mode.width;
405421
const int32_t height = head->state.custom_mode.height;
406422
const int32_t refresh = head->state.custom_mode.refresh;
407-
wlr_output_set_custom_mode(&output.wlr, width, height, refresh);
423+
wlr_output_state_set_custom_mode(&state, width, height, refresh);
408424
}
409425

410-
wlr_output_set_scale(&output.wlr, head->state.scale);
411-
wlr_output_set_transform(&output.wlr, head->state.transform);
426+
wlr_output_state_set_scale(&state, head->state.scale);
427+
wlr_output_state_set_transform(&state, head->state.transform);
412428
}
413429

414-
if (!wlr_output_commit(&output.wlr)) {
430+
if (!wlr_output_commit_state(&output.wlr, &state)) {
415431
wlr_log(WLR_ERROR, "Output config commit failed");
416432
continue;
417433
}
434+
wlr_output_state_finish(&state);
418435

419436
if (adding) {
420437
wlr_output_layout_add_auto(server.output_layout, &output.wlr);
@@ -485,7 +502,7 @@ Server::Server() : listeners(*this) {
485502
* backend based on the current environment, such as opening an X11 window
486503
* if an X11 server is running. */
487504
session = nullptr;
488-
backend = wlr_backend_autocreate(display, &session);
505+
backend = wlr_backend_autocreate(wl_display_get_event_loop(display), &session);
489506
if (backend == nullptr) {
490507
early_exit(display, "Failed to create a wlr_backend for the Wayland display");
491508
}
@@ -528,7 +545,7 @@ Server::Server() : listeners(*this) {
528545

529546
/* Creates an output layout, which a wlroots utility for working with an
530547
* arrangement of screens in a physical layout. */
531-
output_layout = wlr_output_layout_create();
548+
output_layout = wlr_output_layout_create(display);
532549
listeners.output_layout_change.notify = output_layout_change_notify;
533550
wl_signal_add(&output_layout->events.change, &listeners.output_layout_change);
534551

@@ -569,13 +586,14 @@ Server::Server() : listeners(*this) {
569586

570587
auto* presentation = wlr_presentation_create(display, backend);
571588
if (presentation == nullptr) {
572-
early_exit(display, "Failed to create a wlr_presentation for the wlr_scene");
589+
early_exit(display, "Failed to create a wlr_presentation for the Wayland display");
573590
}
574-
wlr_scene_set_presentation(scene, presentation);
575591

576592
xdg_shell = wlr_xdg_shell_create(display, 5);
577-
listeners.xdg_shell_new_xdg_surface.notify = new_xdg_surface_notify;
578-
wl_signal_add(&xdg_shell->events.new_surface, &listeners.xdg_shell_new_xdg_surface);
593+
listeners.xdg_shell_new_xdg_toplevel.notify = new_xdg_toplevel_notify;
594+
wl_signal_add(&xdg_shell->events.new_toplevel, &listeners.xdg_shell_new_xdg_toplevel);
595+
listeners.xdg_shell_new_xdg_popup.notify = new_xdg_popup_notify;
596+
wl_signal_add(&xdg_shell->events.new_popup, &listeners.xdg_shell_new_xdg_popup);
579597

580598
layer_shell = wlr_layer_shell_v1_create(display, 4);
581599
listeners.layer_shell_new_layer_surface.notify = new_layer_surface_notify;

src/server.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ class Server final : public std::enable_shared_from_this<Server> {
4242
public:
4343
struct Listeners {
4444
std::reference_wrapper<Server> parent;
45-
wl_listener xdg_shell_new_xdg_surface = {};
45+
wl_listener xdg_shell_new_xdg_toplevel = {};
46+
wl_listener xdg_shell_new_xdg_popup = {};
4647
wl_listener layer_shell_new_layer_surface = {};
4748
wl_listener activation_request_activation = {};
4849
wl_listener backend_new_output = {};

src/surface/xdg_view.cpp

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ static void xdg_toplevel_unmap_notify(wl_listener* listener, [[maybe_unused]] vo
3131
view.unmap();
3232
}
3333

34+
static void xdg_toplevel_commit_notify(wl_listener* listener, void*) {
35+
XdgView& view = magpie_container_of(listener, view, commit);
36+
37+
if (view.wlr.base->initial_commit) {
38+
wlr_xdg_toplevel_set_size(&view.wlr, 0, 0);
39+
}
40+
}
41+
3442
/* Called when the surface is destroyed and should never be shown again. */
3543
static void xdg_toplevel_destroy_notify(wl_listener* listener, [[maybe_unused]] void* data) {
3644
wlr_log(WLR_DEBUG, "wlr_xdg_toplevel.events.destroy(listener=%p, data=%p)", (void*) listener, data);
@@ -50,8 +58,10 @@ static void xdg_toplevel_request_move_notify(wl_listener* listener, [[maybe_unus
5058

5159
XdgView& view = magpie_container_of(listener, view, request_move);
5260

53-
view.set_placement(VIEW_PLACEMENT_STACKING);
54-
view.begin_interactive(MAGPIE_CURSOR_MOVE, 0);
61+
if (view.wlr.base->initialized) {
62+
view.set_placement(VIEW_PLACEMENT_STACKING);
63+
view.begin_interactive(MAGPIE_CURSOR_MOVE, 0);
64+
}
5565
}
5666

5767
/* This event is raised when a client would like to begin an interactive
@@ -70,8 +80,10 @@ static void xdg_toplevel_request_resize_notify(wl_listener* listener, void* data
7080
XdgView& view = magpie_container_of(listener, view, request_resize);
7181
const auto* event = static_cast<wlr_xdg_toplevel_resize_event*>(data);
7282

73-
view.set_placement(VIEW_PLACEMENT_STACKING);
74-
view.begin_interactive(MAGPIE_CURSOR_RESIZE, event->edges);
83+
if (view.wlr.base->initialized) {
84+
view.set_placement(VIEW_PLACEMENT_STACKING);
85+
view.begin_interactive(MAGPIE_CURSOR_RESIZE, event->edges);
86+
}
7587
}
7688

7789
/* This event is raised when a client would like to maximize itself,
@@ -82,26 +94,32 @@ static void xdg_toplevel_request_maximize_notify(wl_listener* listener, [[maybe_
8294

8395
XdgView& view = magpie_container_of(listener, view, request_maximize);
8496

85-
view.toggle_maximize();
86-
wlr_xdg_surface_schedule_configure(view.wlr.base);
97+
if (view.wlr.base->initialized) {
98+
view.toggle_maximize();
99+
wlr_xdg_surface_schedule_configure(view.wlr.base);
100+
}
87101
}
88102

89103
static void xdg_toplevel_request_fullscreen_notify(wl_listener* listener, [[maybe_unused]] void* data) {
90104
wlr_log(WLR_DEBUG, "wlr_xdg_toplevel.events.request_fullscreen(listener=%p, data=%p)", (void*) listener, data);
91105

92106
XdgView& view = magpie_container_of(listener, view, request_fullscreen);
93107

94-
view.toggle_fullscreen();
95-
wlr_xdg_surface_schedule_configure(view.wlr.base);
108+
if (view.wlr.base->initialized) {
109+
view.toggle_fullscreen();
110+
wlr_xdg_surface_schedule_configure(view.wlr.base);
111+
}
96112
}
97113

98114
static void xdg_toplevel_request_minimize_notify(wl_listener* listener, [[maybe_unused]] void* data) {
99115
wlr_log(WLR_DEBUG, "wlr_xdg_toplevel.events.request_minimize(listener=%p, data=%p)", (void*) listener, data);
100116

101117
XdgView& view = magpie_container_of(listener, view, request_minimize);
102118

103-
view.set_minimized(!view.is_minimized);
104-
wlr_xdg_surface_schedule_configure(view.wlr.base);
119+
if (view.wlr.base->initialized) {
120+
view.set_minimized(!view.is_minimized);
121+
wlr_xdg_surface_schedule_configure(view.wlr.base);
122+
}
105123
}
106124

107125
static void xdg_toplevel_set_title_notify(wl_listener* listener, [[maybe_unused]] void* data) {
@@ -187,6 +205,8 @@ XdgView::XdgView(Server& server, wlr_xdg_toplevel& xdg_toplevel) noexcept
187205
wl_signal_add(&wlr.base->surface->events.map, &listeners.map);
188206
listeners.unmap.notify = xdg_toplevel_unmap_notify;
189207
wl_signal_add(&wlr.base->surface->events.unmap, &listeners.unmap);
208+
listeners.commit.notify = xdg_toplevel_commit_notify;
209+
wl_signal_add(&wlr.base->surface->events.commit, &listeners.commit);
190210
listeners.destroy.notify = xdg_toplevel_destroy_notify;
191211
wl_signal_add(&wlr.base->events.destroy, &listeners.destroy);
192212
listeners.request_move.notify = xdg_toplevel_request_move_notify;
@@ -214,6 +234,7 @@ XdgView::XdgView(Server& server, wlr_xdg_toplevel& xdg_toplevel) noexcept
214234
XdgView::~XdgView() noexcept {
215235
wl_list_remove(&listeners.map.link);
216236
wl_list_remove(&listeners.unmap.link);
237+
wl_list_remove(&listeners.commit.link);
217238
wl_list_remove(&listeners.destroy.link);
218239
wl_list_remove(&listeners.request_move.link);
219240
wl_list_remove(&listeners.request_resize.link);

subprojects/wlroots.wrap

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
[wrap-git]
22
url = https://gitlab.freedesktop.org/wlroots/wlroots.git
3-
revision = 0.17.3
3+
revision = 0.18.0
44
depth = 1
5+
6+
[provide]
7+
dependency_names = wlroots-0.18

0 commit comments

Comments
 (0)