X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/93e73c740e6cdd6d498439aeb731fe5f3e75ea8d..47e59154157bb013ce255a4efa7a615574c974f7:/src/motif/cursor.cpp diff --git a/src/motif/cursor.cpp b/src/motif/cursor.cpp index f47a1b400e..a40c79befa 100644 --- a/src/motif/cursor.cpp +++ b/src/motif/cursor.cpp @@ -1,25 +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 ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "cursor.h" +// 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" -#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 @@ -43,17 +47,17 @@ public: WX_DECLARE_LIST(wxXCursor, wxXCursorList); #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxXCursorList); +WX_DEFINE_LIST(wxXCursorList) class WXDLLEXPORT wxCursorRefData: public wxObjectRefData { friend class WXDLLEXPORT wxCursor; public: wxCursorRefData(); - ~wxCursorRefData(); - + virtual ~wxCursorRefData(); + wxXCursorList m_cursors; // wxXCursor objects, one per display - wxStockCursor m_cursorId; // wxWindows standard cursor id + wxStockCursor m_cursorId; // wxWidgets standard cursor id }; #define M_CURSORDATA ((wxCursorRefData *)m_refData) @@ -68,7 +72,7 @@ wxCursorRefData::wxCursorRefData() wxCursorRefData::~wxCursorRefData() { - wxXCursorList::Node* node = m_cursors.GetFirst(); + wxXCursorList::compatibility_iterator node = m_cursors.GetFirst(); while (node) { wxXCursor* c = node->GetData(); @@ -94,21 +98,22 @@ 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 * 2; + bits[i] = bits[i] & cMask; + cMask = (unsigned char)((cMask << 1) | 1); } } @@ -124,12 +129,12 @@ wxCursor::wxCursor(const wxImage & image) maskBits[i] = 0x0; i8 = i * 8; - cMask = 1; + cMask = 0x1; for (j=0; j<8; j++) { 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 * 2; + cMask = (unsigned char)(cMask << 1); } } } @@ -142,13 +147,13 @@ wxCursor::wxCursor(const wxImage & image) int hotSpotX; int hotSpotY; - if (image.HasOption(wxCUR_HOTSPOT_X)) - hotSpotX = image.GetOptionInt(wxCUR_HOTSPOT_X); + if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X)) + hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X); else hotSpotX = 0; - if (image.HasOption(wxCUR_HOTSPOT_Y)) - hotSpotY = image.GetOptionInt(wxCUR_HOTSPOT_Y); + if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y)) + hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y); else hotSpotY = 0; @@ -156,81 +161,56 @@ wxCursor::wxCursor(const wxImage & image) hotSpotX = 0; if (hotSpotY < 0 || hotSpotY >= h) hotSpotY = 0; - - m_refData = new wxCursorRefData; + + Create( (const char*)bits, w, h, hotSpotX, hotSpotY, + (const char*)maskBits ); + + delete[] bits; + delete[] maskBits; +} +#endif + +void wxCursor::Create(const char bits[], int width, int height, + int hotSpotX, int hotSpotY, const char maskBits[]) +{ + if( !m_refData ) + m_refData = new wxCursorRefData; Display *dpy = (Display*) wxGetDisplay(); int screen_num = DefaultScreen (dpy); Pixmap pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) bits, w, h, + RootWindow (dpy, screen_num), + (char*) bits, width, height, 1 , 0 , 1); Pixmap mask_pixmap = None; if (maskBits != NULL) { mask_pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) maskBits, w, h, + RootWindow (dpy, screen_num), + (char*) maskBits, width, height, 1 , 0 , 1); } - XColor foreground_color; - XColor background_color; - foreground_color.pixel = BlackPixel(dpy, screen_num); - background_color.pixel = WhitePixel(dpy, screen_num); - Colormap cmap = (Colormap) wxTheApp->GetMainColormap((WXDisplay*) dpy); - XQueryColor(dpy, cmap, &foreground_color); - XQueryColor(dpy, cmap, &background_color); - - Cursor cursor = XCreatePixmapCursor (dpy, - pixmap, - mask_pixmap, - &foreground_color, - &background_color, - hotSpotX , - hotSpotY); + Create( (WXPixmap)pixmap, (WXPixmap)mask_pixmap, hotSpotX, hotSpotY ); XFreePixmap( dpy, pixmap ); if (mask_pixmap != None) { XFreePixmap( dpy, mask_pixmap ); } - - if (cursor) - { - wxXCursor *c = new wxXCursor; - - c->m_cursor = (WXCursor) cursor; - c->m_display = (WXDisplay*) dpy; - M_CURSORDATA->m_cursors.Append(c); - } } -#endif -wxCursor::wxCursor(const char bits[], int width, int height, - int hotSpotX, int hotSpotY, const char maskBits[]) +void wxCursor::Create(WXPixmap pixmap, WXPixmap mask_pixmap, + int hotSpotX, int hotSpotY) { - m_refData = new wxCursorRefData; + if( !m_refData ) + m_refData = new wxCursorRefData; Display *dpy = (Display*) wxGetDisplay(); int screen_num = DefaultScreen (dpy); - Pixmap pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) bits, width, height, - 1 , 0 , 1); - - Pixmap mask_pixmap = None; - if (maskBits != NULL) - { - mask_pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) maskBits, width, height, - 1 , 0 , 1); - } - XColor foreground_color; XColor background_color; foreground_color.pixel = BlackPixel(dpy, screen_num); @@ -240,19 +220,13 @@ wxCursor::wxCursor(const char bits[], int width, int height, XQueryColor(dpy, cmap, &background_color); Cursor cursor = XCreatePixmapCursor (dpy, - pixmap, - mask_pixmap, + (Pixmap)pixmap, + (Pixmap)mask_pixmap, &foreground_color, &background_color, - hotSpotX , + hotSpotX , hotSpotY); - XFreePixmap( dpy, pixmap ); - if (mask_pixmap != None) - { - XFreePixmap( dpy, mask_pixmap ); - } - if (cursor) { wxXCursor *c = new wxXCursor; @@ -263,6 +237,12 @@ wxCursor::wxCursor(const char bits[], int width, int height, } } +wxCursor::wxCursor(const char bits[], int width, int height, + int hotSpotX, int hotSpotY, const char maskBits[]) +{ + Create(bits, width, height, hotSpotX, hotSpotY, maskBits); +} + wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) { // Must be an XBM file @@ -273,30 +253,17 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) int hotX = -1, hotY = -1; unsigned int w, h; - Pixmap pixmap; + Pixmap pixmap = None, mask_pixmap = None; Display *dpy = (Display*) wxGetDisplay(); int screen_num = DefaultScreen (dpy); - int value = XReadBitmapFile (dpy, RootWindow (dpy, DefaultScreen (dpy)), + int value = XReadBitmapFile (dpy, RootWindow (dpy, screen_num), wxConstCast(name.c_str(), char), &w, &h, &pixmap, &hotX, &hotY); - if ((value == BitmapFileInvalid) || - (value == BitmapOpenFailed) || - (value == BitmapNoMemory)) + if (value == BitmapSuccess) { - } - else - { - XColor foreground_color; - XColor background_color; - foreground_color.pixel = BlackPixel(dpy, screen_num); - background_color.pixel = WhitePixel(dpy, screen_num); - Colormap cmap = (Colormap) wxTheApp->GetMainColormap((WXDisplay*) dpy); - XQueryColor(dpy, cmap, &foreground_color); - XQueryColor(dpy, cmap, &background_color); - // TODO: how do we determine whether hotX, hotY were read correctly? if (hotX < 0 || hotY < 0) { @@ -309,26 +276,10 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) hotY = 0; } - Pixmap mask_pixmap = None; - Cursor cursor = XCreatePixmapCursor (dpy, - pixmap, - mask_pixmap, - &foreground_color, - &background_color, - hotX, - hotY); + Create( (WXPixmap)pixmap, (WXPixmap)mask_pixmap, hotX, hotY ); XFreePixmap( dpy, pixmap ); - if (cursor) - { - wxXCursor *c = new wxXCursor; - - c->m_cursor = (WXCursor) cursor; - c->m_display = (WXDisplay*) dpy; - M_CURSORDATA->m_cursors.Append(c); - } } - } // Cursors by stock number @@ -336,12 +287,6 @@ wxCursor::wxCursor(wxStockCursor id) { m_refData = new wxCursorRefData; M_CURSORDATA->m_cursorId = id; - - WXDisplay* display = wxGetDisplay(); - if (!display) - return; - - WXCursor cursor = GetXCursor(display); } wxCursor::~wxCursor() @@ -354,11 +299,11 @@ bool wxCursor::Ok() const } // Motif-specific: create/get a cursor for the current display -WXCursor wxCursor::GetXCursor(WXDisplay* display) +WXCursor wxCursor::GetXCursor(WXDisplay* display) const { if (!M_CURSORDATA) return (WXCursor) 0; - wxXCursorList::Node* node = M_CURSORDATA->m_cursors.GetFirst(); + wxXCursorList::compatibility_iterator node = M_CURSORDATA->m_cursors.GetFirst(); while (node) { wxXCursor* c = node->GetData(); @@ -389,7 +334,7 @@ WXCursor wxCursor::GetXCursor(WXDisplay* display) } // Make a cursor from standard id -WXCursor wxCursor::MakeCursor(WXDisplay* display, wxStockCursor id) +WXCursor wxCursor::MakeCursor(WXDisplay* display, wxStockCursor id) const { Display* dpy = (Display*) display; Cursor cursor = (Cursor) 0; @@ -397,17 +342,18 @@ WXCursor wxCursor::MakeCursor(WXDisplay* display, wxStockCursor id) 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; @@ -484,7 +430,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(); @@ -511,7 +457,7 @@ wxXSetBusyCursor (wxWindow * win, wxCursor * cursor) XFlush (display); - for(wxWindowList::Node *node = win->GetChildren().GetFirst (); node; + for(wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst (); node; node = node->GetNext()) { wxWindow *child = node->GetData (); @@ -520,12 +466,12 @@ 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) { - for(wxWindowList::Node *node = wxTopLevelWindows.GetFirst (); node; + for(wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst (); node; node = node->GetNext()) { wxWindow *win = node->GetData (); @@ -543,7 +489,7 @@ void wxEndBusyCursor() wxBusyCursorCount--; if (wxBusyCursorCount == 0) { - for(wxWindowList::Node *node = wxTopLevelWindows.GetFirst (); node; + for(wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst (); node; node = node->GetNext()) { wxWindow *win = node->GetData (); @@ -552,7 +498,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);