如何配置 OpenBox 以忽略特定應用程序視窗的大小提示?
更新的問題
根據@mosvy的出色評論,實際上是視窗管理器尊重或忽略了視窗的傳播大小提示。不幸的是,我找不到不發送大小提示
urxvt
或忽略發送的方法的方法OpenBox
。所以我想我的問題真的是:有沒有辦法
urxvt
停止發送大小提示?或者有沒有辦法配置OpenBox
為忽略特定應用程序的發送大小提示?原始問題:‘urxvt 無縫視窗大小’
我使用 OpenBox 作為我的視窗管理器,並且我配置了一些熱鍵以將視窗移動到具有指定視窗大小的螢幕的某些區域。所有視窗都尊重這一點,除了
urxvt
根據它顯示的字元的字型大小來計算它的大小。但是,如果urxvt
處於全屏模式†,它能夠無間隙地填充螢幕。 (我假設它只是使用配置的 X 背景並填充視窗周圍的剩餘空間——但我可能錯了。)所以我的問題是:是否有一個內置的配置選項或者可能是一個 perl 擴展,
urxvt
當它不處於全屏模式時,它可以填充視窗管理器給它的所有空間而沒有間隙?†可能值得一提的是,我已經在使用perl 擴展以獲得適當的全屏體驗。
修復它的最簡單方法是修改原始碼
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
或openbox
將必須與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
- 視窗管理器通常在許多系統上通過腳本呼叫
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
——我不知道如何讓這該死的東西保留標籤。