/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2020 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 6 End-User License Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). End User License Agreement: www.juce.com/juce-6-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { //============================================================================== namespace XWindowSystemUtilities { //============================================================================== /** A handy struct that uses XLockDisplay and XUnlockDisplay to lock the X server using RAII. @tags{GUI} */ struct ScopedXLock { ScopedXLock(); ~ScopedXLock(); }; //============================================================================== /** Gets a specified window property and stores its associated data, freeing it on deletion. @tags{GUI} */ struct GetXProperty { GetXProperty (::Window windowH, Atom property, long offset, long length, bool shouldDelete, Atom requestedType); ~GetXProperty(); bool success = false; unsigned char* data = nullptr; unsigned long numItems = 0, bytesLeft = 0; Atom actualType; int actualFormat = -1; }; //============================================================================== /** Initialises and stores some atoms for the display. @tags{GUI} */ struct Atoms { enum ProtocolItems { TAKE_FOCUS = 0, DELETE_WINDOW = 1, PING = 2 }; Atoms() = default; explicit Atoms (::Display*); static Atom getIfExists (::Display*, const char* name); static Atom getCreating (::Display*, const char* name); static String getName (::Display*, Atom); static bool isMimeTypeFile (::Display*, Atom); static constexpr unsigned long DndVersion = 3; Atom 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], utf8String, clipboard, targets; }; } //============================================================================== template class LinuxComponentPeer; class XWindowSystem : public DeletedAtShutdown { public: //============================================================================== ::Window createWindow (::Window parentWindow, LinuxComponentPeer<::Window>* peer) const; void destroyWindow (::Window windowH); void setTitle (::Window windowH, const String& title) const; void setIcon (::Window windowH, const Image& newIcon) const; void setVisible (::Window windowH, bool shouldBeVisible) const; void setBounds (::Window windowH, Rectangle newBounds, bool fullScreen) const; BorderSize getBorderSize (::Window windowH) const; Rectangle getWindowBounds (::Window windowH, ::Window parentWindow); Point getParentScreenPosition() const; bool contains (::Window windowH, Point localPos) const; void setMinimised (::Window windowH, bool shouldBeMinimised) const; bool isMinimised (::Window windowH) const; void toFront (::Window windowH, bool makeActive) const; void toBehind (::Window windowH, ::Window otherWindow) const; bool isFocused (::Window windowH) const; bool grabFocus (::Window windowH) const; bool canUseSemiTransparentWindows() const; bool canUseARGBImages() const; int getNumPaintsPending (::Window windowH) const; Image createImage (int width, int height, bool argb) const; void blitToWindow (::Window windowH, Image image, Rectangle destinationRect, Rectangle totalRect) const; void setScreenSaverEnabled (bool enabled) const; Point getCurrentMousePosition() const; void setMousePosition (Point pos) const; void* createCustomMouseCursorInfo (const Image& image, Point hotspot) const; void deleteMouseCursor (void* cursorHandle) const; void* createStandardMouseCursor (MouseCursor::StandardCursorType type) const; void showCursor (::Window windowH, void* cursorHandle) const; bool isKeyCurrentlyDown (int keyCode) const; ModifierKeys getNativeRealtimeModifiers() const; Array findDisplays (float masterScale) const; ::Window createKeyProxy (::Window windowH) const; void deleteKeyProxy (::Window keyProxy) const; bool externalDragFileInit (LinuxComponentPeer<::Window>* peer, const StringArray& files, bool canMove, std::function&& callback) const; bool externalDragTextInit (LinuxComponentPeer<::Window>* peer, const String& text, std::function&& callback) const; void copyTextToClipboard (const String& clipText); String getTextFromClipboard() const; String getLocalClipboardContent() const { return localClipboardContent; } ::Display* getDisplay() { return display; } XWindowSystemUtilities::Atoms& getAtoms() { return atoms; } //============================================================================== void handleWindowMessage (LinuxComponentPeer<::Window>* peer, XEvent& event) const; //============================================================================== JUCE_DECLARE_SINGLETON (XWindowSystem, false) private: XWindowSystem(); ~XWindowSystem(); //============================================================================== bool initialiseXDisplay(); void destroyXDisplay(); //============================================================================== ::Window getFocusWindow (::Window windowH) const; bool isParentWindowOf (::Window windowH, ::Window possibleChild) const; bool isFrontWindow (::Window windowH) const; //============================================================================== void xchangeProperty (::Window windowH, Atom property, Atom type, int format, const void* data, int numElements) const; void removeWindowDecorations (::Window windowH) const; void addWindowButtons (::Window windowH, int styleFlags) const; void setWindowType (::Window windowH, int styleFlags) const; void initialisePointerMap(); void deleteIconPixmaps (::Window windowH) const; void updateModifierMappings() const; long getUserTime (::Window windowH) const; //============================================================================== void handleKeyPressEvent (LinuxComponentPeer<::Window>*, XKeyEvent&) const; void handleKeyReleaseEvent (LinuxComponentPeer<::Window>*, const XKeyEvent&) const; void handleWheelEvent (LinuxComponentPeer<::Window>*, const XButtonPressedEvent&, float) const; void handleButtonPressEvent (LinuxComponentPeer<::Window>*, const XButtonPressedEvent&, int) const; void handleButtonPressEvent (LinuxComponentPeer<::Window>*, const XButtonPressedEvent&) const; void handleButtonReleaseEvent (LinuxComponentPeer<::Window>*, const XButtonReleasedEvent&) const; void handleMotionNotifyEvent (LinuxComponentPeer<::Window>*, const XPointerMovedEvent&) const; void handleEnterNotifyEvent (LinuxComponentPeer<::Window>*, const XEnterWindowEvent&) const; void handleLeaveNotifyEvent (LinuxComponentPeer<::Window>*, const XLeaveWindowEvent&) const; void handleFocusInEvent (LinuxComponentPeer<::Window>*) const; void handleFocusOutEvent (LinuxComponentPeer<::Window>*) const; void handleExposeEvent (LinuxComponentPeer<::Window>*, XExposeEvent&) const; void handleConfigureNotifyEvent (LinuxComponentPeer<::Window>*, XConfigureEvent&) const; void handleGravityNotify (LinuxComponentPeer<::Window>*) const; void handleMappingNotify (XMappingEvent&) const; void handleClientMessageEvent (LinuxComponentPeer<::Window>*, XClientMessageEvent&, XEvent&) const; void handleXEmbedMessage (LinuxComponentPeer<::Window>*, XClientMessageEvent&) const; //============================================================================== bool xIsAvailable = false; XWindowSystemUtilities::Atoms atoms; ::Display* display = nullptr; Colormap colormap = {}; Visual* visual = nullptr; int depth = 0, shmCompletionEvent = 0; int pointerMap[5] = {}; String localClipboardContent; Point parentScreenPosition; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XWindowSystem) }; } // namespace juce