X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc6e28d55ac11ae700a304dd2ce3f4e20923ca88..5c6aad4737c43ad32408132ab5e927679393c47e:/src/motif/cursor.cpp diff --git a/src/motif/cursor.cpp b/src/motif/cursor.cpp index c14ddb8a1c..df2e6c14b9 100644 --- a/src/motif/cursor.cpp +++ b/src/motif/cursor.cpp @@ -1,29 +1,29 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: cursor.cpp +// Name: src/motif/cursor.cpp // Purpose: wxCursor class // Author: Julian Smart // Modified by: // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "cursor.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#ifndef WX_PRECOMP + #include "wx/list.h" +#endif + #include "wx/cursor.h" -#include "wx/app.h" -#include "wx/utils.h" -#include "wx/list.h" -#include "wx/window.h" -#if wxUSE_IMAGE -#include "wx/image.h" -#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/window.h" + #include "wx/image.h" +#endif #ifdef __VMS__ #pragma message disable nosimpint @@ -47,17 +47,18 @@ public: WX_DECLARE_LIST(wxXCursor, wxXCursorList); #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxXCursorList); +WX_DEFINE_LIST(wxXCursorList) -class WXDLLEXPORT wxCursorRefData: public wxObjectRefData +class WXDLLEXPORT wxCursorRefData: public wxGDIRefData { - friend class WXDLLEXPORT wxCursor; public: wxCursorRefData(); - ~wxCursorRefData(); - + virtual ~wxCursorRefData(); + wxXCursorList m_cursors; // wxXCursor objects, one per display wxStockCursor m_cursorId; // wxWidgets standard cursor id + + friend class wxCursor; }; #define M_CURSORDATA ((wxCursorRefData *)m_refData) @@ -98,7 +99,8 @@ wxCursor::wxCursor(const wxImage & image) unsigned char * bits = new unsigned char [imagebitcount]; unsigned char * maskBits = new unsigned char [imagebitcount]; - int i, j, i8; unsigned char c, cMask; + int i, j, i8; + unsigned char c, cMask; for (i=0; i mid grey + c = (unsigned char)(rgbBits[(i8+j)*3]/3 + rgbBits[(i8+j)*3+1]/3 + rgbBits[(i8+j)*3+2]/3); + // if average value is > mid grey if (c>127) bits[i] = bits[i] & cMask; - cMask = (cMask << 1) | 1; + cMask = (unsigned char)((cMask << 1) | 1); } } @@ -133,7 +135,7 @@ wxCursor::wxCursor(const wxImage & image) { if (rgbBits[(i8+j)*3] != r || rgbBits[(i8+j)*3+1] != g || rgbBits[(i8+j)*3+2] != b) maskBits[i] = maskBits[i] | cMask; - cMask = (cMask << 1); + cMask = (unsigned char)(cMask << 1); } } } @@ -223,7 +225,7 @@ void wxCursor::Create(WXPixmap pixmap, WXPixmap mask_pixmap, (Pixmap)mask_pixmap, &foreground_color, &background_color, - hotSpotX , + hotSpotX , hotSpotY); if (cursor) @@ -237,16 +239,20 @@ void wxCursor::Create(WXPixmap pixmap, WXPixmap mask_pixmap, } wxCursor::wxCursor(const char bits[], int width, int height, - int hotSpotX, int hotSpotY, const char maskBits[]) + int hotSpotX, int hotSpotY, const char maskBits[] , + const wxColour* WXUNUSED(fg), const wxColour* WXUNUSED(bg) ) { Create(bits, width, height, hotSpotX, hotSpotY, maskBits); } -wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) +wxCursor::wxCursor(const wxString& name, wxBitmapType type, int hotSpotX, + int hotSpotY ) { // Must be an XBM file - if (flags != wxBITMAP_TYPE_XBM) + if (type != wxBITMAP_TYPE_XBM) { + wxLogError("Invalid cursor bitmap type '%d'", type); return; + } m_refData = new wxCursorRefData; @@ -258,7 +264,7 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) int screen_num = DefaultScreen (dpy); int value = XReadBitmapFile (dpy, RootWindow (dpy, screen_num), - wxConstCast(name.c_str(), char), + name.mb_str(), &w, &h, &pixmap, &hotX, &hotY); if (value == BitmapSuccess) @@ -282,7 +288,7 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) } // Cursors by stock number -wxCursor::wxCursor(wxStockCursor id) +void wxCursor::InitFromStock(wxStockCursor id) { m_refData = new wxCursorRefData; M_CURSORDATA->m_cursorId = id; @@ -292,9 +298,14 @@ wxCursor::~wxCursor() { } -bool wxCursor::Ok() const +wxGDIRefData *wxCursor::CreateGDIRefData() const { - return m_refData != NULL; + return new wxCursorRefData; +} + +wxGDIRefData *wxCursor::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxCursorRefData(*static_cast(data)); } // Motif-specific: create/get a cursor for the current display @@ -341,17 +352,18 @@ WXCursor wxCursor::MakeCursor(WXDisplay* display, wxStockCursor id) const switch (id) { + case wxCURSOR_CHAR: return (WXCursor)cursor; + case wxCURSOR_WAIT: x_cur = XC_watch; break; - case wxCURSOR_CROSS: x_cur = XC_crosshair; break; - case wxCURSOR_CHAR: return (WXCursor)cursor; break; + case wxCURSOR_CROSS: x_cur = XC_crosshair; break; case wxCURSOR_HAND: x_cur = XC_hand1; break; case wxCURSOR_BULLSEYE: x_cur = XC_target; break; - case wxCURSOR_PENCIL: x_cur = XC_pencil; break; - case wxCURSOR_MAGNIFIER: x_cur = XC_sizing; break; - case wxCURSOR_IBEAM: x_cur = XC_xterm; break; + case wxCURSOR_PENCIL: x_cur = XC_pencil; break; + case wxCURSOR_MAGNIFIER: x_cur = XC_sizing; break; + case wxCURSOR_IBEAM: x_cur = XC_xterm; break; case wxCURSOR_NO_ENTRY: x_cur = XC_pirate; break; - case wxCURSOR_LEFT_BUTTON: x_cur = XC_leftbutton; break; - case wxCURSOR_RIGHT_BUTTON: x_cur = XC_rightbutton; break; + case wxCURSOR_LEFT_BUTTON: x_cur = XC_leftbutton; break; + case wxCURSOR_RIGHT_BUTTON: x_cur = XC_rightbutton; break; case wxCURSOR_MIDDLE_BUTTON: x_cur = XC_middlebutton; break; case wxCURSOR_QUESTION_ARROW: x_cur = XC_question_arrow; break; case wxCURSOR_SIZING: x_cur = XC_sizing; break; @@ -428,7 +440,7 @@ static int wxBusyCursorCount = 0; // Helper function static void -wxXSetBusyCursor (wxWindow * win, wxCursor * cursor) +wxXSetBusyCursor (wxWindow * win, const wxCursor * cursor) { Display *display = (Display*) win->GetXDisplay(); @@ -455,7 +467,7 @@ wxXSetBusyCursor (wxWindow * win, wxCursor * cursor) XFlush (display); - for(wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst (); node; + for(wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst (); node; node = node->GetNext()) { wxWindow *child = node->GetData (); @@ -464,7 +476,7 @@ wxXSetBusyCursor (wxWindow * win, wxCursor * cursor) } // Set the cursor to the busy cursor for all windows -void wxBeginBusyCursor(wxCursor *cursor) +void wxBeginBusyCursor(const wxCursor *cursor) { wxBusyCursorCount++; if (wxBusyCursorCount == 1) @@ -496,7 +508,7 @@ void wxEndBusyCursor() } } -// TRUE if we're between the above two calls +// true if we're between the above two calls bool wxIsBusy() { return (wxBusyCursorCount > 0);