| @@ -1328,7 +1328,7 @@ bool Component::contains (Point<int> point) | |||||
| if (flags.hasHeavyweightPeerFlag) | if (flags.hasHeavyweightPeerFlag) | ||||
| if (const ComponentPeer* const peer = getPeer()) | if (const ComponentPeer* const peer = getPeer()) | ||||
| return peer->contains (point, true); | |||||
| return peer->contains (ComponentHelpers::localPositionToRawPeerPos (*this, point), true); | |||||
| } | } | ||||
| return false; | return false; | ||||
| @@ -234,12 +234,12 @@ public: | |||||
| view.callIntMethod (ComponentPeerView.getTop)); | view.callIntMethod (ComponentPeerView.getTop)); | ||||
| } | } | ||||
| Point<int> localToGlobal (const Point<int>& relativePosition) override | |||||
| Point<int> localToGlobal (Point<int> relativePosition) override | |||||
| { | { | ||||
| return relativePosition + getScreenPosition(); | return relativePosition + getScreenPosition(); | ||||
| } | } | ||||
| Point<int> globalToLocal (const Point<int>& screenPosition) override | |||||
| Point<int> globalToLocal (Point<int> screenPosition) override | |||||
| { | { | ||||
| return screenPosition - getScreenPosition(); | return screenPosition - getScreenPosition(); | ||||
| } | } | ||||
| @@ -279,12 +279,12 @@ public: | |||||
| // n/a | // n/a | ||||
| } | } | ||||
| bool contains (const Point<int>& position, bool trueIfInAChildWindow) const override | |||||
| bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override | |||||
| { | { | ||||
| return isPositiveAndBelow (position.x, component.getWidth()) | |||||
| && isPositiveAndBelow (position.y, component.getHeight()) | |||||
| return isPositiveAndBelow (localPos.x, component.getWidth()) | |||||
| && isPositiveAndBelow (localPos.y, component.getHeight()) | |||||
| && ((! trueIfInAChildWindow) || view.callBooleanMethod (ComponentPeerView.containsPoint, | && ((! trueIfInAChildWindow) || view.callBooleanMethod (ComponentPeerView.containsPoint, | ||||
| position.x, position.y)); | |||||
| localPos.x, localPos.y)); | |||||
| } | } | ||||
| BorderSize<int> getFrameSize() const override | BorderSize<int> getFrameSize() const override | ||||
| @@ -137,14 +137,14 @@ public: | |||||
| Rectangle<int> getBounds() const override; | Rectangle<int> getBounds() const override; | ||||
| Rectangle<int> getBounds (bool global) const; | Rectangle<int> getBounds (bool global) const; | ||||
| Point<int> localToGlobal (const Point<int>& relativePosition) override; | |||||
| Point<int> globalToLocal (const Point<int>& screenPosition) override; | |||||
| Point<int> localToGlobal (Point<int> relativePosition) override; | |||||
| Point<int> globalToLocal (Point<int> screenPosition) override; | |||||
| void setAlpha (float newAlpha) override; | void setAlpha (float newAlpha) override; | ||||
| void setMinimised (bool shouldBeMinimised) override; | void setMinimised (bool shouldBeMinimised) override; | ||||
| bool isMinimised() const override; | bool isMinimised() const override; | ||||
| void setFullScreen (bool shouldBeFullScreen) override; | void setFullScreen (bool shouldBeFullScreen) override; | ||||
| bool isFullScreen() const override; | bool isFullScreen() const override; | ||||
| bool contains (const Point<int>& position, bool trueIfInAChildWindow) const override; | |||||
| bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override; | |||||
| BorderSize<int> getFrameSize() const override; | BorderSize<int> getFrameSize() const override; | ||||
| bool setAlwaysOnTop (bool alwaysOnTop) override; | bool setAlwaysOnTop (bool alwaysOnTop) override; | ||||
| void toFront (bool makeActiveWindow) override; | void toFront (bool makeActiveWindow) override; | ||||
| @@ -569,12 +569,12 @@ Rectangle<int> UIViewComponentPeer::getBounds() const | |||||
| return getBounds (! isSharedWindow); | return getBounds (! isSharedWindow); | ||||
| } | } | ||||
| Point<int> UIViewComponentPeer::localToGlobal (const Point<int>& relativePosition) | |||||
| Point<int> UIViewComponentPeer::localToGlobal (Point<int> relativePosition) | |||||
| { | { | ||||
| return relativePosition + getBounds (true).getPosition(); | return relativePosition + getBounds (true).getPosition(); | ||||
| } | } | ||||
| Point<int> UIViewComponentPeer::globalToLocal (const Point<int>& screenPosition) | |||||
| Point<int> UIViewComponentPeer::globalToLocal (Point<int> screenPosition) | |||||
| { | { | ||||
| return screenPosition - getBounds (true).getPosition(); | return screenPosition - getBounds (true).getPosition(); | ||||
| } | } | ||||
| @@ -679,12 +679,12 @@ void UIViewComponentPeer::updateTransformAndScreenBounds() | |||||
| [view setNeedsDisplay]; | [view setNeedsDisplay]; | ||||
| } | } | ||||
| bool UIViewComponentPeer::contains (const Point<int>& position, bool trueIfInAChildWindow) const | |||||
| bool UIViewComponentPeer::contains (Point<int> localPos, bool trueIfInAChildWindow) const | |||||
| { | { | ||||
| if (! component.getLocalBounds().contains (position)) | |||||
| if (! component.getLocalBounds().contains (localPos)) | |||||
| return false; | return false; | ||||
| UIView* v = [view hitTest: convertToCGPoint (position) | |||||
| UIView* v = [view hitTest: convertToCGPoint (localPos) | |||||
| withEvent: nil]; | withEvent: nil]; | ||||
| if (trueIfInAChildWindow) | if (trueIfInAChildWindow) | ||||
| @@ -967,12 +967,12 @@ public: | |||||
| Rectangle<int> getBounds() const override { return bounds; } | Rectangle<int> getBounds() const override { return bounds; } | ||||
| Point<int> localToGlobal (const Point<int>& relativePosition) override | |||||
| Point<int> localToGlobal (Point<int> relativePosition) override | |||||
| { | { | ||||
| return relativePosition + bounds.getPosition(); | return relativePosition + bounds.getPosition(); | ||||
| } | } | ||||
| Point<int> globalToLocal (const Point<int>& screenPosition) override | |||||
| Point<int> globalToLocal (Point<int> screenPosition) override | |||||
| { | { | ||||
| return screenPosition - bounds.getPosition(); | return screenPosition - bounds.getPosition(); | ||||
| } | } | ||||
| @@ -1088,9 +1088,9 @@ public: | |||||
| return result; | return result; | ||||
| } | } | ||||
| bool contains (const Point<int>& position, bool trueIfInAChildWindow) const override | |||||
| bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override | |||||
| { | { | ||||
| if (! bounds.withZeroOrigin().contains (position)) | |||||
| if (! bounds.withZeroOrigin().contains (localPos)) | |||||
| return false; | return false; | ||||
| for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) | for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) | ||||
| @@ -1100,7 +1100,8 @@ public: | |||||
| if (c == &component) | if (c == &component) | ||||
| break; | break; | ||||
| if (c->contains (position + bounds.getPosition() - c->getScreenPosition())) | |||||
| // TODO: needs scaling correctly | |||||
| if (c->contains (localPos + bounds.getPosition() - c->getScreenPosition())) | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -1114,7 +1115,7 @@ public: | |||||
| ScopedXLock xlock; | ScopedXLock xlock; | ||||
| return XGetGeometry (display, (::Drawable) windowH, &root, &wx, &wy, &ww, &wh, &bw, &depth) | return XGetGeometry (display, (::Drawable) windowH, &root, &wx, &wy, &ww, &wh, &bw, &depth) | ||||
| && XTranslateCoordinates (display, windowH, windowH, position.getX(), position.getY(), &wx, &wy, &child) | |||||
| && XTranslateCoordinates (display, windowH, windowH, localPos.getX(), localPos.getY(), &wx, &wy, &child) | |||||
| && child == None; | && child == None; | ||||
| } | } | ||||
| @@ -278,12 +278,12 @@ public: | |||||
| return getBounds (! isSharedWindow); | return getBounds (! isSharedWindow); | ||||
| } | } | ||||
| Point<int> localToGlobal (const Point<int>& relativePosition) override | |||||
| Point<int> localToGlobal (Point<int> relativePosition) override | |||||
| { | { | ||||
| return relativePosition + getBounds (true).getPosition(); | return relativePosition + getBounds (true).getPosition(); | ||||
| } | } | ||||
| Point<int> globalToLocal (const Point<int>& screenPosition) override | |||||
| Point<int> globalToLocal (Point<int> screenPosition) override | |||||
| { | { | ||||
| return screenPosition - getBounds (true).getPosition(); | return screenPosition - getBounds (true).getPosition(); | ||||
| } | } | ||||
| @@ -363,16 +363,16 @@ public: | |||||
| return fullScreen; | return fullScreen; | ||||
| } | } | ||||
| bool contains (const Point<int>& position, bool trueIfInAChildWindow) const override | |||||
| bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override | |||||
| { | { | ||||
| if (! (isPositiveAndBelow (position.getX(), component.getWidth()) | |||||
| && isPositiveAndBelow (position.getY(), component.getHeight()))) | |||||
| if (! (isPositiveAndBelow (localPos.getX(), component.getWidth()) | |||||
| && isPositiveAndBelow (localPos.getY(), component.getHeight()))) | |||||
| return false; | return false; | ||||
| NSRect frameRect = [view frame]; | NSRect frameRect = [view frame]; | ||||
| NSView* v = [view hitTest: NSMakePoint (frameRect.origin.x + position.getX(), | |||||
| frameRect.origin.y + frameRect.size.height - position.getY())]; | |||||
| NSView* v = [view hitTest: NSMakePoint (frameRect.origin.x + localPos.getX(), | |||||
| frameRect.origin.y + frameRect.size.height - localPos.getY())]; | |||||
| return trueIfInAChildWindow ? (v != nil) | return trueIfInAChildWindow ? (v != nil) | ||||
| : (v == view); | : (v == view); | ||||
| @@ -146,6 +146,13 @@ static void setWindowPos (HWND hwnd, Rectangle<int> bounds, UINT flags) | |||||
| SetWindowPos (hwnd, 0, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), flags); | SetWindowPos (hwnd, 0, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), flags); | ||||
| } | } | ||||
| static RECT getWindowRect (HWND hwnd) | |||||
| { | |||||
| RECT r; | |||||
| GetWindowRect (hwnd, &r); | |||||
| return r; | |||||
| } | |||||
| static void setWindowZOrder (HWND hwnd, HWND insertAfter) | static void setWindowZOrder (HWND hwnd, HWND insertAfter) | ||||
| { | { | ||||
| SetWindowPos (hwnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING); | SetWindowPos (hwnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING); | ||||
| @@ -350,8 +357,7 @@ public: | |||||
| if (transparent) | if (transparent) | ||||
| { | { | ||||
| RECT windowBounds; | |||||
| GetWindowRect (hwnd, &windowBounds); | |||||
| RECT windowBounds = getWindowRect (hwnd); | |||||
| POINT p = { -x, -y }; | POINT p = { -x, -y }; | ||||
| POINT pos = { windowBounds.left, windowBounds.top }; | POINT pos = { windowBounds.left, windowBounds.top }; | ||||
| @@ -591,12 +597,10 @@ public: | |||||
| info.cbSize = sizeof (info); | info.cbSize = sizeof (info); | ||||
| if (GetWindowInfo (hwnd, &info)) | if (GetWindowInfo (hwnd, &info)) | ||||
| { | |||||
| windowBorder = BorderSize<int> (info.rcClient.top - info.rcWindow.top, | windowBorder = BorderSize<int> (info.rcClient.top - info.rcWindow.top, | ||||
| info.rcClient.left - info.rcWindow.left, | info.rcClient.left - info.rcWindow.left, | ||||
| info.rcWindow.bottom - info.rcClient.bottom, | info.rcWindow.bottom - info.rcClient.bottom, | ||||
| info.rcWindow.right - info.rcClient.right); | info.rcWindow.right - info.rcClient.right); | ||||
| } | |||||
| #if JUCE_DIRECT2D | #if JUCE_DIRECT2D | ||||
| if (direct2DContext != nullptr) | if (direct2DContext != nullptr) | ||||
| @@ -614,8 +618,7 @@ public: | |||||
| { | { | ||||
| if (HWND parentHwnd = GetParent (hwnd)) | if (HWND parentHwnd = GetParent (hwnd)) | ||||
| { | { | ||||
| RECT parentRect; | |||||
| GetWindowRect (parentHwnd, &parentRect); | |||||
| RECT parentRect = getWindowRect (parentHwnd); | |||||
| newBounds.translate (parentRect.left, parentRect.top); | newBounds.translate (parentRect.left, parentRect.top); | ||||
| } | } | ||||
| } | } | ||||
| @@ -640,13 +643,11 @@ public: | |||||
| Rectangle<int> getBounds() const override | Rectangle<int> getBounds() const override | ||||
| { | { | ||||
| RECT r; | |||||
| GetWindowRect (hwnd, &r); | |||||
| Rectangle<int> bounds (rectangleFromRECT (r)); | |||||
| Rectangle<int> bounds (rectangleFromRECT (getWindowRect (hwnd))); | |||||
| if (HWND parentH = GetParent (hwnd)) | if (HWND parentH = GetParent (hwnd)) | ||||
| { | { | ||||
| GetWindowRect (parentH, &r); | |||||
| RECT r = getWindowRect (parentH); | |||||
| bounds.translate (-r.left, -r.top); | bounds.translate (-r.left, -r.top); | ||||
| } | } | ||||
| @@ -655,21 +656,14 @@ public: | |||||
| Point<int> getScreenPosition() const | Point<int> getScreenPosition() const | ||||
| { | { | ||||
| RECT r; | |||||
| GetWindowRect (hwnd, &r); | |||||
| RECT r = getWindowRect (hwnd); | |||||
| return Point<int> (r.left + windowBorder.getLeft(), | return Point<int> (r.left + windowBorder.getLeft(), | ||||
| r.top + windowBorder.getTop()); | |||||
| r.top + windowBorder.getTop()); | |||||
| } | } | ||||
| Point<int> localToGlobal (const Point<int>& relativePosition) override | |||||
| { | |||||
| return relativePosition + getScreenPosition(); | |||||
| } | |||||
| Point<int> globalToLocal (const Point<int>& screenPosition) override | |||||
| { | |||||
| return screenPosition - getScreenPosition(); | |||||
| } | |||||
| Point<int> localToGlobal (Point<int> relativePosition) override { return relativePosition + getScreenPosition(); } | |||||
| Point<int> globalToLocal (Point<int> screenPosition) override { return screenPosition - getScreenPosition(); } | |||||
| void setAlpha (float newAlpha) override | void setAlpha (float newAlpha) override | ||||
| { | { | ||||
| @@ -754,10 +748,13 @@ public: | |||||
| return wp.showCmd == SW_SHOWMAXIMIZED; | return wp.showCmd == SW_SHOWMAXIMIZED; | ||||
| } | } | ||||
| bool isWindowAtPoint (const Point<int>& localPos, bool trueIfInAChildWindow) const | |||||
| bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override | |||||
| { | { | ||||
| RECT r; | |||||
| GetWindowRect (hwnd, &r); | |||||
| RECT r = getWindowRect (hwnd); | |||||
| if (! (isPositiveAndBelow (localPos.x, (int) (r.right - r.left)) | |||||
| && isPositiveAndBelow (localPos.y, (int) (r.bottom - r.top)))) | |||||
| return false; | |||||
| POINT p = { localPos.x + r.left + windowBorder.getLeft(), | POINT p = { localPos.x + r.left + windowBorder.getLeft(), | ||||
| localPos.y + r.top + windowBorder.getTop() }; | localPos.y + r.top + windowBorder.getTop() }; | ||||
| @@ -766,13 +763,6 @@ public: | |||||
| return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0)); | return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0)); | ||||
| } | } | ||||
| bool contains (const Point<int>& position, bool trueIfInAChildWindow) const override | |||||
| { | |||||
| return isPositiveAndBelow (position.x, component.getWidth()) | |||||
| && isPositiveAndBelow (position.y, component.getHeight()) | |||||
| && isWindowAtPoint (position, trueIfInAChildWindow); | |||||
| } | |||||
| BorderSize<int> getFrameSize() const override | BorderSize<int> getFrameSize() const override | ||||
| { | { | ||||
| return windowBorder; | return windowBorder; | ||||
| @@ -1422,8 +1412,7 @@ private: | |||||
| if (parent == ((EnumWindowsInfo*) context)->peer->hwnd) | if (parent == ((EnumWindowsInfo*) context)->peer->hwnd) | ||||
| { | { | ||||
| RECT r; | |||||
| GetWindowRect (hwnd, &r); | |||||
| RECT r = getWindowRect (hwnd); | |||||
| POINT pos = { r.left, r.top }; | POINT pos = { r.left, r.top }; | ||||
| ScreenToClient (GetParent (hwnd), &pos); | ScreenToClient (GetParent (hwnd), &pos); | ||||
| @@ -1495,8 +1484,7 @@ private: | |||||
| // it's not possible to have a transparent window with a title bar at the moment! | // it's not possible to have a transparent window with a title bar at the moment! | ||||
| jassert (! hasTitleBar()); | jassert (! hasTitleBar()); | ||||
| RECT r; | |||||
| GetWindowRect (hwnd, &r); | |||||
| RECT r = getWindowRect (hwnd); | |||||
| x = y = 0; | x = y = 0; | ||||
| w = r.right - r.left; | w = r.right - r.left; | ||||
| h = r.bottom - r.top; | h = r.bottom - r.top; | ||||
| @@ -2348,7 +2336,7 @@ private: | |||||
| case WM_WINDOWPOSCHANGED: | case WM_WINDOWPOSCHANGED: | ||||
| { | { | ||||
| const Point<int> pos (getCurrentMousePos()); | const Point<int> pos (getCurrentMousePos()); | ||||
| if (isWindowAtPoint (pos, false)) | |||||
| if (contains (pos, false)) | |||||
| doMouseEvent (pos); | doMouseEvent (pos); | ||||
| } | } | ||||
| @@ -3207,11 +3195,7 @@ void Desktop::Displays::findDisplays (float masterScale) | |||||
| monitors.swap (i, 0); | monitors.swap (i, 0); | ||||
| if (monitors.size() == 0) | if (monitors.size() == 0) | ||||
| { | |||||
| RECT r; | |||||
| GetWindowRect (GetDesktopWindow(), &r); | |||||
| monitors.add (rectangleFromRECT (r)); | |||||
| } | |||||
| monitors.add (rectangleFromRECT (getWindowRect (GetDesktopWindow()))); | |||||
| RECT workArea; | RECT workArea; | ||||
| SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0); | SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0); | ||||
| @@ -154,13 +154,13 @@ public: | |||||
| virtual Rectangle<int> getBounds() const = 0; | virtual Rectangle<int> getBounds() const = 0; | ||||
| /** Converts a position relative to the top-left of this component to screen coordinates. */ | /** Converts a position relative to the top-left of this component to screen coordinates. */ | ||||
| virtual Point<int> localToGlobal (const Point<int>& relativePosition) = 0; | |||||
| virtual Point<int> localToGlobal (Point<int> relativePosition) = 0; | |||||
| /** Converts a rectangle relative to the top-left of this component to screen coordinates. */ | /** Converts a rectangle relative to the top-left of this component to screen coordinates. */ | ||||
| virtual Rectangle<int> localToGlobal (const Rectangle<int>& relativePosition); | virtual Rectangle<int> localToGlobal (const Rectangle<int>& relativePosition); | ||||
| /** Converts a screen coordinate to a position relative to the top-left of this component. */ | /** Converts a screen coordinate to a position relative to the top-left of this component. */ | ||||
| virtual Point<int> globalToLocal (const Point<int>& screenPosition) = 0; | |||||
| virtual Point<int> globalToLocal (Point<int> screenPosition) = 0; | |||||
| /** Converts a screen area to a position relative to the top-left of this component. */ | /** Converts a screen area to a position relative to the top-left of this component. */ | ||||
| virtual Rectangle<int> globalToLocal (const Rectangle<int>& screenPosition); | virtual Rectangle<int> globalToLocal (const Rectangle<int>& screenPosition); | ||||
| @@ -201,11 +201,11 @@ public: | |||||
| /** Checks if a point is in the window. | /** Checks if a point is in the window. | ||||
| Coordinates are relative to the top-left of this window. If trueIfInAChildWindow | |||||
| is false, then this returns false if the point is actually inside a child of this | |||||
| window. | |||||
| The position is relative to the top-left of this window, in unscaled peer coordinates. | |||||
| If trueIfInAChildWindow is false, then this returns false if the point is actually | |||||
| inside a child of this window. | |||||
| */ | */ | ||||
| virtual bool contains (const Point<int>& position, bool trueIfInAChildWindow) const = 0; | |||||
| virtual bool contains (Point<int> localPos, bool trueIfInAChildWindow) const = 0; | |||||
| /** Returns the size of the window frame that's around this window. | /** Returns the size of the window frame that's around this window. | ||||
| Whether or not the window has a normal window frame depends on the flags | Whether or not the window has a normal window frame depends on the flags | ||||