X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..9a35701127e3e8d2c7fb433d85c7b3954ccbfc9f:/src/os2/cursor.cpp diff --git a/src/os2/cursor.cpp b/src/os2/cursor.cpp index 4333364c93..c1d68f0ffe 100644 --- a/src/os2/cursor.cpp +++ b/src/os2/cursor.cpp @@ -1,187 +1,333 @@ ///////////////////////////////////////////////////////////////////////////// // Name: cursor.cpp // Purpose: wxCursor class -// Author: AUTHOR +// Author: David Webster // Modified by: -// Created: ??/??/98 +// Created: 10/13/99 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) David Webster +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "cursor.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" +#ifndef WX_PRECOMP +#include +#include "wx/setup.h" +#include "wx/list.h" +#include "wx/utils.h" +#include "wx/app.h" #include "wx/cursor.h" #include "wx/icon.h" +#endif + +#include "wx/os2/private.h" +#include "wx/os2/wxrsc.h" +#include "wx/image.h" + +#include "assert.h" -#if !USE_SHARED_LIBRARIES IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap) -#endif -wxCursorRefData::wxCursorRefData() +wxCursorRefData::wxCursorRefData(void) { - m_width = 32; m_height = 32; - -/* TODO - m_hCursor = 0 ; -*/ + m_nWidth = 32; + m_nHeight = 32; + m_hCursor = 0 ; + m_bDestroyCursor = FALSE; } -wxCursorRefData::~wxCursorRefData() +void wxCursorRefData::Free() { - // TODO: destroy cursor -} + if (m_hCursor) + { + if (m_bDestroyCursor) + ::WinDestroyPointer((HPOINTER)m_hCursor); + m_hCursor = 0; + } +} // end of wxCursorRefData::Free // Cursors -wxCursor::wxCursor() +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 char WXUNUSED(bits)[] +, int WXUNUSED(width) +, int WXUNUSED(height) +, int WXUNUSED(hotSpotX) +, int WXUNUSED(hotSpotY) +, const char WXUNUSED(maskBits)[] +) { } -wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY) +wxCursor::wxCursor( + const wxImage& rImage +) { - m_refData = new wxCursorRefData; + wxImage vImage32 = rImage.Scale(32,32); + int nWidth = vImage32.GetWidth(); + int nHeight = vImage32.GetHeight(); - // TODO: create cursor from a file -} + // + // Need a bitmap handle somehow + // + HBITMAP hBitmap = wxBitmap(vImage32).GetHBITMAP(); + int nHotSpotX = vImage32.GetOptionInt(wxCUR_HOTSPOT_X); + int nHotSpotY = vImage32.GetOptionInt(wxCUR_HOTSPOT_Y); -// Cursors by stock number -wxCursor::wxCursor(int cursor_type) + if (nHotSpotX < 0 || nHotSpotX >= nWidth) + nHotSpotX = 0; + if (nHotSpotY < 0 || nHotSpotY >= nHeight) + nHotSpotY = 0; + + + 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& rsCursorFile +, long lFlags +, int nHotSpotX +, int nHotSpotY +) { - m_refData = new wxCursorRefData; - -/* TODO - switch (cursor_type) - { - case wxCURSOR_WAIT: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_WAIT); - break; - case wxCURSOR_IBEAM: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_IBEAM); - break; - case wxCURSOR_CROSS: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_CROSS); - break; - case wxCURSOR_SIZENWSE: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENWSE); - break; - case wxCURSOR_SIZENESW: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENESW); - break; - case wxCURSOR_SIZEWE: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZEWE); - break; - case wxCURSOR_SIZENS: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENS); - break; - case wxCURSOR_CHAR: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW); - break; - } - case wxCURSOR_HAND: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_HAND"); - break; - } - case wxCURSOR_BULLSEYE: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BULLSEYE"); - break; - } - case wxCURSOR_PENCIL: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PENCIL"); - break; - } - case wxCURSOR_MAGNIFIER: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_MAGNIFIER"); - break; - } - case wxCURSOR_NO_ENTRY: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_NO_ENTRY"); - break; - } - case wxCURSOR_LEFT_BUTTON: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW); - break; - } - case wxCURSOR_RIGHT_BUTTON: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW); - break; - } - case wxCURSOR_MIDDLE_BUTTON: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW); - break; - } - case wxCURSOR_SIZING: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_SIZING"); - break; - } - case wxCURSOR_WATCH: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_WATCH"); - break; - } - case wxCURSOR_SPRAYCAN: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_ROLLER"); - break; - } - case wxCURSOR_PAINT_BRUSH: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PBRUSH"); - break; - } - case wxCURSOR_POINT_LEFT: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PLEFT"); - break; - } - case wxCURSOR_POINT_RIGHT: - { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PRIGHT"); - break; - } - case wxCURSOR_QUESTION_ARROW: + wxCursorRefData* pRefData = new wxCursorRefData; + + pRefData = new wxCursorRefData; + m_refData = pRefData; + pRefData->m_bDestroyCursor = FALSE; + if (lFlags == wxBITMAP_TYPE_CUR_RESOURCE) { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_QARROW"); - break; + pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP + ,0 + ,(ULONG)lFlags // if OS/2 this should be the resource Id + ); } - case wxCURSOR_BLANK: +} // end of wxCursor::wxCursor + +// Cursors by stock number +wxCursor::wxCursor( + int nCursorType +) +{ + wxCursorRefData* pRefData = new wxCursorRefData; + + m_refData = pRefData; + switch (nCursorType) { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BLANK"); - break; - } - default: - case wxCURSOR_ARROW: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW); - break; - } -*/ + case wxCURSOR_ARROWWAIT: + pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP + ,(ULONG)SPTR_WAIT + ,FALSE + ); + break; -} + case wxCURSOR_WAIT: + pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP + ,(ULONG)SPTR_WAIT + ,FALSE + ); + break; -wxCursor::~wxCursor() -{ -} + case wxCURSOR_IBEAM: + pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP + ,(ULONG)SPTR_TEXT + ,FALSE + ); + break; + + case wxCURSOR_CROSS: + pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP + ,(ULONG)SPTR_MOVE + ,FALSE + ); + break; + + 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) ::WinLoadPointer( HWND_DESKTOP + ,0 + ,(ULONG)wxCURSOR_NO_ENTRY + ); + 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_WATCH: + pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP + ,0 + ,(ULONG)wxCURSOR_WATCH + ); + 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) { - // TODO (optional on platforms with no global cursor) -} + extern wxCursor *g_globalCursor; + + if ( cursor.Ok() && cursor.GetHCURSOR() ) + { +// ::SetCursor((HCURSOR) cursor.GetHCURSOR()); + if ( g_globalCursor ) + (*g_globalCursor) = cursor; + } +}