]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/cursor.cpp
1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "cursor.h"
15 #include "wx/cursor.h"
19 //-----------------------------------------------------------------------------
21 //-----------------------------------------------------------------------------
23 class wxCursorRefData
: public wxObjectRefData
33 wxCursorRefData::wxCursorRefData()
35 m_cursor
= (GdkCursor
*) NULL
;
38 wxCursorRefData::~wxCursorRefData()
40 if (m_cursor
) gdk_cursor_destroy( m_cursor
);
43 //-----------------------------------------------------------------------------
45 #define M_CURSORDATA ((wxCursorRefData *)m_refData)
47 IMPLEMENT_DYNAMIC_CLASS(wxCursor
,wxObject
)
53 wxCursor::wxCursor( int cursorId
)
55 m_refData
= new wxCursorRefData();
57 GdkCursorType gdk_cur
= GDK_LEFT_PTR
;
60 case wxCURSOR_HAND
: gdk_cur
= GDK_HAND1
; break;
61 case wxCURSOR_CROSS
: gdk_cur
= GDK_CROSSHAIR
; break;
62 case wxCURSOR_SIZEWE
: gdk_cur
= GDK_SB_H_DOUBLE_ARROW
; break;
63 case wxCURSOR_SIZENS
: gdk_cur
= GDK_SB_V_DOUBLE_ARROW
; break;
65 case wxCURSOR_WATCH
: gdk_cur
= GDK_WATCH
; break;
66 case wxCURSOR_SIZING
: gdk_cur
= GDK_SIZING
; break;
67 case wxCURSOR_SPRAYCAN
: gdk_cur
= GDK_SPRAYCAN
; break;
68 case wxCURSOR_IBEAM
: gdk_cur
= GDK_XTERM
; break;
69 case wxCURSOR_PENCIL
: gdk_cur
= GDK_PENCIL
; break;
70 case wxCURSOR_NO_ENTRY
: gdk_cur
= GDK_PIRATE
; break;
71 case wxCURSOR_SIZENWSE
:
72 case wxCURSOR_SIZENESW
: gdk_cur
= GDK_FLEUR
; break;
73 case wxCURSOR_QUESTION_ARROW
: gdk_cur
= GDK_QUESTION_ARROW
; break;
74 case wxCURSOR_PAINT_BRUSH
: gdk_cur
= GDK_SPRAYCAN
; break;
75 case wxCURSOR_MAGNIFIER
: gdk_cur
= GDK_PLUS
; break;
76 case wxCURSOR_CHAR
: gdk_cur
= GDK_XTERM
; break;
77 case wxCURSOR_LEFT_BUTTON
: gdk_cur
= GDK_LEFTBUTTON
; break;
78 case wxCURSOR_MIDDLE_BUTTON
: gdk_cur
= GDK_MIDDLEBUTTON
; break;
79 case wxCURSOR_RIGHT_BUTTON
: gdk_cur
= GDK_RIGHTBUTTON
; break;
81 case wxCURSOR_DOUBLE_ARROW: gdk_cur = GDK_DOUBLE_ARROW; break;
82 case wxCURSOR_CROSS_REVERSE: gdk_cur = GDK_CROSS_REVERSE; break;
83 case wxCURSOR_BASED_ARROW_UP: gdk_cur = GDK_BASED_ARROW_UP; break;
84 case wxCURSOR_BASED_ARROW_DOWN: gdk_cur = GDK_BASED_ARROW_DOWN; break;
87 wxFAIL_MSG(_T("unsupported cursor type"));
88 // will use the standard one
94 M_CURSORDATA
->m_cursor
= gdk_cursor_new( gdk_cur
);
97 wxCursor::wxCursor( const wxCursor
&cursor
)
102 wxCursor::~wxCursor()
106 wxCursor
& wxCursor::operator = ( const wxCursor
& cursor
)
116 bool wxCursor::operator == ( const wxCursor
& cursor
) const
118 return m_refData
== cursor
.m_refData
;
121 bool wxCursor::operator != ( const wxCursor
& cursor
) const
123 return m_refData
!= cursor
.m_refData
;
126 bool wxCursor::Ok() const
128 return (m_refData
!= NULL
);
131 GdkCursor
*wxCursor::GetCursor() const
133 return M_CURSORDATA
->m_cursor
;
136 //-----------------------------------------------------------------------------
137 // busy cursor routines
138 //-----------------------------------------------------------------------------
140 extern wxCursor
*g_globalCursor
;
142 static wxCursor
*gs_savedCursor
= NULL
;
143 static int gs_busyCount
= 0;
145 void wxEndBusyCursor()
147 if ( --gs_busyCount
> 0 )
150 wxCHECK_RET( gs_savedCursor
&& gs_savedCursor
->Ok(),
151 _T("calling wxEndBusyCursor() without wxBeginBusyCursor()?") );
153 wxSetCursor(*gs_savedCursor
);
154 delete gs_savedCursor
;
155 gs_savedCursor
= NULL
;
158 void wxBeginBusyCursor( wxCursor
*WXUNUSED(cursor
) )
160 if ( gs_busyCount
++ > 0 )
163 wxASSERT_MSG( !gs_savedCursor
,
164 _T("forgot to call wxEndBusyCursor, will leak memory") );
166 gs_savedCursor
= new wxCursor
;
167 if ( g_globalCursor
&& g_globalCursor
->Ok() )
168 *gs_savedCursor
= *g_globalCursor
;
170 *gs_savedCursor
= wxCursor(wxCURSOR_ARROW
);
171 wxSetCursor(wxCursor(wxCURSOR_WATCH
));
176 return gs_busyCount
> 0;
179 void wxSetCursor( const wxCursor
& cursor
)
181 if (g_globalCursor
) (*g_globalCursor
) = cursor
;