Environnement: Ubuntu 16.04

Dans mon application, j'obtiens l'icône d'une application en appelant XGetWindowProperty avec _NET_WM_ICON atom.

unsigned char* data;
XGetWindowProperty(..., &data);
unsigned long* data1 = (unsigned long*) data;
long width = *data1;
long height = *(data1 + 1)
unsigned char* imageData = (unsigned char*) (data1 + 2);

Voici les spécifications des données renvoyées:

https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317554480

Selon les spécifications, l'image retournée doit être au format ARGB emballé. Cependant, l'image que j'obtenais ne me semblait pas juste. J'ai finalement créé une application de test avec ma propre icône. C'est une icône solide avec une valeur RVB de 0x20, 0x40 et 0x80 respectivement.

Https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317554480...

0x80, 0x40, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff (repeat the pattern)

Il semble que le format soit BGRA avec quatre octets supplémentaires de remplissage.

Lorsque j'examine ma variable {{X0}} dans le débogueur, voici ce que je vois:...

4
Peter 5 avril 2017 à 19:47

2 réponses

Meilleure réponse

J'ai confirmé que le format est bien BGRA avec quatre octets supplémentaires de remplissage. J'ai énuméré toutes les applications en cours d'exécution et j'ai pu extraire correctement les icônes.

1
Peter 6 avril 2017 à 17:22

Dans la page de manuel XGetWindowProperty(3) sur CentOS 7, cela fait référence au paramètre pour lequel vous passez l'argument data:

       prop_return
                 Returns the data in the specified format.  If the returned
                 format is 8, the returned data is represented as a char
                 array. If the returned format is 16, the returned data is
                 represented as a array of short int type and should be cast
                 to that type to obtain the elements. If the returned format
                 is 32, the property data will be stored as an array of longs
                 (which in a 64-bit application will be 64-bit values that are
                 padded in the upper 4 bytes).

Je suppose que vous trouverez que actual_format_return est 32 (puisque la spécification semble indiquer que c'est le seul format valide pour _NET_WM_ICON), et vraisemblablement votre application est 64 bits, ce qui signifie que votre { Le type {X2}} a une longueur de 64 bits, d'où le remplissage.

Quant à savoir pourquoi les bits de remplissage sont tous définis sur 1 au lieu de 0, je ne suis pas si sûr. La signature de la fonction dans la page de manuel montre unsigned char **prop_return, mais le texte cité ci-dessus dit que c'est un "tableau de longs", pas "un tableau de longs non signés", donc peut-être que cela est destiné à être pris littéralement (ou a été prise littéralement par l'auteur de l'application dont vous récupérez l'icône), et une extension de signe a eu lieu quelque part avant que votre application ne reçoive les données.

1
doshea 29 déc. 2017 à 11:59