Forum Programmation.c Xlib et aggrandissement de fenetre...

Posté par  .
Étiquettes : aucune
0
2
juin
2006
Bonjour :D

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  . Évalué à 2.

    cela n'a peut etre pas de rapport mais:

    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  . Évalué à 1.

      y a quoi de genant avec un switch? pas la premiere fois que j'entends/lis que c'est pas bien et on a jamais pu me dire pourquoi.
    • [^] # Re: bon essayons

      Posté par  . Évalué à 1.

      Ben dans tous les exemples qui utilisent la xlib que j'ai trouvé, yavait un switch pour prendre en charge les évènements envoyés par le serveur...

      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  (site web personnel) . Évalué à 1.

    Apres quelques tests voici une version qui fonctionne:


    #include <stdlib.h>
    #include <assert.h>
    #include <Xlib.h>
    #include <Imlib2.h>

    ...

    int
    main (int argc, char **argv)
    {

    XEvent ev;

    disp = XOpenDisplay (NULL);
    assert (disp != 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,
    KeyPressMask | ButtonPressMask | StructureNotifyMask |
    ExposureMask);

    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 ("test.jpg");
    redrawWindow ();

    for (;;) {

    XNextEvent (disp, &ev);
    switch (ev.type)
    {
    case KeyPress:
    case ButtonPress:
    XCloseDisplay (disp);
    exit (EXIT_SUCCESS);

    case Expose:
    if (ev.xexpose.count == 0)
    updateWindow (ev.xexpose.x, ev.xexpose.y, ev.xexpose.width, ev.xexpose.height);
    break;

    case ConfigureNotify:
    windowWidth = ev.xconfigure.width;
    windowHeight = ev.xconfigure.height;
    redrawWindow ();
    break;
    }
    }
    return 0;
    }




    #include <stdlib.h>
    #include <assert.h>
    #include <Xlib.h>

    #include <Imlib2.h>

    int
    main (int argc, char **argv)
    {

    XEvent ev;

    disp = XOpenDisplay (NULL);
    assert (disp != 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,
    KeyPressMask | ButtonPressMask | StructureNotifyMask |
    ExposureMask);

    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 ("test.jpg");
    redrawWindow ();

    for (;;) {

    XNextEvent (disp, &ev);
    switch (ev.type)
    {
    case KeyPress:
    case ButtonPress:
    XCloseDisplay (disp);
    exit (EXIT_SUCCESS);

    case Expose:
    if (ev.xexpose.count == 0)
    updateWindow (ev.xexpose.x, ev.xexpose.y, ev.xexpose.width, ev.xexpose.height);
    break;

    case ConfigureNotify:
    windowWidth = ev.xconfigure.width;
    windowHeight = ev.xconfigure.height;
    redrawWindow ();
    break;
    }
    }
    return 0;
    }


    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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.