From 7fc318a856a8c6148ab2a68cdbf989b7e6ae7117 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Wed, 15 Jul 2009 18:50:25 +0000 Subject: [PATCH] Experimental work on mouse locking with shift (issue 193). Consider unstable. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@921 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- input.c | 21 ++++++++++++++++++--- input.h | 9 ++++++++- windows.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/input.c b/input.c index 6ffc6f07..34148178 100644 --- a/input.c +++ b/input.c @@ -31,7 +31,14 @@ void Handle_window_resize(SDL_ResizeEvent event); void Handle_window_exit(SDL_QuitEvent event); +// public Globals (available as extern) + int Input_sticky_control = 0; +int Snap_axis = 0; +int Snap_axis_origin_X; +int Snap_axis_origin_Y; + +// -- byte Directional_up; byte Directional_up_right; @@ -357,6 +364,14 @@ int Handle_key_press(SDL_KeyboardEvent event) int Release_control(int key_code, int modifier) { + int need_feedback = 0; + + if (modifier == MOD_SHIFT) + { + // Disable "snap axis" mode + Snap_axis = 0; + need_feedback = 1; + } if((key_code && key_code == (Config_Key[SPECIAL_MOUSE_UP][0]&0x0FFF)) || (Config_Key[SPECIAL_MOUSE_UP][0]&modifier) || (key_code && key_code == (Config_Key[SPECIAL_MOUSE_UP][1]&0x0FFF)) || (Config_Key[SPECIAL_MOUSE_UP][1]&modifier)) @@ -385,7 +400,7 @@ int Release_control(int key_code, int modifier) { Directional_click &= ~1; Input_new_mouse_K &= ~1; - return Move_cursor_with_constraints(); + return Move_cursor_with_constraints() || need_feedback; } } if((key_code && key_code == (Config_Key[SPECIAL_CLICK_RIGHT][0]&0x0FFF)) || (Config_Key[SPECIAL_CLICK_RIGHT][0]&modifier) || @@ -395,14 +410,14 @@ int Release_control(int key_code, int modifier) { Directional_click &= ~2; Input_new_mouse_K &= ~2; - return Move_cursor_with_constraints(); + return Move_cursor_with_constraints() || need_feedback; } } // Other keys don't need to be released : they are handled as "events" and procesed only once. // These clicks are apart because they need to be continuous (ie move while key pressed) // We are relying on "hardware" keyrepeat to achieve that. - return 0; + return need_feedback; } diff --git a/input.h b/input.h index 8a70ca8f..c6f68f23 100644 --- a/input.h +++ b/input.h @@ -46,4 +46,11 @@ void Set_mouse_position(void); /// is manipulating. The input system will reset it to zero /// when mouse button is released, but it's the engine /// that will record and retrieve a real control ID. -extern int Input_sticky_control; \ No newline at end of file +extern int Input_sticky_control; + +/// Allows locking movement to X or Y axis: 0=normal, 1=lock on next move, 2=locked horizontally, 3=locked vertically. +extern int Snap_axis; +/// For the :Snap_axis mode, sets the origin's point (in image coordinates) +extern int Snap_axis_origin_X; +/// For the :Snap_axis mode, sets the origin's point (in image coordinates) +extern int Snap_axis_origin_Y; diff --git a/windows.c b/windows.c index b7b29291..c91cc862 100644 --- a/windows.c +++ b/windows.c @@ -32,6 +32,7 @@ #include "misc.h" #include "sdlscreen.h" #include "errors.h" +#include "input.h" // L'encapsulation tente une percée...ou un dernier combat. @@ -1275,6 +1276,46 @@ void Compute_paintbrush_coordinates(void) Paintbrush_X=(((Paintbrush_X+(Snap_width>>1)-Snap_offset_X)/Snap_width)*Snap_width)+Snap_offset_X; Paintbrush_Y=(((Paintbrush_Y+(Snap_height>>1)-Snap_offset_Y)/Snap_height)*Snap_height)+Snap_offset_Y; } + + // Handling the snap axis mode, when shift is pressed. + switch (Current_operation) + { + // Operations that don't implement it + case OPERATION_LINE: + Snap_axis=0; + break; + // Operations that implement it + default: + if (Snap_axis==0 && (SDL_GetModState() & KMOD_SHIFT)) + { + // Start "Snap axis" mode + Snap_axis=1; + Snap_axis_origin_X=Paintbrush_X; + Snap_axis_origin_Y=Paintbrush_Y; + } + } + + if (Snap_axis==1) + { + // Cursor moved + if (Paintbrush_X != Snap_axis_origin_X || Paintbrush_Y != Snap_axis_origin_Y) + { + if ((Paintbrush_X-Snap_axis_origin_X)*(Paintbrush_X-Snap_axis_origin_X) > + (Paintbrush_Y-Snap_axis_origin_Y)*(Paintbrush_Y-Snap_axis_origin_Y)) + // Displacement was bigger on X axis: lock Y + Snap_axis=2; + else + Snap_axis=3; + } + } + if (Snap_axis==2) + { + Paintbrush_Y = Snap_axis_origin_Y; + } + else if (Snap_axis==3) + { + Paintbrush_X = Snap_axis_origin_X; + } }