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:
parent
44d92805f6
commit
de855f0b35
9 changed files with 127 additions and 129 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue