/////////////////////////////////////////////////////////////////////////////
-// Name: cursor.cpp
+// Name: src/os2/cursor.cpp
// Purpose: wxCursor class
// Author: David Webster
// Modified by:
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
-#ifndef WX_PRECOMP
-#include <stdio.h>
-#include "wx/setup.h"
-#include "wx/list.h"
-#include "wx/utils.h"
-#include "wx/app.h"
#include "wx/cursor.h"
-#include "wx/icon.h"
+
+#ifndef WX_PRECOMP
+ #include <stdio.h>
+ #include "wx/list.h"
+ #include "wx/utils.h"
+ #include "wx/app.h"
+ #include "wx/icon.h"
+ #include "wx/image.h"
+ #include "wx/log.h"
#endif
#include "wx/os2/private.h"
+#include "wx/os2/wxrsc.h"
#include "assert.h"
-#if !USE_SHARED_LIBRARIES
IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
-#endif
wxCursorRefData::wxCursorRefData(void)
{
m_nWidth = 32;
m_nHeight = 32;
m_hCursor = 0 ;
- m_destroyCursor = FALSE;
+ m_bDestroyCursor = false;
}
-wxCursorRefData::~wxCursorRefData(void)
+void wxCursorRefData::Free()
{
-// if ( m_hCursor && m_destroyCursor)
-// ::DestroyCursor((HICON) m_hCursor);
-}
+ if (m_hCursor)
+ {
+ if (m_bDestroyCursor)
+ ::WinDestroyPointer((HPOINTER)m_hCursor);
+ m_hCursor = 0;
+ }
+} // end of wxCursorRefData::Free
// Cursors
wxCursor::wxCursor(void)
{
}
-wxCursor::wxCursor(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSED(height),
- int WXUNUSED(hotSpotX), int WXUNUSED(hotSpotY), const char WXUNUSED(maskBits)[])
+wxCursor::wxCursor(const wxImage& rImage)
{
-}
+ wxImage vImage32 = rImage.Scale(32,32);
+ int nWidth = vImage32.GetWidth();
+ int nHeight = vImage32.GetHeight();
+
+ //
+ // Need a bitmap handle somehow
+ //
+ HBITMAP hBitmap = wxBitmap(vImage32).GetHBITMAP();
+ int nHotSpotX = vImage32.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
+ int nHotSpotY = vImage32.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
+
+ if (nHotSpotX < 0 || nHotSpotX >= nWidth)
+ nHotSpotX = 0;
+ if (nHotSpotY < 0 || nHotSpotY >= nHeight)
+ nHotSpotY = 0;
+
-wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY)
+ wxCursorRefData* pRefData = new wxCursorRefData;
+
+ m_refData = pRefData;
+ pRefData->m_hCursor = (WXHCURSOR) ::WinCreatePointer( HWND_DESKTOP
+ ,hBitmap
+ ,TRUE
+ ,nHotSpotY
+ ,nHotSpotX
+ );
+
+} // end of wxCursor::wxCursor
+
+wxCursor::wxCursor( const wxString& WXUNUSED(rsCursorFile),
+ wxBitmapType type,
+ int WXUNUSED(nHotSpotX),
+ int WXUNUSED(nHotSpotY) )
{
- m_refData = new wxCursorRefData;
-
- M_CURSORDATA->m_destroyCursor = FALSE;
- M_CURSORDATA->m_hCursor = 0;
-// TODO:
-/*
- M_CURSORDATA->m_bOK = FALSE;
- if (flags & wxBITMAP_TYPE_CUR_RESOURCE)
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), cursor_file, IMAGE_CURSOR, 0, 0, 0);
- if (M_CURSORDATA->m_hCursor)
- M_CURSORDATA->m_ok = TRUE;
+ wxCursorRefData* pRefData = new wxCursorRefData;
+
+ pRefData = new wxCursorRefData;
+ m_refData = pRefData;
+ pRefData->m_bDestroyCursor = false;
+ if (type == wxBITMAP_TYPE_CUR_RESOURCE)
+ {
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)type // if OS/2 this should be the resource Id
+ );
+ }
else
- M_CURSORDATA->m_ok = FALSE;
- }
- else if (flags & wxBITMAP_TYPE_CUR)
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), cursor_file, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
- }
- else if (flags & wxBITMAP_TYPE_ICO)
- {
- }
- else if (flags & wxBITMAP_TYPE_BMP)
- {
- }
-*/
-}
+ wxLogError("Invalid cursor bitmap type '%d'", type);
+} // end of wxCursor::wxCursor
// Cursors by stock number
-wxCursor::wxCursor(int cursor_type)
+void wxCursor::InitFromStock(wxStockCursor nCursorType)
{
- m_refData = new wxCursorRefData;
-// TODO:
-/*
- switch (cursor_type)
- {
- case wxCURSOR_WAIT:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_WAIT);
- break;
- case wxCURSOR_IBEAM:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_IBEAM);
- break;
- case wxCURSOR_CROSS:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_CROSS);
- break;
- case wxCURSOR_SIZENWSE:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENWSE);
- break;
- case wxCURSOR_SIZENESW:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENESW);
- break;
- case wxCURSOR_SIZEWE:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZEWE);
- break;
- case wxCURSOR_SIZENS:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENS);
- break;
- case wxCURSOR_CHAR:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW);
- break;
- }
- case wxCURSOR_HAND:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_HAND"));
- break;
- }
- case wxCURSOR_BULLSEYE:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BULLSEYE"));
- break;
- }
- case wxCURSOR_PENCIL:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PENCIL"));
- break;
- }
- case wxCURSOR_MAGNIFIER:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_MAGNIFIER"));
- break;
- }
- case wxCURSOR_NO_ENTRY:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_NO_ENTRY"));
- break;
- }
- case wxCURSOR_LEFT_BUTTON:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW);
- break;
- }
- case wxCURSOR_RIGHT_BUTTON:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW);
- break;
- }
- case wxCURSOR_MIDDLE_BUTTON:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW);
- break;
- }
- case wxCURSOR_SIZING:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_SIZING"));
- break;
- }
- case wxCURSOR_WATCH:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_WATCH"));
- break;
- }
- case wxCURSOR_SPRAYCAN:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_ROLLER"));
- break;
- }
- case wxCURSOR_PAINT_BRUSH:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PBRUSH"));
- break;
- }
- case wxCURSOR_POINT_LEFT:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PLEFT"));
- break;
- }
- case wxCURSOR_POINT_RIGHT:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PRIGHT"));
- break;
- }
- case wxCURSOR_QUESTION_ARROW:
- {
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_QARROW"));
- break;
- }
- case wxCURSOR_BLANK:
+ wxCursorRefData* pRefData = new wxCursorRefData;
+
+ m_refData = pRefData;
+ switch (nCursorType)
{
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BLANK"));
- break;
- }
- default:
- case wxCURSOR_ARROW:
- M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW);
- break;
- }
-*/
-}
+ case wxCURSOR_ARROWWAIT:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_WAIT
+ ,FALSE
+ );
+ break;
-wxCursor::~wxCursor(void)
-{
-// FreeResource(TRUE);
-}
+ case wxCURSOR_WATCH:
+ case wxCURSOR_WAIT:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_WAIT
+ ,FALSE
+ );
+ break;
-bool wxCursor::FreeResource(bool WXUNUSED(force))
-{
-// if (M_CURSORDATA && M_CURSORDATA->m_hCursor && M_CURSORDATA->m_destroyCursor)
-// {
-// DestroyCursor((HCURSOR) M_CURSORDATA->m_hCursor);
-// M_CURSORDATA->m_hCursor = 0;
-// }
- return TRUE;
-}
+ case wxCURSOR_IBEAM:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_TEXT
+ ,FALSE
+ );
+ break;
-void wxCursor::SetHCURSOR(WXHCURSOR cursor)
-{
- if ( !M_CURSORDATA )
- m_refData = new wxCursorRefData;
+ case wxCURSOR_CROSS:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_MOVE
+ ,FALSE
+ );
+ break;
- M_CURSORDATA->m_hCursor = cursor;
-}
+ case wxCURSOR_SIZENWSE:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_SIZENWSE
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_SIZENESW:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_SIZENESW
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_SIZEWE:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_SIZEWE
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_SIZENS:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_SIZENS
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_CHAR:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_ARROW
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_HAND:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)wxCURSOR_HAND
+ );
+ break;
+
+ case wxCURSOR_BULLSEYE:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)wxCURSOR_BULLSEYE
+ );
+ break;
+
+ case wxCURSOR_PENCIL:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)wxCURSOR_PENCIL
+ );
+ break;
+
+ case wxCURSOR_MAGNIFIER:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)wxCURSOR_MAGNIFIER
+ );
+ break;
+
+ case wxCURSOR_NO_ENTRY:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_ILLEGAL
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_LEFT_BUTTON:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_ARROW
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_RIGHT_BUTTON:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_ARROW
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_MIDDLE_BUTTON:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_ARROW
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_SIZING:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_SIZE
+ ,FALSE
+ );
+ break;
+
+ case wxCURSOR_SPRAYCAN:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)WXCURSOR_ROLLER
+ );
+ break;
+
+ case wxCURSOR_PAINT_BRUSH:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)WXCURSOR_PBRUSH
+ );
+ break;
+
+ case wxCURSOR_POINT_LEFT:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)WXCURSOR_PLEFT
+ );
+ break;
+
+ case wxCURSOR_POINT_RIGHT:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)WXCURSOR_PRIGHT
+ );
+ break;
+
+ case wxCURSOR_QUESTION_ARROW:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)WXCURSOR_QARROW
+ );
+ break;
+
+ case wxCURSOR_BLANK:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
+ ,0
+ ,(ULONG)WXCURSOR_BLANK
+ );
+ break;
+
+ default:
+ case wxCURSOR_ARROW:
+ pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
+ ,(ULONG)SPTR_ARROW
+ ,FALSE
+ );
+ break;
+ }
+ //
+ // No need to destroy the stock cursors
+ //
+ ((wxCursorRefData *)m_refData)->m_bDestroyCursor = false;
+} // end of wxCursor::wxCursor
// Global cursor setting
void wxSetCursor(const wxCursor& cursor)
{
extern wxCursor *g_globalCursor;
- if ( cursor.Ok() && cursor.GetHCURSOR() )
+ if ( cursor.IsOk() && cursor.GetHCURSOR() )
{
// ::SetCursor((HCURSOR) cursor.GetHCURSOR());
(*g_globalCursor) = cursor;
}
}
-