2016-09-26 1 views
7

Я пытаюсь написать простую программу, которая изменяет имя окна с определенным идентификатором окна.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 

Я могу также увидеть название на изменение окна. Это проверено на XUbuntu 16.04 с gcc:

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

Он не работал в моем окне терминала, и я использовал pfw (окно с ориентацией на печать) в качестве окна тестирования, которое было моим терминалом. Тем не менее, он работает и с другими программами. – pranomostro