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 :

[C][XLib] Afficher une fenêtre transparente / Pourquoi mon code marche ?


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [C][XLib] Afficher une fenêtre transparente / Pourquoi mon code marche ?
    Bonjour,

    je commence à m'intéresser à XLib, et donc j'essaie de bidouiller un peu. J'aimerais pouvoir afficher une fenêtre complétement transparente sur laquelle je pourrais dessiner avec Cairo.

    J'ai pour le moment réussit à faire une fenêtre complètement transparente...mais on voit toujours son ombre !
    De plus je ne comprends pas pourquoi elle l'est, ça vient principalement de la fonction find_argb_visual() que j'ai piqué dans les sources de fdclock, et je avoue que je pige pas du tout son intérêt. Et les docs étant difficilement trouvable...

    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
    #include <unistd.h>
    #include <stdio.h>
    #include <X11/Xlib.h>
    #include <X11/Xatom.h>
    #include <X11/extensions/Xrender.h>
    #include <cairo.h>
    #include <cairo-xlib.h>
     
    #define SIZEX 200
    #define SIZEY 200
     
    /* méthode 100% pompée sur fdclock */
    Visual *find_argb_visual (Display *dpy, int scr) {
        XVisualInfo		*xvi;
        XVisualInfo		tmplate;
        int			nvi;
        int			i;
        XRenderPictFormat	*format;
        Visual		*visual;
     
        tmplate.screen = scr;
        tmplate.depth = 32;
        tmplate.class = TrueColor;
        xvi = XGetVisualInfo (dpy, 
    			  VisualScreenMask |
    			  VisualDepthMask |
    			  VisualClassMask,
    			  &tmplate,
    			  &nvi);
        if (!xvi)
    	return 0;
        visual = 0;
        for (i = 0; i < nvi; i++)
        {
    	format = XRenderFindVisualFormat (dpy, xvi[i].visual);
    	if (format->type == PictTypeDirect && format->direct.alphaMask)
    	{
    	    visual = xvi[i].visual;
    	    break;
    	}
        }
     
        XFree (xvi);
        return visual;
    }
     
    int main (int argc, char *argv[])
    {
      	Display *dpy;
    	XEvent e;
     
    	Window rootwin;
    	Window win;
    	int scr;
    	XSetWindowAttributes attributs;
    	unsigned long masque_valeur;
     
    	if(!(dpy=XOpenDisplay(NULL))) {
    		fprintf(stderr, "ERROR: Could not open display\n");
    		exit(1);
    	}
     
    	scr=DefaultScreen(dpy);
    	rootwin=RootWindow(dpy, scr);
     
    	attributs.background_pixel = 0;
    	attributs.border_pixel = 0;
     
    	int depth = 32;
    	Visual *visual = find_argb_visual (dpy, scr);
    	attributs.colormap = XCreateColormap (dpy, rootwin, visual, AllocNone);
     
    	masque_valeur = CWBackPixel | CWBorderPixel | CWColormap;
    	attributs.override_redirect = True;
    	masque_valeur |= CWOverrideRedirect;
     
    	win = XCreateWindow (dpy, rootwin, 0, 0, SIZEX, SIZEX, 0, depth, InputOutput, visual, masque_valeur, &attributs);
    	XStoreName(dpy, win, "hello");
     
    	XSelectInput(dpy, win, ButtonPressMask);
    	XMapWindow(dpy, win);
     
     
    	while(1) {
    		XNextEvent(dpy, &e);
    		if(e.type==ButtonPress) break;
    	}
    	XCloseDisplay(dpy);
     
            return 0;
    }
    A oui, d'ailleurs :
    XRenderFindVisualFormat() nécessite cairo.h/cairo-xlib.h, comment cela se fait-il ? Ce n'est pas une fonction de XLib ?

    La ligne de compilation au cas où :
    cc -o twin -lX11 -L/usr/lib/X11/ `pkg-config --cflags --libs cairo` twin.c

    Merci à ceux qui pourront m'éclairer !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    A propos de XRenderFindVisualFormat()

    cette fonction est dans /usr/include/X11/extensions/Xrender.h car il s'agit de l'extension "Xrender"

    tout ce qui est un peu "moderne" se situe généralement dans les extensions X11.

    l'API X11 est relativement vieille et n'évolue pas (ou alors très peu). Toutes les nouveautés graphiques sont ajoutées via les extensions. (cf. répertoire X11/extensions)

    pour compiler ton code, il n'y a pas besoin de cairo, ci dessous la ligne de commande sans cairo

    tu supprimes les 2 #include sur cairo*.h puis tu compiles et tu fais l'édition de lien
    $ gcc -c -o twin.o twin.c
    $ gcc twin.o -lX11 -lXrender


    par contre, je ne peux pas t'apporter d'aide sur ton "vrai" problème concernant l'ombre de ta fenêtre...

Discussions similaires

  1. [LWJGL] Impossible d'afficher une fenêtre
    Par gege2061 dans le forum API graphiques
    Réponses: 4
    Dernier message: 06/05/2006, 19h56
  2. afficher une fenêtre dans le thread
    Par LN(a) dans le forum Langage
    Réponses: 8
    Dernier message: 21/12/2005, 13h21
  3. Afficher une Fenêtre MDI à partir d'une DLL
    Par FredericB dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/12/2005, 16h58
  4. Afficher une fenêtre d'informations qui donne l'impression de se détâcher
    Par jean_bobi dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 25/09/2005, 15h31
  5. Réponses: 1
    Dernier message: 16/02/2005, 12h04

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