更新的问题
基于优秀的评论@mosvy实际上是窗口管理器尊重或忽略窗口的传播大小提示。但不幸的是,我找不到一种方法来不发送大小提示urxvt
或忽略发送的大小提示OpenBox
。
所以我想我的问题确实是:有没有办法在级别上urxvt
停止发送大小提示?或者有没有办法配置OpenBox
为忽略特定应用程序发送的大小提示?
原始问题:“urxvt 无间隙窗口大小”
我使用 OpenBox 作为窗口管理器,并且配置了一些热键,用于将窗口移动到具有指定窗口大小的屏幕的某些区域。所有窗口都遵守这一点,除了urxvt
根据其显示的字符的字体大小计算其大小。但是,如果urxvt
处于全屏模式†,则它能够无间隙地填充屏幕。 (我假设它只是使用配置的 X 背景并填充窗口周围的剩余空间 - 但我对此可能是错误的。)
所以我的问题是:是否有一个内置的配置选项或者可能是一个 perl 扩展,可以urxvt
在不处于全屏模式时填充窗口管理器提供的所有空间而没有间隙?
†可能值得一提的是,我正在使用Perl 扩展已经获得了适当的全屏体验。
答案1
修复它的最简单方法是修改源或源rxvt
并openbox
重新编译 - 查看此答案的底部有两个很简单补丁。
另一种方法是使用LD_PRELOAD
hack,在获取窗口属性时关闭该PResizeInc
标志WM_NORMAL_HINTS
,并在设置该属性时防止打开该标志。这只会影响width_inc
和height_inc
属性——设置最小窗口大小或其纵横比的程序将继续正常工作。
$ cat no_inc_size_hints.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
Status XGetWMNormalHints(Display *dpy, Window w, XSizeHints *hp, long *rp){
static typeof (XGetWMNormalHints) *orig;
Status r;
if(!orig) orig = dlsym(RTLD_NEXT, "XGetWMNormalHints");
if((r = orig(dpy, w, hp, rp)))
hp->flags &= ~PResizeInc;
return r;
}
void XSetWMNormalHints(Display *dpy, Window w, XSizeHints *hp){
static typeof (XSetWMNormalHints) *orig;
if(!orig) orig = dlsym(RTLD_NEXT, "XSetWMNormalHints");
hp->flags &= ~PResizeInc;
orig(dpy, w, hp);
}
$ cc -shared -fPIC -Wall no_inc_size_hints.c -ldl -o no_inc_size_hints.so
然后urxvt
oropenbox
必须与
LD_PRELOAD="$LD_PRELOAD /absolute/path/to/no_inc_size_hints.so"
他们的环境中存在变量。例子:
$ LD_PRELOAD=`pwd`/no_inc_size_hints.so openbox --replace
这样做有两个问题:
1)urxvt
通常安装为 utmp setgid 二进制文件,并且LD_PRELOAD
在执行 set[gu]id 二进制文件时该变量被清除。查看手册页了解为什么需要(不需要) utmp 权限。因此,您必须将urxvt
可执行文件复制到其他地方(这将关闭 setgid 位)。例子:
$ cp `which urxvt` .; LD_PRELOAD=`pwd`/no_inc_size_hints.so ./urxvt
2)在许多系统上,窗口管理器通常是通过脚本调用的ssh-agent
,并且 还会从环境中擦除变量。所以可能需要这样的东西:/etc/X11/Xsession.d
ssh-agent
LD_PRELOAD
# cat <<'EOT' >/etc/X11/Xsession.d/98-no_inc_size_hints
export LD_PRELOAD="$LD_PRELOAD /path/to/no_inc_size_hints.so"
case $STARTUP in
/usr/bin/ssh-agent*)
STARTUP="/usr/bin/ssh-agent env LD_PRELOAD=$LD_PRELOAD ${STARTUP#* }";;
esac
EOT
可能的补丁openbox-3.6.1
:
--- openbox/client.c~ 2018-10-06 08:34:25.615967414 +0300 +++ openbox/client.c 2018-10-06 08:34:28.916133702 +0300 @@ -1757,9 +1757,6 @@ void client_update_normal_hints(ObClient if (size.flags & PBaseSize) SIZE_SET(self->base_size, size.base_width, size.base_height); - if (size.flags & PREsizeInc && size.width_inc && size.height_inc) - SIZE_SET(self->size_inc, size.width_inc, size.height_inc); - ob_debug("正常提示:最小尺寸(%d %d) 最大尺寸(%d %d)", 自我->最小尺寸.宽度,自我->最小尺寸.高度, self->max_size.width, self->max_size.height);
和对于rxvt-unicode-9.22
:
--- src/main.C~ 2018-10-06 08:33:08.580085731 +0300 +++ src/main.C 2018-10-06 08:33:37.549545455 +0300 @@ -657,7 +657,7 @@ rxvt_term::window_calc (unsigned int new 无符号整型 w、h; 无符号整型最大宽度,最大高度; - szHint.flags = PMinSize |预尺寸公司 | P 基础大小 | PWin重力; + szHint.flags = PMinSize | P 基础大小 | PWin重力; szHint.win_gravity = 西北重力; /* szHint.min_aspect.x = szHint.min_aspect.y = 1; */ @@ -1073,7 +1073,7 @@ rxvt_term::resize_all_windows (无符号 { szHint.flags &= ~(PBaseSize | PREsizeInc); XSetWMNormalHints(dpy,parent,&szHint); - szHint.flags |= PBaseSize |预调整尺寸公司; + szHint.flags |= PBaseSize; } 如果(!忽略)
两者都反对 debian 9.5 版本;他们只会适用于patch -l
——我不知道如何让这个该死的东西来保留标签。