diff --git a/buttons.c b/buttons.c index af07085f..820c7e16 100644 --- a/buttons.c +++ b/buttons.c @@ -672,12 +672,12 @@ void Settings_display_config(T_Config * conf) Hide_cursor(); - // slider = Jauge de sensibilité Y + // slider = sensitivity slider for Y slider->Position=conf->Mouse_sensitivity_index_y-1; Window_draw_slider(slider); slider=slider->Next; - // slider = Jauge de sensibilité X + // slider = sensitivity slider for X slider->Position=conf->Mouse_sensitivity_index_x-1; Window_draw_slider(slider); @@ -745,8 +745,6 @@ void Settings_load_config(T_Config * conf) void Button_Settings(void) { - int x_sensitivity; - int y_sensitivity; short clicked_button; T_Config Config_choisie; char str[3]; @@ -822,8 +820,8 @@ void Button_Settings(void) Window_set_normal_button(250,163, 51,14,"Close" ,0,1,KEY_ESC); // 19 // Jauges de sensibilité de la souris (X puis Y) - Window_set_scroller_button(265,99,56,255,1,0); // 20 - Window_set_scroller_button(279,99,56,255,1,0); // 21 + Window_set_scroller_button(265,99,56,4,1,0); // 20 + Window_set_scroller_button(279,99,56,4,1,0); // 21 // Zone de saisie du nb de pages de Undo Window_set_input_button(140,50,2); // 22 @@ -942,16 +940,7 @@ void Button_Settings(void) Config=Config_choisie; - // Prise en compte de la nouvelle config - // Gestion de la sensibilité - x_sensitivity=(Config.Mouse_sensitivity_index_x/Menu_factor_X); - y_sensitivity=(Config.Mouse_sensitivity_index_y/Menu_factor_Y); - x_sensitivity>>=Mouse_fix_factor_X; - y_sensitivity>>=Mouse_fix_factor_Y; - - Mouse_sensitivity(x_sensitivity?x_sensitivity:1, - y_sensitivity?y_sensitivity:1); - // Gestion des fontes + // Font selection if (Config.Font) Menu_font=GFX_fun_font; else diff --git a/gfx2def.ini b/gfx2def.ini index d10330a9..6cad7a24 100644 --- a/gfx2def.ini +++ b/gfx2def.ini @@ -25,36 +25,15 @@ [MOUSE] # [SOURIS] ; The sensitivity of the mouse can | La sensibilité de la souris peut - ; take values from 1 to 64. The | prendre des valeurs de 1 à 64. Plus + ; take values from 1 to 4. The | prendre des valeurs de 1 à 4. Plus ; smaller values, the faster. | les valeurs sont petites, plus c'est - ; | rapide. - X_sensitivity = 1 ; (default 3) - Y_sensitivity = 1 ; (default 3) + ; This only takes effect in | rapide. Ce paramétrage n'est utilisé + ; fullscreen modes. | que dans les modes "plein écran". + ; | + X_sensitivity = 1 ; (default 1) + Y_sensitivity = 1 ; (default 1) - ; Due to the fact that those stupid | A cause du fait que ces imbéciles de - ; mouse drivers' makers don't care | programmeurs de gestionnaires de - ; if the mouse moves by steps of 2, | souris se fichent que votre souris se - ; 4 or even 8 pixels, we have to | deplace par pas de 2, 4 ou même 8 - ; stretch the virtual area of the | pixels, nous devons élargir la zone - ; mouse and divide coordinates to | virtuelle de la souris et diviser les - ; get a one-pixel step motion. | coordonnées pour obtenir un pas de 1. - ; (Warning: the mouse movement can | (Attention: le déplacement de la - ; be correct in some video modes | souris peut être correct dans certains - ; but not in others... But all the | modes vidéos mais pas dans d'autres... - ; "Modes X" should behave the same | Mais tout les Modes X devraient se - ; way, so you won't have to test | comporter de la même manière, donc - ; them all). | vous n'aurez pas à tous les tester. - ; A correction factor of 0 means | Un facteur de correction de 0 signifie - ; that you are very lucky because | que vous avez de la chace car votre - ; your driver doesn't need any | driver n'a pas besoin de correction. - ; correction. If you set the | Si vous définissez le facteur de - ; correction factor to 1, it means | correction à 1, cela signifie que - ; that your mouse moves by steps of | votre souris se déplace par pas de 2 - ; 2 pixels; 2 for 4; 3 for 8, etc...| pixels; 2 pour 4; 3 pour 8, etc... - ; If you want to use GrafX2 in a | Si vous désirez lancer GrafX2 dans une - ; Win95 window, you should turn | fenêtre Windows95, vous devriez passer - ; these values to 0 (and increase X | ces valeurs à 0 (et augmenter les sen- - ; and Y sensitivities above). | sibilités X et Y définies plus haut). + ; Unused setting, only kept for compatibility. X_correction_factor = 0 ; (default 0) Y_correction_factor = 0 ; (default 0) diff --git a/graph.c b/graph.c index 406eed2a..9a9d8fac 100644 --- a/graph.c +++ b/graph.c @@ -45,6 +45,7 @@ #include "pxtall2.h" #include "pxquad.h" #include "windows.h" +#include "input.h" // Generic pixel-drawing function. Func_pixel Pixel_figure; @@ -186,8 +187,6 @@ void Transform_point(short x, short y, float cos_a, float sin_a, int Init_mode_video(int width, int height, int fullscreen, int pix_ratio) { - int x_sensitivity; - int y_sensitivity; int index; int factor; int pix_width; @@ -277,7 +276,7 @@ int Init_mode_video(int width, int height, int fullscreen, int pix_ratio) { Set_mode_SDL(&width, &height,fullscreen); } - Clear_border(MC_Black); + if (screen_changed || pixels_changed) { Pixel_ratio=pix_ratio; @@ -467,6 +466,8 @@ int Init_mode_video(int width, int height, int fullscreen, int pix_ratio) Screen_width = width/Pixel_width; Screen_height = height/Pixel_height; + Clear_border(MC_Black); // Requires up-to-date Screen_* and Pixel_* + // Taille des menus if (Screen_width/320 > Screen_height/200) factor=Screen_height/200; @@ -521,11 +522,7 @@ int Init_mode_video(int width, int height, int fullscreen, int pix_ratio) Menu_Y -= MENU_HEIGHT * Menu_factor_Y; Menu_status_Y = Screen_height-(Menu_factor_Y<<3); - x_sensitivity = Config.Mouse_sensitivity_index_x; - y_sensitivity = Config.Mouse_sensitivity_index_y; - x_sensitivity>>=Mouse_fix_factor_X; - y_sensitivity>>=Mouse_fix_factor_Y; - Mouse_sensitivity(x_sensitivity?x_sensitivity:1,y_sensitivity?y_sensitivity:1); + Adjust_mouse_sensitivity(fullscreen); Mouse_X=absolute_mouse_x/Pixel_width; if (Mouse_X>=Screen_width) diff --git a/input.c b/input.c index 38152237..e91b7dfe 100644 --- a/input.c +++ b/input.c @@ -48,6 +48,12 @@ word Input_new_mouse_X; word Input_new_mouse_Y; byte Input_new_mouse_K; +byte Mouse_mode = 0; ///< Mouse mode = 0:normal, 1:emulated with custom sensitivity. +short Mouse_virtual_x_position; +short Mouse_virtual_y_position; +short Mouse_virtual_width; +short Mouse_virtual_height; + // TODO: move to config short Joybutton_shift=-1; // Button number that serves as a "shift" modifier short Joybutton_control=-1; // Button number that serves as a "ctrl" modifier @@ -135,13 +141,6 @@ int Move_cursor_with_constraints() } } } - if (bl) - { - SDL_WarpMouse( - Input_new_mouse_X*Pixel_width, - Input_new_mouse_Y*Pixel_height - ); - } if ((Input_new_mouse_X != Mouse_X) || (Input_new_mouse_Y != Mouse_Y) || (Input_new_mouse_K != Mouse_K)) @@ -149,8 +148,13 @@ int Move_cursor_with_constraints() if ((Input_new_mouse_K != Mouse_K)) feedback=1; Hide_cursor(); // On efface le curseur AVANT de le déplacer... - Mouse_X=Input_new_mouse_X; - Mouse_Y=Input_new_mouse_Y; + if (Input_new_mouse_X != Mouse_X || Input_new_mouse_Y != Mouse_Y) + { + Mouse_X=Input_new_mouse_X; + Mouse_Y=Input_new_mouse_Y; + if (bl) + Set_mouse_position(); + } Mouse_K=Input_new_mouse_K; Compute_paintbrush_coordinates(); Display_cursor(); @@ -180,8 +184,30 @@ void Handle_window_exit(__attribute__((unused)) SDL_QuitEvent event) int Handle_mouse_move(SDL_MouseMotionEvent event) { - Input_new_mouse_X = event.x/Pixel_width; - Input_new_mouse_Y = event.y/Pixel_height; + if (Mouse_mode == 0) + { + Input_new_mouse_X = event.x/Pixel_width; + Input_new_mouse_Y = event.y/Pixel_height; + } + else + { + Mouse_virtual_x_position += event.xrel * 12 / Config.Mouse_sensitivity_index_x; + // Clip + if (Mouse_virtual_x_position > Mouse_virtual_width) + Mouse_virtual_x_position = Mouse_virtual_width; + else if (Mouse_virtual_x_position < 0) + Mouse_virtual_x_position = 0; + + Mouse_virtual_y_position += event.yrel * 12 / Config.Mouse_sensitivity_index_y; + // Clip + if (Mouse_virtual_y_position > Mouse_virtual_height) + Mouse_virtual_y_position = Mouse_virtual_height; + else if (Mouse_virtual_y_position < 0) + Mouse_virtual_y_position = 0; + + Input_new_mouse_X = Mouse_virtual_x_position / 12 / Pixel_width; + Input_new_mouse_Y = Mouse_virtual_y_position / 12 / Pixel_height; + } return Move_cursor_with_constraints(); } @@ -715,3 +741,33 @@ int Get_input(void) return user_feedback_required; } + +void Adjust_mouse_sensitivity(word fullscreen) +{ + if (fullscreen == 0) + { + Mouse_mode = 0; + return; + } + Mouse_mode = 1; + Mouse_virtual_x_position = 12*Mouse_X*Pixel_width; + Mouse_virtual_y_position = 12*Mouse_Y*Pixel_height; + Mouse_virtual_width = 12*(Screen_width-1)*Pixel_width; + Mouse_virtual_height = 12*(Screen_height-1)*Pixel_height; +} + +void Set_mouse_position(void) +{ + if (Mouse_mode == 0) + { + SDL_WarpMouse( + Mouse_X*Pixel_width, + Mouse_Y*Pixel_height + ); + } + else + { + Mouse_virtual_x_position = 12*Mouse_X*Pixel_width; + Mouse_virtual_y_position = 12*Mouse_Y*Pixel_height; + } +} diff --git a/input.h b/input.h index 15e8ddf1..7a878c95 100644 --- a/input.h +++ b/input.h @@ -35,3 +35,8 @@ int Get_input(void); /// Returns true if the keycode has been set as a keyboard shortcut for the function. int Is_shortcut(word Key, word function); + +/// Adjust mouse sensitivity (and actual mouse input mode) +void Adjust_mouse_sensitivity(word fullscreen); + +void Set_mouse_position(void); diff --git a/misc.c b/misc.c index d951fc7e..e0ba3ce4 100644 --- a/misc.c +++ b/misc.c @@ -157,11 +157,6 @@ void Hide_current_image(byte color) ); } -void Mouse_sensitivity(__attribute__((unused)) word x,__attribute__((unused)) word y) -{ - -} - void Init_chrono(dword delay) // Démarrer le chrono { @@ -343,14 +338,6 @@ byte Effect_sieve(word x,word y) return Sieve[x % Sieve_width][y % Sieve_height]; } -void Set_mouse_position(void) -{ - SDL_WarpMouse( - Mouse_X*Pixel_width, - Mouse_Y*Pixel_height - ); -} - void Replace_colors_within_limits(byte * replace_table) { int line; diff --git a/misc.h b/misc.h index 51a4d4f7..88eb23d0 100644 --- a/misc.h +++ b/misc.h @@ -24,9 +24,7 @@ void Copy_image_to_brush(short start_x,short start_y,short Brush_width,short Brush_height,word image_width); void Remap_general_lowlevel(byte * conversion_table,byte * buffer,short width,short height,short buffer_width); void Scroll_picture(short x_offset,short y_offset); -void Set_mouse_position(void); void Wait_end_of_click(void); -void Mouse_sensitivity(word x,word y); void Set_color(byte color, byte red, byte green, byte blue); void Set_palette(T_Palette palette); void Palette_256_to_64(T_Palette palette); diff --git a/readini.c b/readini.c index e4549072..1b01a852 100644 --- a/readini.c +++ b/readini.c @@ -453,15 +453,17 @@ int Load_INI(T_Config * conf) if ((return_code=Load_INI_get_values (file,buffer,"X_sensitivity",1,values))) goto Erreur_Retour; - if ((values[0]<1) || (values[0]>255)) - goto Erreur_ERREUR_INI_CORROMPU; - conf->Mouse_sensitivity_index_x=values[0]; + if ((values[0]<1) || (values[0]>4)) + conf->Mouse_sensitivity_index_x=1; + else + conf->Mouse_sensitivity_index_x=values[0]; if ((return_code=Load_INI_get_values (file,buffer,"Y_sensitivity",1,values))) goto Erreur_Retour; - if ((values[0]<1) || (values[0]>255)) - goto Erreur_ERREUR_INI_CORROMPU; - conf->Mouse_sensitivity_index_y=values[0]; + if ((values[0]<1) || (values[0]>4)) + conf->Mouse_sensitivity_index_y=1; + else + conf->Mouse_sensitivity_index_y=values[0]; if ((return_code=Load_INI_get_values (file,buffer,"X_correction_factor",1,values))) goto Erreur_Retour;