IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[XWindow] Données utilisateur dans une fenêtre ?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut [XWindow] Données utilisateur dans une fenêtre ?
    Bonjour à tous, désolé si ma question est un peu naïve, je débute en programmation Linux:

    Y a-t-il moyen de mettre des données utilisateur dans une fenêtre XWindow ? C'est à dire l'équivalent du SetWindowLong(..., GWL_USERDATA) de Windows ? J'aurais besoin d'associer un objet C++ à chaque fenêtre, et être ensuite capable de le retrouver à partir de cette fenêtre, par exemple lorsque que je reçois un évènement Expose.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Personnellement, je trouve l'existence même d'un SetWindowLong (…,GWL_USERDATA) très sale. Cela ne devrait pas être donné en exemple. Enfin, ce n'est que mon avis.

    Sous X-Window, tu peux définir autant de « propriétes » que tu veux, associées à une fenêtre. Les infos essentielles s'appellent « attributs » et vont dans une structure bien définie, et tout le reste est défini à travers les « propriétés », qui associent un atome à une donnée (un atome étant un nom sous la forme d'une chaîne de caractères, déclaré une fois pour toutes auprès du serveur X, et qui est ensuite exploité via un numéro entier unique).

    Par exemple, pour changer le titre de la fenêtre, il existe la fonction XStoreName(), mais ce n'est qu'un raccourci vers la manipulation des propriétés.

    Tu peux donc associer autant de données que tu veux à ta fenêtre, de manière bien structurée. Seulement, pour faire ce que tu veux faire, ce n'est pas du tout l'approche à avoir. Il est beaucoup plus intéressant de faire une map<> en C++ qui associe un objet avec le handle de ta fenêtre, et de résoudre cela en local dans ton processus.

    C'est plus propre en soi, mais c'est aussi beaucoup plus sensé car dans X-Window, la fenêtre est complètement indépendante en elle-même du processus qui l'a créé. À dire vrai, comme elle est émulé par un serveur X, elle peut même se trouver sur une machine complètement différente de celle qui exécute ton processus. Donc, deux processus différents tournant sur deux machines différentes peuvent très bien récupérer le handler d'une même fenêtre et la gérer en parallèle si ça leur chante. C'est d'ailleurs cette possibilité qu'exploitent les Window Managers.

  3. #3
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Faire une map, c'est sans doute plus propre, mais je crains une perte de performances (j'ai un certain nombre de fenêtre)... Et en plus ça suppose de centraliser l'enregistrement des fenêtres, ce qui n'est pas du tout adapté à mon architecture.

    J'ai donc utilisé les properties. Après un peu de mal, parce que la fonction attend des char** et que mes chars sont en fait un void* ... J'ai donc trois niveaux d'indirection.

    Mais en définitive ça fonctionne, merci pour les bons conseils.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par 10_GOTO_10 Voir le message
    J'ai donc utilisé les properties. Après un peu de mal, parce que la fonction attend des char** et que mes chars sont en fait un void* ... J'ai donc trois niveaux d'indirection. Mais en définitive ça fonctionne, merci pour les bons conseils.
    À ton service.

    Par contre, pour les maps, ce sera toujours plus rapide de faire ça à l'intérieur de ton processus. D'une part, parce que, dans l'autre cas, tu fais de la communication inter-processus et tu attends que ce soit lui qui te réponde et, d'autre part, parce que le serveur X utilise probablement lui-même une map ou quelque chose de similaire pour maintenir les informations de ses fenêtres. Et c'est pareil sous Windows, d'ailleurs…

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Gestion des données d'un utilisateur dans une application
    Par Boujoute dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/06/2012, 14h48
  2. Réponses: 1
    Dernier message: 23/07/2011, 13h13
  3. Réponses: 0
    Dernier message: 13/11/2010, 18h20
  4. Réponses: 14
    Dernier message: 02/07/2007, 09h30
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo