]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_extras.py
My RPM spec now uses the --enable-rpath
[wxWidgets.git] / wxPython / src / _extras.py
index 2c27bf0584e218b395a551e73a78c0aeaceb4b36..42a5e6f7749f620407c3b3c4c6d58eed42e8229e 100644 (file)
@@ -62,6 +62,12 @@ def EVT_KEY_DOWN(win, func):
 def EVT_KEY_UP(win, func):
     win.Connect(-1, -1, wxEVT_KEY_UP, func)
 
+def EVT_MENU_OPEN(win, func):
+    win.Connect(-1, -1, wxEVT_MENU_OPEN, func)
+
+def EVT_MENU_CLOSE(win, func):
+    win.Connect(-1, -1, wxEVT_MENU_CLOSE, func)
+
 def EVT_MENU_HIGHLIGHT(win, id, func):
     win.Connect(id, -1, wxEVT_MENU_HIGHLIGHT, func)
 
@@ -125,6 +131,9 @@ def EVT_WINDOW_CREATE(win, func):
 def EVT_WINDOW_DESTROY(win, func):
     win.Connect(-1, -1, wxEVT_DESTROY, func)
 
+def EVT_SET_CURSOR(win, func):
+    win.Connect(-1, -1, wxEVT_SET_CURSOR, func)
+
 
 
 def EVT_IDLE(win, func):
@@ -192,6 +201,9 @@ def EVT_MOUSE_EVENTS(win, func):
     win.Connect(-1, -1, wxEVT_LEAVE_WINDOW,  func)
     win.Connect(-1, -1, wxEVT_ENTER_WINDOW,  func)
 
+def EVT_MOUSE_CAPTURE_CHANGED(win, func):
+    win.Connect(-1, -1, wxEVT_MOUSE_CAPTURE_CHANGED, func)
+
 # EVT_COMMAND
 def EVT_COMMAND(win, id, cmd, func):
     win.Connect(id, -1, cmd, func)
@@ -202,14 +214,15 @@ def EVT_COMMAND_RANGE(win, id1, id2, cmd, func):
 
 # Scrolling
 def EVT_SCROLL(win, func):
-    win.Connect(-1, -1, wxEVT_SCROLL_TOP,       func)
-    win.Connect(-1, -1, wxEVT_SCROLL_BOTTOM,    func)
-    win.Connect(-1, -1, wxEVT_SCROLL_LINEUP,    func)
-    win.Connect(-1, -1, wxEVT_SCROLL_LINEDOWN,  func)
-    win.Connect(-1, -1, wxEVT_SCROLL_PAGEUP,    func)
-    win.Connect(-1, -1, wxEVT_SCROLL_PAGEDOWN,  func)
-    win.Connect(-1, -1, wxEVT_SCROLL_THUMBTRACK,func)
+    win.Connect(-1, -1, wxEVT_SCROLL_TOP,         func)
+    win.Connect(-1, -1, wxEVT_SCROLL_BOTTOM,      func)
+    win.Connect(-1, -1, wxEVT_SCROLL_LINEUP,      func)
+    win.Connect(-1, -1, wxEVT_SCROLL_LINEDOWN,    func)
+    win.Connect(-1, -1, wxEVT_SCROLL_PAGEUP,      func)
+    win.Connect(-1, -1, wxEVT_SCROLL_PAGEDOWN,    func)
+    win.Connect(-1, -1, wxEVT_SCROLL_THUMBTRACK,  func)
     win.Connect(-1, -1, wxEVT_SCROLL_THUMBRELEASE,func)
+    win.Connect(-1, -1, wxEVT_SCROLL_ENDSCROLL,   func)
 
 def EVT_SCROLL_TOP(win, func):
     win.Connect(-1, -1, wxEVT_SCROLL_TOP, func)
@@ -235,6 +248,9 @@ def EVT_SCROLL_THUMBTRACK(win, func):
 def EVT_SCROLL_THUMBRELEASE(win, func):
     win.Connect(-1, -1, wxEVT_SCROLL_THUMBRELEASE, func)
 
+def EVT_SCROLL_ENDSCROLL(win, func):
+    win.Connect(-1, -1, wxEVT_SCROLL_ENDSCROLL, func)
+
 
 
 # Scrolling, with an id
@@ -247,6 +263,7 @@ def EVT_COMMAND_SCROLL(win, id, func):
     win.Connect(id, -1, wxEVT_SCROLL_PAGEDOWN,  func)
     win.Connect(id, -1, wxEVT_SCROLL_THUMBTRACK,func)
     win.Connect(id, -1, wxEVT_SCROLL_THUMBRELEASE,func)
+    win.Connect(-1, -1, wxEVT_SCROLL_ENDSCROLL,   func)
 
 def EVT_COMMAND_SCROLL_TOP(win, id, func):
     win.Connect(id, -1, wxEVT_SCROLL_TOP, func)
@@ -272,6 +289,9 @@ def EVT_COMMAND_SCROLL_THUMBTRACK(win, id, func):
 def EVT_COMMAND_SCROLL_THUMBRELEASE(win, id, func):
     win.Connect(id, -1, wxEVT_SCROLL_THUMBRELEASE, func)
 
+def EVT_COMMAND_SCROLL_ENDSCROLL(win, id, func):
+    win.Connect(id, -1, wxEVT_SCROLL_ENDSCROLL, func)
+
 #---
 def EVT_SCROLLWIN(win, func):
     win.Connect(-1, -1, wxEVT_SCROLLWIN_TOP,         func)
@@ -545,19 +565,6 @@ def EVT_TOGGLEBUTTON(win, id, func):
 
 
 
-# Help events
-def EVT_HELP(win, id, func):
-    win.Connect(id, -1, wxEVT_HELP, func)
-
-def EVT_HELP_RANGE(win, id, id2, func):
-    win.Connect(id, id2, wxEVT_HELP, func)
-
-def EVT_DETAILED_HELP(win, id, func):
-    win.Connect(id, -1, wxEVT_DETAILED_HELP, func)
-
-def EVT_DETAILED_HELP_RANGE(win, id, id2, func):
-    win.Connect(id, id2, wxEVT_DETAILED_HELP, func)
-
 def EVT_CONTEXT_MENU(win, func):
     win.Connect(-1, -1, wxEVT_CONTEXT_MENU, func)
 
@@ -654,6 +661,58 @@ def wxPyTypeCast(obj, typeStr):
     return theObj
 
 
+#----------------------------------------------------------------------------
+_wxCallAfterId = None
+
+def wxCallAfter(callable, *args, **kw):
+    """
+    Call the specified function after the current and pending event
+    handlers have been completed.  This is also good for making GUI
+    method calls from non-GUI threads.
+    """
+    app = wxGetApp()
+    assert app, 'No wxApp created yet'
+
+    global _wxCallAfterId
+    if _wxCallAfterId is None:
+        _wxCallAfterId = wxNewId()
+        app.Connect(-1, -1, _wxCallAfterId,
+              lambda event: apply(event.callable, event.args, event.kw) )
+    evt = wxPyEvent()
+    evt.SetEventType(_wxCallAfterId)
+    evt.callable = callable
+    evt.args = args
+    evt.kw = kw
+    wxPostEvent(app, evt)
+
+#----------------------------------------------------------------------
+
+class wxPyDeadObjectError(AttributeError):
+    pass
+
+class _wxPyDeadObject:
+    """
+    Instances of wx objects that are OOR capable will have their __class__
+    changed to this class when the C++ object is deleted.  This should help
+    prevent crashes due to referencing a bogus C++ pointer.
+    """
+    reprStr = "wxPython wrapper for DELETED %s object! (The C++ object no longer exists.)"
+    attrStr = "The C++ part of the %s object has been deleted, attribute access no longer allowed."
+
+    def __repr__( self ):
+        if not hasattr(self, "_name"):
+            self._name = "[unknown]"
+        return self.reprStr % self._name
+
+    def __getattr__( self, *args ):
+        if not hasattr(self, "_name"):
+            self._name = "[unknown]"
+        raise wxPyDeadObjectError( self.attrStr % self._name )
+
+    def __nonzero__(self):
+        return 0
+
+
 #----------------------------------------------------------------------
 #----------------------------------------------------------------------
 
@@ -696,7 +755,7 @@ class wxPyOnDemandOutputWindow:
             self.frame.Close()
 
 
-_defRedirect = (wxPlatform == '__WXMSW__')
+_defRedirect = (wxPlatform == '__WXMSW__' or wxPlatform == '__WXMAC__')
 
 #----------------------------------------------------------------------
 # The main application class.  Derive from this and implement an OnInit
@@ -770,24 +829,25 @@ class wxPyWidgetTester(wxApp):
         self.frame.Show(true)
 
 #----------------------------------------------------------------------------
-# DO NOT hold any other references to this object.  This is how we know when
-# to cleanup system resources that wxWin is holding.  When this module is
-# unloaded, the refcount on __cleanMeUp goes to zero and it calls the
-# wxApp_CleanUp function.
-
-## class __wxPyCleanup:
-##     def __init__(self):
-##         self.cleanup = wxc.wxApp_CleanUp
-##     def __del__(self):
-##         self.cleanup()
-
-## __cleanMeUp = __wxPyCleanup()
-
-if sys.version[0] == '2':
-    import atexit
-    atexit.register(wxc.wxApp_CleanUp)
-else:
-    sys.exitfunc = wxc.wxApp_CleanUp
+# DO NOT hold any other references to this object.  This is how we
+# know when to cleanup system resources that wxWin is holding.  When
+# the sys module is unloaded, the refcount on sys.__wxPythonCleanup
+# goes to zero and it calls the wxApp_CleanUp function.
+
+class __wxPyCleanup:
+    def __init__(self):
+        self.cleanup = wxc.wxApp_CleanUp
+    def __del__(self):
+        self.cleanup()
+
+sys.__wxPythonCleanup = __wxPyCleanup()
+
+## # another possible solution, but it gets called too early...
+## if sys.version[0] == '2':
+##     import atexit
+##     atexit.register(wxc.wxApp_CleanUp)
+## else:
+##     sys.exitfunc = wxc.wxApp_CleanUp
 
 
 #----------------------------------------------------------------------------