|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
COUPER UNE FENÊTRE (X11)
Information sur la source
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
- #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;
- }
#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)
Historique
- 10 août 2006 00:28:06 :
- maj de la présentation
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
programme graphique sous linux avec X11 de préférence (pour le portage) [ par coucou747 ]
je recherche une façon de créer des programmes graphiques en c, j'ai cherché des heures sur le net des programmes en c utilisant des librairies comme
Questions cpp Linux X11 [ par ralebole ]
Voici mes 3 questions Comment afficher une image dans une fenetre Cpp linux X11 ?Comment creer un Timer Cpp linux X11 ? (petit exemple svp)Si je
débuts en C sous linux [ par hotlips ]
Bonjour,Je débute sous linux. J'étais plutôt habitué à Visual C++, mais je doit écrire une librairie en C sous
passer un programme GTK de linux à windows [ par Dr_zoidberg ]
Bonjour,J'ai choisi de créer une interface en GTK afin de pouvoir porter mon programme de linux à windows.Seulement pour l'instant, je n'ai
Allegro sous linux [ par esiee_amiens ]
Bonjour, Je suis sous linux, et je n'arrive pas à compiler les prog ou j'utilise allegro. J'ai essayer dans la console : "gcc ok.c `allegro -conf
Allegro + linux [ par esiee_amiens ]
Bonjour, Je suis sous linux, et je n'arrive pas à compiler les prog ou j'utilise allegro. J'ai essayer dans la console : "gcc ok.c `allegro -conf
Obtenir GTK ou QT (sans connexion ADSL) [ par Flachy Joe ]
Salut,je voudrai me mettre à la progg sous linux, je programme déja en VB6 (sous vindoz évidemment) et j'ai des notions de C++ et de Ja
graphisme sous linux [ par maxialex5 ]
Bonjour comment compiler un code en C contenant la bibliotheque ou avec la version Kaela de knoppix? et merci d'avance
Ouverture image sous linux [ par astropolpot ]
Bonjour à tous,je voudrais savoir comment ouvrir un fichier jpeg sous linux pour le mettre sous forme de matrice. je ne veux rien de plus compliq
Taille fichier sous linux [ par bigbourin ]
Bonjour a tous, voila je cherche une fonction pour récupéré la taille d'un fichier mais sous linux. donc les API W32 ...voila. Je pensa
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version

HTC Magic
Entre 429€ et 429€
|