X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e90c1d2a19361551eb07778280f22be3e759cf64..76c79ff467c1af23e3cbc6201c1e6110c110b26a:/src/msw/cursor.cpp diff --git a/src/msw/cursor.cpp b/src/msw/cursor.cpp index 25ba3cb474..ffa2a6434c 100644 --- a/src/msw/cursor.cpp +++ b/src/msw/cursor.cpp @@ -9,281 +9,421 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation "cursor.h" + #pragma implementation "cursor.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #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" + #include "wx/list.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/bitmap.h" + #include "wx/icon.h" + #include "wx/cursor.h" #endif +#include "wx/module.h" +#include "wx/image.h" #include "wx/msw/private.h" +#ifndef __WXMICROWIN__ #include "wx/msw/dib.h" - -#include "assert.h" +#endif #if wxUSE_RESOURCE_LOADING_IN_MSW -#include "wx/msw/curico.h" -#include "wx/msw/curicop.h" + #include "wx/msw/curico.h" + #include "wx/msw/curicop.h" #endif -#if !USE_SHARED_LIBRARIES -IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap) -#endif +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxGDIObject) + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +// Current cursor, in order to hang on to cursor handle when setting the cursor +// globally +static wxCursor *gs_globalCursor = NULL; + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class wxCursorModule : public wxModule +{ +public: + virtual bool OnInit() + { + gs_globalCursor = new wxCursor; + + return TRUE; + } + + virtual void OnExit() + { + delete gs_globalCursor; + gs_globalCursor = (wxCursor *)NULL; + } +}; + +// ============================================================================ +// implementation +// ============================================================================ -wxCursorRefData::wxCursorRefData(void) +// ---------------------------------------------------------------------------- +// wxCursorRefData +// ---------------------------------------------------------------------------- + +wxCursorRefData::wxCursorRefData() { - m_width = 32; m_height = 32; - m_hCursor = 0 ; - m_destroyCursor = FALSE; + m_width = 32; + m_height = 32; + + m_destroyCursor = TRUE; } -wxCursorRefData::~wxCursorRefData(void) +void wxCursorRefData::Free() { - if ( m_hCursor && m_destroyCursor) -#ifdef __WXWINE__ - ::DestroyCursor((HCURSOR) m_hCursor); -#else - ::DestroyCursor((HICON) m_hCursor); + if ( m_hCursor ) + { +#ifndef __WXMICROWIN__ + if ( m_destroyCursor ) + ::DestroyCursor((HCURSOR)m_hCursor); #endif + + m_hCursor = 0; + } } +// ---------------------------------------------------------------------------- // Cursors -wxCursor::wxCursor(void) +// ---------------------------------------------------------------------------- + +wxCursor::wxCursor() { } -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 & image ) { + //image has to be 32x32 + wxImage image32 = image.Scale(32,32); + unsigned char * rgbBits = image32.GetData(); + int w = image32.GetWidth() ; + int h = image32.GetHeight() ; + bool bHasMask = image32.HasMask() ; + int imagebitcount = (w*h)/8; + + unsigned char r, g, b ; + unsigned char * bits = new unsigned char [imagebitcount]; + unsigned char * maskBits = new unsigned char [imagebitcount]; + + int i,j, i8; unsigned char c, cMask; + for (i=0; i mid grey + if (c>127) + bits[i] = bits[i] | cMask ; + cMask = cMask / 2 ; + } + } + if (bHasMask) + { + r = image32.GetMaskRed() ; + g = image32.GetMaskGreen() ; + b = image32.GetMaskBlue() ; + + for (i=0; i= w) + hotSpotX = 0; + if (hotSpotY < 0 || hotSpotY >= h) + hotSpotY = 0; + + wxCursorRefData *refData = new wxCursorRefData; + m_refData = refData; + refData->m_hCursor = (WXHCURSOR) CreateCursor ( wxGetInstance(), hotSpotX, hotSpotY, w, h, /*AND*/ maskBits, /*XOR*/ bits ); + + delete [] bits ; + delete [] maskBits; + } -wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY) +wxCursor::wxCursor(const char WXUNUSED(bits)[], + int WXUNUSED(width), + int WXUNUSED(height), + int WXUNUSED(hotSpotX), int WXUNUSED(hotSpotY), + const char WXUNUSED(maskBits)[]) { - m_refData = new wxCursorRefData; +} - M_CURSORDATA->m_destroyCursor = FALSE; - M_CURSORDATA->m_hCursor = 0; - M_CURSORDATA->m_ok = FALSE; - if (flags & wxBITMAP_TYPE_CUR_RESOURCE) - { +wxCursor::wxCursor(const wxString& cursor_file, + long flags, + int hotSpotX, int hotSpotY) +{ +#ifdef __WXMICROWIN__ + m_refData = NULL; +#else + wxCursorRefData *refData = new wxCursorRefData; + m_refData = refData; + + if (flags == wxBITMAP_TYPE_CUR_RESOURCE) + { #ifdef __WIN95__ - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), cursor_file, IMAGE_CURSOR, 0, 0, 0); + refData->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), cursor_file, IMAGE_CURSOR, 0, 0, 0); #else - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), cursor_file); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), cursor_file); #endif - if (M_CURSORDATA->m_hCursor) - M_CURSORDATA->m_ok = TRUE; - else - M_CURSORDATA->m_ok = FALSE; - } - else if (flags & wxBITMAP_TYPE_CUR) - { + } + else if (flags == wxBITMAP_TYPE_CUR) + { #ifdef __WIN95__ - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), cursor_file, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE); + refData->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), cursor_file, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE); #else #if wxUSE_RESOURCE_LOADING_IN_MSW - M_CURSORDATA->m_hCursor = (WXHCURSOR) ReadCursorFile(WXSTRINGCAST cursor_file, wxGetInstance(), &M_CURSORDATA->m_width, &M_CURSORDATA->m_height); - M_CURSORDATA->m_destroyCursor = TRUE; + refData->m_hCursor = (WXHCURSOR) ReadCursorFile(WXSTRINGCAST cursor_file, wxGetInstance(), &refData->m_width, &refData->m_height); #endif #endif - } - else if (flags & wxBITMAP_TYPE_ICO) - { + } + else if (flags == wxBITMAP_TYPE_ICO) + { #if wxUSE_RESOURCE_LOADING_IN_MSW - M_CURSORDATA->m_hCursor = (WXHCURSOR) IconToCursor(WXSTRINGCAST cursor_file, wxGetInstance(), hotSpotX, hotSpotY, &M_CURSORDATA->m_width, &M_CURSORDATA->m_height); - M_CURSORDATA->m_destroyCursor = TRUE; + refData->m_hCursor = (WXHCURSOR) IconToCursor(WXSTRINGCAST cursor_file, wxGetInstance(), hotSpotX, hotSpotY, &refData->m_width, &refData->m_height); #endif - } - else if (flags & wxBITMAP_TYPE_BMP) - { + } + else if (flags == wxBITMAP_TYPE_BMP) + { #if wxUSE_RESOURCE_LOADING_IN_MSW - HBITMAP hBitmap = 0; - HPALETTE hPalette = 0; - bool success = wxReadDIB(WXSTRINGCAST cursor_file, &hBitmap, &hPalette) != 0; - if (!success) - return; - if (hPalette) - DeleteObject(hPalette); - POINT pnt; - pnt.x = hotSpotX; - pnt.y = hotSpotY; - M_CURSORDATA->m_hCursor = (WXHCURSOR) MakeCursorFromBitmap(wxGetInstance(), hBitmap, &pnt); - M_CURSORDATA->m_destroyCursor = TRUE; - DeleteObject(hBitmap); - if (M_CURSORDATA->m_hCursor) - M_CURSORDATA->m_ok = TRUE; + HBITMAP hBitmap = 0; + HPALETTE hPalette = 0; + bool success = wxReadDIB(WXSTRINGCAST cursor_file, &hBitmap, &hPalette) != 0; + if (!success) + return; + if (hPalette) + DeleteObject(hPalette); + POINT pnt; + pnt.x = hotSpotX; + pnt.y = hotSpotY; + refData->m_hCursor = (WXHCURSOR) MakeCursorFromBitmap(wxGetInstance(), hBitmap, &pnt); + DeleteObject(hBitmap); +#endif + } + +#if WXWIN_COMPATIBILITY_2 + refData->SetOk(); +#endif // WXWIN_COMPATIBILITY_2 + #endif - } } // Cursors by stock number wxCursor::wxCursor(int cursor_type) { - m_refData = new wxCursorRefData; +#ifdef __WXMICROWIN__ + m_refData = NULL; +#else + wxCursorRefData *refData = new wxCursorRefData; + m_refData = refData; switch (cursor_type) { + case wxCURSOR_ARROWWAIT: +#ifndef __WIN16__ + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_APPSTARTING); + break; +#endif case wxCURSOR_WAIT: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_WAIT); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_WAIT); break; case wxCURSOR_IBEAM: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_IBEAM); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_IBEAM); break; case wxCURSOR_CROSS: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_CROSS); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_CROSS); break; case wxCURSOR_SIZENWSE: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENWSE); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENWSE); break; case wxCURSOR_SIZENESW: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENESW); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENESW); break; case wxCURSOR_SIZEWE: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZEWE); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZEWE); break; case wxCURSOR_SIZENS: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENS); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_SIZENS); break; case wxCURSOR_CHAR: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); break; } case wxCURSOR_HAND: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_HAND")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_HAND")); break; } case wxCURSOR_BULLSEYE: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_BULLSEYE")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BULLSEYE")); break; } case wxCURSOR_PENCIL: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_PENCIL")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PENCIL")); break; } case wxCURSOR_MAGNIFIER: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_MAGNIFIER")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_MAGNIFIER")); break; } case wxCURSOR_NO_ENTRY: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_NO_ENTRY")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_NO_ENTRY")); break; } case wxCURSOR_LEFT_BUTTON: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); break; } case wxCURSOR_RIGHT_BUTTON: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); break; } case wxCURSOR_MIDDLE_BUTTON: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); break; } case wxCURSOR_SIZING: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_SIZING")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_SIZING")); break; } case wxCURSOR_WATCH: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_WATCH")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_WATCH")); break; } case wxCURSOR_SPRAYCAN: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_ROLLER")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_ROLLER")); break; } case wxCURSOR_PAINT_BRUSH: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_PBRUSH")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PBRUSH")); break; } case wxCURSOR_POINT_LEFT: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_PLEFT(")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PLEFT")); break; } case wxCURSOR_POINT_RIGHT: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_PRIGHT(")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PRIGHT")); break; } case wxCURSOR_QUESTION_ARROW: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_QARROW")); +// refData->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), wxT("wxCURSOR_QARROW"), IMAGE_CURSOR, 16, 16, LR_MONOCHROME); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_QARROW")); break; } case wxCURSOR_BLANK: { - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), T("wxCURSOR_BLANK")); + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BLANK")); break; } + case wxCURSOR_RIGHT_ARROW: + { + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_RIGHT_ARROW")); + break; + } default: case wxCURSOR_ARROW: - M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); break; } -} -wxCursor::~wxCursor(void) -{ -// FreeResource(TRUE); + // no need to destroy the stock cursors + // TODO: check this + //m_refData->m_destroyCursor = FALSE; +#endif } -bool wxCursor::FreeResource(bool WXUNUSED(force)) +wxCursor::~wxCursor() { - if (M_CURSORDATA && M_CURSORDATA->m_hCursor && M_CURSORDATA->m_destroyCursor) - { - DestroyCursor((HCURSOR) M_CURSORDATA->m_hCursor); - M_CURSORDATA->m_hCursor = 0; - } - return TRUE; } -void wxCursor::SetHCURSOR(WXHCURSOR cursor) -{ - if ( !M_CURSORDATA ) - m_refData = new wxCursorRefData; +// ---------------------------------------------------------------------------- +// Global cursor setting +// ---------------------------------------------------------------------------- - M_CURSORDATA->m_hCursor = cursor; +const wxCursor *wxGetGlobalCursor() +{ + return gs_globalCursor; } -// Global cursor setting void wxSetCursor(const wxCursor& cursor) { - extern wxCursor *g_globalCursor; - - if ( cursor.Ok() && cursor.GetHCURSOR() ) + if ( cursor.Ok() ) { - ::SetCursor((HCURSOR) cursor.GetHCURSOR()); +#ifndef __WXMICROWIN__ + ::SetCursor(GetHcursorOf(cursor)); +#endif - if ( g_globalCursor ) - (*g_globalCursor) = cursor; + if ( gs_globalCursor ) + *gs_globalCursor = cursor; } }