mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-05-02 06:46:29 -04:00
Merge branch 'mangowm:main' into touch-patched
This commit is contained in:
commit
8d719a4b00
10 changed files with 106 additions and 41 deletions
|
|
@ -137,7 +137,7 @@ And then rebuild your system.
|
|||
## Other
|
||||
|
||||
```bash
|
||||
git clone -b 0.19.2 https://gitlab.freedesktop.org/wlroots/wlroots.git
|
||||
git clone -b 0.19.3 https://gitlab.freedesktop.org/wlroots/wlroots.git
|
||||
cd wlroots
|
||||
meson build -Dprefix=/usr
|
||||
sudo ninja -C build install
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ bindr=Super,Super_L,spawn,rofi -show run
|
|||
| :--- | :--- | :--- |
|
||||
| `killclient` | - | Close the focused window. |
|
||||
| `togglefloating` | - | Toggle floating state. |
|
||||
| `toggle_all_floating` | - | Toggle all visible clients floating state. |
|
||||
| `togglefullscreen` | - | Toggle fullscreen. |
|
||||
| `togglefakefullscreen` | - | Toggle "fake" fullscreen (remains constrained). |
|
||||
| `togglemaximizescreen` | - | Maximize window (keep decoration/bar). |
|
||||
|
|
@ -194,6 +195,16 @@ bind=NONE,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_SINK@ toggle
|
|||
bind=SHIFT,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_SOURCE@ toggle
|
||||
```
|
||||
|
||||
#### Playback
|
||||
|
||||
Requires: `playerctl`
|
||||
|
||||
```ini
|
||||
bind=NONE,XF86AudioNext,spawn,playerctl next
|
||||
bind=NONE,XF86AudioPrev,spawn,playerctl previous
|
||||
bind=NONE,XF86AudioPlay,spawn,playerctl play-pause
|
||||
```
|
||||
|
||||
### Floating Window Movement
|
||||
|
||||
| Command | Param | Description |
|
||||
|
|
@ -201,4 +212,4 @@ bind=SHIFT,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_SOURCE@ toggle
|
|||
| `smartmovewin` | `left/right/up/down` | Move floating window by snap distance. |
|
||||
| `smartresizewin` | `left/right/up/down` | Resize floating window by snap distance. |
|
||||
| `movewin` | `(x,y)` | Move floating window. |
|
||||
| `resizewin` | `(width,height)` | Resize window. |
|
||||
| `resizewin` | `(width,height)` | Resize window. |
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ You will need to build `wlroots` and `scenefx` manually as well.
|
|||
1. **Build wlroots**
|
||||
Clone and install the specific version required (check README for latest version).
|
||||
```bash
|
||||
git clone -b 0.19.2 https://gitlab.freedesktop.org/wlroots/wlroots.git
|
||||
git clone -b 0.19.3 https://gitlab.freedesktop.org/wlroots/wlroots.git
|
||||
cd wlroots
|
||||
meson build -Dprefix=/usr
|
||||
sudo ninja -C build install
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ tagrule=id:Values,monitor_make:xxx,monitor_model:xxx,Parameter:Values
|
|||
| `monitor_serial` | string | monitor serial | Match by monitor serial number |
|
||||
| `layout_name` | string | layout name | Layout name to set |
|
||||
| `no_render_border` | integer | `0` / `1` | Disable render border |
|
||||
| `open_as_floating` | integer | `0` / `1` | New open window will be floating|
|
||||
| `no_hide` | integer | `0` / `1` | Not hide even if the tag is empty |
|
||||
| `nmaster` | integer | 0, 99 | Number of master windows |
|
||||
| `mfact` | float | 0.1–0.9 | Master area factor |
|
||||
|
|
|
|||
|
|
@ -723,6 +723,8 @@ void client_animation_next_tick(Client *c) {
|
|||
|
||||
c->is_pending_open_animation = false;
|
||||
|
||||
client_apply_clip(c, factor);
|
||||
|
||||
if (animation_passed >= 1.0) {
|
||||
|
||||
// clear the open action state
|
||||
|
|
@ -752,8 +754,6 @@ void client_animation_next_tick(Client *c) {
|
|||
// end flush in next frame, not the current frame
|
||||
c->need_output_flush = false;
|
||||
}
|
||||
|
||||
client_apply_clip(c, factor);
|
||||
}
|
||||
|
||||
void init_fadeout_client(Client *c) {
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@ typedef struct {
|
|||
float mfact;
|
||||
int32_t nmaster;
|
||||
int32_t no_render_border;
|
||||
int32_t open_as_floating;
|
||||
int32_t no_hide;
|
||||
} ConfigTagRule;
|
||||
|
||||
|
|
@ -1201,6 +1202,8 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
|
|||
} else if (strcmp(func_name, "scroller_stack") == 0) {
|
||||
func = scroller_stack;
|
||||
(*arg).i = parse_direction(arg_value);
|
||||
} else if (strcmp(func_name, "toggle_all_floating") == 0) {
|
||||
func = toggle_all_floating;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1904,6 +1907,7 @@ bool parse_option(Config *config, char *key, char *value) {
|
|||
rule->nmaster = 0;
|
||||
rule->mfact = 0.0f;
|
||||
rule->no_render_border = 0;
|
||||
rule->open_as_floating = 0;
|
||||
rule->no_hide = 0;
|
||||
|
||||
bool parse_error = false;
|
||||
|
|
@ -1932,6 +1936,8 @@ bool parse_option(Config *config, char *key, char *value) {
|
|||
rule->monitor_serial = strdup(val);
|
||||
} else if (strcmp(key, "no_render_border") == 0) {
|
||||
rule->no_render_border = CLAMP_INT(atoi(val), 0, 1);
|
||||
} else if (strcmp(key, "open_as_floating") == 0) {
|
||||
rule->open_as_floating = CLAMP_INT(atoi(val), 0, 1);
|
||||
} else if (strcmp(key, "no_hide") == 0) {
|
||||
rule->no_hide = CLAMP_INT(atoi(val), 0, 1);
|
||||
} else if (strcmp(key, "nmaster") == 0) {
|
||||
|
|
@ -3785,6 +3791,8 @@ void parse_tagrule(Monitor *m) {
|
|||
m->pertag->mfacts[tr.id] = tr.mfact;
|
||||
if (tr.no_render_border >= 0)
|
||||
m->pertag->no_render_border[tr.id] = tr.no_render_border;
|
||||
if (tr.open_as_floating >= 0)
|
||||
m->pertag->open_as_floating[tr.id] = tr.open_as_floating;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -70,3 +70,4 @@ 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 toggle_all_floating(const Arg *arg);
|
||||
|
|
@ -1866,3 +1866,27 @@ int32_t scroller_stack(const Arg *arg) {
|
|||
arrange(selmon, false, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t toggle_all_floating(const Arg *arg) {
|
||||
if (!selmon || !selmon->sel)
|
||||
return 0;
|
||||
|
||||
Client *c = NULL;
|
||||
bool should_floating = !selmon->sel->isfloating;
|
||||
|
||||
wl_list_for_each(c, &clients, link) {
|
||||
if (VISIBLEON(c, selmon)) {
|
||||
|
||||
if (c->isfloating && !should_floating) {
|
||||
c->old_master_inner_per = 0.0f;
|
||||
c->old_stack_inner_per = 0.0f;
|
||||
set_size_per(selmon, c);
|
||||
}
|
||||
|
||||
if (c->isfloating != should_floating) {
|
||||
setfloating(c, should_floating);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,12 @@
|
|||
bool check_hit_no_border(Client *c) {
|
||||
int32_t i;
|
||||
bool hit_no_border = false;
|
||||
if (!render_border) {
|
||||
hit_no_border = true;
|
||||
}
|
||||
|
||||
for (i = 0; i < config.tag_rules_count; i++) {
|
||||
if (c->tags & (1 << (config.tag_rules[i].id - 1)) &&
|
||||
config.tag_rules[i].no_render_border) {
|
||||
hit_no_border = true;
|
||||
}
|
||||
if (c->mon && !c->mon->isoverview &&
|
||||
c->mon->pertag->no_render_border[get_tags_first_tag_num(c->tags)]) {
|
||||
hit_no_border = true;
|
||||
}
|
||||
|
||||
if (config.no_border_when_single && c && c->mon &&
|
||||
|
|
@ -19,6 +16,7 @@ bool check_hit_no_border(Client *c) {
|
|||
}
|
||||
return hit_no_border;
|
||||
}
|
||||
|
||||
Client *termforwin(Client *w) {
|
||||
Client *c = NULL;
|
||||
|
||||
|
|
|
|||
82
src/mango.c
82
src/mango.c
|
|
@ -951,8 +951,9 @@ struct Pertag {
|
|||
uint32_t curtag, prevtag; /* current and previous tag */
|
||||
int32_t nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
|
||||
float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
|
||||
bool no_hide[LENGTH(tags) + 1]; /* no_hide per tag */
|
||||
bool no_render_border[LENGTH(tags) + 1]; /* no_render_border per tag */
|
||||
int32_t no_hide[LENGTH(tags) + 1]; /* no_hide per tag */
|
||||
int32_t no_render_border[LENGTH(tags) + 1]; /* no_render_border per tag */
|
||||
int32_t open_as_floating[LENGTH(tags) + 1]; /* open_as_floating per tag */
|
||||
const Layout
|
||||
*ltidxs[LENGTH(tags) + 1]; /* matrix of tags and layouts indexes */
|
||||
};
|
||||
|
|
@ -1425,6 +1426,25 @@ void set_float_malposition(Client *tc) {
|
|||
tc->float_geom.y = tc->geom.y = y;
|
||||
}
|
||||
|
||||
void client_reset_mon_tags(Client *c, Monitor *mon, uint32_t newtags) {
|
||||
if (!newtags && mon && !mon->isoverview) {
|
||||
c->tags = mon->tagset[mon->seltags];
|
||||
} else if (!newtags && mon && mon->isoverview) {
|
||||
c->tags = mon->ovbk_current_tagset;
|
||||
} else if (newtags) {
|
||||
c->tags = newtags;
|
||||
} else {
|
||||
c->tags = mon->tagset[mon->seltags];
|
||||
}
|
||||
}
|
||||
|
||||
void check_match_tag_floating_rule(Client *c, Monitor *mon) {
|
||||
if (c->tags && !c->isfloating && mon && !c->swallowedby &&
|
||||
mon->pertag->open_as_floating[get_tags_first_tag_num(c->tags)]) {
|
||||
c->isfloating = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void applyrules(Client *c) {
|
||||
/* rule matching */
|
||||
const char *appid, *title;
|
||||
|
|
@ -1549,6 +1569,7 @@ void applyrules(Client *c) {
|
|||
|
||||
int32_t fullscreen_state_backup =
|
||||
c->isfullscreen || client_wants_fullscreen(c);
|
||||
|
||||
setmon(c, mon, newtags,
|
||||
!c->isopensilent &&
|
||||
!(client_is_x11_popup(c) && client_should_ignore_focus(c)) &&
|
||||
|
|
@ -1556,6 +1577,11 @@ void applyrules(Client *c) {
|
|||
(!c->istagsilent || !newtags ||
|
||||
newtags & mon->tagset[mon->seltags]));
|
||||
|
||||
if (!c->isfloating) {
|
||||
c->old_stack_inner_per = c->stack_inner_per;
|
||||
c->old_master_inner_per = c->master_inner_per;
|
||||
}
|
||||
|
||||
if (c->mon &&
|
||||
!(c->mon == selmon && c->tags & c->mon->tagset[c->mon->seltags]) &&
|
||||
!c->isopensilent && !c->istagsilent) {
|
||||
|
|
@ -4087,9 +4113,9 @@ void init_client_properties(Client *c) {
|
|||
c->master_mfact_per = 0.0f;
|
||||
c->master_inner_per = 0.0f;
|
||||
c->stack_inner_per = 0.0f;
|
||||
c->old_stack_inner_per = 1.0f;
|
||||
c->old_master_inner_per = 1.0f;
|
||||
c->old_master_mfact_per = 1.0f;
|
||||
c->old_stack_inner_per = 0.0f;
|
||||
c->old_master_inner_per = 0.0f;
|
||||
c->old_master_mfact_per = 0.0f;
|
||||
c->isterm = 0;
|
||||
c->allow_csd = 0;
|
||||
c->force_maximize = 0;
|
||||
|
|
@ -5062,12 +5088,12 @@ setfloating(Client *c, int32_t floating) {
|
|||
|
||||
if (floating == 1 && c != grabc) {
|
||||
|
||||
if (c->isfullscreen || c->ismaximizescreen) {
|
||||
c->isfullscreen = 0; // 清除窗口全屏标志
|
||||
c->ismaximizescreen = 0;
|
||||
c->bw = c->isnoborder ? 0 : config.borderpx;
|
||||
if (c->isfullscreen) {
|
||||
c->isfullscreen = 0;
|
||||
client_set_fullscreen(c, 0);
|
||||
}
|
||||
|
||||
c->ismaximizescreen = 0;
|
||||
exit_scroller_stack(c);
|
||||
|
||||
// 重新计算居中的坐标
|
||||
|
|
@ -5109,7 +5135,8 @@ setfloating(Client *c, int32_t floating) {
|
|||
// 让当前tag中的全屏窗口退出全屏参与平铺
|
||||
wl_list_for_each(fc, &clients,
|
||||
link) if (fc && fc != c && VISIBLEON(fc, c->mon) &&
|
||||
c->tags & fc->tags && ISFULLSCREEN(fc)) {
|
||||
c->tags & fc->tags && ISFULLSCREEN(fc) &&
|
||||
old_floating_state) {
|
||||
clear_fullscreen_flag(fc);
|
||||
}
|
||||
}
|
||||
|
|
@ -5123,7 +5150,8 @@ setfloating(Client *c, int32_t floating) {
|
|||
layers[c->isfloating ? LyrTop : LyrTile]);
|
||||
}
|
||||
|
||||
if (!c->isfloating && old_floating_state) {
|
||||
if (!c->isfloating && old_floating_state &&
|
||||
(c->old_stack_inner_per > 0.0f || c->old_master_inner_per > 0.0f)) {
|
||||
restore_size_per(c->mon, c);
|
||||
}
|
||||
|
||||
|
|
@ -5142,6 +5170,12 @@ setfloating(Client *c, int32_t floating) {
|
|||
}
|
||||
|
||||
arrange(c->mon, false, false);
|
||||
|
||||
if (!c->isfloating) {
|
||||
c->old_master_inner_per = c->master_inner_per;
|
||||
c->old_stack_inner_per = c->stack_inner_per;
|
||||
}
|
||||
|
||||
setborder_color(c);
|
||||
printstatus();
|
||||
}
|
||||
|
|
@ -5188,14 +5222,13 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
|
|||
|
||||
if (maximizescreen) {
|
||||
|
||||
if (c->isfullscreen)
|
||||
setfullscreen(c, 0);
|
||||
if (c->isfullscreen) {
|
||||
c->isfullscreen = 0;
|
||||
client_set_fullscreen(c, 0);
|
||||
}
|
||||
|
||||
exit_scroller_stack(c);
|
||||
|
||||
if (c->isfloating)
|
||||
c->float_geom = c->geom;
|
||||
|
||||
maximizescreen_box.x = c->mon->w.x + config.gappoh;
|
||||
maximizescreen_box.y = c->mon->w.y + config.gappov;
|
||||
maximizescreen_box.width = c->mon->w.width - 2 * config.gappoh;
|
||||
|
|
@ -5256,14 +5289,10 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
|
|||
client_set_fullscreen(c, fullscreen);
|
||||
|
||||
if (fullscreen) {
|
||||
if (c->ismaximizescreen)
|
||||
setmaximizescreen(c, 0);
|
||||
|
||||
c->ismaximizescreen = 0;
|
||||
exit_scroller_stack(c);
|
||||
|
||||
if (c->isfloating)
|
||||
c->float_geom = c->geom;
|
||||
|
||||
c->isfakefullscreen = 0;
|
||||
|
||||
c->bw = 0;
|
||||
|
|
@ -5422,15 +5451,8 @@ void setmon(Client *c, Monitor *m, uint32_t newtags, bool focus) {
|
|||
/* Make sure window actually overlaps with the monitor */
|
||||
reset_foreign_tolevel(c);
|
||||
resize(c, c->geom, 0);
|
||||
if (!newtags && !m->isoverview) {
|
||||
c->tags = m->tagset[m->seltags];
|
||||
} else if (!newtags && m->isoverview) {
|
||||
c->tags = m->ovbk_current_tagset;
|
||||
} else if (newtags) {
|
||||
c->tags = newtags;
|
||||
} else {
|
||||
c->tags = m->tagset[m->seltags];
|
||||
}
|
||||
client_reset_mon_tags(c, m, newtags);
|
||||
check_match_tag_floating_rule(c, m);
|
||||
setfloating(c, c->isfloating);
|
||||
setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue