技术解析

Linux 窗口 最大化 设置
0
2021-06-15 10:01:29
idczone

我想给所有 Linux 窗口的最大化操作进行设置,包括不限于资源管理器、Chrome 、WPS 、Pycharm 、VSCode 。 具体就是想给 Linux 桌面最左侧留一块 Windows 任务栏的空间,以便存放装有 Windows 虚拟机的 VirutalBox 开启 Seamless 之后把 Windows 虚拟机的任务栏放到最左侧,而不让 Linux 所有窗口覆盖它,使其与 Linux 窗口“无缝”拼接。

然后再把 Windows 虚拟机的颜色调整一下,左侧和下侧分别是 Windows 虚拟机和 Linux 宿主机的任务栏,爽!


同蹲一个解决方案,最近我也在考虑把开发环境迁移到 Arch+KDE

我用 fvwm,把 virtualbox 的窗口边框去掉了,里面的 windows 看上去就像原生的 linux 应用。不用开启 seamless 模式。
windows 里面开微信最大化,观感就是微信原生跑在 linux 上一样。
https://imgur.com/TCa9Si5

https://github.com/esjeon/krohnkite

歪下:i3wm (




搜了一下,大佬们给的答案好像都是窗口管理器,看了一下没看太懂,确实能做到吗,我都想付费求方案了,我研究一下。

因为管这事儿的就是 WM
想了想确实 FVWM 应当是有这个能力的。i3 是完整的 DE……

老哥,你这个是不是需要换窗口管理器呀,我默认用的 mint cinamon 桌面环境,是 mutter 窗口管理器。另外,你这个是把虚拟机窗口直接铺出来是吧,是需要多屏效果才能比较好吧?我只想要任务栏看消息,然后是笔记本没那么大横屏。

看了下,好像是 KDE 的。

https://github.com/huangmingyou/fvwm-rio 这是我在用的 fvwm 配置文件

好的,给大佬跪了,我去研究一下,希望能研究出来,hiahia~

有点复杂,待我学习一下,

HIdpi...linux 用哪个发行版比较好啊...我试了一圈..决定还是用 win 了

太难搞了,我放弃了,还是谢谢大哥(感觉 fvwm 现在用得人少了,中文资料都没几个,而且会改变窗口很多行为。。Linux 原本的任务栏都没了。。。

对 i3wm 来说,vbox 用平铺模式( tiling ),会自动最大化;而同工作区的其他窗口全都设为浮动( floating,可以作为默认值),然后限定浮动窗口的最大尺寸( floating_maximum_size )。
更复杂一点,自己写个脚本,开新窗口、移动窗口的时候自动检测并设置窗口尺寸。
但对于 i3 来说,一般用法就是给 vbox 一个单独的工作区,再给 vbox 绑定一个快捷键,可以一键切换过去。

[i3 User’s Guide]( https://i3wm.org/docs/userguide.html)

很多 wm 还能把 标题栏 去掉

热心人多

> 更复杂一点,自己写个脚本,开新窗口、移动窗口的时候自动检测并设置窗口尺寸。
对,就是这个东西,我不知道怎么搞。i3wm 之前用过,感觉屏幕小的话和用多个 workspace 差不多,所以也就没深入使用。

xfce4 和 openbox 好像都可以设置 dock 空间,至少 xfce4 可以把 dock 放到桌面左边然后所有窗口最大化都不会遮挡

wm 常用的分为 stacking 和 tiling 。比如 gnome 和 kde plasma 这些是 stacking,前面人们提到的 i3 之类的是 tiling 。对于楼主的需求,tiling 更适合。

xdotool 看看能实现吗


搜索到过这个东西,同类好像还有 fluxbox,我之前想依靠在宿主机(Linux)最左侧建一个任务栏(Panel)留出一块空间,给 VirtualBox 的 Seamless 模式下的 Windows 用,但是 VirtualBox 的 Seamless 模式下的 Windows 的任务栏,其实是在宿主机(Linux)的可用空间内铺上一块空间而不是最左侧。
所以只能使 Linux 所有窗口最大化的时候给它限定一个范围,不让它覆盖某一块空间才行。

笔记本没那么大,用平铺效果不行,看得费劲,相反如果用显示器,那也就没必要这么做了,我把虚拟机分屏就行了。。

嗯,这个东西能控制窗口,但是怎么能设置所有窗口呐,没找到相关的,我昨天又看了一下 fvwm,好像它并不能控制所有窗口最大化的时候,不让窗口覆盖某一块空间啊,有这个语法`Style stylename options`,不知道 options 该怎么设置。

实现思路不是最大化窗口,而应该是精确控制窗口大小和位置; 例如
google-chrome --app="http://www.bing.com" -geometry 2222x1442--5-0
/>geometry 具体可以用 xwininfo 获取一个指定窗口的值

我现在的 fvwm 配置,chrome 用 f11 全屏以后,按住 alt 键,用鼠标右键可以再二次调整窗口大小。

这个思路可以,就是比较麻烦,需要设置所有 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

```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
```

找到一种方案,可以用快捷键调整当前活动窗口。
> 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

你可以换 bash shell 看看,不确定是不是 shell 的问题。
~/.Xresources 里面也可以指定位置和大小
Rxvt.geometry: 199x70+275-60

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

一般确实是在窗口管理器里做。
比如我用的是 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 = "/>> focusedBorderColor = "/>> 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.cEWMH 相关的属性,之后的布局问题,窗口管理器应该会自动处理。

可以的老哥,用得很溜,老哥你 i3wm 用的显示屏是多大的呀,我感觉 i3wm 必须得用个大的显示屏。。

多谢老哥普及,第一次听说 xmonad,关注老哥了,太硬核了哈哈。









提前祝各位 v 友除夕夜快乐,祝身体一直健康棒棒。

祝新年好运!

找到另一种方案: https://github.com/Gomaxx/goma-virtualbox-extension
经测在 Mint 19.3 上面可行,可能在 ubuntu 18.04 系下都能运行。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服