]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/cursor.cpp
enter wxPendingEventLocker critical section in ProcessPendingEvents() (fixes 1720352)
[wxWidgets.git] / src / mgl / cursor.cpp
index 0764b9351943f9f254fc99f9e2ecb7450cfabf1d..5b9c7899d1e3b201ee01259d6308d174fc06b55c 100644 (file)
@@ -1,17 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        cursor.cpp
+// Name:        src/mgl/cursor.cpp
 // Purpose:
 // Author:      Vaclav Slavik
 // Id:          $Id$
-// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-
-#ifdef __GNUG__
-#pragma implementation "cursor.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #endif
 
 #include "wx/cursor.h"
-#include "wx/utils.h"
-#include "wx/log.h"
-#include "wx/intl.h"
 
-#include <mgraph.hpp>
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/utils.h"
+    #include "wx/hashmap.h"
+    #include "wx/module.h"
+#endif
+
+#include "wx/mgl/private.h"
 
 
 //-----------------------------------------------------------------------------
@@ -36,7 +36,7 @@ class wxCursorRefData: public wxObjectRefData
   public:
 
     wxCursorRefData();
-    ~wxCursorRefData();
+    virtual ~wxCursorRefData();
 
     MGLCursor *m_cursor;
 };
@@ -51,9 +51,13 @@ wxCursorRefData::~wxCursorRefData()
     delete m_cursor;
 }
 
+#define M_CURSORDATA ((wxCursorRefData *)m_refData)
+
 //-----------------------------------------------------------------------------
 
-#define M_CURSORDATA ((wxCursorRefData *)m_refData)
+WX_DECLARE_HASH_MAP(int, wxCursor, wxIntegerHash, wxIntegerEqual, wxCursorsHash);
+
+static wxCursorsHash *gs_cursorsHash = NULL;
 
 IMPLEMENT_DYNAMIC_CLASS(wxCursor,wxObject)
 
@@ -63,12 +67,23 @@ wxCursor::wxCursor()
 
 wxCursor::wxCursor(int cursorId)
 {
+    if ( !gs_cursorsHash )
+        gs_cursorsHash = new wxCursorsHash;
+
+    if ( gs_cursorsHash->find(cursorId) != gs_cursorsHash->end() )
+    {
+        wxLogTrace(_T("mglcursor"), _T("cursor id %i fetched from cache"), cursorId);
+        *this = (*gs_cursorsHash)[cursorId];
+        return;
+    }
+
     const char *cursorname = NULL;
     m_refData = new wxCursorRefData();
 
     switch (cursorId)
     {
         case wxCURSOR_ARROW:           cursorname = "arrow.cur"; break;
+        case wxCURSOR_RIGHT_ARROW:     cursorname = "rightarr.cur"; break;
         case wxCURSOR_BULLSEYE:        cursorname = "bullseye.cur"; break;
         case wxCURSOR_CHAR:            cursorname = "char.cur"; break;
         case wxCURSOR_CROSS:           cursorname = "cross.cur"; break;
@@ -95,17 +110,14 @@ wxCursor::wxCursor(int cursorId)
         case wxCURSOR_BLANK:           cursorname = "blank.cur"; break;
 
         case wxCURSOR_NONE:
-            // FIXME_MGL - make sure wxWindow uses cursor with
-            //    GetMGLCursor() == NULL correctly, i.e. calls MS_hide()
             *this = wxNullCursor;
             return;
-            break;
 
         default:
             wxFAIL_MSG(wxT("unsupported cursor type"));
             break;
     }
-    
+
     M_CURSORDATA->m_cursor = new MGLCursor(cursorname);
 
     // if we cannot load arrow cursor, use MGL's default arrow cursor:
@@ -114,12 +126,18 @@ wxCursor::wxCursor(int cursorId)
         delete M_CURSORDATA->m_cursor;
         M_CURSORDATA->m_cursor = new MGLCursor(MGL_DEF_CURSOR);
     }
-    
+
     if ( !M_CURSORDATA->m_cursor->valid() )
     {
         wxLogError(_("Couldn't create cursor."));
         UnRef();
     }
+    else
+    {
+        (*gs_cursorsHash)[cursorId] = *this;
+        wxLogTrace(_T("mglcursor"), _T("cursor id %i added to cache (%s)"),
+                   cursorId, cursorname);
+    }
 }
 
 wxCursor::wxCursor(const char WXUNUSED(bits)[],
@@ -134,7 +152,7 @@ wxCursor::wxCursor(const char WXUNUSED(bits)[],
 
 wxCursor::wxCursor(const wxString& cursor_file,
                    long flags,
-                   int hotSpotX, int hotSpotY)
+                   int WXUNUSED(hotSpotX), int WXUNUSED(hotSpotY))
 {
     if ( flags == wxBITMAP_TYPE_CUR || flags == wxBITMAP_TYPE_CUR_RESOURCE )
     {
@@ -152,35 +170,12 @@ wxCursor::wxCursor(const wxString& cursor_file,
     }
 }
 
-wxCursor::wxCursor(const wxCursor &cursor)
-{
-    Ref(cursor);
-}
-
 wxCursor::~wxCursor()
 {
     // wxObject unrefs data
 }
 
-wxCursor& wxCursor::operator = (const wxCursor& cursor)
-{
-    if ( *this == cursor )
-        return (*this);
-    Ref(cursor);
-    return *this;
-}
-
-bool wxCursor::operator == (const wxCursor& cursor) const
-{
-    return (m_refData == cursor.m_refData);
-}
-
-bool wxCursor::operator != (const wxCursor& cursor) const
-{
-    return (m_refData != cursor.m_refData);
-}
-
-bool wxCursor::Ok() const
+bool wxCursor::IsOk() const
 {
     return (m_refData != NULL);
 }
@@ -196,13 +191,21 @@ MGLCursor *wxCursor::GetMGLCursor() const
 // Global cursor setting
 // ----------------------------------------------------------------------------
 
+static wxCursor  gs_globalCursor = wxNullCursor;
 
 void wxSetCursor(const wxCursor& cursor)
 {
     if ( cursor.Ok() )
     {
-        //MGL_setGlobalCursor(cursor.GetMGLCursor());
-        // FIXME_MGL -- needs MGL WM first
+        if ( g_winMng )
+            MGL_wmSetGlobalCursor(g_winMng, *cursor.GetMGLCursor());
+        gs_globalCursor = cursor;
+    }
+    else
+    {
+        if ( g_winMng )
+            MGL_wmSetGlobalCursor(g_winMng, NULL);
+        gs_globalCursor = wxNullCursor;
     }
 }
 
@@ -212,10 +215,7 @@ void wxSetCursor(const wxCursor& cursor)
 // busy cursor routines
 //-----------------------------------------------------------------------------
 
-// FIXME_MGL -- do we need this? It may be better to incorporate 
-//              support for it into MGL (a stack of global cursors?)
-static wxCursor  gs_savedCursor;
-static wxCursor  g_globalCursor;
+static wxCursor  gs_savedCursor = wxNullCursor;
 static int       gs_busyCount = 0;
 
 const wxCursor &wxBusyCursor::GetStoredCursor()
@@ -225,7 +225,7 @@ const wxCursor &wxBusyCursor::GetStoredCursor()
 
 const wxCursor wxBusyCursor::GetBusyCursor()
 {
-    return wxCursor(wxCURSOR_WAIT);
+    return gs_globalCursor;
 }
 
 void wxEndBusyCursor()
@@ -234,19 +234,20 @@ void wxEndBusyCursor()
 
     wxSetCursor(gs_savedCursor);
     gs_savedCursor = wxNullCursor;
-    //wxYield(); FIXME_MGL - needed?
 }
 
-void wxBeginBusyCursor(wxCursor *WXUNUSED(cursor))
+void wxBeginBusyCursor(const wxCursor *cursor)
 {
     if ( gs_busyCount++ > 0 ) return;
 
     wxASSERT_MSG( !gs_savedCursor.Ok(),
                   wxT("forgot to call wxEndBusyCursor, will leak memory") );
 
-    gs_savedCursor = g_globalCursor;
-    wxSetCursor(wxCursor(wxCURSOR_WAIT));
-    //wxYield(); FIXME_MGL - needed?
+    gs_savedCursor = gs_globalCursor;
+    if ( cursor->Ok() )
+        wxSetCursor(*cursor);
+    else
+        wxSetCursor(wxCursor(wxCURSOR_WAIT));
 }
 
 bool wxIsBusy()
@@ -254,3 +255,24 @@ bool wxIsBusy()
     return (gs_busyCount > 0);
 }
 
+
+
+//-----------------------------------------------------------------------------
+// module - clean up code
+//-----------------------------------------------------------------------------
+
+class wxCursorModule : public wxModule
+{
+public:
+    virtual bool OnInit() { return true; }
+
+    virtual void OnExit()
+    {
+        wxDELETE(gs_cursorsHash);
+    }
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxCursorModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxCursorModule, wxModule)