fix: update to wlroot 0.18

This commit is contained in:
DanyLE
2025-07-02 22:54:16 +02:00
parent 964d22b22c
commit c1393a1366
5 changed files with 42 additions and 43 deletions

View File

@ -273,7 +273,7 @@ static void server_cursor_axis(struct wl_listener *listener, void *data)
/* Notify the client with pointer focus of the axis event. */ /* Notify the client with pointer focus of the axis event. */
wlr_seat_pointer_notify_axis(seat->wlr_seat, wlr_seat_pointer_notify_axis(seat->wlr_seat,
event->time_msec, event->orientation, event->delta, event->time_msec, event->orientation, event->delta,
event->delta_discrete, event->source); event->delta_discrete, event->source, event->delta);
} }
static void server_cursor_frame(struct wl_listener *listener, void *data) static void server_cursor_frame(struct wl_listener *listener, void *data)

11
diyac.c
View File

@ -95,7 +95,7 @@ int main(int argc, char *argv[])
* output hardware. The autocreate option will choose the most suitable * output hardware. The autocreate option will choose the most suitable
* backend based on the current environment, such as opening an X11 window * backend based on the current environment, such as opening an X11 window
* if an X11 server is running. */ * if an X11 server is running. */
server.backend = wlr_backend_autocreate(server.wl_display, NULL); server.backend = wlr_backend_autocreate(server.wl_event_loop, NULL);
if (server.backend == NULL) if (server.backend == NULL)
{ {
wlr_log(WLR_ERROR, "failed to create wlr_backend"); wlr_log(WLR_ERROR, "failed to create wlr_backend");
@ -151,7 +151,7 @@ int main(int argc, char *argv[])
/* Creates an output layout, which a wlroots utility for working with an /* Creates an output layout, which a wlroots utility for working with an
* arrangement of screens in a physical layout. */ * arrangement of screens in a physical layout. */
server.output_layout = wlr_output_layout_create(); server.output_layout = wlr_output_layout_create(server.wl_display);
/* Configure a listener to be notified when new outputs are available on the /* Configure a listener to be notified when new outputs are available on the
* backend. */ * backend. */
@ -180,9 +180,9 @@ int main(int argc, char *argv[])
server.xdg_popup_tree = wlr_scene_tree_create(&server.scene->tree); server.xdg_popup_tree = wlr_scene_tree_create(&server.scene->tree);
server.xdg_shell = wlr_xdg_shell_create(server.wl_display, 6); server.xdg_shell = wlr_xdg_shell_create(server.wl_display, 6);
server.new_xdg_surface.notify = diyac_new_xdg_surface; server.new_xdg_toplevel.notify = diyac_new_xdg_toplevel;
wl_signal_add(&server.xdg_shell->events.new_surface, wl_signal_add(&server.xdg_shell->events.new_toplevel,
&server.new_xdg_surface); &server.new_xdg_toplevel);
server.layer_shell = wlr_layer_shell_v1_create(server.wl_display, 4); server.layer_shell = wlr_layer_shell_v1_create(server.wl_display, 4);
server.new_layer_surface.notify = diyac_new_layer_surface; server.new_layer_surface.notify = diyac_new_layer_surface;
@ -263,6 +263,7 @@ int main(int argc, char *argv[])
{ {
wl_event_source_remove(server.proc_mon); wl_event_source_remove(server.proc_mon);
} }
// TODO remove all event listeners
wl_display_destroy_clients(server.wl_display); wl_display_destroy_clients(server.wl_display);
// wlr_scene_node_destroy(&server.scene->tree.node); // wlr_scene_node_destroy(&server.scene->tree.node);
wlr_xcursor_manager_destroy(server.seat.cursor_mgr); wlr_xcursor_manager_destroy(server.seat.cursor_mgr);

View File

@ -131,7 +131,9 @@ struct diyac_server
struct wlr_xdg_shell *xdg_shell; struct wlr_xdg_shell *xdg_shell;
struct wlr_layer_shell_v1 *layer_shell; struct wlr_layer_shell_v1 *layer_shell;
struct wl_listener new_xdg_surface;
struct wl_listener new_xdg_toplevel;
struct wl_listener new_layer_surface; struct wl_listener new_layer_surface;
struct wl_list views; struct wl_list views;
struct diyac_view * active_view; struct diyac_view * active_view;
@ -244,7 +246,6 @@ struct diyac_view
struct wl_listener request_minimize; struct wl_listener request_minimize;
struct wl_listener request_maximize; struct wl_listener request_maximize;
struct wl_listener request_fullscreen; struct wl_listener request_fullscreen;
struct wl_listener set_app_id; struct wl_listener set_app_id;
struct wl_listener new_popup; struct wl_listener new_popup;
struct wl_listener set_title; struct wl_listener set_title;

61
xdg.c
View File

@ -55,20 +55,32 @@ static void begin_interactive(struct diyac_view *toplevel,
} }
static void xdg_toplevel_commit(struct wl_listener *listener, void *data) static void xdg_toplevel_commit(struct wl_listener *listener, void *data)
{ {
struct diyac_view *view = wl_container_of(listener, view, commit); struct diyac_view *toplevel = wl_container_of(listener, toplevel, commit);
uint32_t serial = view->configuration_serial; uint32_t serial = toplevel->configuration_serial;
if (serial > 0 && serial == view->xdg_surface->current.configure_serial)
struct wlr_xdg_surface *xdg_surface = toplevel->xdg_surface;
if (xdg_surface->initial_commit)
{ {
wl_event_source_remove(view->configuration_timeout); uint32_t serial =
view->configuration_serial = 0; wlr_xdg_surface_schedule_configure(xdg_surface);
view->configuration_timeout = NULL; uint32_t wm_caps = WLR_XDG_TOPLEVEL_WM_CAPABILITIES_MAXIMIZE | WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN | WLR_XDG_TOPLEVEL_WM_CAPABILITIES_MINIMIZE;
wlr_xdg_toplevel_set_wm_capabilities(toplevel->xdg_toplevel, wm_caps);
return;
}
if (serial > 0 && serial == toplevel->xdg_surface->current.configure_serial)
{
wlr_log(WLR_INFO, "xdg_toplevel_commit: wl_event_source_remove");
wl_event_source_remove(toplevel->configuration_timeout);
toplevel->configuration_serial = 0;
toplevel->configuration_timeout = NULL;
// TODO move view // TODO move view
} }
diyac_view_sync_geo(view); diyac_view_sync_geo(toplevel);
} }
static void xdg_toplevel_map(struct wl_listener *listener, void *data) static void xdg_toplevel_map(struct wl_listener *listener, void *data)
{ {
wlr_log(WLR_INFO, "xdg_toplevel_map: %p", listener);
/* Called when the surface is mapped, or ready to display on-screen. */ /* Called when the surface is mapped, or ready to display on-screen. */
struct diyac_view *toplevel = wl_container_of(listener, toplevel, map); struct diyac_view *toplevel = wl_container_of(listener, toplevel, map);
if (toplevel->mapped) if (toplevel->mapped)
@ -84,9 +96,6 @@ static void xdg_toplevel_map(struct wl_listener *listener, void *data)
wlr_xdg_surface_get_geometry(toplevel->xdg_toplevel->base, &toplevel->pending_size); wlr_xdg_surface_get_geometry(toplevel->xdg_toplevel->base, &toplevel->pending_size);
wlr_scene_node_set_enabled(&toplevel->scene_tree->node, true); wlr_scene_node_set_enabled(&toplevel->scene_tree->node, true);
toplevel->mapped = true; toplevel->mapped = true;
wl_list_insert(&toplevel->server->views, &toplevel->link);
toplevel->commit.notify = xdg_toplevel_commit;
wl_signal_add(&toplevel->xdg_surface->surface->events.commit, &toplevel->commit);
diyac_view_update_app_id(toplevel); diyac_view_update_app_id(toplevel);
diyac_view_update_title(toplevel); diyac_view_update_title(toplevel);
@ -370,31 +379,15 @@ static void xdg_new_popup_notify(struct wl_listener *listener, void *data)
xdg_popup_create(view, wlr_popup); xdg_popup_create(view, wlr_popup);
} }
void diyac_new_xdg_surface(struct wl_listener *listener, void *data) void diyac_new_xdg_toplevel(struct wl_listener *listener, void *data)
{ {
/* This event is raised when wlr_xdg_shell receives a new xdg surface from a /* This event is raised when wlr_xdg_shell receives a new xdg surface from a
* client, either a toplevel (application window) or popup. */ * client, either a toplevel (application window) or popup. */
struct diyac_server *server = struct diyac_server *server =
wl_container_of(listener, server, new_xdg_surface); wl_container_of(listener, server, new_xdg_toplevel);
struct wlr_xdg_surface *xdg_surface = data; struct wlr_xdg_toplevel *xdg_toplevel = data;
struct wlr_xdg_surface *xdg_surface = xdg_toplevel->base;
/* We must add xdg popups to the scene graph so they get rendered. The
* wlroots scene graph provides a helper for this, but to use it we must
* provide the proper parent scene node of the xdg popup. To enable this,
* we always set the user data field of xdg_surfaces to the corresponding
* scene node. */
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP)
{
/*struct wlr_xdg_surface *parent =
wlr_xdg_surface_try_from_wlr_surface(xdg_surface->popup->parent);
assert(parent != NULL);
struct wlr_scene_tree *parent_tree = parent->data;
xdg_surface->data = wlr_scene_xdg_surface_create(
parent_tree, xdg_surface);
return;*/
wlr_log(WLR_INFO, "diyac_new_xdg_surface: Creating new dialog using view popup");
return;
}
assert(xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL); assert(xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL);
wlr_log(WLR_INFO, "diyac_new_xdg_surface: Creating new application windows"); wlr_log(WLR_INFO, "diyac_new_xdg_surface: Creating new application windows");
wlr_xdg_surface_ping(xdg_surface); wlr_xdg_surface_ping(xdg_surface);
@ -432,7 +425,6 @@ void diyac_new_xdg_surface(struct wl_listener *listener, void *data)
wl_signal_add(&xdg_surface->events.destroy, &toplevel->destroy); wl_signal_add(&xdg_surface->events.destroy, &toplevel->destroy);
/* cotd */ /* cotd */
struct wlr_xdg_toplevel *xdg_toplevel = xdg_surface->toplevel;
toplevel->request_move.notify = xdg_toplevel_request_move; toplevel->request_move.notify = xdg_toplevel_request_move;
wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move); wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move);
toplevel->request_resize.notify = xdg_toplevel_request_resize; toplevel->request_resize.notify = xdg_toplevel_request_resize;
@ -453,4 +445,9 @@ void diyac_new_xdg_surface(struct wl_listener *listener, void *data)
toplevel->set_title.notify = xdg_set_title_notify; toplevel->set_title.notify = xdg_set_title_notify;
wl_signal_add(&xdg_toplevel->events.set_title, &toplevel->set_title); wl_signal_add(&xdg_toplevel->events.set_title, &toplevel->set_title);
toplevel->commit.notify = xdg_toplevel_commit;
wl_signal_add(&toplevel->xdg_surface->surface->events.commit, &toplevel->commit);
wl_list_insert(&toplevel->server->views, &toplevel->link);
} }

2
xdg.h
View File

@ -2,5 +2,5 @@
#define DIYAC_XDG_H #define DIYAC_XDG_H
#include "diyac.h" #include "diyac.h"
void diyac_new_xdg_surface(struct wl_listener *listener, void *data); void diyac_new_xdg_toplevel(struct wl_listener *listener, void *data);
#endif #endif