我想给所有 Linux 窗口的最大化操作进行设置,包括不限于资源管理器、Chrome 、WPS 、Pycharm 、VSCode 。 具体就是想给 Linux 桌面最左侧留一块 Windows 任务栏的空间,以便存放装有 Windows 虚拟机的 VirutalBox 开启 Seamless 之后把 Windows 虚拟机的任务栏放到最左侧,而不让 Linux 所有窗口覆盖它,使其与 Linux 窗口“无缝”拼接。
然后再把 Windows 虚拟机的颜色调整一下,左侧和下侧分别是 Windows 虚拟机和 Linux 宿主机的任务栏,爽!
1
kid740246048 2021-02-08 11:37:23 +08:00
同蹲一个解决方案,最近我也在考虑把开发环境迁移到 Arch+KDE
|
2
huangmingyou 2021-02-08 11:55:10 +08:00 1
我用 fvwm,把 virtualbox 的窗口边框去掉了,里面的 windows 看上去就像原生的 linux 应用。不用开启 seamless 模式。
windows 里面开微信最大化,观感就是微信原生跑在 linux 上一样。 https://imgur.com/TCa9Si5 |
3
zhuisui 2021-02-08 12:02:40 +08:00 1
|
4
no1xsyzy 2021-02-08 12:16:04 +08:00 1
歪下:i3wm (
|
5
hanssx OP |
7
hanssx OP @huangmingyou 老哥,你这个是不是需要换窗口管理器呀,我默认用的 mint cinamon 桌面环境,是 mutter 窗口管理器。另外,你这个是把虚拟机窗口直接铺出来是吧,是需要多屏效果才能比较好吧?我只想要任务栏看消息,然后是笔记本没那么大横屏。
@zhuisui 看了下,好像是 KDE 的。 |
8
huangmingyou 2021-02-08 14:53:27 +08:00
https://github.com/huangmingyou/fvwm-rio 这是我在用的 fvwm 配置文件
|
10
hanssx OP @huangmingyou 有点复杂,待我学习一下,
|
11
dbpe 2021-02-08 15:04:35 +08:00
HIdpi...linux 用哪个发行版比较好啊...我试了一圈..决定还是用 win 了
|
12
hanssx OP @huangmingyou 太难搞了,我放弃了,还是谢谢大哥(感觉 fvwm 现在用得人少了,中文资料都没几个,而且会改变窗口很多行为。。Linux 原本的任务栏都没了。。。
|
13
omph 2021-02-08 18:36:08 +08:00
对 i3wm 来说,vbox 用平铺模式( tiling ),会自动最大化;而同工作区的其他窗口全都设为浮动( floating,可以作为默认值),然后限定浮动窗口的最大尺寸( floating_maximum_size )。
更复杂一点,自己写个脚本,开新窗口、移动窗口的时候自动检测并设置窗口尺寸。 但对于 i3 来说,一般用法就是给 vbox 一个单独的工作区,再给 vbox 绑定一个快捷键,可以一键切换过去。 |
14
omph 2021-02-08 18:37:00 +08:00
[i3 User’s Guide]( https://i3wm.org/docs/userguide.html)
|
15
Cooky 2021-02-08 18:55:28 +08:00 via Android
很多 wm 还能把 标题栏 去掉
|
16
Lemeng 2021-02-08 19:22:44 +08:00
热心人多
|
17
hanssx OP @omph > 更复杂一点,自己写个脚本,开新窗口、移动窗口的时候自动检测并设置窗口尺寸。
对,就是这个东西,我不知道怎么搞。i3wm 之前用过,感觉屏幕小的话和用多个 workspace 差不多,所以也就没深入使用。 |
18
JackieMe 2021-02-08 22:46:31 +08:00 via Android
xfce4 和 openbox 好像都可以设置 dock 空间,至少 xfce4 可以把 dock 放到桌面左边然后所有窗口最大化都不会遮挡
|
19
IgniteWhite 2021-02-08 22:55:40 +08:00 via iPhone
wm 常用的分为 stacking 和 tiling 。比如 gnome 和 kde plasma 这些是 stacking,前面人们提到的 i3 之类的是 tiling 。对于楼主的需求,tiling 更适合。
|
20
huangmingyou 2021-02-09 09:43:58 +08:00
@hanssx xdotool 看看能实现吗
|
21
hanssx OP @JackieMe
搜索到过这个东西,同类好像还有 fluxbox,我之前想依靠在宿主机(Linux)最左侧建一个任务栏(Panel)留出一块空间,给 VirtualBox 的 Seamless 模式下的 Windows 用,但是 VirtualBox 的 Seamless 模式下的 Windows 的任务栏,其实是在宿主机(Linux)的可用空间内铺上一块空间而不是最左侧。 所以只能使 Linux 所有窗口最大化的时候给它限定一个范围,不让它覆盖某一块空间才行。 @IgniteWhite 笔记本没那么大,用平铺效果不行,看得费劲,相反如果用显示器,那也就没必要这么做了,我把虚拟机分屏就行了。。 @huangmingyou 嗯,这个东西能控制窗口,但是怎么能设置所有窗口呐,没找到相关的,我昨天又看了一下 fvwm,好像它并不能控制所有窗口最大化的时候,不让窗口覆盖某一块空间啊,有这个语法`Style stylename options`,不知道 options 该怎么设置。 |
22
huangmingyou 2021-02-09 10:46:04 +08:00 1
实现思路不是最大化窗口,而应该是精确控制窗口大小和位置; 例如
google-chrome --app="http://www.bing.com" -geometry 2222x1442--5-0 # geometry 具体可以用 xwininfo 获取一个指定窗口的值 |
23
huangmingyou 2021-02-09 10:47:11 +08:00 1
我现在的 fvwm 配置,chrome 用 f11 全屏以后,按住 alt 键,用鼠标右键可以再二次调整窗口大小。
|
24
hanssx OP @huangmingyou 这个思路可以,就是比较麻烦,需要设置所有 app 的启动参数,或许编辑~/.Xdefaults 可以解决?但是我发现自己电脑上没这个文件,我电脑 OS 是 Linux Mint19.3 Cinamon 。。
另外--geometry 这个参数我这边好像对 chrome 没有效果,这样才有效果, chromium-browser --window-position=0,0 -window-size=800,600 这样一来不支持不知道有没有不支持--geometry 参数的。。 刚才把你的 fvwm2rc 文件直接替换我电脑里面的 fvwm2rc 文件,logout 后找不到 fvwm 了,我好菜,好难啊 我决定找找看 xdotool 、wmctrl 、--geometry 、Xdefaults 这些方案看看,谢谢大哥。 参考: https://stackoverflow.com/questions/27085805/how-to-specify-geometry-e-g-1280x720-for-a-new-browser-window https://unix.stackexchange.com/questions/48984/how-can-i-set-the-position-that-terminal-opens-at |
25
hanssx OP ```shell
$ chromium-browser --geometry=1820*972+100+0 zsh: no matches found: --geometry=1820*972+100+0 $ chromium-browser -geometry 1820*972+100+0 zsh: no matches found: 1820*972+100+0 $ chromium-browser -geometry 1820*972--100-0 zsh: no matches found: 1820*972--100-0 ``` |
26
hanssx OP @huangmingyou 找到一种方案,可以用快捷键调整当前活动窗口。
> i've just found: wmctrl -r :ACTIVE: -e 0,-1,-1,1280,900 and added as a Custom Shortcut within Keyboard Shortcuts settings :) – 参考: https://askubuntu.com/questions/107951/how-to-set-a-specific-window-size-and-placement-for-all-windows-that-open-to-def |
27
huangmingyou 2021-02-09 13:14:54 +08:00 1
|
28
omph 2021-02-10 00:59:13 +08:00 1
i3wm:
# 在工作区 1 中新建的窗口,若不是 vbox,则启用浮动,设置宽高,并向右移动 for_window [class="^(?!virtualbox).*" workspace="1"] floating enable resize set 1400 870 move position 40 px 0 px # 限制浮动窗口尺寸 floating_maximum_size 1400 x 870 |
29
secondwtq 2021-02-10 01:54:59 +08:00 1
一般确实是在窗口管理器里做。
比如我用的是 xmonad,这是 Haskell 写的一个非常 primitive 的窗口管理器,稍微熟悉 Haskell 的话,一下午就可以看完核心部分的代码(而如果你想学 Haskell,xmonad 又是非常不错的入门项目)。它本身功能很少,但是非常的简单和稳定。它的特点是完全的 hackable——核心代码只提供很少的功能,而配置文件由用户用 Haskell 自己写,这个配置文件也并非通常意义上的“配置”——它就是一个 Haskell 程序,而窗口管理器的 main 函数,是在这个配置文件里面的! 比如说这是我的 xmonad 配置文件中的 main 函数: > main = do > xmonad $ ewmh $ defaultConfig { > workspaces = ["pri", "2", "3", "4", "misc"], > modMask = mod4Mask, > terminal = "xfce4-terminal", > normalBorderColor = "#000000", > focusedBorderColor = "#e63312", > focusFollowsMouse = False, > clickJustFocuses = False, > borderWidth = 0, > layoutHook = > logModifier (gaps [(U, 32)] ( > windowSwitcherDecorationWithButtons shrinkText decorationTheme > ( > smartBorders (spacingRaw True (Border 0 0 0 0) False (Border 0 0 0 0) False ( > draggingVisualizer ( > boringWindows ( > maximizeWithPadding 0 ( > minimize ( > layoutHook defaultConfig))))))))), > manageHook = myManageHook, > handleEventHook = handleEventHook def <+> > -- fullscreenEventHook <+> > fullscreenEventHook2 <+> > minimizeEventHook, > -- testEventHook, > keys = myKeys > } 这里面需要注意的是几个 hook,比如 layoutHook 中,minimize 和 maximizeWithPadding 负责最小化和最大化功能,boringWindows 可以在切换窗口时无视掉最小化的窗口,draggingVisualizer 和 windowSwitcherDecorationWithButtons 添加了窗口拖动和标题栏等 stacking WM 的功能,smartBorders 可以在窗口最大化时禁用边框的绘制(当然我现在把边框整个禁用了)——这些都是 Haskell 函数,而这些函数一个个嵌套组合起来传进 layoutHook 这个配置项,再调用 xmonad 提供的 xmonad 函数,就是 main 函数。 layoutHook 中的这些函数不属于 xmonad 核心,而是外部插件,比如这里的 windowSwitcherDecorationWithButtons 我用的是我自己在官方仓库提供的插件的基础上修改过的版本,改出了这么一个标题栏: https://i.loli.net/2021/02/10/aUAFmL7DJOHd54C.png 注意 Chrome 和 Emacs 的标题栏使用的是不同的背景和字体颜色,实现这个区别的代码就在上面的 Emacs 窗口里。 ... 但是本回复的目的并非安利 yet another window manager 。说上面这一大堆只是因为貌似推荐 WM 是本贴的标准格式而已 ... 上面 layoutHook 有一个没提就是 gaps,这个可以禁止 xmonad 使用屏幕边框的区域,比如我这个配置中就保留了屏幕上方 32 像素高的位置放状态栏——这是我看到楼主的问题时的本能反应。但是仔细想来,其他窗口管理器也能处理各种 bar 和 dock 的占位,而它们 99% 没有 xmonad 这么强的定制性,这是什么原理呢? Gaps 模块的文档( https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/XMonad-Layout-Gaps.html )给出了线索:Gaps 仅仅是一个 workaround,处理“dock-type applications”的占位推荐使用 ManageDocks 提供的功能,这是因为这类窗口一般都设置了“STRUTS”属性。 xmonad 这个名字中的 X 来自于 X Window,X Window 本身是应用和系统之间通信的一套协议(至于 Monad 嘛,自然是“a monoid in the category of endofunctors”咯)。其中规定窗口和窗口管理器之间通信的主要是 ICCCM (Inter-Client Communication Conventions Manual, https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html ) 和 EWMH (Extended Window Manager Hints, https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html ),这个 STRUTS,以及“dock-type applications”,属于 EWMH 的范畴。 xmonad 的 ManageDocks 模块就是通过检查 EWMH 规定的这些属性来实现保留 dock 空间功能的: https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/src/XMonad.Hooks.ManageDocks.html 类似的处理也出现在 Cinnamon 的默认窗口管理器 muffin 中: https://github.com/linuxmint/muffin/blob/46b555c27a9abf6b4a05f711770786bf4f6a2361/src/core/constraints.c#L863 所以楼主这个问题,可以考虑的标准解决方案是想办法给任务栏窗口设置 EWMH 相关的属性,之后的布局问题,窗口管理器应该会自动处理。 |
30
hanssx OP @omph 可以的老哥,用得很溜,老哥你 i3wm 用的显示屏是多大的呀,我感觉 i3wm 必须得用个大的显示屏。。
@secondwtq 多谢老哥普及,第一次听说 xmonad,关注老哥了,太硬核了哈哈。 @huangmingyou @omph @secondwtq @kid740246048 @zhuisui @no1xsyzy @JackieMe @IgniteWhite 提前祝各位 v 友除夕夜快乐,祝身体一直健康棒棒。 |
31
IgniteWhite 2021-02-10 19:50:21 +08:00 via iPhone 1
@hanssx 祝新年好运!
|
32
hanssx OP 找到另一种方案: https://github.com/Gomaxx/goma-virtualbox-extension
经测在 Mint 19.3 上面可行,可能在 ubuntu 18.04 系下都能运行。 |