PATCH: XWin multiwindow+multiscreen for negative screen coordinates

Harold L Hunt II huntharo@msu.edu
Sun May 11 21:20:00 GMT 2003


Earle,

I like the patch.

However, I have two problems (easily fixable) with it:

1) It is against an old version of winmultiwindowwindow.c.  The newest 
version can be downloaded here:

http://www.msu.edu/~huntharo/xwin/shadow/xwin-20030501-1250.tar.bz2
http://xfree86.cygwin.com/devel/shadow/changelog.html

2) Please run ``diff -U3''.  I need the extra info that that format 
provides so I can figure out what is happening.


Other than that I thank you for stepping up to fix this problem.  I 
don't have multiple monitors so I can't really fix these sorts of things 
on my own.


Thanks for contributing,

Harold

Earle F. Philhower III wrote:
> Howdy,
> 
> There is a bug in the way XWin handles Windows screen coordinates when
> it's run on a system with legal negative position values.  That is, there
> is a monitor to the left of the primary monitor, whose screen coords are
> (-xxx,0), and the global screen coords are from (-xxx,0) to (+xxx,0).  You
> can reproduce this on a 2 head system by setting the rightmost head to be
> the Control Panel->Display Settings->Settings->Use this device as my
> primary monitor, and then running "XWin.exe -multiwindow -multiplemonitors"
> 
> The fix is to offset screen coords by SM_XVIRTUALSCREEN/SM_YVIRTUALSCREEN
> whenever you are mapping to/from root window coords (window positioning,
> mouse movements).
> 
> diff -w -patch changes to winmultiwindowwindow.c are:
> 
> -8<-------------------------------------------------------------------
> *** orig        Sun May 11 11:47:45 2003
> --- winmultiwindowwindow.c      Sun May 11 11:57:24 2003
> *************** winPositionWindowMultiWindow (WindowPtr
> *** 194,199 ****
> --- 194,203 ----
>     iX = pWin->drawable.x;
>     iY = pWin->drawable.y;
> 
> +   /* Root coord(0,0) is really (-X, -Y) */
> +   iX += GetSystemMetrics(SM_XVIRTUALSCREEN);
> +   iY += GetSystemMetrics(SM_YVIRTUALSCREEN);
> +
>     /* Get the height and width of the X window */
>     iWidth = pWin->drawable.width;
>     iHeight = pWin->drawable.height;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 778,783 ****
> --- 782,791 ----
>         /* Translate the client area mouse coordinates to screen 
> coordinates */
>         ClientToScreen (hwnd, &ptMouse);
> 
> +       /* Screen Coords from (-X,-Y) => Root Window (0,0) */
> +       ptMouse.x -= GetSystemMetrics(SM_XVIRTUALSCREEN);
> +       ptMouse.y -= GetSystemMetrics(SM_YVIRTUALSCREEN);
> +
>         /* We can't do anything without privates */
>         if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
>           break;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 907,912 ****
> --- 915,925 ----
>         /* Translate the client area mouse coordinates to screen 
> coordinates */
>         ClientToScreen (hwnd, &ptMouse);
> 
> +       /* Screen Coords from (-X,-Y) => Root Window (0,0) */
> +       ptMouse.left -= GetSystemMetrics(SM_XVIRTUALSCREEN);
> +       ptMouse.top  -= GetSystemMetrics(SM_YVIRTUALSCREEN);
> +
> +
>         /* Pass the message to the root window */
>         SendMessage (hwndScreen, message, wParam, MAKELONG(ptMouse.x, 
> ptMouse.y));
>         return  0;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 1063,1071 ****
>           SendConfigureNotify (pWin);
> 
>         /* Tell X that the window is moving */
>         (s_pScreen->MoveWindow) (pWin,
> !                                (int)(short) LOWORD(lParam) - 
> wBorderWidth (pWin),
> !                                (int)(short) HIWORD(lParam) - 
> wBorderWidth (pWin),
>                                  pWin->nextSib,
>                                  VTMove);
>         return 0;
> --- 1076,1085 ----
>           SendConfigureNotify (pWin);
> 
>         /* Tell X that the window is moving */
> +       /* Be sure to map from screen (-X,-Y) to (0,0) root coords */
>         (s_pScreen->MoveWindow) (pWin,
> !                                (int)(short) LOWORD(lParam) - 
> wBorderWidth (pWin) - GetSystemMetrics(SM_XVIRTUALSCREEN),
> !                                (int)(short) HIWORD(lParam) - 
> wBorderWidth (pWin) - GetSystemMetrics(SM_YVIRTUALSCREEN),
>                                  pWin->nextSib,
>                                  VTMove);
>         return 0;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 1220,1228 ****
>               SendConfigureNotify (pWin);
> 
>             /* Tell the X server that the window is being resized */
>             (s_pScreen->ResizeWindow) (pWin,
> !                                      pWinPriv->iX - wBorderWidth (pWin),
> !                                      pWinPriv->iY - wBorderWidth (pWin),
>                                        pWinPriv->iWidth,
>                                        pWinPriv->iHeight,
>                                        pWin->nextSib);
> --- 1234,1243 ----
>               SendConfigureNotify (pWin);
> 
>             /* Tell the X server that the window is being resized */
> +           /* Map from screen (-X,-Y) to (0,0) root coords */
>             (s_pScreen->ResizeWindow) (pWin,
> !                                      pWinPriv->iX - wBorderWidth 
> (pWin) - GetSystemMetrics(SM_XVIRTUALSCREEN),
> !                                      pWinPriv->iY - wBorderWidth 
> (pWin) - GetSystemMetrics(SM_YVIRTUALSCREEN),
>                                        pWinPriv->iWidth,
>                                        pWinPriv->iHeight,
>                                        pWin->nextSib);
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 1316,1321 ****
> --- 1331,1340 ----
>             /* Get the current position of the mouse cursor */
>             GetCursorPos (&point);
> 
> +           /* Map from screen (-x,-y) to root (0,0) */
> +           point.x -= GetSystemMetrics(SM_XVIRTUALSCREEN);
> +           point.y -= GetSystemMetrics(SM_YVIRTUALSCREEN);
> +
>             /* Deliver absolute cursor position to X Server */
>             miPointerAbsoluteCursor (point.x, point.y,
>                                      g_c32LastInputEventTime = 
> GetTickCount ());
> *************** winCreateWindowsWindow (WindowPtr pWin)
> *** 1358,1363 ****
> --- 1377,1386 ----
>     iX = pWin->drawable.x;
>     iY = pWin->drawable.y;
> 
> +   /* Map from root coord (0,0) to screen (-X, -Y) */
> +   iX += GetSystemMetrics(SM_XVIRTUALSCREEN);
> +   iY += GetSystemMetrics(SM_YVIRTUALSCREEN);
> +
>     iWidth = pWin->drawable.width;
>     iHeight = pWin->drawable.height;
> 
> -8<-------------------------------------------------------------------
> 
> -Earle F. Philhower, III
>  earle@ziplabel.com
>  cdrlabel - ZipLabel - FlpLabel
>  http://www.cdrlabel.com
> 
> 
> ------------------------------------------------------------------------
> 
> *** orig	Sun May 11 11:47:45 2003
> --- winmultiwindowwindow.c	Sun May 11 11:57:24 2003
> *************** winPositionWindowMultiWindow (WindowPtr 
> *** 194,199 ****
> --- 194,203 ----
>     iX = pWin->drawable.x;
>     iY = pWin->drawable.y;
>   
> +   /* Root coord(0,0) is really (-X, -Y) */
> +   iX += GetSystemMetrics(SM_XVIRTUALSCREEN);
> +   iY += GetSystemMetrics(SM_YVIRTUALSCREEN);
> + 
>     /* Get the height and width of the X window */
>     iWidth = pWin->drawable.width;
>     iHeight = pWin->drawable.height;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 778,783 ****
> --- 782,791 ----
>         /* Translate the client area mouse coordinates to screen coordinates */
>         ClientToScreen (hwnd, &ptMouse);
>   
> +       /* Screen Coords from (-X,-Y) => Root Window (0,0) */
> +       ptMouse.x -= GetSystemMetrics(SM_XVIRTUALSCREEN);
> +       ptMouse.y -= GetSystemMetrics(SM_YVIRTUALSCREEN);
> + 
>         /* We can't do anything without privates */
>         if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
>           break;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 907,912 ****
> --- 915,925 ----
>         /* Translate the client area mouse coordinates to screen coordinates */
>         ClientToScreen (hwnd, &ptMouse);
>   
> +       /* Screen Coords from (-X,-Y) => Root Window (0,0) */
> +       ptMouse.left -= GetSystemMetrics(SM_XVIRTUALSCREEN);
> +       ptMouse.top  -= GetSystemMetrics(SM_YVIRTUALSCREEN);
> + 
> + 
>         /* Pass the message to the root window */
>         SendMessage (hwndScreen, message, wParam, MAKELONG(ptMouse.x, ptMouse.y));
>         return  0;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 1063,1071 ****
>           SendConfigureNotify (pWin);
>   
>         /* Tell X that the window is moving */
>         (s_pScreen->MoveWindow) (pWin,
> !                                (int)(short) LOWORD(lParam) - wBorderWidth (pWin),
> !                                (int)(short) HIWORD(lParam) - wBorderWidth (pWin),
>                                  pWin->nextSib,
>                                  VTMove);
>         return 0;
> --- 1076,1085 ----
>           SendConfigureNotify (pWin);
>   
>         /* Tell X that the window is moving */
> +       /* Be sure to map from screen (-X,-Y) to (0,0) root coords */
>         (s_pScreen->MoveWindow) (pWin,
> !                                (int)(short) LOWORD(lParam) - wBorderWidth (pWin) - GetSystemMetrics(SM_XVIRTUALSCREEN),
> !                                (int)(short) HIWORD(lParam) - wBorderWidth (pWin) - GetSystemMetrics(SM_YVIRTUALSCREEN),
>                                  pWin->nextSib,
>                                  VTMove);
>         return 0;
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 1220,1228 ****
>               SendConfigureNotify (pWin);
>             
>             /* Tell the X server that the window is being resized */
>             (s_pScreen->ResizeWindow) (pWin,
> !                                      pWinPriv->iX - wBorderWidth (pWin),
> !                                      pWinPriv->iY - wBorderWidth (pWin),
>                                        pWinPriv->iWidth,
>                                        pWinPriv->iHeight,
>                                        pWin->nextSib);
> --- 1234,1243 ----
>               SendConfigureNotify (pWin);
>             
>             /* Tell the X server that the window is being resized */
> +           /* Map from screen (-X,-Y) to (0,0) root coords */
>             (s_pScreen->ResizeWindow) (pWin,
> !                                      pWinPriv->iX - wBorderWidth (pWin) - GetSystemMetrics(SM_XVIRTUALSCREEN),
> !                                      pWinPriv->iY - wBorderWidth (pWin) - GetSystemMetrics(SM_YVIRTUALSCREEN),
>                                        pWinPriv->iWidth,
>                                        pWinPriv->iHeight,
>                                        pWin->nextSib);
> *************** winTopLevelWindowProc (HWND hwnd, UINT m
> *** 1316,1321 ****
> --- 1331,1340 ----
>             /* Get the current position of the mouse cursor */
>             GetCursorPos (&point);
>   
> +           /* Map from screen (-x,-y) to root (0,0) */
> +           point.x -= GetSystemMetrics(SM_XVIRTUALSCREEN);
> +           point.y -= GetSystemMetrics(SM_YVIRTUALSCREEN);
> + 
>             /* Deliver absolute cursor position to X Server */
>             miPointerAbsoluteCursor (point.x, point.y,
>                                      g_c32LastInputEventTime = GetTickCount ());
> *************** winCreateWindowsWindow (WindowPtr pWin)
> *** 1358,1363 ****
> --- 1377,1386 ----
>     iX = pWin->drawable.x;
>     iY = pWin->drawable.y;
>     
> +   /* Map from root coord (0,0) to screen (-X, -Y) */
> +   iX += GetSystemMetrics(SM_XVIRTUALSCREEN);
> +   iY += GetSystemMetrics(SM_YVIRTUALSCREEN);
> + 
>     iWidth = pWin->drawable.width;
>     iHeight = pWin->drawable.height;
>     
> 
> 
> ------------------------------------------------------------------------
> 
> 



More information about the Cygwin-xfree mailing list