Merge branch 'main' into feature/dual-row-scroller
This commit is contained in:
15
README.md
15
README.md
@@ -82,7 +82,6 @@ yay -S mangowc-git
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Gentoo Linux
|
## Gentoo Linux
|
||||||
|
|
||||||
The package is in the community-maintained repository called GURU.
|
The package is in the community-maintained repository called GURU.
|
||||||
First, add GURU repository:
|
First, add GURU repository:
|
||||||
|
|
||||||
@@ -100,6 +99,16 @@ Finally, install the package:
|
|||||||
emerge --ask --verbose gui-wm/mangowc
|
emerge --ask --verbose gui-wm/mangowc
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Fedora Linux
|
||||||
|
The package is in the third-party Terra repository.
|
||||||
|
First, add the [Terra Repository](https://terra.fyralabs.com/).
|
||||||
|
|
||||||
|
Then, install the package:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dnf install mangowc
|
||||||
|
```
|
||||||
|
|
||||||
## Other
|
## Other
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -172,7 +181,9 @@ git clone https://github.com/DreamMaoMao/mango-config.git ~/.config/mango
|
|||||||
|
|
||||||
## Config Documentation
|
## Config Documentation
|
||||||
|
|
||||||
Refer to the [wiki](https://github.com/DreamMaoMao/mango/wiki/)
|
Refer to the repo wiki [wiki](https://github.com/DreamMaoMao/mango/wiki/)
|
||||||
|
|
||||||
|
or the website docs [docs](https://mangowc.vercel.app/docs)
|
||||||
|
|
||||||
# NixOS + Home-manager
|
# NixOS + Home-manager
|
||||||
|
|
||||||
|
|||||||
@@ -153,20 +153,6 @@ static inline void client_get_geometry(Client *c, struct wlr_box *geom) {
|
|||||||
*geom = c->surface.xdg->geometry;
|
*geom = c->surface.xdg->geometry;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Client *get_client_from_surface(struct wlr_surface *surface) {
|
|
||||||
if (!surface)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// 从 surface 的 data 指针获取 scene tree
|
|
||||||
struct wlr_scene_tree *scene_tree = surface->data;
|
|
||||||
if (!scene_tree)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// 从 scene tree 的 node data 获取 Client
|
|
||||||
Client *c = scene_tree->node.data;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline Client *client_get_parent(Client *c) {
|
static inline Client *client_get_parent(Client *c) {
|
||||||
Client *p = NULL;
|
Client *p = NULL;
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ typedef struct {
|
|||||||
bool isdefaultmode;
|
bool isdefaultmode;
|
||||||
bool islockapply;
|
bool islockapply;
|
||||||
bool isreleaseapply;
|
bool isreleaseapply;
|
||||||
|
bool ispassapply;
|
||||||
} KeyBinding;
|
} KeyBinding;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -444,6 +445,9 @@ void parse_bind_flags(const char *str, KeyBinding *kb) {
|
|||||||
case 'r':
|
case 'r':
|
||||||
kb->isreleaseapply = true;
|
kb->isreleaseapply = true;
|
||||||
break;
|
break;
|
||||||
|
case 'p':
|
||||||
|
kb->ispassapply = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// 忽略其他字符或可根据需要处理错误
|
// 忽略其他字符或可根据需要处理错误
|
||||||
break;
|
break;
|
||||||
@@ -1964,7 +1968,7 @@ void parse_option(Config *config, char *key, char *value) {
|
|||||||
|
|
||||||
config->exec_once_count++;
|
config->exec_once_count++;
|
||||||
|
|
||||||
} else if (regex_match("^bind[s|l|r]*$", key)) {
|
} else if (regex_match("^bind[s|l|r|p]*$", key)) {
|
||||||
config->key_bindings =
|
config->key_bindings =
|
||||||
realloc(config->key_bindings,
|
realloc(config->key_bindings,
|
||||||
(config->key_bindings_count + 1) * sizeof(KeyBinding));
|
(config->key_bindings_count + 1) * sizeof(KeyBinding));
|
||||||
|
|||||||
@@ -758,14 +758,26 @@ int centerwin(const Arg *arg) {
|
|||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
|
|
||||||
if (!c || c->isfullscreen)
|
if (!c || c->isfullscreen || c->ismaximizescreen)
|
||||||
return 0;
|
return 0;
|
||||||
if (!c->isfloating)
|
|
||||||
setfloating(c, true);
|
|
||||||
|
|
||||||
c->float_geom = setclient_coordinate_center(c, c->geom, 0, 0);
|
if (c->isfloating) {
|
||||||
c->iscustomsize = 1;
|
c->float_geom = setclient_coordinate_center(c, c->geom, 0, 0);
|
||||||
resize(c, c->float_geom, 1);
|
c->iscustomsize = 1;
|
||||||
|
resize(c, c->float_geom, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_scroller_layout(selmon))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (selmon->pertag->ltidxs[selmon->pertag->curtag]->id == SCROLLER) {
|
||||||
|
c->geom.x = selmon->w.x + (selmon->w.width - c->geom.width) / 2;
|
||||||
|
} else {
|
||||||
|
c->geom.y = selmon->w.y + (selmon->w.height - c->geom.height) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
arrange(selmon, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1594,4 +1606,4 @@ int toggle_monitor(const Arg *arg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,9 @@ void handle_foreign_activate_request(struct wl_listener *listener, void *data) {
|
|||||||
Client *c = wl_container_of(listener, c, foreign_activate_request);
|
Client *c = wl_container_of(listener, c, foreign_activate_request);
|
||||||
uint32_t target;
|
uint32_t target;
|
||||||
|
|
||||||
if (c && c->swallowing)
|
if (c->swallowing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (c && !c->isminimized && c == selmon->sel) {
|
|
||||||
set_minimized(c);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c->isminimized) {
|
if (c->isminimized) {
|
||||||
c->is_in_scratchpad = 0;
|
c->is_in_scratchpad = 0;
|
||||||
c->isnamedscratchpad = 0;
|
c->isnamedscratchpad = 0;
|
||||||
@@ -27,29 +22,82 @@ void handle_foreign_activate_request(struct wl_listener *listener, void *data) {
|
|||||||
target = get_tags_first_tag(c->tags);
|
target = get_tags_first_tag(c->tags);
|
||||||
view_in_mon(&(Arg){.ui = target}, true, c->mon, true);
|
view_in_mon(&(Arg){.ui = target}, true, c->mon, true);
|
||||||
focusclient(c, 1);
|
focusclient(c, 1);
|
||||||
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, true);
|
}
|
||||||
|
|
||||||
|
void handle_foreign_maximize_request(struct wl_listener *listener, void *data) {
|
||||||
|
Client *c = wl_container_of(listener, c, foreign_maximize_request);
|
||||||
|
struct wlr_foreign_toplevel_handle_v1_maximized_event *event = data;
|
||||||
|
|
||||||
|
if (c->swallowing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (c->ismaximizescreen && !event->maximized) {
|
||||||
|
setmaximizescreen(c, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!c->ismaximizescreen && event->maximized) {
|
||||||
|
setmaximizescreen(c, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_foreign_minimize_request(struct wl_listener *listener, void *data) {
|
||||||
|
Client *c = wl_container_of(listener, c, foreign_minimize_request);
|
||||||
|
struct wlr_foreign_toplevel_handle_v1_minimized_event *event = data;
|
||||||
|
|
||||||
|
if (c->swallowing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!c->isminimized && event->minimized) {
|
||||||
|
set_minimized(c);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c->isminimized && !event->minimized) {
|
||||||
|
c->is_in_scratchpad = 0;
|
||||||
|
c->isnamedscratchpad = 0;
|
||||||
|
c->is_scratchpad_show = 0;
|
||||||
|
setborder_color(c);
|
||||||
|
show_hide_client(c);
|
||||||
|
arrange(c->mon, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_foreign_fullscreen_request(struct wl_listener *listener,
|
void handle_foreign_fullscreen_request(struct wl_listener *listener,
|
||||||
void *data) {
|
void *data) {
|
||||||
return;
|
|
||||||
|
Client *c = wl_container_of(listener, c, foreign_fullscreen_request);
|
||||||
|
struct wlr_foreign_toplevel_handle_v1_fullscreen_event *event = data;
|
||||||
|
|
||||||
|
if (c->swallowing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (c->isfullscreen && !event->fullscreen) {
|
||||||
|
setfullscreen(c, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!c->isfullscreen && event->fullscreen) {
|
||||||
|
setfullscreen(c, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_foreign_close_request(struct wl_listener *listener, void *data) {
|
void handle_foreign_close_request(struct wl_listener *listener, void *data) {
|
||||||
Client *c = wl_container_of(listener, c, foreign_close_request);
|
Client *c = wl_container_of(listener, c, foreign_close_request);
|
||||||
if (c) {
|
pending_kill_client(c);
|
||||||
pending_kill_client(c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_foreign_destroy(struct wl_listener *listener, void *data) {
|
void handle_foreign_destroy(struct wl_listener *listener, void *data) {
|
||||||
Client *c = wl_container_of(listener, c, foreign_destroy);
|
Client *c = wl_container_of(listener, c, foreign_destroy);
|
||||||
if (c) {
|
wl_list_remove(&c->foreign_activate_request.link);
|
||||||
wl_list_remove(&c->foreign_activate_request.link);
|
wl_list_remove(&c->foreign_minimize_request.link);
|
||||||
wl_list_remove(&c->foreign_fullscreen_request.link);
|
wl_list_remove(&c->foreign_maximize_request.link);
|
||||||
wl_list_remove(&c->foreign_close_request.link);
|
wl_list_remove(&c->foreign_fullscreen_request.link);
|
||||||
wl_list_remove(&c->foreign_destroy.link);
|
wl_list_remove(&c->foreign_close_request.link);
|
||||||
}
|
wl_list_remove(&c->foreign_destroy.link);
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_foreign_topleve(Client *c) {
|
void remove_foreign_topleve(Client *c) {
|
||||||
@@ -67,6 +115,10 @@ void add_foreign_toplevel(Client *c) {
|
|||||||
if (c->foreign_toplevel) {
|
if (c->foreign_toplevel) {
|
||||||
LISTEN(&(c->foreign_toplevel->events.request_activate),
|
LISTEN(&(c->foreign_toplevel->events.request_activate),
|
||||||
&c->foreign_activate_request, handle_foreign_activate_request);
|
&c->foreign_activate_request, handle_foreign_activate_request);
|
||||||
|
LISTEN(&(c->foreign_toplevel->events.request_minimize),
|
||||||
|
&c->foreign_minimize_request, handle_foreign_minimize_request);
|
||||||
|
LISTEN(&(c->foreign_toplevel->events.request_maximize),
|
||||||
|
&c->foreign_maximize_request, handle_foreign_maximize_request);
|
||||||
LISTEN(&(c->foreign_toplevel->events.request_fullscreen),
|
LISTEN(&(c->foreign_toplevel->events.request_fullscreen),
|
||||||
&c->foreign_fullscreen_request,
|
&c->foreign_fullscreen_request,
|
||||||
handle_foreign_fullscreen_request);
|
handle_foreign_fullscreen_request);
|
||||||
|
|||||||
@@ -13,7 +13,10 @@ static void handle_controller_set_hint(struct wl_listener *listener,
|
|||||||
void *data) {
|
void *data) {
|
||||||
struct tearing_controller *controller =
|
struct tearing_controller *controller =
|
||||||
wl_container_of(listener, controller, set_hint);
|
wl_container_of(listener, controller, set_hint);
|
||||||
Client *c = get_client_from_surface(controller->tearing_control->surface);
|
Client *c = NULL;
|
||||||
|
|
||||||
|
toplevel_from_wlr_surface(controller->tearing_control->surface, &c, NULL);
|
||||||
|
|
||||||
if (c) {
|
if (c) {
|
||||||
/*
|
/*
|
||||||
* tearing_control->current is actually an enum:
|
* tearing_control->current is actually an enum:
|
||||||
|
|||||||
@@ -350,7 +350,7 @@ Client *find_client_by_direction(Client *tc, const Arg *arg, bool findfloating,
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(tempClients); // 释放内存
|
free(tempClients); // 释放内存
|
||||||
if(tempSameMonitorFocusClients) {
|
if (tempSameMonitorFocusClients) {
|
||||||
return tempSameMonitorFocusClients;
|
return tempSameMonitorFocusClients;
|
||||||
} else {
|
} else {
|
||||||
return tempFocusClients;
|
return tempFocusClients;
|
||||||
|
|||||||
@@ -518,17 +518,15 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num,
|
|||||||
|
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (VISIBLEON(c, m) && ISTILED(c)) {
|
if (VISIBLEON(c, m) && ISTILED(c)) {
|
||||||
|
if (total_master_inner_percent > 0.0 && i < nmasters) {
|
||||||
if (total_master_inner_percent <= 0.0)
|
|
||||||
return;
|
|
||||||
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
|
||||||
c->ismaster = true;
|
c->ismaster = true;
|
||||||
c->stack_innder_per = stack_num ? 1.0f / stack_num : 1.0f;
|
c->stack_innder_per = stack_num ? 1.0f / stack_num : 1.0f;
|
||||||
c->master_inner_per =
|
c->master_inner_per =
|
||||||
c->master_inner_per / total_master_inner_percent;
|
c->master_inner_per / total_master_inner_percent;
|
||||||
} else {
|
} else {
|
||||||
c->ismaster = false;
|
c->ismaster = false;
|
||||||
c->master_inner_per = 1.0f / master_num;
|
c->master_inner_per =
|
||||||
|
master_num > 0 ? 1.0f / master_num : 1.0f;
|
||||||
c->stack_innder_per =
|
c->stack_innder_per =
|
||||||
total_stack_hight_percent
|
total_stack_hight_percent
|
||||||
? c->stack_innder_per / total_stack_hight_percent
|
? c->stack_innder_per / total_stack_hight_percent
|
||||||
@@ -540,10 +538,7 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num,
|
|||||||
} else {
|
} else {
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (VISIBLEON(c, m) && ISTILED(c)) {
|
if (VISIBLEON(c, m) && ISTILED(c)) {
|
||||||
|
if (total_master_inner_percent > 0.0 && i < nmasters) {
|
||||||
if (total_master_inner_percent <= 0.0)
|
|
||||||
return;
|
|
||||||
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
|
||||||
c->ismaster = true;
|
c->ismaster = true;
|
||||||
if ((stack_index % 2) ^ (tile_cilent_num % 2 == 0)) {
|
if ((stack_index % 2) ^ (tile_cilent_num % 2 == 0)) {
|
||||||
c->stack_innder_per =
|
c->stack_innder_per =
|
||||||
@@ -560,7 +555,8 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num,
|
|||||||
stack_index = i - nmasters;
|
stack_index = i - nmasters;
|
||||||
|
|
||||||
c->ismaster = false;
|
c->ismaster = false;
|
||||||
c->master_inner_per = 1.0f / master_num;
|
c->master_inner_per =
|
||||||
|
master_num > 0 ? 1.0f / master_num : 1.0f;
|
||||||
if ((stack_index % 2) ^ (tile_cilent_num % 2 == 0)) {
|
if ((stack_index % 2) ^ (tile_cilent_num % 2 == 0)) {
|
||||||
c->stack_innder_per =
|
c->stack_innder_per =
|
||||||
total_right_stack_hight_percent
|
total_right_stack_hight_percent
|
||||||
@@ -639,7 +635,7 @@ arrange(Monitor *m, bool want_animation) {
|
|||||||
if (VISIBLEON(c, m)) {
|
if (VISIBLEON(c, m)) {
|
||||||
if (ISTILED(c)) {
|
if (ISTILED(c)) {
|
||||||
|
|
||||||
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
if (i < nmasters) {
|
||||||
master_num++;
|
master_num++;
|
||||||
total_master_inner_percent += c->master_inner_per;
|
total_master_inner_percent += c->master_inner_per;
|
||||||
} else {
|
} else {
|
||||||
@@ -688,4 +684,6 @@ arrange(Monitor *m, bool want_animation) {
|
|||||||
motionnotify(0, NULL, 0, 0, 0, 0);
|
motionnotify(0, NULL, 0, 0, 0, 0);
|
||||||
checkidleinhibitor(NULL);
|
checkidleinhibitor(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printstatus();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,6 @@ void grid(Monitor *m) {
|
|||||||
if (c->mon != m)
|
if (c->mon != m)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
c->bw = m->visible_tiling_clients == 1 && no_border_when_single &&
|
|
||||||
smartgaps
|
|
||||||
? 0
|
|
||||||
: borderpx;
|
|
||||||
if (VISIBLEON(c, m) && !c->isunglobal &&
|
if (VISIBLEON(c, m) && !c->isunglobal &&
|
||||||
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
||||||
cw = (m->w.width - 2 * target_gappo) * single_width_ratio;
|
cw = (m->w.width - 2 * target_gappo) * single_width_ratio;
|
||||||
@@ -49,10 +45,6 @@ void grid(Monitor *m) {
|
|||||||
if (c->mon != m)
|
if (c->mon != m)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
c->bw = m->visible_tiling_clients == 1 && no_border_when_single &&
|
|
||||||
smartgaps
|
|
||||||
? 0
|
|
||||||
: borderpx;
|
|
||||||
if (VISIBLEON(c, m) && !c->isunglobal &&
|
if (VISIBLEON(c, m) && !c->isunglobal &&
|
||||||
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
@@ -99,10 +91,7 @@ void grid(Monitor *m) {
|
|||||||
|
|
||||||
if (c->mon != m)
|
if (c->mon != m)
|
||||||
continue;
|
continue;
|
||||||
c->bw =
|
|
||||||
m->visible_tiling_clients == 1 && no_border_when_single && smartgaps
|
|
||||||
? 0
|
|
||||||
: borderpx;
|
|
||||||
if (VISIBLEON(c, m) && !c->isunglobal &&
|
if (VISIBLEON(c, m) && !c->isunglobal &&
|
||||||
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
||||||
cx = m->w.x + (i % cols) * (cw + target_gappi);
|
cx = m->w.x + (i % cols) * (cw + target_gappi);
|
||||||
@@ -592,6 +581,8 @@ void center_tile(Monitor *m) {
|
|||||||
|
|
||||||
n = m->visible_tiling_clients;
|
n = m->visible_tiling_clients;
|
||||||
master_num = m->pertag->nmasters[m->pertag->curtag];
|
master_num = m->pertag->nmasters[m->pertag->curtag];
|
||||||
|
master_num = n > master_num ? master_num : n;
|
||||||
|
|
||||||
stack_num = n - master_num;
|
stack_num = n - master_num;
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
@@ -628,6 +619,19 @@ void center_tile(Monitor *m) {
|
|||||||
// 判断是否需要主区域铺满
|
// 判断是否需要主区域铺满
|
||||||
int should_overspread = center_master_overspread && (n <= nmasters);
|
int should_overspread = center_master_overspread && (n <= nmasters);
|
||||||
|
|
||||||
|
uint32_t master_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov - cur_gappiv * ie * (master_num - 1));
|
||||||
|
float master_surplus_ratio = 1.0;
|
||||||
|
|
||||||
|
uint32_t slave_left_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov - cur_gappiv * ie * (stack_num / 2 - 1));
|
||||||
|
float slave_left_surplus_ratio = 1.0;
|
||||||
|
|
||||||
|
uint32_t slave_right_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov -
|
||||||
|
cur_gappiv * ie * ((stack_num + 1) / 2 - 1));
|
||||||
|
float slave_right_surplus_ratio = 1.0;
|
||||||
|
|
||||||
if (n > nmasters || !should_overspread) {
|
if (n > nmasters || !should_overspread) {
|
||||||
// 计算主区域宽度(居中模式)
|
// 计算主区域宽度(居中模式)
|
||||||
mw = nmasters ? (m->w.width - 2 * cur_gappoh - cur_gappih * ie) * mfact
|
mw = nmasters ? (m->w.width - 2 * cur_gappoh - cur_gappih * ie) * mfact
|
||||||
@@ -672,9 +676,11 @@ void center_tile(Monitor *m) {
|
|||||||
// 主区域窗口
|
// 主区域窗口
|
||||||
r = MIN(n, nmasters) - i;
|
r = MIN(n, nmasters) - i;
|
||||||
if (c->master_inner_per > 0.0f) {
|
if (c->master_inner_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = master_surplus_height * c->master_inner_per /
|
||||||
cur_gappiv * ie * (master_num - 1)) *
|
master_surplus_ratio;
|
||||||
c->master_inner_per;
|
master_surplus_height = master_surplus_height - h;
|
||||||
|
master_surplus_ratio =
|
||||||
|
master_surplus_ratio - c->master_inner_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - my - cur_gappov -
|
h = (m->w.height - my - cur_gappov -
|
||||||
@@ -736,9 +742,12 @@ void center_tile(Monitor *m) {
|
|||||||
if ((stack_index % 2) ^ (n % 2 == 0)) {
|
if ((stack_index % 2) ^ (n % 2 == 0)) {
|
||||||
// 右侧堆叠窗口
|
// 右侧堆叠窗口
|
||||||
if (c->stack_innder_per > 0.0f) {
|
if (c->stack_innder_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = slave_right_surplus_height * c->stack_innder_per /
|
||||||
cur_gappiv * ie * ((stack_num + 1) / 2 - 1)) *
|
slave_right_surplus_ratio;
|
||||||
c->stack_innder_per;
|
slave_right_surplus_height =
|
||||||
|
slave_right_surplus_height - h;
|
||||||
|
slave_right_surplus_ratio =
|
||||||
|
slave_right_surplus_ratio - c->stack_innder_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - ety - cur_gappov -
|
h = (m->w.height - ety - cur_gappov -
|
||||||
@@ -762,9 +771,12 @@ void center_tile(Monitor *m) {
|
|||||||
} else {
|
} else {
|
||||||
// 左侧堆叠窗口
|
// 左侧堆叠窗口
|
||||||
if (c->stack_innder_per > 0.0f) {
|
if (c->stack_innder_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = slave_left_surplus_height * c->stack_innder_per /
|
||||||
cur_gappiv * ie * (stack_num / 2 - 1)) *
|
slave_left_surplus_ratio;
|
||||||
c->stack_innder_per;
|
slave_left_surplus_height =
|
||||||
|
slave_left_surplus_height - h;
|
||||||
|
slave_left_surplus_ratio =
|
||||||
|
slave_left_surplus_ratio - c->stack_innder_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - oty - cur_gappov -
|
h = (m->w.height - oty - cur_gappov -
|
||||||
@@ -801,6 +813,7 @@ void tile(Monitor *m) {
|
|||||||
|
|
||||||
n = m->visible_tiling_clients;
|
n = m->visible_tiling_clients;
|
||||||
master_num = m->pertag->nmasters[m->pertag->curtag];
|
master_num = m->pertag->nmasters[m->pertag->curtag];
|
||||||
|
master_num = n > master_num ? master_num : n;
|
||||||
stack_num = n - master_num;
|
stack_num = n - master_num;
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
@@ -833,15 +846,26 @@ void tile(Monitor *m) {
|
|||||||
mw = m->w.width - 2 * cur_gappoh + cur_gappih * ie;
|
mw = m->w.width - 2 * cur_gappoh + cur_gappih * ie;
|
||||||
i = 0;
|
i = 0;
|
||||||
my = ty = cur_gappov;
|
my = ty = cur_gappov;
|
||||||
|
|
||||||
|
uint32_t master_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov - cur_gappiv * ie * (master_num - 1));
|
||||||
|
float master_surplus_ratio = 1.0;
|
||||||
|
|
||||||
|
uint32_t slave_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov - cur_gappiv * ie * (stack_num - 1));
|
||||||
|
float slave_surplus_ratio = 1.0;
|
||||||
|
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (!VISIBLEON(c, m) || !ISTILED(c))
|
if (!VISIBLEON(c, m) || !ISTILED(c))
|
||||||
continue;
|
continue;
|
||||||
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
||||||
r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i;
|
r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i;
|
||||||
if (c->master_inner_per > 0.0f) {
|
if (c->master_inner_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = master_surplus_height * c->master_inner_per /
|
||||||
cur_gappiv * ie * (master_num - 1)) *
|
master_surplus_ratio;
|
||||||
c->master_inner_per;
|
master_surplus_height = master_surplus_height - h;
|
||||||
|
master_surplus_ratio =
|
||||||
|
master_surplus_ratio - c->master_inner_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - my - cur_gappov -
|
h = (m->w.height - my - cur_gappov -
|
||||||
@@ -861,9 +885,10 @@ void tile(Monitor *m) {
|
|||||||
} else {
|
} else {
|
||||||
r = n - i;
|
r = n - i;
|
||||||
if (c->stack_innder_per > 0.0f) {
|
if (c->stack_innder_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = slave_surplus_height * c->stack_innder_per /
|
||||||
cur_gappiv * ie * (stack_num - 1)) *
|
slave_surplus_ratio;
|
||||||
c->stack_innder_per;
|
slave_surplus_height = slave_surplus_height - h;
|
||||||
|
slave_surplus_ratio = slave_surplus_ratio - c->stack_innder_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - ty - cur_gappov -
|
h = (m->w.height - ty - cur_gappov -
|
||||||
@@ -898,6 +923,7 @@ void right_tile(Monitor *m) {
|
|||||||
|
|
||||||
n = m->visible_tiling_clients;
|
n = m->visible_tiling_clients;
|
||||||
master_num = m->pertag->nmasters[m->pertag->curtag];
|
master_num = m->pertag->nmasters[m->pertag->curtag];
|
||||||
|
master_num = n > master_num ? master_num : n;
|
||||||
stack_num = n - master_num;
|
stack_num = n - master_num;
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
@@ -930,15 +956,26 @@ void right_tile(Monitor *m) {
|
|||||||
mw = m->w.width - 2 * cur_gappoh + cur_gappih * ie;
|
mw = m->w.width - 2 * cur_gappoh + cur_gappih * ie;
|
||||||
i = 0;
|
i = 0;
|
||||||
my = ty = cur_gappov;
|
my = ty = cur_gappov;
|
||||||
|
|
||||||
|
uint32_t master_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov - cur_gappiv * ie * (master_num - 1));
|
||||||
|
float master_surplus_ratio = 1.0;
|
||||||
|
|
||||||
|
uint32_t slave_surplus_height =
|
||||||
|
(m->w.height - 2 * cur_gappov - cur_gappiv * ie * (stack_num - 1));
|
||||||
|
float slave_surplus_ratio = 1.0;
|
||||||
|
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (!VISIBLEON(c, m) || !ISTILED(c))
|
if (!VISIBLEON(c, m) || !ISTILED(c))
|
||||||
continue;
|
continue;
|
||||||
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
||||||
r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i;
|
r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i;
|
||||||
if (c->master_inner_per > 0.0f) {
|
if (c->master_inner_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = master_surplus_height * c->master_inner_per /
|
||||||
cur_gappiv * ie * (master_num - 1)) *
|
master_surplus_ratio;
|
||||||
c->master_inner_per;
|
master_surplus_height = master_surplus_height - h;
|
||||||
|
master_surplus_ratio =
|
||||||
|
master_surplus_ratio - c->master_inner_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - my - cur_gappov -
|
h = (m->w.height - my - cur_gappov -
|
||||||
@@ -959,9 +996,10 @@ void right_tile(Monitor *m) {
|
|||||||
} else {
|
} else {
|
||||||
r = n - i;
|
r = n - i;
|
||||||
if (c->stack_innder_per > 0.0f) {
|
if (c->stack_innder_per > 0.0f) {
|
||||||
h = (m->w.height - 2 * cur_gappov -
|
h = slave_surplus_height * c->stack_innder_per /
|
||||||
cur_gappiv * ie * (stack_num - 1)) *
|
slave_surplus_ratio;
|
||||||
c->stack_innder_per;
|
slave_surplus_height = slave_surplus_height - h;
|
||||||
|
slave_surplus_ratio = slave_surplus_ratio - c->stack_innder_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
h = (m->w.height - ty - cur_gappov -
|
h = (m->w.height - ty - cur_gappov -
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ void vertical_tile(Monitor *m) {
|
|||||||
|
|
||||||
n = m->visible_tiling_clients;
|
n = m->visible_tiling_clients;
|
||||||
master_num = m->pertag->nmasters[m->pertag->curtag];
|
master_num = m->pertag->nmasters[m->pertag->curtag];
|
||||||
|
master_num = n > master_num ? master_num : n;
|
||||||
stack_num = n - master_num;
|
stack_num = n - master_num;
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
@@ -40,15 +41,26 @@ void vertical_tile(Monitor *m) {
|
|||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
mx = tx = cur_gapih;
|
mx = tx = cur_gapih;
|
||||||
|
|
||||||
|
uint32_t master_surplus_width =
|
||||||
|
(m->w.width - 2 * cur_gapih - cur_gapih * ie * (master_num - 1));
|
||||||
|
float master_surplus_ratio = 1.0;
|
||||||
|
|
||||||
|
uint32_t slave_surplus_width =
|
||||||
|
(m->w.width - 2 * cur_gapih - cur_gapih * ie * (stack_num - 1));
|
||||||
|
float slave_surplus_ratio = 1.0;
|
||||||
|
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (!VISIBLEON(c, m) || !ISTILED(c))
|
if (!VISIBLEON(c, m) || !ISTILED(c))
|
||||||
continue;
|
continue;
|
||||||
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
if (i < m->pertag->nmasters[m->pertag->curtag]) {
|
||||||
r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i;
|
r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i;
|
||||||
if (c->master_inner_per > 0.0f) {
|
if (c->master_inner_per > 0.0f) {
|
||||||
w = (m->w.width - 2 * cur_gapih -
|
w = master_surplus_width * c->master_inner_per /
|
||||||
cur_gapih * ie * (master_num - 1)) *
|
master_surplus_ratio;
|
||||||
c->master_inner_per;
|
master_surplus_width = master_surplus_width - w;
|
||||||
|
master_surplus_ratio =
|
||||||
|
master_surplus_ratio - c->master_inner_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
w = (m->w.width - mx - cur_gapih - cur_gapih * ie * (r - 1)) /
|
w = (m->w.width - mx - cur_gapih - cur_gapih * ie * (r - 1)) /
|
||||||
@@ -67,9 +79,10 @@ void vertical_tile(Monitor *m) {
|
|||||||
} else {
|
} else {
|
||||||
r = n - i;
|
r = n - i;
|
||||||
if (c->stack_innder_per > 0.0f) {
|
if (c->stack_innder_per > 0.0f) {
|
||||||
w = (m->w.width - 2 * cur_gapih -
|
w = slave_surplus_width * c->stack_innder_per /
|
||||||
cur_gapih * ie * (stack_num - 1)) *
|
slave_surplus_ratio;
|
||||||
c->stack_innder_per;
|
slave_surplus_width = slave_surplus_width - w;
|
||||||
|
slave_surplus_ratio = slave_surplus_ratio - c->stack_innder_per;
|
||||||
c->master_mfact_per = mfact;
|
c->master_mfact_per = mfact;
|
||||||
} else {
|
} else {
|
||||||
w = (m->w.width - tx - cur_gapih - cur_gapih * ie * (r - 1)) /
|
w = (m->w.width - tx - cur_gapih - cur_gapih * ie * (r - 1)) /
|
||||||
@@ -363,10 +376,6 @@ void vertical_grid(Monitor *m) {
|
|||||||
if (c->mon != m)
|
if (c->mon != m)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
c->bw = m->visible_tiling_clients == 1 && no_border_when_single &&
|
|
||||||
smartgaps
|
|
||||||
? 0
|
|
||||||
: borderpx;
|
|
||||||
if (VISIBLEON(c, m) && !c->isunglobal &&
|
if (VISIBLEON(c, m) && !c->isunglobal &&
|
||||||
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
||||||
ch = (m->w.height - 2 * target_gappo) * single_height_ratio;
|
ch = (m->w.height - 2 * target_gappo) * single_height_ratio;
|
||||||
@@ -390,10 +399,6 @@ void vertical_grid(Monitor *m) {
|
|||||||
if (c->mon != m)
|
if (c->mon != m)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
c->bw = m->visible_tiling_clients == 1 && no_border_when_single &&
|
|
||||||
smartgaps
|
|
||||||
? 0
|
|
||||||
: borderpx;
|
|
||||||
if (VISIBLEON(c, m) && !c->isunglobal &&
|
if (VISIBLEON(c, m) && !c->isunglobal &&
|
||||||
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
@@ -436,10 +441,6 @@ void vertical_grid(Monitor *m) {
|
|||||||
if (c->mon != m)
|
if (c->mon != m)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
c->bw =
|
|
||||||
m->visible_tiling_clients == 1 && no_border_when_single && smartgaps
|
|
||||||
? 0
|
|
||||||
: borderpx;
|
|
||||||
if (VISIBLEON(c, m) && !c->isunglobal &&
|
if (VISIBLEON(c, m) && !c->isunglobal &&
|
||||||
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
((m->isoverview && !client_is_x11_popup(c)) || ISTILED(c))) {
|
||||||
cx = m->w.x + (i / rows) * (cw + target_gappi);
|
cx = m->w.x + (i / rows) * (cw + target_gappi);
|
||||||
|
|||||||
19
src/mango.c
19
src/mango.c
@@ -351,6 +351,8 @@ struct Client {
|
|||||||
struct wl_listener foreign_fullscreen_request;
|
struct wl_listener foreign_fullscreen_request;
|
||||||
struct wl_listener foreign_close_request;
|
struct wl_listener foreign_close_request;
|
||||||
struct wl_listener foreign_destroy;
|
struct wl_listener foreign_destroy;
|
||||||
|
struct wl_listener foreign_minimize_request;
|
||||||
|
struct wl_listener foreign_maximize_request;
|
||||||
struct wl_listener set_decoration_mode;
|
struct wl_listener set_decoration_mode;
|
||||||
struct wl_listener destroy_decoration;
|
struct wl_listener destroy_decoration;
|
||||||
|
|
||||||
@@ -3435,7 +3437,11 @@ keybinding(uint32_t state, bool locked, uint32_t mods, xkb_keysym_t sym,
|
|||||||
k->func) {
|
k->func) {
|
||||||
|
|
||||||
isbreak = k->func(&k->arg);
|
isbreak = k->func(&k->arg);
|
||||||
handled = 1;
|
|
||||||
|
if (!k->ispassapply)
|
||||||
|
handled = 1;
|
||||||
|
else
|
||||||
|
handled = 0;
|
||||||
|
|
||||||
if (isbreak)
|
if (isbreak)
|
||||||
break;
|
break;
|
||||||
@@ -5708,8 +5714,15 @@ void handle_keyboard_shortcuts_inhibit_new_inhibitor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// per-view, seat-agnostic config via criteria
|
// per-view, seat-agnostic config via criteria
|
||||||
Client *c = get_client_from_surface(inhibitor->surface);
|
Client *c = NULL;
|
||||||
if (c && !c->allow_shortcuts_inhibit) {
|
LayerSurface *l = NULL;
|
||||||
|
|
||||||
|
int type = toplevel_from_wlr_surface(inhibitor->surface, &c, &l);
|
||||||
|
|
||||||
|
if (type < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (type != LayerShell && c && !c->allow_shortcuts_inhibit) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user