PDA

Voir la version complète : Pas de souris avec SDL/OpenGl sous win !


RaphAstro
12/09/2005, 21h45
Bonjour,

J'ai un problème avec la souris dans SDL lorsque OpenGl est activé.

En fait aucun événement de la souris ne marchent. J'ai essayé avec le fonctions qui retournent directement l'état de la souris : j'ai le même problème.

Le problème ne touche que Windows et lorsque je met SDL_OPENGL dans SDL_SetVideoMode. Dans les autres cas pas de problème.

J'utilise la dernière version de SDL (1.2.9 stable), sachant que ça ne marche pas non plus avec la 1.2.8.

nunuxxx
13/09/2005, 01h54
Je connais assez bien sdl, pourrais tu faire un petit exemple simple de sources, genre initialiser sdl ave opengl et la souris et envoyer les sources? je pourrais jetter un coup d'oeil entre 2 cafés.

RaphAstro
13/09/2005, 10h14
J'initalise avec

void GoSDL() {

if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, "Impossible d'initialiser SDL: %s\n", SDL_GetError());
arrette_tout();
return;
}

cout << "GoSDL" << endl;
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

cout << "SetVideoMode" << endl;
if ((ecran_sdl = SDL_SetVideoMode(ScreenX, ScreenY, 32, SDL_HWSURFACE | SDL_OPENGL | SDL_FULLSCREEN | SDL_DOUBLEBUF)) == NULL) {
printf("Couldn't set GL mode: %s\n", SDL_GetError());
arrette_tout();
}

cout << "SetVideoMode ok" << endl


Puis je créer un thread (important pour le reste du projet)


int events(void *data) {
SDL_Event event;

while (!events_stop) {
while (SDL_PollEvent (&event)) {
switch (event.type) {
// Clavier
case SDL_KEYDOWN:
printf("Le bouton %c (%d) du clavier a ete presse (mod=%d)\n", event.key.keysym.sym, event.key.keysym.sym, event.key.keysym.mod);

// Regarde si c'est pas l'arret d'urgence "q" + Left Shift + Left Ctrl + Left Alt
if (event.key.keysym.sym == SDLK_q) {
if (event.key.keysym.mod == 4417) {
cout << "ARRET D'URGENCE" << endl;
arrette_tout();
}
}

// Envoie la callback
if(keydown != NULL) keydown(event.key.keysym.sym, event.key.keysym.mod);

break;
case SDL_KEYUP:
printf("Le bouton %c (%d) du clavier a ete leve\n", event.key.keysym.sym, event.key.keysym.sym);
if(keyup != NULL) keyup(event.key.keysym.sym, event.key.keysym.mod);
break;

// Souris
case SDL_MOUSEMOTION:
printf("La souris a bouge de %d,%d à (%d,%d)\n", event.motion.xrel, event.motion.yrel, event.motion.x, event.motion.y);
if(mousemove != NULL) mousemove(event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
break;
case SDL_MOUSEBUTTONDOWN:
printf("Le bouton %d de la souris a ete presse en (%d,%d)\n", event.button.button, event.button.x, event.button.y);
if(mousedown != NULL) mousedown(event.button.button, event.button.x, event.button.y);
break;
case SDL_MOUSEBUTTONUP:
printf("Le bouton %d de la souris a ete leve en (%d,%d)\n", event.button.button, event.button.x, event.button.y);
if(mouseup != NULL) mouseup(event.button.button, event.button.x, event.button.y);
break;

// Systeme
case SDL_QUIT:
arrette_tout();
break;
default:
printf("Evenement %d non gere\n", event.type);
}
}
}
return 0;
}

Corkus
13/09/2005, 13h13
Peut-être que tu perds le contrôle des entrées lorsque tu passes en plein écran. Essaie de les reprendre avec la fonction:

SDL_WM_GrabInput(SDL_GRAB_ON);

nunuxxx
13/09/2005, 20h23
Peut-être que tu perds le contrôle des entrées lorsque tu passes en plein écran. Essaie de les reprendre avec la fonction:

SDL_WM_GrabInput(SDL_GRAB_ON);


Peut-être, mais, sdl est connu pour être plus robuste que ça...

Sérieusement je suis embêté par ton bug RaphAstro... ton code est correct je vois pas d'erreurs... c'est probablement véritablement un bug interne dans la librairie... p-e tu devrais poser la question sur le newsgroup de sdl...

RaphAstro
14/09/2005, 20h50
Je me suis arrangé pour initialiser SDL avec le même thread que la gestion des événements : ça marche mais c'est vrai que c'est étrange.

Corkus
14/09/2005, 23h12
J'ai lu que sous windows, SDL ne pouvait mettre la gestion d'evenement dans un thread avec SDL_EVENTTHREAD. Ca doit surement faire la même chose quand on créer un thread manuellement.