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 :

[Xlib] Récupérer le display sur lequel a été créée une fenêtre


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut [Xlib] Récupérer le display sur lequel a été créée une fenêtre
    Salut

    J'utilise la Xlib pour faire quelques manips de fenêtrage sous Linux, et je cherche à récupérer le couple display/écran sur lequel a été créée une fenêtre. Je ne les connais pas car ce n'est pas mon code qui crée la fenêtre, je reçois juste son identificateur.

    J'ai fouillé la documentation mais je n'ai vraiment rien trouvé. Est-ce que c'est possible ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Il y a plusieurs possibilités, mais d'abord quelques questions :

    1) utilises-tu une Window Manager ?
    2) utilises-tu Xt ou juste la Xlib ?
    3) sais-tu si c'est sur le même display que ton appli ou non ?

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Content d'avoir une réponse

    Tout d'abord je tiens à préciser que ça ne fait que quelques jours que je me suis penché sur la Xlib (et sur Linux en général), mais j'ai une connaissance suffisante des bibliothèques de fenêtrage bas niveau pour savoir de quoi il retourne. Mais si mes propos sont imprécis ou erronés, merci de me corriger

    1) utilises-tu une Window Manager ?
    Pas dans mon programme.

    2) utilises-tu Xt ou juste la Xlib ?
    J'utilise juste la Xlib.

    3) sais-tu si c'est sur le même display que ton appli ou non ?
    Il peut y avoir plusieurs cas de figure :
    • Mon appli ne reçoit que des fenêtres externes et donc n'ouvre pas de display pour elle-même
    • Mon appli doit créer des fenêtres elle-même, et là je ne suis pas sûr de la méthode à utiliser. Est-ce qu'il vaut mieux réutiliser le même display que les éventuelles fenêtres externes déjà créées ? Avoir plusieurs display implique quoi exactement, dans une même appli ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ok je crois qu'il y a une chose fondamentale que tu n'as pas comprise...

    Le Display est l'ensemble consitué par une MACHINE + N écrans.

    Donc si tu tournes sur une machine linux, le display X est une table associée à la machine... Unique pour cette machine (associée à l'adresse IP).

    Donc toute fenêtre créée sur cette machine a le même display.


    Ensuite, comme son nom l'indique, le Screen est l'écran. Si par exemple tu as 2 écrans distincts sur ta machine, l'un sera "écran 0" et l'autre "écran 1".
    Si tu n'en as qu'un, toutes les fenêtres auront le même écran.

    Pour une application, avoir plusieurs display simultanés implique qu'elle affiche simultanément sur plusieurs machines (noeuds d'un réseau par exemple).

    Quand une fenêtre est affichée sur un écran, elle a automatiquement associé un display (la machine) et un screen (l'écran sur lequel elle est affichée).


    Donc ton programme ne CHOISIS pas. Quand il crée une fenêtre, le serveur X regarde la variable globale (shell) display (commande "export DISPLAY=..."). Si cette variable est non itinialisée, cela se fait par défaut sur la machine en question. Si la variable est initialisée à "réseau:noeud:ecran" alors le serveur X "forwardera" la demande au serveur X de la machine en question et la fenêtre tentera de s'afficher sur l'écran de la machine en question.

    Par conséquent, par défaut, que tu crées une fenêtre ou que tu cherches une fenêtre sur ton écran, c'est la même chose : elles partagent toutes le même display et le même screen.

    Ce qui est (difficilement) faisable et ce que je pensais que tu demandais, c'était si il était possible de récupérer une fenêtre sur un autre écran sur une autre machine....

    Je pense qu'avant toute chose il faut lire à fond les premiers chapitres de la bible X ( "XWindow System" , Scheiffler, Gettys, Newman).

    Sinon je peux donner un cours

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A vrai dire c'est ce que je croyais avoir compris. A chaque fois que je voulais une fenêtre, interne ou externe (à mon appli), j'ouvrais une connexion sur le display par défaut (XOpenDevice(NULL)) en pensant récupérer toujours le même. Mais je me suis rendu compte que les changement que j'effectuais sur les fenêtres externes échouaient tout le temps, ce qui semblait venir du fait que mon pointeur Display* était différent de celui qui avait servi à créer la fenêtre.

    Donc en fait ma question est : quelle est le rapport entre le display en lui-même (identifié par son nom "host:ecran" -- toujours le même dans mon cas) et le pointeur que l'on reçoit en ouvrant ce display avec XOpenDisplay (toujours différent dans mon cas) ?

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Laurent Gomila
    A vrai dire c'est ec que je croyais avoir compris. A chaque fois que je voulais une fenêtre, interne ou externe (à mon appli), j'ouvrais une connexion sur le display par défaut (XOpenDevice(NULL)) en pensant récupérer toujours le même. Mais je me suis rendu compte que les changement que j'effectuais sur les fenêtres externes échouaient tout le temps, ce qui semblait venir du fait que mon pointeur Display* était différent de celui qui avait servi à créer la fenêtre.

    Donc en fait ma question est : quelle est le rapport entre le display en lui-même (identifié par son nom "host:ecran" -- toujours le même dans mon cas) et le pointeur que l'on reçoit en ouvrant ce display avec XOpenDisplay (toujours différent dans mon cas) ?
    D'abord pourquoi ouvrir avec OpenDevice ??

    Tu fais juste OpenDisplay ça suffit..

    Le rapport est un numéro dans une table par process, c'est tout..

    En fait, ce qu'il faut faire c'est :

    Au démarrage du programme ouvrir UNE SEULE FOIS le display, et le screen.


    Puis créer toutes les fenêtres avec ce display et ce screen.

    Quant aux autres fenêtres, la technique est un peu pernicieuse.. Il faut partir de la RootWindow, puis chercher ses enfants (XQueryTree). Parmi ces enfants, il faut descendre jusqu'à l'étape où il n'y a plus de fenêtre de même dismension que la Root (en général 1 ou 2 étages : ce sont les fenêtres utilisées par le WM). Et là, il faut explorer les enfants et chercher ce que tu veux (XGetWindowAttributes) . Ou alors il faut passer par les ATOM et aller chercher dans le Window Manager... Mais c'est plus complexe.

    Cela dépend si tu connais le nom (ou le positionnement) de la fenêtre.

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

Discussions similaires

  1. Récupérer l'élément sur lequel se trouve la souris
    Par Landrya dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/01/2010, 08h29
  2. TreeView, récupérer le TreeViewItem sur lequel se trouve la souris
    Par Harry_polin dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 30/11/2009, 11h01
  3. Récupérer le moniteur sur lequel se trouve une fenêtre/application
    Par ero-sennin dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 03/06/2009, 20h54
  4. Réponses: 1
    Dernier message: 23/04/2007, 14h09
  5. Réponses: 3
    Dernier message: 28/01/2007, 19h25

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