]>
git.saurik.com Git - wxWidgets.git/blob - src/x11/cursor.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxCursor class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "cursor.h"
16 #include "wx/cursor.h"
17 #include "wx/gdicmn.h"
22 #include "wx/x11/private.h"
23 #include <X11/cursorfont.h>
25 //-----------------------------------------------------------------------------
27 //-----------------------------------------------------------------------------
29 class wxCursorRefData
: public wxObjectRefData
40 wxCursorRefData::wxCursorRefData()
46 wxCursorRefData::~wxCursorRefData()
49 XFreeCursor( (Display
*) m_display
, (Cursor
) m_cursor
);
52 //-----------------------------------------------------------------------------
54 #define M_CURSORDATA ((wxCursorRefData *)m_refData)
56 IMPLEMENT_DYNAMIC_CLASS(wxCursor
,wxObject
)
63 wxCursor::wxCursor( int cursorId
)
65 m_refData
= new wxCursorRefData();
67 M_CURSORDATA
->m_display
= wxGlobalDisplay();
68 wxASSERT_MSG( M_CURSORDATA
->m_display
, wxT("No display") );
70 int x_cur
= XC_left_ptr
;
73 case wxCURSOR_DEFAULT
: x_cur
= XC_left_ptr
; break;
74 case wxCURSOR_HAND
: x_cur
= XC_hand1
; break;
75 case wxCURSOR_CROSS
: x_cur
= XC_crosshair
; break;
76 case wxCURSOR_SIZEWE
: x_cur
= XC_sb_h_double_arrow
; break;
77 case wxCURSOR_SIZENS
: x_cur
= XC_sb_v_double_arrow
; break;
78 case wxCURSOR_ARROWWAIT
:
80 case wxCURSOR_WATCH
: x_cur
= XC_watch
; break;
81 case wxCURSOR_SIZING
: x_cur
= XC_sizing
; break;
82 case wxCURSOR_SPRAYCAN
: x_cur
= XC_spraycan
; break;
83 case wxCURSOR_IBEAM
: x_cur
= XC_xterm
; break;
84 case wxCURSOR_PENCIL
: x_cur
= XC_pencil
; break;
85 case wxCURSOR_NO_ENTRY
: x_cur
= XC_pirate
; break;
86 case wxCURSOR_SIZENWSE
:
87 case wxCURSOR_SIZENESW
: x_cur
= XC_fleur
; break;
88 case wxCURSOR_QUESTION_ARROW
: x_cur
= XC_question_arrow
; break;
89 case wxCURSOR_PAINT_BRUSH
: x_cur
= XC_spraycan
; break;
90 case wxCURSOR_MAGNIFIER
: x_cur
= XC_plus
; break;
91 case wxCURSOR_CHAR
: x_cur
= XC_xterm
; break;
92 case wxCURSOR_LEFT_BUTTON
: x_cur
= XC_leftbutton
; break;
93 case wxCURSOR_MIDDLE_BUTTON
: x_cur
= XC_middlebutton
; break;
94 case wxCURSOR_RIGHT_BUTTON
: x_cur
= XC_rightbutton
; break;
95 case wxCURSOR_BULLSEYE
: x_cur
= XC_target
; break;
97 case wxCURSOR_POINT_LEFT
: x_cur
= XC_sb_left_arrow
; break;
98 case wxCURSOR_POINT_RIGHT
: x_cur
= XC_sb_right_arrow
; break;
100 case wxCURSOR_DOUBLE_ARROW: x_cur = XC_double_arrow; break;
101 case wxCURSOR_CROSS_REVERSE: x_cur = XC_cross_reverse; break;
102 case wxCURSOR_BASED_ARROW_UP: x_cur = XC_based_arrow_up; break;
103 case wxCURSOR_BASED_ARROW_DOWN: x_cur = XC_based_arrow_down; break;
106 wxFAIL_MSG(wxT("unsupported cursor type"));
107 // will use the standard one
110 M_CURSORDATA
->m_cursor
= (WXCursor
) XCreateFontCursor( (Display
*) M_CURSORDATA
->m_display
, x_cur
);
113 wxCursor::wxCursor(const char bits
[], int width
, int height
,
114 int hotSpotX
, int hotSpotY
,
115 const char maskBits
[], wxColour
*fg
, wxColour
*bg
)
117 wxFAIL_MSG( "wxCursor creation from bits not yet implemented" );
121 wxCursor::wxCursor( const wxCursor
&cursor
)
127 wxCursor::wxCursor( const wxImage
& image
)
129 wxFAIL_MSG( "wxCursor creation from wxImage not yet implemented" );
133 wxCursor::~wxCursor()
137 wxCursor
& wxCursor::operator = ( const wxCursor
& cursor
)
147 bool wxCursor::operator == ( const wxCursor
& cursor
) const
149 return m_refData
== cursor
.m_refData
;
152 bool wxCursor::operator != ( const wxCursor
& cursor
) const
154 return m_refData
!= cursor
.m_refData
;
157 bool wxCursor::Ok() const
159 return (m_refData
!= NULL
);
162 WXCursor
wxCursor::GetCursor() const
164 return M_CURSORDATA
->m_cursor
;
167 //-----------------------------------------------------------------------------
168 // busy cursor routines
169 //-----------------------------------------------------------------------------
171 /* extern */ wxCursor g_globalCursor
;
173 static wxCursor gs_savedCursor
;
174 static int gs_busyCount
= 0;
176 const wxCursor
&wxBusyCursor::GetStoredCursor()
178 return gs_savedCursor
;
181 const wxCursor
wxBusyCursor::GetBusyCursor()
183 return wxCursor(wxCURSOR_WATCH
);
186 void wxEndBusyCursor()
188 if (--gs_busyCount
> 0)
191 wxSetCursor( gs_savedCursor
);
192 gs_savedCursor
= wxNullCursor
;
195 wxTheApp
->SendIdleEvents();
198 void wxBeginBusyCursor( wxCursor
*WXUNUSED(cursor
) )
200 if (gs_busyCount
++ > 0)
203 wxASSERT_MSG( !gs_savedCursor
.Ok(),
204 wxT("forgot to call wxEndBusyCursor, will leak memory") );
206 gs_savedCursor
= g_globalCursor
;
208 wxSetCursor( wxCursor(wxCURSOR_WATCH
) );
211 wxTheApp
->SendIdleEvents();
216 return gs_busyCount
> 0;
219 void wxSetCursor( const wxCursor
& cursor
)
221 g_globalCursor
= cursor
;