1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-11 23:54:18 +00:00

Cleanups to some X windowing classes

This commit is contained in:
jules 2017-05-22 15:43:44 +01:00
parent 44d92805f6
commit de855f0b35
9 changed files with 127 additions and 129 deletions

View file

@ -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

View file

@ -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)

View file

@ -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);
}

View file

@ -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<int> 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);

View file

@ -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);

View file

@ -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<float> MouseInputSource::getCurrentRawMousePosition()
{
ScopedXDisplay xDisplay;
::Display* display = xDisplay.get();
auto display = xDisplay.display;
if (display == nullptr)
return Point<float>();
return {};
Window root, child;
int x, y, winx, winy;
@ -3957,9 +3958,8 @@ Point<float> MouseInputSource::getCurrentRawMousePosition()
void MouseInputSource::setRawMousePosition (Point<float> 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;

View file

@ -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);

View file

@ -449,7 +449,7 @@ private:
return 0;
}
Display* getDisplay() { return reinterpret_cast<Display*> (x11display.get()); }
Display* getDisplay() { return reinterpret_cast<Display*> (x11display.display); }
//==============================================================================
bool getXEmbedMappedFlag()

View file

@ -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;
}