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: Créer un aperçu de fenêtre


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut Xlib: Créer un aperçu de fenêtre
    Bonjour,
    Après moults lectures dans les documentations de Xlib, je n'arrive cependant pas à créer un aperçu de fenêtre dans une seconde fenêtre...

    Je vous met le code
    [i]NB: je limite l'aperçu aux fenêtres commençant par "m", (en fait, c'est celle de mon IDE, donc elle est toujours présente)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    #include <cstdlib>
    #include <iostream>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
     
    //Dessin de la fenêtre
    void DrawContenu(Display *dpy, Drawable src, Window win, GC gc, int width, int height){
     
        //XClearWindow(dpy, win);
        XCopyArea(dpy, src, win, gc, 0, 0, width, height, 0, 0)   //On copie une zone de la fenêtre listée sur la fenêtre donnée
        XFlush(dpy);  //On force l'affichage de dpy
    }
     
    void EnumWin(GC gc, Window win){
     
     //Variables pour les gestions de l'affichage...
     Display *display;
     Window root;
     int ecran, je;
     
     //Variables pour le listing
     Window root_return, parent_return, *children_return=NULL, tmp;
     uint nchildren_return=0;
     
     
     display = XOpenDisplay (NULL);         //Display par défaut
     ecran = DefaultScreen (display);       //Ecran par défaut
     root = XRootWindow (display, ecran);   //Fenêtre principale
     
     
     //system("clear");   //Pour faire joli...
     //On liste les fenêtres...
     std::cout  << "Appel XQueryTree: "
                << XQueryTree(display, root, &root_return, &parent_return, &children_return, &nchildren_return)
                << std::endl;
     
     je=0;
     if(children_return == NULL) printf("Tatare");
     else{
        tmp=children_return[0]; //On se positionne sur la première fenêtre fille
        char *name;
        int status;
     
        XWindowAttributes winattributes;    //infos de la fenêtre
     
        for(uint i=0; i<nchildren_return; i++, tmp=children_return[i]){ //Pour chaque enfant...
            XGetWindowAttributes(display, tmp, &winattributes);         //Attributs de la fenêtre...
            if(winattributes.map_state != IsViewable) continue;         //Si elle n'est pas affichable, on passe au suivant
     
            status = XFetchName(display, tmp, &name);   //Nom de la fenêtre
     
            if(status !=0 && status != BadWindow){      //Si la fenêtre est valable
                std::cout << "-" << (unsigned int)tmp << " " << name << " : "<< winattributes.depth << std::endl;   //On affiche des infos dessus
     
                //display = XOpenDisplay (NULL);
                if(*name == 'm') DrawContenu(display, tmp, win, gc, 400, 400);
                XFree(name);    //Libération du nom
     
            } //fin de si fenêtre valable
        } //fin de la boucle
     } //fin du else
    }
     
     
    //Dessin de la fenêtre
    void redessiner_fenetre (GC gc, Window win)
      {
        EnumWin(gc, win);
        return;
      }
     
     
    int main ()
    {
     Display *display;
     Window root, win;
     GC     gc;
     int ecran;
     
     XGCValues ValeursGC;
    // Pixmap pixmap;
    // Screen screen;
     
     /* Connection au serveur X */
     display = XOpenDisplay (NULL);
     
     /* Preparation des variables pour XCreateSimpleWindow */
     ecran = DefaultScreen (display);
     root = XRootWindow (display, ecran);
     gc = DefaultGC(display, ecran);
     
     
     //création de la fenêtre
     win = XCreateSimpleWindow(display, root, 100, 100, 700, 700, 5, XBlackPixel(display, ecran), XWhitePixel(display, ecran));
     
     ValeursGC.foreground = BlackPixel(display, ecran);
     ValeursGC.line_width = 4;
     gc = XCreateGC(display, win,
                  GCForeground | GCLineWidth, &ValeursGC);
     
     
     XStoreName(display, win, "Xlib Copie..."); //Titre de la fenêtre
     //EnumWin(gc, win);                          //Enumération des fenêtres
     
     XMapWindow(display, win);                  //Affichage
     XSelectInput (display, win, ExposureMask); //Callback
     XSelectInput (display, win, VisibilityChangeMask); //Callback
     XSelectInput (display, win, PointerMotionMask); //Callback
     
     
     //boucle
     while(1){
        if (XPending (display) > 0)
          {
            XEvent ev;
            XNextEvent(display, &ev);
     
            switch (ev.type)
            {
              case Expose:
                redessiner_fenetre (gc, win);
                break;
              case VisibilityNotify :
                redessiner_fenetre (gc, win);
                break;
              case MotionNotify :
                redessiner_fenetre(gc, win);
     
              default:
                break;
            }
          }
     }
     
     return 0;
    }
    J'ai remarqué plusieurs choses:
    Lorsque j'essaie de dessiner un arc de cercle, il n'y a rien qui se produit
    Les appels à la fonction EnumFenetre et DrawContenu se font bien
    La fonction copyArea renvoie 1

    Si vous pouviez m'aider, merci

  2. #2
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    pourquoi réouvres tu une connection dans EnumWin ????????????

    La manière de procéder est de définir une structure de paramères (le Display, le GC, le screen, etc..), de la remplir à l'initialisation, et de la passer aux routines qui en ont besoin...

    Là, tu re-démarres une nouvelle connexion avec le serveur X, qui re-démarre tout...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    mais quand on passe un paramètre NULL à opendisplay, il ne renvoie pas la connection par défaut?

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    non, tu rouvres une connexion...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    j'ai essayé en gardant le display ouvert dans la fonction main, ça ne fonctionne toujours pas.

    j'ai oublié de signaler que lorsque je mettais la fenêtre root avec l'ancien code, le programme fonctionnait.

  6. #6
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord, il serait souhaitable d'expliciter ce que tu veux faire, car ce n'est pas clair du tout...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    En fait, je voudrais faire un système d'aperçu de fenêtre en 3D directement sur le bureau (un peu à la compiz-fusion, en bien plus simple), mais je me suis dit que pour commencer par faire simple, il fallait savoir déjà par créer un aperçu de fenêtre dans une seconde fenêtre.

  8. #8
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je ne comprend toujours pas (et ne connais pas ....fusion)

    Qu'est-ce que c'est pour toi "un aperçu de fenêtre" ??????
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    je ne comprend toujours pas (et ne connais pas ....fusion)
    http://fr.wikipedia.org/wiki/Compiz_Fusion
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    maintenant, imaginons que je veuille utiliser AIGLX, y-a-t'il moyen? Et si oui, ou puis-je trouver de la doc valable?
    (parce qu'après de nombreuses heures à rechercher de la doc à ce sujet, je tombe sur presque rien de valable)

  11. #11
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    ok merci ;-)

    Mais ça ne nous avance pas sur ce que le PO entend par "aperçu de fenêtre"...


    @cheveche4 :

    Est-ce que tu veux obtenir sur ton fond d'écran quelque chose comme l'image pointée dans la référence donnée (le cube) ??

    Ou comme la fenêtre DANS le cube ??

    Et qu'elle est pour toi la différence entre une "fenêtre" et un "aperçu de fenêtre" ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    ce que j'entends par aperçu de fenêtre, c'est comme si on faisait un screenshot de la fenêtre donnée (j'entend par fenêtre une fenêtre + les décorations -barre de titre, bordure... - du gestionnaire de fenêtre -genre métacity etc.), que l'on place sur des primitives OpenGl qui s'afficheraient à l'écran par dessus toute les autres applications.

    Je veux donc obtenir l'image de la fenêtre (qui est DANS le cube)

  13. #13
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Ahhhhhhhh !!!!

    Je comprend mieux....

    Alors ton "aperçu de fenêtre" s'appelle "un window dump" en informatique...

    Il y a plusieurs manières de le faire.

    • Des outils tout prêts :


      • un utilitaire tout prêt sur unixoide (xwd) ou (xwd.exe sous cygwin)

      • Dans le logiciel xv (http://www.trilon.com/xv/) la fonctionalité existe.
      • ....


    • La crééer soit-même...


      Pour la crééer soi-même, en gros cela revient à :

      Récupérer l'image dans une Pixmap, qui, étant une Drawable, peut ensuite être affichée dans une fenêtre..

      Pour cela, il faut, identifier le Window Id de la fenêtre, puis dans la hiérarchie de la fenêtre déterminer le Window Id de son parent qui est géré directement par le Window Manager (avec XQueryTree et des tests appropriés), déterminer les bonnes dimensions, et faire un XGetImage...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    lorsque j'utilise certaine fonction (comme XGetImage) j'ai une erreur de linkage:
    (.text+0x1b): undefined reference to `__dlopen'
    /usr/lib/libdl.a(dlsym.o): In function `dlsym':
    (.text+0x1b): undefined reference to `__dlsym'

    Et lorsque je rajoute libdl.a et libglib.a (ou pas), il me laisse quand même l'erreur

  15. #15
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    en C++ je ne sais pas ..

    Je connais en C...

    Mais ton probleme la a l'air d'etre du a de mauvais chemins dans les include ou dans les link...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    le truc c'est que genre pour créer des fenêtres etc... ça fonctionne, mais qu'avec certaines fonctions, ça me fait ce problème. À ce que j'ai pu comprendre, il charge normalement les fonctions de dl.a dynamiquement...

    (Sinon, je n'aurais même pas posé la question... )

    Merci BEAUCOUP pour votre aide (surtout à toi), je vais essayer de me débrouiller, et si ça ne fonctionne vraiment pas, alors je reviendrais vous embêter

  17. #17
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui mais il y a un "include file" par type de chose...

    Donc, si tu fais "man le_nom_de_la_fonction" ou si tu vas dans le repertoire /usr/X11R6/include ou quelque chose du genre (ca peut etre /usr/iclude/X11R6), et que tu cherches les fonctions qui donnent des warnings, tu verras quels include te manquent.... Et quelles bibliotheques (ce peut etre libXt (flag -lXt) ou libXm (-lXm) ou ......
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    Ben... Je vois pas ce que tu veux dire: vu que mon erreur est une erreur de linkage, et non de compilation. Autrement dit, c'est dans les fichiers de librairie (.a) que se trouve le problème, et non dans les includes (sinon le problème aurait été généré lors de la compilation)...

  19. #19
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui mais c'est ce que j'ai indique avec les flags (-lXt, -lXm, etc etc...)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    ben le truc, c'est que j'ai ajouté toutes les librairies X.. pour éviter ce genre d'erreur (je sais que c'est un peu bourrin, mais c'est sensé fonctionner)

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/05/2009, 20h38
  2. Créer un gestionnaire de fenêtres ?
    Par qoqo1 dans le forum Qt
    Réponses: 2
    Dernier message: 09/07/2008, 14h00
  3. Créer un skin à sa fenêtre
    Par metalamania dans le forum Général Python
    Réponses: 2
    Dernier message: 16/10/2007, 12h32
  4. Créer un aperçu d'un .pdf sur un formulaire
    Par mathilde50 dans le forum IHM
    Réponses: 15
    Dernier message: 09/08/2007, 14h37
  5. [VB.Net] "Impossible de créer le handle de fenêtre"
    Par cedric_g dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/04/2006, 12h49

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