#1 Le 12/07/2008, à 14:46
- Askelon
[Xlib] problème de focus d'une fenêtre
Bonjour à tous !
Voilà, comme indiqué dans le titre, je me heurte à un léger problème de focus dans un projet en C utilisant la Xlib. Mon but est d'afficher l'image passée en argv[1] sur le bureau (via une fenêtre Override_redirect), la position de la fenêtre étant donnée par argv[2] et argv[3].
Hors, par défaut avec mon code, la fenêtre apparait systématiquement au dessus de toutes les autres fenêtres, et impossible de l'en faire décoincer. J'ai bien trouvé la fonction XLowerWindow, mais lorsque je l'utilise, cela fonctionne tellement bien que ma fenêtre n'apparait plus du tout, même une fois toutes les autres fenêtres réduites :heink:
J'ai essayé d'autre techniques trouvées par-ci par-mi sur le net, notamment avec XInternAtom, mais sans aucun effet pour le moment ...
Voilà toujours mon code :
#include <stdio.h>
#include <string.h>
#include <Imlib2.h>
#include <X11/Xlib.h>
int main( int argc, char **argv )
{
int pos_x = atoi( argv[2] );
int pos_y = atoi( argv[3] );
/* La base : on définit le server X à utiliser */
/* l'écran, etc., et on récupère la fenêtre root */
Display *display = XOpenDisplay( NULL );
int screen = DefaultScreen( display );
int depth = DefaultDepth( display, screen );
Visual *visuel = DefaultVisual( display, screen );
Colormap colormap = DefaultColormap( display, screen );
Window fenetre_root = RootWindow( display, screen );
XEvent report;
// On définit les attributs, puis la fenêtre
XSetWindowAttributes attrs = { ParentRelative, 0L, 0, 0L, 0, 0,
Always, 0L, 0L, False, StructureNotifyMask | ExposureMask, 0L, True, 0, 0 };
Window fenetre = XCreateWindow(display, fenetre_root, pos_x, pos_y, 200, 200, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect | CWEventMask | CWBackPixel, &attrs);
/* Paramétrage d'imlib */
imlib_context_set_display(display);
imlib_context_set_visual(visuel);
imlib_context_set_colormap(colormap);
imlib_context_set_drawable(fenetre);
/* On affiche la fenêtre */
XMapWindow( display, fenetre );
/* si on utilise ça, la fenêtre disparait ! O_o */
//XLowerWindow(display, fenetre);
XSelectInput( display, fenetre, ExposureMask );
for( ;; )
{
XNextEvent( display, &report );
Imlib_Image image = imlib_load_image( argv[1] );
imlib_context_set_image(image);
imlib_render_image_on_drawable(1,1);
}
imlib_free_image();
return 0;
}
Voilà, je voudrais simplement que ma fenêtre s'affiche juste sur le bureau, donc sous toutes les autres fenêtres je sais que c'est faisable puisque plusieurs soft et bouts de code que j'ai croisé sur le net le font (et de la même manière que moi !! ), mais même après bien étudié les listings, tenté d'utiliser certains fragments, impossible de faire fonctionner le miens
Merci d'avance