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)
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.