Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/10/2008, à 16:40

Bigcake

[résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

Bonjour, dans mon programme en C, J'ai un souci avec la fermeture de mes fenetres, je ne trouve pas comment detecter le fait que l'utilisateur a fermé la fenetre avec son bouton "fermer"

voici mon code reduit au minimum vitale avec un petit makefile:

NAME = xtest
SRC = main.c
OBJ = $(SRC:.c=.o)
LIB     = -L/usr/X11R6/lib -lX11

all : $(OBJ)
        cc -o $(NAME) $(LIB) $(OBJ)
#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlib.h>

int main(int ac, char **av)
{
  Display              *dpy;
  XEvent               xev;
  fd_set                slrd;
  struct timeval    time;
  Window              win;

  dpy = XOpenDisplay(0);

  /* creation de la fenetre */
  win = XCreateSimpleWindow(dpy,  DefaultRootWindow(dpy), 50, 50, 500, 500, 1, 0, 0);
  XSelectInput(dpy, win, ExposureMask | ButtonPressMask | KeyPressMask);
  XMapWindow(dpy, win);

  XFlush(dpy);

  while (1) {
    FD_ZERO(&slrd);
    FD_SET(ConnectionNumber(dpy), &slrd);
    time.tv_usec = 500000;
    time.tv_sec = 0;
    if (select(ConnectionNumber(dpy) + 1, &slrd, NULL, NULL, &time)) {
      while (1) {
        if (XPending(dpy) == 0) // IO Error dans le XPending                                                                           
          break;
        XNextEvent(dpy, &xev);
        printf("event\n");
      }                                                                         
    }
  }
  return (0);
}

Le probleme survient dans  XPending() qui appele un XFlush() (c'est le flush qui ferme le programme)
Comment puis detecter que ma fenetre a été fermée ?
Ou alors, comment puis-je eviter que XFlush ne plante mon programme avec le message d'erreur "XIO:  fatal IO error 11..." ?
Merci pour vos lumières

Dernière modification par Bigcake (Le 09/10/2008, à 11:15)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#2 Le 05/10/2008, à 14:34

chcamier

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

Bonjour,

Quand une fenêtre est détruite, un évènement "DestroyNotify" est retourné et les informations sont contenues dans la structure "XDestroyWindowEvent" (champs "xdestroywindow" de l'union XEvent).

Quand à ta boucle, elle semble compliquée pour ton utilisation. Tu fais un pooling exacerbé sur la pauvre connexion X11 alors qu'un simple :

while(1) {
  XNextEvent(dpy, &xev);
  printf("Event %d\n", xev.type)
  if(xev.type == DestroyNotify) {
    Window id = xev.xdestroywindow.window
    printf("Window %X destroyed\n", id);
    if (id == main_window) {
      XCloseDisplay(dpy);
      exit(0)
    }
  }
}

Bonne continuation
CC

Hors ligne

#3 Le 06/10/2008, à 09:39

Bigcake

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

merci de t'intéresser a mon problème smile
En fait ma boucle est plus compliqué que sa car il faut que ma boucle soit non bloquant et sur plusieurs display ouvert. (je t'ai donné un code minimal pour bien voir mon souci de blocage)
XNextEvent est en mode bloquant..... c'est pourquoi j'utilise XPending qui me permet de casser la boucle infini avant que XNextEvent ne me bloque mon programme

D'ailleurs merci, pour le XDestroyNotify que je ne connaissait pas ...... je me demande comment j'ai pu le louper ^^!

Dernière modification par Bigcake (Le 06/10/2008, à 10:24)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#4 Le 06/10/2008, à 11:55

Bigcake

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

J'ai rajouté 'StructureNotifyMask' dans mon XSelectInput() pour que le DestroyNotify soit géré.
En compilant et en executant ton code...... j'ai le meme probleme, sa me fait "XIO: fatal IO error 11...." dans le XNextEvent() sad

*se tire les cheveux*


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#5 Le 08/10/2008, à 21:01

chcamier

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

Bonsoir,

Désolé d'avoir tardé pour te répondre, mais j'ai du remettre le nez dans la Xlib, cela fait 10 ans que je n'avais plus codé avec.

Bon, après avoir dépoussiéré mes vieux manuels X11 et relu du code de cette  époque, j'ai put écrire un exemple de programme ouvrant deux "Displays" avec une fenêtre sur chacun d'eux protégé de la destruction de l'une de ces fenêtres.

En effet, lorsque le Window Manager détruit la fenêtre principale, il effectue en réalité un "XKillClient" sur la session X11 elle même. Ceci a pour effet, la fermeture,  coté serveur, de la connexion.

Le seul moyen d'y palier est donc, coté client, de "trapper" les erreurs d'I/O ("XSetIOErrorHandler") et faire en sorte que cette dernière ne retourne pas (du point de vue de la Xlib), d'où l'usage de setjmp/longjmp.

Je penses qu'il sera possible de t'inspirer (voire l'adapter) de ce petit code pour tes développements futures :

#include <setjmp.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <X11/Xlib.h>

/*
 * Noms des evenements X11
 */

static const char *event_names[] = {
	"",
	"",
	"KeyPress",
	"KeyRelease",
	"ButtonPress",
	"ButtonRelease",
	"MotionNotify",
	"EnterNotify",
	"LeaveNotify",
	"FocusIn",
	"FocusOut",
	"KeymapNotify",
	"Expose",
	"GraphicsExpose",
	"NoExpose",
	"VisibilityNotify",
	"CreateNotify",
	"DestroyNotify",
	"UnmapNotify",
	"MapNotify",
	"MapRequest",
	"ReparentNotify",
	"ConfigureNotify",
	"ConfigureRequest",
	"GravityNotify",
	"ResizeRequest",
	"CirculateNotify",
	"CirculateRequest",
	"PropertyNotify",
	"SelectionClear",
	"SelectionRequest",
	"SelectionNotify",
	"ColormapNotify",
	"ClientMessage",
	"MappingNotify",
};

/*
 * Environnent pour l'utilisation de setjmp/longjmp
 */
static jmp_buf jmp_evn;

/*
 * Informations sur les displays ouverts
 */
#define MAXDISPLAYS 4
struct {
	int      ndisplays;
	int      fdmax;
	fd_set   fdmask;
	Display *displays[MAXDISPLAYS];
} displays;

/*
 * Initialisation
 */
static void Initialise(void)
{
	int i;

	displays.ndisplays =  0;
	displays.fdmax     = -1;
	FD_ZERO(&displays.fdmask);
	for(i = 0; i < MAXDISPLAYS; displays.displays[i++] = NULL);
	return;
}

/*
 * Handler pour les erreurs d'I/O X11
 */
static int xioErrorHandler(Display *disp)
{
	int i;

	fprintf(stderr, "Erreur I/O dur le display %p\n", disp);

	/*
	 * Recalcul du masque pour "select(2)"
	 * Fermeture du display incrimine
	 */
	displays.fdmax = -1;
	FD_ZERO(&displays.fdmask);
	for(i = 0; i < MAXDISPLAYS; i += 1)
	{
		if(NULL == displays.displays[i])
			/* Ce n'est pas un Display disponible */
			continue;

		if(disp == displays.displays[i])
		{
			/* On libere le Display */
			displays.displays[i] = NULL;
			displays.ndisplays -= 1;
			continue;
		}

		if(ConnectionNumber(displays.displays[i]) > displays.fdmax)
			displays.fdmax = ConnectionNumber(displays.displays[i]);
		FD_SET(ConnectionNumber(displays.displays[i]), &displays.fdmask);
	}
	XCloseDisplay(disp);
	
	/* Si la fonction retourne, le programme est interrompu */
	longjmp(jmp_evn, 0);
}

/*
 * Ouverture d'un Display
 */
static Display *openDisplay(char *display_name)
{
	int      i;
	Display *disp = NULL;

	if(displays.ndisplays == MAXDISPLAYS)
		return disp;

	disp = XOpenDisplay(display_name);
	if(NULL == disp)
		return disp;
	
	for(i = 0; i < MAXDISPLAYS; i += 1)
	{		
		if(NULL == displays.displays[i])
		{
			displays.displays[i] = disp;
			displays.ndisplays += 1;
			FD_SET(ConnectionNumber(disp), &displays.fdmask);
			if(ConnectionNumber(disp) > displays.fdmax)
				displays.fdmax = ConnectionNumber(disp);
			return disp;
		}
	}
	fprintf(stderr, "Fatal error on displays structure\n");
	abort();
}

/*
 * Recherche d'un Display en fonction de son FD
 */

Display *findDisplay(int fd)
{
	int i;
	for(i = 0; i < MAXDISPLAYS; i += 1)
	{
		if(NULL != displays.displays[i] && ConnectionNumber(displays.displays[i]) == fd)
			return displays.displays[i];
	}
	return NULL;
}

/*
 * Traitement des evts sur un Display donne
 */

static void processDisplay(Display *disp)
{
	XEvent xev;
	fprintf(stderr, "Processing display %p\n", disp);
	while(XPending(disp) > 0)
	{
		XNextEvent(disp, &xev);
		fprintf(stderr, "Disp: %p, evt %d(%s)\n", disp, xev.type, event_names[xev.type]);
	}
	return;
}

/*
 * Creation d'un set de FDs pour select
 */
#define makeFDSet(dst) (void)memcpy((void *)dst, (void *)&displays.fdmask, sizeof(fd_set))


int main(void)
{
	Display *dpy1;
	Display *dpy2;
	Window   win1;
	Window   win2;

	/* Deroutement des erreurs IO X11 */
	XSetIOErrorHandler(xioErrorHandler);

	/* Creation de la premiere fenetre */

	dpy1 = openDisplay(0);
	win1 = XCreateSimpleWindow(dpy1, DefaultRootWindow(dpy1), 10, 10, 50, 50, 1, 0, 0);
	XSelectInput(dpy1, win1, ExposureMask | ButtonPressMask | KeyPressMask);
	XMapWindow(dpy1, win1);
	XFlush(dpy1);

	/* Creation de la seconde fenetre */

	dpy2 = openDisplay(0);
	win2 = XCreateSimpleWindow(dpy2, DefaultRootWindow(dpy2), 50, 50, 50, 50, 1, 0, 0);
	XSelectInput(dpy2, win2, ExposureMask | ButtonPressMask | KeyPressMask);
	XMapWindow(dpy2, win2);
	XFlush(dpy2);

	/* Point de retour en cas de probleme I/O */
	(void)setjmp(jmp_evn);
	if(displays.ndisplays == 0)
	{
		fprintf(stderr, "Bye\n");
		exit(0);
	}

	while(1)
	{
		int            i;
		Display        *dpy;
		fd_set         slrd;
		struct timeval tout;

		makeFDSet(&slrd);
		tout.tv_usec = 500000;
		tout.tv_sec  = 0;

		if(select(displays.fdmax + 1, &slrd, NULL, NULL, &tout) == 0)
			continue;
		
		for(i = 0; i < MAXDISPLAYS; i += 1)
		{
			if(NULL != displays.displays[i] && FD_ISSET(ConnectionNumber(displays.displays[i]), &slrd))
				processDisplay(displays.displays[i]);
		}
	}
}

Reste à disposition pour questions complémentaires
CC

Hors ligne

#6 Le 09/10/2008, à 09:28

Bigcake

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

whaou ! merci beaucoup ! je vais essayer sa dès que possible !

J'avais réussi a trouver une petite astuce pour détecter la fermeture de la fenêtre à base de recv(ConnectionNumber(dpy), ....., ..., ...) qui retourne 0 quand la connection est fermé, mais c'est super crade, parce que je ne sait pas si des ressources à détruire existe encore ou pas :s, sa ne me plaisait pas du tout.
Et ta solution m'a l'air d'être parfaite smile

Merci ! merci ! merci !


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#7 Le 09/11/2009, à 13:11

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

Bonjour,
je re-ouvre ce post car j'ai un soucis similaire un peu différent wink

voilà, j'ai un programme de test composé de 2 threads, l'un est en charge de consommer les évènements associés à la fenêtre, l'autre simule un utilisateur (envoie des caractères via XSendEvent)
souvent j'ai le pb suivant :

XIO:  fatal IO error 11 (Resource temporarily unavailable)

donc je voulais savoir s'il existait un moyen de faire une sorte de "retry" en utilisant le mécanisme cité dans ce post... en effet pour moi ce n'est pas une fatal error, il faudrait juste dormir un peu et re-essayer plus tard
seulement je ne sais pas ce qu'il se passe dans le cas précédent où xioErrorHandler est appelé, est-ce que si je fais le longjmp(jmp_evn, 0); il va redémarrer là où il en était?
le tag jmp_evn est seté par qui? où? à quel moment?
merci
JLM

Hors ligne

#8 Le 09/11/2009, à 14:56

Bigcake

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

jlmalet a écrit :

XIO:  fatal IO error 11 (Resource temporarily unavailable)

Ne serai-ce pas un problème de coordination de tes threads ?
A mon avis ton thread XSendEvent, essaye d'envoyer trop tot des events sur des ressources pas encore crée ou "flushé", ou alors trop tard sur des ressources deja détruites

Par exemple :
thread 1 : appel de win = XCreateWindow(display, ...)
thread 2 : Xsendevent sur win
thread 1 : XFlush(display)

thread 1 : appel de XDestroyWindow(win)
thread 1 : XFlush(display)
thread 2 : Xsendevent sur win

ou un truc dans le genre

jlmalet a écrit :

le tag jmp_evn est seté par qui? où? à quel moment?

le jmp_evn est initialisé par setjmp(), à l'endroit ou tu l'aura mis smile

Dernière modification par Bigcake (Le 09/11/2009, à 15:01)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#9 Le 09/11/2009, à 15:42

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

merci de la réponse

bon concernant le setjmp cela ne va pas m'aider à moins de le mettre avant chaque appel à une fonction X.... ce qui va pas être très pratique...

concernant la coordination des threads, j'y ai pensé aussi mais je ne crois pas que cela vient de là. Le problème que j'ai se produit en général lorsque j'ai des infos de débug qui sont affichées sur le terminal... (j'ai mis quelques printf un peu partout dans le code pour tracer ce qui se passe)
par exemple j'ai le problème qui peut survenir sur des appels tels que XKeysymToKeycode (donc qui ne dépend pas de la window)

en outre le thread consommateur est démarré à la création de la fenêtre, bien avant qu'elle soit mappé....
j'ai aussi ajouté des tempo (du style 1s entre chaque caractère.... ) et cela continue à poser pb...

le point vraiment commun c'est l'utilisation des traces, si je les désactive le test passe sans pb (sauf un segfault en fin lors de la destruction des connections qu'il faut que j'investigue) alors que si elles sont activées alors je crash avec le XIO avant l'affichage de la première image OGL...

merci
JL

Hors ligne

#10 Le 09/11/2009, à 16:01

Bigcake

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

jlmalet a écrit :

par exemple j'ai le problème qui peut survenir sur des appels tels que XKeysymToKeycode (donc qui ne dépend pas de la window)

Pour la window, c'était un example, c'est aussi valable pour le display
si tu a un display qui est fermé, et qut tu essaye de l'utiliser, ton prog va pas être content ^^

Pour les problème de segfault, j'utilise la libefence (Electric fence) qui permet de faire planter le programme au bon endroit et j'utilise aussi XSynchronize(display, 1), qui permet de faire aussi planter le programme au bon endroit et donc de mieux trouver les problèmes.


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#11 Le 09/11/2009, à 17:35

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

oui j'ai bien conscience que si la connexion est fermée je n'aurais pas de retour....
le pb c'est qu'au moment où cela se produit la window to comme la connexion ne sont pas encore détruites....

XSynchronize est déjà présent lorsque je suis avec les traces, sinon cela crash sans arrêt.... même si c'est l'utilisateur qui fait les opérations

là où j'ai un pb de deadlock par exemple c'est lors du unmapping de la window :
thread1 : XUnmapWindow
thread2 : XWindowEvent
thread2 :      -> handle XUnmapEvent
thread2 : XWindowEvent -> d'autres evt sont géré
thread2 : XWindowEvent (bloque indéfiniment)

-> thread1 est bloqué sur XUnmapWindow dans une fonction xcb_wait_for_reply
-> thread2 est bloqué sur XWindowEvent dans une sous fonction xcb_wait_for_event (ce qui me semble normal)

d'après toi qu'est-ce qui pourrait bloquer le XUnmapWindow? pourquoi la reply du XUnmapWindow n'est pas arrivé alors que l'autre thread a déjà procéssé le message depuis un bout de temps?

merci
JL

Hors ligne

#12 Le 09/11/2009, à 17:46

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

pour info : mon test consiste à mapper et unmapper ma fenêtre toutes les 5 secondes 5 fois de suite...

si j'active les traces, cela bloque comme précédement
si je désactive les traces le thread2 continue sa vie (fait des map/unmap toutes les 5s) mais le thread2 ne reçoit plus rien hmm

je vais essayer de faire un XFlush après chaque message que j'affiche... mais je ne m'explique pas pourquoi la thread2 a ce comportement....

merci d'avance
JLM

Hors ligne

#13 Le 09/11/2009, à 18:03

Bigcake

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

Mais au fait, il me semble que la Xlib n'est pas "thread friendly"...... euu c'est a verifier.
Utilise tu des mutex / conditions ?

Sinon le meilleur de nous montrer le probleme, c'est de balancer ton code dans une balise prévu a cette effet smile


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#14 Le 09/11/2009, à 19:18

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

normalement xlib/xcb est thread safe....
le code est bien trop compliqué mais je peux fournir un tarball ou fournir un repository git... ce qui serait le plus simple...:cool:

Hors ligne

#15 Le 11/11/2009, à 13:10

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

en gros pour faire simple :
thread1 :

    GLUI::Display*    TheDisplay = new GLUI::Display();
    myGluiWin* Window = new myGluiWin(*TheDisplay);
    Window->XMapWindow();
    nanosleep(&sleeptime, &sleeptime);
    while (EINTR == err )
    {
            err =  nanosleep(&sleeptime, &sleeptime);
    }
    while (count < 50)
    {
            struct timespec sleeptime = { 0, 100000000 };
            struct timespec rem = { 0, 0};
            Window->simulatekey();
            err = nanosleep(&sleeptime, &sleeptime);
            while (EINTR == err )
            {
                err =  nanosleep(&sleeptime, &sleeptime);
            }
            count++;
    }
    Window->XUnmapWindow();
    delete(Window);
    delete(TheDisplay);
    exit(0);
}
int X11Window::XMapWindow()
{
        IN("\n");
        int err;
        err = ::XMapWindow(disp.Disp(),window);
        if (err) ROUT(err,"\n");
        err = XFlush( disp.Disp() );
        ROUT(err,"\n");
              
}
int X11Window::XUnmapWindow()
{
        IN("\n");
        int err;
        err = ::XUnmapWindow(disp.Disp(),window);
        if (err) ROUT(err,"\n");
        err = XFlush( disp.Disp() );
        ROUT(err,"\n");
}
void myGluiWin::simulatekey(void)
{
        static int count = 0;
        ::XKeyEvent evt;

        evt.type = KeyPress;
        evt.time = get_time();
        evt.x = 100;
        evt.y = 100;
        evt.x_root = 1;
        evt.y_root = 1;
        evt.same_screen = True;
        evt.keycode = XKeysymToKeycode(disp.Disp(),XK_Up);

        count ++;
        XSendEvent ((XEvent &) evt); 

}

thread2 :

int X11Window::start_routine()
{
        IN("\n");
        int err = 0;
        ::XEvent event;

        while(this->thread_enabled && err == 0) 
        {
                if (dirty)
                {
                        ::XExposeEvent EventToForward;
                        //ask for redisplay of window
                        EventToForward.type=Expose;
                        EventToForward.send_event=true;
                        EventToForward.x = X();
                        EventToForward.y = Y();
                        EventToForward.width = Width();
                        EventToForward.height = Height();
                        AddEvent(&EventToForward);
                        dirty=False;
                }
                XWindowEvent(disp.Disp(), window, EventMask, &event);
                EventCoordToGLCoord(event);
                err = Container::AddEvent(&event);
        }
        this->thread_enabled = False;
        ROUT(err,"\n");


}
Container::AddEvent does call the right function for the right event
int X11Window::AddEvent(::XMapEvent *event)
{
        int err;
        IN(debug::Instance()->EventTypeToString(event->type)<<endl);
        printf( "Making context current\n" );
        err = glXMakeCurrent( disp.Disp(), window, ctx );
        err = Container::AddEvent(event);
        mapped = True;
        ROUT(err,"\n");
}
int X11Window::AddEvent(::XUnmapEvent *event)
{
        int err;
        IN(debug::Instance()->EventTypeToString(event->type)<<endl);
        printf( "unsetting context\n" );
        err = glXMakeCurrent( disp.Disp(), None, NULL );
        err = Container::AddEvent(event);
        ROUT(err,"\n");
}

IN and ROUT and OUT are macro used to activate or not the traces, to make it short they do check for some env variables and does cerr<< the parameter....

the public git repository is under creation at berlios.de, I'll post the link once published
thanks and regards

Hors ligne

#16 Le 11/11/2009, à 16:58

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

https://git.berlios.de/cgi-bin/gitweb.cgi?p=glui-ng;a=tree;h=refs/heads/XGL;hb=XGL

Hors ligne

#17 Le 11/11/2009, à 16:59

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

faudra que j'arrête de poster en anglais sur un forum fr.... tongue

Hors ligne

#18 Le 12/11/2009, à 00:10

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

ok du nouveau.... en attendant assez longtemps avec le debugger j'ai le message suivant :
do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.

je vais essayer le workaround de https://bugs.freedesktop.org/show_bug.cgi?id=18128 au sujet du vblank_mode

Hors ligne

#19 Le 13/11/2009, à 15:53

jlmalet

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

je devrais sans doute créer un autre topic.. le titre ne correspond plus trop.... les workaround ne solutionnent pas le pb....

Hors ligne

#20 Le 02/12/2011, à 17:57

perlseb

Re : [résolu]XIO: fatal IO error 11 a la fermeture des fenetre, C + Xlib

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"

Tous les programmes X de base, même xev.c fourni par Xorg pour analyser les touches tapées plantent avec ce message. Ce n'est pas un problème X ou du serveur, mais c'est un problème de communication avec le Window manager. Je suis tombé ici assez facilement mais n'ai pas trouvé la solution réelle à mon problème, la solution était ici :
http://linuxsoftware.co.nz/blog/tag/wm_delete_window

Traduit en C (pour une compilation par gcc -Wall xlib.c -o xlib -lX11), ça donne :

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>

// gcc -Wall xlib.c -o xlib -lX11

int main()
{
    int nb = 0;
    Display* display = XOpenDisplay(NULL);
    Window window = XCreateSimpleWindow(display,
                                       DefaultRootWindow(display),
                                       0, 0,
                                       500, 400,
                                       0,
                                       0, 0);

    // register interest in the delete window message
    Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(display, window, &wmDeleteMessage, 1);

    printf("Starting up...\n");
    XMapWindow(display, window);

    while (1) {
        XEvent event;
        XNextEvent(display, &event);

        if (event.type == ClientMessage &&
            event.xclient.data.l[0] == wmDeleteMessage) {
            nb += 1;
            printf("Nb = %i \n", nb);
            if ( nb > 2 ) {
                printf("Shutting down now!!!\n");
                break;
            }
        }
    }

    XCloseDisplay(display);
    return 0;
}

Hors ligne