2016-09-26 7 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; 
} 

이 프로그램이 끝난 후 그러나, 윈도우 이름 (wmutils (http://wmutils.io)에서 wname 사용) 유지되지 않습니다, 디버거에서 잘 작동합니다.

종료하기 전에 속성을 변경할 때 명시 적으로 XEvent를 기다려야합니까? 창 속성을 영구적으로 변경하려면 어떻게해야합니까?

+2

으로 XUbuntu 16.04에서 테스트되었습니다. 어떤 창을 수정하려고합니까? –

+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 :

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

내 터미널 창에서 작동하지 않았고 pfw (집중된 창 인쇄)를 터미널로 사용했습니다. 하지만 다른 프로그램에서도 작동합니다. – pranomostro