Right-click refactoring: step III
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 19 Jan 2010 19:15:49 +0000 (20:15 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Thu, 4 Feb 2010 22:17:21 +0000 (23:17 +0100)
Let WinBoard call RightClick in back-end, and delete the duplicate code
it had for this, after rescuing the front-end bits, and let the letter
act depending on the result returned by RightClick.

backend.c
winboard/winboard.c
xboard.c

index e0e1ab2..cc58afe 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -5943,14 +5943,19 @@ void LeftClick(ClickType clickType, int xPix, int yPix)
 
 int RightClick(ClickType action, int x, int y, int *fromX, int *fromY)
 {   // front-end-free part taken out of PieceMenuPopup
-    int whichMenu;
+    int whichMenu; int xSqr, ySqr;
 
+    xSqr = EventToSquare(x, BOARD_WIDTH);
+    ySqr = EventToSquare(y, BOARD_HEIGHT);
     if (action == Release) UnLoadPV(); // [HGM] pv
     if (action != Press) return -2;
     switch (gameMode) {
-      case EditPosition:
       case IcsExamining:
-       whichMenu = 0;
+       if(xSqr < BOARD_LEFT || xSqr >= BOARD_RGHT) return -1;\r
+      case EditPosition:
+       if (xSqr == BOARD_LEFT-1 || xSqr == BOARD_RGHT) return -1;\r
+       if (xSqr < 0 || ySqr < 0) return -1;\r
+       whichMenu = 0; // edit-position menu
        break;
       case IcsObserving:
        if(!appData.icsEngineAnalyze) return -1;
@@ -5964,23 +5969,24 @@ int RightClick(ClickType action, int x, int y, int *fromX, int *fromY)
       case TwoMachinesPlay: // [HGM] pv: use for showing PV
        if (!appData.dropMenu) {
          LoadPV(x, y);
-         return -1;
+         return 2; // flag front-end to grab mouse events
        }
        if(gameMode == TwoMachinesPlay || gameMode == AnalyzeMode ||
            gameMode == AnalyzeFile || gameMode == IcsObserving) return -1;
       case EditGame:
       noZip:
+       if (xSqr < 0 || ySqr < 0) return -1;
        if (!appData.dropMenu || appData.testLegality &&
            gameInfo.variant != VariantBughouse &&
            gameInfo.variant != VariantCrazyhouse) return -1;
-       whichMenu = 1;
+       whichMenu = 1; // drop menu
        break;
       default:
        return -1;
     }
 
-    if (((*fromX = EventToSquare(x, BOARD_WIDTH)) < 0) ||
-       ((*fromY = EventToSquare(y, BOARD_HEIGHT)) < 0)) {
+    if (((*fromX = xSqr) < 0) ||
+       ((*fromY = ySqr) < 0)) {
        *fromX = *fromY = -1;
        return -1;
     }
index d790116..81d5d03 100644 (file)
@@ -3652,7 +3652,7 @@ void DragPieceEnd(int x, int y)
 VOID\r
 MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
-  int x, y;\r
+  int x, y, menuNr;\r
   POINT pt;\r
   static int recursive = 0;\r
   HMENU hmenu;\r
@@ -3760,7 +3760,7 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
   case WM_MBUTTONUP:\r
   case WM_RBUTTONUP:\r
     ReleaseCapture();\r
-    UnLoadPV();\r
+    RightClick(Release, pt.x - boardRect.left, pt.y - boardRect.top, &fromX, &fromY);\r
     break;\r
  \r
   case WM_MBUTTONDOWN:\r
@@ -3785,14 +3785,9 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     }\r
     DrawPosition(TRUE, NULL);\r
 \r
-    switch (gameMode) {\r
-    case IcsExamining:\r
-      if(x < BOARD_LEFT || x >= BOARD_RGHT) break;\r
-    case EditPosition:\r
-      if (x == BOARD_LEFT-1 || x == BOARD_RGHT) break;\r
-      if (x < 0 || y < 0) break;\r
-      fromX = x;\r
-      fromY = y;\r
+    menuNr = RightClick(Press, pt.x - boardRect.left, pt.y - boardRect.top, &fromX, &fromY);\r
+    switch (menuNr) {\r
+    case 0:\r
       if (message == WM_MBUTTONDOWN) {\r
        buttonCount = 3;  /* even if system didn't think so */\r
        if (wParam & MK_SHIFT) \r
@@ -3809,35 +3804,13 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
             MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1);\r
       }\r
       break;\r
-    case IcsObserving:\r
-      if(!appData.icsEngineAnalyze) break;\r
-    case IcsPlayingWhite:\r
-    case IcsPlayingBlack:\r
-      if(!appData.zippyPlay) goto noZip;\r
-    case MachinePlaysWhite:\r
-    case MachinePlaysBlack:\r
-    case TwoMachinesPlay:\r
-    case AnalyzeMode:\r
-    case AnalyzeFile:\r
-      if (!appData.dropMenu) {\r
-        SetCapture(hwndMain);\r
-        LoadPV(pt.x - boardRect.left, pt.y - boardRect.top);\r
-        break;\r
-      }\r
-      if(gameMode == TwoMachinesPlay || gameMode == AnalyzeMode ||\r
-         gameMode == AnalyzeFile || gameMode == IcsObserving) break;\r
-    case EditGame:\r
-    noZip:\r
-      if (x < 0 || y < 0) break;\r
-      if (!appData.dropMenu || appData.testLegality &&\r
-         gameInfo.variant != VariantBughouse &&\r
-         gameInfo.variant != VariantCrazyhouse) break;\r
-      fromX = x;\r
-      fromY = y;\r
+    case 2:\r
+      SetCapture(hwndMain);
+      break;\r
+    case 1:\r
       hmenu = LoadMenu(hInst, "DropPieceMenu");\r
       SetupDropMenu(hmenu);\r
       MenuPopup(hwnd, pt, hmenu, -1);\r
-      break;\r
     default:\r
       break;\r
     }\r
index cbe40e1..581206c 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -3722,6 +3722,7 @@ void PieceMenuPopup(w, event, params, num_params)
     switch(menuNr) {
       case 0: whichMenu = params[0]; break;
       case 1: SetupDropMenu(); whichMenu = "menuD"; break;
+      case 2:
       case -1: if (errorUp) ErrorPopDown();
       default: return;
     }