Je sais pas si c'est très clair alors je mets une capture d'écran :
http://muzu.free.fr/probleme_xlib.jpg
Voila, j'ai essayé des tonnes de trucs, passé quelques heures sur google mais j'ai toujours le même problème : quand je redimensionne la fenêtre (en passant par la bordure du gestionnaire de fenêtre), la bordure du wm s'agrandit bien comme il faut mais le contenu lui même de la fenêtre ne bouge pas et dans le nouvel espace est transparent! (même pas tout noir, quand on clicke a travers on passe sur la fenêtre visible en dessous ).
mon code (utilise imlib2, réduit au minimum)
#include "Imlib2.h"
#include
using namespace std;
Display *disp;
Window win;
Visual *vis;
Colormap cm;
int depth;
Imlib_Image buffer, image;
int windowWidth = 50, windowHeight = 60;
void
updateWindow (int x, int y, int w, int h)
{
Imlib_Image updateBuffer = imlib_create_image (w, h);
imlib_context_set_image (updateBuffer);
imlib_blend_image_onto_image (buffer, 0, x, y, w, h, 0, 0, w, h);
imlib_render_image_on_drawable (x, y);
imlib_free_image ();
}
void
redrawWindow ()
{
if (buffer)
{
imlib_context_set_image (buffer);
imlib_free_image ();
}
imlib_context_set_cliprect (0, 0, windowWidth, windowHeight); //Ne change rien...
buffer = imlib_create_image (windowWidth, windowHeight);
imlib_context_set_image (image);
int imageWidth = imlib_image_get_width ();
int imageHeight = imlib_image_get_height ();
imlib_context_set_image (buffer);
imlib_blend_image_onto_image (image, 0, 0, 0, imageWidth, imageHeight, 0, 0,
windowWidth, windowHeight);
}
int
main (int argc, char **argv)
{
XEvent ev;
disp = XOpenDisplay (NULL);
vis = DefaultVisual (disp, DefaultScreen (disp));
depth = DefaultDepth (disp, DefaultScreen (disp));
cm = DefaultColormap (disp, DefaultScreen (disp));
win = XCreateSimpleWindow (disp, DefaultRootWindow (disp),
0, 0, windowWidth, windowHeight, 0, 0, 0);
XSelectInput (disp, win, ExposureMask | ResizeRedirectMask);
XMapWindow (disp, win);
imlib_context_set_display (disp);
imlib_context_set_visual (vis);
imlib_context_set_colormap (cm);
imlib_context_set_drawable (win);
image = imlib_load_image ("TigerAquaBlue.jpg");
redrawWindow ();
for (;;)
{
do
{
XNextEvent (disp, &ev);
switch (ev.type)
{
case Expose:
updateWindow (ev.xexpose.x, ev.xexpose.y, ev.xexpose.width,
ev.xexpose.height);
break;
case ResizeRequest:
if (ev.xresizerequest.width != windowWidth
|| windowHeight != ev.xresizerequest.height)
{
windowWidth = ev.xresizerequest.width;
windowHeight = ev.xresizerequest.height;
redrawWindow ();
updateWindow (0, 0, windowWidth, windowHeight);
}
break;
default:
break;
}
}
while (XPending (disp));
}
return 0;
}
voilà, faut vraiment que j'utilise la xlib directement, comment je pourrais éviter ça?
# bon essayons
Posté par Anonyme . Évalué à 2.
il faut vraiment que tu utilise le couple switch case X case Y ? Tu ne peux pas essayer de faire le meme truc sans ? un while do ou autre joyeuseté
[^] # Re: bon essayons
Posté par popopo333 . Évalué à 1.
[^] # Re: bon essayons
Posté par MuZu . Évalué à 1.
je vois pas trop comment jpourrais le remplacer par un while do( yen a un d'ailleur), à la limite par des if, else if mais bon ce serait moins lisible...
Sinon ya vraiment personne qui s'y connait en xlib? pourtant ça doit être un truc tout con( ca me fait la meme chose en remplacant les images imlib par des XPixmap et en n'utilisant plus les fonctions d'imlib)...
# Une version qui marche
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
Pour expliquer ton probleme je pense que quand tu redirige les evenements resize il doit y a avoir deux trois trucs a faire pour avertir
la fenetre (win) de se changement de taille.
[^] # Re: Une version qui marche
Posté par MuZu . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.