feat: add centerview that centers the viewport on the focused windows and changed fill view to respect gaps

fix: double binding was causing problems with overview and minimap, silly mistake :P
This commit is contained in:
ernestoCruz05 2026-03-29 16:44:53 +01:00
parent 9e2f0fc2b8
commit 7b3705c3d2
5 changed files with 34 additions and 35 deletions

View file

@ -182,6 +182,8 @@ bind=SUPER,o,toggleminimap,
bind=SUPER,p,canvas_overview_toggle, bind=SUPER,p,canvas_overview_toggle,
bind=SUPER,z,canvas_zoom_resize,0.909090909 bind=SUPER,z,canvas_zoom_resize,0.909090909
bind=SUPER,x,canvas_zoom_resize,1.1 bind=SUPER,x,canvas_zoom_resize,1.1
bind=SUPER,u,canvas_fill_viewport,
bind=SUPER,c,canvas_centerview,
# scroller layout # scroller layout
bind=ALT,e,set_proportion,1.0 bind=ALT,e,set_proportion,1.0

View file

@ -139,22 +139,6 @@ KeyBinding default_key_bindings[] = {
CHVT(10), CHVT(10),
CHVT(11), CHVT(11),
CHVT(12), CHVT(12),
{WLR_MODIFIER_LOGO,
{.keysym = XKB_KEY_o, .type = KEY_TYPE_SYM},
toggleminimap,
{0}},
{WLR_MODIFIER_LOGO,
{.keysym = XKB_KEY_p, .type = KEY_TYPE_SYM},
canvas_overview_toggle,
{0}},
{WLR_MODIFIER_LOGO,
{.keysym = XKB_KEY_z, .type = KEY_TYPE_SYM},
canvas_zoom_resize,
{.f = 1.0f / 1.1f}},
{WLR_MODIFIER_LOGO,
{.keysym = XKB_KEY_x, .type = KEY_TYPE_SYM},
canvas_zoom_resize,
{.f = 1.1f}},
}; };
typedef struct { typedef struct {
@ -1240,6 +1224,8 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
func = canvas_overview_toggle; func = canvas_overview_toggle;
} else if (strcmp(func_name, "canvas_fill_viewport") == 0) { } else if (strcmp(func_name, "canvas_fill_viewport") == 0) {
func = canvas_fill_viewport; func = canvas_fill_viewport;
} else if (strcmp(func_name, "canvas_centerview") == 0) {
func = canvas_centerview;
} else { } else {
return NULL; return NULL;
} }

View file

@ -74,4 +74,5 @@ int32_t scroller_stack(const Arg *arg);
int32_t canvas_zoom_resize(const Arg *arg); int32_t canvas_zoom_resize(const Arg *arg);
int32_t canvas_overview_toggle(const Arg *arg); int32_t canvas_overview_toggle(const Arg *arg);
int32_t canvas_fill_viewport(const Arg *arg); int32_t canvas_fill_viewport(const Arg *arg);
int32_t canvas_centerview(const Arg *arg);
int32_t toggle_all_floating(const Arg *arg); int32_t toggle_all_floating(const Arg *arg);

View file

@ -1938,13 +1938,6 @@ int32_t canvas_overview_toggle(const Arg *arg) {
selmon->canvas_overview_closing = true; selmon->canvas_overview_closing = true;
selmon->canvas_overview_anim_start = get_now_in_ms(); selmon->canvas_overview_anim_start = get_now_in_ms();
} else if (!selmon->canvas_overview_visible) { } else if (!selmon->canvas_overview_visible) {
if (selmon->minimap_visible) {
selmon->minimap_visible = false;
if (minimap_scene_tree) {
wlr_scene_node_destroy(&minimap_scene_tree->node);
minimap_scene_tree = NULL;
}
}
selmon->canvas_overview_visible = true; selmon->canvas_overview_visible = true;
selmon->canvas_overview_closing = false; selmon->canvas_overview_closing = false;
selmon->canvas_overview_progress = 0.0f; selmon->canvas_overview_progress = 0.0f;
@ -1954,6 +1947,27 @@ int32_t canvas_overview_toggle(const Arg *arg) {
return 0; return 0;
} }
int32_t canvas_centerview(const Arg *arg) {
if (!selmon || !is_canvas_layout(selmon))
return 0;
Client *c = selmon->sel;
if (!c || c->isfullscreen || c->ismaximizescreen)
return 0;
uint32_t tag = selmon->pertag->curtag;
float zoom = selmon->pertag->canvas_zoom[tag];
float cx = c->canvas_geom[tag].x + c->canvas_geom[tag].width / 2.0f;
float cy = c->canvas_geom[tag].y + c->canvas_geom[tag].height / 2.0f;
selmon->pertag->canvas_pan_x[tag] = cx - (selmon->w.width / zoom) / 2.0f;
selmon->pertag->canvas_pan_y[tag] = cy - (selmon->w.height / zoom) / 2.0f;
canvas_reposition(selmon);
return 0;
}
int32_t canvas_fill_viewport(const Arg *arg) { int32_t canvas_fill_viewport(const Arg *arg) {
if (!selmon || !is_canvas_layout(selmon)) if (!selmon || !is_canvas_layout(selmon))
return 0; return 0;
@ -1967,10 +1981,12 @@ int32_t canvas_fill_viewport(const Arg *arg) {
float pan_x = selmon->pertag->canvas_pan_x[tag]; float pan_x = selmon->pertag->canvas_pan_x[tag];
float pan_y = selmon->pertag->canvas_pan_y[tag]; float pan_y = selmon->pertag->canvas_pan_y[tag];
c->canvas_geom[tag].x = (int32_t)roundf(pan_x); c->canvas_geom[tag].x = (int32_t)roundf(pan_x + config.gappoh / zoom);
c->canvas_geom[tag].y = (int32_t)roundf(pan_y); c->canvas_geom[tag].y = (int32_t)roundf(pan_y + config.gappov / zoom);
c->canvas_geom[tag].width = (int32_t)roundf(selmon->w.width / zoom); c->canvas_geom[tag].width =
c->canvas_geom[tag].height = (int32_t)roundf(selmon->w.height / zoom); (int32_t)roundf((selmon->w.width - 2 * config.gappoh) / zoom);
c->canvas_geom[tag].height =
(int32_t)roundf((selmon->w.height - 2 * config.gappov) / zoom);
c->iscustomsize = 1; c->iscustomsize = 1;
arrange(selmon, false, false); arrange(selmon, false, false);

View file

@ -5036,13 +5036,7 @@ int32_t toggleminimap(const Arg *arg) {
return 0; return 0;
selmon->minimap_visible = !selmon->minimap_visible; selmon->minimap_visible = !selmon->minimap_visible;
if (selmon->minimap_visible) { if (!selmon->minimap_visible) {
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 (minimap_scene_tree) { if (minimap_scene_tree) {
wlr_scene_node_destroy(&minimap_scene_tree->node); wlr_scene_node_destroy(&minimap_scene_tree->node);
minimap_scene_tree = NULL; minimap_scene_tree = NULL;
@ -5134,7 +5128,7 @@ void rendermon(struct wl_listener *listener, void *data) {
// 只有在需要帧时才构建和提交状态 // 只有在需要帧时才构建和提交状态
if (m->minimap_visible && if (m->minimap_visible && !m->canvas_overview_visible &&
m->pertag->ltidxs[m->pertag->curtag]->id == CANVAS) { m->pertag->ltidxs[m->pertag->curtag]->id == CANVAS) {
uint32_t tag = m->pertag->curtag; uint32_t tag = m->pertag->curtag;