如何配置 OpenBox 以忽略特定应用程序窗口的大小提示?

如何配置 OpenBox 以忽略特定应用程序窗口的大小提示?

更新的问题

基于优秀的评论@mosvy实际上是窗口管理器尊重或忽略窗口的传播大小提示。但不幸的是,我找不到一种方法来不发送大小提示urxvt或忽略发送的大小提示OpenBox

所以我想我的问题确实是:有没有办法在级别上urxvt停止发送大小提示?或者有没有办法配置OpenBox为忽略特定应用程序发送的大小提示?


原始问题:“urxvt 无间隙窗口大小”

我使用 OpenBox 作为窗口管理器,并且配置了一些热键,用于将窗口移动到具有指定窗口大小的屏幕的某些区域。所有窗口都遵守这一点,除了urxvt根据其显示的字符的字体大小计算其大小。但是,如果urxvt处于全屏模式,则它能够无间隙地填充屏幕。 (我假设它只是使用配置的 X 背景并填充窗口周围的剩余空间 - 但我对此可能是错误的。)

所以我的问题是:是否有一个内置的配置选项或者可能是一个 perl 扩展,可以urxvt在不处于全屏模式时填充窗口管理器提供的所有空间而没有间隙?


可能值得一提的是,我正在使用Perl 扩展已经获得了适当的全屏体验。

答案1

修复它的最简单方法是修改源或源rxvtopenbox重新编译 - 查看此答案的底部有两个很简单补丁。

另一种方法是使用LD_PRELOADhack,在获取窗口属性时关闭该PResizeInc标志WM_NORMAL_HINTS,并在设置该属性时防止打开该标志。这只会影响width_incheight_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

然后urxvtoropenbox必须与

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.dssh-agentLD_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——我不知道如何让这个该死的东西来保留标签。

相关内容