Implement -monoMouse option (XB)
authorH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 13 Nov 2014 17:33:42 +0000 (18:33 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 7 May 2015 18:53:31 +0000 (20:53 +0200)
With the monoMouse option button-3 is no longer needed in Edit-Position
mode, but a button-1 click on an empty square will automatically behave
as if it was button 3. It can only be used with -pieceMenu false,
as it does not communicate the coordinates of the clicked square.

args.h
backend.c
common.h
dialogs.c

diff --git a/args.h b/args.h
index 1ceb1a4..270baf5 100644 (file)
--- a/args.h
+++ b/args.h
@@ -230,6 +230,7 @@ ArgDescriptor argDescriptors[] = {
   { "dropMenu", ArgBoolean, (void *) &appData.dropMenu, TRUE, (ArgIniType) FALSE },
   { "pieceMenu", ArgBoolean, (void *) &appData.pieceMenu, TRUE, (ArgIniType) TRUE },
   { "sweepPromotions", ArgBoolean, (void *) &appData.sweepSelect, TRUE, (ArgIniType) FALSE },
+  { "monoMouse", ArgBoolean, (void *) &appData.monoMouse, XBOARD, (ArgIniType) FALSE },
   { "remoteShell", ArgFilename, (void *) &appData.remoteShell, FALSE, (ArgIniType) REMOTE_SHELL },
   { "rsh", ArgFilename, (void *) &appData.remoteShell, FALSE, INVALID },
   { "remoteUser", ArgString, (void *) &appData.remoteUser, FALSE, (ArgIniType) "" },
index 0b4ad84..c4c5bf3 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -7367,6 +7367,8 @@ void ReportClick(char *action, int x, int y)
        SendToProgram(buf, &first);
 }
 
+Boolean right; // instructs front-end to use button-1 events as if they were button 3
+
 void
 LeftClick (ClickType clickType, int xPix, int yPix)
 {
@@ -7377,13 +7379,6 @@ LeftClick (ClickType clickType, int xPix, int yPix)
     ChessSquare piece;
     static TimeMark lastClickTime, prevClickTime;
 
-    if(SeekGraphClick(clickType, xPix, yPix, 0)) return;
-
-    prevClickTime = lastClickTime; GetTimeMark(&lastClickTime);
-
-    if (clickType == Press) ErrorPopDown();
-    lastClickType = clickType, lastLeftX = xPix, lastLeftY = yPix; // [HGM] alien: remember state
-
     x = EventToSquare(xPix, BOARD_WIDTH);
     y = EventToSquare(yPix, BOARD_HEIGHT);
     if (!flipView && y >= 0) {
@@ -7393,6 +7388,20 @@ LeftClick (ClickType clickType, int xPix, int yPix)
        x = BOARD_WIDTH - 1 - x;
     }
 
+    if(appData.monoMouse && gameMode == EditPosition && clickType == Press && boards[currentMove][y][x] == EmptySquare) {
+       static int dummy;
+       RightClick(clickType, xPix, yPix, &dummy, &dummy);
+       right = TRUE;
+       return;
+    }
+
+    if(SeekGraphClick(clickType, xPix, yPix, 0)) return;
+
+    prevClickTime = lastClickTime; GetTimeMark(&lastClickTime);
+
+    if (clickType == Press) ErrorPopDown();
+    lastClickType = clickType, lastLeftX = xPix, lastLeftY = yPix; // [HGM] alien: remember state
+
     if(promoSweep != EmptySquare) { // up-click during sweep-select of promo-piece
        defaultPromoChoice = promoSweep;
        promoSweep = EmptySquare;   // terminate sweep
index 2b0ddf0..a082aa2 100644 (file)
--- a/common.h
+++ b/common.h
@@ -777,6 +777,7 @@ typedef struct {
     Boolean autoCopyPV;
     Boolean pieceMenu;
     Boolean sweepSelect;
+    Boolean monoMouse;
     Boolean whitePOV;
     Boolean scoreWhite;
     Boolean pvSAN[ENGINES];
index 2e63442..29003f5 100644 (file)
--- a/dialogs.c
+++ b/dialogs.c
@@ -2544,6 +2544,12 @@ Exp (int n, int x, int y)
     static int but1, but3, oldW, oldH;
     int menuNr = -3, sizing, f, r;
     TimeMark now;
+    extern Boolean right;
+
+    if(right) {  // kludgy way to let button 1 double as button 3 when back-end requests this
+       if(but1 && n == 0) but1 = 0, but3 = 1;
+       else if(n == -1) n = -3, right = FALSE;
+    }
 
     if(n == 0) { // motion
        if(SeekGraphClick(Press, x, y, 1)) return NULL;