2016-09-26 106 views
7

我正在嘗試編寫一個簡單的程序,用一個特定的窗口ID來更改窗口的名稱( )。XChangeProperty在客戶端退出後無效

/* 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; 
} 

這工作正常,在調試器,但是,在程序完成後,該窗口名稱不堅持(使用wname從wmutils(http://wmutils.io))。

當我可以退出之前更改屬性時,是否必須顯式等待XEvent?我能做些什麼來永久更改窗口屬性?

+2

爲我工作,你想修改什麼窗口? –

+0

我在終端窗口上試過了(使用st(st.suckless.org))。它似乎與其他窗口一起工作,但不與st。 – pranomostro

+0

您的終端可能會在每次啓動或完成運行命令時設置其標題。 –

回答

2

我無法重現這一點。我用「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 

我還可以看到在窗口中更改標題。這是測試與gcc的XUbuntu 16.04:

$ gcc --version 
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609 
+0

它沒有在我的終端窗口上工作,我用pfw(打印聚焦窗口)作爲測試窗口,這是我的終端。但它適用於其他程序。 – pranomostro