使用python-xlib禁用操作,移动,调整大小,最小化等

时间:2013-01-21 15:38:35

标签: python xlib

我正在创建一个程序,我需要锁定屏幕上窗口的位置,人们会认为这样做的简单方法是使用_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但是我仍然可以移动窗口,我真的不知道如何做到这一点/如何工作,如果有人可以向我澄清这一点,并给我一个例子,这将是一个很大的偏见。

2 个答案:

答案 0 :(得分:1)

_NET_WM_ALLOWED_ACTIONS似乎根本不是你想要的:

  

窗口管理器必须更新此属性以反映窗口当前“活动”或“敏感”的操作[...]窗口管理器在最初管理窗口时应该忽略_NET_WM_ALLOWED_ACTIONS的值。可以使用具有不同策略的先前窗口管理器保留此值。

在freedesktop扩展程序中,_NET_WM_WINDOW_TYPE最接近您的要求:指定某些窗口类型推荐某些行为。但是,没有机会获得你想要的完全的东西(比如,带装饰的不可移动的窗口),并且不能保证WM会完全遵守这个提示。

您可能希望使用OverrideRedirect属性:在映射窗口之前设置它时,WM不会介入窗口映射过程。这意味着没有装饰,没有重新定位,也没有用户在该窗口中执行操作:您承诺自己管理它。它不可移动(除非提供拖动它的工具)。它(也许不幸的是)也会被修饰。

答案 1 :(得分:1)

这是一个老问题,但我遇到了类似的问题,所以,这就是我最终使用的内容: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中使用它,我更喜欢共享工作代码。