From 96c234f8c5c4e5a6a8a9c3ed23f858997665e45c Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 4 Jul 2013 20:52:54 +0100 Subject: [PATCH] Groundwork for desktop scaling. Added win32 calls to allow drag+drop in apps with lower permissions. --- .../native/juce_win32_Messaging.cpp | 3 +-- .../components/juce_Desktop.cpp | 12 ++++++----- .../juce_gui_basics/components/juce_Desktop.h | 14 ++++++------- .../native/juce_android_Windowing.cpp | 7 ++++--- .../native/juce_ios_Windowing.mm | 11 +++++----- .../native/juce_linux_Windowing.cpp | 14 ++++++------- .../native/juce_mac_Windowing.mm | 11 +++++----- .../native/juce_win32_Windowing.cpp | 20 ++++++++++++++++--- 8 files changed, 53 insertions(+), 39 deletions(-) diff --git a/modules/juce_events/native/juce_win32_Messaging.cpp b/modules/juce_events/native/juce_win32_Messaging.cpp index 1c105e2621..f1a781339c 100644 --- a/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/modules/juce_events/native/juce_win32_Messaging.cpp @@ -111,8 +111,7 @@ bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPend } else if (m.message == WM_QUIT) { - JUCEApplicationBase* const app = JUCEApplicationBase::getInstance(); - if (app != nullptr) + if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) app->systemRequestedQuit(); } else if (isEventBlockedByModalComps == nullptr || ! isEventBlockedByModalComps (m)) diff --git a/modules/juce_gui_basics/components/juce_Desktop.cpp b/modules/juce_gui_basics/components/juce_Desktop.cpp index f4966372e5..9057514a35 100644 --- a/modules/juce_gui_basics/components/juce_Desktop.cpp +++ b/modules/juce_gui_basics/components/juce_Desktop.cpp @@ -25,8 +25,10 @@ Desktop::Desktop() : mouseClickCounter (0), mouseWheelCounter (0), kioskModeComponent (nullptr), - allowedOrientations (allOrientations) + allowedOrientations (allOrientations), + masterScaleFactor (1.0f) { + displays = new Displays (*this); addMouseInputSource(); } @@ -352,7 +354,7 @@ void Desktop::sendMouseMove() //============================================================================== -Desktop::Displays::Displays() { init(); } +Desktop::Displays::Displays (Desktop& desktop) { init (desktop); } Desktop::Displays::~Displays() {} const Desktop::Displays::Display& Desktop::Displays::getMainDisplay() const noexcept @@ -421,9 +423,9 @@ bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays:: return ! (d1 == d2); } -void Desktop::Displays::init() +void Desktop::Displays::init (Desktop& desktop) { - findDisplays(); + findDisplays (desktop.masterScaleFactor); jassert (displays.size() > 0); } @@ -432,7 +434,7 @@ void Desktop::Displays::refresh() Array oldDisplays; oldDisplays.swapWithArray (displays); - init(); + init (Desktop::getInstance()); if (oldDisplays != displays) { diff --git a/modules/juce_gui_basics/components/juce_Desktop.h b/modules/juce_gui_basics/components/juce_Desktop.h index dce55fe9da..8acd322b99 100644 --- a/modules/juce_gui_basics/components/juce_Desktop.h +++ b/modules/juce_gui_basics/components/juce_Desktop.h @@ -367,14 +367,15 @@ public: private: friend class Desktop; - Displays(); + friend class ScopedPointer; + Displays (Desktop&); ~Displays(); - void init(); - void findDisplays(); + void init (Desktop&); + void findDisplays (float masterScale); }; - const Displays& getDisplays() const noexcept { return displays; } + const Displays& getDisplays() const noexcept { return *displays; } //============================================================================== /** True if the OS supports semitransparent windows */ @@ -403,7 +404,7 @@ private: void addPeer (ComponentPeer*); void removePeer (ComponentPeer*); - Displays displays; + ScopedPointer displays; Point lastFakeMouseMove; void sendMouseMove(); @@ -421,11 +422,10 @@ private: Rectangle kioskComponentOriginalBounds; int allowedOrientations; + float masterScaleFactor; ComponentAnimator animator; - AffineTransform masterTransform; - void timerCallback() override; void resetTimer(); ListenerList & getMouseListeners(); diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 10e8c05bd1..519b8a511a 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -686,12 +686,13 @@ bool juce_areThereAnyAlwaysOnTopWindows() } //============================================================================== -void Desktop::Displays::findDisplays() +void Desktop::Displays::findDisplays (float masterScale) { Display d; - d.userArea = d.totalArea = Rectangle (android.screenWidth, android.screenHeight); + d.userArea = d.totalArea = Rectangle (android.screenWidth, + android.screenHeight) / masterScale; d.isMain = true; - d.scale = 1.0; + d.scale = masterScale; displays.add (d); } diff --git a/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/modules/juce_gui_basics/native/juce_ios_Windowing.mm index 2c4c85f1a2..563ecafec9 100644 --- a/modules/juce_gui_basics/native/juce_ios_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_ios_Windowing.mm @@ -302,21 +302,20 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const return Orientations::convertToJuce ([[UIApplication sharedApplication] statusBarOrientation]); } -void Desktop::Displays::findDisplays() +void Desktop::Displays::findDisplays (float masterScale) { JUCE_AUTORELEASEPOOL { UIScreen* s = [UIScreen mainScreen]; Display d; - d.userArea = UIViewComponentPeer::realScreenPosToRotated (convertToRectInt ([s applicationFrame])); - d.totalArea = UIViewComponentPeer::realScreenPosToRotated (convertToRectInt ([s bounds])); + d.userArea = UIViewComponentPeer::realScreenPosToRotated (convertToRectInt ([s applicationFrame])) / masterScale; + d.totalArea = UIViewComponentPeer::realScreenPosToRotated (convertToRectInt ([s bounds])) / masterScale; d.isMain = true; + d.scale = masterScale; if ([s respondsToSelector: @selector (scale)]) - d.scale = s.scale; - else - d.scale = 1.0; + d.scale *= s.scale; d.dpi = 160 * d.scale; diff --git a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp index bbcd4473e2..41f879e9fe 100644 --- a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp @@ -2975,7 +2975,7 @@ static double getDisplayDPI (int index) return (dpiX + dpiY) / 2.0; } -void Desktop::Displays::findDisplays() +void Desktop::Displays::findDisplays (float masterScale) { if (display == 0) return; @@ -3025,9 +3025,9 @@ void Desktop::Displays::findDisplays() d.userArea = d.totalArea = Rectangle (screens[j].x_org, screens[j].y_org, screens[j].width, - screens[j].height); + screens[j].height) * masterScale; d.isMain = (index == 0); - d.scale = 1.0; + d.scale = masterScale; d.dpi = getDisplayDPI (index); displays.add (d); @@ -3059,9 +3059,9 @@ void Desktop::Displays::findDisplays() Display d; d.userArea = d.totalArea = Rectangle (position[0], position[1], - position[2], position[3]); + position[2], position[3]) / masterScale; d.isMain = (displays.size() == 0); - d.scale = 1.0; + d.scale = masterScale; d.dpi = getDisplayDPI (i); displays.add (d); @@ -3073,9 +3073,9 @@ void Desktop::Displays::findDisplays() { Display d; d.userArea = d.totalArea = Rectangle (DisplayWidth (display, DefaultScreen (display)), - DisplayHeight (display, DefaultScreen (display))); + DisplayHeight (display, DefaultScreen (display))) * masterScale; d.isMain = true; - d.scale = 1.0; + d.scale = masterScale; d.dpi = getDisplayDPI (0); displays.add (d); diff --git a/modules/juce_gui_basics/native/juce_mac_Windowing.mm b/modules/juce_gui_basics/native/juce_mac_Windowing.mm index 60155eedb0..5fb8fb451d 100644 --- a/modules/juce_gui_basics/native/juce_mac_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_mac_Windowing.mm @@ -348,7 +348,7 @@ static Rectangle convertDisplayRect (NSRect r, CGFloat mainScreenBottom) return convertToRectInt (r); } -void Desktop::Displays::findDisplays() +void Desktop::Displays::findDisplays (const float masterScale) { JUCE_AUTORELEASEPOOL { @@ -362,16 +362,15 @@ void Desktop::Displays::findDisplays() NSScreen* s = (NSScreen*) [screens objectAtIndex: i]; Display d; - d.userArea = convertDisplayRect ([s visibleFrame], mainScreenBottom); - d.totalArea = convertDisplayRect ([s frame], mainScreenBottom); + d.userArea = convertDisplayRect ([s visibleFrame], mainScreenBottom) / masterScale; + d.totalArea = convertDisplayRect ([s frame], mainScreenBottom) / masterScale; d.isMain = (i == 0); + d.scale = masterScale; #if defined (MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) if ([s respondsToSelector: @selector (backingScaleFactor)]) - d.scale = s.backingScaleFactor; - else + d.scale *= s.backingScaleFactor; #endif - d.scale = 1.0; NSSize dpi = [[[s deviceDescription] objectForKey: NSDeviceResolution] sizeValue]; d.dpi = (dpi.width + dpi.height) / 2.0; diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index d83a6679fa..cb1bf98e3f 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -1338,6 +1338,7 @@ private: registerTouchWindow (hwnd, 0); setDPIAwareness(); + setMessageFilter(); updateBorderSize(); // Calling this function here is (for some reason) necessary to make Windows @@ -1408,6 +1409,19 @@ private: } } + void setMessageFilter() + { + typedef BOOL (WINAPI* ChangeWindowMessageFilterExFunc) (HWND, UINT, DWORD, PVOID); + + if (ChangeWindowMessageFilterExFunc changeMessageFilter + = (ChangeWindowMessageFilterExFunc) getUser32Function ("ChangeWindowMessageFilterEx")) + { + changeMessageFilter (hwnd, WM_DROPFILES, 1 /*MSGFLT_ALLOW*/, nullptr); + changeMessageFilter (hwnd, WM_COPYDATA, 1 /*MSGFLT_ALLOW*/, nullptr); + changeMessageFilter (hwnd, 0x49, 1 /*MSGFLT_ALLOW*/, nullptr); + } + } + //============================================================================== void handlePaintMessage() { @@ -3163,7 +3177,7 @@ static BOOL CALLBACK enumMonitorsProc (HMONITOR, HDC, LPRECT r, LPARAM userInfo) return TRUE; } -void Desktop::Displays::findDisplays() +void Desktop::Displays::findDisplays (float masterScale) { setDPIAwareness(); @@ -3190,9 +3204,9 @@ void Desktop::Displays::findDisplays() for (int i = 0; i < monitors.size(); ++i) { Display d; - d.userArea = d.totalArea = monitors.getReference(i); + d.userArea = d.totalArea = monitors.getReference(i) / masterScale; d.isMain = (i == 0); - d.scale = 1.0; + d.scale = masterScale; d.dpi = dpi; if (i == 0)