layer shell

This commit is contained in:
2026-05-19 12:17:13 +07:00
parent 393cc02b4f
commit d98771900c
8 changed files with 113 additions and 103 deletions
+1 -2
View File
@@ -5,7 +5,6 @@ UseTab: Never
ColumnLimit: 200
AllowShortFunctionsOnASingleLine: false
SortIncludes: true
InsertBraces: true
BreakBeforeBraces: Custom
BraceWrapping:
AfterFunction: true
@@ -15,4 +14,4 @@ BraceWrapping:
AfterEnum: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
AfterExternBlock: false
+44 -44
View File
@@ -4,11 +4,7 @@
#include "keybinds.h"
#include "types.h"
#define CURSOR_MOD WLR_MODIFIER_ALT
#define CURSOR_MOVE_BUTTON BTN_LEFT
#define CURSOR_RESIZE_BUTTON BTN_RIGHT
#define TOPLEVEL_BW 2
#define TOPLEVEL_BW 1
static const float bgcolor[4] = {0.0, 0.0, 0.0, 1.0};
@@ -19,8 +15,8 @@ static const float unfocused_bc[4] = {0.28, 0.28, 0.28, 1.0};
#define STACK_COUNT 1
#define STACK_SIZE 0.5
#define OUTPUT_GAP 10
#define LAYOUT_GAP 5
#define OUTPUT_GAP 0
#define LAYOUT_GAP 0
#define ALT WLR_MODIFIER_ALT
#define CTRL WLR_MODIFIER_CTRL
@@ -31,53 +27,57 @@ static const char *workspaces[] = {
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
};
#define CURSOR_MOD ALT
#define CURSOR_MOVE_BUTTON BTN_LEFT
#define CURSOR_RESIZE_BUTTON BTN_RIGHT
static const absn_keybind keybinds[] = {
{LOGO, XKB_KEY_Escape, quit, {0}},
{ALT, XKB_KEY_Escape, quit, {0}},
{LOGO, XKB_KEY_Return, &run, {.v = "alacritty"}},
{LOGO, XKB_KEY_d, &run, {.v = "wofi --show drun"}},
{LOGO, XKB_KEY_q, kill_focus, {0}},
{ALT, XKB_KEY_Return, &run, {.v = "alacritty"}},
{ALT, XKB_KEY_d, &run, {.v = "wofi --show drun"}},
{ALT, XKB_KEY_q, kill_focus, {0}},
{LOGO, XKB_KEY_j, cycle_focus, {.i = +1}},
{LOGO, XKB_KEY_k, cycle_focus, {.i = -1}},
{ALT, XKB_KEY_j, cycle_focus, {.i = +1}},
{ALT, XKB_KEY_k, cycle_focus, {.i = -1}},
{LOGO | SHIFT, XKB_KEY_j, swap_focus, {.i = +1}},
{LOGO | SHIFT, XKB_KEY_k, swap_focus, {.i = -1}},
{ALT | SHIFT, XKB_KEY_j, swap_focus, {.i = +1}},
{ALT | SHIFT, XKB_KEY_k, swap_focus, {.i = -1}},
{LOGO, XKB_KEY_f, toggle_fullscreen, {0}},
{LOGO, XKB_KEY_v, toggle_floating, {0}},
{ALT, XKB_KEY_f, toggle_fullscreen, {0}},
{ALT, XKB_KEY_v, toggle_floating, {0}},
{LOGO, XKB_KEY_h, increase_master_count, {.i = +1}},
{LOGO, XKB_KEY_l, increase_master_count, {.i = -1}},
{ALT, XKB_KEY_h, increase_master_count, {.i = +1}},
{ALT, XKB_KEY_l, increase_master_count, {.i = -1}},
{LOGO | SHIFT, XKB_KEY_h, increase_master_width, {.f = -0.05}},
{LOGO | SHIFT, XKB_KEY_l, increase_master_width, {.f = +0.05}},
{ALT | SHIFT, XKB_KEY_h, increase_master_width, {.f = -0.05}},
{ALT | SHIFT, XKB_KEY_l, increase_master_width, {.f = +0.05}},
{LOGO, XKB_KEY_t, set_layout, {.i = LAYOUT_TILE}},
{LOGO, XKB_KEY_r, set_layout, {.i = LAYOUT_TILELEFT}},
{LOGO, XKB_KEY_m, set_layout, {.i = LAYOUT_MONOCLE}},
{ALT, XKB_KEY_t, set_layout, {.i = LAYOUT_TILE}},
{ALT, XKB_KEY_r, set_layout, {.i = LAYOUT_TILELEFT}},
{ALT, XKB_KEY_m, set_layout, {.i = LAYOUT_MONOCLE}},
{LOGO, XKB_KEY_1, switch_workspace, {.v = "1"}},
{LOGO, XKB_KEY_2, switch_workspace, {.v = "2"}},
{LOGO, XKB_KEY_3, switch_workspace, {.v = "3"}},
{LOGO, XKB_KEY_4, switch_workspace, {.v = "4"}},
{LOGO, XKB_KEY_5, switch_workspace, {.v = "5"}},
{LOGO, XKB_KEY_6, switch_workspace, {.v = "6"}},
{LOGO, XKB_KEY_7, switch_workspace, {.v = "7"}},
{LOGO, XKB_KEY_8, switch_workspace, {.v = "8"}},
{LOGO, XKB_KEY_9, switch_workspace, {.v = "9"}},
{LOGO, XKB_KEY_0, switch_workspace, {.v = "10"}},
{ALT, XKB_KEY_1, switch_workspace, {.v = "1"}},
{ALT, XKB_KEY_2, switch_workspace, {.v = "2"}},
{ALT, XKB_KEY_3, switch_workspace, {.v = "3"}},
{ALT, XKB_KEY_4, switch_workspace, {.v = "4"}},
{ALT, XKB_KEY_5, switch_workspace, {.v = "5"}},
{ALT, XKB_KEY_6, switch_workspace, {.v = "6"}},
{ALT, XKB_KEY_7, switch_workspace, {.v = "7"}},
{ALT, XKB_KEY_8, switch_workspace, {.v = "8"}},
{ALT, XKB_KEY_9, switch_workspace, {.v = "9"}},
{ALT, XKB_KEY_0, switch_workspace, {.v = "10"}},
{LOGO | SHIFT, XKB_KEY_exclam, move_focus_to_workspace, {.v = "1"}},
{LOGO | SHIFT, XKB_KEY_at, move_focus_to_workspace, {.v = "2"}},
{LOGO | SHIFT, XKB_KEY_numbersign, move_focus_to_workspace, {.v = "3"}},
{LOGO | SHIFT, XKB_KEY_dollar, move_focus_to_workspace, {.v = "4"}},
{LOGO | SHIFT, XKB_KEY_percent, move_focus_to_workspace, {.v = "5"}},
{LOGO | SHIFT, XKB_KEY_asciicircum, move_focus_to_workspace, {.v = "6"}},
{LOGO | SHIFT, XKB_KEY_ampersand, move_focus_to_workspace, {.v = "7"}},
{LOGO | SHIFT, XKB_KEY_asterisk, move_focus_to_workspace, {.v = "8"}},
{LOGO | SHIFT, XKB_KEY_parenleft, move_focus_to_workspace, {.v = "9"}},
{LOGO | SHIFT, XKB_KEY_parenright, move_focus_to_workspace, {.v = "10"}},
{ALT | SHIFT, XKB_KEY_exclam, move_focus_to_workspace, {.v = "1"}},
{ALT | SHIFT, XKB_KEY_at, move_focus_to_workspace, {.v = "2"}},
{ALT | SHIFT, XKB_KEY_numbersign, move_focus_to_workspace, {.v = "3"}},
{ALT | SHIFT, XKB_KEY_dollar, move_focus_to_workspace, {.v = "4"}},
{ALT | SHIFT, XKB_KEY_percent, move_focus_to_workspace, {.v = "5"}},
{ALT | SHIFT, XKB_KEY_asciicircum, move_focus_to_workspace, {.v = "6"}},
{ALT | SHIFT, XKB_KEY_ampersand, move_focus_to_workspace, {.v = "7"}},
{ALT | SHIFT, XKB_KEY_asterisk, move_focus_to_workspace, {.v = "8"}},
{ALT | SHIFT, XKB_KEY_parenleft, move_focus_to_workspace, {.v = "9"}},
{ALT | SHIFT, XKB_KEY_parenright, move_focus_to_workspace, {.v = "10"}},
};
#endif
+2
View File
@@ -1,4 +1,6 @@
#include "types.h"
void client_from_coords(absn_server *server, double x, double y, struct wlr_surface **rsurface, absn_toplevel **rtoplevel, absn_layer_surface **rlayer_surface, double *rx, double *ry);
void reset_cursor_mode(absn_server *server);
void process_cursor_motion(absn_server *server, uint32_t time);
-2
View File
@@ -3,8 +3,6 @@
#include "types.h"
absn_toplevel *toplevel_at(absn_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy);
bool toplevel_is_unmanaged(absn_toplevel *toplevel);
void toplevel_get_geom(absn_toplevel *toplevel);
+3 -1
View File
@@ -183,6 +183,7 @@ struct absn_output {
};
typedef struct {
int type;
struct wl_list link;
absn_server *server;
@@ -201,6 +202,8 @@ typedef struct {
} absn_layer_surface;
struct absn_toplevel {
int type;
struct wl_list link;
struct wl_list flink; /* link for focus stack */
uint32_t tag;
@@ -223,7 +226,6 @@ struct absn_toplevel {
struct wlr_box geom;
struct wlr_box prev_geom;
int type;
union {
struct wlr_xdg_toplevel *xdg;
struct wlr_xwayland_surface *xw;
+46 -5
View File
@@ -1,10 +1,51 @@
#include <wayland-server-core.h>
#include <wlr/util/log.h>
#include "cursor.h"
#include "layout.h"
#include "toplevel.h"
#include "types.h"
/*
* returns surface at given cursor coordinates
* and coordinates inside of it to process input event
*/
void client_from_coords(absn_server *server, double x, double y, struct wlr_surface **rsurface, absn_toplevel **rtoplevel, absn_layer_surface **rlayer_surface, double *rx, double *ry)
{
struct wlr_scene_node *pnode = NULL, *node = NULL;
struct wlr_scene_buffer *buffer = NULL;
struct wlr_surface *surface = NULL;
absn_layer_surface *layer_surface = NULL;
absn_toplevel *toplevel = NULL;
for (int i = LAYERS_COUNT - 1; i > 0; --i) {
node = wlr_scene_node_at(&server->layers[i]->node, x, y, rx, ry);
if (!node) {
continue;
}
if (node->type == WLR_SCENE_NODE_BUFFER) {
buffer = wlr_scene_buffer_from_node(node);
surface = wlr_scene_surface_try_from_buffer(buffer)->surface;
}
for (pnode = node; pnode && !toplevel; pnode = &pnode->parent->node)
toplevel = pnode->data;
if (toplevel && toplevel->type == LAYER_SURFACE) {
toplevel = NULL;
layer_surface = pnode->data;
}
}
if (rsurface)
*rsurface = surface;
if (rtoplevel)
*rtoplevel = toplevel;
if (rlayer_surface)
*rlayer_surface = layer_surface;
}
void reset_cursor_mode(absn_server *server)
{
server->cursor_mode = CURSOR_PASSTHROUGH;
@@ -140,9 +181,9 @@ static void process_cursor_resize(absn_server *server)
void process_cursor_motion(absn_server *server, uint32_t time)
{
double sx, sy;
double x, y;
struct wlr_surface *surface = NULL;
toplevel_at(server, server->cursor->x, server->cursor->y, &surface, &sx, &sy);
client_from_coords(server, server->cursor->x, server->cursor->y, &surface, NULL, NULL, &x, &y);
struct wlr_seat *seat = server->seat;
if (server->cursor_mode == CURSOR_MOVE) {
@@ -154,8 +195,8 @@ void process_cursor_motion(absn_server *server, uint32_t time)
}
if (surface) {
wlr_seat_pointer_notify_enter(seat, surface, sx, sy);
wlr_seat_pointer_notify_motion(seat, time, sx, sy);
wlr_seat_pointer_notify_enter(seat, surface, x, y);
wlr_seat_pointer_notify_motion(seat, time, x, y);
} else {
wlr_seat_pointer_clear_focus(seat);
}
+17 -10
View File
@@ -1,8 +1,8 @@
#include <assert.h>
#include <stdlib.h>
#include <wlr/types/wlr_layer_shell_v1.h>
#include <wlr/types/wlr_xcursor_manager.h>
#include <wlr/util/log.h>
#include "config.h"
#include "cursor.h"
@@ -143,6 +143,7 @@ void new_layer_surface(struct wl_listener *listener, void *data)
}
absn_layer_surface *layer_surface = calloc(1, sizeof(*layer_surface));
layer_surface->type = LAYER_SURFACE;
layer_surface->server = server;
layer_surface->wlr = surface;
layer_surface->output = surface->output->data;
@@ -227,9 +228,15 @@ void cursor_button(struct wl_listener *listener, void *data)
if (event->state == WL_POINTER_BUTTON_STATE_RELEASED) {
reset_cursor_mode(server);
} else {
double sx, sy;
double x, y;
struct wlr_surface *surface = NULL;
absn_toplevel *toplevel = toplevel_at(server, server->cursor->x, server->cursor->y, &surface, &sx, &sy);
absn_toplevel *toplevel;
absn_layer_surface *layer_surface;
client_from_coords(server, server->cursor->x, server->cursor->y, &surface, &toplevel, &layer_surface, &x, &y);
if (server->exclusive_focus) {
goto handle;
}
if (!toplevel) {
goto handle;
@@ -252,10 +259,10 @@ void cursor_button(struct wl_listener *listener, void *data)
server->grab_x = server->cursor->x;
server->grab_y = server->cursor->y;
int32_t lx, ly;
wlr_scene_node_coords(&toplevel->scene_tree->node, &lx, &ly);
server->grab_geom.x = lx;
server->grab_geom.y = ly;
int32_t nx, ny;
wlr_scene_node_coords(&toplevel->scene_tree->node, &nx, &ny);
server->grab_geom.x = nx;
server->grab_geom.y = ny;
server->grab_geom.width = toplevel->geom.width;
server->grab_geom.height = toplevel->geom.height;
@@ -266,13 +273,13 @@ void cursor_button(struct wl_listener *listener, void *data)
int32_t width = toplevel->xdg->base->geometry.width;
int32_t height = toplevel->xdg->base->geometry.height;
if (server->grab_x > (lx + width / 2) && server->grab_y > (ly + height / 2)) {
if (server->grab_x > (x + width / 2) && server->grab_y > (y + height / 2)) {
server->resize_corner = BOTTOM_RIGHT;
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "se-resize");
} else if (server->grab_x < (lx + width / 2) && server->grab_y > (ly + height / 2)) {
} else if (server->grab_x < (x + width / 2) && server->grab_y > (y + height / 2)) {
server->resize_corner = BOTTOM_LEFT;
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "sw-resize");
} else if (server->grab_x > (lx + width / 2) && server->grab_y < (ly + height / 2)) {
} else if (server->grab_x > (x + width / 2) && server->grab_y < (y + height / 2)) {
server->resize_corner = TOP_RIGHT;
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "ne-resize");
} else {
-39
View File
@@ -1,5 +1,4 @@
#include <wayland-server-core.h>
#include <wlr/util/log.h>
#include "config.h"
#include "layout.h"
@@ -7,44 +6,6 @@
#include "types.h"
#include "xdg-shell-protocol.h"
/*
* returns toplevel at given cursor coordinates,
* its surface and coordinates inside of it
* to process input event
*/
absn_toplevel *toplevel_at(absn_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy)
{
struct wlr_scene_node *node = wlr_scene_node_at(&server->scene->tree.node, lx, ly, sx, sy);
if (!node) {
return NULL;
}
struct wlr_scene_buffer *scene_buffer = NULL;
struct wlr_scene_surface *scene_surface = NULL;
switch (node->type) {
case WLR_SCENE_NODE_BUFFER:
scene_buffer = wlr_scene_buffer_from_node(node);
scene_surface = wlr_scene_surface_try_from_buffer(scene_buffer);
if (!scene_surface) {
return NULL;
}
*surface = scene_surface->surface;
struct wlr_scene_tree *tree = node->parent;
while (tree && !tree->node.data) {
tree = tree->node.parent;
}
return tree->node.data;
break;
case WLR_SCENE_NODE_RECT:
return node->data;
break;
default:
return NULL;
}
}
/*
* if toplevel is unmanaged we should not
* move or resize it and just draw it