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

标签 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,但我仍然可以移动窗口,我真的不知道如何做到这一点/它是如何工作的,如果有人可以的话请向我澄清这一点并给我举一个例子,我将不胜感激。

最佳答案

这是一个老问题,但我也遇到了类似的问题,所以,这就是我最终使用的:与 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 中不需要这些,而且我更喜欢共享工作代码。

关于python - 使用 python-xlib 禁用操作、移动、调整大小、最小化等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14442081/

相关文章:

python - Django 管理中的自定义过滤器

python - 如何计算 pandas 数据框中各列的非 NaN 值?

c++ - GTK 窗口的事件窗口的 X11 屏幕截图失败

python - 如果只有 int 1 是 [1, 2.3, '' ] 中的列表项,为什么 Python '' return ' in operator 'blabla' True' for float 1.0 ?

python - Python 列表在哪里保存它的值?

python - Elastic Beanstalk Flask 应用程序上的 HTTPS

python - 监听键盘事件而不捕获它们?

c++ - 发出不同频率的声音

c++ - 使用 XSendEvent 传递鼠标事件

c++ - 如何释放 XopenDisplay 分配的资源