[SDL] Well, me again having problems with the Key Events...
Manuel García Cabrera
manugarciac5 at yahoo.com.ar
Wed Jun 13 00:20:27 PDT 2007
Well, let's do this... I'll write every line that's related to SDL. I
native language is Spanish so please don't mind the names of the
functions and variables...
I have this prototype in my .h:
static int hiloEventos(void* param);
I'm calling it like this:
SDL_Thread* thread;
thread = SDL_CreateThread(hiloEventos, this);
Now, let's go inside hiloEventos()...
...//Do some stuff that's not related to the issue, and would take a lot
of time to understand, but that has nothing to do with SDL.
SDL_Event evento;
SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
SDL_EventState(SDL_JOYAXISMOTION, SDL_IGNORE);
SDL_EventState(SDL_JOYBALLMOTION, SDL_IGNORE);
SDL_EventState(SDL_JOYHATMOTION, SDL_IGNORE);
SDL_EventState(SDL_JOYBUTTONDOWN, SDL_IGNORE);
SDL_EventState(SDL_JOYBUTTONUP, SDL_IGNORE);
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
SDL_EventState(SDL_VIDEORESIZE, SDL_IGNORE);
SDL_EventState(SDL_VIDEOEXPOSE, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
...//More stuff that doesn't matter. And then the important part...
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
while(!player->exit){
tecla = 0;
while ( SDL_PollEvent(&evento) || (enviar) ){
if (player->mouse){
SDL_GetMouseState(&x,&y);
x += ( player->rect.x + player->verticeX);
y += ( player->rect.y + player->verticeY);
}
if (player->teclado) mod = SDL_GetModState();
switch(evento.type){
case SDL_MOUSEBUTTONDOWN:
switch(evento.button.button){
case SDL_BUTTON_LEFT:
click=1;
break;
case SDL_BUTTON_MIDDLE:
click=3;
break;
case SDL_BUTTON_RIGHT:
click=5;
break;
case SDL_BUTTON_WHEELDOWN:
click=7;
break;
default:
click=0;
break;
}
break;
case SDL_MOUSEBUTTONUP:
switch(evento.button.button){
case SDL_BUTTON_LEFT:
click=2;
break;
case SDL_BUTTON_MIDDLE:
click=4;
break;
case SDL_BUTTON_RIGHT:
click=6;
break;
case SDL_BUTTON_WHEELUP:
click=8;
break;
default:
click=0;
break;
}
break;
case SDL_KEYDOWN:
if ( (evento.key.keysym.mod & KMOD_CTRL) && (evento.key.keysym.mod &
KMOD_ALT) && (evento.key.keysym.sym == SDLK_F12) )
player->exit = true;
else if ( (player->teclado) && ( (evento.key.keysym.sym <
SDLK_NUMLOCK) || (evento.key.keysym.sym > SDLK_COMPOSE) ||
(evento.key.keysym.sym == SDLK_LSUPER) || (evento.key.keysym.sym ==
SDLK_RSUPER) || (evento.key.keysym.sym == SDLK_SCROLLOCK) ) )
tecla = player->mappearTecla(evento.key.keysym.sym);
break;
case SDL_QUIT:
player->exit = true;
break;
default:
click=0;
tecla=0;
break;
}
...//More irrelevant stuff. Then I close the while and return.
The line that's executing many times, is:
tecla = player->mappearTecla(evento.key.keysym.sym);
It's doing it as fast as it's set by the enable key repeat.
Doug escribió:
> In article <466F5025.8090600 at yahoo.com.ar>, manugarciac5 at yahoo.com.ar
> says...
>> Let me explain what I'm doing. I'm doing a VNC client. I have two
>> threads, one that is constantly showing images that are received from
>> the net, and other that is constantly looking for mouse and keyboard
>> events (quit events too, of course). Well, I can show you the code in
>> the events thread, but I don't see how it would help. If I put a printf
>> inside the case SDL_KEYDOWN it prints even when I released the key...
>
> Your code may help. You've shown us only three lines of a sample switch
> statement. Your problem could possibly be as simple as a missing break
> statement on a case clause causing the execution to pass through into
> another case clause unintentionally.
>
> Also, what platform is this? Win32? Linux? Other?
>
> Further, I don't know all the ins and out of this issue, but there are
> certain SDL things you simply cannot do in another thread. Certain SDL
> functions must be called in and only in the main thread. I'm not sure if
> there's a list, but using *some* SDL functions in different threads can
> cause issues as SDL is not 100% thread safe.
>
> Doug.
>
>
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>
More information about the SDL
mailing list