42 const Display* foundDisplay =
nullptr;
46 auto displayArea = display.totalArea;
49 displayArea = (displayArea.withZeroOrigin() * display.scale) + display.topLeftPhysical;
51 displayArea = displayArea.getIntersection (rect);
52 auto area = displayArea.getWidth() * displayArea.getHeight();
57 foundDisplay = &display;
66 auto minDistance = std::numeric_limits<int>::max();
67 const Display* foundDisplay =
nullptr;
71 auto displayArea = display.totalArea;
74 displayArea = (displayArea.withZeroOrigin() * display.scale) + display.topLeftPhysical;
76 if (displayArea.contains (point))
79 auto distance = displayArea.getCentre().getDistanceFrom (point);
81 if (distance <= minDistance)
83 minDistance = distance;
84 foundDisplay = &display;
98 const auto* display = useScaleFactorOfDisplay !=
nullptr ? useScaleFactorOfDisplay
101 if (display ==
nullptr)
106 return ((rect - display->topLeftPhysical.toFloat()) / (display->scale / globalScale))
107 + (display->totalArea.getTopLeft().toFloat() * globalScale);
112 return logicalToPhysical (rect.toFloat(), useScaleFactorOfDisplay).toNearestInt();
117 const auto* display = useScaleFactorOfDisplay !=
nullptr ? useScaleFactorOfDisplay
120 if (display ==
nullptr)
125 return ((rect.toFloat() - (display->totalArea.getTopLeft().toFloat() * globalScale)) * (display->scale / globalScale))
126 + display->topLeftPhysical.toFloat();
129template <
typename ValueType>
132 const auto* display = useScaleFactorOfDisplay !=
nullptr ? useScaleFactorOfDisplay
135 if (display ==
nullptr)
140 Point<ValueType> logicalTopLeft (
static_cast<ValueType
> (display->totalArea.getX()),
static_cast<ValueType
> (display->totalArea.getY()));
141 Point<ValueType> physicalTopLeft (
static_cast<ValueType
> (display->topLeftPhysical.getX()),
static_cast<ValueType
> (display->topLeftPhysical.getY()));
143 return ((point - physicalTopLeft) / (display->scale / globalScale)) + (logicalTopLeft * globalScale);
146template <
typename ValueType>
149 const auto* display = useScaleFactorOfDisplay !=
nullptr ? useScaleFactorOfDisplay
152 if (display ==
nullptr)
157 Point<ValueType> logicalTopLeft (
static_cast<ValueType
> (display->totalArea.getX()),
static_cast<ValueType
> (display->totalArea.getY()));
158 Point<ValueType> physicalTopLeft (
static_cast<ValueType
> (display->topLeftPhysical.getX()),
static_cast<ValueType
> (display->topLeftPhysical.getY()));
160 return ((point - (logicalTopLeft * globalScale)) * (display->scale / globalScale)) + physicalTopLeft;
201 peer->handleScreenSizeChange();
208 return d1.isMain == d2.isMain
209 && d1.totalArea == d2.totalArea
210 && d1.userArea == d2.userArea
211 && d1.topLeftPhysical == d2.topLeftPhysical
212 && d1.scale == d2.scale
216bool operator!= (
const Displays::Display& d1,
const Displays::Display& d2)
noexcept;
252 if (! currentNode->
isRoot)
254 const auto logicalWidth = physicalArea.getWidth() / scale;
255 const auto logicalHeight = physicalArea.getHeight() / scale;
263 if (physicalArea.getRight() == physicalParentArea.getX()) logicalArea.
setPosition ({ logicalParentArea.getX() - logicalWidth, physicalArea.getY() / parentScale });
264 else if (physicalArea.getX() == physicalParentArea.getRight()) logicalArea.
setPosition ({ logicalParentArea.getRight(), physicalArea.getY() / parentScale });
265 else if (physicalArea.getBottom() == physicalParentArea.getY()) logicalArea.
setPosition ({ physicalArea.getX() / parentScale, logicalParentArea.getY() - logicalHeight });
266 else if (physicalArea.getY() == physicalParentArea.getBottom()) logicalArea.
setPosition ({ physicalArea.getX() / parentScale, logicalParentArea.getBottom() });
275 currentNode->
parent = currentNode;
280 for (
auto& node : allNodes)
283 if (node.parent !=
nullptr)
286 const auto otherPhysicalArea = node.display->totalArea.toDouble();
289 if (otherPhysicalArea.getX() == physicalArea.getRight() || otherPhysicalArea.getRight() == physicalArea.getX()
290 || otherPhysicalArea.getY() == physicalArea.getBottom() || otherPhysicalArea.getBottom() == physicalArea.getY())
292 node.parent = currentNode;
293 children.
add (&node);
298 for (
auto child : children)
309 auto& display =
displays.getReference (0);
311 display.totalArea = (display.totalArea.toDouble() / display.scale).toNearestInt();
312 display.userArea = (display.userArea.toDouble() / display.scale).toNearestInt();
328 displayNodes.
add (node);
333 for (
auto& node : displayNodes)
337 auto minDistance = std::numeric_limits<int>::max();
340 for (
auto& node : displayNodes)
342 auto distance = node.display->totalArea.getTopLeft().getDistanceFrom ({});
344 if (distance < minDistance)
346 minDistance = distance;
351 if (retVal !=
nullptr)
363 for (
auto& node : displayNodes)
366 jassert (node.parent !=
nullptr);
368 auto relativeUserArea = (node.display->userArea.toDouble() - node.display->totalArea.toDouble().getTopLeft()) / node.display->scale;
371 node.display->topLeftPhysical = node.display->totalArea.getTopLeft();
372 node.display->totalArea = node.logicalArea.toNearestInt();
373 node.display->userArea = (relativeUserArea + node.logicalArea.getTopLeft()).toNearestInt();
391 const auto* best = &
displays.getReference (0);
392 auto bestDistance = std::numeric_limits<int>::max();
396 if (
d.totalArea.contains (position))
402 auto distance =
d.totalArea.getCentre().getDistanceFrom (position);
404 if (distance < bestDistance)
406 bestDistance = distance;
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_Array.h:56
void swapWith(OtherArrayType &otherArray) noexcept
Definition juce_Array.h:621
void add(const ElementType &newElement)
Definition juce_Array.h:418
static int getNumPeers() noexcept
Definition juce_ComponentPeer.cpp:51
static ComponentPeer * getPeer(int index) noexcept
Definition juce_ComponentPeer.cpp:56
float getGlobalScaleFactor() const noexcept
Definition juce_Desktop.h:391
static Desktop &JUCE_CALLTYPE getInstance()
Definition juce_Desktop.cpp:50
void refresh()
Definition juce_Displays.cpp:190
Display emptyDisplay
Definition juce_Displays.h:189
void updateToLogical()
Definition juce_Displays.cpp:305
Rectangle< int > logicalToPhysical(Rectangle< int > logicalRect, const Display *useScaleFactorOfDisplay=nullptr) const noexcept
Definition juce_Displays.cpp:110
const Display & getDisplayContaining(Point< int > position) const noexcept
Definition juce_Displays.cpp:388
friend class Desktop
Definition juce_Displays.h:182
const Display * getDisplayForPoint(Point< int > point, bool isPhysical=false) const noexcept
Definition juce_Displays.cpp:64
const Display * getDisplayForRect(Rectangle< int > rect, bool isPhysical=false) const noexcept
Definition juce_Displays.cpp:39
Array< Display > displays
Definition juce_Displays.h:164
const Display & findDisplayForPoint(Point< int >, bool isPhysical=false) const noexcept
Definition juce_Displays.cpp:422
Rectangle< int > physicalToLogical(Rectangle< int > physicalRect, const Display *useScaleFactorOfDisplay=nullptr) const noexcept
Definition juce_Displays.cpp:91
const Display & getMainDisplay() const noexcept
Definition juce_Displays.cpp:430
Displays(Desktop &)
Definition juce_Displays.cpp:29
void init(Desktop &)
Definition juce_Displays.cpp:34
Rectangle< int > getTotalBounds(bool userAreasOnly) const
Definition juce_Displays.cpp:185
const Display & findDisplayForRect(Rectangle< int >, bool isPhysical=false) const noexcept
Definition juce_Displays.cpp:414
const Display * getPrimaryDisplay() const noexcept
Definition juce_Displays.cpp:163
void findDisplays(float masterScale)
Definition juce_linux_Windowing.cpp:592
RectangleList< int > getRectangleList(bool userAreasOnly) const
Definition juce_Displays.cpp:174
Definition juce_Point.h:42
Definition juce_Rectangle.h:67
Rectangle< double > toDouble() const noexcept
Definition juce_Rectangle.h:882
Rectangle< int > toNearestInt() const noexcept
Definition juce_Rectangle.h:853
void setPosition(Point< ValueType > newPos) noexcept
Definition juce_Rectangle.h:164
Definition juce_RectangleList.h:43
void addWithoutMerging(RectangleType rect)
Definition juce_RectangleList.h:180
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
Definition juce_MessageManager.h:465
Definition carla_juce.cpp:31
static void processDisplay(DisplayNode *currentNode, Array< DisplayNode > &allNodes)
Definition juce_Displays.cpp:247
Definition juce_Displays.cpp:230
DisplayNode * parent
Definition juce_Displays.cpp:238
bool isRoot
Definition juce_Displays.cpp:235
Rectangle< double > logicalArea
Definition juce_Displays.cpp:243
Displays::Display * display
Definition juce_Displays.cpp:232
Definition juce_Displays.h:44
Rectangle< int > totalArea
Definition juce_Displays.h:51
double scale
Definition juce_Displays.h:77
#define const
Definition zconf.h:137