更新された質問
優れたレビューに基づいて@モスビー実際に起こるのは、ウィンドウマネージャがウィンドウの伝播されたサイズヒントを尊重または無視することです。ただし、残念ながらサイズのヒントを送信しないか、urxvt
送信したサイズのヒントを無視する方法が見つかりませんOpenBox
。
だから私の質問は次のとおりです。urxvt
特定のレベルでサイズヒントの送信を停止する方法はありますか?または、OpenBox
特定のアプリケーションから送信されたサイズヒントを無視するように設定する方法はありますか?
元の質問:「urxvt gaplessウィンドウサイズ」
私はOpenBoxをウィンドウマネージャとして使用しており、ウィンドウを指定されたウィンドウサイズで画面の特定の領域に移動するためのいくつかのショートカットを設定しました。すべてのウィンドウは、urxvt
表示される文字のフォントサイズに基づいてサイズが計算されることを除いて、これに準拠します。ただし、urxvt
フルスクリーンモード†では、スペースなしで画面を埋めます。 (設定されたX背景を使用し、ウィンドウの周りの残りのスペースを埋めると仮定しますが、これは間違っているかもしれません。)
だから私の質問は:組み込みの設定オプションがある場合、またはurxvt
フルスクリーンモードではないときにウィンドウマネージャが提供するすべてのスペースをスペースなしで埋めることができるPerl拡張機能はありますか?
†おそらく私が使っていることに言及する価値があるでしょう。Perl拡張適切なフルスクリーン体験が達成された。
答え1
この問題を解決する最も簡単な方法は、ソースを修正しrxvt
てopenbox
再コンパイルすることです。両方についてこの回答の下部を参照してください。とても簡単ですスポット。
LD_PRELOAD
別の方法は、ウィンドウのプロパティをインポートするときにフラグをオフにし、プロパティを設定するときに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
これには2つの問題があります。
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 +++オープンボックス/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(自己 -> size_inc、size.width_inc、size.height_inc); - ob_debug("一般プロンプト: 最小サイズ (%d %d) 最大サイズ (%d %d)", セルフ - >最小サイズ。幅、セルフ - >最小サイズ。高さ、 セルフ - >最大_サイズ、幅、セルフ - >最大_サイズ、高さ);
そして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
タグを保存するためにクソの方法を知りません。