]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/cursor.cpp
region calculation for windows with borders too small
[wxWidgets.git] / src / mgl / cursor.cpp
index f1ce135b33cb2e67f76c7c8886d13c5af1cd6c39..0bb3bdac4a3766d8ddbc34990f0d4f337fb5d070 100644 (file)
@@ -3,7 +3,7 @@
 // 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
 /////////////////////////////////////////////////////////////////////////////
 
 #endif
 
 #include "wx/cursor.h"
+#include "wx/module.h"
 #include "wx/utils.h"
 #include "wx/log.h"
 #include "wx/intl.h"
+#include "wx/hashmap.h"
 
 #include "wx/mgl/private.h"
 
@@ -51,9 +53,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,15 +69,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)
     {
-        // FIXME_MGL -- what about storing these default cursors in executable
-        //              as XPMs so that wxMGL binary wouldn't depend on 
-        //              tons of files in $MGL_ROOT/cursors? I don't know yet...
         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;
@@ -121,6 +135,12 @@ wxCursor::wxCursor(int cursorId)
         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)[],
@@ -203,12 +223,14 @@ void wxSetCursor(const wxCursor& cursor)
 {
     if ( cursor.Ok() )
     {
-        MGL_wmSetGlobalCursor(g_winMng, *cursor.GetMGLCursor());
+        if ( g_winMng )
+            MGL_wmSetGlobalCursor(g_winMng, *cursor.GetMGLCursor());
         gs_globalCursor = cursor;
     }
     else
     {
-        MGL_wmSetGlobalCursor(g_winMng, NULL);
+        if ( g_winMng )
+            MGL_wmSetGlobalCursor(g_winMng, NULL);
         gs_globalCursor = wxNullCursor;        
     }
 }
@@ -259,3 +281,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)