客户端退出后 XChangeProperty 无效
XChangeProperty without effect after client exits
我正在尝试编写一个简单的程序来改变
具有特定 window id 的 window 的名称。
/* 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;
}
这在调试器中工作正常,但是,在程序完成后,window 名称不会保留(使用 wname from wmutils (http://wmutils.io))。
当我更改 属性 时,是否必须明确等待 XEvent 才能退出?我该怎么做才能永久更改 window 属性?
我无法重现这个。我用应用程序 "Xfburn" 尝试了这个。请查看此 session 如果我误解了什么请告诉我(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
我还可以看到 Window 更改的标题。这是在 XUbuntu 16.04 上用 gcc 测试的:
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
我正在尝试编写一个简单的程序来改变 具有特定 window id 的 window 的名称。
/* 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;
}
这在调试器中工作正常,但是,在程序完成后,window 名称不会保留(使用 wname from wmutils (http://wmutils.io))。
当我更改 属性 时,是否必须明确等待 XEvent 才能退出?我该怎么做才能永久更改 window 属性?
我无法重现这个。我用应用程序 "Xfburn" 尝试了这个。请查看此 session 如果我误解了什么请告诉我(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
我还可以看到 Window 更改的标题。这是在 XUbuntu 16.04 上用 gcc 测试的:
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609