Linux 窗口 最大化 设置

2021-02-08 11:22:18 +08:00
 hanssx

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

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

3037 次点击
所在节点    Linux
32 条回复
hanssx
2021-02-09 10:17:47 +08:00
@JackieMe
搜索到过这个东西,同类好像还有 fluxbox,我之前想依靠在宿主机(Linux)最左侧建一个任务栏(Panel)留出一块空间,给 VirtualBox 的 Seamless 模式下的 Windows 用,但是 VirtualBox 的 Seamless 模式下的 Windows 的任务栏,其实是在宿主机(Linux)的可用空间内铺上一块空间而不是最左侧。
所以只能使 Linux 所有窗口最大化的时候给它限定一个范围,不让它覆盖某一块空间才行。

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

@huangmingyou
嗯,这个东西能控制窗口,但是怎么能设置所有窗口呐,没找到相关的,我昨天又看了一下 fvwm,好像它并不能控制所有窗口最大化的时候,不让窗口覆盖某一块空间啊,有这个语法`Style stylename options`,不知道 options 该怎么设置。
huangmingyou
2021-02-09 10:46:04 +08:00
实现思路不是最大化窗口,而应该是精确控制窗口大小和位置; 例如
google-chrome --app="http://www.bing.com" -geometry 2222x1442--5-0
#
geometry 具体可以用 xwininfo 获取一个指定窗口的值
huangmingyou
2021-02-09 10:47:11 +08:00
我现在的 fvwm 配置,chrome 用 f11 全屏以后,按住 alt 键,用鼠标右键可以再二次调整窗口大小。
hanssx
2021-02-09 11:29:22 +08:00
@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
hanssx
2021-02-09 11:34:37 +08:00
```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
```
hanssx
2021-02-09 11:48:57 +08:00
@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
huangmingyou
2021-02-09 13:14:54 +08:00
@hanssx 你可以换 bash shell 看看,不确定是不是 shell 的问题。
~/.Xresources 里面也可以指定位置和大小
Rxvt.geometry: 199x70+275-60
omph
2021-02-10 00:59:13 +08:00
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
secondwtq
2021-02-10 01:54:59 +08:00
一般确实是在窗口管理器里做。

比如我用的是 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 相关的属性,之后的布局问题,窗口管理器应该会自动处理。
hanssx
2021-02-10 19:49:03 +08:00
@omph 可以的老哥,用得很溜,老哥你 i3wm 用的显示屏是多大的呀,我感觉 i3wm 必须得用个大的显示屏。。


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



@huangmingyou
@omph
@secondwtq
@kid740246048
@zhuisui
@no1xsyzy
@JackieMe
@IgniteWhite
提前祝各位 v 友除夕夜快乐,祝身体一直健康棒棒。
IgniteWhite
2021-02-10 19:50:21 +08:00
@hanssx 祝新年好运!
hanssx
2021-02-12 00:16:04 +08:00
找到另一种方案: https://github.com/Gomaxx/goma-virtualbox-extension
经测在 Mint 19.3 上面可行,可能在 ubuntu 18.04 系下都能运行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX