Window-Manager

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

  • October 6, 2018

更新的問題

根據@mosvy的出色評論,實際上是視窗管理器尊重或忽略了視窗的傳播大小提示。不幸的是,我找不到不發送大小提示urxvt或忽略發送的方法的方法OpenBox

所以我想我的問題真的是:有沒有辦法urxvt停止發送大小提示?或者有沒有辦法配置OpenBox為忽略特定應用程序的發送大小提示?


原始問題:‘urxvt 無縫視窗大小’

我使用 OpenBox 作為我的視窗管理器,並且我配置了一些熱鍵以將視窗移動到具有指定視窗大小的螢幕的某些區域。所有視窗都尊重這一點,除了urxvt根據它顯示的字元的字型大小來計算它的大小。但是,如果urxvt處於全屏模式†,它能夠無間隙地填充螢幕。 (我假設它只是使用配置的 X 背景並填充視窗周圍的剩餘空間——但我可能錯了。)

所以我的問題是:是否有一個內置的配置選項或者可能是一個 perl 擴展,urxvt當它不處於全屏模式時,它可以填充視窗管理器給它的所有空間而沒有間隙?


†可能值得一提的是,我已經在使用perl 擴展以獲得適當的全屏體驗。

修復它的最簡單方法是修改原始碼rxvt或原始碼openbox並重新編譯 - 查看此答案的底部以獲取兩個非常簡單的更新檔。

另一種方法是使用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

然後urxvtopenbox將必須與

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
  1. 視窗管理器通常在許多系統上通過腳本呼叫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)",
自->min_size.width,自->min_size.height,
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 | PResize 公司 | PBaseSize | PWin重力;
+ szHint.flags = PMinSize | PBaseSize | PWin重力;
szHint.win_gravity = NorthWestGravity;
/* 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 | PResize公司;
+ szHint.flags |= PBaseSize;
}

if (!ignoreparent)

兩者都反對 debian 9.5 的版本;它們只適用於patch -l——我不知道如何讓這該死的東西保留標籤。

引用自:https://unix.stackexchange.com/questions/473183