feat: add canvas layout

This commit is contained in:
ernestoCruz05 2026-03-21 14:20:55 +00:00
parent f94ddc671e
commit 8fb28abdb4
11 changed files with 1327 additions and 100 deletions

View file

@ -56,6 +56,7 @@ int32_t incohgaps(const Arg *arg);
int32_t incovgaps(const Arg *arg);
int32_t defaultgaps(const Arg *arg);
int32_t togglefakefullscreen(const Arg *arg);
int32_t toggleminimap(const Arg *arg);
int32_t toggleoverlay(const Arg *arg);
int32_t movewin(const Arg *arg);
int32_t resizewin(const Arg *arg);
@ -70,4 +71,6 @@ int32_t disable_monitor(const Arg *arg);
int32_t enable_monitor(const Arg *arg);
int32_t toggle_monitor(const Arg *arg);
int32_t scroller_stack(const Arg *arg);
int32_t canvas_zoom_resize(const Arg *arg);
int32_t canvas_overview_toggle(const Arg *arg);
int32_t toggle_all_floating(const Arg *arg);

View file

@ -374,7 +374,10 @@ int32_t moveresize(const Arg *arg) {
return 0;
}
/* Float the window and tell motionnotify to grab it */
if (grabc->isfloating == 0 && arg->ui == CurMove) {
if (grabc->isfloating == 0 && arg->ui == CurMove &&
!(grabc->mon &&
grabc->mon->pertag->ltidxs[grabc->mon->pertag->curtag]->id ==
CANVAS)) {
grabc->drag_to_tile = true;
exit_scroller_stack(grabc);
setfloating(grabc, 1);
@ -385,15 +388,24 @@ int32_t moveresize(const Arg *arg) {
switch (cursor_mode = arg->ui) {
case CurMove:
grabcx = cursor->x - grabc->geom.x;
grabcy = cursor->y - grabc->geom.y;
if (grabc->mon &&
grabc->mon->pertag->ltidxs[grabc->mon->pertag->curtag]->id ==
CANVAS) {
grabcx = (int32_t)round(cursor->x);
grabcy = (int32_t)round(cursor->y);
} else {
grabcx = cursor->x - grabc->geom.x;
grabcy = cursor->y - grabc->geom.y;
}
wlr_cursor_set_xcursor(cursor, cursor_mgr, "grab");
break;
case CurResize:
/* Doesn't work for X11 output - the next absolute motion event
* returns the cursor to where it started */
if (grabc->isfloating) {
if (grabc->isfloating ||
(grabc->mon &&
grabc->mon->pertag->ltidxs[grabc->mon->pertag->curtag]->id ==
CANVAS)) {
rzcorner = config.drag_corner;
grabcx = (int)round(cursor->x);
grabcy = (int)round(cursor->y);
@ -1013,7 +1025,6 @@ int32_t switch_layout(const Arg *arg) {
len = MAX(strlen(layouts[ji].name), strlen(target_layout_name));
if (strncmp(layouts[ji].name, target_layout_name, len) == 0) {
selmon->pertag->ltidxs[selmon->pertag->curtag] = &layouts[ji];
break;
}
}
@ -1667,6 +1678,10 @@ int32_t toggleoverview(const Arg *arg) {
if (!selmon)
return 0;
Client *fs_ov = focustop(selmon);
if (fs_ov && fs_ov->isfullscreen)
return 0;
if (selmon->isoverview && config.ov_tab_mode && arg->i != 1 &&
selmon->sel) {
focusstack(&(Arg){.i = 1});
@ -1871,6 +1886,56 @@ int32_t scroller_stack(const Arg *arg) {
return 0;
}
int32_t canvas_zoom_resize(const Arg *arg) {
if (!selmon || !is_canvas_layout(selmon))
return 0;
Client *fs = focustop(selmon);
if (fs && fs->isfullscreen)
return 0;
float factor = arg->f;
if (factor <= 0.0f)
return 0;
uint32_t tag = selmon->pertag->curtag;
float old_zoom = selmon->pertag->canvas_zoom[tag];
selmon->pertag->canvas_zoom[tag] *= factor;
selmon->pertag->canvas_zoom[tag] =
CLAMP_FLOAT(selmon->pertag->canvas_zoom[tag], 0.1f, 1.0f);
float new_zoom = selmon->pertag->canvas_zoom[tag];
// Adjust pan so zoom centers on the screen center
float center_canvas_x =
selmon->pertag->canvas_pan_x[tag] + (selmon->w.width / old_zoom) / 2.0f;
float center_canvas_y = selmon->pertag->canvas_pan_y[tag] +
(selmon->w.height / old_zoom) / 2.0f;
selmon->pertag->canvas_pan_x[tag] =
center_canvas_x - (selmon->w.width / new_zoom) / 2.0f;
selmon->pertag->canvas_pan_y[tag] =
center_canvas_y - (selmon->w.height / new_zoom) / 2.0f;
canvas_reposition(selmon);
return 0;
}
int32_t canvas_overview_toggle(const Arg *arg) {
if (!selmon || !is_canvas_layout(selmon))
return 0;
if (selmon->canvas_overview_visible && !selmon->canvas_overview_closing) {
selmon->canvas_overview_closing = true;
selmon->canvas_overview_anim_start = get_now_in_ms();
} else if (!selmon->canvas_overview_visible) {
selmon->canvas_overview_visible = true;
selmon->canvas_overview_closing = false;
selmon->canvas_overview_progress = 0.0f;
selmon->canvas_overview_anim_start = get_now_in_ms();
}
request_fresh_all_monitors();
return 0;
}
int32_t toggle_all_floating(const Arg *arg) {
if (!selmon || !selmon->sel)
return 0;