Browse Source

Groundwork for desktop scaling. Added win32 calls to allow drag+drop in apps with lower permissions.

tags/2021-05-28
jules 12 years ago
parent
commit
96c234f8c5
8 changed files with 53 additions and 39 deletions
  1. +1
    -2
      modules/juce_events/native/juce_win32_Messaging.cpp
  2. +7
    -5
      modules/juce_gui_basics/components/juce_Desktop.cpp
  3. +7
    -7
      modules/juce_gui_basics/components/juce_Desktop.h
  4. +4
    -3
      modules/juce_gui_basics/native/juce_android_Windowing.cpp
  5. +5
    -6
      modules/juce_gui_basics/native/juce_ios_Windowing.mm
  6. +7
    -7
      modules/juce_gui_basics/native/juce_linux_Windowing.cpp
  7. +5
    -6
      modules/juce_gui_basics/native/juce_mac_Windowing.mm
  8. +17
    -3
      modules/juce_gui_basics/native/juce_win32_Windowing.cpp

+ 1
- 2
modules/juce_events/native/juce_win32_Messaging.cpp View File

@@ -111,8 +111,7 @@ bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPend
} }
else if (m.message == WM_QUIT) else if (m.message == WM_QUIT)
{ {
JUCEApplicationBase* const app = JUCEApplicationBase::getInstance();
if (app != nullptr)
if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance())
app->systemRequestedQuit(); app->systemRequestedQuit();
} }
else if (isEventBlockedByModalComps == nullptr || ! isEventBlockedByModalComps (m)) else if (isEventBlockedByModalComps == nullptr || ! isEventBlockedByModalComps (m))


+ 7
- 5
modules/juce_gui_basics/components/juce_Desktop.cpp View File

@@ -25,8 +25,10 @@
Desktop::Desktop() Desktop::Desktop()
: mouseClickCounter (0), mouseWheelCounter (0), : mouseClickCounter (0), mouseWheelCounter (0),
kioskModeComponent (nullptr), kioskModeComponent (nullptr),
allowedOrientations (allOrientations)
allowedOrientations (allOrientations),
masterScaleFactor (1.0f)
{ {
displays = new Displays (*this);
addMouseInputSource(); addMouseInputSource();
} }
@@ -352,7 +354,7 @@ void Desktop::sendMouseMove()
//============================================================================== //==============================================================================
Desktop::Displays::Displays() { init(); }
Desktop::Displays::Displays (Desktop& desktop) { init (desktop); }
Desktop::Displays::~Displays() {} Desktop::Displays::~Displays() {}
const Desktop::Displays::Display& Desktop::Displays::getMainDisplay() const noexcept 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); return ! (d1 == d2);
} }
void Desktop::Displays::init()
void Desktop::Displays::init (Desktop& desktop)
{ {
findDisplays();
findDisplays (desktop.masterScaleFactor);
jassert (displays.size() > 0); jassert (displays.size() > 0);
} }
@@ -432,7 +434,7 @@ void Desktop::Displays::refresh()
Array<Display> oldDisplays; Array<Display> oldDisplays;
oldDisplays.swapWithArray (displays); oldDisplays.swapWithArray (displays);
init();
init (Desktop::getInstance());
if (oldDisplays != displays) if (oldDisplays != displays)
{ {


+ 7
- 7
modules/juce_gui_basics/components/juce_Desktop.h View File

@@ -367,14 +367,15 @@ public:
private: private:
friend class Desktop; friend class Desktop;
Displays();
friend class ScopedPointer<Displays>;
Displays (Desktop&);
~Displays(); ~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 */ /** True if the OS supports semitransparent windows */
@@ -403,7 +404,7 @@ private:
void addPeer (ComponentPeer*); void addPeer (ComponentPeer*);
void removePeer (ComponentPeer*); void removePeer (ComponentPeer*);
Displays displays;
ScopedPointer<Displays> displays;
Point<int> lastFakeMouseMove; Point<int> lastFakeMouseMove;
void sendMouseMove(); void sendMouseMove();
@@ -421,11 +422,10 @@ private:
Rectangle<int> kioskComponentOriginalBounds; Rectangle<int> kioskComponentOriginalBounds;
int allowedOrientations; int allowedOrientations;
float masterScaleFactor;
ComponentAnimator animator; ComponentAnimator animator;
AffineTransform masterTransform;
void timerCallback() override; void timerCallback() override;
void resetTimer(); void resetTimer();
ListenerList <MouseListener>& getMouseListeners(); ListenerList <MouseListener>& getMouseListeners();


+ 4
- 3
modules/juce_gui_basics/native/juce_android_Windowing.cpp View File

@@ -686,12 +686,13 @@ bool juce_areThereAnyAlwaysOnTopWindows()
} }
//============================================================================== //==============================================================================
void Desktop::Displays::findDisplays()
void Desktop::Displays::findDisplays (float masterScale)
{ {
Display d; Display d;
d.userArea = d.totalArea = Rectangle<int> (android.screenWidth, android.screenHeight);
d.userArea = d.totalArea = Rectangle<int> (android.screenWidth,
android.screenHeight) / masterScale;
d.isMain = true; d.isMain = true;
d.scale = 1.0;
d.scale = masterScale;
displays.add (d); displays.add (d);
} }


+ 5
- 6
modules/juce_gui_basics/native/juce_ios_Windowing.mm View File

@@ -302,21 +302,20 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
return Orientations::convertToJuce ([[UIApplication sharedApplication] statusBarOrientation]); return Orientations::convertToJuce ([[UIApplication sharedApplication] statusBarOrientation]);
} }
void Desktop::Displays::findDisplays()
void Desktop::Displays::findDisplays (float masterScale)
{ {
JUCE_AUTORELEASEPOOL JUCE_AUTORELEASEPOOL
{ {
UIScreen* s = [UIScreen mainScreen]; UIScreen* s = [UIScreen mainScreen];
Display d; 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.isMain = true;
d.scale = masterScale;
if ([s respondsToSelector: @selector (scale)]) if ([s respondsToSelector: @selector (scale)])
d.scale = s.scale;
else
d.scale = 1.0;
d.scale *= s.scale;
d.dpi = 160 * d.scale; d.dpi = 160 * d.scale;


+ 7
- 7
modules/juce_gui_basics/native/juce_linux_Windowing.cpp View File

@@ -2975,7 +2975,7 @@ static double getDisplayDPI (int index)
return (dpiX + dpiY) / 2.0; return (dpiX + dpiY) / 2.0;
} }
void Desktop::Displays::findDisplays()
void Desktop::Displays::findDisplays (float masterScale)
{ {
if (display == 0) if (display == 0)
return; return;
@@ -3025,9 +3025,9 @@ void Desktop::Displays::findDisplays()
d.userArea = d.totalArea = Rectangle<int> (screens[j].x_org, d.userArea = d.totalArea = Rectangle<int> (screens[j].x_org,
screens[j].y_org, screens[j].y_org,
screens[j].width, screens[j].width,
screens[j].height);
screens[j].height) * masterScale;
d.isMain = (index == 0); d.isMain = (index == 0);
d.scale = 1.0;
d.scale = masterScale;
d.dpi = getDisplayDPI (index); d.dpi = getDisplayDPI (index);
displays.add (d); displays.add (d);
@@ -3059,9 +3059,9 @@ void Desktop::Displays::findDisplays()
Display d; Display d;
d.userArea = d.totalArea = Rectangle<int> (position[0], position[1], d.userArea = d.totalArea = Rectangle<int> (position[0], position[1],
position[2], position[3]);
position[2], position[3]) / masterScale;
d.isMain = (displays.size() == 0); d.isMain = (displays.size() == 0);
d.scale = 1.0;
d.scale = masterScale;
d.dpi = getDisplayDPI (i); d.dpi = getDisplayDPI (i);
displays.add (d); displays.add (d);
@@ -3073,9 +3073,9 @@ void Desktop::Displays::findDisplays()
{ {
Display d; Display d;
d.userArea = d.totalArea = Rectangle<int> (DisplayWidth (display, DefaultScreen (display)), d.userArea = d.totalArea = Rectangle<int> (DisplayWidth (display, DefaultScreen (display)),
DisplayHeight (display, DefaultScreen (display)));
DisplayHeight (display, DefaultScreen (display))) * masterScale;
d.isMain = true; d.isMain = true;
d.scale = 1.0;
d.scale = masterScale;
d.dpi = getDisplayDPI (0); d.dpi = getDisplayDPI (0);
displays.add (d); displays.add (d);


+ 5
- 6
modules/juce_gui_basics/native/juce_mac_Windowing.mm View File

@@ -348,7 +348,7 @@ static Rectangle<int> convertDisplayRect (NSRect r, CGFloat mainScreenBottom)
return convertToRectInt (r); return convertToRectInt (r);
} }
void Desktop::Displays::findDisplays()
void Desktop::Displays::findDisplays (const float masterScale)
{ {
JUCE_AUTORELEASEPOOL JUCE_AUTORELEASEPOOL
{ {
@@ -362,16 +362,15 @@ void Desktop::Displays::findDisplays()
NSScreen* s = (NSScreen*) [screens objectAtIndex: i]; NSScreen* s = (NSScreen*) [screens objectAtIndex: i];
Display d; 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.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 defined (MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7)
if ([s respondsToSelector: @selector (backingScaleFactor)]) if ([s respondsToSelector: @selector (backingScaleFactor)])
d.scale = s.backingScaleFactor;
else
d.scale *= s.backingScaleFactor;
#endif #endif
d.scale = 1.0;
NSSize dpi = [[[s deviceDescription] objectForKey: NSDeviceResolution] sizeValue]; NSSize dpi = [[[s deviceDescription] objectForKey: NSDeviceResolution] sizeValue];
d.dpi = (dpi.width + dpi.height) / 2.0; d.dpi = (dpi.width + dpi.height) / 2.0;


+ 17
- 3
modules/juce_gui_basics/native/juce_win32_Windowing.cpp View File

@@ -1338,6 +1338,7 @@ private:
registerTouchWindow (hwnd, 0); registerTouchWindow (hwnd, 0);
setDPIAwareness(); setDPIAwareness();
setMessageFilter();
updateBorderSize(); updateBorderSize();
// Calling this function here is (for some reason) necessary to make Windows // 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() void handlePaintMessage()
{ {
@@ -3163,7 +3177,7 @@ static BOOL CALLBACK enumMonitorsProc (HMONITOR, HDC, LPRECT r, LPARAM userInfo)
return TRUE; return TRUE;
} }
void Desktop::Displays::findDisplays()
void Desktop::Displays::findDisplays (float masterScale)
{ {
setDPIAwareness(); setDPIAwareness();
@@ -3190,9 +3204,9 @@ void Desktop::Displays::findDisplays()
for (int i = 0; i < monitors.size(); ++i) for (int i = 0; i < monitors.size(); ++i)
{ {
Display d; Display d;
d.userArea = d.totalArea = monitors.getReference(i);
d.userArea = d.totalArea = monitors.getReference(i) / masterScale;
d.isMain = (i == 0); d.isMain = (i == 0);
d.scale = 1.0;
d.scale = masterScale;
d.dpi = dpi; d.dpi = dpi;
if (i == 0) if (i == 0)


Loading…
Cancel
Save