layer shell
This commit is contained in:
@@ -2,6 +2,7 @@ BasedOnStyle: LLVM
|
|||||||
IndentWidth: 4
|
IndentWidth: 4
|
||||||
TabWidth: 4
|
TabWidth: 4
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
ColumnLimit: 200
|
||||||
AllowShortFunctionsOnASingleLine: false
|
AllowShortFunctionsOnASingleLine: false
|
||||||
SortIncludes: true
|
SortIncludes: true
|
||||||
InsertBraces: true
|
InsertBraces: true
|
||||||
|
|||||||
+37
-36
@@ -32,51 +32,52 @@ static const char *workspaces[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const absn_keybind keybinds[] = {
|
static const absn_keybind keybinds[] = {
|
||||||
{ALT, XKB_KEY_Escape, quit, {0}},
|
{LOGO, XKB_KEY_Escape, quit, {0}},
|
||||||
|
|
||||||
{ALT, XKB_KEY_Return, &run, {.v = "alacritty"}},
|
{LOGO, XKB_KEY_Return, &run, {.v = "alacritty"}},
|
||||||
{ALT, XKB_KEY_q, kill_focus, {0}},
|
{LOGO, XKB_KEY_d, &run, {.v = "wofi --show drun"}},
|
||||||
|
{LOGO, XKB_KEY_q, kill_focus, {0}},
|
||||||
|
|
||||||
{ALT, XKB_KEY_j, cycle_focus, {.i = +1}},
|
{LOGO, XKB_KEY_j, cycle_focus, {.i = +1}},
|
||||||
{ALT, XKB_KEY_k, cycle_focus, {.i = -1}},
|
{LOGO, XKB_KEY_k, cycle_focus, {.i = -1}},
|
||||||
|
|
||||||
{ALT | SHIFT, XKB_KEY_j, swap_focus, {.i = +1}},
|
{LOGO | SHIFT, XKB_KEY_j, swap_focus, {.i = +1}},
|
||||||
{ALT | SHIFT, XKB_KEY_k, swap_focus, {.i = -1}},
|
{LOGO | SHIFT, XKB_KEY_k, swap_focus, {.i = -1}},
|
||||||
|
|
||||||
{ALT, XKB_KEY_f, toggle_fullscreen, {0}},
|
{LOGO, XKB_KEY_f, toggle_fullscreen, {0}},
|
||||||
{ALT, XKB_KEY_v, toggle_floating, {0}},
|
{LOGO, XKB_KEY_v, toggle_floating, {0}},
|
||||||
|
|
||||||
{ALT, XKB_KEY_h, increase_master_count, {.i = +1}},
|
{LOGO, XKB_KEY_h, increase_master_count, {.i = +1}},
|
||||||
{ALT, XKB_KEY_l, increase_master_count, {.i = -1}},
|
{LOGO, XKB_KEY_l, increase_master_count, {.i = -1}},
|
||||||
|
|
||||||
{ALT | SHIFT, XKB_KEY_h, increase_master_width, {.f = -0.05}},
|
{LOGO | SHIFT, XKB_KEY_h, increase_master_width, {.f = -0.05}},
|
||||||
{ALT | SHIFT, XKB_KEY_l, increase_master_width, {.f = +0.05}},
|
{LOGO | SHIFT, XKB_KEY_l, increase_master_width, {.f = +0.05}},
|
||||||
|
|
||||||
{ALT, XKB_KEY_t, set_layout, {.i = LAYOUT_TILE}},
|
{LOGO, XKB_KEY_t, set_layout, {.i = LAYOUT_TILE}},
|
||||||
{ALT, XKB_KEY_r, set_layout, {.i = LAYOUT_TILELEFT}},
|
{LOGO, XKB_KEY_r, set_layout, {.i = LAYOUT_TILELEFT}},
|
||||||
{ALT, XKB_KEY_m, set_layout, {.i = LAYOUT_MONOCLE}},
|
{LOGO, XKB_KEY_m, set_layout, {.i = LAYOUT_MONOCLE}},
|
||||||
|
|
||||||
{ALT, XKB_KEY_1, switch_workspace, {.v = "1"}},
|
{LOGO, XKB_KEY_1, switch_workspace, {.v = "1"}},
|
||||||
{ALT, XKB_KEY_2, switch_workspace, {.v = "2"}},
|
{LOGO, XKB_KEY_2, switch_workspace, {.v = "2"}},
|
||||||
{ALT, XKB_KEY_3, switch_workspace, {.v = "3"}},
|
{LOGO, XKB_KEY_3, switch_workspace, {.v = "3"}},
|
||||||
{ALT, XKB_KEY_4, switch_workspace, {.v = "4"}},
|
{LOGO, XKB_KEY_4, switch_workspace, {.v = "4"}},
|
||||||
{ALT, XKB_KEY_5, switch_workspace, {.v = "5"}},
|
{LOGO, XKB_KEY_5, switch_workspace, {.v = "5"}},
|
||||||
{ALT, XKB_KEY_6, switch_workspace, {.v = "6"}},
|
{LOGO, XKB_KEY_6, switch_workspace, {.v = "6"}},
|
||||||
{ALT, XKB_KEY_7, switch_workspace, {.v = "7"}},
|
{LOGO, XKB_KEY_7, switch_workspace, {.v = "7"}},
|
||||||
{ALT, XKB_KEY_8, switch_workspace, {.v = "8"}},
|
{LOGO, XKB_KEY_8, switch_workspace, {.v = "8"}},
|
||||||
{ALT, XKB_KEY_9, switch_workspace, {.v = "9"}},
|
{LOGO, XKB_KEY_9, switch_workspace, {.v = "9"}},
|
||||||
{ALT, XKB_KEY_0, switch_workspace, {.v = "10"}},
|
{LOGO, XKB_KEY_0, switch_workspace, {.v = "10"}},
|
||||||
|
|
||||||
{ALT | SHIFT, XKB_KEY_exclam, move_focus_to_workspace, {.v = "1"}},
|
{LOGO | SHIFT, XKB_KEY_exclam, move_focus_to_workspace, {.v = "1"}},
|
||||||
{ALT | SHIFT, XKB_KEY_at, move_focus_to_workspace, {.v = "2"}},
|
{LOGO | SHIFT, XKB_KEY_at, move_focus_to_workspace, {.v = "2"}},
|
||||||
{ALT | SHIFT, XKB_KEY_numbersign, move_focus_to_workspace, {.v = "3"}},
|
{LOGO | SHIFT, XKB_KEY_numbersign, move_focus_to_workspace, {.v = "3"}},
|
||||||
{ALT | SHIFT, XKB_KEY_dollar, move_focus_to_workspace, {.v = "4"}},
|
{LOGO | SHIFT, XKB_KEY_dollar, move_focus_to_workspace, {.v = "4"}},
|
||||||
{ALT | SHIFT, XKB_KEY_percent, move_focus_to_workspace, {.v = "5"}},
|
{LOGO | SHIFT, XKB_KEY_percent, move_focus_to_workspace, {.v = "5"}},
|
||||||
{ALT | SHIFT, XKB_KEY_asciicircum, move_focus_to_workspace, {.v = "6"}},
|
{LOGO | SHIFT, XKB_KEY_asciicircum, move_focus_to_workspace, {.v = "6"}},
|
||||||
{ALT | SHIFT, XKB_KEY_ampersand, move_focus_to_workspace, {.v = "7"}},
|
{LOGO | SHIFT, XKB_KEY_ampersand, move_focus_to_workspace, {.v = "7"}},
|
||||||
{ALT | SHIFT, XKB_KEY_asterisk, move_focus_to_workspace, {.v = "8"}},
|
{LOGO | SHIFT, XKB_KEY_asterisk, move_focus_to_workspace, {.v = "8"}},
|
||||||
{ALT | SHIFT, XKB_KEY_parenleft, move_focus_to_workspace, {.v = "9"}},
|
{LOGO | SHIFT, XKB_KEY_parenleft, move_focus_to_workspace, {.v = "9"}},
|
||||||
{ALT | SHIFT, XKB_KEY_parenright, move_focus_to_workspace, {.v = "10"}},
|
{LOGO | SHIFT, XKB_KEY_parenright, move_focus_to_workspace, {.v = "10"}},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+1
-3
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
absn_toplevel *toplevel_at(absn_server *server, double lx, double ly,
|
absn_toplevel *toplevel_at(absn_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy);
|
||||||
struct wlr_surface **surface, double *sx,
|
|
||||||
double *sy);
|
|
||||||
|
|
||||||
bool toplevel_is_unmanaged(absn_toplevel *toplevel);
|
bool toplevel_is_unmanaged(absn_toplevel *toplevel);
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -117,8 +117,8 @@ typedef struct {
|
|||||||
struct wl_listener new_xdg_deco;
|
struct wl_listener new_xdg_deco;
|
||||||
|
|
||||||
struct wlr_layer_shell_v1 *layer_shell;
|
struct wlr_layer_shell_v1 *layer_shell;
|
||||||
struct wl_listener new_layer_surface;
|
|
||||||
struct wlr_scene_tree *layers[LAYERS_COUNT];
|
struct wlr_scene_tree *layers[LAYERS_COUNT];
|
||||||
|
struct wl_listener new_layer_surface;
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
struct wlr_xwayland *xwayland;
|
struct wlr_xwayland *xwayland;
|
||||||
@@ -194,7 +194,6 @@ typedef struct {
|
|||||||
struct wlr_scene_tree *popups;
|
struct wlr_scene_tree *popups;
|
||||||
|
|
||||||
struct wlr_layer_surface_v1 *wlr;
|
struct wlr_layer_surface_v1 *wlr;
|
||||||
struct wl_listener map;
|
|
||||||
struct wl_listener unmap;
|
struct wl_listener unmap;
|
||||||
struct wl_listener commit;
|
struct wl_listener commit;
|
||||||
struct wl_listener new_popup;
|
struct wl_listener new_popup;
|
||||||
|
|||||||
+21
-42
@@ -33,8 +33,7 @@ static int setup(absn_server *server)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->backend = wlr_backend_autocreate(
|
server->backend = wlr_backend_autocreate(wl_display_get_event_loop(server->display), NULL);
|
||||||
wl_display_get_event_loop(server->display), NULL);
|
|
||||||
if (!server->backend) {
|
if (!server->backend) {
|
||||||
wlr_log(WLR_ERROR, "Failed to create wlr_backend");
|
wlr_log(WLR_ERROR, "Failed to create wlr_backend");
|
||||||
return 1;
|
return 1;
|
||||||
@@ -49,25 +48,20 @@ static int setup(absn_server *server)
|
|||||||
wlr_renderer_init_wl_shm(server->renderer, server->display);
|
wlr_renderer_init_wl_shm(server->renderer, server->display);
|
||||||
|
|
||||||
server->scene = wlr_scene_create();
|
server->scene = wlr_scene_create();
|
||||||
if (wlr_renderer_get_texture_formats(server->renderer,
|
if (wlr_renderer_get_texture_formats(server->renderer, WLR_BUFFER_CAP_DMABUF)) {
|
||||||
WLR_BUFFER_CAP_DMABUF)) {
|
|
||||||
wlr_drm_create(server->display, server->renderer);
|
wlr_drm_create(server->display, server->renderer);
|
||||||
wlr_scene_set_linux_dmabuf_v1(
|
wlr_scene_set_linux_dmabuf_v1(server->scene, wlr_linux_dmabuf_v1_create_with_renderer(server->display, 5, server->renderer));
|
||||||
server->scene, wlr_linux_dmabuf_v1_create_with_renderer(
|
|
||||||
server->display, 5, server->renderer));
|
|
||||||
}
|
}
|
||||||
server->bg = wlr_scene_rect_create(&server->scene->tree, 0, 0, bgcolor);
|
server->bg = wlr_scene_rect_create(&server->scene->tree, 0, 0, bgcolor);
|
||||||
|
|
||||||
server->allocator =
|
server->allocator = wlr_allocator_autocreate(server->backend, server->renderer);
|
||||||
wlr_allocator_autocreate(server->backend, server->renderer);
|
|
||||||
if (!server->allocator) {
|
if (!server->allocator) {
|
||||||
wlr_log(WLR_ERROR, "Failed to create wlr_allocator");
|
wlr_log(WLR_ERROR, "Failed to create wlr_allocator");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wlroots managers */
|
/* wlroots managers */
|
||||||
server->compositor =
|
server->compositor = wlr_compositor_create(server->display, 6, server->renderer);
|
||||||
wlr_compositor_create(server->display, 6, server->renderer);
|
|
||||||
wlr_subcompositor_create(server->display);
|
wlr_subcompositor_create(server->display);
|
||||||
wlr_data_device_manager_create(server->display);
|
wlr_data_device_manager_create(server->display);
|
||||||
wlr_screencopy_manager_v1_create(server->display);
|
wlr_screencopy_manager_v1_create(server->display);
|
||||||
@@ -80,13 +74,9 @@ static int setup(absn_server *server)
|
|||||||
wlr_export_dmabuf_manager_v1_create(server->display);
|
wlr_export_dmabuf_manager_v1_create(server->display);
|
||||||
wlr_ext_foreign_toplevel_list_v1_create(server->display, 1);
|
wlr_ext_foreign_toplevel_list_v1_create(server->display, 1);
|
||||||
|
|
||||||
wlr_server_decoration_manager_set_default_mode(
|
wlr_server_decoration_manager_set_default_mode(wlr_server_decoration_manager_create(server->display), WLR_SERVER_DECORATION_MANAGER_MODE_SERVER);
|
||||||
wlr_server_decoration_manager_create(server->display),
|
server->xdg_deco_mgr = wlr_xdg_decoration_manager_v1_create(server->display);
|
||||||
WLR_SERVER_DECORATION_MANAGER_MODE_SERVER);
|
LISTEN(server->new_xdg_deco, new_xdg_decoration, server->xdg_deco_mgr->events.new_toplevel_decoration);
|
||||||
server->xdg_deco_mgr =
|
|
||||||
wlr_xdg_decoration_manager_v1_create(server->display);
|
|
||||||
LISTEN(server->new_xdg_deco, new_xdg_decoration,
|
|
||||||
server->xdg_deco_mgr->events.new_toplevel_decoration);
|
|
||||||
|
|
||||||
/* toplevels lists */
|
/* toplevels lists */
|
||||||
wl_list_init(&server->toplevels);
|
wl_list_init(&server->toplevels);
|
||||||
@@ -97,22 +87,18 @@ static int setup(absn_server *server)
|
|||||||
LISTEN(server->new_output, new_output, server->backend->events.new_output);
|
LISTEN(server->new_output, new_output, server->backend->events.new_output);
|
||||||
|
|
||||||
server->output_layout = wlr_output_layout_create(server->display);
|
server->output_layout = wlr_output_layout_create(server->display);
|
||||||
LISTEN(server->layout_change, output_layout_change,
|
LISTEN(server->layout_change, output_layout_change, server->output_layout->events.change);
|
||||||
server->output_layout->events.change);
|
|
||||||
|
|
||||||
server->output_mgr = wlr_output_manager_v1_create(server->display);
|
server->output_mgr = wlr_output_manager_v1_create(server->display);
|
||||||
|
|
||||||
wlr_xdg_output_manager_v1_create(server->display, server->output_layout);
|
wlr_xdg_output_manager_v1_create(server->display, server->output_layout);
|
||||||
|
|
||||||
server->scene_layout =
|
server->scene_layout = wlr_scene_attach_output_layout(server->scene, server->output_layout);
|
||||||
wlr_scene_attach_output_layout(server->scene, server->output_layout);
|
|
||||||
|
|
||||||
/* xdg_shell */
|
/* xdg_shell */
|
||||||
server->xdg_shell = wlr_xdg_shell_create(server->display, 6);
|
server->xdg_shell = wlr_xdg_shell_create(server->display, 6);
|
||||||
LISTEN(server->new_xdg_toplevel, new_xdg_toplevel,
|
LISTEN(server->new_xdg_toplevel, new_xdg_toplevel, server->xdg_shell->events.new_toplevel);
|
||||||
server->xdg_shell->events.new_toplevel);
|
LISTEN(server->new_xdg_popup, new_xdg_popup, server->xdg_shell->events.new_popup);
|
||||||
LISTEN(server->new_xdg_popup, new_xdg_popup,
|
|
||||||
server->xdg_shell->events.new_popup);
|
|
||||||
|
|
||||||
/* cursor */
|
/* cursor */
|
||||||
server->cursor = wlr_cursor_create();
|
server->cursor = wlr_cursor_create();
|
||||||
@@ -122,8 +108,7 @@ static int setup(absn_server *server)
|
|||||||
|
|
||||||
server->cursor_mode = CURSOR_PASSTHROUGH;
|
server->cursor_mode = CURSOR_PASSTHROUGH;
|
||||||
LISTEN(server->cursor_motion, cursor_motion, server->cursor->events.motion);
|
LISTEN(server->cursor_motion, cursor_motion, server->cursor->events.motion);
|
||||||
LISTEN(server->cursor_motion_abs, cursor_motion_abs,
|
LISTEN(server->cursor_motion_abs, cursor_motion_abs, server->cursor->events.motion_absolute);
|
||||||
server->cursor->events.motion_absolute);
|
|
||||||
LISTEN(server->cursor_button, cursor_button, server->cursor->events.button);
|
LISTEN(server->cursor_button, cursor_button, server->cursor->events.button);
|
||||||
LISTEN(server->cursor_axis, cursor_axis, server->cursor->events.axis);
|
LISTEN(server->cursor_axis, cursor_axis, server->cursor->events.axis);
|
||||||
LISTEN(server->cursor_frame, cursor_frame, server->cursor->events.frame);
|
LISTEN(server->cursor_frame, cursor_frame, server->cursor->events.frame);
|
||||||
@@ -132,18 +117,16 @@ static int setup(absn_server *server)
|
|||||||
wl_list_init(&server->keyboards);
|
wl_list_init(&server->keyboards);
|
||||||
server->seat = wlr_seat_create(server->display, "seat0");
|
server->seat = wlr_seat_create(server->display, "seat0");
|
||||||
LISTEN(server->new_input, new_input, server->backend->events.new_input);
|
LISTEN(server->new_input, new_input, server->backend->events.new_input);
|
||||||
LISTEN(server->request_cursor, request_cursor,
|
LISTEN(server->request_cursor, request_cursor, server->seat->events.request_set_cursor);
|
||||||
server->seat->events.request_set_cursor);
|
LISTEN(server->pointer_focus_change, pointer_focus_change, server->seat->pointer_state.events.focus_change);
|
||||||
LISTEN(server->pointer_focus_change, pointer_focus_change,
|
LISTEN(server->request_set_selection, request_cursor, server->seat->events.request_set_selection);
|
||||||
server->seat->pointer_state.events.focus_change);
|
|
||||||
LISTEN(server->request_set_selection, request_cursor,
|
|
||||||
server->seat->events.request_set_selection);
|
|
||||||
|
|
||||||
/* layer shell */
|
/* layer shell */
|
||||||
server->layer_shell = wlr_layer_shell_v1_create(server->display, 5);
|
server->layer_shell = wlr_layer_shell_v1_create(server->display, 5);
|
||||||
for (int i = 0; i < LAYERS_COUNT; ++i) {
|
for (int i = 0; i < LAYERS_COUNT; ++i) {
|
||||||
server->layers[i] = wlr_scene_tree_create(&server->scene->tree);
|
server->layers[i] = wlr_scene_tree_create(&server->scene->tree);
|
||||||
}
|
}
|
||||||
|
LISTEN(server->new_layer_surface, new_layer_surface, server->layer_shell->events.new_surface);
|
||||||
|
|
||||||
/* workspaces */
|
/* workspaces */
|
||||||
int workspaces_count = sizeof(workspaces) / sizeof(workspaces[0]);
|
int workspaces_count = sizeof(workspaces) / sizeof(workspaces[0]);
|
||||||
@@ -159,16 +142,12 @@ static int setup(absn_server *server)
|
|||||||
|
|
||||||
unsetenv("DISPLAY");
|
unsetenv("DISPLAY");
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if ((server->xwayland =
|
if ((server->xwayland = wlr_xwayland_create(server->display, server->compositor, 1))) {
|
||||||
wlr_xwayland_create(server->display, server->compositor, 1))) {
|
LISTEN(server->xw_ready, xwayland_ready, server->xwayland->events.ready);
|
||||||
LISTEN(server->xw_ready, xwayland_ready,
|
LISTEN(server->xw_new_surface, xwayland_new_surface, server->xwayland->events.new_surface);
|
||||||
server->xwayland->events.ready);
|
|
||||||
LISTEN(server->xw_new_surface, xwayland_new_surface,
|
|
||||||
server->xwayland->events.new_surface);
|
|
||||||
|
|
||||||
setenv("DISPLAY", server->xwayland->display_name, 1);
|
setenv("DISPLAY", server->xwayland->display_name, 1);
|
||||||
wlr_log(WLR_INFO, "Running XWayland, DISPLAY=%s",
|
wlr_log(WLR_INFO, "Running XWayland, DISPLAY=%s", server->xwayland->display_name);
|
||||||
server->xwayland->display_name);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_log(WLR_ERROR, "Failed to setup XWayland, continuing without it");
|
wlr_log(WLR_ERROR, "Failed to setup XWayland, continuing without it");
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-4
@@ -59,8 +59,7 @@ static void apply_resize(absn_toplevel *toplevel, struct wlr_box *new_geom)
|
|||||||
new_geom->x = toplevel->geom.x;
|
new_geom->x = toplevel->geom.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(new_geom->height >= min_height &&
|
if (!(new_geom->height >= min_height && new_geom->height <= max_height)) {
|
||||||
new_geom->height <= max_height)) {
|
|
||||||
new_geom->height = toplevel->geom.height;
|
new_geom->height = toplevel->geom.height;
|
||||||
new_geom->y = toplevel->geom.y;
|
new_geom->y = toplevel->geom.y;
|
||||||
}
|
}
|
||||||
@@ -143,8 +142,7 @@ void process_cursor_motion(absn_server *server, uint32_t time)
|
|||||||
{
|
{
|
||||||
double sx, sy;
|
double sx, sy;
|
||||||
struct wlr_surface *surface = NULL;
|
struct wlr_surface *surface = NULL;
|
||||||
toplevel_at(server, server->cursor->x, server->cursor->y, &surface, &sx,
|
toplevel_at(server, server->cursor->x, server->cursor->y, &surface, &sx, &sy);
|
||||||
&sy);
|
|
||||||
struct wlr_seat *seat = server->seat;
|
struct wlr_seat *seat = server->seat;
|
||||||
|
|
||||||
if (server->cursor_mode == CURSOR_MOVE) {
|
if (server->cursor_mode == CURSOR_MOVE) {
|
||||||
|
|||||||
+2
-5
@@ -55,9 +55,7 @@ void focus_toplevel(absn_toplevel *toplevel)
|
|||||||
toplevel_set_border_color(toplevel, focused_bc);
|
toplevel_set_border_color(toplevel, focused_bc);
|
||||||
|
|
||||||
if (keyboard) {
|
if (keyboard) {
|
||||||
wlr_seat_keyboard_notify_enter(seat, surface, keyboard->keycodes,
|
wlr_seat_keyboard_notify_enter(seat, surface, keyboard->keycodes, keyboard->num_keycodes, &keyboard->modifiers);
|
||||||
keyboard->num_keycodes,
|
|
||||||
&keyboard->modifiers);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +68,7 @@ absn_toplevel *focus_get_topmost(absn_server *server)
|
|||||||
absn_toplevel *toplevel;
|
absn_toplevel *toplevel;
|
||||||
wl_list_for_each(toplevel, &server->focus_stack, flink)
|
wl_list_for_each(toplevel, &server->focus_stack, flink)
|
||||||
{
|
{
|
||||||
if (toplevel &&
|
if (toplevel && toplevel->workspace == server->focused_output->workspace) {
|
||||||
toplevel->workspace == server->focused_output->workspace) {
|
|
||||||
return toplevel;
|
return toplevel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-9
@@ -150,11 +150,8 @@ void toggle_floating(absn_server *server, const absn_arg *arg)
|
|||||||
toplevel_set_floating(focus, !focus->floating);
|
toplevel_set_floating(focus, !focus->floating);
|
||||||
|
|
||||||
if (focus->floating) {
|
if (focus->floating) {
|
||||||
int32_t new_x = focus->output->geom.x +
|
int32_t new_x = focus->output->geom.x + (focus->output->geom.width / 2 - focus->geom.width / 2);
|
||||||
(focus->output->geom.width / 2 - focus->geom.width / 2);
|
int32_t new_y = focus->output->geom.y + (focus->output->geom.height / 2 - focus->geom.height / 2);
|
||||||
int32_t new_y =
|
|
||||||
focus->output->geom.y +
|
|
||||||
(focus->output->geom.height / 2 - focus->geom.height / 2);
|
|
||||||
toplevel_set_pos(focus, new_x, new_y);
|
toplevel_set_pos(focus, new_x, new_y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -228,13 +225,11 @@ void switch_workspace(absn_server *server, const absn_arg *arg)
|
|||||||
absn_toplevel *focus = NULL;
|
absn_toplevel *focus = NULL;
|
||||||
wl_list_for_each(toplevel, &server->toplevels, link)
|
wl_list_for_each(toplevel, &server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (!focus && toplevel &&
|
if (!focus && toplevel && toplevel->workspace == &server->workspaces[i]) {
|
||||||
toplevel->workspace == &server->workspaces[i]) {
|
|
||||||
focus = toplevel; /* found it */
|
focus = toplevel; /* found it */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toplevel && toplevel->workspace == &server->workspaces[i] &&
|
if (toplevel && toplevel->workspace == &server->workspaces[i] && toplevel->fullscreen) {
|
||||||
toplevel->fullscreen) {
|
|
||||||
/* overwrite if there is a fullscreen window */
|
/* overwrite if there is a fullscreen window */
|
||||||
focus = toplevel;
|
focus = toplevel;
|
||||||
break;
|
break;
|
||||||
|
|||||||
+5
-11
@@ -14,18 +14,14 @@ void handle_modifiers(struct wl_listener *listener, void *data)
|
|||||||
absn_keyboard *keyboard = wl_container_of(listener, keyboard, modifiers);
|
absn_keyboard *keyboard = wl_container_of(listener, keyboard, modifiers);
|
||||||
|
|
||||||
wlr_seat_set_keyboard(keyboard->server->seat, keyboard->wlr);
|
wlr_seat_set_keyboard(keyboard->server->seat, keyboard->wlr);
|
||||||
wlr_seat_keyboard_notify_modifiers(keyboard->server->seat,
|
wlr_seat_keyboard_notify_modifiers(keyboard->server->seat, &keyboard->wlr->modifiers);
|
||||||
&keyboard->wlr->modifiers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool handle_keybind(absn_server *server, uint32_t mods,
|
static bool handle_keybind(absn_server *server, uint32_t mods, xkb_keysym_t keysym)
|
||||||
xkb_keysym_t keysym)
|
|
||||||
{
|
{
|
||||||
int nkeyb = sizeof(keybinds) / sizeof(keybinds[0]);
|
int nkeyb = sizeof(keybinds) / sizeof(keybinds[0]);
|
||||||
for (int i = 0; i < nkeyb; ++i) {
|
for (int i = 0; i < nkeyb; ++i) {
|
||||||
if (CLEANMASK(keybinds[i].mods) == CLEANMASK(mods) &&
|
if (CLEANMASK(keybinds[i].mods) == CLEANMASK(mods) && xkb_keysym_to_lower(keybinds[i].keysym) == xkb_keysym_to_lower(keysym)) {
|
||||||
xkb_keysym_to_lower(keybinds[i].keysym) ==
|
|
||||||
xkb_keysym_to_lower(keysym)) {
|
|
||||||
keybinds[i].cb(server, &keybinds[i].arg);
|
keybinds[i].cb(server, &keybinds[i].arg);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -47,8 +43,7 @@ void handle_key(struct wl_listener *listener, void *data)
|
|||||||
bool handled = false;
|
bool handled = false;
|
||||||
if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
|
if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
|
||||||
for (int i = 0; i < nsyms; ++i) {
|
for (int i = 0; i < nsyms; ++i) {
|
||||||
handled =
|
handled = handle_keybind(keyboard->server, mods, syms[i]) || handled;
|
||||||
handle_keybind(keyboard->server, mods, syms[i]) || handled;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +52,7 @@ void handle_key(struct wl_listener *listener, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
wlr_seat_set_keyboard(keyboard->server->seat, keyboard->wlr);
|
wlr_seat_set_keyboard(keyboard->server->seat, keyboard->wlr);
|
||||||
wlr_seat_keyboard_notify_key(keyboard->server->seat, event->time_msec,
|
wlr_seat_keyboard_notify_key(keyboard->server->seat, event->time_msec, event->keycode, event->state);
|
||||||
event->keycode, event->state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_destroy(struct wl_listener *listener, void *data)
|
void handle_destroy(struct wl_listener *listener, void *data)
|
||||||
|
|||||||
+11
-24
@@ -8,11 +8,9 @@
|
|||||||
void layer_surface_unmap(struct wl_listener *listener, void *data)
|
void layer_surface_unmap(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_layer_surface *layer_surface =
|
absn_layer_surface *layer_surface = wl_container_of(listener, layer_surface, unmap);
|
||||||
wl_container_of(listener, layer_surface, unmap);
|
|
||||||
|
|
||||||
if (layer_surface->wlr->surface ==
|
if (layer_surface->wlr->surface == layer_surface->server->seat->keyboard_state.focused_surface) {
|
||||||
layer_surface->server->seat->keyboard_state.focused_surface) {
|
|
||||||
focus_toplevel(focus_get_topmost(layer_surface->server));
|
focus_toplevel(focus_get_topmost(layer_surface->server));
|
||||||
}
|
}
|
||||||
if (layer_surface == layer_surface->server->exclusive_focus) {
|
if (layer_surface == layer_surface->server->exclusive_focus) {
|
||||||
@@ -25,11 +23,9 @@ void layer_surface_unmap(struct wl_listener *listener, void *data)
|
|||||||
void layer_surface_commit(struct wl_listener *listener, void *data)
|
void layer_surface_commit(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_layer_surface *layer_surface =
|
absn_layer_surface *layer_surface = wl_container_of(listener, layer_surface, commit);
|
||||||
wl_container_of(listener, layer_surface, commit);
|
|
||||||
struct wlr_layer_surface_v1 *surface = layer_surface->wlr;
|
struct wlr_layer_surface_v1 *surface = layer_surface->wlr;
|
||||||
struct wlr_scene_tree *scene_layer =
|
struct wlr_scene_tree *scene_layer = layer_surface->server->layers[layermap[surface->current.layer]];
|
||||||
layer_surface->server->layers[layermap[surface->current.layer]];
|
|
||||||
|
|
||||||
if (surface->initial_commit) {
|
if (surface->initial_commit) {
|
||||||
struct wlr_layer_surface_v1_state old_state = surface->current;
|
struct wlr_layer_surface_v1_state old_state = surface->current;
|
||||||
@@ -39,8 +35,7 @@ void layer_surface_commit(struct wl_listener *listener, void *data)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (surface->current.committed == 0 ||
|
if (surface->current.committed == 0 || layer_surface->mapped == surface->surface->mapped) {
|
||||||
layer_surface->mapped == surface->surface->mapped) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
layer_surface->mapped = surface->surface->mapped;
|
layer_surface->mapped = surface->surface->mapped;
|
||||||
@@ -48,14 +43,10 @@ void layer_surface_commit(struct wl_listener *listener, void *data)
|
|||||||
if (scene_layer != layer_surface->scene_tree->node.parent) {
|
if (scene_layer != layer_surface->scene_tree->node.parent) {
|
||||||
wlr_scene_node_reparent(&layer_surface->scene_tree->node, scene_layer);
|
wlr_scene_node_reparent(&layer_surface->scene_tree->node, scene_layer);
|
||||||
wl_list_remove(&layer_surface->link);
|
wl_list_remove(&layer_surface->link);
|
||||||
wl_list_insert(&layer_surface->output->layers[surface->current.layer],
|
wl_list_insert(&layer_surface->output->layers[surface->current.layer], &layer_surface->link);
|
||||||
&layer_surface->link);
|
bool on_top_layer = surface->current.layer == ZWLR_LAYER_SHELL_V1_LAYER_TOP;
|
||||||
bool on_top_layer =
|
|
||||||
surface->current.layer == ZWLR_LAYER_SHELL_V1_LAYER_TOP;
|
|
||||||
if (on_top_layer) {
|
if (on_top_layer) {
|
||||||
wlr_scene_node_reparent(
|
wlr_scene_node_reparent(&layer_surface->popups->node, layer_surface->output->server->layers[LAYER_TOP]);
|
||||||
&layer_surface->popups->node,
|
|
||||||
layer_surface->output->server->layers[LAYER_TOP]);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_scene_node_reparent(&layer_surface->popups->node, scene_layer);
|
wlr_scene_node_reparent(&layer_surface->popups->node, scene_layer);
|
||||||
}
|
}
|
||||||
@@ -67,8 +58,7 @@ void layer_surface_commit(struct wl_listener *listener, void *data)
|
|||||||
void layer_surface_new_popup(struct wl_listener *listener, void *data)
|
void layer_surface_new_popup(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_layer_surface *layer_surface =
|
absn_layer_surface *layer_surface = wl_container_of(listener, layer_surface, new_popup);
|
||||||
wl_container_of(listener, layer_surface, new_popup);
|
|
||||||
struct wlr_xdg_popup *xdg_popup = data;
|
struct wlr_xdg_popup *xdg_popup = data;
|
||||||
|
|
||||||
wlr_scene_xdg_surface_create(layer_surface->popups, xdg_popup->base);
|
wlr_scene_xdg_surface_create(layer_surface->popups, xdg_popup->base);
|
||||||
@@ -78,18 +68,15 @@ void layer_surface_new_popup(struct wl_listener *listener, void *data)
|
|||||||
popup->parent_type = LAYER_SURFACE;
|
popup->parent_type = LAYER_SURFACE;
|
||||||
popup->parent = layer_surface;
|
popup->parent = layer_surface;
|
||||||
|
|
||||||
LISTEN(popup->commit, xdg_popup_commit,
|
LISTEN(popup->commit, xdg_popup_commit, xdg_popup->base->surface->events.commit);
|
||||||
xdg_popup->base->surface->events.commit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void layer_surface_destroy(struct wl_listener *listener, void *data)
|
void layer_surface_destroy(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_layer_surface *layer_surface =
|
absn_layer_surface *layer_surface = wl_container_of(listener, layer_surface, destroy);
|
||||||
wl_container_of(listener, layer_surface, destroy);
|
|
||||||
|
|
||||||
wl_list_remove(&layer_surface->link);
|
wl_list_remove(&layer_surface->link);
|
||||||
wl_list_remove(&layer_surface->map.link);
|
|
||||||
wl_list_remove(&layer_surface->unmap.link);
|
wl_list_remove(&layer_surface->unmap.link);
|
||||||
wl_list_remove(&layer_surface->commit.link);
|
wl_list_remove(&layer_surface->commit.link);
|
||||||
wl_list_remove(&layer_surface->new_popup.link);
|
wl_list_remove(&layer_surface->new_popup.link);
|
||||||
|
|||||||
+8
-23
@@ -7,27 +7,19 @@
|
|||||||
|
|
||||||
/* arrange layers logic from dwl */
|
/* arrange layers logic from dwl */
|
||||||
|
|
||||||
static void layer_arrange(absn_output *output, struct wl_list *list,
|
static void layer_arrange(absn_output *output, struct wl_list *list, struct wlr_box *usable_area, int exclusive)
|
||||||
struct wlr_box *usable_area, int exclusive)
|
|
||||||
{
|
{
|
||||||
absn_layer_surface *layer_surface;
|
absn_layer_surface *layer_surface;
|
||||||
wl_list_for_each(layer_surface, list, link)
|
wl_list_for_each(layer_surface, list, link)
|
||||||
{
|
{
|
||||||
struct wlr_layer_surface_v1 *surface = layer_surface->wlr;
|
struct wlr_layer_surface_v1 *surface = layer_surface->wlr;
|
||||||
|
|
||||||
if (!surface->initialized) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exclusive != (surface->current.exclusive_zone > 0)) {
|
if (exclusive != (surface->current.exclusive_zone > 0)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_scene_layer_surface_v1_configure(layer_surface->scene_layer,
|
wlr_scene_layer_surface_v1_configure(layer_surface->scene_layer, &output->geom, usable_area);
|
||||||
&output->geom, usable_area);
|
wlr_scene_node_set_position(&layer_surface->popups->node, layer_surface->scene_tree->node.x, layer_surface->scene_tree->node.y);
|
||||||
wlr_scene_node_set_position(&layer_surface->popups->node,
|
|
||||||
layer_surface->scene_tree->node.x,
|
|
||||||
layer_surface->scene_tree->node.y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,27 +51,20 @@ void layers_arrange(absn_output *output)
|
|||||||
ZWLR_LAYER_SHELL_V1_LAYER_TOP,
|
ZWLR_LAYER_SHELL_V1_LAYER_TOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
int layers_above_shell_count =
|
int layers_above_shell_count = sizeof(layers_above_shell) / sizeof(layers_above_shell[0]);
|
||||||
sizeof(layers_above_shell) / sizeof(layers_above_shell[0]);
|
|
||||||
absn_layer_surface *layer_surface;
|
absn_layer_surface *layer_surface;
|
||||||
for (int i = 0; i < layers_above_shell_count; ++i) {
|
for (int i = 0; i < layers_above_shell_count; ++i) {
|
||||||
wl_list_for_each_reverse(layer_surface,
|
wl_list_for_each_reverse(layer_surface, &output->layers[layers_above_shell[i]], link)
|
||||||
&output->layers[layers_above_shell[i]], link)
|
|
||||||
{
|
{
|
||||||
if (!layer_surface->wlr->current.keyboard_interactive ||
|
if (!layer_surface->wlr->current.keyboard_interactive || !layer_surface->mapped) {
|
||||||
!layer_surface->mapped) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
unfocus_toplevel(output->server->focused_toplevel);
|
unfocus_toplevel(output->server->focused_toplevel);
|
||||||
output->server->exclusive_focus = layer_surface;
|
output->server->exclusive_focus = layer_surface;
|
||||||
struct wlr_keyboard *keyboard =
|
struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(output->server->seat);
|
||||||
wlr_seat_get_keyboard(output->server->seat);
|
|
||||||
if (keyboard) {
|
if (keyboard) {
|
||||||
wlr_seat_keyboard_notify_enter(
|
wlr_seat_keyboard_notify_enter(output->server->seat, layer_surface->wlr->surface, keyboard->keycodes, keyboard->num_keycodes, &keyboard->modifiers);
|
||||||
output->server->seat, layer_surface->wlr->surface,
|
|
||||||
keyboard->keycodes, keyboard->num_keycodes,
|
|
||||||
&keyboard->modifiers);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-34
@@ -17,8 +17,7 @@ static int prepare_output(struct absn_output *output)
|
|||||||
if (!toplevel->floating && !toplevel->fullscreen) {
|
if (!toplevel->floating && !toplevel->fullscreen) {
|
||||||
res++;
|
res++;
|
||||||
}
|
}
|
||||||
} else if (toplevel->output == output &&
|
} else if (toplevel->output == output && toplevel->workspace != output->workspace) {
|
||||||
toplevel->workspace != output->workspace) {
|
|
||||||
wlr_scene_node_set_enabled(&toplevel->scene_tree->node, false);
|
wlr_scene_node_set_enabled(&toplevel->scene_tree->node, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,15 +40,11 @@ static void tile(struct absn_output *output)
|
|||||||
if (toplevels_count == 1) {
|
if (toplevels_count == 1) {
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace == output->workspace &&
|
if (toplevel->workspace == output->workspace && !toplevel->floating && !toplevel->fullscreen) {
|
||||||
!toplevel->floating && !toplevel->fullscreen) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new_geom.x = output->usable_area.x + og,
|
new_geom.x = output->usable_area.x + og, new_geom.y = output->usable_area.y + og, new_geom.width = output->usable_area.width - 2 * og, new_geom.height = output->usable_area.height - 2 * og,
|
||||||
new_geom.y = output->usable_area.y + og,
|
|
||||||
new_geom.width = output->usable_area.width - 2 * og,
|
|
||||||
new_geom.height = output->usable_area.height - 2 * og,
|
|
||||||
|
|
||||||
toplevel_set_geom(toplevel, &new_geom);
|
toplevel_set_geom(toplevel, &new_geom);
|
||||||
return;
|
return;
|
||||||
@@ -61,10 +56,7 @@ static void tile(struct absn_output *output)
|
|||||||
int mcount = output->workspace->count;
|
int mcount = output->workspace->count;
|
||||||
float msize = output->workspace->size;
|
float msize = output->workspace->size;
|
||||||
|
|
||||||
int32_t main_stack_width =
|
int32_t main_stack_width = (toplevels_count <= mcount) ? output->usable_area.width - 2 * og : msize * (output->usable_area.width - 2 * og);
|
||||||
(toplevels_count <= mcount)
|
|
||||||
? output->usable_area.width - 2 * og
|
|
||||||
: msize * (output->usable_area.width - 2 * og);
|
|
||||||
int32_t w = output->usable_area.width - main_stack_width - 2 * og - lg;
|
int32_t w = output->usable_area.width - main_stack_width - 2 * og - lg;
|
||||||
|
|
||||||
int32_t pure_h;
|
int32_t pure_h;
|
||||||
@@ -83,8 +75,7 @@ static void tile(struct absn_output *output)
|
|||||||
|
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace != output->workspace ||
|
if (toplevel->workspace != output->workspace || toplevel->floating || toplevel->fullscreen) {
|
||||||
toplevel->floating || toplevel->fullscreen) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,8 +97,7 @@ static void tile(struct absn_output *output)
|
|||||||
|
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace != output->workspace || toplevel->floating ||
|
if (toplevel->workspace != output->workspace || toplevel->floating || toplevel->fullscreen) {
|
||||||
toplevel->fullscreen) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,15 +159,11 @@ static void tile_left(struct absn_output *output)
|
|||||||
if (toplevels_count == 1) {
|
if (toplevels_count == 1) {
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace == output->workspace &&
|
if (toplevel->workspace == output->workspace && !toplevel->floating && !toplevel->fullscreen) {
|
||||||
!toplevel->floating && !toplevel->fullscreen) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new_geom.x = output->usable_area.x + og,
|
new_geom.x = output->usable_area.x + og, new_geom.y = output->usable_area.y + og, new_geom.width = output->usable_area.width - 2 * og, new_geom.height = output->usable_area.height - 2 * og,
|
||||||
new_geom.y = output->usable_area.y + og,
|
|
||||||
new_geom.width = output->usable_area.width - 2 * og,
|
|
||||||
new_geom.height = output->usable_area.height - 2 * og,
|
|
||||||
|
|
||||||
toplevel_set_geom(toplevel, &new_geom);
|
toplevel_set_geom(toplevel, &new_geom);
|
||||||
return;
|
return;
|
||||||
@@ -189,10 +175,7 @@ static void tile_left(struct absn_output *output)
|
|||||||
int mcount = output->workspace->count;
|
int mcount = output->workspace->count;
|
||||||
float msize = output->workspace->size;
|
float msize = output->workspace->size;
|
||||||
|
|
||||||
int32_t main_stack_width =
|
int32_t main_stack_width = (toplevels_count <= mcount) ? output->usable_area.width - 2 * og : msize * (output->usable_area.width - 2 * og);
|
||||||
(toplevels_count <= mcount)
|
|
||||||
? output->usable_area.width - 2 * og
|
|
||||||
: msize * (output->usable_area.width - 2 * og);
|
|
||||||
int32_t w = output->usable_area.width - main_stack_width - 2 * og - lg;
|
int32_t w = output->usable_area.width - main_stack_width - 2 * og - lg;
|
||||||
|
|
||||||
int32_t pure_h;
|
int32_t pure_h;
|
||||||
@@ -211,8 +194,7 @@ static void tile_left(struct absn_output *output)
|
|||||||
|
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace != output->workspace ||
|
if (toplevel->workspace != output->workspace || toplevel->floating || toplevel->fullscreen) {
|
||||||
toplevel->floating || toplevel->fullscreen) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,8 +216,7 @@ static void tile_left(struct absn_output *output)
|
|||||||
|
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace != output->workspace || toplevel->floating ||
|
if (toplevel->workspace != output->workspace || toplevel->floating || toplevel->fullscreen) {
|
||||||
toplevel->fullscreen) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,8 +228,7 @@ static void tile_left(struct absn_output *output)
|
|||||||
|
|
||||||
cur_h = h + (i < r ? 1 : 0);
|
cur_h = h + (i < r ? 1 : 0);
|
||||||
|
|
||||||
new_geom.x = output->usable_area.x + output->usable_area.width -
|
new_geom.x = output->usable_area.x + output->usable_area.width - og - main_stack_width;
|
||||||
og - main_stack_width;
|
|
||||||
new_geom.y = output->usable_area.y + dy;
|
new_geom.y = output->usable_area.y + dy;
|
||||||
new_geom.width = main_stack_width;
|
new_geom.width = main_stack_width;
|
||||||
new_geom.height = cur_h;
|
new_geom.height = cur_h;
|
||||||
@@ -303,8 +283,7 @@ static void monocle(struct absn_output *output)
|
|||||||
absn_toplevel *toplevel;
|
absn_toplevel *toplevel;
|
||||||
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
wl_list_for_each(toplevel, &output->server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->workspace != output->workspace || toplevel->floating ||
|
if (toplevel->workspace != output->workspace || toplevel->floating || toplevel->fullscreen) {
|
||||||
toplevel->fullscreen) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-31
@@ -30,8 +30,7 @@ skip:
|
|||||||
|
|
||||||
void output_request_state(struct wl_listener *listener, void *data)
|
void output_request_state(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
struct absn_output *output =
|
struct absn_output *output = wl_container_of(listener, output, request_state);
|
||||||
wl_container_of(listener, output, request_state);
|
|
||||||
const struct wlr_output_event_request_state *event = data;
|
const struct wlr_output_event_request_state *event = data;
|
||||||
wlr_output_commit_state(output->wlr, event->state);
|
wlr_output_commit_state(output->wlr, event->state);
|
||||||
}
|
}
|
||||||
@@ -39,8 +38,7 @@ void output_request_state(struct wl_listener *listener, void *data)
|
|||||||
void output_destroy(struct wl_listener *listener, void *data)
|
void output_destroy(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
struct absn_output *output =
|
struct absn_output *output = wl_container_of(listener, output, request_state);
|
||||||
wl_container_of(listener, output, request_state);
|
|
||||||
|
|
||||||
wl_list_remove(&output->frame.link);
|
wl_list_remove(&output->frame.link);
|
||||||
wl_list_remove(&output->request_state.link);
|
wl_list_remove(&output->request_state.link);
|
||||||
@@ -53,8 +51,7 @@ void output_layout_change(struct wl_listener *listener, void *data)
|
|||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_server *server = wl_container_of(listener, server, layout_change);
|
absn_server *server = wl_container_of(listener, server, layout_change);
|
||||||
struct wlr_output_configuration_v1 *config =
|
struct wlr_output_configuration_v1 *config = wlr_output_configuration_v1_create();
|
||||||
wlr_output_configuration_v1_create();
|
|
||||||
|
|
||||||
absn_toplevel *toplevel = NULL;
|
absn_toplevel *toplevel = NULL;
|
||||||
absn_output *output;
|
absn_output *output;
|
||||||
@@ -65,8 +62,7 @@ void output_layout_change(struct wl_listener *listener, void *data)
|
|||||||
if (output->wlr->enabled) {
|
if (output->wlr->enabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
config_head =
|
config_head = wlr_output_configuration_head_v1_create(config, output->wlr);
|
||||||
wlr_output_configuration_head_v1_create(config, output->wlr);
|
|
||||||
config_head->state.enabled = 0;
|
config_head->state.enabled = 0;
|
||||||
wlr_output_layout_remove(server->output_layout, output->wlr);
|
wlr_output_layout_remove(server->output_layout, output->wlr);
|
||||||
|
|
||||||
@@ -76,18 +72,15 @@ void output_layout_change(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
wl_list_for_each(output, &server->outputs, link)
|
wl_list_for_each(output, &server->outputs, link)
|
||||||
{
|
{
|
||||||
if (output->wlr->enabled &&
|
if (output->wlr->enabled && !wlr_output_layout_get(server->output_layout, output->wlr)) {
|
||||||
!wlr_output_layout_get(server->output_layout, output->wlr)) {
|
wlr_output_layout_add_auto(server->output_layout, toplevel->output->wlr);
|
||||||
wlr_output_layout_add_auto(server->output_layout,
|
|
||||||
toplevel->output->wlr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_box layout_geom;
|
struct wlr_box layout_geom;
|
||||||
wlr_output_layout_get_box(server->output_layout, NULL, &layout_geom);
|
wlr_output_layout_get_box(server->output_layout, NULL, &layout_geom);
|
||||||
|
|
||||||
wlr_scene_node_set_position(&server->bg->node, layout_geom.x,
|
wlr_scene_node_set_position(&server->bg->node, layout_geom.x, layout_geom.y);
|
||||||
layout_geom.y);
|
|
||||||
wlr_scene_rect_set_size(server->bg, layout_geom.width, layout_geom.height);
|
wlr_scene_rect_set_size(server->bg, layout_geom.width, layout_geom.height);
|
||||||
|
|
||||||
wl_list_for_each(output, &server->outputs, link)
|
wl_list_for_each(output, &server->outputs, link)
|
||||||
@@ -95,16 +88,13 @@ void output_layout_change(struct wl_listener *listener, void *data)
|
|||||||
if (!output->wlr->enabled) {
|
if (!output->wlr->enabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
config_head =
|
config_head = wlr_output_configuration_head_v1_create(config, output->wlr);
|
||||||
wlr_output_configuration_head_v1_create(config, output->wlr);
|
|
||||||
|
|
||||||
wlr_output_layout_get_box(server->output_layout, output->wlr,
|
wlr_output_layout_get_box(server->output_layout, output->wlr, &output->geom);
|
||||||
&output->geom);
|
|
||||||
output->usable_area = output->geom;
|
output->usable_area = output->geom;
|
||||||
|
|
||||||
if ((toplevel = focus_get_topmost(server)) && toplevel->fullscreen) {
|
if ((toplevel = focus_get_topmost(server)) && toplevel->fullscreen) {
|
||||||
toplevel_set_size(toplevel, output->geom.width,
|
toplevel_set_size(toplevel, output->geom.width, output->geom.height);
|
||||||
output->geom.height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config_head->state.x = output->geom.x;
|
config_head->state.x = output->geom.x;
|
||||||
@@ -137,12 +127,8 @@ void update_focused_output(absn_server *server)
|
|||||||
int32_t cursor_y = server->cursor->y;
|
int32_t cursor_y = server->cursor->y;
|
||||||
wl_list_for_each(output, &server->outputs, link)
|
wl_list_for_each(output, &server->outputs, link)
|
||||||
{
|
{
|
||||||
bool cursor_in_output_x =
|
bool cursor_in_output_x = cursor_x >= output->geom.x && cursor_x <= output->geom.x + output->geom.width;
|
||||||
cursor_x >= output->geom.x &&
|
bool cursor_in_output_y = cursor_y >= output->geom.y && cursor_y <= output->geom.y + output->geom.height;
|
||||||
cursor_x <= output->geom.x + output->geom.width;
|
|
||||||
bool cursor_in_output_y =
|
|
||||||
cursor_y >= output->geom.y &&
|
|
||||||
cursor_y <= output->geom.y + output->geom.height;
|
|
||||||
if (cursor_in_output_x && cursor_in_output_y) {
|
if (cursor_in_output_x && cursor_in_output_y) {
|
||||||
server->focused_output = output;
|
server->focused_output = output;
|
||||||
break;
|
break;
|
||||||
@@ -168,12 +154,9 @@ void output_arrange(absn_output *output)
|
|||||||
|
|
||||||
wl_list_for_each(toplevel, &server->toplevels, link)
|
wl_list_for_each(toplevel, &server->toplevels, link)
|
||||||
{
|
{
|
||||||
if (toplevel->output != output ||
|
if (toplevel->output != output || toplevel->scene_tree->node.parent == server->layers[LAYER_FULLSCREEN]) {
|
||||||
toplevel->scene_tree->node.parent ==
|
|
||||||
server->layers[LAYER_FULLSCREEN]) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
wlr_scene_node_reparent(&toplevel->scene_tree->node,
|
wlr_scene_node_reparent(&toplevel->scene_tree->node, toplevel->scene_tree->node.parent);
|
||||||
toplevel->scene_tree->node.parent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-6
@@ -10,15 +10,13 @@ void request_cursor(struct wl_listener *listener, void *data)
|
|||||||
struct wlr_seat_client *client = server->seat->pointer_state.focused_client;
|
struct wlr_seat_client *client = server->seat->pointer_state.focused_client;
|
||||||
|
|
||||||
if (client == event->seat_client) {
|
if (client == event->seat_client) {
|
||||||
wlr_cursor_set_surface(server->cursor, event->surface, event->hotspot_x,
|
wlr_cursor_set_surface(server->cursor, event->surface, event->hotspot_x, event->hotspot_y);
|
||||||
event->hotspot_y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pointer_focus_change(struct wl_listener *listener, void *data)
|
void pointer_focus_change(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
absn_server *server =
|
absn_server *server = wl_container_of(listener, server, pointer_focus_change);
|
||||||
wl_container_of(listener, server, pointer_focus_change);
|
|
||||||
struct wlr_seat_pointer_focus_change_event *event = data;
|
struct wlr_seat_pointer_focus_change_event *event = data;
|
||||||
|
|
||||||
if (!event->new_surface) {
|
if (!event->new_surface) {
|
||||||
@@ -28,8 +26,7 @@ void pointer_focus_change(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
void request_set_selection(struct wl_listener *listener, void *data)
|
void request_set_selection(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
absn_server *server =
|
absn_server *server = wl_container_of(listener, server, request_set_selection);
|
||||||
wl_container_of(listener, server, request_set_selection);
|
|
||||||
struct wlr_seat_request_set_selection_event *event = data;
|
struct wlr_seat_request_set_selection_event *event = data;
|
||||||
|
|
||||||
wlr_seat_set_selection(server->seat, event->source, event->serial);
|
wlr_seat_set_selection(server->seat, event->source, event->serial);
|
||||||
|
|||||||
+52
-105
@@ -46,6 +46,7 @@ void new_output(struct wl_listener *listener, void *data)
|
|||||||
struct absn_output *output = calloc(1, sizeof(*output));
|
struct absn_output *output = calloc(1, sizeof(*output));
|
||||||
output->wlr = wlr_output;
|
output->wlr = wlr_output;
|
||||||
output->server = server;
|
output->server = server;
|
||||||
|
wlr_output->data = output;
|
||||||
|
|
||||||
for (int i = 0; i < server->workspaces_count; ++i) {
|
for (int i = 0; i < server->workspaces_count; ++i) {
|
||||||
if (!server->workspaces[i].output) {
|
if (!server->workspaces[i].output) {
|
||||||
@@ -56,8 +57,7 @@ void new_output(struct wl_listener *listener, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LISTEN(output->frame, output_frame, wlr_output->events.frame);
|
LISTEN(output->frame, output_frame, wlr_output->events.frame);
|
||||||
LISTEN(output->request_state, output_request_state,
|
LISTEN(output->request_state, output_request_state, wlr_output->events.request_state);
|
||||||
wlr_output->events.request_state);
|
|
||||||
LISTEN(output->destroy, output_destroy, wlr_output->events.destroy);
|
LISTEN(output->destroy, output_destroy, wlr_output->events.destroy);
|
||||||
|
|
||||||
wl_list_insert(&server->outputs, &output->link);
|
wl_list_insert(&server->outputs, &output->link);
|
||||||
@@ -66,14 +66,10 @@ void new_output(struct wl_listener *listener, void *data)
|
|||||||
wl_list_init(&output->layers[i]);
|
wl_list_init(&output->layers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_output_layout_output *l_layout =
|
struct wlr_output_layout_output *l_layout = wlr_output_layout_add_auto(server->output_layout, output->wlr);
|
||||||
wlr_output_layout_add_auto(server->output_layout, output->wlr);
|
struct wlr_scene_output *scene_output = wlr_scene_output_create(server->scene, wlr_output);
|
||||||
struct wlr_scene_output *scene_output =
|
wlr_scene_output_layout_add_output(server->scene_layout, l_layout, scene_output);
|
||||||
wlr_scene_output_create(server->scene, wlr_output);
|
wlr_output_layout_get_box(server->output_layout, output->wlr, &output->geom);
|
||||||
wlr_scene_output_layout_add_output(server->scene_layout, l_layout,
|
|
||||||
scene_output);
|
|
||||||
wlr_output_layout_get_box(server->output_layout, output->wlr,
|
|
||||||
&output->geom);
|
|
||||||
output->usable_area = output->geom;
|
output->usable_area = output->geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,21 +87,14 @@ void new_xdg_toplevel(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
wlr_surface_set_preferred_buffer_scale(toplevel->xdg->base->surface, 1);
|
wlr_surface_set_preferred_buffer_scale(toplevel->xdg->base->surface, 1);
|
||||||
|
|
||||||
LISTEN(toplevel->commit, toplevel_commit,
|
LISTEN(toplevel->commit, toplevel_commit, xdg_toplevel->base->surface->events.commit);
|
||||||
xdg_toplevel->base->surface->events.commit);
|
LISTEN(toplevel->map, toplevel_map, xdg_toplevel->base->surface->events.map);
|
||||||
LISTEN(toplevel->map, toplevel_map,
|
LISTEN(toplevel->unmap, toplevel_unmap, xdg_toplevel->base->surface->events.unmap);
|
||||||
xdg_toplevel->base->surface->events.map);
|
|
||||||
LISTEN(toplevel->unmap, toplevel_unmap,
|
|
||||||
xdg_toplevel->base->surface->events.unmap);
|
|
||||||
LISTEN(toplevel->destroy, toplevel_destroy, xdg_toplevel->events.destroy);
|
LISTEN(toplevel->destroy, toplevel_destroy, xdg_toplevel->events.destroy);
|
||||||
LISTEN(toplevel->request_move, toplevel_request_move,
|
LISTEN(toplevel->request_move, toplevel_request_move, xdg_toplevel->events.request_move);
|
||||||
xdg_toplevel->events.request_move);
|
LISTEN(toplevel->request_resize, toplevel_request_resize, xdg_toplevel->events.request_resize);
|
||||||
LISTEN(toplevel->request_resize, toplevel_request_resize,
|
LISTEN(toplevel->request_maximize, toplevel_request_maximize, xdg_toplevel->events.request_maximize);
|
||||||
xdg_toplevel->events.request_resize);
|
LISTEN(toplevel->request_fullscreen, toplevel_request_fullscreen, xdg_toplevel->events.request_fullscreen);
|
||||||
LISTEN(toplevel->request_maximize, toplevel_request_maximize,
|
|
||||||
xdg_toplevel->events.request_maximize);
|
|
||||||
LISTEN(toplevel->request_fullscreen, toplevel_request_fullscreen,
|
|
||||||
xdg_toplevel->events.request_fullscreen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_xdg_popup(struct wl_listener *listener, void *data)
|
void new_xdg_popup(struct wl_listener *listener, void *data)
|
||||||
@@ -113,8 +102,7 @@ void new_xdg_popup(struct wl_listener *listener, void *data)
|
|||||||
absn_server *server = wl_container_of(listener, server, new_xdg_popup);
|
absn_server *server = wl_container_of(listener, server, new_xdg_popup);
|
||||||
struct wlr_xdg_popup *xdg_popup = data;
|
struct wlr_xdg_popup *xdg_popup = data;
|
||||||
|
|
||||||
struct wlr_xdg_surface *parent =
|
struct wlr_xdg_surface *parent = wlr_xdg_surface_try_from_wlr_surface(xdg_popup->parent);
|
||||||
wlr_xdg_surface_try_from_wlr_surface(xdg_popup->parent);
|
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -127,8 +115,7 @@ void new_xdg_popup(struct wl_listener *listener, void *data)
|
|||||||
popup->parent_type = TOPLEVEL_XDG;
|
popup->parent_type = TOPLEVEL_XDG;
|
||||||
popup->parent = toplevel;
|
popup->parent = toplevel;
|
||||||
|
|
||||||
LISTEN(popup->commit, xdg_popup_commit,
|
LISTEN(popup->commit, xdg_popup_commit, xdg_popup->base->surface->events.commit);
|
||||||
xdg_popup->base->surface->events.commit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_xdg_decoration(struct wl_listener *listener, void *data)
|
void new_xdg_decoration(struct wl_listener *listener, void *data)
|
||||||
@@ -138,8 +125,7 @@ void new_xdg_decoration(struct wl_listener *listener, void *data)
|
|||||||
absn_toplevel *toplevel = deco->toplevel->base->data;
|
absn_toplevel *toplevel = deco->toplevel->base->data;
|
||||||
toplevel->deco = deco;
|
toplevel->deco = deco;
|
||||||
|
|
||||||
LISTEN(toplevel->deco_request_mode, deco_request_mode,
|
LISTEN(toplevel->deco_request_mode, deco_request_mode, deco->events.request_mode);
|
||||||
deco->events.request_mode);
|
|
||||||
LISTEN(toplevel->deco_destroy, deco_destroy, deco->events.destroy);
|
LISTEN(toplevel->deco_destroy, deco_destroy, deco->events.destroy);
|
||||||
|
|
||||||
/* Forse server side decoration mode */
|
/* Forse server side decoration mode */
|
||||||
@@ -157,32 +143,21 @@ void new_layer_surface(struct wl_listener *listener, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
absn_layer_surface *layer_surface = calloc(1, sizeof(*layer_surface));
|
absn_layer_surface *layer_surface = calloc(1, sizeof(*layer_surface));
|
||||||
|
layer_surface->server = server;
|
||||||
LISTEN(layer_surface->unmap, layer_surface_unmap,
|
|
||||||
surface->surface->events.unmap);
|
|
||||||
LISTEN(layer_surface->commit, layer_surface_commit,
|
|
||||||
surface->surface->events.commit);
|
|
||||||
LISTEN(layer_surface->new_popup, layer_surface_new_popup,
|
|
||||||
surface->events.new_popup);
|
|
||||||
LISTEN(layer_surface->destroy, layer_surface_destroy,
|
|
||||||
surface->surface->events.destroy);
|
|
||||||
|
|
||||||
layer_surface->wlr = surface;
|
layer_surface->wlr = surface;
|
||||||
layer_surface->output = surface->output->data;
|
layer_surface->output = surface->output->data;
|
||||||
|
|
||||||
struct wlr_scene_tree *scene_layer =
|
LISTEN(layer_surface->unmap, layer_surface_unmap, surface->surface->events.unmap);
|
||||||
server->layers[layermap[surface->pending.layer]];
|
LISTEN(layer_surface->commit, layer_surface_commit, surface->surface->events.commit);
|
||||||
layer_surface->scene_layer =
|
LISTEN(layer_surface->new_popup, layer_surface_new_popup, surface->events.new_popup);
|
||||||
wlr_scene_layer_surface_v1_create(scene_layer, surface);
|
LISTEN(layer_surface->destroy, layer_surface_destroy, surface->events.destroy);
|
||||||
|
|
||||||
|
struct wlr_scene_tree *scene_layer = server->layers[layermap[surface->pending.layer]];
|
||||||
|
layer_surface->scene_layer = wlr_scene_layer_surface_v1_create(scene_layer, surface);
|
||||||
layer_surface->scene_tree = layer_surface->scene_layer->tree;
|
layer_surface->scene_tree = layer_surface->scene_layer->tree;
|
||||||
|
layer_surface->popups = wlr_scene_tree_create(surface->current.layer < ZWLR_LAYER_SHELL_V1_LAYER_TOP ? server->layers[LAYER_TOP] : scene_layer);
|
||||||
|
|
||||||
layer_surface->popups = wlr_scene_tree_create(
|
wl_list_insert(&layer_surface->output->layers[surface->pending.layer], &layer_surface->link);
|
||||||
surface->current.layer < ZWLR_LAYER_SHELL_V1_LAYER_TOP
|
|
||||||
? server->layers[LAYER_TOP]
|
|
||||||
: scene_layer);
|
|
||||||
|
|
||||||
wl_list_insert(&layer_surface->output->layers[surface->pending.layer],
|
|
||||||
&layer_surface->link);
|
|
||||||
wlr_surface_send_enter(surface->surface, surface->output);
|
wlr_surface_send_enter(surface->surface, surface->output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,13 +170,9 @@ void xwayland_ready(struct wl_listener *listener, void *data)
|
|||||||
wlr_xwayland_set_seat(server->xwayland, server->seat);
|
wlr_xwayland_set_seat(server->xwayland, server->seat);
|
||||||
|
|
||||||
struct wlr_xcursor *xcursor;
|
struct wlr_xcursor *xcursor;
|
||||||
if ((xcursor = wlr_xcursor_manager_get_xcursor(server->cursor_mgr,
|
if ((xcursor = wlr_xcursor_manager_get_xcursor(server->cursor_mgr, "default", 1))) {
|
||||||
"default", 1))) {
|
struct wlr_buffer *buffer = wlr_xcursor_image_get_buffer(xcursor->images[0]);
|
||||||
struct wlr_buffer *buffer =
|
wlr_xwayland_set_cursor(server->xwayland, buffer, xcursor->images[0]->hotspot_x, xcursor->images[0]->hotspot_y);
|
||||||
wlr_xcursor_image_get_buffer(xcursor->images[0]);
|
|
||||||
wlr_xwayland_set_cursor(server->xwayland, buffer,
|
|
||||||
xcursor->images[0]->hotspot_x,
|
|
||||||
xcursor->images[0]->hotspot_y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,21 +189,14 @@ void xwayland_new_surface(struct wl_listener *listener, void *data)
|
|||||||
surface->data = toplevel;
|
surface->data = toplevel;
|
||||||
|
|
||||||
LISTEN(toplevel->destroy, toplevel_destroy, surface->events.destroy);
|
LISTEN(toplevel->destroy, toplevel_destroy, surface->events.destroy);
|
||||||
LISTEN(toplevel->request_maximize, toplevel_request_maximize,
|
LISTEN(toplevel->request_maximize, toplevel_request_maximize, surface->events.request_maximize);
|
||||||
surface->events.request_maximize);
|
LISTEN(toplevel->request_fullscreen, toplevel_request_fullscreen, surface->events.request_fullscreen);
|
||||||
LISTEN(toplevel->request_fullscreen, toplevel_request_fullscreen,
|
|
||||||
surface->events.request_fullscreen);
|
|
||||||
|
|
||||||
LISTEN(toplevel->xw_activate, xwayland_activate,
|
LISTEN(toplevel->xw_activate, xwayland_activate, surface->events.request_activate);
|
||||||
surface->events.request_activate);
|
LISTEN(toplevel->xw_associate, xwayland_associate, surface->events.associate);
|
||||||
LISTEN(toplevel->xw_associate, xwayland_associate,
|
LISTEN(toplevel->xw_dissociate, xwayland_dissociate, surface->events.dissociate);
|
||||||
surface->events.associate);
|
LISTEN(toplevel->xw_configure, xwayland_configure, surface->events.request_configure);
|
||||||
LISTEN(toplevel->xw_dissociate, xwayland_dissociate,
|
LISTEN(toplevel->xw_set_hints, xwayland_set_hints, surface->events.set_hints);
|
||||||
surface->events.dissociate);
|
|
||||||
LISTEN(toplevel->xw_configure, xwayland_configure,
|
|
||||||
surface->events.request_configure);
|
|
||||||
LISTEN(toplevel->xw_set_hints, xwayland_set_hints,
|
|
||||||
surface->events.set_hints);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -241,8 +205,7 @@ void cursor_motion(struct wl_listener *listener, void *data)
|
|||||||
absn_server *server = wl_container_of(listener, server, cursor_motion);
|
absn_server *server = wl_container_of(listener, server, cursor_motion);
|
||||||
struct wlr_pointer_motion_event *event = data;
|
struct wlr_pointer_motion_event *event = data;
|
||||||
update_focused_output(server);
|
update_focused_output(server);
|
||||||
wlr_cursor_move(server->cursor, &event->pointer->base, event->delta_x,
|
wlr_cursor_move(server->cursor, &event->pointer->base, event->delta_x, event->delta_y);
|
||||||
event->delta_y);
|
|
||||||
process_cursor_motion(server, event->time_msec);
|
process_cursor_motion(server, event->time_msec);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,8 +214,7 @@ void cursor_motion_abs(struct wl_listener *listener, void *data)
|
|||||||
absn_server *server = wl_container_of(listener, server, cursor_motion_abs);
|
absn_server *server = wl_container_of(listener, server, cursor_motion_abs);
|
||||||
struct wlr_pointer_motion_absolute_event *event = data;
|
struct wlr_pointer_motion_absolute_event *event = data;
|
||||||
update_focused_output(server);
|
update_focused_output(server);
|
||||||
wlr_cursor_warp_absolute(server->cursor, &event->pointer->base, event->x,
|
wlr_cursor_warp_absolute(server->cursor, &event->pointer->base, event->x, event->y);
|
||||||
event->y);
|
|
||||||
process_cursor_motion(server, event->time_msec);
|
process_cursor_motion(server, event->time_msec);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,8 +229,7 @@ void cursor_button(struct wl_listener *listener, void *data)
|
|||||||
} else {
|
} else {
|
||||||
double sx, sy;
|
double sx, sy;
|
||||||
struct wlr_surface *surface = NULL;
|
struct wlr_surface *surface = NULL;
|
||||||
absn_toplevel *toplevel = toplevel_at(
|
absn_toplevel *toplevel = toplevel_at(server, server->cursor->x, server->cursor->y, &surface, &sx, &sy);
|
||||||
server, server->cursor->x, server->cursor->y, &surface, &sx, &sy);
|
|
||||||
|
|
||||||
if (!toplevel) {
|
if (!toplevel) {
|
||||||
goto handle;
|
goto handle;
|
||||||
@@ -279,8 +240,7 @@ void cursor_button(struct wl_listener *listener, void *data)
|
|||||||
if (mods & CURSOR_MOD) {
|
if (mods & CURSOR_MOD) {
|
||||||
if (event->button == CURSOR_MOVE_BUTTON) {
|
if (event->button == CURSOR_MOVE_BUTTON) {
|
||||||
server->cursor_mode = CURSOR_MOVE;
|
server->cursor_mode = CURSOR_MOVE;
|
||||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr,
|
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "all-scroll");
|
||||||
"all-scroll");
|
|
||||||
handled = true;
|
handled = true;
|
||||||
} else if (event->button == CURSOR_RESIZE_BUTTON) {
|
} else if (event->button == CURSOR_RESIZE_BUTTON) {
|
||||||
server->cursor_mode = CURSOR_RESIZE;
|
server->cursor_mode = CURSOR_RESIZE;
|
||||||
@@ -306,25 +266,18 @@ void cursor_button(struct wl_listener *listener, void *data)
|
|||||||
int32_t width = toplevel->xdg->base->geometry.width;
|
int32_t width = toplevel->xdg->base->geometry.width;
|
||||||
int32_t height = toplevel->xdg->base->geometry.height;
|
int32_t height = toplevel->xdg->base->geometry.height;
|
||||||
|
|
||||||
if (server->grab_x > (lx + width / 2) &&
|
if (server->grab_x > (lx + width / 2) && server->grab_y > (ly + height / 2)) {
|
||||||
server->grab_y > (ly + height / 2)) {
|
|
||||||
server->resize_corner = BOTTOM_RIGHT;
|
server->resize_corner = BOTTOM_RIGHT;
|
||||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr,
|
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "se-resize");
|
||||||
"se-resize");
|
} else if (server->grab_x < (lx + width / 2) && server->grab_y > (ly + height / 2)) {
|
||||||
} else if (server->grab_x < (lx + width / 2) &&
|
|
||||||
server->grab_y > (ly + height / 2)) {
|
|
||||||
server->resize_corner = BOTTOM_LEFT;
|
server->resize_corner = BOTTOM_LEFT;
|
||||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr,
|
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "sw-resize");
|
||||||
"sw-resize");
|
} else if (server->grab_x > (lx + width / 2) && server->grab_y < (ly + height / 2)) {
|
||||||
} else if (server->grab_x > (lx + width / 2) &&
|
|
||||||
server->grab_y < (ly + height / 2)) {
|
|
||||||
server->resize_corner = TOP_RIGHT;
|
server->resize_corner = TOP_RIGHT;
|
||||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr,
|
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "ne-resize");
|
||||||
"ne-resize");
|
|
||||||
} else {
|
} else {
|
||||||
server->resize_corner = TOP_LEFT;
|
server->resize_corner = TOP_LEFT;
|
||||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr,
|
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "nw-resize");
|
||||||
"nw-resize");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_xdg_toplevel_set_resizing(toplevel->xdg, true);
|
wlr_xdg_toplevel_set_resizing(toplevel->xdg, true);
|
||||||
@@ -332,8 +285,7 @@ void cursor_button(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
handle:
|
handle:
|
||||||
if (!handled) {
|
if (!handled) {
|
||||||
wlr_seat_pointer_notify_button(server->seat, event->time_msec,
|
wlr_seat_pointer_notify_button(server->seat, event->time_msec, event->button, event->state);
|
||||||
event->button, event->state);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,9 +293,7 @@ void cursor_axis(struct wl_listener *listener, void *data)
|
|||||||
{
|
{
|
||||||
absn_server *server = wl_container_of(listener, server, cursor_axis);
|
absn_server *server = wl_container_of(listener, server, cursor_axis);
|
||||||
struct wlr_pointer_axis_event *event = data;
|
struct wlr_pointer_axis_event *event = data;
|
||||||
wlr_seat_pointer_notify_axis(
|
wlr_seat_pointer_notify_axis(server->seat, event->time_msec, event->orientation, event->delta, event->delta_discrete, event->source, event->relative_direction);
|
||||||
server->seat, event->time_msec, event->orientation, event->delta,
|
|
||||||
event->delta_discrete, event->source, event->relative_direction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cursor_frame(struct wl_listener *listener, void *data)
|
void cursor_frame(struct wl_listener *listener, void *data)
|
||||||
@@ -361,19 +311,16 @@ static void new_keyboard(absn_server *server, struct wlr_input_device *device)
|
|||||||
keyboard->wlr = wlr_keyboard;
|
keyboard->wlr = wlr_keyboard;
|
||||||
|
|
||||||
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
struct xkb_keymap *keymap =
|
struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
xkb_keymap_new_from_names(context, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
|
||||||
|
|
||||||
wlr_keyboard_set_keymap(wlr_keyboard, keymap);
|
wlr_keyboard_set_keymap(wlr_keyboard, keymap);
|
||||||
xkb_keymap_unref(keymap);
|
xkb_keymap_unref(keymap);
|
||||||
xkb_context_unref(context);
|
xkb_context_unref(context);
|
||||||
wlr_keyboard_set_repeat_info(wlr_keyboard, 25, 600);
|
wlr_keyboard_set_repeat_info(wlr_keyboard, 25, 600);
|
||||||
|
|
||||||
LISTEN(keyboard->modifiers, handle_modifiers,
|
LISTEN(keyboard->modifiers, handle_modifiers, wlr_keyboard->events.modifiers);
|
||||||
wlr_keyboard->events.modifiers);
|
|
||||||
LISTEN(keyboard->key, handle_key, wlr_keyboard->events.key);
|
LISTEN(keyboard->key, handle_key, wlr_keyboard->events.key);
|
||||||
LISTEN(keyboard->destroy, handle_destroy,
|
LISTEN(keyboard->destroy, handle_destroy, wlr_keyboard->base.events.destroy);
|
||||||
wlr_keyboard->base.events.destroy);
|
|
||||||
|
|
||||||
wlr_seat_set_keyboard(server->seat, wlr_keyboard);
|
wlr_seat_set_keyboard(server->seat, wlr_keyboard);
|
||||||
|
|
||||||
|
|||||||
+9
-20
@@ -15,15 +15,10 @@ void toplevel_map(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
toplevel->scene_tree = wlr_scene_tree_create(server->layers[LAYER_TILE]);
|
toplevel->scene_tree = wlr_scene_tree_create(server->layers[LAYER_TILE]);
|
||||||
toplevel->scene_tree->node.data = toplevel;
|
toplevel->scene_tree->node.data = toplevel;
|
||||||
wlr_scene_node_set_enabled(&toplevel->scene_tree->node,
|
wlr_scene_node_set_enabled(&toplevel->scene_tree->node, toplevel_is_unmanaged(toplevel));
|
||||||
toplevel_is_unmanaged(toplevel));
|
|
||||||
|
|
||||||
if (toplevel->type != TOPLEVEL_X11 &&
|
if (toplevel->type != TOPLEVEL_X11 && wl_resource_get_version(toplevel->xdg->resource) >= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) {
|
||||||
wl_resource_get_version(toplevel->xdg->resource) >=
|
wlr_xdg_toplevel_set_tiled(toplevel->xdg, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT);
|
||||||
XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) {
|
|
||||||
wlr_xdg_toplevel_set_tiled(toplevel->xdg,
|
|
||||||
WLR_EDGE_TOP | WLR_EDGE_BOTTOM |
|
|
||||||
WLR_EDGE_LEFT | WLR_EDGE_RIGHT);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_xdg_toplevel_set_maximized(toplevel->xdg, true);
|
wlr_xdg_toplevel_set_maximized(toplevel->xdg, true);
|
||||||
}
|
}
|
||||||
@@ -32,13 +27,11 @@ void toplevel_map(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (toplevel->type == TOPLEVEL_X11) {
|
if (toplevel->type == TOPLEVEL_X11) {
|
||||||
toplevel->scene_surface = wlr_scene_subsurface_tree_create(
|
toplevel->scene_surface = wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xw->surface);
|
||||||
toplevel->scene_tree, toplevel->xw->surface);
|
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
toplevel->scene_surface = wlr_scene_xdg_surface_create(
|
toplevel->scene_surface = wlr_scene_xdg_surface_create(toplevel->scene_tree, toplevel->xdg->base);
|
||||||
toplevel->scene_tree, toplevel->xdg->base);
|
|
||||||
}
|
}
|
||||||
toplevel->scene_surface->node.data = toplevel;
|
toplevel->scene_surface->node.data = toplevel;
|
||||||
|
|
||||||
@@ -46,8 +39,7 @@ void toplevel_map(struct wl_listener *listener, void *data)
|
|||||||
toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW;
|
toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW;
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
toplevel->border[i] =
|
toplevel->border[i] = wlr_scene_rect_create(toplevel->scene_tree, 0, 0, unfocused_bc);
|
||||||
wlr_scene_rect_create(toplevel->scene_tree, 0, 0, unfocused_bc);
|
|
||||||
toplevel->border[i]->node.data = toplevel;
|
toplevel->border[i]->node.data = toplevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,8 +119,7 @@ void toplevel_request_move(struct wl_listener *listener, void *data)
|
|||||||
void toplevel_request_resize(struct wl_listener *listener, void *data)
|
void toplevel_request_resize(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_toplevel *toplevel =
|
absn_toplevel *toplevel = wl_container_of(listener, toplevel, request_resize);
|
||||||
wl_container_of(listener, toplevel, request_resize);
|
|
||||||
if (toplevel->xdg->base->initialized) {
|
if (toplevel->xdg->base->initialized) {
|
||||||
wlr_xdg_surface_schedule_configure(toplevel->xdg->base);
|
wlr_xdg_surface_schedule_configure(toplevel->xdg->base);
|
||||||
}
|
}
|
||||||
@@ -137,8 +128,7 @@ void toplevel_request_resize(struct wl_listener *listener, void *data)
|
|||||||
void toplevel_request_maximize(struct wl_listener *listener, void *data)
|
void toplevel_request_maximize(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_toplevel *toplevel =
|
absn_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize);
|
||||||
wl_container_of(listener, toplevel, request_maximize);
|
|
||||||
if (toplevel->xdg->base->initialized) {
|
if (toplevel->xdg->base->initialized) {
|
||||||
wlr_xdg_surface_schedule_configure(toplevel->xdg->base);
|
wlr_xdg_surface_schedule_configure(toplevel->xdg->base);
|
||||||
}
|
}
|
||||||
@@ -147,7 +137,6 @@ void toplevel_request_maximize(struct wl_listener *listener, void *data)
|
|||||||
void toplevel_request_fullscreen(struct wl_listener *listener, void *data)
|
void toplevel_request_fullscreen(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_toplevel *toplevel =
|
absn_toplevel *toplevel = wl_container_of(listener, toplevel, request_fullscreen);
|
||||||
wl_container_of(listener, toplevel, request_fullscreen);
|
|
||||||
toplevel_set_fullscreen(toplevel, toplevel->xdg->requested.fullscreen);
|
toplevel_set_fullscreen(toplevel, toplevel->xdg->requested.fullscreen);
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-36
@@ -12,11 +12,9 @@
|
|||||||
* its surface and coordinates inside of it
|
* its surface and coordinates inside of it
|
||||||
* to process input event
|
* to process input event
|
||||||
*/
|
*/
|
||||||
absn_toplevel *toplevel_at(absn_server *server, double lx, double ly,
|
absn_toplevel *toplevel_at(absn_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy)
|
||||||
struct wlr_surface **surface, double *sx, double *sy)
|
|
||||||
{
|
{
|
||||||
struct wlr_scene_node *node =
|
struct wlr_scene_node *node = wlr_scene_node_at(&server->scene->tree.node, lx, ly, sx, sy);
|
||||||
wlr_scene_node_at(&server->scene->tree.node, lx, ly, sx, sy);
|
|
||||||
if (!node) {
|
if (!node) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -34,7 +32,7 @@ absn_toplevel *toplevel_at(absn_server *server, double lx, double ly,
|
|||||||
|
|
||||||
*surface = scene_surface->surface;
|
*surface = scene_surface->surface;
|
||||||
struct wlr_scene_tree *tree = node->parent;
|
struct wlr_scene_tree *tree = node->parent;
|
||||||
while (tree != NULL && tree->node.data == NULL) {
|
while (tree && !tree->node.data) {
|
||||||
tree = tree->node.parent;
|
tree = tree->node.parent;
|
||||||
}
|
}
|
||||||
return tree->node.data;
|
return tree->node.data;
|
||||||
@@ -82,28 +80,22 @@ static void toplevel_update_borders_geom(absn_toplevel *toplevel)
|
|||||||
{
|
{
|
||||||
int32_t bw = toplevel->bw;
|
int32_t bw = toplevel->bw;
|
||||||
|
|
||||||
if (toplevel->geom.width - 2 * bw < 0 ||
|
if (toplevel->geom.width - 2 * bw < 0 || toplevel->geom.height - 2 * bw < 0) {
|
||||||
toplevel->geom.height - 2 * bw < 0) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_scene_node_set_position(&toplevel->scene_tree->node, toplevel->geom.x,
|
wlr_scene_node_set_position(&toplevel->scene_tree->node, toplevel->geom.x, toplevel->geom.y);
|
||||||
toplevel->geom.y);
|
|
||||||
wlr_scene_node_set_position(&toplevel->scene_surface->node, bw, bw);
|
wlr_scene_node_set_position(&toplevel->scene_surface->node, bw, bw);
|
||||||
|
|
||||||
wlr_scene_rect_set_size(toplevel->border[0], toplevel->geom.width - 2 * bw,
|
wlr_scene_rect_set_size(toplevel->border[0], toplevel->geom.width - 2 * bw, bw);
|
||||||
bw);
|
wlr_scene_rect_set_size(toplevel->border[1], toplevel->geom.width - 2 * bw, bw);
|
||||||
wlr_scene_rect_set_size(toplevel->border[1], toplevel->geom.width - 2 * bw,
|
|
||||||
bw);
|
|
||||||
wlr_scene_rect_set_size(toplevel->border[2], bw, toplevel->geom.height);
|
wlr_scene_rect_set_size(toplevel->border[2], bw, toplevel->geom.height);
|
||||||
wlr_scene_rect_set_size(toplevel->border[3], bw, toplevel->geom.height);
|
wlr_scene_rect_set_size(toplevel->border[3], bw, toplevel->geom.height);
|
||||||
|
|
||||||
wlr_scene_node_set_position(&toplevel->border[0]->node, bw, 0);
|
wlr_scene_node_set_position(&toplevel->border[0]->node, bw, 0);
|
||||||
wlr_scene_node_set_position(&toplevel->border[1]->node, bw,
|
wlr_scene_node_set_position(&toplevel->border[1]->node, bw, toplevel->geom.height - bw);
|
||||||
toplevel->geom.height - bw);
|
|
||||||
wlr_scene_node_set_position(&toplevel->border[2]->node, 0, 0);
|
wlr_scene_node_set_position(&toplevel->border[2]->node, 0, 0);
|
||||||
wlr_scene_node_set_position(&toplevel->border[3]->node,
|
wlr_scene_node_set_position(&toplevel->border[3]->node, toplevel->geom.width - bw, 0);
|
||||||
toplevel->geom.width - bw, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void toplevel_set_pos(absn_toplevel *toplevel, int32_t x, int32_t y)
|
void toplevel_set_pos(absn_toplevel *toplevel, int32_t x, int32_t y)
|
||||||
@@ -115,8 +107,7 @@ void toplevel_set_pos(absn_toplevel *toplevel, int32_t x, int32_t y)
|
|||||||
|
|
||||||
void toplevel_set_size(absn_toplevel *toplevel, int32_t width, int32_t height)
|
void toplevel_set_size(absn_toplevel *toplevel, int32_t width, int32_t height)
|
||||||
{
|
{
|
||||||
if (width <= 2 * toplevel->bw || height <= 2 * toplevel->bw ||
|
if (width <= 2 * toplevel->bw || height <= 2 * toplevel->bw || (width == toplevel->geom.width && height == toplevel->geom.height)) {
|
||||||
(width == toplevel->geom.width && height == toplevel->geom.height)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
toplevel->geom.width = width;
|
toplevel->geom.width = width;
|
||||||
@@ -134,18 +125,14 @@ void toplevel_set_size(absn_toplevel *toplevel, int32_t width, int32_t height)
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (toplevel->type == TOPLEVEL_XDG) {
|
if (toplevel->type == TOPLEVEL_XDG) {
|
||||||
if (wl_resource_get_version(toplevel->xdg->resource) >=
|
if (wl_resource_get_version(toplevel->xdg->resource) >= XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION) {
|
||||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION) {
|
|
||||||
wlr_xdg_toplevel_set_bounds(toplevel->xdg, width, height);
|
wlr_xdg_toplevel_set_bounds(toplevel->xdg, width, height);
|
||||||
}
|
}
|
||||||
toplevel->resizing = wlr_xdg_toplevel_set_size(
|
toplevel->resizing = wlr_xdg_toplevel_set_size(toplevel->xdg, width - 2 * bw, height - 2 * bw);
|
||||||
toplevel->xdg, width - 2 * bw, height - 2 * bw);
|
|
||||||
}
|
}
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
else if (toplevel->type == TOPLEVEL_X11) {
|
else if (toplevel->type == TOPLEVEL_X11) {
|
||||||
wlr_xwayland_surface_configure(toplevel->xw, toplevel->geom.x,
|
wlr_xwayland_surface_configure(toplevel->xw, toplevel->geom.x, toplevel->geom.y, width - 2 * bw, height - 2 * toplevel->bw);
|
||||||
toplevel->geom.y, width - 2 * bw,
|
|
||||||
height - 2 * toplevel->bw);
|
|
||||||
/* manually update position */
|
/* manually update position */
|
||||||
toplevel_set_pos(toplevel, toplevel->geom.x, toplevel->geom.y);
|
toplevel_set_pos(toplevel, toplevel->geom.x, toplevel->geom.y);
|
||||||
}
|
}
|
||||||
@@ -169,11 +156,9 @@ void toplevel_set_floating(absn_toplevel *toplevel, bool floating)
|
|||||||
toplevel->floating = floating;
|
toplevel->floating = floating;
|
||||||
|
|
||||||
if (floating) {
|
if (floating) {
|
||||||
wlr_scene_node_reparent(&toplevel->scene_tree->node,
|
wlr_scene_node_reparent(&toplevel->scene_tree->node, toplevel->server->layers[LAYER_FLOAT]);
|
||||||
toplevel->server->layers[LAYER_FLOAT]);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_scene_node_reparent(&toplevel->scene_tree->node,
|
wlr_scene_node_reparent(&toplevel->scene_tree->node, toplevel->server->layers[LAYER_TILE]);
|
||||||
toplevel->server->layers[LAYER_TILE]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
layout_arrange(toplevel->output);
|
layout_arrange(toplevel->output);
|
||||||
@@ -194,17 +179,14 @@ void toplevel_set_fullscreen(absn_toplevel *toplevel, bool fullscreen)
|
|||||||
toplevel->bw = 0;
|
toplevel->bw = 0;
|
||||||
toplevel_set_geom(toplevel, &output->geom);
|
toplevel_set_geom(toplevel, &output->geom);
|
||||||
|
|
||||||
wlr_scene_node_reparent(&toplevel->scene_tree->node,
|
wlr_scene_node_reparent(&toplevel->scene_tree->node, toplevel->server->layers[LAYER_FULLSCREEN]);
|
||||||
toplevel->server->layers[LAYER_FULLSCREEN]);
|
|
||||||
} else {
|
} else {
|
||||||
toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW;
|
toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW;
|
||||||
toplevel_set_geom(toplevel, &toplevel->prev_geom);
|
toplevel_set_geom(toplevel, &toplevel->prev_geom);
|
||||||
if (toplevel->floating) {
|
if (toplevel->floating) {
|
||||||
wlr_scene_node_reparent(&toplevel->scene_tree->node,
|
wlr_scene_node_reparent(&toplevel->scene_tree->node, toplevel->server->layers[LAYER_FLOAT]);
|
||||||
toplevel->server->layers[LAYER_FLOAT]);
|
|
||||||
} else {
|
} else {
|
||||||
wlr_scene_node_reparent(&toplevel->scene_tree->node,
|
wlr_scene_node_reparent(&toplevel->scene_tree->node, toplevel->server->layers[LAYER_TILE]);
|
||||||
toplevel->server->layers[LAYER_TILE]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,11 +5,9 @@
|
|||||||
void deco_request_mode(struct wl_listener *listener, void *data)
|
void deco_request_mode(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_toplevel *toplevel =
|
absn_toplevel *toplevel = wl_container_of(listener, toplevel, deco_request_mode);
|
||||||
wl_container_of(listener, toplevel, deco_request_mode);
|
|
||||||
if (toplevel->xdg->base->initialized) {
|
if (toplevel->xdg->base->initialized) {
|
||||||
wlr_xdg_toplevel_decoration_v1_set_mode(
|
wlr_xdg_toplevel_decoration_v1_set_mode(toplevel->deco, WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
||||||
toplevel->deco, WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-10
@@ -21,15 +21,13 @@ void xwayland_associate(struct wl_listener *listener, void *data)
|
|||||||
absn_toplevel *toplevel = wl_container_of(listener, toplevel, xw_associate);
|
absn_toplevel *toplevel = wl_container_of(listener, toplevel, xw_associate);
|
||||||
|
|
||||||
LISTEN(toplevel->map, toplevel_map, toplevel->xw->surface->events.map);
|
LISTEN(toplevel->map, toplevel_map, toplevel->xw->surface->events.map);
|
||||||
LISTEN(toplevel->unmap, toplevel_unmap,
|
LISTEN(toplevel->unmap, toplevel_unmap, toplevel->xw->surface->events.unmap);
|
||||||
toplevel->xw->surface->events.unmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void xwayland_dissociate(struct wl_listener *listener, void *data)
|
void xwayland_dissociate(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
UNUSED(data);
|
UNUSED(data);
|
||||||
absn_toplevel *toplevel =
|
absn_toplevel *toplevel = wl_container_of(listener, toplevel, xw_dissociate);
|
||||||
wl_container_of(listener, toplevel, xw_dissociate);
|
|
||||||
|
|
||||||
wl_list_remove(&toplevel->map.link);
|
wl_list_remove(&toplevel->map.link);
|
||||||
wl_list_remove(&toplevel->unmap.link);
|
wl_list_remove(&toplevel->unmap.link);
|
||||||
@@ -42,16 +40,13 @@ void xwayland_configure(struct wl_listener *listener, void *data)
|
|||||||
struct wlr_xwayland_surface_configure_event *event = data;
|
struct wlr_xwayland_surface_configure_event *event = data;
|
||||||
|
|
||||||
if (!toplevel->xw->surface || !toplevel->xw->surface->mapped) {
|
if (!toplevel->xw->surface || !toplevel->xw->surface->mapped) {
|
||||||
wlr_xwayland_surface_configure(toplevel->xw, event->x, event->y,
|
wlr_xwayland_surface_configure(toplevel->xw, event->x, event->y, event->width, event->height);
|
||||||
event->width, event->height);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toplevel_is_unmanaged(toplevel)) {
|
if (toplevel_is_unmanaged(toplevel)) {
|
||||||
wlr_scene_node_set_position(&toplevel->scene_tree->node, event->x,
|
wlr_scene_node_set_position(&toplevel->scene_tree->node, event->x, event->y);
|
||||||
event->y);
|
wlr_xwayland_surface_configure(toplevel->xw, event->x, event->y, event->width, event->height);
|
||||||
wlr_xwayland_surface_configure(toplevel->xw, event->x, event->y,
|
|
||||||
event->width, event->height);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user