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 :

AFFICHAGE AVEC X11


Sujet :

Linux

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut AFFICHAGE AVEC X11
    bonjours a tous,

    j'essai d'utiliser les fonciton de X11 pour afficher une image dans une fenetre,

    j'ai trouver quelque petit truk, masi je n'arrive pas a bien les adapter et ej ne sait pas pourquoi..voici 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
    93
    94
    95
    96
    97
    98
    99
    100
     
     
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "stat.h"
    #include <sys/types.h>
     #include <unistd.h>
      #     include <sys/mman.h>
     
     
    int main()
    {
    Display * display;
    Window   window;
    Screen *ecran;
    XImage *image;
    FILE *f;
    int x=0,y=0,popo1;
    char *buffer=NULL;
    int running = 1;
    struct stat buf;
    XEvent event;	
     
    	printf("bug");
     
    if (XInitThreads() == 0)    {
     printf("Error : initializing XInitThreads.\n" );
     return 1;
    }
     
     
    display = XOpenDisplay(NULL);
     
     
    		if (display == NULL) 
    		{
    		printf("Error : Cannot open display.\n" );
    		}
     
    //ecran= DefaultScreenOfDisplay(display);
     
    window = XCreateSimpleWindow(display,XDefaultRootWindow(display),0,0,800,600,0,0,0);
    XSelectInput(display,window,ExposureMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask );
    XMapWindow(display,window);
    // charger l'image 
     
     
    	f = fopen("decompressedbmp.bmp","rb" );
    		if (f == NULL) 
    		{
    		printf("Error : loading image.\n" );
    		}
    	else 
    	{
     
    	popo1=fileno(f);
     
    	fstat(popo1,&buf);
     
    	buffer=malloc(buf.st_size);
    	buffer=mmap((caddr_t)0,buf.st_size,PROT_EXEC|PROT_READ,MAP_SHARED,popo1,0);
     
    	}
     
     
     
     if (buffer) {
      image = XCreateImage(display, DefaultVisual(display,DefaultScreen(display)),24,ZPixmap,0,buffer,384,288,8,0);
     }
     
    while (running) 
    {
     
     XNextEvent(display,&event);
      switch (event.type) {
       case ButtonPress :
       if (image) {
        XLockDisplay(display);
        XPutImage(display,window,DefaultGC(display,DefaultScreen(display)),image,0,0,event.xbutton.x,event.xbutton.y,384,288);
        XSync(display,0);
        XUnlockDisplay(display);
       }
       break;
       case KeyPress :
       running = 0; // quitter
       break;
      }
     }
     
     if (image) {
      XDestroyImage(image);
     }
     XUnmapWindow(display,window);
     XDestroyWindow(display,window);
     
     return 0;
     }
    j'ai bien le screen mais il n'est pas remplit et vide, et je n'arrive pas a faire bouger la fenetre...enfin plein de petit bug, je doit avoir loupé quelque notion d'affichage..Pouvez vous m'éclairer svp ?
    Mon image d'entrer est un bmp 24 bit.
    Merci.

  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
    avant de faire de l'affichage d'image, essaye quelques trucs simples...

    Visiblement tu ne maitrises pas le X..

    Alors prend tes bouquins ou des tutoriels, et commence par afficher juste des chaines, puis change leurs polices, puis change leur couleur.

    Ensuite trace des segments, change leurs couleurs.

    Ensuite, pour une image, il faudrait que tes couleurs soient allouées (elle ne le sont pas par défaut). Il y a toutes les fonctions ColorMap (DefaultColormap etc etc..) et XAllocColorCell etc etc..

    De plus, une image bmp n'a certainement pas la meme correspondance qu'une image "virtuelle" buffer (qui doit correspondre à des indices sur 8 bits des valeurs dans ta colormap)...

    Ensuite, il est en général mieux de détecter les KeyRelease que les KeyPress, sauf pour débuter une action.

    Là tu pourra te poser des questions.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    bonour,
    j'ai pris un bouquin "affichage avec X11",
    et je suis les instruction a la lettre , ce qui me donne :
    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
     
     
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <sys/types.h>
     #include <unistd.h>
      #     include <sys/mman.h>
    #include <errno.h>
    #include "affiche.h"
     
    int affiche(char*buffer)
    {
     
    Display * display;
    int screen;
    Window   window,root;
    XImage *image;
    FILE *f;
     
    XEvent ev;	
    GC gcx;
    XGCValues gcv;
    unsigned int pxl,pxh;
    unsigned long bpx,wpx;
    Pixmap pixl,fond;
    FILE* file;
     
    Drawable d;
    int i;
    unsigned long gcmask;
     
     
     
     
    gcv.background=BlackPixel(display,screen);
    gcv.foreground=BlackPixel(display,screen);
    gcv.function=GXcopy;
    gcmask=GCForeground|GCBackground|GCFunction;
     
     
    display = XOpenDisplay(NULL);
     
     
    		if (display == NULL) 
    		{
    		printf("Error : Cannot open display.\n" );
    		}
     
    		screen =DefaultScreen(display);
     
    		root=DefaultRootWindow(display);
     
     
    		window=XCreateSimpleWindow(display,root,0,0,384,288,8,bpx,wpx);
    		XMapWindow(display,window);
     
     
    	image=XCreateImage(display,DefaultVisual(display,DefaultScreen(display)),32,ZPixmap,0,buffer,384,284,8,0);
     
    		gcx=XCreateGC(display,d,gcmask,&gcv);
     
    		XPutImage(display,d,gcx,image,0,0,0,0,384,288);
     
    		while(i<5)
    		{
    		XMapWindow(display,window);
    		sleep(1);
    		i++;
    		}
    		while(1)
    		{
    		XEvent ev;
    		XNextEvent(display,&ev);		
    		}
     
     
    }
    et cela me donne rien..une erreur de segmentation.
    le buffer est un buffer RGB24.
    pouvez vous me donnez des explication ???? sur ces fonction ? merci.

  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
    En vrac, plusieurs choses...

    • Je ne sais pas quel bouquin tu a pris, mais il est pas terrible si le premier exemple te fait tenter d'afficher une image..
    • D'abord , dans XOpenDisplay, ce n'est pas NULL, mais une chaîne vide, par défaut
    • Ensuite, tes bpx et wpx ne sont pas assignés à une valeur quelconque
      or ce sont les valeurs de foreground et background...

      Donc un :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      bpx = WhitePixel (display, screen );
      wpx = BlackPixel (display, screen );
      par exemple serait nettement mieux..
    • D'autre part, dans le GC, tu mets le foreground ET background à noir.. Tu risques pas de voir quelque chose...
    • d'autre part si je ne me trompe, le buffer d'une image est un char, mais il faut que le contenu pointé soit un unsigned char
    • De plus, il faut que ce contenu ne soit pas sur la pile... Donc SOIT il faut allouer dynamiquement le buffer Du XImage soit il faut ue la varaible est une adresse NON prise sur la pile
    • Ensuite, pourquoi faire 5 fois une boucle de Map ??
    • Il faut faire un MapRaised
    • Pourquoi créer un gcx (qui est vide), alors que tu as créé au dessus un gc correct ????
    • Enfin, en X, le premier évènement à capter est un Expose, qui, lordqu'il est capté, doit te faire retracer la fenêtre.....


    bref, pas le pied ton truc...

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    ok, donc jai repris tous ça,
    et jen suis arriver la.

    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
     
     
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <X11/extensions/Xdbe.h>
    #include <sys/types.h>
     #include <unistd.h>
      #     include <sys/mman.h>
    #include <errno.h>
    #include "affiche.h"
     
     
     
    int affiche(unsigned char*buffer,int width,int height)
    {
     
    Drawable BackBuffer;
    Display *dpy;
     Window root,win;
       void *args;
       XGCValues attributs;
       unsigned long gcmasque;
       int ecran;
       XImage *img;
       Visual *vis;
       unsigned long wpx, bpx;
       unsigned int x=0, y=0,Depthfenetre;
    GC gcx;
     
     
     
     
       /* Connection serveur */
       dpy = XOpenDisplay (":0.0");
     
       /* Creation de la fenetre */
       ecran = DefaultScreen(dpy);
       root = DefaultRootWindow(dpy);
     
       /* Profondeur de couleur (en bit) dans la fenetre par d�ault, depend de la configuration du serveur X */
       Depthfenetre = DefaultDepth(dpy, ecran);
     
     
       bpx = BlackPixel(dpy, ecran); /* pixel blanc */
       wpx = WhitePixel(dpy, ecran); /* pixel noir */
     
       /* visual par d�ault */
       vis = DefaultVisual (dpy, ecran);
     
       /* Cr�tion de la fenetre */
       win = XCreateSimpleWindow(dpy, root, 100, 100, width, height, 1, bpx, wpx);
       XInitImage(img);
       BackBuffer = XdbeAllocateBackBufferName(dpy, win, XdbeUntouched);
     
          XInitImage(img);
     
       img = XCreateImage(dpy, vis, Depthfenetre, ZPixmap, 0, buffer, width, height, 8 , width*3);
     
      attributs.foreground = bpx;
      attributs.background = wpx;
      gcmasque = GCForeground | GCBackground;
     
      gcx = XCreateGC(dpy, win, gcmasque, &attributs);
     
     
      XStoreName (dpy, win, "fenetre d'essai");          
       XMapWindow(dpy,win);
     
     
      /*
      while(1)
      {
      XMapWindow(dpy,win);
      sleep(10);
       }*/
     
       XFreeGC(dpy, gcx);
       XDestroyImage (img);
       XDestroyWindow(dpy, win);
     
     }
    encore une erreur de segmentation, et rien ne sort.......
    je ne sait pas du totu quoi modifier pour que ça marche, je nage...

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    plutot que d'utiliser Xlib, je te conseille d'utiliser XCB. Cette lib a plusieurs avantages par rapport a Xlib. Son seul inconvenient est qu'elle est peu connue. Tu trouveras une doc sous la forme d'un tutoriel (en anglais), avec des exemples complets.

    Neanmoins, une bonne connaissance du protocole X, pour Xlib comme pour XCB, est necessaire, sinon, tu as vite fait de faire n'importe quoi. Le Volume 0 de O'Reilly sur X Window est tres bien.

    Si neanmoins tu veux continuer avec Xlib, ce que je te deconseille, deux tres bon sites sur cette libs peuvent t'aider:

    http://tronche.com/gui/x/

    http://users.actcom.co.il/~choo/lupg...ogramming.html

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    je n'aipas regarde ton code, mais pour resoudre les seg fault, compile avec -g et utilises gdb. valgrind peut aussi t'aider enormement.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    merci masi qui est valgrind ??
    et oui j'aimerai utiliser Xlib

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    les tutaux que vous m'avez passer parle que de lecture de fichier bitmap,or dans mon cas j'ai un buffer ,je ne voit aucune correspondance entre les fonction READFROMBITMAP et mon probleme,
    je ne sait plus quoi faire, je sature vraiment la,
    je ne comprend pas, il est assez classique d'avoir un buffer RGB, masi détailler null par comment l'affiché, on trouve partour commet afficher une fichier bitmap, mais dans mon cas, c completement inutile.

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    valgrind.org (c'est un logiciel)

    pour ton probleme, peut-etre ceci peut t'aider:

    http://tronche.com/gui/x/xlib/graphics/images.html

  11. #11
    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
    j'ai dit au debut :

    avant de faire complique, faire simple...

    • 1er exercice :
      afficher une fenetre avec une ligne et un texte.
    • 2ieme exercice :
      changer la couleur du texte et de la ligne.
    • 3ieme exercice
      demarrer avec l'exemple 1, puis dynamqieuement passer a l'exemple 2


    apres, on verra..

Discussions similaires

  1. problème d'affichage avec printf
    Par sorari dans le forum C++
    Réponses: 12
    Dernier message: 08/03/2005, 18h30
  2. Réponses: 6
    Dernier message: 19/10/2004, 13h46
  3. Resolution d'affichage avec x11
    Par cosmos38240 dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 06/06/2004, 23h26
  4. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  5. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59

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