1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/os2/cursor.cpp
3// Purpose:     wxCursor class
4// Author:      David Webster
5// Modified by:
6// Created:     10/13/99
7// RCS-ID:      $Id: cursor.cpp 39957 2006-07-03 19:02:54Z ABX $
8// Copyright:   (c) David Webster
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#include "wx/cursor.h"
16
17#ifndef WX_PRECOMP
18    #include <stdio.h>
19    #include "wx/list.h"
20    #include "wx/utils.h"
21    #include "wx/app.h"
22    #include "wx/icon.h"
23    #include "wx/image.h"
24#endif
25
26#include "wx/os2/private.h"
27#include "wx/os2/wxrsc.h"
28
29#include "assert.h"
30
31IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
32
33wxCursorRefData::wxCursorRefData(void)
34{
35  m_nWidth = 32;
36  m_nHeight = 32;
37  m_hCursor = 0 ;
38  m_bDestroyCursor = false;
39}
40
41void wxCursorRefData::Free()
42{
43    if (m_hCursor)
44    {
45        if (m_bDestroyCursor)
46            ::WinDestroyPointer((HPOINTER)m_hCursor);
47        m_hCursor = 0;
48    }
49} // end of wxCursorRefData::Free
50
51// Cursors
52wxCursor::wxCursor(void)
53{
54}
55
56wxCursor::wxCursor(const char WXUNUSED(bits)[],
57                   int WXUNUSED(width),
58                   int WXUNUSED(height),
59                   int WXUNUSED(hotSpotX),
60                   int WXUNUSED(hotSpotY),
61                   const char WXUNUSED(maskBits)[])
62{
63}
64
65wxCursor::wxCursor(const wxImage& rImage)
66{
67    wxImage  vImage32 = rImage.Scale(32,32);
68    int      nWidth   = vImage32.GetWidth();
69    int      nHeight  = vImage32.GetHeight();
70
71    //
72    // Need a bitmap handle somehow
73    //
74    HBITMAP  hBitmap = wxBitmap(vImage32).GetHBITMAP();
75    int      nHotSpotX = vImage32.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
76    int      nHotSpotY = vImage32.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
77
78    if (nHotSpotX < 0 || nHotSpotX >= nWidth)
79        nHotSpotX = 0;
80    if (nHotSpotY < 0 || nHotSpotY >= nHeight)
81        nHotSpotY = 0;
82
83
84    wxCursorRefData* pRefData = new wxCursorRefData;
85
86    m_refData = pRefData;
87    pRefData->m_hCursor = (WXHCURSOR) ::WinCreatePointer( HWND_DESKTOP
88                                                         ,hBitmap
89                                                         ,TRUE
90                                                         ,nHotSpotY
91                                                         ,nHotSpotX
92                                                        );
93
94} // end of wxCursor::wxCursor
95
96wxCursor::wxCursor( const wxString& WXUNUSED(rsCursorFile),
97                    long lFlags,
98                    int WXUNUSED(nHotSpotX),
99                    int WXUNUSED(nHotSpotY) )
100{
101    wxCursorRefData* pRefData = new wxCursorRefData;
102
103    pRefData = new wxCursorRefData;
104    m_refData = pRefData;
105    pRefData->m_bDestroyCursor = false;
106    if (lFlags == wxBITMAP_TYPE_CUR_RESOURCE)
107    {
108        pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
109                                                           ,0
110                                                           ,(ULONG)lFlags // if OS/2 this should be the resource Id
111                                                          );
112    }
113} // end of wxCursor::wxCursor
114
115// Cursors by stock number
116wxCursor::wxCursor(int nCursorType)
117{
118    wxCursorRefData*                pRefData = new wxCursorRefData;
119
120    m_refData = pRefData;
121    switch (nCursorType)
122    {
123        case wxCURSOR_ARROWWAIT:
124            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
125                                                                   ,(ULONG)SPTR_WAIT
126                                                                   ,FALSE
127                                                                  );
128            break;
129
130        case wxCURSOR_WATCH:
131        case wxCURSOR_WAIT:
132            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
133                                                                   ,(ULONG)SPTR_WAIT
134                                                                   ,FALSE
135                                                                  );
136            break;
137
138        case wxCURSOR_IBEAM:
139            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
140                                                                   ,(ULONG)SPTR_TEXT
141                                                                   ,FALSE
142                                                                  );
143            break;
144
145        case wxCURSOR_CROSS:
146            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
147                                                                   ,(ULONG)SPTR_MOVE
148                                                                   ,FALSE
149                                                                  );
150            break;
151
152        case wxCURSOR_SIZENWSE:
153            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
154                                                                   ,(ULONG)SPTR_SIZENWSE
155                                                                   ,FALSE
156                                                                  );
157            break;
158
159        case wxCURSOR_SIZENESW:
160            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
161                                                                   ,(ULONG)SPTR_SIZENESW
162                                                                   ,FALSE
163                                                                  );
164            break;
165
166        case wxCURSOR_SIZEWE:
167            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
168                                                                   ,(ULONG)SPTR_SIZEWE
169                                                                   ,FALSE
170                                                                  );
171            break;
172
173        case wxCURSOR_SIZENS:
174            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
175                                                                   ,(ULONG)SPTR_SIZENS
176                                                                   ,FALSE
177                                                                  );
178            break;
179
180        case wxCURSOR_CHAR:
181            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
182                                                                   ,(ULONG)SPTR_ARROW
183                                                                   ,FALSE
184                                                                  );
185            break;
186
187        case wxCURSOR_HAND:
188            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
189                                                               ,0
190                                                               ,(ULONG)wxCURSOR_HAND
191                                                              );
192            break;
193
194        case wxCURSOR_BULLSEYE:
195            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
196                                                               ,0
197                                                               ,(ULONG)wxCURSOR_BULLSEYE
198                                                              );
199            break;
200
201        case wxCURSOR_PENCIL:
202            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
203                                                               ,0
204                                                               ,(ULONG)wxCURSOR_PENCIL
205                                                              );
206            break;
207
208        case wxCURSOR_MAGNIFIER:
209            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
210                                                               ,0
211                                                               ,(ULONG)wxCURSOR_MAGNIFIER
212                                                              );
213            break;
214
215        case wxCURSOR_NO_ENTRY:
216            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
217                                                                   ,(ULONG)SPTR_ILLEGAL
218                                                                   ,FALSE
219                                                                  );
220            break;
221
222        case wxCURSOR_LEFT_BUTTON:
223            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
224                                                                   ,(ULONG)SPTR_ARROW
225                                                                   ,FALSE
226                                                                  );
227            break;
228
229        case wxCURSOR_RIGHT_BUTTON:
230            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
231                                                                   ,(ULONG)SPTR_ARROW
232                                                                   ,FALSE
233                                                                  );
234            break;
235
236        case wxCURSOR_MIDDLE_BUTTON:
237            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
238                                                                   ,(ULONG)SPTR_ARROW
239                                                                   ,FALSE
240                                                                  );
241            break;
242
243        case wxCURSOR_SIZING:
244            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
245                                                                   ,(ULONG)SPTR_SIZE
246                                                                   ,FALSE
247                                                                  );
248            break;
249
250        case wxCURSOR_SPRAYCAN:
251            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
252                                                              ,0
253                                                              ,(ULONG)WXCURSOR_ROLLER
254                                                             );
255            break;
256
257        case wxCURSOR_PAINT_BRUSH:
258            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
259                                                               ,0
260                                                               ,(ULONG)WXCURSOR_PBRUSH
261                                                              );
262            break;
263
264        case wxCURSOR_POINT_LEFT:
265            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
266                                                               ,0
267                                                               ,(ULONG)WXCURSOR_PLEFT
268                                                              );
269            break;
270
271        case wxCURSOR_POINT_RIGHT:
272            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
273                                                               ,0
274                                                               ,(ULONG)WXCURSOR_PRIGHT
275                                                              );
276            break;
277
278        case wxCURSOR_QUESTION_ARROW:
279            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
280                                                               ,0
281                                                               ,(ULONG)WXCURSOR_QARROW
282                                                              );
283            break;
284
285        case wxCURSOR_BLANK:
286            pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
287                                                               ,0
288                                                               ,(ULONG)WXCURSOR_BLANK
289                                                              );
290            break;
291
292        default:
293        case wxCURSOR_ARROW:
294            pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
295                                                                   ,(ULONG)SPTR_ARROW
296                                                                   ,FALSE
297                                                                  );
298            break;
299    }
300    //
301    // No need to destroy the stock cursors
302    //
303    ((wxCursorRefData *)m_refData)->m_bDestroyCursor = false;
304} // end of wxCursor::wxCursor
305
306// Global cursor setting
307void wxSetCursor(const wxCursor& cursor)
308{
309    extern wxCursor *g_globalCursor;
310
311    if ( cursor.Ok() && cursor.GetHCURSOR() )
312    {
313//        ::SetCursor((HCURSOR) cursor.GetHCURSOR());
314
315        if ( g_globalCursor )
316            (*g_globalCursor) = cursor;
317    }
318}
319