From 09d73b0ba5c3430c35ec4ac39695f226e1a82706 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Fri, 16 Jul 2010 01:26:34 +0000 Subject: [PATCH] Apply patch #2003 - Add option for rotating with middle mouse button (LMB+RMB also works). refs #2003 git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@11212 4a71c877-e1ca-e34f-864e-861f7616d084 --- lib/framework/input.c | 34 +++++++++++++++++++--------------- src/configuration.c | 12 +++++++++++- src/display.c | 21 +++++++++++++++++---- src/display.h | 3 +++ src/frontend.c | 26 ++++++++++++++++++++++++++ src/frontend.h | 2 ++ 6 files changed, 78 insertions(+), 20 deletions(-) diff --git a/lib/framework/input.c b/lib/framework/input.c index 39dce2434..8ddd6c10e 100644 --- a/lib/framework/input.c +++ b/lib/framework/input.c @@ -380,20 +380,17 @@ void inputHandleMouseMotionEvent(SDL_MouseMotionEvent * motionEvent) switch (motionEvent->type) { case SDL_MOUSEMOTION: - if(!mouseDown(MOUSE_MMB)) - { - /* store the current mouse position */ - mouseXPos = motionEvent->x; - mouseYPos = motionEvent->y; + /* store the current mouse position */ + mouseXPos = motionEvent->x; + mouseYPos = motionEvent->y; - /* now see if a drag has started */ - if ( ( aMouseState[dragKey].state == KEY_PRESSED || - aMouseState[dragKey].state == KEY_DOWN ) - && ( ABSDIF(dragX, mouseXPos) > DRAG_THRESHOLD || - ABSDIF(dragY, mouseYPos) > DRAG_THRESHOLD ) ) - { - aMouseState[dragKey].state = KEY_DRAG; - } + /* now see if a drag has started */ + if ((aMouseState[dragKey].state == KEY_PRESSED || + aMouseState[dragKey].state == KEY_DOWN) && + (ABSDIF(dragX, mouseXPos) > DRAG_THRESHOLD || + ABSDIF(dragY, mouseYPos) > DRAG_THRESHOLD)) + { + aMouseState[dragKey].state = KEY_DRAG; } break; default: @@ -495,7 +492,10 @@ Uint16 mouseY(void) /* This returns true if the mouse key is currently depressed */ bool mouseDown(MOUSE_KEY_CODE code) { - return (aMouseState[code].state != KEY_UP); + return (aMouseState[code].state != KEY_UP) || + + // holding down LMB and RMB counts as holding down MMB + (code == MOUSE_MMB && aMouseState[MOUSE_LMB].state != KEY_UP && aMouseState[MOUSE_RMB].state != KEY_UP); } /* This returns true if the mouse key was double clicked */ @@ -523,7 +523,11 @@ bool mouseReleased(MOUSE_KEY_CODE code) /* Check for a mouse drag, return the drag start coords if dragging */ bool mouseDrag(MOUSE_KEY_CODE code, UDWORD *px, UDWORD *py) { - if (aMouseState[code].state == KEY_DRAG) + if ((aMouseState[code].state == KEY_DRAG) || + + // dragging LMB and RMB counts as dragging MMB + (code == MOUSE_MMB && ((aMouseState[MOUSE_LMB].state == KEY_DRAG && aMouseState[MOUSE_RMB].state != KEY_UP) || + (aMouseState[MOUSE_LMB].state != KEY_UP && aMouseState[MOUSE_RMB].state == KEY_DRAG)))) { *px = dragX; *py = dragY; diff --git a/src/configuration.c b/src/configuration.c index 62f8fcf53..36779679a 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -231,7 +231,16 @@ BOOL loadConfig(void) setRightClickOrders(false); setWarzoneKeyNumeric("RightClickOrders", false); } - + if (getWarzoneKeyNumeric("MiddleClickRotate", &val)) + { + setMiddleClickRotate(val); + } + else + { + setMiddleClickRotate(false); + setWarzoneKeyNumeric("MiddleClickRotate", false); + } + // ////////////////////////// // rotate radar if(getWarzoneKeyNumeric("rotateRadar", &val)) @@ -730,6 +739,7 @@ BOOL saveConfig(void) setWarzoneKeyNumeric("shake",(SDWORD)(getShakeStatus())); // screenshake setWarzoneKeyNumeric("mouseflip",(SDWORD)(getInvertMouseStatus())); // flipmouse setWarzoneKeyNumeric("RightClickOrders",(SDWORD)(getRightClickOrders())); + setWarzoneKeyNumeric("MiddleClickRotate",(SDWORD)(getMiddleClickRotate())); setWarzoneKeyNumeric("shadows",(SDWORD)(getDrawShadows())); // shadows setWarzoneKeyNumeric("sound", (SDWORD)war_getSoundEnabled()); setWarzoneKeyNumeric("FMVmode",(SDWORD)(war_GetFMVmode())); // sequences diff --git a/src/display.c b/src/display.c index 9cbc102e5..e08315d0d 100644 --- a/src/display.c +++ b/src/display.c @@ -177,6 +177,7 @@ static BOOL anyDroidSelected(UDWORD player); static BOOL cyborgDroidSelected(UDWORD player); static BOOL bInvertMouse = true; static BOOL bRightClickOrders = false; +static BOOL bMiddleClickRotate = false; static BOOL bDrawShadows = true; static SELECTION_TYPE establishSelection(UDWORD selectedPlayer); static void dealWithLMB( void ); @@ -272,6 +273,7 @@ void setInvertMouseStatus( BOOL val ) #define MOUSE_ORDER (bRightClickOrders?MOUSE_RMB:MOUSE_LMB) #define MOUSE_SELECT (bRightClickOrders?MOUSE_LMB:MOUSE_RMB) +#define MOUSE_ROTATE (bMiddleClickRotate?MOUSE_MMB:MOUSE_RMB) BOOL getRightClickOrders( void ) { @@ -284,6 +286,17 @@ void setRightClickOrders( BOOL val ) } +BOOL getMiddleClickRotate( void ) +{ + return bMiddleClickRotate; +} + +void setMiddleClickRotate( BOOL val ) +{ + bMiddleClickRotate = val; +} + + BOOL getDrawShadows( void ) { return(bDrawShadows); @@ -549,7 +562,7 @@ static void CheckFinishedDrag(void) return; } - if (mouseReleased(MOUSE_LMB)) + if (mouseReleased(MOUSE_LMB) || mouseDown(MOUSE_RMB)) { selectAttempt = false; if(dragBox3D.status == DRAG_DRAGGING) @@ -800,7 +813,7 @@ void processMouseClickInput(void) kill3DBuilding(); bRadarDragging = false; } - if (mouseDrag(MOUSE_RMB,(UDWORD *)&rotX,(UDWORD *)&rotY) && !rotActive && !bRadarDragging) + if (mouseDrag(MOUSE_ROTATE,(UDWORD *)&rotX,(UDWORD *)&rotY) && !rotActive && !bRadarDragging) { rotInitial = player.r.y; rotInitialUp = player.r.x; @@ -1320,7 +1333,7 @@ void displayWorld(void) shakeUpdate(); - if (mouseDown(MOUSE_RMB) && rotActive) + if (mouseDown(MOUSE_ROTATE) && rotActive) { if (abs(mouseX() - rotX) > 2 || xMoved > 2 || abs(mouseY() - rotY) > 2 || yMoved > 2) { @@ -1369,7 +1382,7 @@ void displayWorld(void) } } - if(mouseReleased(MOUSE_RMB) && rotActive) + if (!mouseDown(MOUSE_ROTATE) && rotActive) { rotActive = false; xMoved = yMoved = 0; diff --git a/src/display.h b/src/display.h index 8f26af062..5851e9ad6 100644 --- a/src/display.h +++ b/src/display.h @@ -63,6 +63,9 @@ extern BOOL getInvertMouseStatus( void ); extern void setRightClickOrders( BOOL val ); extern BOOL getRightClickOrders( void ); +extern void setMiddleClickRotate( BOOL val ); +extern BOOL getMiddleClickRotate( void ); + extern void setDrawShadows( BOOL val ); extern BOOL getDrawShadows( void ); diff --git a/src/frontend.c b/src/frontend.c index 963b2b2c4..e9120e5d0 100644 --- a/src/frontend.c +++ b/src/frontend.c @@ -995,6 +995,18 @@ static BOOL startMouseOptionsMenu(void) addTextButton(FRONTEND_MBUTTONS_R, FRONTEND_POS2M-25, FRONTEND_POS5Y, _("Off"), 0); } + //////////// + // middle-click rotate + addTextButton(FRONTEND_MMROTATE, FRONTEND_POS2X-35, FRONTEND_POS6Y, _("Rotate Screen"), 0); + if( getMiddleClickRotate() ) + { // right-click orders + addTextButton(FRONTEND_MMROTATE_R, FRONTEND_POS2M-25, FRONTEND_POS6Y, _("Middle Mouse"), 0); + } + else + { // left-click orders + addTextButton(FRONTEND_MMROTATE_R, FRONTEND_POS2M-25, FRONTEND_POS6Y, _("Right Mouse"), 0); + } + // Add some text down the side of the form addSideText(FRONTEND_SIDETEXT, FRONTEND_SIDEX, FRONTEND_SIDEY, _("MOUSE OPTIONS")); @@ -1066,6 +1078,20 @@ BOOL runMouseOptionsMenu(void) } break; + case FRONTEND_MMROTATE: + case FRONTEND_MMROTATE_R: + if( getMiddleClickRotate() ) + { + setMiddleClickRotate(false); + widgSetString(psWScreen,FRONTEND_MMROTATE_R, _("Right Mouse")); + } + else + { + setMiddleClickRotate(true); + widgSetString(psWScreen,FRONTEND_MMROTATE_R, _("Middle Mouse")); + } + break; + case FRONTEND_QUIT: changeTitleMode(OPTIONS); break; diff --git a/src/frontend.h b/src/frontend.h index cd6a814db..4515e4afb 100644 --- a/src/frontend.h +++ b/src/frontend.h @@ -233,6 +233,8 @@ enum FRONTEND_MFLIP_R, FRONTEND_MBUTTONS, FRONTEND_MBUTTONS_R, + FRONTEND_MMROTATE, + FRONTEND_MMROTATE_R, FRONTEND_KEYMAP = 26000, // Keymap menu FRONTEND_NOGAMESAVAILABLE = 31666 // Used when no games are available in lobby