特定のアプリケーションウィンドウのサイズプロンプトを無視するようにOpenBoxをどのように設定しますか?

特定のアプリケーションウィンドウのサイズプロンプトを無視するようにOpenBoxをどのように設定しますか?

更新された質問

優れたレビューに基づいて@モスビー実際に起こるのは、ウィンドウマネージャがウィンドウの伝播されたサイズヒントを尊重または無視することです。ただし、残念ながらサイズのヒントを送信しないか、urxvt送信したサイズのヒントを無視する方法が見つかりませんOpenBox

だから私の質問は次のとおりです。urxvt特定のレベルでサイズヒントの送信を停止する方法はありますか?または、OpenBox特定のアプリケーションから送信されたサイズヒントを無視するように設定する方法はありますか?


元の質問:「urxvt gaplessウィンドウサイズ」

私はOpenBoxをウィンドウマネージャとして使用しており、ウィンドウを指定されたウィンドウサイズで画面の特定の領域に移動するためのいくつかのショートカットを設定しました。すべてのウィンドウは、urxvt表示される文字のフォントサイズに基づいてサイズが計算されることを除いて、これに準拠します。ただし、urxvtフルスクリーンモードでは、スペースなしで画面を埋めます。 (設定されたX背景を使用し、ウィンドウの周りの残りのスペースを埋めると仮定しますが、これは間違っているかもしれません。)

だから私の質問は:組み込みの設定オプションがある場合、またはurxvtフルスクリーンモードではないときにウィンドウマネージャが提供するすべてのスペースをスペースなしで埋めることができるPerl拡張機能はありますか?


おそらく私が使っていることに言及する価値があるでしょう。Perl拡張適切なフルスクリーン体験が達成された。

答え1

この問題を解決する最も簡単な方法は、ソースを修正しrxvtopenbox再コンパイルすることです。両方についてこの回答の下部を参照してください。とても簡単ですスポット。

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

それからurxvtoropenboxと比較する必要があります。

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_PRELOADset[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
+++オープンボックス/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タグを保存するためにクソの方法を知りません。

関連情報