diff options
author | nijtmans@users.sourceforge.net <jan.nijtmans> | 2012-05-02 11:39:29 (GMT) |
---|---|---|
committer | nijtmans@users.sourceforge.net <jan.nijtmans> | 2012-05-02 11:39:29 (GMT) |
commit | 9526bea30e427e6448f077367815f83345a6b82e (patch) | |
tree | c12fa65a444645b8f89feba3bddeef8e4b31542b | |
parent | 95f2774691cf918952fea1304ad9855ab92f1dad (diff) | |
parent | 6f5c15a19cfde23dcdf2fa157717f1f367ab4d29 (diff) | |
download | tk-9526bea30e427e6448f077367815f83345a6b82e.zip tk-9526bea30e427e6448f077367815f83345a6b82e.tar.gz tk-9526bea30e427e6448f077367815f83345a6b82e.tar.bz2 |
[Bug 533519]: Window placement with multiple screens
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | generic/tkBind.c | 20 | ||||
-rw-r--r-- | generic/tkFocus.c | 8 | ||||
-rw-r--r-- | generic/tkMenuDraw.c | 28 | ||||
-rw-r--r-- | generic/tkStubInit.c | 6 | ||||
-rw-r--r-- | library/tk.tcl | 4 | ||||
-rw-r--r-- | win/tkWinWm.c | 18 |
7 files changed, 30 insertions, 62 deletions
@@ -1,3 +1,11 @@ +2012-05-02 Jan Nijtmans <nijtmans@users.sf.net> + + * library/tk.tcl: [Bug 533519]: Window placement with multiple screens + * generic/tkBind.c: + * generic/tkFocus.c: + * generic/tkMenuDraw.c: + * generic/tkWinWm.c: + 2012-04-26 Donal K. Fellows <dkf@users.sf.net> * generic/tkStubInit.c (Tk_GetHINSTANCE): Ensure that this is defined diff --git a/generic/tkBind.c b/generic/tkBind.c index abdee59..21bfb5c 100644 --- a/generic/tkBind.c +++ b/generic/tkBind.c @@ -2581,33 +2581,13 @@ ExpandPercents( } case 'X': if (flags & KEY_BUTTON_MOTION_CROSSING) { - Tk_Window tkwin; - int x, y; - int width, height; - number = eventPtr->xkey.x_root; - tkwin = Tk_IdToWindow(eventPtr->xany.display, - eventPtr->xany.window); - if (tkwin != NULL) { - Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height); - number -= x; - } goto doNumber; } goto doString; case 'Y': if (flags & KEY_BUTTON_MOTION_CROSSING) { - Tk_Window tkwin; - int x, y; - int width, height; - number = eventPtr->xkey.y_root; - tkwin = Tk_IdToWindow(eventPtr->xany.display, - eventPtr->xany.window); - if (tkwin != NULL) { - Tk_GetVRootGeometry(tkwin, &x, &y, &width, &height); - number -= y; - } goto doNumber; } goto doString; diff --git a/generic/tkFocus.c b/generic/tkFocus.c index 42d8be3..4814c17 100644 --- a/generic/tkFocus.c +++ b/generic/tkFocus.c @@ -725,7 +725,7 @@ TkFocusKeyEvent( { DisplayFocusInfo *displayFocusPtr; TkWindow *focusWinPtr; - int focusX, focusY, vRootX, vRootY, vRootWidth, vRootHeight; + int focusX, focusY; displayFocusPtr = FindDisplayFocusInfo(winPtr->mainPtr, winPtr->dispPtr); focusWinPtr = displayFocusPtr->focusWinPtr; @@ -758,11 +758,9 @@ TkFocusKeyEvent( eventPtr->xkey.x = -1; eventPtr->xkey.y = -1; } else { - Tk_GetVRootGeometry((Tk_Window) focusWinPtr, &vRootX, &vRootY, - &vRootWidth, &vRootHeight); Tk_GetRootCoords((Tk_Window) focusWinPtr, &focusX, &focusY); - eventPtr->xkey.x = eventPtr->xkey.x_root - vRootX - focusX; - eventPtr->xkey.y = eventPtr->xkey.y_root - vRootY - focusY; + eventPtr->xkey.x = eventPtr->xkey.x_root - focusX; + eventPtr->xkey.y = eventPtr->xkey.y_root - focusY; } eventPtr->xkey.window = focusWinPtr->window; return focusWinPtr; diff --git a/generic/tkMenuDraw.c b/generic/tkMenuDraw.c index d2a66d3..65aa591 100644 --- a/generic/tkMenuDraw.c +++ b/generic/tkMenuDraw.c @@ -844,7 +844,7 @@ TkPostTearoffMenu( * posting */ { int vRootX, vRootY, vRootWidth, vRootHeight; - int tmp, result; + int result; TkActivateMenuEntry(menuPtr, -1); TkRecomputeMenu(menuPtr); @@ -877,31 +877,21 @@ TkPostTearoffMenu( * 2. The menu may not have been mapped yet, so its current size might be * the default 1x1. To compute how much space it needs, use its * requested size, not its actual size. - * - * Note that this code assumes square screen regions and all positive - * coordinates. This does not work on a Mac with multiple monitors. But - * then again, Tk has other problems with this. */ Tk_GetVRootGeometry(Tk_Parent(menuPtr->tkwin), &vRootX, &vRootY, &vRootWidth, &vRootHeight); - x += vRootX; - y += vRootY; - tmp = WidthOfScreen(Tk_Screen(menuPtr->tkwin)) - - Tk_ReqWidth(menuPtr->tkwin); - if (x > tmp) { - x = tmp; + if (x > vRootX + vRootWidth) { + x = vRootX + vRootWidth; } - if (x < 0) { - x = 0; + if (x < vRootX) { + x = vRootX; } - tmp = HeightOfScreen(Tk_Screen(menuPtr->tkwin)) - - Tk_ReqHeight(menuPtr->tkwin); - if (y > tmp) { - y = tmp; + if (y > vRootY + vRootHeight) { + y = vRootY + vRootHeight; } - if (y < 0) { - y = 0; + if (y < vRootY) { + y = vRootY; } Tk_MoveToplevelWindow(menuPtr->tkwin, x, y); if (!Tk_IsMapped(menuPtr->tkwin)) { diff --git a/generic/tkStubInit.c b/generic/tkStubInit.c index 6af8946..02038a8 100644 --- a/generic/tkStubInit.c +++ b/generic/tkStubInit.c @@ -94,6 +94,12 @@ static void *Tk_GetHINSTANCE() (const char *) &tkIntStubs, &hInstance); return hInstance; } + /* TODO: To be implemented for Cygwin */ +# define Tk_AttachHWND 0 +# define Tk_GetHWND 0 +# define Tk_HWNDToWindow 0 +# define Tk_PointerEvent 0 +# define Tk_TranslateWinEvent 0 # else /* !__CYGWIN__ */ # define TkPutImage 0 diff --git a/library/tk.tcl b/library/tk.tcl index a852a0b..b43b56a 100644 --- a/library/tk.tcl +++ b/library/tk.tcl @@ -112,10 +112,6 @@ proc ::tk::PlaceWindow {w {place ""} {anchor ""}} { set y [expr {([winfo screenheight $w]-[winfo reqheight $w])/2}] set checkBounds 0 } - if {[tk windowingsystem] eq "win32"} { - # Bug 533519: win32 multiple desktops may produce negative geometry. - set checkBounds 0 - } if {$checkBounds} { if {$x < [winfo vrootx $w]} { set x [winfo vrootx $w] diff --git a/win/tkWinWm.c b/win/tkWinWm.c index 2df9b2e..8a9b2af 100644 --- a/win/tkWinWm.c +++ b/win/tkWinWm.c @@ -6482,20 +6482,10 @@ Tk_GetVRootGeometry( int *widthPtr, int *heightPtr) /* Store dimensions of virtual root here. */ { - TkWindow *winPtr = (TkWindow *) tkwin; - - /* - * XXX: This is not correct for multiple monitors. There may be many - * changes required to get this right, and it may effect existing - * applications that don't consider possible <0 vroot. See - * http://msdn.microsoft.com/library/en-us/gdi/monitor_3lrn.asp for more - * info. - */ - - *xPtr = 0; - *yPtr = 0; - *widthPtr = DisplayWidth(winPtr->display, winPtr->screenNum); - *heightPtr = DisplayHeight(winPtr->display, winPtr->screenNum); + *xPtr = GetSystemMetrics(SM_XVIRTUALSCREEN); + *yPtr = GetSystemMetrics(SM_YVIRTUALSCREEN); + *widthPtr = GetSystemMetrics(SM_CXVIRTUALSCREEN); + *heightPtr = GetSystemMetrics(SM_CYVIRTUALSCREEN); } /* |