2

画面上のウィンドウの位置をロックする必要があるプログラムを作成しています.これを行う簡単な方法は _NET_WM_ALLOWED_ACTIONS を使用することですが、明らかに機能しなかったか、どのように機能するかわかりませんxD..次のようなイベントを送信しようとしました:

def getatom (atom):
    return self.display.intern_atom(atom)

data = [getatom("_NET_WM_ACTION_ABOVE"),getatom("_NET_WM_ACTION_CLOSE"),
        getatom("_NET_WM_ACTION_BELOW"),getatom("_NET_WM_ACTION_CHANGE_DESKTOP"),
        getatom("_NET_WM_ACTION_SHADE")]
state = getatom("_NET_WM_ALLOWED_ACTIONS")
event = Xlib.protocol.event.ClientMessage(window = window, client_type = state, data = (32, data))
root.send_event(event, X.SubstructureRedirectMask)
self.display.sync()

xprop を使用する場合、許可されているアクションは _NET_WM_ACTION_ABOVE、_NET_WM_ACTION_CLOSE、_NET_WM_ACTION_BELOW、_NET_WM_ACTION_CHANGE_DESKTOP、および _NET_WM_ACTION_SHADE ですが、ウィンドウを移動することはできます。例を挙げていただければ幸いです。

4

2 に答える 2

3

これは古い質問ですが、私は同様の問題を抱えていたので、最終的に使用したのは次のとおりです。Motif互換で、非公式ですが、ほとんどのウィンドウマネージャーでサポートされています_MOTIF_WM_HINTS。定義は古い Motif コード ( にあるはずですXm/MwmUtil.h) からのものですが、誰もがそれらを複製しているため、次のようになります。

struct MwmHints {
    unsigned long flags;
    unsigned long functions;
    unsigned long decorations;
    long input_mode;
    unsigned long status;
};
enum {
    MWM_HINTS_FUNCTIONS = (1L << 0),
    MWM_HINTS_DECORATIONS =  (1L << 1),

    MWM_FUNC_ALL = (1L << 0),
    MWM_FUNC_RESIZE = (1L << 1),
    MWM_FUNC_MOVE = (1L << 2),
    MWM_FUNC_MINIMIZE = (1L << 3),
    MWM_FUNC_MAXIMIZE = (1L << 4),
    MWM_FUNC_CLOSE = (1L << 5)
};

コードは次のようになります。

struct MwmHints hints;
Atom wm = XInternAtom(display, "_MOTIF_WM_HINTS", False);
hints.functions = MWM_FUNC_RESIZE | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE | MWM_FUNC_CLOSE;
hints.flags = MWM_HINTS_FUNCTIONS;
XChangeProperty(display, window, wm, XA_ATOM, 32, PropModeReplace, (unsigned char*)&hints, 5);

を省略したのでMWM_FUNC_MOVE、ウィンドウは動かせないはずです。

私の(限られた)テストでは、これらはMWM_FUNC_RESIZEほとんど機能しませんが、ほとんど機能しません。

これらを Python に移植するのは難しいことではありませんが、私はこれを Python に移植する必要がなかったので、作業コードを共有したいと考えています。

于 2016-07-03T23:11:36.087 に答える
2

_NET_WM_ALLOWED_ACTIONSあなたが望むものについてはまったくないようです:

ウィンドウ マネージャーは、ウィンドウに対して現在「アクティブ」または「機密」であるアクションを反映するために、このプロパティを更新し続ける必要があります [...] ウィンドウ マネージャーは、最初にウィンドウを管理するときに _NET_WM_ALLOWED_ACTIONS の値を無視する必要があります。この値は、異なるポリシーを持つ以前の Window Manager から残っている可能性があります。

freedesktop の拡張機能の中では、特定の動作を推奨_NET_WM_WINDOW_TYPEするために特定のウィンドウ タイプを指定するという、あなたが望むものに最も近いものがあります。ただし、希望どおりのもの (装飾が施された動かないウィンドウなど)を取得する機会はなく、WM がこのヒントに従うという保証もまったくありません。

属性を使用したいOverrideRedirect場合があります。ウィンドウがマップされる前に属性が設定されている場合、WM はウィンドウ マッピング プロセスに介入しません。これは、そのウィンドウでの装飾、親の変更、およびユーザーによるアクションがないことを意味します。自分で管理することを約束します。移動できません (ドラッグ機能を提供しない限り) また、(おそらく残念ながら)装飾されていません。

于 2013-01-21T15:54:03.257 に答える