From de855f0b359956d08ef9d852d2d00aad32b73cf7 Mon Sep 17 00:00:00 2001 From: jules Date: Mon, 22 May 2017 15:43:44 +0100 Subject: [PATCH] Cleanups to some X windowing classes --- .../VST/juce_VST_Wrapper.cpp | 3 +- .../format_types/juce_VSTPluginFormat.cpp | 7 +- .../juce_gui_basics/native/juce_linux_X11.cpp | 12 +- .../juce_gui_basics/native/juce_linux_X11.h | 54 +++--- .../native/juce_linux_X11_Clipboard.cpp | 6 +- .../native/juce_linux_X11_Windowing.cpp | 157 +++++++++--------- .../native/juce_linux_X11_SystemTrayIcon.cpp | 2 +- .../native/juce_linux_XEmbedComponent.cpp | 2 +- .../native/juce_OpenGL_linux_X11.h | 13 +- 9 files changed, 127 insertions(+), 129 deletions(-) diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 34fcee13f8..467efc4741 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -1345,8 +1345,7 @@ public: { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - XResizeWindow (display, (Window) getWindowHandle(), childBounds.getWidth(), childBounds.getHeight()); + XResizeWindow (xDisplay.display, (Window) getWindowHandle(), childBounds.getWidth(), childBounds.getHeight()); } #endif diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index bfd493a50a..9de1aa7a90 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -250,9 +250,8 @@ namespace { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - XGetWindowProperty (display, handle, atom, 0, 1, false, AnyPropertyType, + XGetWindowProperty (xDisplay.display, handle, atom, 0, 1, false, AnyPropertyType, &userType, &userSize, &userCount, &bytes, &data); } @@ -269,9 +268,7 @@ namespace { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - - XQueryTree (display, windowToCheck, &rootWindow, &parentWindow, &childWindows, &numChildren); + XQueryTree (xDisplay.display, windowToCheck, &rootWindow, &parentWindow, &childWindows, &numChildren); } if (numChildren > 0) diff --git a/modules/juce_gui_basics/native/juce_linux_X11.cpp b/modules/juce_gui_basics/native/juce_linux_X11.cpp index d01671d4b6..af009643d8 100644 --- a/modules/juce_gui_basics/native/juce_linux_X11.cpp +++ b/modules/juce_gui_basics/native/juce_linux_X11.cpp @@ -225,23 +225,17 @@ void XWindowSystem::destroyXDisplay() noexcept juce_ImplementSingleton (XWindowSystem) //============================================================================== -ScopedXDisplay::ScopedXDisplay() +ScopedXDisplay::ScopedXDisplay() : display (XWindowSystem::getInstance()->displayRef()) { - display = XWindowSystem::getInstance()->displayRef(); } + ScopedXDisplay::~ScopedXDisplay() { XWindowSystem::getInstance()->displayUnref(); } -::Display* ScopedXDisplay::get() -{ - return display; -} - //============================================================================== -ScopedXLock::ScopedXLock(::Display* _display) - : display (_display) +ScopedXLock::ScopedXLock(::Display* d) : display (d) { if (display != nullptr) XLockDisplay (display); } diff --git a/modules/juce_gui_basics/native/juce_linux_X11.h b/modules/juce_gui_basics/native/juce_linux_X11.h index d2cd05d953..00c55bf126 100644 --- a/modules/juce_gui_basics/native/juce_linux_X11.h +++ b/modules/juce_gui_basics/native/juce_linux_X11.h @@ -33,21 +33,26 @@ struct _XDisplay; -#define ATOM_TYPE unsigned long -#define WINDOW_TYPE unsigned long +namespace juce +{ + +typedef ::_XDisplay* XDisplay; + +typedef unsigned long ATOM_TYPE; +typedef unsigned long WINDOW_TYPE; -namespace juce { //============================================================================== class XWindowSystem { public: - ::_XDisplay* displayRef() noexcept; - ::_XDisplay* displayUnref() noexcept; + XDisplay displayRef() noexcept; + XDisplay displayUnref() noexcept; + juce_DeclareSingleton (XWindowSystem, false) private: - ::_XDisplay* display; + XDisplay display; Atomic displayCount; XWindowSystem() noexcept; @@ -63,11 +68,11 @@ class ScopedXDisplay public: ScopedXDisplay(); ~ScopedXDisplay(); - ::_XDisplay* get(); -private: - ::_XDisplay* display; + + const XDisplay display; }; +//============================================================================== /** A handy class that uses XLockDisplay and XUnlockDisplay to lock the X server using RAII (Only available in Linux!). */ @@ -77,21 +82,22 @@ public: /** Creating a ScopedXLock object locks the X display. This uses XLockDisplay() to grab the display that Juce is using. */ - ScopedXLock (::_XDisplay* _display); + ScopedXLock (XDisplay); /** Deleting a ScopedXLock object unlocks the X display. This calls XUnlockDisplay() to release the lock. */ ~ScopedXLock(); + private: // defined in juce_linux_X11.h - ::_XDisplay* display; + XDisplay display; }; //============================================================================== struct Atoms { - Atoms(::_XDisplay* display); + Atoms (XDisplay); enum ProtocolItems { @@ -101,28 +107,28 @@ struct Atoms }; ATOM_TYPE protocols, protocolList[3], changeState, state, userTime, - activeWin, pid, windowType, windowState, - XdndAware, XdndEnter, XdndLeave, XdndPosition, XdndStatus, - XdndDrop, XdndFinished, XdndSelection, XdndTypeList, XdndActionList, - XdndActionDescription, XdndActionCopy, XdndActionPrivate, - XembedMsgType, XembedInfo, - allowedActions[5], - allowedMimeTypes[4]; + activeWin, pid, windowType, windowState, + XdndAware, XdndEnter, XdndLeave, XdndPosition, XdndStatus, + XdndDrop, XdndFinished, XdndSelection, XdndTypeList, XdndActionList, + XdndActionDescription, XdndActionCopy, XdndActionPrivate, + XembedMsgType, XembedInfo, + allowedActions[5], + allowedMimeTypes[4]; static const unsigned long DndVersion; - static ATOM_TYPE getIfExists (::_XDisplay* display, const char* name); - static ATOM_TYPE getCreating (::_XDisplay* display, const char* name); + static ATOM_TYPE getIfExists (XDisplay, const char* name); + static ATOM_TYPE getCreating (XDisplay, const char* name); - static String getName (::_XDisplay* display, const ATOM_TYPE atom); + static String getName (XDisplay, ATOM_TYPE atom); - static bool isMimeTypeFile (::_XDisplay* display, const ATOM_TYPE atom); + static bool isMimeTypeFile (XDisplay, ATOM_TYPE atom); }; //============================================================================== struct GetXProperty { - GetXProperty (::_XDisplay* display, WINDOW_TYPE window, ATOM_TYPE atom, + GetXProperty (XDisplay, WINDOW_TYPE window, ATOM_TYPE atom, long offset, long length, bool shouldDelete, ATOM_TYPE requestedType); diff --git a/modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp b/modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp index f44f4c95ca..9c8e92b5bd 100644 --- a/modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp +++ b/modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp @@ -211,9 +211,8 @@ static ClipboardCallbackInitialiser clipboardInitialiser; void SystemClipboard::copyTextToClipboard (const String& clipText) { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - if (display != nullptr) + if (auto display = xDisplay.display) { ClipboardHelpers::initSelectionAtoms (display); ClipboardHelpers::localClipboardContent = clipText; @@ -227,9 +226,8 @@ String SystemClipboard::getTextFromClipboard() { String content; ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - if (display != nullptr) + if (auto display = xDisplay.display) { ClipboardHelpers::initSelectionAtoms (display); diff --git a/modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp index a3d69203ee..4dec143f90 100644 --- a/modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp @@ -68,37 +68,38 @@ namespace Keys bool KeyPress::isKeyCurrentlyDown (const int keyCode) { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - if (display == nullptr) - return false; - - int keysym; - - if (keyCode & Keys::extendedKeyModifier) + if (auto display = xDisplay.display) { - keysym = 0xff00 | (keyCode & 0xff); - } - else - { - keysym = keyCode; + int keysym; - if (keysym == (XK_Tab & 0xff) - || keysym == (XK_Return & 0xff) - || keysym == (XK_Escape & 0xff) - || keysym == (XK_BackSpace & 0xff)) + if (keyCode & Keys::extendedKeyModifier) { - keysym |= 0xff00; + keysym = 0xff00 | (keyCode & 0xff); } + else + { + keysym = keyCode; + + if (keysym == (XK_Tab & 0xff) + || keysym == (XK_Return & 0xff) + || keysym == (XK_Escape & 0xff) + || keysym == (XK_BackSpace & 0xff)) + { + keysym |= 0xff00; + } + } + + ScopedXLock xlock (display); + + const int keycode = XKeysymToKeycode (display, (KeySym) keysym); + + const int keybyte = keycode >> 3; + const int keybit = (1 << (keycode & 7)); + return (Keys::keyStates [keybyte] & keybit) != 0; } - ScopedXLock xlock (display); - - const int keycode = XKeysymToKeycode (display, (KeySym) keysym); - - const int keybyte = keycode >> 3; - const int keybit = (1 << (keycode & 7)); - return (Keys::keyStates [keybyte] & keybit) != 0; + return false; } //============================================================================== @@ -3798,9 +3799,8 @@ void ModifierKeys::updateCurrentModifiers() noexcept ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - if (display != nullptr) + if (auto display = xDisplay.display) { Window root, child; int x, y, winx, winy; @@ -3843,56 +3843,57 @@ ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindowToAtt void Desktop::Displays::findDisplays (float masterScale) { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - DisplayGeometry& geometry = DisplayGeometry::getOrCreateInstance (display, masterScale); - - // add the main display first - int mainDisplayIdx; - for (mainDisplayIdx = 0; mainDisplayIdx < geometry.infos.size(); ++mainDisplayIdx) + if (auto display = xDisplay.display) { - const DisplayGeometry::ExtendedInfo& info = geometry.infos.getReference (mainDisplayIdx); - if (info.isMain) - break; - } + auto& geometry = DisplayGeometry::getOrCreateInstance (display, masterScale); - // no main display found then use the first - if (mainDisplayIdx >= geometry.infos.size()) - mainDisplayIdx = 0; + // add the main display first + int mainDisplayIdx; - // add the main display - { - const DisplayGeometry::ExtendedInfo& info = - geometry.infos.getReference (mainDisplayIdx); - Desktop::Displays::Display d; + for (mainDisplayIdx = 0; mainDisplayIdx < geometry.infos.size(); ++mainDisplayIdx) + { + auto& info = geometry.infos.getReference (mainDisplayIdx); - d.isMain = true; - d.scale = masterScale * info.scale; - d.dpi = info.dpi; + if (info.isMain) + break; + } - d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds); - d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled; + // no main display found then use the first + if (mainDisplayIdx >= geometry.infos.size()) + mainDisplayIdx = 0; - displays.add (d); - } + // add the main display + { + auto& info = geometry.infos.getReference (mainDisplayIdx); - for (int i = 0; i < geometry.infos.size(); ++i) - { - // don't add the main display a second time - if (i == mainDisplayIdx) - continue; + Desktop::Displays::Display d; + d.isMain = true; + d.scale = masterScale * info.scale; + d.dpi = info.dpi; + d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds); + d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled; - const DisplayGeometry::ExtendedInfo& info = geometry.infos.getReference (i); - Desktop::Displays::Display d; + displays.add (d); + } - d.isMain = false; - d.scale = masterScale * info.scale; - d.dpi = info.dpi; + for (int i = 0; i < geometry.infos.size(); ++i) + { + // don't add the main display a second time + if (i == mainDisplayIdx) + continue; - d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds); - d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled; + auto& info = geometry.infos.getReference (i); - displays.add (d); + Desktop::Displays::Display d; + d.isMain = false; + d.scale = masterScale * info.scale; + d.dpi = info.dpi; + d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds); + d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled; + + displays.add (d); + } } } @@ -3931,10 +3932,10 @@ bool Desktop::canUseSemiTransparentWindows() noexcept Point MouseInputSource::getCurrentRawMousePosition() { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); + auto display = xDisplay.display; if (display == nullptr) - return Point(); + return {}; Window root, child; int x, y, winx, winy; @@ -3957,9 +3958,8 @@ Point MouseInputSource::getCurrentRawMousePosition() void MouseInputSource::setRawMousePosition (Point newPosition) { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - if (display != nullptr) + if (auto display = xDisplay.display) { ScopedXLock xlock (display); Window root = RootWindow (display, DefaultScreen (display)); @@ -3988,9 +3988,8 @@ void Desktop::setScreenSaverEnabled (const bool isEnabled) screenSaverAllowed = isEnabled; ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - if (display != nullptr) + if (auto display = xDisplay.display) { typedef void (*tXScreenSaverSuspend) (Display*, Bool); static tXScreenSaverSuspend xScreenSaverSuspend = nullptr; @@ -4109,7 +4108,7 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType ico void* CustomMouseCursorInfo::create() const { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); + auto display = xDisplay.display; if (display == nullptr) return nullptr; @@ -4236,20 +4235,22 @@ void* CustomMouseCursorInfo::create() const void MouseCursor::deleteMouseCursor (void* const cursorHandle, const bool) { - ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - - if (cursorHandle != nullptr && display != nullptr) + if (cursorHandler != nullptr) { - ScopedXLock xlock (display); - XFreeCursor (display, (Cursor) cursorHandle); + ScopedXDisplay xDisplay; + + if (auto display = xDisplay.display) + { + ScopedXLock xlock (display); + XFreeCursor (display, (Cursor) cursorHandle); + } } } void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType type) { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); + auto display = xDisplay.display; if (display == nullptr) return None; diff --git a/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp index 8cdc119269..35eed37330 100644 --- a/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp +++ b/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp @@ -31,7 +31,7 @@ public: Pimpl (const Image& im, Window windowH) : image (im) { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); + auto display = xDisplay.display; ScopedXLock xlock (display); diff --git a/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp b/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp index 62ffb403ea..649bededc2 100644 --- a/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp @@ -449,7 +449,7 @@ private: return 0; } - Display* getDisplay() { return reinterpret_cast (x11display.get()); } + Display* getDisplay() { return reinterpret_cast (x11display.display); } //============================================================================== bool getXEmbedMappedFlag() diff --git a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h index 56d4896668..92d3107cda 100644 --- a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h +++ b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h @@ -169,8 +169,7 @@ public: static void deactivateCurrentContext() { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - glXMakeCurrent (display, None, 0); + glXMakeCurrent (xDisplay.display, None, 0); } void swapBuffers() @@ -245,8 +244,12 @@ private: bool OpenGLHelpers::isContextActive() { ScopedXDisplay xDisplay; - ::Display* display = xDisplay.get(); - ScopedXLock xlock (display); - return glXGetCurrentContext() != 0; + if (auto display = xDisplay.display) + { + ScopedXLock xlock (xDisplay.display); + return glXGetCurrentContext() != 0; + } + + return false; }