///////////////////////////////////////////////////////////////////////////// // Name: wx/cursor.h // Purpose: wxCursor base header // Author: Julian Smart, Vadim Zeitlin // Created: // Copyright: (c) Julian Smart // (c) 2014 Vadim Zeitlin (wxCursorBase) // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_CURSOR_H_BASE_ #define _WX_CURSOR_H_BASE_ #include "wx/gdiobj.h" #include "wx/gdicmn.h" // Under most ports, wxCursor derives directly from wxGDIObject, but in wxMSW // there is an intermediate wxGDIImage class. #ifdef __WXMSW__ #include "wx/msw/gdiimage.h" #else typedef wxGDIObject wxGDIImage; #endif class WXDLLIMPEXP_FWD_CORE wxBitmapBundle; class WXDLLIMPEXP_FWD_CORE wxWindow; class WXDLLIMPEXP_CORE wxCursorBase : public wxGDIImage { public: /* wxCursor classes should provide the following ctors: wxCursor(); wxCursor(const wxImage& image); wxCursor(const wxBitmap& bitmap, const wxPoint& hotSpot); wxCursor(const wxBitmap& bitmap, int hotSpotX = 0, int hotSpotY = 0); wxCursor(const wxString& name, wxBitmapType type, const wxPoint& hotSpot); wxCursor(const wxString& name, wxBitmapType type = wxCURSOR_DEFAULT_TYPE, int hotSpotX = 0, int hotSpotY = 0); wxCursor(wxStockCursor id) { InitFromStock(id); } */ virtual wxPoint GetHotSpot() const { return wxDefaultPosition; } }; #if defined(__WXMSW__) #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE #include "wx/msw/cursor.h" #elif defined(__WXGTK__) #ifdef __WINDOWS__ #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE #else #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM #endif #include "wx/gtk/cursor.h" #elif defined(__WXX11__) #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM #include "wx/x11/cursor.h" #elif defined(__WXDFB__) #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE #include "wx/dfb/cursor.h" #elif defined(__WXMAC__) #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_MACCURSOR_RESOURCE #include "wx/osx/cursor.h" #elif defined(__WXQT__) #ifdef __WINDOWS__ #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE #else #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR #endif #include "wx/qt/cursor.h" #endif // ---------------------------------------------------------------------------- // wxCursorBundle stores 1 or more versions of the same cursor, to be used at // different DPI scaling levels. // ---------------------------------------------------------------------------- class wxCursorBundleImpl; class WXDLLIMPEXP_CORE wxCursorBundle { public: // Default ctor constructs an empty bundle which can't be used for // anything, but can be assigned something later. wxCursorBundle(); // Create a cursor bundle from the given bitmap bundle. // // Note that the hotspot coordinates must be relative to the default size // of the bitmap bundle and are scaled for other sizes. explicit wxCursorBundle(const wxBitmapBundle& bitmaps, const wxPoint& hotSpot); explicit wxCursorBundle(const wxBitmapBundle& bitmaps, int hotSpotX = 0, int hotSpotY = 0) : wxCursorBundle(bitmaps, wxPoint(hotSpotX, hotSpotY)) { } // This conversion ctor from a single cursor only exists for // interoperability with the existing code using wxCursor. wxCursorBundle(const wxCursor& cursor); // This is another conversion ctor existing to allow existing code using // wxCursor to work without changes with wxCursorBundle. wxCursorBundle(wxStockCursor id); // Default copy ctor and assignment operator and dtor would be ok, but need // to be defined out of line, where wxCursorBundleImpl is fully declared. wxCursorBundle(const wxCursorBundle& other); wxCursorBundle& operator=(const wxCursorBundle& other); ~wxCursorBundle(); // Check if cursor bundle is non-empty. wxNODISCARD bool IsOk() const { return m_impl.get() != nullptr; } // Clear the bundle contents, IsOk() will return false after doing this. void Clear(); // Get the cursor of the size suitable for the DPI used by the given window. wxNODISCARD wxCursor GetCursorFor(const wxWindow* window) const; // Get the cursor of the default size: prefer to use GetCursorFor() instead // if there is a suitable window available, this function only exists as // last resort. wxNODISCARD wxCursor GetCursorForMainWindow() const; // Check if two objects refer to the same bundle. wxNODISCARD bool IsSameAs(const wxCursorBundle& other) const { return m_impl == other.m_impl; } private: using ImplPtr = wxObjectDataPtr<wxCursorBundleImpl>; // Private ctor used by static factory functions to create objects of this // class. It takes ownership of the pointer (which must be non-null). explicit wxCursorBundle(const ImplPtr& impl); ImplPtr m_impl; }; // For compatibility, include busy cursor-related stuff which used to be pulled // in by this header via wx/utils.h. #include "wx/busycursor.h" #endif // _WX_CURSOR_H_BASE_