Fixed some bugs with mouse clicks. Also added a debug info when an unhandled sdl event occurs. It seems there are events when the window is focused and unfocused, for example. We may use them to hide and display back our software cursor.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@559 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues 2009-01-28 18:32:46 +00:00
parent b861fe558d
commit 4d62d6f93f

556
input.c
View File

@ -26,266 +26,19 @@
#include "graph.h"
#include "sdlscreen.h"
#include "windows.h"
#include "erreurs.h"
void Handle_Window_Resize(SDL_Event* event);
void Handle_Window_Exit(SDL_Event* event);
// Fonction qui filtre les evenements génériques.
void Gere_Evenement_SDL(SDL_Event * event)
// Called each time there is a cursor move, either triggered by mouse or keyboard shortcuts
int Move_cursor_with_constraints()
{
// Redimensionnement fenetre
if (event->type == SDL_VIDEORESIZE )
//Gestion "avancée" du curseur: interdire la descente du curseur dans le
//menu lorsqu'on est en train de travailler dans l'image
if (Operation_Taille_pile != 0)
{
Handle_Window_Resize(event);
}
// Fermeture
if (event->type == SDL_QUIT )
{
Handle_Window_Exit(event);
}
}
// WM events management
void Handle_Window_Resize(SDL_Event* event)
{
Resize_Largeur = event->resize.w;
Resize_Hauteur = event->resize.h;
}
void Handle_Window_Exit(SDL_Event* event)
{
Quit_demande = 1;
}
// Mouse events management
int Handle_Mouse_Move(SDL_Event* event)
{
INPUT_Nouveau_Mouse_X = event->motion.x/Pixel_width;
INPUT_Nouveau_Mouse_Y = event->motion.y/Pixel_height;
// Il peut arriver (à cause de la division ci dessus) que les nouvelles
// coordonnees soient égales aux anciennes...
// Dans ce cas on ne traite pas l'évènement.
if (INPUT_Nouveau_Mouse_X == Mouse_X && INPUT_Nouveau_Mouse_Y == Mouse_Y)
return 0;
return 1;
}
void Handle_Mouse_Click(SDL_Event* event)
{
switch(event->button.button)
{
case SDL_BUTTON_LEFT:
INPUT_Nouveau_Mouse_K |= 1;
break;
case SDL_BUTTON_MIDDLE:
INPUT_Nouveau_Mouse_K |= 4;
break;
case SDL_BUTTON_RIGHT:
INPUT_Nouveau_Mouse_K |= 2;
break;
}
}
void Handle_Mouse_Release(SDL_Event* event)
{
switch(event->button.button)
{
case SDL_BUTTON_LEFT:
INPUT_Nouveau_Mouse_K &= ~1;
break;
case SDL_BUTTON_MIDDLE:
INPUT_Nouveau_Mouse_K &= ~4;
break;
case SDL_BUTTON_RIGHT:
INPUT_Nouveau_Mouse_K &= ~2;
break;
}
}
// Keyboard management
int Handle_Key_Press(SDL_Event* event)
{
//Appui sur une touche du clavier
Touche = Conversion_Touche(event->key.keysym);
Touche_ANSI = Conversion_ANSI(event->key.keysym);
// Instead of all this mess, send back a mouse event !
if(Touche == Config_Touche[0])
{
//[Touche] = Emulation de MOUSE UP
//si on est déjà en haut on peut plus bouger
if(INPUT_Nouveau_Mouse_Y!=0)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
INPUT_Nouveau_Mouse_Y=INPUT_Nouveau_Mouse_Y<Loupe_Facteur?0:INPUT_Nouveau_Mouse_Y-Loupe_Facteur;
else
INPUT_Nouveau_Mouse_Y--;
return 1;
}
}
else if(Touche == Config_Touche[1])
{
//[Touche] = Emulation de MOUSE DOWN
if(INPUT_Nouveau_Mouse_Y<Hauteur_ecran-1)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
{
INPUT_Nouveau_Mouse_Y+=Loupe_Facteur;
if (INPUT_Nouveau_Mouse_Y>=Hauteur_ecran)
INPUT_Nouveau_Mouse_Y=Hauteur_ecran-1;
}
else
INPUT_Nouveau_Mouse_Y++;
return 1;
}
}
else if(Touche == Config_Touche[2])
{
//[Touche] = Emulation de MOUSE LEFT
if(INPUT_Nouveau_Mouse_X!=0)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
INPUT_Nouveau_Mouse_X-=Loupe_Facteur;
else
INPUT_Nouveau_Mouse_X--;
return 1;
}
}
else if(Touche == Config_Touche[3])
{
//[Touche] = Emulation de MOUSE RIGHT
if(INPUT_Nouveau_Mouse_X<Largeur_ecran-1)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
{
INPUT_Nouveau_Mouse_X+=Loupe_Facteur;
if (INPUT_Nouveau_Mouse_X>=Largeur_ecran)
INPUT_Nouveau_Mouse_X=Largeur_ecran-1;
}
else
INPUT_Nouveau_Mouse_X++;
return 1;
}
}
else if(Touche == Config_Touche[4])
{
//[Touche] = Emulation de MOUSE CLICK LEFT
INPUT_Nouveau_Mouse_K=1;
return 1;
}
else if(Touche == Config_Touche[5])
{
//[Touche] = Emulation de MOUSE CLICK RIGHT
INPUT_Nouveau_Mouse_K=2;
return 1;
}
return 0;
}
void Handle_Key_Release(SDL_Event* event)
{
int ToucheR = Conversion_Touche(event->key.keysym);
// Send back a mouse event instead. Or extract the code and put it in common.
if(ToucheR == Config_Touche[4])
{
INPUT_Nouveau_Mouse_K=0;
}
else if(ToucheR == Config_Touche[5])
{
//[Touche] = Emulation de MOUSE CLICK RIGHT
INPUT_Nouveau_Mouse_K=0;
}
}
// Joystick management
void Handle_Joystick_Press(SDL_Event* event)
{
}
void Handle_Joystick_Release(SDL_Event* event)
{
}
int Get_input(void)
{
SDL_Event event;
int User_Feedback_Required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
// Process as much events as possible without redrawing the screen.
// This mostly allows us to merge mouse events for people with an high
// resolution mouse
while( !User_Feedback_Required && SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_VIDEORESIZE:
Handle_Window_Resize(&event);
break;
case SDL_QUIT:
Handle_Window_Exit(&event);
break;
case SDL_MOUSEMOTION:
Handle_Mouse_Move(&event);
break;
case SDL_MOUSEBUTTONDOWN:
Handle_Mouse_Click(&event);
break;
case SDL_MOUSEBUTTONUP:
Handle_Mouse_Release(&event);
break;
case SDL_KEYDOWN:
// PAS BEAU
if(Handle_Key_Press(&event))
{
SDL_WarpMouse(
INPUT_Nouveau_Mouse_X*Pixel_width,
INPUT_Nouveau_Mouse_Y*Pixel_height
);
}
break;
case SDL_KEYUP:
Handle_Key_Release(&event);
break;
case SDL_JOYBUTTONUP:
Handle_Joystick_Press(&event);
break;
case SDL_JOYBUTTONDOWN:
Handle_Joystick_Release(&event);
break;
}
}
// Everything below should disapear
//Gestion "avancée" du curseur: interdire la descente du curseur dans le
//menu lorsqu'on est en train de travailler dans l'image
if(Operation_Taille_pile!=0)
{
byte bl=0;//BL va indiquer si on doit corriger la position du curseur
//Si le curseur ne se trouve plus dans l'image
@ -323,8 +76,199 @@ int Get_input(void)
INPUT_Nouveau_Mouse_Y*Pixel_height
);
}
}
if (
(INPUT_Nouveau_Mouse_X != Mouse_X) ||
(INPUT_Nouveau_Mouse_Y != Mouse_Y) ||
(INPUT_Nouveau_Mouse_K != Mouse_K)
)
{
Forcer_affichage_curseur=0;
Effacer_curseur(); // On efface le curseur AVANT de le déplacer...
Mouse_X=INPUT_Nouveau_Mouse_X;
Mouse_Y=INPUT_Nouveau_Mouse_Y;
Mouse_K=INPUT_Nouveau_Mouse_K;
Calculer_coordonnees_pinceau();
Afficher_curseur();
return 1;
}
else
return 0;
}
// Fonction qui filtre les evenements génériques.
void Gere_Evenement_SDL(SDL_Event * event)
{
// Redimensionnement fenetre
if (event->type == SDL_VIDEORESIZE )
{
Handle_Window_Resize(event);
}
// Fermeture
if (event->type == SDL_QUIT )
{
Handle_Window_Exit(event);
}
}
// WM events management
void Handle_Window_Resize(SDL_Event* event)
{
Resize_Largeur = event->resize.w;
Resize_Hauteur = event->resize.h;
}
void Handle_Window_Exit(SDL_Event* event)
{
Quit_demande = 1;
}
// Mouse events management
int Handle_Mouse_Move(SDL_Event* event)
{
INPUT_Nouveau_Mouse_X = event->motion.x/Pixel_width;
INPUT_Nouveau_Mouse_Y = event->motion.y/Pixel_height;
if(Move_cursor_with_constraints()) return 0;
return 1;
}
void Handle_Mouse_Click(SDL_Event* event)
{
switch(event->button.button)
{
case SDL_BUTTON_LEFT:
INPUT_Nouveau_Mouse_K |= 1;
break;
case SDL_BUTTON_MIDDLE:
INPUT_Nouveau_Mouse_K |= 4;
break;
case SDL_BUTTON_RIGHT:
INPUT_Nouveau_Mouse_K |= 2;
break;
default:
DEBUG("Unknown mouse button!",0);
return;
}
Move_cursor_with_constraints();
}
void Handle_Mouse_Release(SDL_Event* event)
{
switch(event->button.button)
{
case SDL_BUTTON_LEFT:
INPUT_Nouveau_Mouse_K &= ~1;
break;
case SDL_BUTTON_MIDDLE:
INPUT_Nouveau_Mouse_K &= ~4;
break;
case SDL_BUTTON_RIGHT:
INPUT_Nouveau_Mouse_K &= ~2;
break;
default:
DEBUG("Unknown mouse button!",0);
return;
}
Move_cursor_with_constraints();
}
// Keyboard management
int Handle_Key_Press(SDL_Event* event)
{
//Appui sur une touche du clavier
Touche = Conversion_Touche(event->key.keysym);
Touche_ANSI = Conversion_ANSI(event->key.keysym);
// Instead of all this mess, send back a mouse event !
if(Touche == Config_Touche[0])
{
//[Touche] = Emulation de MOUSE UP
//si on est déjà en haut on peut plus bouger
if(INPUT_Nouveau_Mouse_Y!=0)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
INPUT_Nouveau_Mouse_Y=INPUT_Nouveau_Mouse_Y<Loupe_Facteur?0:INPUT_Nouveau_Mouse_Y-Loupe_Facteur;
else
INPUT_Nouveau_Mouse_Y--;
return 1;
}
}
else if(Touche == Config_Touche[1])
{
//[Touche] = Emulation de MOUSE DOWN
if(INPUT_Nouveau_Mouse_Y<Hauteur_ecran-1)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
{
INPUT_Nouveau_Mouse_Y+=Loupe_Facteur;
if (INPUT_Nouveau_Mouse_Y>=Hauteur_ecran)
INPUT_Nouveau_Mouse_Y=Hauteur_ecran-1;
}
else
INPUT_Nouveau_Mouse_Y++;
if(Move_cursor_with_constraints()) return 0;
return 1;
}
}
else if(Touche == Config_Touche[2])
{
//[Touche] = Emulation de MOUSE LEFT
if(INPUT_Nouveau_Mouse_X!=0)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
INPUT_Nouveau_Mouse_X-=Loupe_Facteur;
else
INPUT_Nouveau_Mouse_X--;
if(Move_cursor_with_constraints()) return 0;
return 1;
}
}
else if(Touche == Config_Touche[3])
{
//[Touche] = Emulation de MOUSE RIGHT
if(INPUT_Nouveau_Mouse_X<Largeur_ecran-1)
{
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
{
INPUT_Nouveau_Mouse_X+=Loupe_Facteur;
if (INPUT_Nouveau_Mouse_X>=Largeur_ecran)
INPUT_Nouveau_Mouse_X=Largeur_ecran-1;
}
else
INPUT_Nouveau_Mouse_X++;
if(Move_cursor_with_constraints()) return 0;
return 1;
}
}
else if(Touche == Config_Touche[4])
{
//[Touche] = Emulation de MOUSE CLICK LEFT
INPUT_Nouveau_Mouse_K=1;
Move_cursor_with_constraints();
return 1;
}
else if(Touche == Config_Touche[5])
{
//[Touche] = Emulation de MOUSE CLICK RIGHT
INPUT_Nouveau_Mouse_K=2;
Move_cursor_with_constraints();
return 1;
}
if(Operation_Taille_pile!=0)
{
if (Touche != 0)
{
//Enfin, on inhibe les touches (sauf si c'est un changement de couleur
@ -354,21 +298,101 @@ int Get_input(void)
else Touche = 0;
}
}
return 0;
}
if (
(INPUT_Nouveau_Mouse_X != Mouse_X) ||
(INPUT_Nouveau_Mouse_Y != Mouse_Y) ||
(INPUT_Nouveau_Mouse_K != Mouse_K)
)
void Handle_Key_Release(SDL_Event* event)
{
int ToucheR = Conversion_Touche(event->key.keysym);
// Send back a mouse event instead. Or extract the code and put it in common.
if(ToucheR == Config_Touche[4])
{
Forcer_affichage_curseur=0;
Effacer_curseur(); // On efface le curseur AVANT de le déplacer...
Mouse_X=INPUT_Nouveau_Mouse_X;
Mouse_Y=INPUT_Nouveau_Mouse_Y;
Mouse_K=INPUT_Nouveau_Mouse_K;
Calculer_coordonnees_pinceau();
Afficher_curseur();
INPUT_Nouveau_Mouse_K=0;
Move_cursor_with_constraints();
}
else if(ToucheR == Config_Touche[5])
{
//[Touche] = Emulation de MOUSE CLICK RIGHT
INPUT_Nouveau_Mouse_K=0;
Move_cursor_with_constraints();
}
}
// Joystick management
void Handle_Joystick_Press(SDL_Event* event)
{
}
void Handle_Joystick_Release(SDL_Event* event)
{
}
// Main input handling function
int Get_input(void)
{
SDL_Event event;
int User_Feedback_Required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
// Process as much events as possible without redrawing the screen.
// This mostly allows us to merge mouse events for people with an high
// resolution mouse
while( !User_Feedback_Required && SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_VIDEORESIZE:
Handle_Window_Resize(&event);
User_Feedback_Required = 1;
break;
case SDL_QUIT:
Handle_Window_Exit(&event);
break;
case SDL_MOUSEMOTION:
Handle_Mouse_Move(&event);
break;
case SDL_MOUSEBUTTONDOWN:
Handle_Mouse_Click(&event);
User_Feedback_Required = 1;
break;
case SDL_MOUSEBUTTONUP:
Handle_Mouse_Release(&event);
User_Feedback_Required = 1;
break;
case SDL_KEYDOWN:
Handle_Key_Press(&event);
User_Feedback_Required = 1;
break;
case SDL_KEYUP:
Handle_Key_Release(&event);
break;
case SDL_JOYBUTTONUP:
Handle_Joystick_Press(&event);
break;
case SDL_JOYBUTTONDOWN:
Handle_Joystick_Release(&event);
User_Feedback_Required = 1;
break;
default:
DEBUG("Unhandled SDL event !",0);
break;
}
}
// DEBUG("Exiting event loop",0);
// Vidage de toute mise à jour de l'affichage à l'écran qui serait encore en attente.
// (c'est fait ici car on est sur que cette fonction est apellée partout ou on a besoin d'interragir avec l'utilisateur)