react to wlroots changes

This commit is contained in:
Keith Bowes 2024-02-07 00:46:35 -05:00
parent fb3c8eb152
commit f967bfae17
8 changed files with 90 additions and 20 deletions

View file

@ -54,6 +54,7 @@ struct wb_server {
struct wlr_renderer *renderer;
struct wlr_scene *scene;
struct wlr_scene_output_layout *scene_layout;
struct wlr_session *session;
struct wlr_subcompositor *subcompositor;
struct wlr_output_manager_v1 *wlr_output_manager;

View file

@ -1,10 +1,17 @@
#ifndef _WB_XDG_SHELL_H
#define _WB_XDG_SHELL_H
#include <wlr/types/wlr_fractional_scale_v1.h>
#include "waybox/server.h"
struct wb_popup {
struct wlr_xdg_popup *xdg_popup;
struct wl_listener commit;
struct wl_listener destroy;
};
struct wb_toplevel {
struct wl_list link;
struct wb_server *server;
struct wlr_xdg_toplevel *xdg_toplevel;
struct wlr_scene_tree *scene_tree;
@ -13,6 +20,7 @@ struct wb_toplevel {
struct wl_listener map;
struct wl_listener unmap;
struct wl_listener commit;
struct wl_listener destroy;
struct wl_listener new_popup;
struct wl_listener request_fullscreen;
@ -23,6 +31,8 @@ struct wb_toplevel {
struct wlr_box geometry;
struct wlr_box previous_geometry;
struct wl_list link;
};
void init_xdg_shell(struct wb_server *server);

View file

@ -15,6 +15,7 @@ add_project_arguments(
'-Wno-unused-parameter',
'-D_DEFAULT_SOURCE',
'-D_POSIX_C_SOURCE=200112L',
'-DWL_HIDE_DEPRECATED', # Hide the deprecated parts of the Wayland API
'-DWLR_USE_UNSTABLE',
'-DPACKAGE_NAME="' + meson.project_name() + '"',
'-DPACKAGE_VERSION="' + meson.project_version() + '"',

View file

@ -111,6 +111,7 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) {
if (!surface->output || current_toplevel->xdg_toplevel->current.fullscreen) {
return;
}
wlr_fractional_scale_v1_notify_scale(surface->scene->layer_surface->surface, surface->output->wlr_output->scale);
struct wlr_layer_surface_v1 *layer_surface = surface->scene->layer_surface;
uint32_t committed = layer_surface->current.committed;
@ -183,6 +184,8 @@ static void wb_layer_surface_destroy(struct wb_layer_surface *surface) {
return;
}
wlr_fractional_scale_v1_notify_scale(surface->scene->layer_surface->surface, surface->output->wlr_output->scale);
wl_list_remove(&surface->map.link);
wl_list_remove(&surface->unmap.link);
wl_list_remove(&surface->surface_commit.link);

View file

@ -21,7 +21,6 @@ void output_frame_notify(struct wl_listener *listener, void *data) {
struct wlr_gamma_control_v1 *gamma_control =
wlr_gamma_control_manager_v1_get_control(output->server->gamma_control_manager,
output->wlr_output);
#if WLR_CHECK_VERSION(0, 18, 0)
struct wlr_output_state pending;
if (!wlr_scene_output_build_state(scene_output, &pending, NULL))
return;
@ -38,16 +37,6 @@ void output_frame_notify(struct wl_listener *listener, void *data) {
}
wlr_output_state_finish(&pending);
#else
if (!wlr_gamma_control_v1_apply(gamma_control, &output->wlr_output->pending)) {
return;
}
if (!wlr_output_test(output->wlr_output)) {
wlr_output_rollback(output->wlr_output);
wlr_gamma_control_v1_send_failed_and_destroy(gamma_control);
}
#endif
}
/* Render the scene if needed and commit the output */

View file

@ -58,18 +58,17 @@ static bool handle_keybinding(struct wb_server *server, xkb_keysym_t sym, uint32
* Returns true if the keybinding is handled, false to send it to the
* client.
*/
struct wlr_session *session = wlr_backend_get_session (server->backend);
/* TODO: Make these configurable through rc.xml */
if (modifiers & (WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT) &&
sym >= XKB_KEY_XF86Switch_VT_1 &&
sym <= XKB_KEY_XF86Switch_VT_12) {
unsigned int vt = sym - XKB_KEY_XF86Switch_VT_1 + 1;
wlr_session_change_vt (session, vt);
wlr_session_change_vt (server->session, vt);
return true;
}
if (!server->config) {
/* Some default key bindings, when the rc.xml file can't be
* parsed. */

View file

@ -1,3 +1,5 @@
#include <wlr/types/wlr_fractional_scale_v1.h>
#include "idle.h"
#include "waybox/server.h"
#include "waybox/xdg_shell.h"
@ -22,9 +24,9 @@ bool wb_create_backend(struct wb_server* server) {
* backend based on the current environment, such as opening an X11 window
* if an X11 server is running. */
#if WLR_CHECK_VERSION(0, 18, 0)
server->backend = wlr_backend_autocreate(server->wl_event_loop, NULL);
server->backend = wlr_backend_autocreate(server->wl_event_loop, &server->session);
#else
server->backend = wlr_backend_autocreate(server->wl_display, NULL);
server->backend = wlr_backend_autocreate(server->wl_display, &server->session);
#endif
if (server->backend == NULL) {
wlr_log(WLR_ERROR, "%s", _("Failed to create backend"));
@ -120,6 +122,8 @@ bool wb_start_server(struct wb_server* server) {
*/
init_xdg_shell(server);
wlr_fractional_scale_manager_v1_create(server->wl_display, 1);
return true;
}

View file

@ -145,12 +145,43 @@ static void xdg_toplevel_unmap(struct wl_listener *listener, void *data) {
}
}
static void update_fractional_scale(struct wlr_surface *surface) {
float scale = 1;
struct wlr_surface_output *surface_output;
wl_list_for_each(surface_output, &surface->current_outputs, link) {
if (surface_output->output->scale > scale) {
scale = surface_output->output->scale;
}
}
wlr_fractional_scale_v1_notify_scale(surface, scale);
wlr_surface_set_preferred_buffer_scale(surface, (int) scale);
}
static void xdg_toplevel_commit(struct wl_listener *listener, void *data) {
struct wb_toplevel *toplevel = wl_container_of(listener, toplevel, commit);
struct wlr_xdg_surface *base = toplevel->xdg_toplevel->base;
struct wlr_output *output = get_active_output(toplevel);
wlr_surface_send_enter(base->surface, output);
update_fractional_scale(base->surface);
if (base->initial_commit) {
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
}
}
static void xdg_toplevel_destroy(struct wl_listener *listener, void *data) {
/* Called when the xdg_toplevel is destroyed and should never be shown again. */
struct wb_toplevel *toplevel = wl_container_of(listener, toplevel, destroy);
struct wlr_output *output = get_active_output(toplevel);
struct wlr_xdg_surface *base = toplevel->xdg_toplevel->base;
wlr_surface_send_leave(base->surface, output);
update_fractional_scale(base->surface);
wl_list_remove(&toplevel->map.link);
wl_list_remove(&toplevel->unmap.link);
wl_list_remove(&toplevel->commit.link);
wl_list_remove(&toplevel->destroy.link);
wl_list_remove(&toplevel->new_popup.link);
@ -297,6 +328,25 @@ static void xdg_toplevel_request_resize(
begin_interactive(toplevel, WB_CURSOR_RESIZE, event->edges);
}
static void xdg_popup_commit(struct wl_listener *listener, void *data) {
struct wb_popup *popup = wl_container_of(listener, popup, commit);
struct wlr_xdg_surface *base = popup->xdg_popup->base;
if (base->initial_commit) {
update_fractional_scale(base->surface);
wlr_xdg_surface_schedule_configure(base);
}
}
static void xdg_popup_destroy(struct wl_listener *listener, void *data) {
struct wb_popup *popup = wl_container_of(listener, popup, destroy);
update_fractional_scale(popup->xdg_popup->base->surface);
wl_list_remove(&popup->commit.link);
wl_list_remove(&popup->destroy.link);
free(popup);
}
static void handle_new_popup(struct wl_listener *listener, void *data) {
struct wlr_xdg_popup *popup = data;
struct wb_toplevel *toplevel = wl_container_of(listener, toplevel, new_popup);
@ -336,6 +386,17 @@ static void handle_new_xdg_popup(struct wl_listener *listener, void *data) {
xdg_popup->base->data = wlr_scene_xdg_surface_create(
parent_tree, xdg_popup->base);
}
struct wb_popup *popup = calloc(1, sizeof(struct wb_popup));
popup->commit.notify = xdg_popup_commit;
wl_signal_add(&xdg_popup->base->surface->events.commit, &popup->commit);
popup->destroy.notify = xdg_popup_destroy;
#if WLR_CHECK_VERSION (0, 18, 0)
wl_signal_add(&xdg_popup->events.destroy, &popup->destroy);
#else
wl_signal_add(&xdg_popup->base->events.destroy, &popup->destroy);
#endif
}
static void handle_new_xdg_toplevel(struct wl_listener *listener, void *data) {
@ -358,6 +419,8 @@ static void handle_new_xdg_toplevel(struct wl_listener *listener, void *data) {
wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map);
toplevel->unmap.notify = xdg_toplevel_unmap;
wl_signal_add(&xdg_toplevel->base->surface->events.unmap, &toplevel->unmap);
toplevel->commit.notify = xdg_toplevel_commit;
wl_signal_add(&xdg_toplevel->base->surface->events.commit, &toplevel->commit);
toplevel->destroy.notify = xdg_toplevel_destroy;
#if WLR_CHECK_VERSION (0, 18, 0)
wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy);