| @@ -275,6 +275,18 @@ struct ScalingHelpers | |||||
| static Rectangle<int> subtractPosition (Rectangle<int> p, const Component& c) noexcept { return p - c.getPosition(); } | static Rectangle<int> subtractPosition (Rectangle<int> p, const Component& c) noexcept { return p - c.getPosition(); } | ||||
| static Point<float> subtractPosition (Point<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } | static Point<float> subtractPosition (Point<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } | ||||
| static Rectangle<float> subtractPosition (Rectangle<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } | static Rectangle<float> subtractPosition (Rectangle<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } | ||||
| static Point<float> screenPosToLocalPos (Component& comp, Point<float> pos) | |||||
| { | |||||
| if (auto* peer = comp.getPeer()) | |||||
| { | |||||
| pos = peer->globalToLocal (pos); | |||||
| auto& peerComp = peer->getComponent(); | |||||
| return comp.getLocalPoint (&peerComp, unscaledScreenPosToScaled (peerComp, pos)); | |||||
| } | |||||
| return comp.getLocalPoint (nullptr, unscaledScreenPosToScaled (comp, pos)); | |||||
| } | |||||
| }; | }; | ||||
| static const char colourPropertyPrefix[] = "jcclr_"; | static const char colourPropertyPrefix[] = "jcclr_"; | ||||
| @@ -57,18 +57,6 @@ public: | |||||
| return lastPeer; | return lastPeer; | ||||
| } | } | ||||
| static Point<float> screenPosToLocalPos (Component& comp, Point<float> pos) | |||||
| { | |||||
| if (auto* peer = comp.getPeer()) | |||||
| { | |||||
| pos = peer->globalToLocal (pos); | |||||
| auto& peerComp = peer->getComponent(); | |||||
| return comp.getLocalPoint (&peerComp, ScalingHelpers::unscaledScreenPosToScaled (peerComp, pos)); | |||||
| } | |||||
| return comp.getLocalPoint (nullptr, ScalingHelpers::unscaledScreenPosToScaled (comp, pos)); | |||||
| } | |||||
| Component* findComponentAt (Point<float> screenPos) | Component* findComponentAt (Point<float> screenPos) | ||||
| { | { | ||||
| if (auto* peer = getPeer()) | if (auto* peer = getPeer()) | ||||
| @@ -106,7 +94,7 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| #if JUCE_DUMP_MOUSE_EVENTS | #if JUCE_DUMP_MOUSE_EVENTS | ||||
| #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) DBG ("Mouse " << desc << " #" << index \ | #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) DBG ("Mouse " << desc << " #" << index \ | ||||
| << ": " << screenPosToLocalPos (comp, screenPos).toString() \ | |||||
| << ": " << ScalingHelpers::screenPosToLocalPos (comp, screenPos).toString() \ | |||||
| << " - Comp: " << String::toHexString ((pointer_sized_int) &comp)); | << " - Comp: " << String::toHexString ((pointer_sized_int) &comp)); | ||||
| #else | #else | ||||
| #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) | #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) | ||||
| @@ -115,26 +103,26 @@ public: | |||||
| void sendMouseEnter (Component& comp, const PointerState& pointerState, Time time) | void sendMouseEnter (Component& comp, const PointerState& pointerState, Time time) | ||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("enter", pointerState.position) | JUCE_MOUSE_EVENT_DBG ("enter", pointerState.position) | ||||
| comp.internalMouseEnter (MouseInputSource (this), screenPosToLocalPos (comp, pointerState.position), time); | |||||
| comp.internalMouseEnter (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time); | |||||
| } | } | ||||
| void sendMouseExit (Component& comp, const PointerState& pointerState, Time time) | void sendMouseExit (Component& comp, const PointerState& pointerState, Time time) | ||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("exit", pointerState.position) | JUCE_MOUSE_EVENT_DBG ("exit", pointerState.position) | ||||
| comp.internalMouseExit (MouseInputSource (this), screenPosToLocalPos (comp, pointerState.position), time); | |||||
| comp.internalMouseExit (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time); | |||||
| } | } | ||||
| void sendMouseMove (Component& comp, const PointerState& pointerState, Time time) | void sendMouseMove (Component& comp, const PointerState& pointerState, Time time) | ||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("move", pointerState.position) | JUCE_MOUSE_EVENT_DBG ("move", pointerState.position) | ||||
| comp.internalMouseMove (MouseInputSource (this), screenPosToLocalPos (comp, pointerState.position), time); | |||||
| comp.internalMouseMove (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time); | |||||
| } | } | ||||
| void sendMouseDown (Component& comp, const PointerState& pointerState, Time time) | void sendMouseDown (Component& comp, const PointerState& pointerState, Time time) | ||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("down", pointerState.position) | JUCE_MOUSE_EVENT_DBG ("down", pointerState.position) | ||||
| comp.internalMouseDown (MouseInputSource (this), | comp.internalMouseDown (MouseInputSource (this), | ||||
| pointerState.withPosition (screenPosToLocalPos (comp, pointerState.position)), | |||||
| pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)), | |||||
| time); | time); | ||||
| } | } | ||||
| @@ -142,7 +130,7 @@ public: | |||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("drag", pointerState.position) | JUCE_MOUSE_EVENT_DBG ("drag", pointerState.position) | ||||
| comp.internalMouseDrag (MouseInputSource (this), | comp.internalMouseDrag (MouseInputSource (this), | ||||
| pointerState.withPosition (screenPosToLocalPos (comp, pointerState.position)), | |||||
| pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)), | |||||
| time); | time); | ||||
| } | } | ||||
| @@ -150,7 +138,7 @@ public: | |||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("up", pointerState.position) | JUCE_MOUSE_EVENT_DBG ("up", pointerState.position) | ||||
| comp.internalMouseUp (MouseInputSource (this), | comp.internalMouseUp (MouseInputSource (this), | ||||
| pointerState.withPosition (screenPosToLocalPos (comp, pointerState.position)), | |||||
| pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)), | |||||
| time, | time, | ||||
| oldMods); | oldMods); | ||||
| } | } | ||||
| @@ -158,13 +146,13 @@ public: | |||||
| void sendMouseWheel (Component& comp, Point<float> screenPos, Time time, const MouseWheelDetails& wheel) | void sendMouseWheel (Component& comp, Point<float> screenPos, Time time, const MouseWheelDetails& wheel) | ||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("wheel", screenPos) | JUCE_MOUSE_EVENT_DBG ("wheel", screenPos) | ||||
| comp.internalMouseWheel (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, wheel); | |||||
| comp.internalMouseWheel (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, wheel); | |||||
| } | } | ||||
| void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, float amount) | void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, float amount) | ||||
| { | { | ||||
| JUCE_MOUSE_EVENT_DBG ("magnify", screenPos) | JUCE_MOUSE_EVENT_DBG ("magnify", screenPos) | ||||
| comp.internalMagnifyGesture (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, amount); | |||||
| comp.internalMagnifyGesture (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, amount); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -1458,7 +1458,7 @@ public: | |||||
| return [NSArray arrayWithObjects: type, (NSString*) kPasteboardTypeFileURLPromise, NSPasteboardTypeString, nil]; | return [NSArray arrayWithObjects: type, (NSString*) kPasteboardTypeFileURLPromise, NSPasteboardTypeString, nil]; | ||||
| } | } | ||||
| BOOL sendDragCallback (const int type, id <NSDraggingInfo> sender) | |||||
| BOOL sendDragCallback (bool (ComponentPeer::* callback) (const DragInfo&), id <NSDraggingInfo> sender) | |||||
| { | { | ||||
| NSPasteboard* pasteboard = [sender draggingPasteboard]; | NSPasteboard* pasteboard = [sender draggingPasteboard]; | ||||
| NSString* contentType = [pasteboard availableTypeFromArray: getSupportedDragTypes()]; | NSString* contentType = [pasteboard availableTypeFromArray: getSupportedDragTypes()]; | ||||
| @@ -1466,9 +1466,10 @@ public: | |||||
| if (contentType == nil) | if (contentType == nil) | ||||
| return false; | return false; | ||||
| NSPoint p = [view convertPoint: [sender draggingLocation] fromView: nil]; | |||||
| const auto p = localToGlobal (convertToPointFloat ([view convertPoint: [sender draggingLocation] fromView: nil])); | |||||
| ComponentPeer::DragInfo dragInfo; | ComponentPeer::DragInfo dragInfo; | ||||
| dragInfo.position.setXY ((int) p.x, (int) p.y); | |||||
| dragInfo.position = ScalingHelpers::screenPosToLocalPos (component, p).roundToInt(); | |||||
| if (contentType == NSPasteboardTypeString) | if (contentType == NSPasteboardTypeString) | ||||
| dragInfo.text = nsStringToJuce ([pasteboard stringForType: NSPasteboardTypeString]); | dragInfo.text = nsStringToJuce ([pasteboard stringForType: NSPasteboardTypeString]); | ||||
| @@ -1476,15 +1477,7 @@ public: | |||||
| dragInfo.files = getDroppedFiles (pasteboard, contentType); | dragInfo.files = getDroppedFiles (pasteboard, contentType); | ||||
| if (! dragInfo.isEmpty()) | if (! dragInfo.isEmpty()) | ||||
| { | |||||
| switch (type) | |||||
| { | |||||
| case 0: return handleDragMove (dragInfo); | |||||
| case 1: return handleDragExit (dragInfo); | |||||
| case 2: return handleDragDrop (dragInfo); | |||||
| default: jassertfalse; break; | |||||
| } | |||||
| } | |||||
| return (this->*callback) (dragInfo); | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -2217,7 +2210,7 @@ private: | |||||
| static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender) | static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender) | ||||
| { | { | ||||
| if (auto* owner = getOwner (self)) | if (auto* owner = getOwner (self)) | ||||
| if (owner->sendDragCallback (0, sender)) | |||||
| if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender)) | |||||
| return NSDragOperationGeneric; | return NSDragOperationGeneric; | ||||
| return NSDragOperationNone; | return NSDragOperationNone; | ||||
| @@ -2230,7 +2223,7 @@ private: | |||||
| static void draggingExited (id self, SEL, id<NSDraggingInfo> sender) | static void draggingExited (id self, SEL, id<NSDraggingInfo> sender) | ||||
| { | { | ||||
| callOnOwner (self, &NSViewComponentPeer::sendDragCallback, 1, sender); | |||||
| callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender); | |||||
| } | } | ||||
| static BOOL prepareForDragOperation (id, SEL, id<NSDraggingInfo>) | static BOOL prepareForDragOperation (id, SEL, id<NSDraggingInfo>) | ||||
| @@ -2241,7 +2234,7 @@ private: | |||||
| static BOOL performDragOperation (id self, SEL, id<NSDraggingInfo> sender) | static BOOL performDragOperation (id self, SEL, id<NSDraggingInfo> sender) | ||||
| { | { | ||||
| auto* owner = getOwner (self); | auto* owner = getOwner (self); | ||||
| return owner != nullptr && owner->sendDragCallback (2, sender); | |||||
| return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender); | |||||
| } | } | ||||
| static void concludeDragOperation (id, SEL, id<NSDraggingInfo>) {} | static void concludeDragOperation (id, SEL, id<NSDraggingInfo>) {} | ||||
| @@ -2000,8 +2000,9 @@ public: | |||||
| private: | private: | ||||
| Point<float> getMousePos (POINTL mousePos) const | Point<float> getMousePos (POINTL mousePos) const | ||||
| { | { | ||||
| return peer.getComponent().getLocalPoint (nullptr, convertPhysicalScreenPointToLogical (pointFromPOINT ({ mousePos.x, mousePos.y }), | |||||
| (HWND) peer.getNativeHandle()).toFloat()); | |||||
| const auto originalPos = pointFromPOINT ({ mousePos.x, mousePos.y }); | |||||
| const auto logicalPos = convertPhysicalScreenPointToLogical (originalPos, peer.hwnd); | |||||
| return ScalingHelpers::screenPosToLocalPos (peer.component, logicalPos.toFloat()); | |||||
| } | } | ||||
| struct DroppedData | struct DroppedData | ||||
| @@ -156,9 +156,10 @@ public: | |||||
| if (windowH == 0) | if (windowH == 0) | ||||
| windowH = (::Window) peer->getNativeHandle(); | windowH = (::Window) peer->getNativeHandle(); | ||||
| auto dropPos = Desktop::getInstance().getDisplays().physicalToLogical (Point<int> ((int) clientMsg.data.l[2] >> 16, | |||||
| (int) clientMsg.data.l[2] & 0xffff)); | |||||
| dropPos -= peer->getBounds().getPosition(); | |||||
| const auto displays = Desktop::getInstance().getDisplays(); | |||||
| const auto logicalPos = displays.physicalToLogical (Point<int> ((int) clientMsg.data.l[2] >> 16, | |||||
| (int) clientMsg.data.l[2] & 0xffff)); | |||||
| const auto dropPos = ScalingHelpers::screenPosToLocalPos (peer->getComponent(), logicalPos.toFloat()).roundToInt(); | |||||
| const auto& atoms = getAtoms(); | const auto& atoms = getAtoms(); | ||||