/* ============================================================================== This file is part of the JUCE 6 technical preview. Copyright (c) 2017 - ROLI Ltd. You may use this code under the terms of the GPL v3 (see www.gnu.org/licenses). For this technical preview, this file is not subject to commercial licensing. 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 (::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() { jassert (atoms.get() != nullptr); return *atoms; } //============================================================================== void handleWindowMessage (LinuxComponentPeer<::Window>* peer, XEvent& event) const; //============================================================================== JUCE_DECLARE_SINGLETON (XWindowSystem, false) private: XWindowSystem(); ~XWindowSystem(); //============================================================================== void 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; std::unique_ptr 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