mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-02-23 01:40:16 -05:00
Compare commits
No commits in common. "main" and "0.12.0" have entirely different histories.
17 changed files with 379 additions and 1362 deletions
53
README.md
53
README.md
|
|
@ -23,22 +23,25 @@ This project's development is based on [dwl](https://codeberg.org/dwl/dwl/).
|
||||||
- Ipc support(get/send message from/to compositor by external program)
|
- Ipc support(get/send message from/to compositor by external program)
|
||||||
- Hycov-like overview
|
- Hycov-like overview
|
||||||
- Window effects from scenefx (blur, shadow, corner radius, opacity)
|
- Window effects from scenefx (blur, shadow, corner radius, opacity)
|
||||||
- Zero flickering - every frame is perfect.
|
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/bb83004a-0563-4b48-ad89-6461a9b78b1f
|
Master-Stack Layout
|
||||||
|
|
||||||
# Mango's Vision
|
https://github.com/user-attachments/assets/a9d4776e-b50b-48fb-94ce-651d8a749b8a
|
||||||
|
|
||||||
**Mango's primary goal is stability**: After months of testing and development—and aside from a few lingering GPU compatibility issues—it should now be stable enough. I don't plan on making many breaking changes.
|
Scroller Layout
|
||||||
|
|
||||||
**Mango's preference is practicality**: I tend to add features that genuinely help with daily workflows—things that make our work more convenient.
|
https://github.com/user-attachments/assets/c9bf9415-fad1-4400-bcdc-3ad2d76de85a
|
||||||
|
|
||||||
|
Layer animation
|
||||||
|
|
||||||
|
https://github.com/user-attachments/assets/014c893f-115c-4ae9-8342-f9ae3e9a0df0
|
||||||
|
|
||||||
**Mango won't cater to every user preference**: For niche feature requests, I'll take a wait-and-see approach. I'll only consider adding them if they get a significant number of upvotes.
|
|
||||||
|
|
||||||
# Our discord
|
# Our discord
|
||||||
[mangowc](https://discord.gg/CPjbDxesh5)
|
[mangowc](https://discord.gg/CPjbDxesh5)
|
||||||
|
|
||||||
# Supported layouts
|
# Supported layouts
|
||||||
|
|
||||||
- tile
|
- tile
|
||||||
- scroller
|
- scroller
|
||||||
- monocle
|
- monocle
|
||||||
|
|
@ -48,20 +51,21 @@ https://github.com/user-attachments/assets/bb83004a-0563-4b48-ad89-6461a9b78b1f
|
||||||
- vertical_tile
|
- vertical_tile
|
||||||
- vertical_grid
|
- vertical_grid
|
||||||
- vertical_scroller
|
- vertical_scroller
|
||||||
- tgmix
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
[](https://repology.org/project/mangowc/versions)
|
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
|
- glibc
|
||||||
- wayland
|
- wayland
|
||||||
- wayland-protocols
|
- wayland-protocols
|
||||||
- libinput
|
- libinput
|
||||||
- libdrm
|
- libdrm
|
||||||
- libxkbcommon
|
- libxkbcommon
|
||||||
- pixman
|
- pixman
|
||||||
|
- git
|
||||||
|
- meson
|
||||||
|
- ninja
|
||||||
- libdisplay-info
|
- libdisplay-info
|
||||||
- libliftoff
|
- libliftoff
|
||||||
- hwdata
|
- hwdata
|
||||||
|
|
@ -71,7 +75,7 @@ https://github.com/user-attachments/assets/bb83004a-0563-4b48-ad89-6461a9b78b1f
|
||||||
- libxcb
|
- libxcb
|
||||||
|
|
||||||
## Arch Linux
|
## Arch Linux
|
||||||
The package is in the Arch User Repository and is available for manual download [here](https://aur.archlinux.org/packages/mangowc-git) or through a AUR helper like yay:
|
The package is in the Arch User Repository and is availble for manual download [here](https://aur.archlinux.org/packages/mangowc-git) or through a AUR helper like yay:
|
||||||
```bash
|
```bash
|
||||||
yay -S mangowc-git
|
yay -S mangowc-git
|
||||||
|
|
||||||
|
|
@ -105,35 +109,6 @@ Then, install the package:
|
||||||
dnf install mangowc
|
dnf install mangowc
|
||||||
```
|
```
|
||||||
|
|
||||||
## Guix System
|
|
||||||
The package definition is described in the source repository.
|
|
||||||
First, add `mangowc` channel to `channels.scm` file:
|
|
||||||
|
|
||||||
```scheme
|
|
||||||
;; In $HOME/.config/guix/channels.scm
|
|
||||||
(cons (channel
|
|
||||||
(name 'mangowc)
|
|
||||||
(url "https://github.com/DreamMaoMao/mangowc.git")
|
|
||||||
(branch "main"))
|
|
||||||
... ;; Your other channels
|
|
||||||
%default-channels)
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, run `guix pull` and after update you can either run
|
|
||||||
`guix install mangowc` or add it to your configuration via:
|
|
||||||
|
|
||||||
```scheme
|
|
||||||
(use-modules (mangowc)) ;; Add mangowc module
|
|
||||||
|
|
||||||
;; Add mangowc to packages list
|
|
||||||
(packages (cons*
|
|
||||||
mangowc-git
|
|
||||||
... ;; Other packages you specified
|
|
||||||
%base-packages))
|
|
||||||
```
|
|
||||||
|
|
||||||
And then rebuild your system.
|
|
||||||
|
|
||||||
## Other
|
## Other
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
|
||||||
|
|
@ -240,11 +240,12 @@ bind=CTRL+ALT,Left,resizewin,-50,+0
|
||||||
bind=CTRL+ALT,Right,resizewin,+50,+0
|
bind=CTRL+ALT,Right,resizewin,+50,+0
|
||||||
|
|
||||||
# Mouse Button Bindings
|
# Mouse Button Bindings
|
||||||
# btn_left and btn_right can't bind none mod key
|
# NONE mode key only work in ov mode
|
||||||
mousebind=SUPER,btn_left,moveresize,curmove
|
mousebind=SUPER,btn_left,moveresize,curmove
|
||||||
mousebind=NONE,btn_middle,togglemaximizescreen,0
|
mousebind=NONE,btn_middle,togglemaximizescreen,0
|
||||||
mousebind=SUPER,btn_right,moveresize,curresize
|
mousebind=SUPER,btn_right,moveresize,curresize
|
||||||
|
mousebind=NONE,btn_left,toggleoverview,1
|
||||||
|
mousebind=NONE,btn_right,killclient,0
|
||||||
|
|
||||||
# Axis Bindings
|
# Axis Bindings
|
||||||
axisbind=SUPER,UP,viewtoleft_have_client
|
axisbind=SUPER,UP,viewtoleft_have_client
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Encoding=UTF-8
|
Encoding=UTF-8
|
||||||
Name=Mango
|
Name=Mango
|
||||||
DesktopNames=mango;wlroots
|
|
||||||
Comment=mango WM
|
Comment=mango WM
|
||||||
Exec=mango
|
Exec=mango
|
||||||
Icon=mango
|
Icon=mango
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
project('mango', ['c', 'cpp'],
|
project('mango', ['c', 'cpp'],
|
||||||
version : '0.12.3',
|
version : '0.12.0',
|
||||||
)
|
)
|
||||||
|
|
||||||
subdir('protocols')
|
subdir('protocols')
|
||||||
|
|
@ -56,7 +56,7 @@ endif
|
||||||
if is_git_repo
|
if is_git_repo
|
||||||
# 如果是 Git 目录,获取 Commit Hash 和最新的 tag
|
# 如果是 Git 目录,获取 Commit Hash 和最新的 tag
|
||||||
commit_hash = run_command(git, 'rev-parse', '--short', 'HEAD', check : false).stdout().strip()
|
commit_hash = run_command(git, 'rev-parse', '--short', 'HEAD', check : false).stdout().strip()
|
||||||
latest_tag = meson.project_version()
|
latest_tag = run_command(git, 'describe', '--tags', '--abbrev=0', check : false).stdout().strip()
|
||||||
version_with_hash = '@0@(@1@)'.format(latest_tag, commit_hash)
|
version_with_hash = '@0@(@1@)'.format(latest_tag, commit_hash)
|
||||||
else
|
else
|
||||||
# 如果不是 Git 目录,使用项目版本号和 "release" 字符串
|
# 如果不是 Git 目录,使用项目版本号和 "release" 字符串
|
||||||
|
|
|
||||||
46
mmsg/mmsg.c
46
mmsg/mmsg.c
|
|
@ -500,48 +500,12 @@ static const struct wl_registry_listener registry_listener = {
|
||||||
|
|
||||||
static void usage(void) {
|
static void usage(void) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"mmsg - MangoWC IPC\n"
|
"usage:"
|
||||||
"\n"
|
"\t%s [-OTLq]\n"
|
||||||
"SYNOPSIS:\n"
|
"\t%s [-o <output>] -s [-t <tags>] [-l <layout>] [-c <tags>] [-d "
|
||||||
"\tmmsg [-OTLq]\n"
|
|
||||||
"\tmmsg [-o <output>] -s [-t <tags>] [-l <layout>] [-c <tags>] [-d "
|
|
||||||
"<cmd>,<arg1>,<arg2>,<arg3>,<arg4>,<arg5>]\n"
|
"<cmd>,<arg1>,<arg2>,<arg3>,<arg4>,<arg5>]\n"
|
||||||
"\tmmsg [-o <output>] (-g | -w) [-OotlcvmfxekbA]\n"
|
"\t%s [-o <output>] (-g | -w) [-OotlcvmfxekbA]\n",
|
||||||
"\n"
|
argv0, argv0, argv0);
|
||||||
"OPERATION MODES:\n"
|
|
||||||
"\t-g Get values (tags, layout, focused client)\n"
|
|
||||||
"\t-s Set values (switch tags, layouts)\n"
|
|
||||||
"\t-w Watch mode (stream events)\n"
|
|
||||||
"\n"
|
|
||||||
"GENERAL OPTIONS:\n"
|
|
||||||
"\t-O Get all output (monitor) information\n"
|
|
||||||
"\t-T Get number of tags\n"
|
|
||||||
"\t-L Get all available layouts\n"
|
|
||||||
"\t-q Quit MangoWC\n"
|
|
||||||
"\t-o <output> Select output (monitor)\n"
|
|
||||||
"\n"
|
|
||||||
"GET OPTIONS (used with -g or -w):\n"
|
|
||||||
"\t-O Get output name\n"
|
|
||||||
"\t-o Get output (monitor) focus information\n"
|
|
||||||
"\t-t Get selected tags\n"
|
|
||||||
"\t-l Get current layout\n"
|
|
||||||
"\t-c Get title and appid of focused clients\n"
|
|
||||||
"\t-v Get visibility of statusbar\n"
|
|
||||||
"\t-m Get fullscreen status\n"
|
|
||||||
"\t-f Get floating status\n"
|
|
||||||
"\t-x Get focused client geometry\n"
|
|
||||||
"\t-e Get name of last focused layer\n"
|
|
||||||
"\t-k Get current keyboard layout\n"
|
|
||||||
"\t-b Get current keybind mode\n"
|
|
||||||
"\t-A Get scale factor of monitor\n"
|
|
||||||
"\n"
|
|
||||||
"SET OPTIONS (used with -s):\n"
|
|
||||||
"\t-o <output> Select output (monitor)\n"
|
|
||||||
"\t-t <tags> Set selected tags (can be used with [+-^.] "
|
|
||||||
"modifiers)\n"
|
|
||||||
"\t-l <layout> Set current layout\n"
|
|
||||||
"\t-c <tags> Get title and appid of focused client\n"
|
|
||||||
"\t-d <cmd>,<args...> Dispatch internal command (max 5 args)\n");
|
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
wayland_scanner = find_program('wayland-scanner')
|
wayland_scanner = find_program('wayland-scanner')
|
||||||
wayland_protos_dep = dependency('wayland-protocols')
|
wayland_protos_dep = dependency('wayland-protocols')
|
||||||
wl_protocol_dir = wayland_protos_dep.get_variable(pkgconfig:'pkgdatadir')
|
wl_protocol_dir = wayland_protos_dep.get_pkgconfig_variable('pkgdatadir')
|
||||||
wayland_scanner_code = generator(
|
wayland_scanner_code = generator(
|
||||||
wayland_scanner,
|
wayland_scanner,
|
||||||
output: '@BASENAME@-protocol.c',
|
output: '@BASENAME@-protocol.c',
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ bool is_horizontal_right_stack_layout(Monitor *m) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t is_special_animation_rule(Client *c) {
|
int32_t is_special_animaiton_rule(Client *c) {
|
||||||
|
|
||||||
if (is_scroller_layout(c->mon) && !c->isfloating) {
|
if (is_scroller_layout(c->mon) && !c->isfloating) {
|
||||||
return DOWN;
|
return DOWN;
|
||||||
|
|
@ -70,7 +70,7 @@ int32_t is_special_animation_rule(Client *c) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_client_open_animation(Client *c, struct wlr_box geo) {
|
void set_client_open_animaiton(Client *c, struct wlr_box geo) {
|
||||||
int32_t slide_direction;
|
int32_t slide_direction;
|
||||||
int32_t horizontal, horizontal_value;
|
int32_t horizontal, horizontal_value;
|
||||||
int32_t vertical, vertical_value;
|
int32_t vertical, vertical_value;
|
||||||
|
|
@ -96,7 +96,7 @@ void set_client_open_animation(Client *c, struct wlr_box geo) {
|
||||||
geo.y + (geo.height - c->animainit_geom.height) / 2;
|
geo.y + (geo.height - c->animainit_geom.height) / 2;
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
special_direction = is_special_animation_rule(c);
|
special_direction = is_special_animaiton_rule(c);
|
||||||
center_x = c->geom.x + c->geom.width / 2;
|
center_x = c->geom.x + c->geom.width / 2;
|
||||||
center_y = c->geom.y + c->geom.height / 2;
|
center_y = c->geom.y + c->geom.height / 2;
|
||||||
if (special_direction == UNDIR) {
|
if (special_direction == UNDIR) {
|
||||||
|
|
@ -772,71 +772,71 @@ void init_fadeout_client(Client *c) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Client *fadeout_client = ecalloc(1, sizeof(*fadeout_client));
|
Client *fadeout_cient = ecalloc(1, sizeof(*fadeout_cient));
|
||||||
|
|
||||||
wlr_scene_node_set_enabled(&c->scene->node, true);
|
wlr_scene_node_set_enabled(&c->scene->node, true);
|
||||||
client_set_border_color(c, bordercolor);
|
client_set_border_color(c, bordercolor);
|
||||||
fadeout_client->scene =
|
fadeout_cient->scene =
|
||||||
wlr_scene_tree_snapshot(&c->scene->node, layers[LyrFadeOut]);
|
wlr_scene_tree_snapshot(&c->scene->node, layers[LyrFadeOut]);
|
||||||
wlr_scene_node_set_enabled(&c->scene->node, false);
|
wlr_scene_node_set_enabled(&c->scene->node, false);
|
||||||
|
|
||||||
if (!fadeout_client->scene) {
|
if (!fadeout_cient->scene) {
|
||||||
free(fadeout_client);
|
free(fadeout_cient);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fadeout_client->animation.duration = animation_duration_close;
|
fadeout_cient->animation.duration = animation_duration_close;
|
||||||
fadeout_client->geom = fadeout_client->current =
|
fadeout_cient->geom = fadeout_cient->current =
|
||||||
fadeout_client->animainit_geom = fadeout_client->animation.initial =
|
fadeout_cient->animainit_geom = fadeout_cient->animation.initial =
|
||||||
c->animation.current;
|
c->animation.current;
|
||||||
fadeout_client->mon = c->mon;
|
fadeout_cient->mon = c->mon;
|
||||||
fadeout_client->animation_type_close = c->animation_type_close;
|
fadeout_cient->animation_type_close = c->animation_type_close;
|
||||||
fadeout_client->animation.action = CLOSE;
|
fadeout_cient->animation.action = CLOSE;
|
||||||
fadeout_client->bw = c->bw;
|
fadeout_cient->bw = c->bw;
|
||||||
fadeout_client->nofadeout = c->nofadeout;
|
fadeout_cient->nofadeout = c->nofadeout;
|
||||||
|
|
||||||
// 这里snap节点的坐标设置是使用的相对坐标,所以不能加上原来坐标
|
// 这里snap节点的坐标设置是使用的相对坐标,所以不能加上原来坐标
|
||||||
// 这跟普通node有区别
|
// 这跟普通node有区别
|
||||||
|
|
||||||
fadeout_client->animation.initial.x = 0;
|
fadeout_cient->animation.initial.x = 0;
|
||||||
fadeout_client->animation.initial.y = 0;
|
fadeout_cient->animation.initial.y = 0;
|
||||||
|
|
||||||
if ((!c->animation_type_close &&
|
if ((!c->animation_type_close &&
|
||||||
strcmp(animation_type_close, "fade") == 0) ||
|
strcmp(animation_type_close, "fade") == 0) ||
|
||||||
(c->animation_type_close &&
|
(c->animation_type_close &&
|
||||||
strcmp(c->animation_type_close, "fade") == 0)) {
|
strcmp(c->animation_type_close, "fade") == 0)) {
|
||||||
fadeout_client->current.x = 0;
|
fadeout_cient->current.x = 0;
|
||||||
fadeout_client->current.y = 0;
|
fadeout_cient->current.y = 0;
|
||||||
fadeout_client->current.width = 0;
|
fadeout_cient->current.width = 0;
|
||||||
fadeout_client->current.height = 0;
|
fadeout_cient->current.height = 0;
|
||||||
} else if ((c->animation_type_close &&
|
} else if ((c->animation_type_close &&
|
||||||
strcmp(c->animation_type_close, "slide") == 0) ||
|
strcmp(c->animation_type_close, "slide") == 0) ||
|
||||||
(!c->animation_type_close &&
|
(!c->animation_type_close &&
|
||||||
strcmp(animation_type_close, "slide") == 0)) {
|
strcmp(animation_type_close, "slide") == 0)) {
|
||||||
fadeout_client->current.y =
|
fadeout_cient->current.y =
|
||||||
c->geom.y + c->geom.height / 2 > c->mon->m.y + c->mon->m.height / 2
|
c->geom.y + c->geom.height / 2 > c->mon->m.y + c->mon->m.height / 2
|
||||||
? c->mon->m.height -
|
? c->mon->m.height -
|
||||||
(c->animation.current.y - c->mon->m.y) // down out
|
(c->animation.current.y - c->mon->m.y) // down out
|
||||||
: c->mon->m.y - c->geom.height; // up out
|
: c->mon->m.y - c->geom.height; // up out
|
||||||
fadeout_client->current.x = 0; // x无偏差,垂直划出
|
fadeout_cient->current.x = 0; // x无偏差,垂直划出
|
||||||
} else {
|
} else {
|
||||||
fadeout_client->current.y =
|
fadeout_cient->current.y =
|
||||||
(fadeout_client->geom.height -
|
(fadeout_cient->geom.height -
|
||||||
fadeout_client->geom.height * zoom_end_ratio) /
|
fadeout_cient->geom.height * zoom_end_ratio) /
|
||||||
2;
|
2;
|
||||||
fadeout_client->current.x =
|
fadeout_cient->current.x =
|
||||||
(fadeout_client->geom.width -
|
(fadeout_cient->geom.width -
|
||||||
fadeout_client->geom.width * zoom_end_ratio) /
|
fadeout_cient->geom.width * zoom_end_ratio) /
|
||||||
2;
|
2;
|
||||||
fadeout_client->current.width =
|
fadeout_cient->current.width =
|
||||||
fadeout_client->geom.width * zoom_end_ratio;
|
fadeout_cient->geom.width * zoom_end_ratio;
|
||||||
fadeout_client->current.height =
|
fadeout_cient->current.height =
|
||||||
fadeout_client->geom.height * zoom_end_ratio;
|
fadeout_cient->geom.height * zoom_end_ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
fadeout_client->animation.time_started = get_now_in_ms();
|
fadeout_cient->animation.time_started = get_now_in_ms();
|
||||||
wlr_scene_node_set_enabled(&fadeout_client->scene->node, true);
|
wlr_scene_node_set_enabled(&fadeout_cient->scene->node, true);
|
||||||
wl_list_insert(&fadeout_clients, &fadeout_client->fadeout_link);
|
wl_list_insert(&fadeout_clients, &fadeout_cient->fadeout_link);
|
||||||
|
|
||||||
// 请求刷新屏幕
|
// 请求刷新屏幕
|
||||||
request_fresh_all_monitors();
|
request_fresh_all_monitors();
|
||||||
|
|
@ -971,7 +971,7 @@ void resize(Client *c, struct wlr_box geo, int32_t interact) {
|
||||||
c->animainit_geom.height = c->animation.current.height;
|
c->animainit_geom.height = c->animation.current.height;
|
||||||
c->animainit_geom.width = c->animation.current.width;
|
c->animainit_geom.width = c->animation.current.width;
|
||||||
} else if (c->is_pending_open_animation) {
|
} else if (c->is_pending_open_animation) {
|
||||||
set_client_open_animation(c, c->geom);
|
set_client_open_animaiton(c, c->geom);
|
||||||
} else {
|
} else {
|
||||||
c->animainit_geom = c->animation.current;
|
c->animainit_geom = c->animation.current;
|
||||||
}
|
}
|
||||||
|
|
@ -990,10 +990,6 @@ void resize(Client *c, struct wlr_box geo, int32_t interact) {
|
||||||
c->configure_serial = client_set_size(c, c->geom.width - 2 * c->bw,
|
c->configure_serial = client_set_size(c, c->geom.width - 2 * c->bw,
|
||||||
c->geom.height - 2 * c->bw);
|
c->geom.height - 2 * c->bw);
|
||||||
|
|
||||||
if (c->configure_serial != 0) {
|
|
||||||
c->mon->resizing_count_pending++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == grabc) {
|
if (c == grabc) {
|
||||||
c->animation.running = false;
|
c->animation.running = false;
|
||||||
c->need_output_flush = false;
|
c->need_output_flush = false;
|
||||||
|
|
@ -1058,11 +1054,20 @@ void client_set_focused_opacity_animation(Client *c) {
|
||||||
sizeof(c->opacity_animation.target_border_color));
|
sizeof(c->opacity_animation.target_border_color));
|
||||||
c->opacity_animation.target_opacity = c->focused_opacity;
|
c->opacity_animation.target_opacity = c->focused_opacity;
|
||||||
c->opacity_animation.time_started = get_now_in_ms();
|
c->opacity_animation.time_started = get_now_in_ms();
|
||||||
memcpy(c->opacity_animation.initial_border_color,
|
if (c->opacity_animation.running) {
|
||||||
c->opacity_animation.current_border_color,
|
memcpy(c->opacity_animation.initial_border_color,
|
||||||
sizeof(c->opacity_animation.initial_border_color));
|
c->opacity_animation.current_border_color,
|
||||||
c->opacity_animation.initial_opacity = c->opacity_animation.current_opacity;
|
sizeof(c->opacity_animation.initial_border_color));
|
||||||
|
c->opacity_animation.initial_opacity =
|
||||||
|
c->opacity_animation.current_opacity;
|
||||||
|
} else {
|
||||||
|
memcpy(c->opacity_animation.initial_border_color, bordercolor,
|
||||||
|
sizeof(c->opacity_animation.initial_border_color));
|
||||||
|
memcpy(c->opacity_animation.current_border_color, bordercolor,
|
||||||
|
sizeof(c->opacity_animation.current_border_color));
|
||||||
|
c->opacity_animation.initial_opacity = c->unfocused_opacity;
|
||||||
|
c->opacity_animation.current_opacity = c->unfocused_opacity;
|
||||||
|
}
|
||||||
c->opacity_animation.running = true;
|
c->opacity_animation.running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1082,10 +1087,20 @@ void client_set_unfocused_opacity_animation(Client *c) {
|
||||||
c->opacity_animation.target_opacity = c->unfocused_opacity;
|
c->opacity_animation.target_opacity = c->unfocused_opacity;
|
||||||
c->opacity_animation.time_started = get_now_in_ms();
|
c->opacity_animation.time_started = get_now_in_ms();
|
||||||
|
|
||||||
memcpy(c->opacity_animation.initial_border_color,
|
if (c->opacity_animation.running) {
|
||||||
c->opacity_animation.current_border_color,
|
memcpy(c->opacity_animation.initial_border_color,
|
||||||
sizeof(c->opacity_animation.initial_border_color));
|
c->opacity_animation.current_border_color,
|
||||||
c->opacity_animation.initial_opacity = c->opacity_animation.current_opacity;
|
sizeof(c->opacity_animation.initial_border_color));
|
||||||
|
c->opacity_animation.initial_opacity =
|
||||||
|
c->opacity_animation.current_opacity;
|
||||||
|
} else {
|
||||||
|
memcpy(c->opacity_animation.initial_border_color, border_color,
|
||||||
|
sizeof(c->opacity_animation.initial_border_color));
|
||||||
|
memcpy(c->opacity_animation.current_border_color, border_color,
|
||||||
|
sizeof(c->opacity_animation.current_border_color));
|
||||||
|
c->opacity_animation.initial_opacity = c->focused_opacity;
|
||||||
|
c->opacity_animation.current_opacity = c->focused_opacity;
|
||||||
|
}
|
||||||
|
|
||||||
c->opacity_animation.running = true;
|
c->opacity_animation.running = true;
|
||||||
}
|
}
|
||||||
|
|
@ -1120,10 +1135,6 @@ bool client_apply_focus_opacity(Client *c) {
|
||||||
if (target_opacity > opacity) {
|
if (target_opacity > opacity) {
|
||||||
target_opacity = opacity;
|
target_opacity = opacity;
|
||||||
}
|
}
|
||||||
memcpy(c->opacity_animation.current_border_color,
|
|
||||||
c->opacity_animation.target_border_color,
|
|
||||||
sizeof(c->opacity_animation.current_border_color));
|
|
||||||
c->opacity_animation.current_opacity = target_opacity;
|
|
||||||
client_set_opacity(c, target_opacity);
|
client_set_opacity(c, target_opacity);
|
||||||
client_set_border_color(c, c->opacity_animation.target_border_color);
|
client_set_border_color(c, c->opacity_animation.target_border_color);
|
||||||
} else if (animations && c->opacity_animation.running) {
|
} else if (animations && c->opacity_animation.running) {
|
||||||
|
|
|
||||||
|
|
@ -243,6 +243,31 @@ static inline int32_t client_is_rendered_on_mon(Client *c, Monitor *m) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int32_t client_is_stopped(Client *c) {
|
||||||
|
int32_t pid;
|
||||||
|
siginfo_t in = {0};
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (client_is_x11(c))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL);
|
||||||
|
if (waitid(P_PID, pid, &in, WNOHANG | WCONTINUED | WSTOPPED | WNOWAIT) <
|
||||||
|
0) {
|
||||||
|
/* This process is not our child process, while is very unluckely that
|
||||||
|
* it is stopped, in order to do not skip frames assume that it is. */
|
||||||
|
if (errno == ECHILD)
|
||||||
|
return 1;
|
||||||
|
} else if (in.si_pid) {
|
||||||
|
if (in.si_code == CLD_STOPPED || in.si_code == CLD_TRAPPED)
|
||||||
|
return 1;
|
||||||
|
if (in.si_code == CLD_CONTINUED)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int32_t client_is_unmanaged(Client *c) {
|
static inline int32_t client_is_unmanaged(Client *c) {
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c))
|
if (client_is_x11(c))
|
||||||
|
|
@ -294,24 +319,9 @@ static inline uint32_t client_set_size(Client *c, uint32_t width,
|
||||||
uint32_t height) {
|
uint32_t height) {
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c)) {
|
if (client_is_x11(c)) {
|
||||||
|
|
||||||
struct wlr_surface_state *state =
|
|
||||||
&c->surface.xwayland->surface->current;
|
|
||||||
|
|
||||||
if ((int32_t)c->geom.width - 2 * (int32_t)c->bw ==
|
|
||||||
(int32_t)state->width &&
|
|
||||||
(int32_t)c->geom.height - 2 * (int32_t)c->bw ==
|
|
||||||
(int32_t)state->height &&
|
|
||||||
(int32_t)c->surface.xwayland->x ==
|
|
||||||
(int32_t)c->geom.x + (int32_t)c->bw &&
|
|
||||||
(int32_t)c->surface.xwayland->y ==
|
|
||||||
(int32_t)c->geom.y + (int32_t)c->bw) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
wlr_xwayland_surface_configure(c->surface.xwayland, c->geom.x + c->bw,
|
wlr_xwayland_surface_configure(c->surface.xwayland, c->geom.x + c->bw,
|
||||||
c->geom.y + c->bw, width, height);
|
c->geom.y + c->bw, width, height);
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((int32_t)width == c->surface.xdg->toplevel->current.width &&
|
if ((int32_t)width == c->surface.xdg->toplevel->current.width &&
|
||||||
|
|
@ -537,4 +547,4 @@ static inline void client_set_size_bound(Client *c) {
|
||||||
state.max_height > 0) {
|
state.max_height > 0) {
|
||||||
c->geom.height = state.max_height + 2 * c->bw;
|
c->geom.height = state.max_height + 2 * c->bw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -66,7 +66,6 @@ float scroller_default_proportion_single = 1.0;
|
||||||
int32_t scroller_ignore_proportion_single = 1;
|
int32_t scroller_ignore_proportion_single = 1;
|
||||||
int32_t scroller_focus_center = 0;
|
int32_t scroller_focus_center = 0;
|
||||||
int32_t scroller_prefer_center = 0;
|
int32_t scroller_prefer_center = 0;
|
||||||
int32_t scroller_prefer_overspread = 1;
|
|
||||||
int32_t focus_cross_monitor = 0;
|
int32_t focus_cross_monitor = 0;
|
||||||
int32_t focus_cross_tag = 0;
|
int32_t focus_cross_tag = 0;
|
||||||
int32_t exchange_cross_monitor = 0;
|
int32_t exchange_cross_monitor = 0;
|
||||||
|
|
@ -109,8 +108,7 @@ int32_t drag_warp_cursor = 1;
|
||||||
int32_t xwayland_persistence = 1; /* xwayland persistence */
|
int32_t xwayland_persistence = 1; /* xwayland persistence */
|
||||||
int32_t syncobj_enable = 0;
|
int32_t syncobj_enable = 0;
|
||||||
int32_t allow_lock_transparent = 0;
|
int32_t allow_lock_transparent = 0;
|
||||||
double drag_tile_refresh_interval = 16.0;
|
double drag_refresh_interval = 16.0;
|
||||||
double drag_floating_refresh_interval = 8.0;
|
|
||||||
int32_t allow_tearing = TEARING_DISABLED;
|
int32_t allow_tearing = TEARING_DISABLED;
|
||||||
int32_t allow_shortcuts_inhibit = SHORTCUTS_INHIBIT_ENABLE;
|
int32_t allow_shortcuts_inhibit = SHORTCUTS_INHIBIT_ENABLE;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
int32_t bind_to_view(const Arg *arg) {
|
int32_t bind_to_view(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
uint32_t target = arg->ui;
|
uint32_t target = arg->ui;
|
||||||
|
|
||||||
if (view_current_to_back && selmon->pertag->curtag &&
|
if (view_current_to_back && selmon->pertag->curtag &&
|
||||||
|
|
@ -101,8 +100,6 @@ int32_t defaultgaps(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t exchange_client(const Arg *arg) {
|
int32_t exchange_client(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
Client *c = selmon->sel;
|
Client *c = selmon->sel;
|
||||||
if (!c || c->isfloating)
|
if (!c || c->isfloating)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -115,9 +112,6 @@ int32_t exchange_client(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t exchange_stack_client(const Arg *arg) {
|
int32_t exchange_stack_client(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Client *c = selmon->sel;
|
Client *c = selmon->sel;
|
||||||
Client *tc = NULL;
|
Client *tc = NULL;
|
||||||
if (!c || c->isfloating || c->isfullscreen || c->ismaximizescreen)
|
if (!c || c->isfloating || c->isfullscreen || c->ismaximizescreen)
|
||||||
|
|
@ -271,56 +265,42 @@ int32_t incnmaster(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incgaps(const Arg *arg) {
|
int32_t incgaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i,
|
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i,
|
||||||
selmon->gappih + arg->i, selmon->gappiv + arg->i);
|
selmon->gappih + arg->i, selmon->gappiv + arg->i);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incigaps(const Arg *arg) {
|
int32_t incigaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
||||||
selmon->gappiv + arg->i);
|
selmon->gappiv + arg->i);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incogaps(const Arg *arg) {
|
int32_t incogaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i, selmon->gappih,
|
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i, selmon->gappih,
|
||||||
selmon->gappiv);
|
selmon->gappiv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incihgaps(const Arg *arg) {
|
int32_t incihgaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
||||||
selmon->gappiv);
|
selmon->gappiv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incivgaps(const Arg *arg) {
|
int32_t incivgaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih,
|
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih,
|
||||||
selmon->gappiv + arg->i);
|
selmon->gappiv + arg->i);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incohgaps(const Arg *arg) {
|
int32_t incohgaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh + arg->i, selmon->gappov, selmon->gappih,
|
setgaps(selmon->gappoh + arg->i, selmon->gappov, selmon->gappih,
|
||||||
selmon->gappiv);
|
selmon->gappiv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t incovgaps(const Arg *arg) {
|
int32_t incovgaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
setgaps(selmon->gappoh, selmon->gappov + arg->i, selmon->gappih,
|
setgaps(selmon->gappoh, selmon->gappov + arg->i, selmon->gappih,
|
||||||
selmon->gappiv);
|
selmon->gappiv);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -350,8 +330,6 @@ int32_t setmfact(const Arg *arg) {
|
||||||
|
|
||||||
int32_t killclient(const Arg *arg) {
|
int32_t killclient(const Arg *arg) {
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
if (c) {
|
if (c) {
|
||||||
pending_kill_client(c);
|
pending_kill_client(c);
|
||||||
|
|
@ -421,8 +399,6 @@ int32_t moveresize(const Arg *arg) {
|
||||||
|
|
||||||
int32_t movewin(const Arg *arg) {
|
int32_t movewin(const Arg *arg) {
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
if (!c || c->isfullscreen)
|
if (!c || c->isfullscreen)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -466,8 +442,6 @@ int32_t quit(const Arg *arg) {
|
||||||
|
|
||||||
int32_t resizewin(const Arg *arg) {
|
int32_t resizewin(const Arg *arg) {
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
int32_t offsetx = 0, offsety = 0;
|
int32_t offsetx = 0, offsety = 0;
|
||||||
|
|
||||||
|
|
@ -572,8 +546,6 @@ int32_t restore_minimized(const Arg *arg) {
|
||||||
|
|
||||||
int32_t setlayout(const Arg *arg) {
|
int32_t setlayout(const Arg *arg) {
|
||||||
int32_t jk;
|
int32_t jk;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (jk = 0; jk < LENGTH(layouts); jk++) {
|
for (jk = 0; jk < LENGTH(layouts); jk++) {
|
||||||
if (strcmp(layouts[jk].name, arg->v) == 0) {
|
if (strcmp(layouts[jk].name, arg->v) == 0) {
|
||||||
|
|
@ -599,8 +571,6 @@ int32_t setkeymode(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t set_proportion(const Arg *arg) {
|
int32_t set_proportion(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selmon->isoverview || !is_scroller_layout(selmon))
|
if (selmon->isoverview || !is_scroller_layout(selmon))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -626,8 +596,6 @@ int32_t smartmovewin(const Arg *arg) {
|
||||||
Client *c = NULL, *tc = NULL;
|
Client *c = NULL, *tc = NULL;
|
||||||
int32_t nx, ny;
|
int32_t nx, ny;
|
||||||
int32_t buttom, top, left, right, tar;
|
int32_t buttom, top, left, right, tar;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
if (!c || c->isfullscreen)
|
if (!c || c->isfullscreen)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -729,8 +697,6 @@ int32_t smartresizewin(const Arg *arg) {
|
||||||
Client *c = NULL, *tc = NULL;
|
Client *c = NULL, *tc = NULL;
|
||||||
int32_t nw, nh;
|
int32_t nw, nh;
|
||||||
int32_t buttom, top, left, right, tar;
|
int32_t buttom, top, left, right, tar;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
if (!c || c->isfullscreen)
|
if (!c || c->isfullscreen)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -799,8 +765,6 @@ int32_t smartresizewin(const Arg *arg) {
|
||||||
|
|
||||||
int32_t centerwin(const Arg *arg) {
|
int32_t centerwin(const Arg *arg) {
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
c = selmon->sel;
|
c = selmon->sel;
|
||||||
|
|
||||||
if (!c || c->isfullscreen || c->ismaximizescreen)
|
if (!c || c->isfullscreen || c->ismaximizescreen)
|
||||||
|
|
@ -936,20 +900,16 @@ int32_t switch_keyboard_layout(const Arg *arg) {
|
||||||
wlr_log(WLR_INFO, "Only one layout available");
|
wlr_log(WLR_INFO, "Only one layout available");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
xkb_layout_index_t next = (current + 1) % num_layouts;
|
||||||
xkb_layout_index_t next = 0;
|
|
||||||
if (arg->i > 0 && arg->i <= num_layouts) {
|
|
||||||
next = arg->i - 1;
|
|
||||||
} else {
|
|
||||||
next = (current + 1) % num_layouts;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 6. 应用新 keymap
|
// 6. 应用新 keymap
|
||||||
uint32_t depressed = keyboard->modifiers.depressed;
|
uint32_t depressed = keyboard->modifiers.depressed;
|
||||||
uint32_t latched = keyboard->modifiers.latched;
|
uint32_t latched = keyboard->modifiers.latched;
|
||||||
uint32_t locked = keyboard->modifiers.locked;
|
uint32_t locked = keyboard->modifiers.locked;
|
||||||
|
|
||||||
|
wlr_keyboard_set_keymap(keyboard, keyboard->keymap);
|
||||||
wlr_keyboard_notify_modifiers(keyboard, depressed, latched, locked, next);
|
wlr_keyboard_notify_modifiers(keyboard, depressed, latched, locked, next);
|
||||||
|
keyboard->modifiers.group = 0;
|
||||||
|
|
||||||
// 7. 更新 seat
|
// 7. 更新 seat
|
||||||
wlr_seat_set_keyboard(seat, keyboard);
|
wlr_seat_set_keyboard(seat, keyboard);
|
||||||
|
|
@ -963,7 +923,10 @@ int32_t switch_keyboard_layout(const Arg *arg) {
|
||||||
|
|
||||||
struct wlr_keyboard *tkb = (struct wlr_keyboard *)id->device_data;
|
struct wlr_keyboard *tkb = (struct wlr_keyboard *)id->device_data;
|
||||||
|
|
||||||
|
wlr_keyboard_set_keymap(tkb, keyboard->keymap);
|
||||||
wlr_keyboard_notify_modifiers(tkb, depressed, latched, locked, next);
|
wlr_keyboard_notify_modifiers(tkb, depressed, latched, locked, next);
|
||||||
|
tkb->modifiers.group = 0;
|
||||||
|
|
||||||
// 7. 更新 seat
|
// 7. 更新 seat
|
||||||
wlr_seat_set_keyboard(seat, tkb);
|
wlr_seat_set_keyboard(seat, tkb);
|
||||||
wlr_seat_keyboard_notify_modifiers(seat, &tkb->modifiers);
|
wlr_seat_keyboard_notify_modifiers(seat, &tkb->modifiers);
|
||||||
|
|
@ -979,9 +942,6 @@ int32_t switch_layout(const Arg *arg) {
|
||||||
char *target_layout_name = NULL;
|
char *target_layout_name = NULL;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (config.circle_layout_count != 0) {
|
if (config.circle_layout_count != 0) {
|
||||||
for (jk = 0; jk < config.circle_layout_count; jk++) {
|
for (jk = 0; jk < config.circle_layout_count; jk++) {
|
||||||
|
|
||||||
|
|
@ -1033,8 +993,6 @@ int32_t switch_layout(const Arg *arg) {
|
||||||
|
|
||||||
int32_t switch_proportion_preset(const Arg *arg) {
|
int32_t switch_proportion_preset(const Arg *arg) {
|
||||||
float target_proportion = 0;
|
float target_proportion = 0;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (config.scroller_proportion_preset_count == 0) {
|
if (config.scroller_proportion_preset_count == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1079,8 +1037,6 @@ int32_t switch_proportion_preset(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tag(const Arg *arg) {
|
int32_t tag(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
Client *target_client = selmon->sel;
|
Client *target_client = selmon->sel;
|
||||||
tag_client(arg, target_client);
|
tag_client(arg, target_client);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1088,8 +1044,6 @@ int32_t tag(const Arg *arg) {
|
||||||
|
|
||||||
int32_t tagmon(const Arg *arg) {
|
int32_t tagmon(const Arg *arg) {
|
||||||
Monitor *m = NULL, *cm = NULL;
|
Monitor *m = NULL, *cm = NULL;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
Client *c = focustop(selmon);
|
Client *c = focustop(selmon);
|
||||||
|
|
||||||
if (!c)
|
if (!c)
|
||||||
|
|
@ -1181,9 +1135,6 @@ int32_t tagsilent(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tagtoleft(const Arg *arg) {
|
int32_t tagtoleft(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selmon->sel != NULL &&
|
if (selmon->sel != NULL &&
|
||||||
__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 &&
|
__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 &&
|
||||||
selmon->tagset[selmon->seltags] > 1) {
|
selmon->tagset[selmon->seltags] > 1) {
|
||||||
|
|
@ -1193,9 +1144,6 @@ int32_t tagtoleft(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tagtoright(const Arg *arg) {
|
int32_t tagtoright(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selmon->sel != NULL &&
|
if (selmon->sel != NULL &&
|
||||||
__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 &&
|
__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1 &&
|
||||||
selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) {
|
selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) {
|
||||||
|
|
@ -1224,8 +1172,6 @@ int32_t toggle_named_scratchpad(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t toggle_render_border(const Arg *arg) {
|
int32_t toggle_render_border(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
render_border = !render_border;
|
render_border = !render_border;
|
||||||
arrange(selmon, false, false);
|
arrange(selmon, false, false);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1261,8 +1207,6 @@ int32_t toggle_scratchpad(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t togglefakefullscreen(const Arg *arg) {
|
int32_t togglefakefullscreen(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
Client *sel = focustop(selmon);
|
Client *sel = focustop(selmon);
|
||||||
if (sel)
|
if (sel)
|
||||||
setfakefullscreen(sel, !sel->isfakefullscreen);
|
setfakefullscreen(sel, !sel->isfakefullscreen);
|
||||||
|
|
@ -1270,9 +1214,6 @@ int32_t togglefakefullscreen(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t togglefloating(const Arg *arg) {
|
int32_t togglefloating(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Client *sel = focustop(selmon);
|
Client *sel = focustop(selmon);
|
||||||
|
|
||||||
if (selmon && selmon->isoverview)
|
if (selmon && selmon->isoverview)
|
||||||
|
|
@ -1281,22 +1222,17 @@ int32_t togglefloating(const Arg *arg) {
|
||||||
if (!sel)
|
if (!sel)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bool isfloating = sel->isfloating;
|
|
||||||
|
|
||||||
if ((sel->isfullscreen || sel->ismaximizescreen)) {
|
if ((sel->isfullscreen || sel->ismaximizescreen)) {
|
||||||
isfloating = 1;
|
sel->isfloating = 1;
|
||||||
} else {
|
} else {
|
||||||
isfloating = !sel->isfloating;
|
sel->isfloating = !sel->isfloating;
|
||||||
}
|
}
|
||||||
|
|
||||||
setfloating(sel, isfloating);
|
setfloating(sel, sel->isfloating);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t togglefullscreen(const Arg *arg) {
|
int32_t togglefullscreen(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Client *sel = focustop(selmon);
|
Client *sel = focustop(selmon);
|
||||||
if (!sel)
|
if (!sel)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1313,9 +1249,6 @@ int32_t togglefullscreen(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t toggleglobal(const Arg *arg) {
|
int32_t toggleglobal(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!selmon->sel)
|
if (!selmon->sel)
|
||||||
return 0;
|
return 0;
|
||||||
if (selmon->sel->is_in_scratchpad) {
|
if (selmon->sel->is_in_scratchpad) {
|
||||||
|
|
@ -1334,18 +1267,12 @@ int32_t toggleglobal(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t togglegaps(const Arg *arg) {
|
int32_t togglegaps(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
enablegaps ^= 1;
|
enablegaps ^= 1;
|
||||||
arrange(selmon, false, false);
|
arrange(selmon, false, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t togglemaximizescreen(const Arg *arg) {
|
int32_t togglemaximizescreen(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Client *sel = focustop(selmon);
|
Client *sel = focustop(selmon);
|
||||||
if (!sel)
|
if (!sel)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1364,9 +1291,6 @@ int32_t togglemaximizescreen(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t toggleoverlay(const Arg *arg) {
|
int32_t toggleoverlay(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!selmon->sel || !selmon->sel->mon || selmon->sel->isfullscreen) {
|
if (!selmon->sel || !selmon->sel->mon || selmon->sel->isfullscreen) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1388,9 +1312,6 @@ int32_t toggleoverlay(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t toggletag(const Arg *arg) {
|
int32_t toggletag(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint32_t newtags;
|
uint32_t newtags;
|
||||||
Client *sel = focustop(selmon);
|
Client *sel = focustop(selmon);
|
||||||
if (!sel)
|
if (!sel)
|
||||||
|
|
@ -1414,15 +1335,13 @@ int32_t toggletag(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t toggleview(const Arg *arg) {
|
int32_t toggleview(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint32_t newtagset;
|
uint32_t newtagset;
|
||||||
uint32_t target;
|
uint32_t target;
|
||||||
|
|
||||||
target = arg->ui == 0 ? ~0 & TAGMASK : arg->ui;
|
target = arg->ui == 0 ? ~0 & TAGMASK : arg->ui;
|
||||||
|
|
||||||
newtagset = selmon->tagset[selmon->seltags] ^ (target & TAGMASK);
|
newtagset =
|
||||||
|
selmon ? selmon->tagset[selmon->seltags] ^ (target & TAGMASK) : 0;
|
||||||
|
|
||||||
if (newtagset) {
|
if (newtagset) {
|
||||||
selmon->tagset[selmon->seltags] = newtagset;
|
selmon->tagset[selmon->seltags] = newtagset;
|
||||||
|
|
@ -1434,9 +1353,6 @@ int32_t toggleview(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t viewtoleft(const Arg *arg) {
|
int32_t viewtoleft(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint32_t target = selmon->tagset[selmon->seltags];
|
uint32_t target = selmon->tagset[selmon->seltags];
|
||||||
|
|
||||||
if (selmon->isoverview || selmon->pertag->curtag == 0) {
|
if (selmon->isoverview || selmon->pertag->curtag == 0) {
|
||||||
|
|
@ -1457,9 +1373,6 @@ int32_t viewtoleft(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t viewtoright(const Arg *arg) {
|
int32_t viewtoright(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selmon->isoverview || selmon->pertag->curtag == 0) {
|
if (selmon->isoverview || selmon->pertag->curtag == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1477,9 +1390,6 @@ int32_t viewtoright(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t viewtoleft_have_client(const Arg *arg) {
|
int32_t viewtoleft_have_client(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint32_t n;
|
uint32_t n;
|
||||||
uint32_t current = get_tags_first_tag_num(selmon->tagset[selmon->seltags]);
|
uint32_t current = get_tags_first_tag_num(selmon->tagset[selmon->seltags]);
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
@ -1504,9 +1414,6 @@ int32_t viewtoleft_have_client(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t viewtoright_have_client(const Arg *arg) {
|
int32_t viewtoright_have_client(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint32_t n;
|
uint32_t n;
|
||||||
uint32_t current = get_tags_first_tag_num(selmon->tagset[selmon->seltags]);
|
uint32_t current = get_tags_first_tag_num(selmon->tagset[selmon->seltags]);
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
@ -1531,9 +1438,6 @@ int32_t viewtoright_have_client(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t viewcrossmon(const Arg *arg) {
|
int32_t viewcrossmon(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
focusmon(&(Arg){.v = arg->v, .i = UNDIR});
|
focusmon(&(Arg){.v = arg->v, .i = UNDIR});
|
||||||
view_in_mon(arg, true, selmon, true);
|
view_in_mon(arg, true, selmon, true);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1612,8 +1516,6 @@ int32_t setoption(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t minimized(const Arg *arg) {
|
int32_t minimized(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selmon && selmon->isoverview)
|
if (selmon && selmon->isoverview)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1624,20 +1526,8 @@ int32_t minimized(const Arg *arg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fix_mon_tagset_from_overview(Monitor *m) {
|
|
||||||
if (m->tagset[m->seltags] == (m->ovbk_prev_tagset & TAGMASK)) {
|
|
||||||
m->tagset[m->seltags ^ 1] = m->ovbk_current_tagset;
|
|
||||||
m->pertag->prevtag = get_tags_first_tag_num(m->ovbk_current_tagset);
|
|
||||||
} else {
|
|
||||||
m->tagset[m->seltags ^ 1] = m->ovbk_prev_tagset;
|
|
||||||
m->pertag->prevtag = get_tags_first_tag_num(m->ovbk_prev_tagset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t toggleoverview(const Arg *arg) {
|
int32_t toggleoverview(const Arg *arg) {
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selmon->isoverview && ov_tab_mode && arg->i != 1 && selmon->sel) {
|
if (selmon->isoverview && ov_tab_mode && arg->i != 1 && selmon->sel) {
|
||||||
focusstack(&(Arg){.i = 1});
|
focusstack(&(Arg){.i = 1});
|
||||||
|
|
@ -1657,8 +1547,6 @@ int32_t toggleoverview(const Arg *arg) {
|
||||||
visible_client_number++;
|
visible_client_number++;
|
||||||
}
|
}
|
||||||
if (visible_client_number > 0) {
|
if (visible_client_number > 0) {
|
||||||
selmon->ovbk_current_tagset = selmon->tagset[selmon->seltags];
|
|
||||||
selmon->ovbk_prev_tagset = selmon->tagset[selmon->seltags ^ 1];
|
|
||||||
target = ~0 & TAGMASK;
|
target = ~0 & TAGMASK;
|
||||||
} else {
|
} else {
|
||||||
selmon->isoverview ^= 1;
|
selmon->isoverview ^= 1;
|
||||||
|
|
@ -1669,7 +1557,6 @@ int32_t toggleoverview(const Arg *arg) {
|
||||||
} else if (!selmon->isoverview && !selmon->sel) {
|
} else if (!selmon->isoverview && !selmon->sel) {
|
||||||
target = (1 << (selmon->pertag->prevtag - 1));
|
target = (1 << (selmon->pertag->prevtag - 1));
|
||||||
view(&(Arg){.ui = target}, false);
|
view(&(Arg){.ui = target}, false);
|
||||||
fix_mon_tagset_from_overview(selmon);
|
|
||||||
refresh_monitors_workspaces_status(selmon);
|
refresh_monitors_workspaces_status(selmon);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1692,7 +1579,7 @@ int32_t toggleoverview(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
view(&(Arg){.ui = target}, false);
|
view(&(Arg){.ui = target}, false);
|
||||||
fix_mon_tagset_from_overview(selmon);
|
|
||||||
refresh_monitors_workspaces_status(selmon);
|
refresh_monitors_workspaces_status(selmon);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1743,8 +1630,6 @@ int32_t toggle_monitor(const Arg *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scroller_stack(const Arg *arg) {
|
int32_t scroller_stack(const Arg *arg) {
|
||||||
if (!selmon)
|
|
||||||
return 0;
|
|
||||||
Client *c = selmon->sel;
|
Client *c = selmon->sel;
|
||||||
Client *stack_head = NULL;
|
Client *stack_head = NULL;
|
||||||
Client *source_stack_head = NULL;
|
Client *source_stack_head = NULL;
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,6 @@ setclient_coordinate_center(Client *c, Monitor *tm, struct wlr_box geom,
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
Monitor *m = tm ? tm : selmon;
|
Monitor *m = tm ? tm : selmon;
|
||||||
|
|
||||||
if (!m)
|
|
||||||
return geom;
|
|
||||||
|
|
||||||
uint32_t cbw = check_hit_no_border(c) ? c->bw : 0;
|
uint32_t cbw = check_hit_no_border(c) ? c->bw : 0;
|
||||||
|
|
||||||
if (!c->no_force_center && m) {
|
if (!c->no_force_center && m) {
|
||||||
|
|
@ -577,29 +574,23 @@ bool client_is_in_same_stack(Client *sc, Client *tc, Client *fc) {
|
||||||
|
|
||||||
if (id == TILE || id == VERTICAL_TILE || id == DECK ||
|
if (id == TILE || id == VERTICAL_TILE || id == DECK ||
|
||||||
id == VERTICAL_DECK || id == RIGHT_TILE) {
|
id == VERTICAL_DECK || id == RIGHT_TILE) {
|
||||||
if (tc->ismaster ^ sc->ismaster)
|
if (fc && !fc->ismaster)
|
||||||
return false;
|
return false;
|
||||||
if (fc && !(fc->ismaster ^ sc->ismaster))
|
else if (!sc->ismaster)
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == TGMIX) {
|
if (id == TGMIX) {
|
||||||
if (tc->ismaster ^ sc->ismaster)
|
if (fc && !fc->ismaster)
|
||||||
return false;
|
|
||||||
if (fc && !(fc->ismaster ^ sc->ismaster))
|
|
||||||
return false;
|
return false;
|
||||||
if (!sc->ismaster && sc->mon->visible_tiling_clients <= 3)
|
if (!sc->ismaster && sc->mon->visible_tiling_clients <= 3)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == CENTER_TILE) {
|
if (id == CENTER_TILE) {
|
||||||
if (tc->ismaster ^ sc->ismaster)
|
if (fc && !fc->ismaster)
|
||||||
return false;
|
return false;
|
||||||
if (fc && !(fc->ismaster ^ sc->ismaster))
|
if (!sc->ismaster && sc->geom.x == tc->geom.x)
|
||||||
return false;
|
|
||||||
if (sc->geom.x == tc->geom.x)
|
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,10 @@ void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc,
|
||||||
surface = wlr_scene_surface_try_from_buffer(
|
surface = wlr_scene_surface_try_from_buffer(
|
||||||
wlr_scene_buffer_from_node(node))
|
wlr_scene_buffer_from_node(node))
|
||||||
->surface;
|
->surface;
|
||||||
|
else if (node->type == WLR_SCENE_NODE_RECT) {
|
||||||
|
surface = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* start from the topmost layer,
|
/* start from the topmost layer,
|
||||||
find a sureface that can be focused by pointer,
|
find a sureface that can be focused by pointer,
|
||||||
|
|
@ -115,13 +119,6 @@ void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc,
|
||||||
l = pnode->data;
|
l = pnode->data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->type == WLR_SCENE_NODE_RECT) {
|
|
||||||
if (c) {
|
|
||||||
surface = client_surface(c);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psurface)
|
if (psurface)
|
||||||
|
|
|
||||||
|
|
@ -1,45 +1,3 @@
|
||||||
void restore_size_per(Monitor *m, Client *c) {
|
|
||||||
Client *fc = NULL;
|
|
||||||
double total_master_inner_per = 0;
|
|
||||||
double total_stack_inner_per = 0;
|
|
||||||
|
|
||||||
if (!m || !c)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const Layout *current_layout = m->pertag->ltidxs[m->pertag->curtag];
|
|
||||||
|
|
||||||
if (current_layout->id == SCROLLER ||
|
|
||||||
current_layout->id == VERTICAL_SCROLLER || current_layout->id == GRID ||
|
|
||||||
current_layout->id == VERTICAL_GRID || current_layout->id == DECK ||
|
|
||||||
current_layout->id == VERTICAL_DECK || current_layout->id == MONOCLE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current_layout->id == CENTER_TILE || c->ismaster) {
|
|
||||||
wl_list_for_each(fc, &clients, link) {
|
|
||||||
if (VISIBLEON(fc, m) && ISTILED(fc) && !c->ismaster) {
|
|
||||||
set_size_per(m, fc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_list_for_each(fc, &clients, link) {
|
|
||||||
if (VISIBLEON(fc, m) && ISTILED(fc) && fc != c) {
|
|
||||||
if (fc->ismaster) {
|
|
||||||
total_master_inner_per += fc->master_inner_per;
|
|
||||||
} else {
|
|
||||||
total_stack_inner_per += fc->stack_inner_per;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!c->ismaster && total_stack_inner_per) {
|
|
||||||
c->stack_inner_per = total_stack_inner_per * c->stack_inner_per /
|
|
||||||
(1 - c->stack_inner_per);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_size_per(Monitor *m, Client *c) {
|
void set_size_per(Monitor *m, Client *c) {
|
||||||
Client *fc = NULL;
|
Client *fc = NULL;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
@ -47,13 +5,8 @@ void set_size_per(Monitor *m, Client *c) {
|
||||||
if (!m || !c)
|
if (!m || !c)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const Layout *current_layout = m->pertag->ltidxs[m->pertag->curtag];
|
|
||||||
|
|
||||||
wl_list_for_each(fc, &clients, link) {
|
wl_list_for_each(fc, &clients, link) {
|
||||||
if (VISIBLEON(fc, m) && ISTILED(fc) && fc != c) {
|
if (VISIBLEON(fc, m) && ISTILED(fc) && fc != c) {
|
||||||
if (current_layout->id == CENTER_TILE &&
|
|
||||||
!(fc->isleftstack ^ c->isleftstack))
|
|
||||||
continue;
|
|
||||||
c->master_mfact_per = fc->master_mfact_per;
|
c->master_mfact_per = fc->master_mfact_per;
|
||||||
c->master_inner_per = fc->master_inner_per;
|
c->master_inner_per = fc->master_inner_per;
|
||||||
c->stack_inner_per = fc->stack_inner_per;
|
c->stack_inner_per = fc->stack_inner_per;
|
||||||
|
|
@ -257,7 +210,7 @@ void resize_tile_master_horizontal(Client *grabc, bool isdrag, int32_t offsetx,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_apply_drap_time == 0 ||
|
if (last_apply_drap_time == 0 ||
|
||||||
time - last_apply_drap_time > drag_tile_refresh_interval) {
|
time - last_apply_drap_time > drag_refresh_interval) {
|
||||||
arrange(grabc->mon, false, false);
|
arrange(grabc->mon, false, false);
|
||||||
last_apply_drap_time = time;
|
last_apply_drap_time = time;
|
||||||
}
|
}
|
||||||
|
|
@ -414,7 +367,7 @@ void resize_tile_master_vertical(Client *grabc, bool isdrag, int32_t offsetx,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_apply_drap_time == 0 ||
|
if (last_apply_drap_time == 0 ||
|
||||||
time - last_apply_drap_time > drag_tile_refresh_interval) {
|
time - last_apply_drap_time > drag_refresh_interval) {
|
||||||
arrange(grabc->mon, false, false);
|
arrange(grabc->mon, false, false);
|
||||||
last_apply_drap_time = time;
|
last_apply_drap_time = time;
|
||||||
}
|
}
|
||||||
|
|
@ -595,7 +548,7 @@ void resize_tile_scroller(Client *grabc, bool isdrag, int32_t offsetx,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_apply_drap_time == 0 ||
|
if (last_apply_drap_time == 0 ||
|
||||||
time - last_apply_drap_time > drag_tile_refresh_interval) {
|
time - last_apply_drap_time > drag_refresh_interval) {
|
||||||
arrange(grabc->mon, false, false);
|
arrange(grabc->mon, false, false);
|
||||||
last_apply_drap_time = time;
|
last_apply_drap_time = time;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -283,7 +283,6 @@ void scroller(Monitor *m) {
|
||||||
struct wlr_box target_geom;
|
struct wlr_box target_geom;
|
||||||
int32_t focus_client_index = 0;
|
int32_t focus_client_index = 0;
|
||||||
bool need_scroller = false;
|
bool need_scroller = false;
|
||||||
bool over_overspread_to_left = false;
|
|
||||||
int32_t cur_gappih = enablegaps ? m->gappih : 0;
|
int32_t cur_gappih = enablegaps ? m->gappih : 0;
|
||||||
int32_t cur_gappoh = enablegaps ? m->gappoh : 0;
|
int32_t cur_gappoh = enablegaps ? m->gappoh : 0;
|
||||||
int32_t cur_gappov = enablegaps ? m->gappov : 0;
|
int32_t cur_gappov = enablegaps ? m->gappov : 0;
|
||||||
|
|
@ -372,46 +371,6 @@ void scroller(Monitor *m) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool need_apply_overspread =
|
|
||||||
scroller_prefer_overspread && m->visible_scroll_tiling_clients > 1 &&
|
|
||||||
(focus_client_index == 0 || focus_client_index == n - 1) &&
|
|
||||||
tempClients[focus_client_index]->scroller_proportion < 1.0f;
|
|
||||||
|
|
||||||
if (need_apply_overspread) {
|
|
||||||
|
|
||||||
if (focus_client_index == 0) {
|
|
||||||
over_overspread_to_left = true;
|
|
||||||
} else {
|
|
||||||
over_overspread_to_left = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (over_overspread_to_left &&
|
|
||||||
(!INSIDEMON(tempClients[1]) ||
|
|
||||||
(tempClients[1]->scroller_proportion +
|
|
||||||
tempClients[focus_client_index]->scroller_proportion >=
|
|
||||||
1.0f))) {
|
|
||||||
need_scroller = true;
|
|
||||||
} else if (!over_overspread_to_left &&
|
|
||||||
(!INSIDEMON(tempClients[focus_client_index - 1]) ||
|
|
||||||
(tempClients[focus_client_index - 1]->scroller_proportion +
|
|
||||||
tempClients[focus_client_index]->scroller_proportion >=
|
|
||||||
1.0f))) {
|
|
||||||
need_scroller = true;
|
|
||||||
} else {
|
|
||||||
need_apply_overspread = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool need_apply_center =
|
|
||||||
scroller_focus_center || m->visible_scroll_tiling_clients == 1 ||
|
|
||||||
(scroller_prefer_center && !need_apply_overspread &&
|
|
||||||
(!m->prevsel ||
|
|
||||||
(ISSCROLLTILED(m->prevsel) &&
|
|
||||||
(m->prevsel->scroller_proportion * max_client_width) +
|
|
||||||
(tempClients[focus_client_index]->scroller_proportion *
|
|
||||||
max_client_width) >
|
|
||||||
m->w.width - 2 * scroller_structs - cur_gappih)));
|
|
||||||
|
|
||||||
if (n == 1 && scroller_ignore_proportion_single) {
|
if (n == 1 && scroller_ignore_proportion_single) {
|
||||||
need_scroller = true;
|
need_scroller = true;
|
||||||
}
|
}
|
||||||
|
|
@ -435,26 +394,18 @@ void scroller(Monitor *m) {
|
||||||
tempClients[focus_client_index], &target_geom);
|
tempClients[focus_client_index], &target_geom);
|
||||||
arrange_stack(tempClients[focus_client_index], target_geom, cur_gappiv);
|
arrange_stack(tempClients[focus_client_index], target_geom, cur_gappiv);
|
||||||
} else if (need_scroller) {
|
} else if (need_scroller) {
|
||||||
if (need_apply_center) {
|
if (scroller_focus_center ||
|
||||||
|
((!m->prevsel ||
|
||||||
|
(ISSCROLLTILED(m->prevsel) &&
|
||||||
|
(m->prevsel->scroller_proportion * max_client_width) +
|
||||||
|
(root_client->scroller_proportion * max_client_width) >
|
||||||
|
m->w.width - 2 * scroller_structs - cur_gappih)) &&
|
||||||
|
scroller_prefer_center)) {
|
||||||
target_geom.x = m->w.x + (m->w.width - target_geom.width) / 2;
|
target_geom.x = m->w.x + (m->w.width - target_geom.width) / 2;
|
||||||
} else if (need_apply_overspread) {
|
|
||||||
if (over_overspread_to_left) {
|
|
||||||
target_geom.x = m->w.x + scroller_structs;
|
|
||||||
} else {
|
|
||||||
target_geom.x =
|
|
||||||
m->w.x +
|
|
||||||
(m->w.width -
|
|
||||||
tempClients[focus_client_index]->scroller_proportion *
|
|
||||||
max_client_width -
|
|
||||||
scroller_structs);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
target_geom.x = tempClients[focus_client_index]->geom.x >
|
target_geom.x = root_client->geom.x > m->w.x + (m->w.width) / 2
|
||||||
m->w.x + (m->w.width) / 2
|
|
||||||
? m->w.x + (m->w.width -
|
? m->w.x + (m->w.width -
|
||||||
tempClients[focus_client_index]
|
root_client->scroller_proportion *
|
||||||
->scroller_proportion *
|
|
||||||
max_client_width -
|
max_client_width -
|
||||||
scroller_structs)
|
scroller_structs)
|
||||||
: m->w.x + scroller_structs;
|
: m->w.x + scroller_structs;
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,6 @@ void vertical_scroller(Monitor *m) {
|
||||||
struct wlr_box target_geom;
|
struct wlr_box target_geom;
|
||||||
int32_t focus_client_index = 0;
|
int32_t focus_client_index = 0;
|
||||||
bool need_scroller = false;
|
bool need_scroller = false;
|
||||||
bool over_overspread_to_up = false;
|
|
||||||
int32_t cur_gappiv = enablegaps ? m->gappiv : 0;
|
int32_t cur_gappiv = enablegaps ? m->gappiv : 0;
|
||||||
int32_t cur_gappov = enablegaps ? m->gappov : 0;
|
int32_t cur_gappov = enablegaps ? m->gappov : 0;
|
||||||
int32_t cur_gappoh = enablegaps ? m->gappoh : 0;
|
int32_t cur_gappoh = enablegaps ? m->gappoh : 0;
|
||||||
|
|
@ -356,46 +355,6 @@ void vertical_scroller(Monitor *m) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool need_apply_overspread =
|
|
||||||
scroller_prefer_overspread && m->visible_scroll_tiling_clients > 1 &&
|
|
||||||
(focus_client_index == 0 || focus_client_index == n - 1) &&
|
|
||||||
tempClients[focus_client_index]->scroller_proportion < 1.0f;
|
|
||||||
|
|
||||||
if (need_apply_overspread) {
|
|
||||||
|
|
||||||
if (focus_client_index == 0) {
|
|
||||||
over_overspread_to_up = true;
|
|
||||||
} else {
|
|
||||||
over_overspread_to_up = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (over_overspread_to_up &&
|
|
||||||
(!INSIDEMON(tempClients[1]) ||
|
|
||||||
(tempClients[1]->scroller_proportion +
|
|
||||||
tempClients[focus_client_index]->scroller_proportion >=
|
|
||||||
1.0f))) {
|
|
||||||
need_scroller = true;
|
|
||||||
} else if (!over_overspread_to_up &&
|
|
||||||
(!INSIDEMON(tempClients[focus_client_index - 1]) ||
|
|
||||||
(tempClients[focus_client_index - 1]->scroller_proportion +
|
|
||||||
tempClients[focus_client_index]->scroller_proportion >=
|
|
||||||
1.0f))) {
|
|
||||||
need_scroller = true;
|
|
||||||
} else {
|
|
||||||
need_apply_overspread = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool need_apply_center =
|
|
||||||
scroller_focus_center || m->visible_scroll_tiling_clients == 1 ||
|
|
||||||
(scroller_prefer_center && !need_apply_overspread &&
|
|
||||||
(!m->prevsel ||
|
|
||||||
(ISSCROLLTILED(m->prevsel) &&
|
|
||||||
(m->prevsel->scroller_proportion * max_client_height) +
|
|
||||||
(tempClients[focus_client_index]->scroller_proportion *
|
|
||||||
max_client_height) >
|
|
||||||
m->w.height - 2 * scroller_structs - cur_gappiv)));
|
|
||||||
|
|
||||||
if (n == 1 && scroller_ignore_proportion_single) {
|
if (n == 1 && scroller_ignore_proportion_single) {
|
||||||
need_scroller = true;
|
need_scroller = true;
|
||||||
}
|
}
|
||||||
|
|
@ -422,24 +381,18 @@ void vertical_scroller(Monitor *m) {
|
||||||
arrange_stack_vertical(tempClients[focus_client_index], target_geom,
|
arrange_stack_vertical(tempClients[focus_client_index], target_geom,
|
||||||
cur_gappih);
|
cur_gappih);
|
||||||
} else if (need_scroller) {
|
} else if (need_scroller) {
|
||||||
if (need_apply_center) {
|
if (scroller_focus_center ||
|
||||||
|
((!m->prevsel ||
|
||||||
|
(ISSCROLLTILED(m->prevsel) &&
|
||||||
|
(m->prevsel->scroller_proportion * max_client_height) +
|
||||||
|
(root_client->scroller_proportion * max_client_height) >
|
||||||
|
m->w.height - 2 * scroller_structs - cur_gappiv)) &&
|
||||||
|
scroller_prefer_center)) {
|
||||||
target_geom.y = m->w.y + (m->w.height - target_geom.height) / 2;
|
target_geom.y = m->w.y + (m->w.height - target_geom.height) / 2;
|
||||||
} else if (need_apply_overspread) {
|
|
||||||
if (over_overspread_to_up) {
|
|
||||||
target_geom.y = m->w.y + scroller_structs;
|
|
||||||
} else {
|
|
||||||
target_geom.y =
|
|
||||||
m->w.y +
|
|
||||||
(m->w.height -
|
|
||||||
tempClients[focus_client_index]->scroller_proportion *
|
|
||||||
max_client_height -
|
|
||||||
scroller_structs);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
target_geom.y = root_client->geom.y > m->w.y + (m->w.height) / 2
|
target_geom.y = root_client->geom.y > m->w.y + (m->w.height) / 2
|
||||||
? m->w.y + (m->w.height -
|
? m->w.y + (m->w.height -
|
||||||
tempClients[focus_client_index]
|
root_client->scroller_proportion *
|
||||||
->scroller_proportion *
|
|
||||||
max_client_height -
|
max_client_height -
|
||||||
scroller_structs)
|
scroller_structs)
|
||||||
: m->w.y + scroller_structs;
|
: m->w.y + scroller_structs;
|
||||||
|
|
|
||||||
389
src/mango.c
389
src/mango.c
|
|
@ -3,7 +3,6 @@
|
||||||
*/
|
*/
|
||||||
#include "wlr-layer-shell-unstable-v1-protocol.h"
|
#include "wlr-layer-shell-unstable-v1-protocol.h"
|
||||||
#include "wlr/util/box.h"
|
#include "wlr/util/box.h"
|
||||||
#include "wlr/util/edges.h"
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <libinput.h>
|
#include <libinput.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
@ -338,7 +337,6 @@ struct Client {
|
||||||
struct wl_listener configure;
|
struct wl_listener configure;
|
||||||
struct wl_listener set_hints;
|
struct wl_listener set_hints;
|
||||||
struct wl_listener set_geometry;
|
struct wl_listener set_geometry;
|
||||||
struct wl_listener commmitx11;
|
|
||||||
#endif
|
#endif
|
||||||
uint32_t bw;
|
uint32_t bw;
|
||||||
uint32_t tags, oldtags, mini_restore_tag;
|
uint32_t tags, oldtags, mini_restore_tag;
|
||||||
|
|
@ -392,7 +390,6 @@ struct Client {
|
||||||
int32_t isterm, noswallow;
|
int32_t isterm, noswallow;
|
||||||
int32_t allow_csd;
|
int32_t allow_csd;
|
||||||
int32_t force_maximize;
|
int32_t force_maximize;
|
||||||
int32_t force_tiled_state;
|
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
Client *swallowing, *swallowedby;
|
Client *swallowing, *swallowedby;
|
||||||
bool is_clip_to_hide;
|
bool is_clip_to_hide;
|
||||||
|
|
@ -503,15 +500,11 @@ struct Monitor {
|
||||||
struct wl_listener request_state;
|
struct wl_listener request_state;
|
||||||
struct wl_listener destroy_lock_surface;
|
struct wl_listener destroy_lock_surface;
|
||||||
struct wlr_session_lock_surface_v1 *lock_surface;
|
struct wlr_session_lock_surface_v1 *lock_surface;
|
||||||
struct wl_event_source *skip_frame_timeout;
|
|
||||||
struct wlr_box m; /* monitor area, layout-relative */
|
struct wlr_box m; /* monitor area, layout-relative */
|
||||||
struct wlr_box w; /* window area, layout-relative */
|
struct wlr_box w; /* window area, layout-relative */
|
||||||
struct wl_list layers[4]; /* LayerSurface::link */
|
struct wl_list layers[4]; /* LayerSurface::link */
|
||||||
uint32_t seltags;
|
uint32_t seltags;
|
||||||
uint32_t tagset[2];
|
uint32_t tagset[2];
|
||||||
bool skiping_frame;
|
|
||||||
uint32_t resizing_count_pending;
|
|
||||||
uint32_t resizing_count_current;
|
|
||||||
|
|
||||||
struct wl_list dwl_ipc_outputs;
|
struct wl_list dwl_ipc_outputs;
|
||||||
int32_t gappih; /* horizontal gap between windows */
|
int32_t gappih; /* horizontal gap between windows */
|
||||||
|
|
@ -519,8 +512,6 @@ struct Monitor {
|
||||||
int32_t gappoh; /* horizontal outer gaps */
|
int32_t gappoh; /* horizontal outer gaps */
|
||||||
int32_t gappov; /* vertical outer gaps */
|
int32_t gappov; /* vertical outer gaps */
|
||||||
Pertag *pertag;
|
Pertag *pertag;
|
||||||
uint32_t ovbk_current_tagset;
|
|
||||||
uint32_t ovbk_prev_tagset;
|
|
||||||
Client *sel, *prevsel;
|
Client *sel, *prevsel;
|
||||||
int32_t isoverview;
|
int32_t isoverview;
|
||||||
int32_t is_in_hotarea;
|
int32_t is_in_hotarea;
|
||||||
|
|
@ -788,8 +779,6 @@ static Client *get_scroll_stack_head(Client *c);
|
||||||
static bool client_only_in_one_tag(Client *c);
|
static bool client_only_in_one_tag(Client *c);
|
||||||
static Client *get_focused_stack_client(Client *sc);
|
static Client *get_focused_stack_client(Client *sc);
|
||||||
static bool client_is_in_same_stack(Client *sc, Client *tc, Client *fc);
|
static bool client_is_in_same_stack(Client *sc, Client *tc, Client *fc);
|
||||||
static void monitor_stop_skip_frame_timer(Monitor *m);
|
|
||||||
static int monitor_skip_frame_timeout_callback(void *data);
|
|
||||||
|
|
||||||
#include "data/static_keymap.h"
|
#include "data/static_keymap.h"
|
||||||
#include "dispatch/bind_declare.h"
|
#include "dispatch/bind_declare.h"
|
||||||
|
|
@ -953,13 +942,10 @@ static struct wl_listener keyboard_shortcuts_inhibit_new_inhibitor = {
|
||||||
.notify = handle_keyboard_shortcuts_inhibit_new_inhibitor};
|
.notify = handle_keyboard_shortcuts_inhibit_new_inhibitor};
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
static void fix_xwayland_unmanaged_coordinate(Client *c);
|
|
||||||
static int32_t synckeymap(void *data);
|
|
||||||
static void activatex11(struct wl_listener *listener, void *data);
|
static void activatex11(struct wl_listener *listener, void *data);
|
||||||
static void configurex11(struct wl_listener *listener, void *data);
|
static void configurex11(struct wl_listener *listener, void *data);
|
||||||
static void createnotifyx11(struct wl_listener *listener, void *data);
|
static void createnotifyx11(struct wl_listener *listener, void *data);
|
||||||
static void dissociatex11(struct wl_listener *listener, void *data);
|
static void dissociatex11(struct wl_listener *listener, void *data);
|
||||||
static void commitx11(struct wl_listener *listener, void *data);
|
|
||||||
static void associatex11(struct wl_listener *listener, void *data);
|
static void associatex11(struct wl_listener *listener, void *data);
|
||||||
static void sethints(struct wl_listener *listener, void *data);
|
static void sethints(struct wl_listener *listener, void *data);
|
||||||
static void xwaylandready(struct wl_listener *listener, void *data);
|
static void xwaylandready(struct wl_listener *listener, void *data);
|
||||||
|
|
@ -967,7 +953,6 @@ static void setgeometrynotify(struct wl_listener *listener, void *data);
|
||||||
static struct wl_listener new_xwayland_surface = {.notify = createnotifyx11};
|
static struct wl_listener new_xwayland_surface = {.notify = createnotifyx11};
|
||||||
static struct wl_listener xwayland_ready = {.notify = xwaylandready};
|
static struct wl_listener xwayland_ready = {.notify = xwaylandready};
|
||||||
static struct wlr_xwayland *xwayland;
|
static struct wlr_xwayland *xwayland;
|
||||||
static struct wl_event_source *sync_keymap;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "animation/client.h"
|
#include "animation/client.h"
|
||||||
|
|
@ -984,6 +969,7 @@ static struct wl_event_source *sync_keymap;
|
||||||
|
|
||||||
void client_change_mon(Client *c, Monitor *m) {
|
void client_change_mon(Client *c, Monitor *m) {
|
||||||
setmon(c, m, c->tags, true);
|
setmon(c, m, c->tags, true);
|
||||||
|
reset_foreign_tolevel(c);
|
||||||
if (c->isfloating) {
|
if (c->isfloating) {
|
||||||
c->float_geom = c->geom =
|
c->float_geom = c->geom =
|
||||||
setclient_coordinate_center(c, c->mon, c->geom, 0, 0);
|
setclient_coordinate_center(c, c->mon, c->geom, 0, 0);
|
||||||
|
|
@ -1085,9 +1071,6 @@ void swallow(Client *c, Client *w) {
|
||||||
c->tags = w->tags;
|
c->tags = w->tags;
|
||||||
c->geom = w->geom;
|
c->geom = w->geom;
|
||||||
c->float_geom = w->float_geom;
|
c->float_geom = w->float_geom;
|
||||||
c->stack_inner_per = w->stack_inner_per;
|
|
||||||
c->master_inner_per = w->master_inner_per;
|
|
||||||
c->master_mfact_per = w->master_mfact_per;
|
|
||||||
c->scroller_proportion = w->scroller_proportion;
|
c->scroller_proportion = w->scroller_proportion;
|
||||||
c->next_in_stack = w->next_in_stack;
|
c->next_in_stack = w->next_in_stack;
|
||||||
c->prev_in_stack = w->prev_in_stack;
|
c->prev_in_stack = w->prev_in_stack;
|
||||||
|
|
@ -1296,7 +1279,6 @@ static void apply_rule_properties(Client *c, const ConfigWinRule *r) {
|
||||||
APPLY_INT_PROP(c, r, isterm);
|
APPLY_INT_PROP(c, r, isterm);
|
||||||
APPLY_INT_PROP(c, r, allow_csd);
|
APPLY_INT_PROP(c, r, allow_csd);
|
||||||
APPLY_INT_PROP(c, r, force_maximize);
|
APPLY_INT_PROP(c, r, force_maximize);
|
||||||
APPLY_INT_PROP(c, r, force_tiled_state);
|
|
||||||
APPLY_INT_PROP(c, r, force_tearing);
|
APPLY_INT_PROP(c, r, force_tearing);
|
||||||
APPLY_INT_PROP(c, r, noswallow);
|
APPLY_INT_PROP(c, r, noswallow);
|
||||||
APPLY_INT_PROP(c, r, nofocus);
|
APPLY_INT_PROP(c, r, nofocus);
|
||||||
|
|
@ -1305,7 +1287,6 @@ static void apply_rule_properties(Client *c, const ConfigWinRule *r) {
|
||||||
APPLY_INT_PROP(c, r, no_force_center);
|
APPLY_INT_PROP(c, r, no_force_center);
|
||||||
APPLY_INT_PROP(c, r, isfloating);
|
APPLY_INT_PROP(c, r, isfloating);
|
||||||
APPLY_INT_PROP(c, r, isfullscreen);
|
APPLY_INT_PROP(c, r, isfullscreen);
|
||||||
APPLY_INT_PROP(c, r, isfakefullscreen);
|
|
||||||
APPLY_INT_PROP(c, r, isnoborder);
|
APPLY_INT_PROP(c, r, isnoborder);
|
||||||
APPLY_INT_PROP(c, r, isnoshadow);
|
APPLY_INT_PROP(c, r, isnoshadow);
|
||||||
APPLY_INT_PROP(c, r, isnoradius);
|
APPLY_INT_PROP(c, r, isnoradius);
|
||||||
|
|
@ -1381,22 +1362,11 @@ void applyrules(Client *c) {
|
||||||
Client *fc = NULL;
|
Client *fc = NULL;
|
||||||
Client *parent = NULL;
|
Client *parent = NULL;
|
||||||
|
|
||||||
if (!c)
|
|
||||||
return;
|
|
||||||
|
|
||||||
parent = client_get_parent(c);
|
parent = client_get_parent(c);
|
||||||
|
|
||||||
Monitor *mon = parent && parent->mon ? parent->mon : selmon;
|
Monitor *mon = parent && parent->mon ? parent->mon : selmon;
|
||||||
|
|
||||||
c->isfloating = client_is_float_type(c) || parent;
|
c->isfloating = client_is_float_type(c) || parent;
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
|
||||||
if (c->isfloating && client_is_x11(c)) {
|
|
||||||
fix_xwayland_unmanaged_coordinate(c);
|
|
||||||
c->float_geom = c->geom;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!(appid = client_get_appid(c)))
|
if (!(appid = client_get_appid(c)))
|
||||||
appid = broken;
|
appid = broken;
|
||||||
if (!(title = client_get_title(c)))
|
if (!(title = client_get_title(c)))
|
||||||
|
|
@ -1472,8 +1442,7 @@ void applyrules(Client *c) {
|
||||||
/*-----------------------apply rule action-------------------------*/
|
/*-----------------------apply rule action-------------------------*/
|
||||||
|
|
||||||
// rule action only apply after map not apply in the init commit
|
// rule action only apply after map not apply in the init commit
|
||||||
struct wlr_surface *surface = client_surface(c);
|
if (!client_surface(c)->mapped)
|
||||||
if (!surface || !surface->mapped)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// apply swallow rule
|
// apply swallow rule
|
||||||
|
|
@ -1499,7 +1468,6 @@ void applyrules(Client *c) {
|
||||||
setmon(c, mon, newtags,
|
setmon(c, mon, newtags,
|
||||||
!c->isopensilent &&
|
!c->isopensilent &&
|
||||||
!(client_is_x11_popup(c) && client_should_ignore_focus(c)) &&
|
!(client_is_x11_popup(c) && client_should_ignore_focus(c)) &&
|
||||||
mon &&
|
|
||||||
(!c->istagsilent || !newtags ||
|
(!c->istagsilent || !newtags ||
|
||||||
newtags & mon->tagset[mon->seltags]));
|
newtags & mon->tagset[mon->seltags]));
|
||||||
|
|
||||||
|
|
@ -1512,16 +1480,12 @@ void applyrules(Client *c) {
|
||||||
|
|
||||||
setfullscreen(c, fullscreen_state_backup);
|
setfullscreen(c, fullscreen_state_backup);
|
||||||
|
|
||||||
if (c->isfakefullscreen) {
|
|
||||||
setfakefullscreen(c, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if there is a new non-floating window in the current tag, the fullscreen
|
if there is a new non-floating window in the current tag, the fullscreen
|
||||||
window in the current tag will exit fullscreen and participate in tiling
|
window in the current tag will exit fullscreen and participate in tiling
|
||||||
*/
|
*/
|
||||||
wl_list_for_each(fc, &clients,
|
wl_list_for_each(fc, &clients,
|
||||||
link) if (fc && fc != c && c->tags & fc->tags && c->mon &&
|
link) if (fc && fc != c && c->tags & fc->tags &&
|
||||||
VISIBLEON(fc, c->mon) && ISFULLSCREEN(fc) &&
|
VISIBLEON(fc, c->mon) && ISFULLSCREEN(fc) &&
|
||||||
!c->isfloating) {
|
!c->isfloating) {
|
||||||
clear_fullscreen_flag(fc);
|
clear_fullscreen_flag(fc);
|
||||||
|
|
@ -1540,7 +1504,7 @@ void applyrules(Client *c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply overlay rule
|
// apply overlay rule
|
||||||
if (c->isoverlay && c->scene) {
|
if (c->isoverlay) {
|
||||||
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
|
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
|
||||||
wlr_scene_node_raise_to_top(&c->scene->node);
|
wlr_scene_node_raise_to_top(&c->scene->node);
|
||||||
}
|
}
|
||||||
|
|
@ -2030,21 +1994,14 @@ buttonpress(struct wl_listener *listener, void *data) {
|
||||||
if (config.mouse_bindings_count < 1)
|
if (config.mouse_bindings_count < 1)
|
||||||
break;
|
break;
|
||||||
m = &config.mouse_bindings[ji];
|
m = &config.mouse_bindings[ji];
|
||||||
|
|
||||||
if (selmon->isoverview && event->button == BTN_LEFT && c) {
|
|
||||||
toggleoverview(&(Arg){.i = 1});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selmon->isoverview && event->button == BTN_RIGHT && c) {
|
|
||||||
pending_kill_client(c);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CLEANMASK(mods) == CLEANMASK(m->mod) &&
|
if (CLEANMASK(mods) == CLEANMASK(m->mod) &&
|
||||||
event->button == m->button && m->func &&
|
event->button == m->button && m->func &&
|
||||||
(CLEANMASK(m->mod) != 0 ||
|
(selmon->isoverview == 1 || m->button == BTN_MIDDLE) && c) {
|
||||||
(event->button != BTN_LEFT && event->button != BTN_RIGHT))) {
|
m->func(&m->arg);
|
||||||
|
return;
|
||||||
|
} else if (CLEANMASK(mods) == CLEANMASK(m->mod) &&
|
||||||
|
event->button == m->button && m->func &&
|
||||||
|
CLEANMASK(m->mod) != 0) {
|
||||||
m->func(&m->arg);
|
m->func(&m->arg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -2066,6 +2023,7 @@ buttonpress(struct wl_listener *listener, void *data) {
|
||||||
selmon = xytomon(cursor->x, cursor->y);
|
selmon = xytomon(cursor->x, cursor->y);
|
||||||
client_update_oldmonname_record(grabc, selmon);
|
client_update_oldmonname_record(grabc, selmon);
|
||||||
setmon(grabc, selmon, 0, true);
|
setmon(grabc, selmon, 0, true);
|
||||||
|
reset_foreign_tolevel(grabc);
|
||||||
selmon->prevsel = ISTILED(selmon->sel) ? selmon->sel : NULL;
|
selmon->prevsel = ISTILED(selmon->sel) ? selmon->sel : NULL;
|
||||||
selmon->sel = grabc;
|
selmon->sel = grabc;
|
||||||
tmpc = grabc;
|
tmpc = grabc;
|
||||||
|
|
@ -2236,11 +2194,6 @@ void cleanupmon(struct wl_listener *listener, void *data) {
|
||||||
wlr_scene_node_destroy(&m->blur->node);
|
wlr_scene_node_destroy(&m->blur->node);
|
||||||
m->blur = NULL;
|
m->blur = NULL;
|
||||||
}
|
}
|
||||||
if (m->skip_frame_timeout) {
|
|
||||||
monitor_stop_skip_frame_timer(m);
|
|
||||||
wl_event_source_remove(m->skip_frame_timeout);
|
|
||||||
m->skip_frame_timeout = NULL;
|
|
||||||
}
|
|
||||||
m->wlr_output->data = NULL;
|
m->wlr_output->data = NULL;
|
||||||
free(m->pertag);
|
free(m->pertag);
|
||||||
free(m);
|
free(m);
|
||||||
|
|
@ -2300,19 +2253,6 @@ static void iter_layer_scene_buffers(struct wlr_scene_buffer *buffer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void layer_flush_blur_background(LayerSurface *l) {
|
|
||||||
if (!blur)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 如果背景层发生变化,标记优化的模糊背景缓存需要更新
|
|
||||||
if (l->layer_surface->current.layer ==
|
|
||||||
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND) {
|
|
||||||
if (l->mon) {
|
|
||||||
wlr_scene_optimized_blur_mark_dirty(l->mon->blur);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void maplayersurfacenotify(struct wl_listener *listener, void *data) {
|
void maplayersurfacenotify(struct wl_listener *listener, void *data) {
|
||||||
LayerSurface *l = wl_container_of(listener, l, map);
|
LayerSurface *l = wl_container_of(listener, l, map);
|
||||||
struct wlr_layer_surface_v1 *layer_surface = l->layer_surface;
|
struct wlr_layer_surface_v1 *layer_surface = l->layer_surface;
|
||||||
|
|
@ -2440,7 +2380,15 @@ void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layer_flush_blur_background(l);
|
if (blur) {
|
||||||
|
// 如果背景层发生变化,标记优化的模糊背景缓存需要更新
|
||||||
|
if (layer_surface->current.layer ==
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND) {
|
||||||
|
if (l->mon) {
|
||||||
|
wlr_scene_optimized_blur_mark_dirty(l->mon->blur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (layer_surface == exclusive_focus &&
|
if (layer_surface == exclusive_focus &&
|
||||||
layer_surface->current.keyboard_interactive !=
|
layer_surface->current.keyboard_interactive !=
|
||||||
|
|
@ -2480,6 +2428,9 @@ void commitnotify(struct wl_listener *listener, void *data) {
|
||||||
setmon(c, NULL, 0,
|
setmon(c, NULL, 0,
|
||||||
true); /* Make sure to reapply rules in mapnotify() */
|
true); /* Make sure to reapply rules in mapnotify() */
|
||||||
|
|
||||||
|
client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT |
|
||||||
|
WLR_EDGE_RIGHT);
|
||||||
|
|
||||||
uint32_t serial = wlr_xdg_surface_schedule_configure(c->surface.xdg);
|
uint32_t serial = wlr_xdg_surface_schedule_configure(c->surface.xdg);
|
||||||
if (serial > 0) {
|
if (serial > 0) {
|
||||||
c->configure_serial = serial;
|
c->configure_serial = serial;
|
||||||
|
|
@ -2776,7 +2727,6 @@ void createmon(struct wl_listener *listener, void *data) {
|
||||||
Monitor *m = NULL;
|
Monitor *m = NULL;
|
||||||
struct wlr_output_mode *internal_mode = NULL;
|
struct wlr_output_mode *internal_mode = NULL;
|
||||||
bool custom_monitor_mode = false;
|
bool custom_monitor_mode = false;
|
||||||
bool match_rule = false;
|
|
||||||
|
|
||||||
if (!wlr_output_init_render(wlr_output, alloc, drw))
|
if (!wlr_output_init_render(wlr_output, alloc, drw))
|
||||||
return;
|
return;
|
||||||
|
|
@ -2789,15 +2739,7 @@ void createmon(struct wl_listener *listener, void *data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_event_loop *loop = wl_display_get_event_loop(dpy);
|
|
||||||
m = wlr_output->data = ecalloc(1, sizeof(*m));
|
m = wlr_output->data = ecalloc(1, sizeof(*m));
|
||||||
|
|
||||||
m->skip_frame_timeout =
|
|
||||||
wl_event_loop_add_timer(loop, monitor_skip_frame_timeout_callback, m);
|
|
||||||
m->skiping_frame = false;
|
|
||||||
m->resizing_count_pending = 0;
|
|
||||||
m->resizing_count_current = 0;
|
|
||||||
|
|
||||||
m->wlr_output = wlr_output;
|
m->wlr_output = wlr_output;
|
||||||
m->wlr_output->data = m;
|
m->wlr_output->data = m;
|
||||||
|
|
||||||
|
|
@ -2815,8 +2757,6 @@ void createmon(struct wl_listener *listener, void *data) {
|
||||||
m->isoverview = 0;
|
m->isoverview = 0;
|
||||||
m->sel = NULL;
|
m->sel = NULL;
|
||||||
m->is_in_hotarea = 0;
|
m->is_in_hotarea = 0;
|
||||||
m->m.x = INT32_MAX;
|
|
||||||
m->m.y = INT32_MAX;
|
|
||||||
float scale = 1;
|
float scale = 1;
|
||||||
enum wl_output_transform rr = WL_OUTPUT_TRANSFORM_NORMAL;
|
enum wl_output_transform rr = WL_OUTPUT_TRANSFORM_NORMAL;
|
||||||
wlr_output_state_set_scale(&state, scale);
|
wlr_output_state_set_scale(&state, scale);
|
||||||
|
|
@ -2827,39 +2767,7 @@ void createmon(struct wl_listener *listener, void *data) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
r = &config.monitor_rules[ji];
|
r = &config.monitor_rules[ji];
|
||||||
|
if (regex_match(r->name, wlr_output->name)) {
|
||||||
// 检查是否匹配的变量
|
|
||||||
match_rule = true;
|
|
||||||
|
|
||||||
// 检查四个标识字段的匹配
|
|
||||||
if (r->name != NULL) {
|
|
||||||
if (!regex_match(r->name, m->wlr_output->name)) {
|
|
||||||
match_rule = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->make != NULL) {
|
|
||||||
if (m->wlr_output->make == NULL ||
|
|
||||||
strcmp(r->make, m->wlr_output->make) != 0) {
|
|
||||||
match_rule = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->model != NULL) {
|
|
||||||
if (m->wlr_output->model == NULL ||
|
|
||||||
strcmp(r->model, m->wlr_output->model) != 0) {
|
|
||||||
match_rule = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->serial != NULL) {
|
|
||||||
if (m->wlr_output->serial == NULL ||
|
|
||||||
strcmp(r->serial, m->wlr_output->serial) != 0) {
|
|
||||||
match_rule = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match_rule) {
|
|
||||||
m->m.x = r->x == INT32_MAX ? INT32_MAX : r->x;
|
m->m.x = r->x == INT32_MAX ? INT32_MAX : r->x;
|
||||||
m->m.y = r->y == INT32_MAX ? INT32_MAX : r->y;
|
m->m.y = r->y == INT32_MAX ? INT32_MAX : r->y;
|
||||||
vrr = r->vrr >= 0 ? r->vrr : 0;
|
vrr = r->vrr >= 0 ? r->vrr : 0;
|
||||||
|
|
@ -3510,10 +3418,7 @@ void requestmonstate(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
void inputdevice(struct wl_listener *listener, void *data) {
|
void inputdevice(struct wl_listener *listener, void *data) {
|
||||||
/* This event is raised by the backend when a new input device becomes
|
/* This event is raised by the backend when a new input device becomes
|
||||||
* available.
|
* available. */
|
||||||
* when the backend is a headless backend, this event will never be
|
|
||||||
* triggered.
|
|
||||||
*/
|
|
||||||
struct wlr_input_device *device = data;
|
struct wlr_input_device *device = data;
|
||||||
uint32_t caps;
|
uint32_t caps;
|
||||||
|
|
||||||
|
|
@ -3584,6 +3489,11 @@ keybinding(uint32_t state, bool locked, uint32_t mods, xkb_keysym_t sym,
|
||||||
int32_t ji;
|
int32_t ji;
|
||||||
int32_t isbreak = 0;
|
int32_t isbreak = 0;
|
||||||
|
|
||||||
|
// not allow modifier keys to be used as a keybinding
|
||||||
|
if (keycode == 50 || keycode == 37 || keycode == 133 || keycode == 64 ||
|
||||||
|
keycode == 62 || keycode == 108 || keycode == 105 || keycode == 134)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (is_keyboard_shortcut_inhibitor(seat->keyboard_state.focused_surface)) {
|
if (is_keyboard_shortcut_inhibitor(seat->keyboard_state.focused_surface)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -3863,23 +3773,6 @@ static void iter_xdg_scene_buffers(struct wlr_scene_buffer *buffer, int32_t sx,
|
||||||
|
|
||||||
void init_client_properties(Client *c) {
|
void init_client_properties(Client *c) {
|
||||||
c->isfocusing = false;
|
c->isfocusing = false;
|
||||||
c->isfloating = 0;
|
|
||||||
c->isfakefullscreen = 0;
|
|
||||||
c->isnoanimation = 0;
|
|
||||||
c->isopensilent = 0;
|
|
||||||
c->istagsilent = 0;
|
|
||||||
c->noswallow = 0;
|
|
||||||
c->isterm = 0;
|
|
||||||
c->noblur = 0;
|
|
||||||
c->tearing_hint = 0;
|
|
||||||
c->overview_isfullscreenbak = 0;
|
|
||||||
c->overview_ismaximizescreenbak = 0;
|
|
||||||
c->overview_isfloatingbak = 0;
|
|
||||||
c->pid = 0;
|
|
||||||
c->swallowing = NULL;
|
|
||||||
c->swallowedby = NULL;
|
|
||||||
c->ismaster = 0;
|
|
||||||
c->isleftstack = 0;
|
|
||||||
c->ismaximizescreen = 0;
|
c->ismaximizescreen = 0;
|
||||||
c->isfullscreen = 0;
|
c->isfullscreen = 0;
|
||||||
c->need_float_size_reduce = 0;
|
c->need_float_size_reduce = 0;
|
||||||
|
|
@ -3922,7 +3815,6 @@ void init_client_properties(Client *c) {
|
||||||
c->isterm = 0;
|
c->isterm = 0;
|
||||||
c->allow_csd = 0;
|
c->allow_csd = 0;
|
||||||
c->force_maximize = 0;
|
c->force_maximize = 0;
|
||||||
c->force_tiled_state = 1;
|
|
||||||
c->force_tearing = 0;
|
c->force_tearing = 0;
|
||||||
c->allow_shortcuts_inhibit = SHORTCUTS_INHIBIT_ENABLE;
|
c->allow_shortcuts_inhibit = SHORTCUTS_INHIBIT_ENABLE;
|
||||||
c->scroller_proportion_single = 0.0f;
|
c->scroller_proportion_single = 0.0f;
|
||||||
|
|
@ -3933,13 +3825,6 @@ void init_client_properties(Client *c) {
|
||||||
c->stack_proportion = 0.0f;
|
c->stack_proportion = 0.0f;
|
||||||
c->next_in_stack = NULL;
|
c->next_in_stack = NULL;
|
||||||
c->prev_in_stack = NULL;
|
c->prev_in_stack = NULL;
|
||||||
memset(c->oldmonname, 0, sizeof(c->oldmonname));
|
|
||||||
memcpy(c->opacity_animation.initial_border_color, bordercolor,
|
|
||||||
sizeof(c->opacity_animation.initial_border_color));
|
|
||||||
memcpy(c->opacity_animation.current_border_color, bordercolor,
|
|
||||||
sizeof(c->opacity_animation.current_border_color));
|
|
||||||
c->opacity_animation.initial_opacity = c->unfocused_opacity;
|
|
||||||
c->opacity_animation.current_opacity = c->unfocused_opacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void // old fix to 0.5
|
void // old fix to 0.5
|
||||||
|
|
@ -3981,19 +3866,18 @@ mapnotify(struct wl_listener *listener, void *data) {
|
||||||
*/
|
*/
|
||||||
if (client_is_unmanaged(c)) {
|
if (client_is_unmanaged(c)) {
|
||||||
/* Unmanaged clients always are floating */
|
/* Unmanaged clients always are floating */
|
||||||
#ifdef XWAYLAND
|
|
||||||
if (client_is_x11(c)) {
|
|
||||||
fix_xwayland_unmanaged_coordinate(c);
|
|
||||||
LISTEN(&c->surface.xwayland->events.set_geometry, &c->set_geometry,
|
|
||||||
setgeometrynotify);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
|
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
|
||||||
wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y);
|
wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y);
|
||||||
if (client_wants_focus(c)) {
|
if (client_wants_focus(c)) {
|
||||||
focusclient(c, 1);
|
focusclient(c, 1);
|
||||||
exclusive_focus = c;
|
exclusive_focus = c;
|
||||||
}
|
}
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (client_is_x11(c)) {
|
||||||
|
LISTEN(&c->surface.xwayland->events.set_geometry, &c->set_geometry,
|
||||||
|
setgeometrynotify);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4039,10 +3923,8 @@ mapnotify(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
applyrules(c);
|
applyrules(c);
|
||||||
|
|
||||||
if (!c->isfloating || c->force_tiled_state) {
|
client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT |
|
||||||
client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT |
|
WLR_EDGE_RIGHT);
|
||||||
WLR_EDGE_RIGHT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// apply buffer effects of client
|
// apply buffer effects of client
|
||||||
wlr_scene_node_for_each_buffer(&c->scene_surface->node,
|
wlr_scene_node_for_each_buffer(&c->scene_surface->node,
|
||||||
|
|
@ -4261,7 +4143,7 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx,
|
||||||
if (grabc->isfloating) {
|
if (grabc->isfloating) {
|
||||||
grabc->iscustomsize = 1;
|
grabc->iscustomsize = 1;
|
||||||
if (last_apply_drap_time == 0 ||
|
if (last_apply_drap_time == 0 ||
|
||||||
time - last_apply_drap_time > drag_floating_refresh_interval) {
|
time - last_apply_drap_time > drag_refresh_interval) {
|
||||||
resize_floating_window(grabc);
|
resize_floating_window(grabc);
|
||||||
last_apply_drap_time = time;
|
last_apply_drap_time = time;
|
||||||
}
|
}
|
||||||
|
|
@ -4393,7 +4275,7 @@ void pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy,
|
||||||
uint32_t time) {
|
uint32_t time) {
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
|
|
||||||
if (sloppyfocus && !start_drag_window && c && time && c->scene &&
|
if (sloppyfocus && !start_drag_window && c && time &&
|
||||||
c->scene->node.enabled && !c->animation.tagining &&
|
c->scene->node.enabled && !c->animation.tagining &&
|
||||||
(surface != seat->pointer_state.focused_surface) &&
|
(surface != seat->pointer_state.focused_surface) &&
|
||||||
!client_is_unmanaged(c) && VISIBLEON(c, c->mon))
|
!client_is_unmanaged(c) && VISIBLEON(c, c->mon))
|
||||||
|
|
@ -4447,39 +4329,6 @@ void client_set_opacity(Client *c, double opacity) {
|
||||||
scene_buffer_apply_opacity, &opacity);
|
scene_buffer_apply_opacity, &opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void monitor_stop_skip_frame_timer(Monitor *m) {
|
|
||||||
if (m->skip_frame_timeout)
|
|
||||||
wl_event_source_timer_update(m->skip_frame_timeout, 0);
|
|
||||||
m->skiping_frame = false;
|
|
||||||
m->resizing_count_pending = 0;
|
|
||||||
m->resizing_count_current = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int monitor_skip_frame_timeout_callback(void *data) {
|
|
||||||
Monitor *m = data;
|
|
||||||
Client *c, *tmp;
|
|
||||||
|
|
||||||
wl_list_for_each_safe(c, tmp, &clients, link) { c->configure_serial = 0; }
|
|
||||||
|
|
||||||
monitor_stop_skip_frame_timer(m);
|
|
||||||
wlr_output_schedule_frame(m->wlr_output);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void monitor_check_skip_frame_timeout(Monitor *m) {
|
|
||||||
if (m->skiping_frame &&
|
|
||||||
m->resizing_count_pending == m->resizing_count_current) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m->skip_frame_timeout) {
|
|
||||||
m->resizing_count_current = m->resizing_count_pending;
|
|
||||||
m->skiping_frame = true;
|
|
||||||
wl_event_source_timer_update(m->skip_frame_timeout, 100); // 100ms
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rendermon(struct wl_listener *listener, void *data) {
|
void rendermon(struct wl_listener *listener, void *data) {
|
||||||
Monitor *m = wl_container_of(listener, m, frame);
|
Monitor *m = wl_container_of(listener, m, frame);
|
||||||
Client *c = NULL, *tmp = NULL;
|
Client *c = NULL, *tmp = NULL;
|
||||||
|
|
@ -4519,17 +4368,13 @@ void rendermon(struct wl_listener *listener, void *data) {
|
||||||
// 绘制客户端
|
// 绘制客户端
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
need_more_frames = client_draw_frame(c) || need_more_frames;
|
need_more_frames = client_draw_frame(c) || need_more_frames;
|
||||||
if (!animations && !grabc && c->configure_serial &&
|
if (!animations && !(allow_tearing && frame_allow_tearing) &&
|
||||||
client_is_rendered_on_mon(c, m)) {
|
c->configure_serial && !c->isfloating &&
|
||||||
monitor_check_skip_frame_timeout(m);
|
client_is_rendered_on_mon(c, m) && !client_is_stopped(c)) {
|
||||||
goto skip;
|
goto skip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m->skiping_frame) {
|
|
||||||
monitor_stop_skip_frame_timer(m);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 只有在需要帧时才构建和提交状态
|
// 只有在需要帧时才构建和提交状态
|
||||||
if (allow_tearing && frame_allow_tearing) {
|
if (allow_tearing && frame_allow_tearing) {
|
||||||
apply_tear_state(m);
|
apply_tear_state(m);
|
||||||
|
|
@ -4827,7 +4672,6 @@ setfloating(Client *c, int32_t floating) {
|
||||||
|
|
||||||
Client *fc = NULL;
|
Client *fc = NULL;
|
||||||
struct wlr_box target_box;
|
struct wlr_box target_box;
|
||||||
int32_t old_floating_state = c->isfloating;
|
|
||||||
c->isfloating = floating;
|
c->isfloating = floating;
|
||||||
bool window_size_outofrange = false;
|
bool window_size_outofrange = false;
|
||||||
|
|
||||||
|
|
@ -4897,20 +4741,13 @@ setfloating(Client *c, int32_t floating) {
|
||||||
layers[c->isfloating ? LyrTop : LyrTile]);
|
layers[c->isfloating ? LyrTop : LyrTile]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->isfloating && old_floating_state) {
|
if (!c->isfloating) {
|
||||||
restore_size_per(c->mon, c);
|
set_size_per(c->mon, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->force_maximize)
|
if (!c->force_maximize)
|
||||||
client_set_maximized(c, false);
|
client_set_maximized(c, false);
|
||||||
|
|
||||||
if (!c->isfloating || c->force_tiled_state) {
|
|
||||||
client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT |
|
|
||||||
WLR_EDGE_RIGHT);
|
|
||||||
} else {
|
|
||||||
client_set_tiled(c, WLR_EDGE_NONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
arrange(c->mon, false, false);
|
arrange(c->mon, false, false);
|
||||||
setborder_color(c);
|
setborder_color(c);
|
||||||
printstatus();
|
printstatus();
|
||||||
|
|
@ -4953,7 +4790,6 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
|
||||||
if (c->mon->isoverview)
|
if (c->mon->isoverview)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int32_t old_maximizescreen_state = c->ismaximizescreen;
|
|
||||||
c->ismaximizescreen = maximizescreen;
|
c->ismaximizescreen = maximizescreen;
|
||||||
|
|
||||||
if (maximizescreen) {
|
if (maximizescreen) {
|
||||||
|
|
@ -4983,8 +4819,8 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
|
||||||
|
|
||||||
wlr_scene_node_reparent(&c->scene->node,
|
wlr_scene_node_reparent(&c->scene->node,
|
||||||
layers[c->isfloating ? LyrTop : LyrTile]);
|
layers[c->isfloating ? LyrTop : LyrTile]);
|
||||||
if (!c->ismaximizescreen && old_maximizescreen_state) {
|
if (!c->ismaximizescreen) {
|
||||||
restore_size_per(c->mon, c);
|
set_size_per(c->mon, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->force_maximize && !c->ismaximizescreen) {
|
if (!c->force_maximize && !c->ismaximizescreen) {
|
||||||
|
|
@ -5016,7 +4852,6 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
|
||||||
if (c->mon->isoverview)
|
if (c->mon->isoverview)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int32_t old_fullscreen_state = c->isfullscreen;
|
|
||||||
c->isfullscreen = fullscreen;
|
c->isfullscreen = fullscreen;
|
||||||
|
|
||||||
client_set_fullscreen(c, fullscreen);
|
client_set_fullscreen(c, fullscreen);
|
||||||
|
|
@ -5054,8 +4889,8 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
|
||||||
layers[fullscreen || c->isfloating ? LyrTop : LyrTile]);
|
layers[fullscreen || c->isfloating ? LyrTop : LyrTile]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->isfullscreen && old_fullscreen_state) {
|
if (!c->isfullscreen) {
|
||||||
restore_size_per(c->mon, c);
|
set_size_per(c->mon, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
arrange(c->mon, false, false);
|
arrange(c->mon, false, false);
|
||||||
|
|
@ -5183,17 +5018,10 @@ void setmon(Client *c, Monitor *m, uint32_t newtags, bool focus) {
|
||||||
arrange(oldmon, false, false);
|
arrange(oldmon, false, false);
|
||||||
if (m) {
|
if (m) {
|
||||||
/* Make sure window actually overlaps with the monitor */
|
/* Make sure window actually overlaps with the monitor */
|
||||||
reset_foreign_tolevel(c);
|
|
||||||
resize(c, c->geom, 0);
|
resize(c, c->geom, 0);
|
||||||
if (!newtags && !m->isoverview) {
|
c->tags =
|
||||||
c->tags = m->tagset[m->seltags];
|
newtags ? newtags
|
||||||
} else if (!newtags && m->isoverview) {
|
: m->tagset[m->seltags]; /* assign tags of target monitor */
|
||||||
c->tags = m->ovbk_current_tagset;
|
|
||||||
} else if (newtags) {
|
|
||||||
c->tags = newtags;
|
|
||||||
} else {
|
|
||||||
c->tags = m->tagset[m->seltags];
|
|
||||||
}
|
|
||||||
setfloating(c, c->isfloating);
|
setfloating(c, c->isfloating);
|
||||||
setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */
|
setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */
|
||||||
}
|
}
|
||||||
|
|
@ -5201,6 +5029,21 @@ void setmon(Client *c, Monitor *m, uint32_t newtags, bool focus) {
|
||||||
if (focus && !client_is_x11_popup(c)) {
|
if (focus && !client_is_x11_popup(c)) {
|
||||||
focusclient(focustop(selmon), 1);
|
focusclient(focustop(selmon), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m) {
|
||||||
|
|
||||||
|
if (c->foreign_toplevel) {
|
||||||
|
remove_foreign_topleve(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
add_foreign_toplevel(c);
|
||||||
|
if (m->sel && m->sel->foreign_toplevel)
|
||||||
|
wlr_foreign_toplevel_handle_v1_set_activated(
|
||||||
|
m->sel->foreign_toplevel, false);
|
||||||
|
if (c->foreign_toplevel)
|
||||||
|
wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel,
|
||||||
|
true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setpsel(struct wl_listener *listener, void *data) {
|
void setpsel(struct wl_listener *listener, void *data) {
|
||||||
|
|
@ -5338,7 +5181,7 @@ void setup(void) {
|
||||||
if (wlr_renderer_get_texture_formats(drw, WLR_BUFFER_CAP_DMABUF)) {
|
if (wlr_renderer_get_texture_formats(drw, WLR_BUFFER_CAP_DMABUF)) {
|
||||||
wlr_drm_create(dpy, drw);
|
wlr_drm_create(dpy, drw);
|
||||||
wlr_scene_set_linux_dmabuf_v1(
|
wlr_scene_set_linux_dmabuf_v1(
|
||||||
scene, wlr_linux_dmabuf_v1_create_with_renderer(dpy, 4, drw));
|
scene, wlr_linux_dmabuf_v1_create_with_renderer(dpy, 5, drw));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (syncobj_enable && (drm_fd = wlr_renderer_get_drm_fd(drw)) >= 0 &&
|
if (syncobj_enable && (drm_fd = wlr_renderer_get_drm_fd(drw)) >= 0 &&
|
||||||
|
|
@ -5485,6 +5328,7 @@ void setup(void) {
|
||||||
&request_set_cursor_shape);
|
&request_set_cursor_shape);
|
||||||
hide_source = wl_event_loop_add_timer(wl_display_get_event_loop(dpy),
|
hide_source = wl_event_loop_add_timer(wl_display_get_event_loop(dpy),
|
||||||
hidecursor, cursor);
|
hidecursor, cursor);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configures a seat, which is a single "seat" at which a user sits and
|
* Configures a seat, which is a single "seat" at which a user sits and
|
||||||
* operates the computer. This conceptually includes up to one keyboard,
|
* operates the computer. This conceptually includes up to one keyboard,
|
||||||
|
|
@ -5576,8 +5420,6 @@ void setup(void) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"failed to setup XWayland X server, continuing without it\n");
|
"failed to setup XWayland X server, continuing without it\n");
|
||||||
}
|
}
|
||||||
sync_keymap = wl_event_loop_add_timer(wl_display_get_event_loop(dpy),
|
|
||||||
synckeymap, NULL);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5652,9 +5494,6 @@ void overview_backup(Client *c) {
|
||||||
c->ismaximizescreen = 0;
|
c->ismaximizescreen = 0;
|
||||||
}
|
}
|
||||||
c->bw = c->isnoborder ? 0 : borderpx;
|
c->bw = c->isnoborder ? 0 : borderpx;
|
||||||
|
|
||||||
client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT |
|
|
||||||
WLR_EDGE_RIGHT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// overview切回到普通视图还原窗口的状态
|
// overview切回到普通视图还原窗口的状态
|
||||||
|
|
@ -5694,10 +5533,6 @@ void overview_restore(Client *c, const Arg *arg) {
|
||||||
!c->isfullscreen) { // 如果是在ov模式中创建的窗口,没有bw记录
|
!c->isfullscreen) { // 如果是在ov模式中创建的窗口,没有bw记录
|
||||||
c->bw = c->isnoborder ? 0 : borderpx;
|
c->bw = c->isnoborder ? 0 : borderpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->isfloating && !c->force_tiled_state) {
|
|
||||||
client_set_tiled(c, WLR_EDGE_NONE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handlecursoractivity(void) {
|
void handlecursoractivity(void) {
|
||||||
|
|
@ -5744,7 +5579,6 @@ void unmaplayersurfacenotify(struct wl_listener *listener, void *data) {
|
||||||
focusclient(focustop(selmon), 1);
|
focusclient(focustop(selmon), 1);
|
||||||
motionnotify(0, NULL, 0, 0, 0, 0);
|
motionnotify(0, NULL, 0, 0, 0, 0);
|
||||||
l->being_unmapped = false;
|
l->being_unmapped = false;
|
||||||
layer_flush_blur_background(l);
|
|
||||||
wlr_scene_node_destroy(&l->shadow->node);
|
wlr_scene_node_destroy(&l->shadow->node);
|
||||||
l->shadow = NULL;
|
l->shadow = NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -5964,12 +5798,7 @@ void updatemons(struct wl_listener *listener, void *data) {
|
||||||
if (selmon && selmon->wlr_output->enabled) {
|
if (selmon && selmon->wlr_output->enabled) {
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (!c->mon && client_surface(c)->mapped) {
|
if (!c->mon && client_surface(c)->mapped) {
|
||||||
c->mon = selmon;
|
client_change_mon(c, selmon);
|
||||||
reset_foreign_tolevel(c);
|
|
||||||
}
|
|
||||||
if (c->tags == 0 && !c->is_in_scratchpad) {
|
|
||||||
c->tags = selmon->tagset[selmon->seltags];
|
|
||||||
set_size_per(selmon, c);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
focusclient(focustop(selmon), 1);
|
focusclient(focustop(selmon), 1);
|
||||||
|
|
@ -6147,8 +5976,6 @@ void handle_keyboard_shortcuts_inhibit_new_inhibitor(
|
||||||
void virtualkeyboard(struct wl_listener *listener, void *data) {
|
void virtualkeyboard(struct wl_listener *listener, void *data) {
|
||||||
struct wlr_virtual_keyboard_v1 *kb = data;
|
struct wlr_virtual_keyboard_v1 *kb = data;
|
||||||
/* virtual keyboards shouldn't share keyboard group */
|
/* virtual keyboards shouldn't share keyboard group */
|
||||||
wlr_seat_set_capabilities(seat,
|
|
||||||
seat->capabilities | WL_SEAT_CAPABILITY_KEYBOARD);
|
|
||||||
KeyboardGroup *group = createkeyboardgroup();
|
KeyboardGroup *group = createkeyboardgroup();
|
||||||
/* Set the keymap to match the group keymap */
|
/* Set the keymap to match the group keymap */
|
||||||
wlr_keyboard_set_keymap(&kb->keyboard, group->wlr_group->keyboard.keymap);
|
wlr_keyboard_set_keymap(&kb->keyboard, group->wlr_group->keyboard.keymap);
|
||||||
|
|
@ -6160,7 +5987,8 @@ void virtualkeyboard(struct wl_listener *listener, void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void warp_cursor(const Client *c) {
|
void warp_cursor(const Client *c) {
|
||||||
if (INSIDEMON(c)) {
|
if (cursor->x < c->geom.x || cursor->x > c->geom.x + c->geom.width ||
|
||||||
|
cursor->y < c->geom.y || cursor->y > c->geom.y + c->geom.height) {
|
||||||
wlr_cursor_warp_closest(cursor, NULL, c->geom.x + c->geom.width / 2.0,
|
wlr_cursor_warp_closest(cursor, NULL, c->geom.x + c->geom.width / 2.0,
|
||||||
c->geom.y + c->geom.height / 2.0);
|
c->geom.y + c->geom.height / 2.0);
|
||||||
motionnotify(0, NULL, 0, 0, 0, 0);
|
motionnotify(0, NULL, 0, 0, 0, 0);
|
||||||
|
|
@ -6178,8 +6006,7 @@ void warp_cursor_to_selmon(Monitor *m) {
|
||||||
void virtualpointer(struct wl_listener *listener, void *data) {
|
void virtualpointer(struct wl_listener *listener, void *data) {
|
||||||
struct wlr_virtual_pointer_v1_new_pointer_event *event = data;
|
struct wlr_virtual_pointer_v1_new_pointer_event *event = data;
|
||||||
struct wlr_input_device *device = &event->new_pointer->pointer.base;
|
struct wlr_input_device *device = &event->new_pointer->pointer.base;
|
||||||
wlr_seat_set_capabilities(seat,
|
|
||||||
seat->capabilities | WL_SEAT_CAPABILITY_POINTER);
|
|
||||||
wlr_cursor_attach_input_device(cursor, device);
|
wlr_cursor_attach_input_device(cursor, device);
|
||||||
if (event->suggested_output)
|
if (event->suggested_output)
|
||||||
wlr_cursor_map_input_to_output(cursor, device, event->suggested_output);
|
wlr_cursor_map_input_to_output(cursor, device, event->suggested_output);
|
||||||
|
|
@ -6188,26 +6015,6 @@ void virtualpointer(struct wl_listener *listener, void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
void fix_xwayland_unmanaged_coordinate(Client *c) {
|
|
||||||
if (!selmon)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 1. 如果窗口已经在当前活动显示器内,直接返回
|
|
||||||
if (c->geom.x >= selmon->m.x && c->geom.x < selmon->m.x + selmon->m.width &&
|
|
||||||
c->geom.y >= selmon->m.y && c->geom.y < selmon->m.y + selmon->m.height)
|
|
||||||
return;
|
|
||||||
|
|
||||||
c->geom = setclient_coordinate_center(c, selmon, c->geom, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t synckeymap(void *data) {
|
|
||||||
reset_keyboard_layout();
|
|
||||||
// we only need to sync keymap once
|
|
||||||
wlr_log(WLR_INFO, "timer to synckeymap done");
|
|
||||||
wl_event_source_timer_update(sync_keymap, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void activatex11(struct wl_listener *listener, void *data) {
|
void activatex11(struct wl_listener *listener, void *data) {
|
||||||
Client *c = wl_container_of(listener, c, activate);
|
Client *c = wl_container_of(listener, c, activate);
|
||||||
bool need_arrange = false;
|
bool need_arrange = false;
|
||||||
|
|
@ -6300,34 +6107,17 @@ void createnotifyx11(struct wl_listener *listener, void *data) {
|
||||||
LISTEN(&xsurface->events.request_minimize, &c->minimize, minimizenotify);
|
LISTEN(&xsurface->events.request_minimize, &c->minimize, minimizenotify);
|
||||||
}
|
}
|
||||||
|
|
||||||
void commitx11(struct wl_listener *listener, void *data) {
|
|
||||||
Client *c = wl_container_of(listener, c, commmitx11);
|
|
||||||
struct wlr_surface_state *state = &c->surface.xwayland->surface->current;
|
|
||||||
|
|
||||||
if ((int32_t)c->geom.width - 2 * (int32_t)c->bw == (int32_t)state->width &&
|
|
||||||
(int32_t)c->geom.height - 2 * (int32_t)c->bw ==
|
|
||||||
(int32_t)state->height &&
|
|
||||||
(int32_t)c->surface.xwayland->x ==
|
|
||||||
(int32_t)c->geom.x + (int32_t)c->bw &&
|
|
||||||
(int32_t)c->surface.xwayland->y ==
|
|
||||||
(int32_t)c->geom.y + (int32_t)c->bw) {
|
|
||||||
c->configure_serial = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void associatex11(struct wl_listener *listener, void *data) {
|
void associatex11(struct wl_listener *listener, void *data) {
|
||||||
Client *c = wl_container_of(listener, c, associate);
|
Client *c = wl_container_of(listener, c, associate);
|
||||||
|
|
||||||
LISTEN(&client_surface(c)->events.map, &c->map, mapnotify);
|
LISTEN(&client_surface(c)->events.map, &c->map, mapnotify);
|
||||||
LISTEN(&client_surface(c)->events.unmap, &c->unmap, unmapnotify);
|
LISTEN(&client_surface(c)->events.unmap, &c->unmap, unmapnotify);
|
||||||
LISTEN(&client_surface(c)->events.commit, &c->commmitx11, commitx11);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dissociatex11(struct wl_listener *listener, void *data) {
|
void dissociatex11(struct wl_listener *listener, void *data) {
|
||||||
Client *c = wl_container_of(listener, c, dissociate);
|
Client *c = wl_container_of(listener, c, dissociate);
|
||||||
wl_list_remove(&c->map.link);
|
wl_list_remove(&c->map.link);
|
||||||
wl_list_remove(&c->unmap.link);
|
wl_list_remove(&c->unmap.link);
|
||||||
wl_list_remove(&c->commmitx11.link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sethints(struct wl_listener *listener, void *data) {
|
void sethints(struct wl_listener *listener, void *data) {
|
||||||
|
|
@ -6355,10 +6145,6 @@ void xwaylandready(struct wl_listener *listener, void *data) {
|
||||||
xwayland, xcursor->images[0]->buffer, xcursor->images[0]->width * 4,
|
xwayland, xcursor->images[0]->buffer, xcursor->images[0]->width * 4,
|
||||||
xcursor->images[0]->width, xcursor->images[0]->height,
|
xcursor->images[0]->width, xcursor->images[0]->height,
|
||||||
xcursor->images[0]->hotspot_x, xcursor->images[0]->hotspot_y);
|
xcursor->images[0]->hotspot_x, xcursor->images[0]->hotspot_y);
|
||||||
/* xwayland can't auto sync the keymap, so we do it manually
|
|
||||||
and we need to wait the xwayland completely inited
|
|
||||||
*/
|
|
||||||
wl_event_source_timer_update(sync_keymap, 500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setgeometrynotify(struct wl_listener *listener, void *data) {
|
static void setgeometrynotify(struct wl_listener *listener, void *data) {
|
||||||
|
|
@ -6374,21 +6160,17 @@ int32_t main(int32_t argc, char *argv[]) {
|
||||||
char *startup_cmd = NULL;
|
char *startup_cmd = NULL;
|
||||||
int32_t c;
|
int32_t c;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "s:c:hdvp")) != -1) {
|
while ((c = getopt(argc, argv, "s:c:hdv")) != -1) {
|
||||||
if (c == 's') {
|
if (c == 's')
|
||||||
startup_cmd = optarg;
|
startup_cmd = optarg;
|
||||||
} else if (c == 'd') {
|
else if (c == 'd')
|
||||||
log_level = WLR_DEBUG;
|
log_level = WLR_DEBUG;
|
||||||
} else if (c == 'v') {
|
else if (c == 'v')
|
||||||
printf("mango " VERSION "\n");
|
die("mango " VERSION);
|
||||||
return EXIT_SUCCESS;
|
else if (c == 'c')
|
||||||
} else if (c == 'c') {
|
|
||||||
cli_config_path = optarg;
|
cli_config_path = optarg;
|
||||||
} else if (c == 'p') {
|
else
|
||||||
return parse_config() ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
||||||
} else {
|
|
||||||
goto usage;
|
goto usage;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (optind < argc)
|
if (optind < argc)
|
||||||
goto usage;
|
goto usage;
|
||||||
|
|
@ -6402,14 +6184,7 @@ int32_t main(int32_t argc, char *argv[]) {
|
||||||
run(startup_cmd);
|
run(startup_cmd);
|
||||||
cleanup();
|
cleanup();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
printf("Usage: mango [OPTIONS]\n"
|
die("Usage: %s [-v] [-d] [-c config file] [-s startup command]", argv[0]);
|
||||||
"\n"
|
|
||||||
"Options:\n"
|
|
||||||
" -v Show mango version\n"
|
|
||||||
" -d Enable debug log\n"
|
|
||||||
" -c <file> Use custom configuration file\n"
|
|
||||||
" -s <command> Execute startup command\n"
|
|
||||||
" -p Check configuration file error\n");
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue