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

 C Discussion :

afficher une fenetre sur une fenetre avec la lib X11


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut afficher une fenetre sur une fenetre avec la lib X11
    Bonjour,

    je souhaite afficher une fenetre sur une fenetre parent. Mais elle n’apparaît pas alors que le background est différent.

    Je vous montre mon code :

    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
     
    #include <X11/Xlib.h> // Every Xlib program must include this
    #include <assert.h>   // I include this to test return values the lazy way
    #include <unistd.h>   // So we got the profile for 10 seconds
    #include <stdio.h>
    #define NIL (0)       // A name for the void pointer
     
    void main()
    {
          // Open the display
     
          Display *dpy = XOpenDisplay(NIL);
     
          // Get some colors
     
          int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
          int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));
     
          // Create the windows
          Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 
    				     200, 100, 0, blackColor, blackColor);
     
          fprintf(stdout, "window = %li\n", w);
     
     
          Window w2 = XCreateSimpleWindow(dpy, w, 0, 0, 
    				     50, 50, 0, blackColor, whiteColor);
     
          fprintf(stdout, "window2 = %li\n", w2);
          // We want to get MapNotify events
     
          XSelectInput(dpy, w, ButtonPressMask | ButtonReleaseMask | KeyPressMask);
          XSelectInput(dpy, w2, ButtonPressMask | ButtonReleaseMask | KeyPressMask);
     
     
          // "Map" the window (that is, make it appear on the screen)
     
          XMapWindow(dpy, w);
     
          // Create a "Graphics Context"
     
          GC gc = XCreateGC(dpy, w, 0, NIL);
     
          // Tell the GC we draw using the white color
     
          XSetForeground(dpy, gc, whiteColor);
     
     
    	  XEvent e;
          for(;;) {
     
    	    XNextEvent(dpy, &e);
     
    	    fprintf(stdout, "receiving event %i, on window %li\n", e.type, e.xany.window);
     
     
    	    if (e.type == ButtonPress)
    	    {
    	    	if( e.xany.window == w)
    	    	{
    	        	fprintf(stdout, "button press from w\n");	    		
    	    	}
    	    	else if (e.xany.window == w2)
    	    	{
    	    		fprintf(stdout, "button press from w2\n");
    	    	}
    		  	//break;
    	    }
    	    else if (e.type == ButtonRelease)
    	    {
    	    	if( e.xany.window == w)
    	    	{
    	        	fprintf(stdout, "button release from w\n");	    		
    	    	}
    	    	else if (e.xany.window == w2)
    	    	{
    	    		fprintf(stdout, "button release from w2\n");
    	    	}	        
    		  	//break;
    	    }
    	    else if (e.type == KeyPress)
    	    {
    	        fprintf(stdout, "KeyPress hihih\n");
    	    }
    	    else
    	    {
    	    	//break;
    	    }
     
          }
     
    }
    le terminal me retourne :

    window = 77594625
    window2 = 77594626
    et seul les events de la premiere premiere fenetre (w) sont détectés, sachant que graphiquement je ne vois pas le carré blanc de la fenetre w2

    Merci d'avance pour votre aide

  2. #2
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    X11 n'est pas une panacée... tu es obligé de passer par X11 ?

    Sinon il y a tcl/tk et GTK+ qui te permettent de mettre en place un environnemnt fenêtré relativement convenable.

    Je vais reprendre ton code l'essayer et tenter de trouver une réponse mais je suis hyper busy ces derniers temps je ne garanti pas que ce sera fait pour ce soir ^^

    Patience est vertu ^^

  3. #3
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    ...juste comme ça en "one shot" il me semble que XMapWindow(dpy, w) pourrait être utilisé aussi pour XMapWindow(dpy, w2)... je ne sais plus si le contexte graphique doit être obtenu pour chaque fenêtre ou si il y a un graphical context pour toutes les fenêtres...

    essaye de donner des "noms parlants", w, w2 ça m'emmerde, je préfère fenParente, fenFille... e <-> Evenement, au moins c'est clair, on est pas obligés de deviner à quoi servent ces variables... ou remonter tout le code source pour voir les commentaires (si il y en a ^^)

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    si dans ton "debug" tu obtiens des identifiants cela veut dire qu'à priori les fonctions de création ont fonctionné, maintenant, il faudrait préciser à X11 d'afficher les fenêtres, or ici, on ne "mappe" que w (parente) et on récupère un graphical context que pour "w" (parente) donc je sais pas, il faudrait arriver à dire (c'est dans XCreateSimpleWindow pourtant) à X11 que w2 est la fille (une sous fenêtre) de w...
    La fonction XMapWindow sert normalement à indiquer qu'une fenêtre est "candidate" à être affichée, il y a aussi XMapSubWindow() il faudra que je me renseigne et essaye des choses ce soir, regarde le man XMapWindow... il y a peut-être une réponse.

Discussions similaires

  1. Afficher une bulle avec un message sur un objet vidéo !
    Par cincap dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 14/06/2015, 09h58
  2. Afficher une image avec opengl
    Par kmaniche dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/02/2006, 09h04
  3. [TP] Afficher une valeur avec outtext
    Par Bouilla dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/03/2005, 09h57
  4. Afficher une image avec swing
    Par arnonote dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 07/08/2004, 12h10
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 09h28

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