mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-05-06 06:46:54 -04:00
feat: add canvas layout
This commit is contained in:
parent
f94ddc671e
commit
8fb28abdb4
11 changed files with 1327 additions and 100 deletions
|
|
@ -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);
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue