changes from H.G. Muller; version 4.3.13
[xboard.git] / winboard / wsnap.c
index e6f6151..6d84304 100644 (file)
-/*
- * Smart "snapping" for window moving and sizing
- *
- * Author: Alessandro Scotti (Dec 2005)
- *
- * ------------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- * ------------------------------------------------------------------------
- */
-#include "wsnap.h"
-
-/* Imports from winboard.c */
-extern HINSTANCE hInst;
-
-extern HWND hwndMain;
-extern HWND moveHistoryDialog;
-extern HWND evalGraphDialog;
-extern HWND engineOutputDialog;
-extern HWND gameListDialog;
-
-static BOOL SnappingEnabled = TRUE;
-
-static void AddSnapPoint( int * grid, int * grid_len, int value )
-{
-    int len = *grid_len;
-
-    if( len < MAX_SNAP_POINTS ) {
-        int i;
-
-        for( i=0; i<len; i++ ) {
-            if( grid[i] == value ) {
-                return;
-            }
-        }
-
-        grid[ len++ ] = value;
-
-        *grid_len = len;
-    }
-}
-
-static void AddSnapRectangle( SnapData * sd, RECT * rc )
-{
-    AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->left );
-    AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->right );
-
-    AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->top );
-    AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->bottom );
-}
-
-static void AddSnapWindow( HWND hWndCaller, SnapData * sd, HWND hWndSnapWindow )
-{
-    if( hWndSnapWindow != NULL && hWndCaller != hWndSnapWindow && IsWindowVisible(hWndSnapWindow) ) {
-        RECT rc;
-
-        GetWindowRect( hWndSnapWindow, &rc );
-
-        AddSnapRectangle( sd, &rc );
-    }
-}
-
-static BOOL AdjustToSnapPoint( int * grid, int grid_len, int value, int * snap_size, int * delta )
-{
-    BOOL result = FALSE;
-    int i;
-
-    for( i=0; i<grid_len; i++ ) {
-        int distance = value - grid[i];
-
-        if( distance < 0 ) distance = -distance;
-
-        if( distance < *snap_size ) {
-            result = TRUE;
-            *snap_size = distance;
-            *delta = grid[i] - value;
-        }
-    }
-
-    return result;
-}
-
-LRESULT OnEnterSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )
-{
-    RECT rc;
-
-    snapData->x_grid_len = 0;
-    snapData->y_grid_len = 0;
-
-    /* Add desktop area */
-    if( SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 ) ) {
-        AddSnapRectangle( snapData, &rc );
-    }
-
-    if( hWnd != hwndMain ) {
-        /* Add other windows */
-        AddSnapWindow( hWnd, snapData, hwndMain );
-        AddSnapWindow( hWnd, snapData, moveHistoryDialog );
-        AddSnapWindow( hWnd, snapData, evalGraphDialog );
-        AddSnapWindow( hWnd, snapData, engineOutputDialog );
-        AddSnapWindow( hWnd, snapData, gameListDialog );
-    }
-
-    return 0;
-}
-
-LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )
-{
-    LPRECT lprc = (LPRECT) lParam;
-    int delta_x = 0;
-    int delta_y = 0;
-    int snap_size_x = SNAP_DISTANCE;
-    int snap_size_y = SNAP_DISTANCE;
-
-    if( ! SnappingEnabled ) {
-        return FALSE;
-    }
-
-    AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );
-    AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );
-
-    AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );
-    AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );
-
-    OffsetRect( lprc, delta_x, delta_y );
-
-    return TRUE;
-}
-
-LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )
-{
-    LPRECT lprc = (LPRECT) lParam;
-    int delta_x = 0;
-    int delta_y = 0;
-    int snap_size_x = SNAP_DISTANCE;
-    int snap_size_y = SNAP_DISTANCE;
-
-    if( ! SnappingEnabled ) {
-        return FALSE;
-    }
-
-    switch( wParam ) {
-    case WMSZ_BOTTOM:
-        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );
-        lprc->bottom += delta_y;
-        break;
-    case WMSZ_BOTTOMLEFT:
-        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );
-        lprc->bottom += delta_y;
-        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );
-        lprc->left += delta_x;
-        break;
-    case WMSZ_BOTTOMRIGHT:
-        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );
-        lprc->bottom += delta_y;
-        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );
-        lprc->right += delta_x;
-        break;
-    case WMSZ_LEFT:
-        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );
-        lprc->left += delta_x;
-        break;
-    case WMSZ_RIGHT:
-        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );
-        lprc->right += delta_x;
-        break;
-    case WMSZ_TOP:
-        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );
-        lprc->top += delta_y;
-        break;
-    case WMSZ_TOPLEFT:
-        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );
-        lprc->top += delta_y;
-        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );
-        lprc->left += delta_x;
-        break;
-    case WMSZ_TOPRIGHT:
-        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );
-        lprc->top += delta_y;
-        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );
-        lprc->right += delta_x;
-        break;
-    default:
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )
-{
-    return 0;
-}
+/*\r
+ * Smart "snapping" for window moving and sizing\r
+ *\r
+ * Author: Alessandro Scotti (Dec 2005)\r
+ *\r
+ * ------------------------------------------------------------------------\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
+ * ------------------------------------------------------------------------\r
+ */\r
+#include "wsnap.h"\r
+\r
+/* Imports from winboard.c */\r
+extern HINSTANCE hInst;\r
+\r
+extern HWND hwndMain;\r
+extern HWND moveHistoryDialog;\r
+extern HWND evalGraphDialog;\r
+extern HWND engineOutputDialog;\r
+extern HWND gameListDialog;\r
+\r
+static BOOL SnappingEnabled = TRUE;\r
+\r
+static void AddSnapPoint( int * grid, int * grid_len, int value )\r
+{\r
+    int len = *grid_len;\r
+\r
+    if( len < MAX_SNAP_POINTS ) {\r
+        int i;\r
+\r
+        for( i=0; i<len; i++ ) {\r
+            if( grid[i] == value ) {\r
+                return;\r
+            }\r
+        }\r
+\r
+        grid[ len++ ] = value;\r
+\r
+        *grid_len = len;\r
+    }\r
+}\r
+\r
+static void AddSnapRectangle( SnapData * sd, RECT * rc )\r
+{\r
+    AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->left );\r
+    AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->right );\r
+\r
+    AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->top );\r
+    AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->bottom );\r
+}\r
+\r
+static void AddSnapWindow( HWND hWndCaller, SnapData * sd, HWND hWndSnapWindow )\r
+{\r
+    if( hWndSnapWindow != NULL && hWndCaller != hWndSnapWindow && IsWindowVisible(hWndSnapWindow) ) {\r
+        RECT rc;\r
+\r
+        GetWindowRect( hWndSnapWindow, &rc );\r
+\r
+        AddSnapRectangle( sd, &rc );\r
+    }\r
+}\r
+\r
+static BOOL AdjustToSnapPoint( int * grid, int grid_len, int value, int * snap_size, int * delta )\r
+{\r
+    BOOL result = FALSE;\r
+    int i;\r
+\r
+    for( i=0; i<grid_len; i++ ) {\r
+        int distance = value - grid[i];\r
+\r
+        if( distance < 0 ) distance = -distance;\r
+\r
+        if( distance < *snap_size ) {\r
+            result = TRUE;\r
+            *snap_size = distance;\r
+            *delta = grid[i] - value;\r
+        }\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+LRESULT OnEnterSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )\r
+{\r
+    RECT rc;\r
+\r
+    snapData->x_grid_len = 0;\r
+    snapData->y_grid_len = 0;\r
+\r
+    /* Add desktop area */\r
+    if( SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 ) ) {\r
+        AddSnapRectangle( snapData, &rc );\r
+    }\r
+\r
+    if( hWnd != hwndMain ) {\r
+        /* Add other windows */\r
+        AddSnapWindow( hWnd, snapData, hwndMain );\r
+        AddSnapWindow( hWnd, snapData, moveHistoryDialog );\r
+        AddSnapWindow( hWnd, snapData, evalGraphDialog );\r
+        AddSnapWindow( hWnd, snapData, engineOutputDialog );\r
+        AddSnapWindow( hWnd, snapData, gameListDialog );\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )\r
+{\r
+    LPRECT lprc = (LPRECT) lParam;\r
+    int delta_x = 0;\r
+    int delta_y = 0;\r
+    int snap_size_x = SNAP_DISTANCE;\r
+    int snap_size_y = SNAP_DISTANCE;\r
+\r
+    if( ! SnappingEnabled ) {\r
+        return FALSE;\r
+    }\r
+\r
+    AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );\r
+    AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );\r
+\r
+    AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );\r
+    AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );\r
+\r
+    OffsetRect( lprc, delta_x, delta_y );\r
+\r
+    return TRUE;\r
+}\r
+\r
+LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )\r
+{\r
+    LPRECT lprc = (LPRECT) lParam;\r
+    int delta_x = 0;\r
+    int delta_y = 0;\r
+    int snap_size_x = SNAP_DISTANCE;\r
+    int snap_size_y = SNAP_DISTANCE;\r
+\r
+    if( ! SnappingEnabled ) {\r
+        return FALSE;\r
+    }\r
+\r
+    switch( wParam ) {\r
+    case WMSZ_BOTTOM:\r
+        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );\r
+        lprc->bottom += delta_y;\r
+        break;\r
+    case WMSZ_BOTTOMLEFT:\r
+        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );\r
+        lprc->bottom += delta_y;\r
+        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );\r
+        lprc->left += delta_x;\r
+        break;\r
+    case WMSZ_BOTTOMRIGHT:\r
+        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y );\r
+        lprc->bottom += delta_y;\r
+        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );\r
+        lprc->right += delta_x;\r
+        break;\r
+    case WMSZ_LEFT:\r
+        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );\r
+        lprc->left += delta_x;\r
+        break;\r
+    case WMSZ_RIGHT:\r
+        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );\r
+        lprc->right += delta_x;\r
+        break;\r
+    case WMSZ_TOP:\r
+        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );\r
+        lprc->top += delta_y;\r
+        break;\r
+    case WMSZ_TOPLEFT:\r
+        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );\r
+        lprc->top += delta_y;\r
+        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x );\r
+        lprc->left += delta_x;\r
+        break;\r
+    case WMSZ_TOPRIGHT:\r
+        AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y );\r
+        lprc->top += delta_y;\r
+        AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x );\r
+        lprc->right += delta_x;\r
+        break;\r
+    default:\r
+        return FALSE;\r
+    }\r
+\r
+    return TRUE;\r
+}\r
+\r
+LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam )\r
+{\r
+    return 0;\r
+}\r