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_renderer *renderer;
struct wlr_scene *scene; struct wlr_scene *scene;
struct wlr_scene_output_layout *scene_layout; struct wlr_scene_output_layout *scene_layout;
struct wlr_session *session;
struct wlr_subcompositor *subcompositor; struct wlr_subcompositor *subcompositor;
struct wlr_output_manager_v1 *wlr_output_manager; struct wlr_output_manager_v1 *wlr_output_manager;

View file

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

View file

@ -15,6 +15,7 @@ add_project_arguments(
'-Wno-unused-parameter', '-Wno-unused-parameter',
'-D_DEFAULT_SOURCE', '-D_DEFAULT_SOURCE',
'-D_POSIX_C_SOURCE=200112L', '-D_POSIX_C_SOURCE=200112L',
'-DWL_HIDE_DEPRECATED', # Hide the deprecated parts of the Wayland API
'-DWLR_USE_UNSTABLE', '-DWLR_USE_UNSTABLE',
'-DPACKAGE_NAME="' + meson.project_name() + '"', '-DPACKAGE_NAME="' + meson.project_name() + '"',
'-DPACKAGE_VERSION="' + meson.project_version() + '"', '-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) { if (!surface->output || current_toplevel->xdg_toplevel->current.fullscreen) {
return; 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; struct wlr_layer_surface_v1 *layer_surface = surface->scene->layer_surface;
uint32_t committed = layer_surface->current.committed; uint32_t committed = layer_surface->current.committed;
@ -183,6 +184,8 @@ static void wb_layer_surface_destroy(struct wb_layer_surface *surface) {
return; 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->map.link);
wl_list_remove(&surface->unmap.link); wl_list_remove(&surface->unmap.link);
wl_list_remove(&surface->surface_commit.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 = struct wlr_gamma_control_v1 *gamma_control =
wlr_gamma_control_manager_v1_get_control(output->server->gamma_control_manager, wlr_gamma_control_manager_v1_get_control(output->server->gamma_control_manager,
output->wlr_output); output->wlr_output);
#if WLR_CHECK_VERSION(0, 18, 0)
struct wlr_output_state pending; struct wlr_output_state pending;
if (!wlr_scene_output_build_state(scene_output, &pending, NULL)) if (!wlr_scene_output_build_state(scene_output, &pending, NULL))
return; return;
@ -38,16 +37,6 @@ void output_frame_notify(struct wl_listener *listener, void *data) {
} }
wlr_output_state_finish(&pending); 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 */ /* 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 * Returns true if the keybinding is handled, false to send it to the
* client. * 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) && if (modifiers & (WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT) &&
sym >= XKB_KEY_XF86Switch_VT_1 && sym >= XKB_KEY_XF86Switch_VT_1 &&
sym <= XKB_KEY_XF86Switch_VT_12) { sym <= XKB_KEY_XF86Switch_VT_12) {
unsigned int vt = sym - XKB_KEY_XF86Switch_VT_1 + 1; 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; return true;
} }
if (!server->config) { if (!server->config) {
/* Some default key bindings, when the rc.xml file can't be /* Some default key bindings, when the rc.xml file can't be
* parsed. */ * parsed. */

View file

@ -1,3 +1,5 @@
#include <wlr/types/wlr_fractional_scale_v1.h>
#include "idle.h" #include "idle.h"
#include "waybox/server.h" #include "waybox/server.h"
#include "waybox/xdg_shell.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 * backend based on the current environment, such as opening an X11 window
* if an X11 server is running. */ * if an X11 server is running. */
#if WLR_CHECK_VERSION(0, 18, 0) #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 #else
server->backend = wlr_backend_autocreate(server->wl_display, NULL); server->backend = wlr_backend_autocreate(server->wl_display, &server->session);
#endif #endif
if (server->backend == NULL) { if (server->backend == NULL) {
wlr_log(WLR_ERROR, "%s", _("Failed to create backend")); 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); init_xdg_shell(server);
wlr_fractional_scale_manager_v1_create(server->wl_display, 1);
return true; 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) { static void xdg_toplevel_destroy(struct wl_listener *listener, void *data) {
/* Called when the xdg_toplevel is destroyed and should never be shown again. */ /* Called when the xdg_toplevel is destroyed and should never be shown again. */
struct wb_toplevel *toplevel = wl_container_of(listener, toplevel, destroy); 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->map.link);
wl_list_remove(&toplevel->unmap.link); wl_list_remove(&toplevel->unmap.link);
wl_list_remove(&toplevel->commit.link);
wl_list_remove(&toplevel->destroy.link); wl_list_remove(&toplevel->destroy.link);
wl_list_remove(&toplevel->new_popup.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); 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) { static void handle_new_popup(struct wl_listener *listener, void *data) {
struct wlr_xdg_popup *popup = data; struct wlr_xdg_popup *popup = data;
struct wb_toplevel *toplevel = wl_container_of(listener, toplevel, new_popup); 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( xdg_popup->base->data = wlr_scene_xdg_surface_create(
parent_tree, xdg_popup->base); 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) { 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); wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map);
toplevel->unmap.notify = xdg_toplevel_unmap; toplevel->unmap.notify = xdg_toplevel_unmap;
wl_signal_add(&xdg_toplevel->base->surface->events.unmap, &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; toplevel->destroy.notify = xdg_toplevel_destroy;
#if WLR_CHECK_VERSION (0, 18, 0) #if WLR_CHECK_VERSION (0, 18, 0)
wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy); wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy);