客户端退出后,XChangeProperty无效

pra*_*tro 7 c x11 xlib

我正在尝试编写一个简单的程序来更改具有特定窗口ID的窗口的名称.

/* See LICENSE file for copyright and license details. */

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>

static void usage(char *);
static void set_title(Display* d, Window w, char* name);

static void
usage(char *name)
{
    fprintf(stderr, "usage: %s <name> <wid>\n", name);
    exit(1);
}

static void
set_title(Display* d, Window w, char* name)
{
    XEvent e;
    XSync(d, False);
    int ret=XChangeProperty(d, w,
        XInternAtom(d, "WM_NAME", False),
        XInternAtom(d, "STRING", False), 8,
        PropModeReplace, (unsigned char*)name, strlen(name)+1);
    if(ret==0)
        return;
    ret=XChangeProperty(d, w,
        XInternAtom(d, "_NET_WM_NAME", False),
        XInternAtom(d, "STRING", False), 8,
        PropModeReplace, (unsigned char*)name, strlen(name)+1);
}

int
main(int argc, char **argv)
{
    Display* d;
    char* name=argv[1];

    if (argc != 3)
        usage(argv[0]);

    d=XOpenDisplay(NULL);

    set_title(d, strtoul(argv[2], NULL, 16), name);

    XFlush(d);
    XCloseDisplay(d);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这在调试器中工作正常,但是,在程序完成后,窗口名称不会持久存在(使用wmutils中的wname(http://wmutils.io)).

在我退出之前更改属性时,是否必须明确等待XEvent?如何永久更改窗口属性?

ble*_*fly 3

我无法重现这个。我用应用程序“Xfburn”尝试了这一点。请参阅本次会议,如果我误解了任何内容,请告诉我(xchangeproperty.c 是您的代码):

$ gcc -g -O0 -o xchangeproperty xchangeproperty.c -lX11
$ xwininfo -name Xfburn | grep "Window id"
xwininfo: Window id: 0x4600003 "Xfburn"
$ ./wname 0x4600003
Xfburn
$ ./xchangeproperty pranomostro 0x4600003
$ echo $?
0
$ ./wname 0x4600003
pranomostro
Run Code Online (Sandbox Code Playgroud)

我还可以看到窗口上的标题发生变化。这是在 XUbuntu 16.04 上使用 gcc 进行测试的:

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
Run Code Online (Sandbox Code Playgroud)