diff --git a/input.c b/input.c index 36d4b2d7..16b8ebc6 100644 --- a/input.c +++ b/input.c @@ -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 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 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 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 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)