2016-09-26 15 views
7

Próbuję napisać prosty program, który zmienia nazwę okna o określonym identyfikatorze okna .XChangeProperty bez skutku po wyjściu klienta

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

Działa to dobrze w debugger, jednak po zakończeniu działania programu, nazwa okna nie utrzymują się (za pomocą wname z wmutils (http://wmutils.io)).

Czy muszę wyraźnie czekać na XEvent, kiedy zmienię właściwość, zanim będę mógł wyjść? Co mogę zrobić, aby na stałe zmienić właściwość okna?

+2

działa dla mnie, jakie okno chcesz zmodyfikować? –

+0

Próbowałem go na moim oknie terminala (używając st (st.suckless.org)). Wydaje się działać z innymi oknami, ale nie ze st. – pranomostro

+0

Twój terminal prawdopodobnie ustawia swój tytuł za każdym razem, gdy zaczyna lub kończy wykonywanie polecenia. –

Odpowiedz

2

Nie mogę tego odtworzyć. Próbowałem tego z aplikacją "Xfburn". Proszę zobaczyć tę sesję i daj mi znać, jeśli mam coś źle (xchangeproperty.c jest kod):

$ 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 

Mogę również zobaczyć tytuł na zmianę Okno. To jest testowane na XUbuntu 16.04 z gcc:

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

To nie działało w moim oknie terminala, a ja użyłem pfw (okno fokusa drukowania) jako okna testowego, który był moim terminalem. Działa jednak na innych programach. – pranomostro

Powiązane problemy