Couper une fenêtre (x11)

Description

Suite à une source déposé sur javafr(http://www.javafr.com/codes/FENETRE-RONDE-JNI_38715.aspx) qui ne sert en soit pas à grand chose, mais qui peut donner des idées pour la création de skin, je pose ici le source C pour découper une fentêtre X11.

projet créé avec eclipse 3.2 et CDT 3.1

/!\ même si il est mentionné dans les commentaire je rappel de ne pas oublier de linker cette petite appli avec les lib X11 et Xext

Source / Exemple :


#include <X11/Xlib.h>//ne pas oublier de linker l'appli avec la lib X11
#include <X11/extensions/shape.h>//ne pas oublier de linker l'appli avec la lib Xext
#include <stdio.h>
#include <stdlib.h>

//code de sortie
#define EXIT_SUCCESS 0
#define EXIT_ERROR 1

//taille par defaut de la fenetre
#define DEFAULT_X 0
#define DEFAULT_Y 0
#define DEFAULT_WIDTH 300
#define DEFAULT_HEIGHT 200

int main(int argc, char** argv) {
	
	Display *display;
	int screen;
	Window window;
	Pixmap pixmap;
	GC gcPixmap;
	XEvent event;
	XRectangle bounds;
	
	// Overture d'une connexion avec le serveur
	display = XOpenDisplay(NULL);
	if(display == NULL) {
		fprintf(stderr, "Impossible d'ouvrir une connexion avec le serveur X\n");
		exit(EXIT_ERROR);
	}
	
	//Récuperation de l'écran par défaut
	screen = DefaultScreen(display);

	//initialisation des coord de la fenêtre
	bounds.x = DEFAULT_X;
	bounds.y = DEFAULT_Y;
	bounds.width = DEFAULT_WIDTH;
	bounds.height = DEFAULT_HEIGHT;
	
	
	//Creation d'une fenêtre
  	window = XCreateSimpleWindow(display, RootWindow(display, screen), bounds.x, bounds.y,
  			 bounds.width, bounds.height, 0, WhitePixel(display, screen), BlackPixel(display, screen));
	
	//Sélèction des événements
	XSelectInput(display, window, ExposureMask | KeyPressMask | ButtonPressMask);
	//Titre de la fenêtre
  	XStoreName(display, window, "Fenetre ovale");

    //Création d'un pixmap qui va servir à découper la fenêtre
	pixmap = XCreatePixmap(display, window, bounds.width, bounds.height, 1);
	//Récupération d'un GC sur le pixmap
  	gcPixmap = XCreateGC(display, pixmap, 0, NULL);
  	//Couleur de premier plan cette couleur va permetre de selectionner la couleur de découpage
  	XSetForeground(display, gcPixmap, WhitePixel(display, screen));
  	//Dessine le rectangle qui sera découpé enfin
  	//apres avoir dessiné l'ellipse ce qui reste disparait :D 
	XFillRectangle(display, pixmap, gcPixmap, 0, 0, bounds.width, bounds.height);
	//Couleur de premier plan de la forme que l'on souhaite garder
  	XSetForeground(display, gcPixmap, BlackPixel(display, screen));
  	//Ellipse qui restera affiché à l'écran
  	XFillArc(display, pixmap, gcPixmap, 0, 10, bounds.width-20, bounds.height-10, 0, 360*64);

    //Découpage de la fenêtre en applicant une soustraction des 'shapes' contenue dans 
    //le pixmap
  	XShapeCombineMask(display, window, ShapeBounding, 0, 0, pixmap, ShapeSubtract);

	//Map la fenêtre à l'écran (faites le ici pour ne pas voir la fenêtre se faire découper :P )
	XMapWindow(display, window);

    //boucle des évènements de la fenêtre
	while(1) {
		//si il y a un nouvel évènement
    	XNextEvent(display, &event);
    	//si un clic est fait on quitte l'application 
    	//(pour bouger la fenêtre pressez 'alt' + un clic gauche puis bougez la souris) 
		if(event.type==ButtonPress)
			break;
	}
    // Fermeture de la connexion avec le serveur X
  	XCloseDisplay(display);
  	
  	return 0;
}

Conclusion :


Cette source à été testé sous gentoo (KDE 3.5.4) et sous debian sarge 3.1 (KDE 3.3), merci de me dire si sur les autres Window Manager cela fonctionne ou non (normalement oui)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.