2016-10-28 59 views
-2

我只想在唯一可能的操作关闭时创建示例应用程序。 Unity(Ubuntu)可以吗? 我犯了一个错误吗?Xlib + Unity只允许关闭允许的操作

#include <stdio.h> 
#include <X11/Xlib.h> 
#include <X11/Xos.h> 
#include <X11/Xatom.h> 
static void only_close(Display *display, Window window) 
{ 

    int retval; 
    Atom aa = XInternAtom(display, "_NET_WM_ALLOWED_ACTIONS", False); 
    Atom close = XInternAtom(display, " _NET_WM_ACTION_CLOSE", False); 

    retval = XChangeProperty(display, window, aa, XA_ATOM, 32, PropModeReplace, (unsigned char*)close, 1); 

    printf("###### XChangeProperty() reted %d\n", retval); 
} 

int main() 
{ 

    Display *dis; 
    Window win; 

    dis = XOpenDisplay(NULL); 
    win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 500, 500, \ 
           0, BlackPixel (dis, 0), BlackPixel(dis, 0)); 
    XMapWindow(dis, win); 
    printf("window %i\n", (int)win); 
    only_close(dis, win); 
    XFlush(dis); 
    sleep(10); 
    return(0); 
} 
+0

你问我们,如果你犯了一个错误,你是否尝试过编译代码?如果是这样,你会得到什么错误?请参考[如何提出一个好问题](http://stackoverflow.com/help/how-to-ask)上的帮助。 – Enfyve

+0

我其实没有错误。完全没有任何附加条件。所有操作(调整大小,最小化,全屏...)都允许 – Preovaleo

+0

需要更多详细信息,错误是什么?看到第一个评论 –

回答

0

首先,你需要(unsigned char*)&close

其次,你得太早设置属性(一个数据的地址),WM有机会管理窗口前。 WM 必须首次管理窗口时丢弃此属性的旧值。在第一次曝光事件后尝试,或延迟1秒后尝试。

三,不保证能正常工作。在我的机器上(不是Unity),任务栏中的窗口动作确实被禁用,但窗口框架仍然有它们,但WM仍然允许它们。我不知道这是否是我的WM中的错误。