logo

inaban

Distrustful Wayland Compositor (inspired by XMonad and dwm) git clone https://hacktivis.me/git/inaban.git
commit: a59271f637650bc8ebdf9944dda986992bbcf1bf
parent 96007178c0e997d9b993a8de7c08944404d0752f
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Sat, 10 Apr 2021 06:20:29 +0200

wlroots 0.13.0 compatibility

Diffstat:

MREADME2+-
Minaban.c11++++++-----
Mlayers.c347+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mlayers.h5+++--
4 files changed, 206 insertions(+), 159 deletions(-)

diff --git a/README b/README @@ -2,7 +2,7 @@ Inaban: Nickname of “稲葉姫子 (Inaba Himeko)”, a character in Kokoro Connect. Picked her for her personality regarding reality and trust. # Dependencies -- wlroots +- wlroots 0.13.0+ - Wayland: wayland-server, wayland-scanner, wayland-protocols - (lib)xkbcommon diff --git a/inaban.c b/inaban.c @@ -53,7 +53,7 @@ keyboard_handle_key(struct wl_listener *listener, void *data) switch(event->state) { - case WLR_KEY_PRESSED: + case WL_KEYBOARD_KEY_STATE_PRESSED: wlr_log(WLR_DEBUG, "key_pressed: {modifiers: %x, keycode: %x, keysym: %x}", modifiers, @@ -63,7 +63,8 @@ keyboard_handle_key(struct wl_listener *listener, void *data) if(keysym >= XKB_KEY_XF86Switch_VT_1 && keysym <= XKB_KEY_XF86Switch_VT_12) { struct wlr_session *session = wlr_backend_get_session(server->backend); - if (session) { + if(session) + { unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; wlr_session_change_vt(session, vt); } @@ -83,7 +84,7 @@ keyboard_handle_key(struct wl_listener *listener, void *data) handled = true; } break; - case WLR_KEY_RELEASED: + case WL_KEYBOARD_KEY_STATE_RELEASED: if(keysym == ModKey && server->input_mode == INABAN_INPUT_MODKEY) { wlr_log(WLR_DEBUG, "InputMode: Normal"); @@ -489,7 +490,7 @@ output_frame(struct wl_listener *listener, void *data) int width, height; wlr_output_effective_resolution(output->wlr_output, &width, &height); /* Begin the renderer (calls glViewport and some other GL sanity checks) */ - wlr_renderer_begin(renderer, width, height); + wlr_renderer_begin(renderer, (uint32_t)width, (uint32_t)height); wlr_renderer_clear(renderer, background_color); @@ -727,7 +728,7 @@ main(int argc, char *argv[]) return 1; } - server.backend = wlr_backend_autocreate(server.wl_display, NULL); + server.backend = wlr_backend_autocreate(server.wl_display); if(!server.backend) { wlr_log(WLR_ERROR, "Unable to create the wlroots backend"); diff --git a/layers.c b/layers.c @@ -1,142 +1,176 @@ // Copyright 2019 Drew DeVault // Copyright 2019-2020 Inaban Authors <https://hacktivis.me/git/inaban> // SPDX-License-Identifier: BSD-3-Clause +#include "layers.h" + +#include "server.h" + #include <stdlib.h> #include <string.h> #include <wayland-server.h> #include <wlr/types/wlr_layer_shell_v1.h> -#include "layers.h" -#include "server.h" -static void apply_exclusive(struct wlr_box *usable_area, - uint32_t anchor, int32_t exclusive, - int32_t margin_top, int32_t margin_right, - int32_t margin_bottom, int32_t margin_left) { - if (exclusive <= 0) { +static void +apply_exclusive(struct wlr_box *usable_area, + uint32_t anchor, + int32_t exclusive, + int32_t margin_top, + int32_t margin_right, + int32_t margin_bottom, + int32_t margin_left) +{ + if(exclusive <= 0) + { return; } - struct { + struct + { uint32_t anchors; int *positive_axis; int *negative_axis; int margin; } edges[] = { - { - .anchors = - ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | - ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | - ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP, - .positive_axis = &usable_area->y, - .negative_axis = &usable_area->height, - .margin = margin_top, - }, - { - .anchors = - ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | - ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | - ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM, - .positive_axis = NULL, - .negative_axis = &usable_area->height, - .margin = margin_bottom, - }, - { - .anchors = - ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | - ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | - ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM, - .positive_axis = &usable_area->x, - .negative_axis = &usable_area->width, - .margin = margin_left, - }, - { - .anchors = - ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | - ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | - ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM, - .positive_axis = NULL, - .negative_axis = &usable_area->width, - .margin = margin_right, - }, + { + .anchors = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | + ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP, + .positive_axis = &usable_area->y, + .negative_axis = &usable_area->height, + .margin = margin_top, + }, + { + .anchors = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | + ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM, + .positive_axis = NULL, + .negative_axis = &usable_area->height, + .margin = margin_bottom, + }, + { + .anchors = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | + ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM, + .positive_axis = &usable_area->x, + .negative_axis = &usable_area->width, + .margin = margin_left, + }, + { + .anchors = ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | + ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM, + .positive_axis = NULL, + .negative_axis = &usable_area->width, + .margin = margin_right, + }, }; - for (size_t i = 0; i < sizeof(edges) / sizeof(edges[0]); ++i) { - if ((anchor & edges[i].anchors) == edges[i].anchors) { - if (edges[i].positive_axis) { + for(size_t i = 0; i < sizeof(edges) / sizeof(edges[0]); ++i) + { + if((anchor & edges[i].anchors) == edges[i].anchors) + { + if(edges[i].positive_axis) + { *edges[i].positive_axis += exclusive + edges[i].margin; } - if (edges[i].negative_axis) { + if(edges[i].negative_axis) + { *edges[i].negative_axis -= exclusive + edges[i].margin; } } } } -static void arrange_layer(struct wlr_output *output, - struct wl_list *list /* struct *inaban_layer_surface */, - struct wlr_box *usable_area, bool exclusive) { +static void +arrange_layer(struct wlr_output *output, + struct wl_list *list /* struct *inaban_layer_surface */, + struct wlr_box *usable_area, + bool exclusive) +{ struct inaban_layer_surface *inaban_surface; - struct wlr_box full_area = { 0 }; - wlr_output_effective_resolution(output, - &full_area.width, &full_area.height); - wl_list_for_each_reverse(inaban_surface, list, link) { - struct wlr_layer_surface_v1 *layer = inaban_surface->layer_surface; + struct wlr_box full_area = {0}; + wlr_output_effective_resolution(output, &full_area.width, &full_area.height); + wl_list_for_each_reverse(inaban_surface, list, link) + { + struct wlr_layer_surface_v1 *layer = inaban_surface->layer_surface; struct wlr_layer_surface_v1_state *state = &layer->current; - if (exclusive != (state->exclusive_zone > 0)) { + if(exclusive != (state->exclusive_zone > 0)) + { continue; } struct wlr_box bounds; - if (state->exclusive_zone == -1) { + if(state->exclusive_zone == -1) + { bounds = full_area; - } else { + } + else + { bounds = *usable_area; } - struct wlr_box box = { - .width = state->desired_width, - .height = state->desired_height - }; + struct wlr_box box = {.width = state->desired_width, .height = state->desired_height}; // Horizontal axis - const uint32_t both_horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT - | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; - if ((state->anchor & both_horiz) && box.width == 0) { - box.x = bounds.x; + const uint32_t both_horiz = + ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; + if((state->anchor & both_horiz) && box.width == 0) + { + box.x = bounds.x; box.width = bounds.width; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT)) + { box.x = bounds.x; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT)) + { box.x = bounds.x + (bounds.width - box.width); - } else { + } + else + { box.x = bounds.x + ((bounds.width / 2) - (box.width / 2)); } // Vertical axis - const uint32_t both_vert = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP - | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; - if ((state->anchor & both_vert) && box.height == 0) { - box.y = bounds.y; + const uint32_t both_vert = + ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; + if((state->anchor & both_vert) && box.height == 0) + { + box.y = bounds.y; box.height = bounds.height; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)) + { box.y = bounds.y; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM)) + { box.y = bounds.y + (bounds.height - box.height); - } else { + } + else + { box.y = bounds.y + ((bounds.height / 2) - (box.height / 2)); } // Margin - if ((state->anchor & both_horiz) == both_horiz) { + if((state->anchor & both_horiz) == both_horiz) + { box.x += state->margin.left; box.width -= state->margin.left + state->margin.right; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT)) + { box.x += state->margin.left; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT)) + { box.x -= state->margin.right; } - if ((state->anchor & both_vert) == both_vert) { + if((state->anchor & both_vert) == both_vert) + { box.y += state->margin.top; box.height -= state->margin.top + state->margin.bottom; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)) + { box.y += state->margin.top; - } else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM)) { + } + else if((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM)) + { box.y -= state->margin.bottom; } - if (box.width < 0 || box.height < 0) { + if(box.width < 0 || box.height < 0) + { // TODO: Bubble up a protocol error? wlr_layer_surface_v1_close(layer); continue; @@ -144,62 +178,66 @@ static void arrange_layer(struct wlr_output *output, // Apply inaban_surface->geo = box; - apply_exclusive(usable_area, state->anchor, state->exclusive_zone, - state->margin.top, state->margin.right, - state->margin.bottom, state->margin.left); + apply_exclusive(usable_area, + state->anchor, + state->exclusive_zone, + state->margin.top, + state->margin.right, + state->margin.bottom, + state->margin.left); wlr_layer_surface_v1_configure(layer, box.width, box.height); } } -void arrange_layers(struct inaban_output *output) { - struct wlr_box usable_area = { 0 }; - wlr_output_effective_resolution(output->wlr_output, - &usable_area.width, &usable_area.height); +void +arrange_layers(struct inaban_output *output) +{ + struct wlr_box usable_area = {0}; + wlr_output_effective_resolution(output->wlr_output, &usable_area.width, &usable_area.height); // Arrange exclusive surfaces from top->bottom + arrange_layer( + output->wlr_output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &usable_area, true); + arrange_layer( + output->wlr_output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &usable_area, true); + arrange_layer( + output->wlr_output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], &usable_area, true); arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], - &usable_area, true); - arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], - &usable_area, true); - arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], - &usable_area, true); - arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], - &usable_area, true); + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], + &usable_area, + true); // Arrange non-exlusive surfaces from top->bottom + arrange_layer( + output->wlr_output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &usable_area, false); + arrange_layer( + output->wlr_output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &usable_area, false); + arrange_layer( + output->wlr_output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], &usable_area, false); arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], - &usable_area, false); - arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], - &usable_area, false); - arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], - &usable_area, false); - arrange_layer(output->wlr_output, - &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], - &usable_area, false); + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], + &usable_area, + false); // Find topmost keyboard interactive layer, if such a layer exists uint32_t layers_above_shell[] = { - ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY, - ZWLR_LAYER_SHELL_V1_LAYER_TOP, + ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY, + ZWLR_LAYER_SHELL_V1_LAYER_TOP, }; size_t nlayers = sizeof(layers_above_shell) / sizeof(layers_above_shell[0]); struct inaban_layer_surface *layer, *topmost = NULL; - for (size_t i = 0; i < nlayers; ++i) { - wl_list_for_each_reverse(layer, - &output->layers[layers_above_shell[i]], link) { - if (layer->layer_surface->current.keyboard_interactive) { + for(size_t i = 0; i < nlayers; ++i) + { + wl_list_for_each_reverse(layer, &output->layers[layers_above_shell[i]], link) + { + if(layer->layer_surface->current.keyboard_interactive) + { topmost = layer; break; } } - if (topmost != NULL) { + if(topmost != NULL) + { break; } } @@ -207,70 +245,77 @@ void arrange_layers(struct inaban_output *output) { // TODO: Focus topmost layer } -static void handle_output_destroy(struct wl_listener *listener, void *data) { - struct inaban_layer_surface *layer = - wl_container_of(listener, layer, output_destroy); - layer->layer_surface->output = NULL; +static void +handle_output_destroy(struct wl_listener *listener, void *data) +{ + struct inaban_layer_surface *layer = wl_container_of(listener, layer, output_destroy); + layer->layer_surface->output = NULL; wl_list_remove(&layer->output_destroy.link); wlr_layer_surface_v1_close(layer->layer_surface); } -static void handle_surface_commit(struct wl_listener *listener, void *data) { - struct inaban_layer_surface *layer = - wl_container_of(listener, layer, surface_commit); +static void +handle_surface_commit(struct wl_listener *listener, void *data) +{ + struct inaban_layer_surface *layer = wl_container_of(listener, layer, surface_commit); struct wlr_layer_surface_v1 *layer_surface = layer->layer_surface; - struct wlr_output *wlr_output = layer_surface->output; - if (wlr_output != NULL) { + struct wlr_output *wlr_output = layer_surface->output; + if(wlr_output != NULL) + { struct inaban_output *output = wlr_output->data; arrange_layers(output); } } -static void handle_destroy(struct wl_listener *listener, void *data) { - struct inaban_layer_surface *layer = wl_container_of( - listener, layer, destroy); +static void +handle_destroy(struct wl_listener *listener, void *data) +{ + struct inaban_layer_surface *layer = wl_container_of(listener, layer, destroy); wl_list_remove(&layer->link); wl_list_remove(&layer->destroy.link); wl_list_remove(&layer->map.link); wl_list_remove(&layer->surface_commit.link); - if (layer->layer_surface->output) { + if(layer->layer_surface->output) + { wl_list_remove(&layer->output_destroy.link); arrange_layers((struct inaban_output *)layer->layer_surface->output->data); } free(layer); } -static void handle_map(struct wl_listener *listener, void *data) { +static void +handle_map(struct wl_listener *listener, void *data) +{ struct wlr_layer_surface_v1 *layer_surface = data; wlr_surface_send_enter(layer_surface->surface, layer_surface->output); } -void server_new_layer_surface(struct wl_listener *listener, void *data) { - struct inaban_server *server = wl_container_of( - listener, server, new_layer_surface); +void +server_new_layer_surface(struct wl_listener *listener, void *data) +{ + struct inaban_server *server = wl_container_of(listener, server, new_layer_surface); struct wlr_layer_surface_v1 *layer_surface = data; - if (!layer_surface->output) { - struct wlr_output *output = wlr_output_layout_output_at( - server->output_layout, server->cursor->x, server->cursor->y); + if(!layer_surface->output) + { + struct wlr_output *output = + wlr_output_layout_output_at(server->output_layout, server->cursor->x, server->cursor->y); layer_surface->output = output; } - struct inaban_output *output = layer_surface->output->data; - struct inaban_layer_surface *inaban_surface = - calloc(1, sizeof(struct inaban_layer_surface)); - if (!inaban_surface) { + struct inaban_output *output = layer_surface->output->data; + struct inaban_layer_surface *inaban_surface = calloc(1, sizeof(struct inaban_layer_surface)); + if(!inaban_surface) + { return; } inaban_surface->layer_surface = layer_surface; - layer_surface->data = inaban_surface; - inaban_surface->server = server; + layer_surface->data = inaban_surface; + inaban_surface->server = server; inaban_surface->surface_commit.notify = handle_surface_commit; - wl_signal_add(&layer_surface->surface->events.commit, - &inaban_surface->surface_commit); + wl_signal_add(&layer_surface->surface->events.commit, &inaban_surface->surface_commit); inaban_surface->output_destroy.notify = handle_output_destroy; - wl_signal_add(&layer_surface->output->events.destroy, - &inaban_surface->output_destroy); + wl_signal_add(&layer_surface->output->events.destroy, &inaban_surface->output_destroy); inaban_surface->destroy.notify = handle_destroy; wl_signal_add(&layer_surface->events.destroy, &inaban_surface->destroy); inaban_surface->map.notify = handle_map; @@ -282,7 +327,7 @@ void server_new_layer_surface(struct wl_listener *listener, void *data) { // Temporarily set the layer's current state to client_pending // So that we can easily arrange it struct wlr_layer_surface_v1_state old_state = layer_surface->current; - layer_surface->current = layer_surface->client_pending; + layer_surface->current = layer_surface->client_pending; arrange_layers(output); layer_surface->current = old_state; } diff --git a/layers.h b/layers.h @@ -3,12 +3,13 @@ // SPDX-License-Identifier: BSD-3-Clause #ifndef _INABAN_LAYERS_H #define _INABAN_LAYERS_H -#include <wlr/types/wlr_layer_shell_v1.h> #include <wayland-server.h> +#include <wlr/types/wlr_layer_shell_v1.h> struct inaban_server; -struct inaban_layer_surface { +struct inaban_layer_surface +{ struct wlr_layer_surface_v1 *layer_surface; struct inaban_server *server; struct wl_list link;