Просмотр исходного кода

display: Migrate the Python window func stuff to an extension.

Sam Edwards 11 лет назад
Родитель
Сommit
eaa323aa65

+ 2 - 0
makepanda/makepanda.py

@@ -3276,6 +3276,7 @@ if (not RUNTIME):
   TargetAdd('libp3display.in', opts=['IMOD:panda3d.core', 'ILIB:libp3display', 'SRCDIR:panda/src/display'])
   TargetAdd('libp3display_igate.obj', input='libp3display.in', opts=["DEPENDENCYONLY"])
   TargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx')
+  TargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx')
 
   if RTDIST and GetTarget() == 'darwin':
     OPTS=['DIR:panda/src/display']
@@ -3551,6 +3552,7 @@ if (not RUNTIME):
   TargetAdd('libpanda.dll', input='p3gobj_internalName_ext.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_ext_composite.obj')
   TargetAdd('libpanda.dll', input='p3display_graphicsStateGuardian_ext.obj')
+  TargetAdd('libpanda.dll', input='p3display_graphicsWindow_ext.obj')
 
   if PkgSkip("FREETYPE")==0:
     TargetAdd('libpanda.dll', input="p3pnmtext_composite1.obj")

+ 4 - 11
panda/src/display/CMakeLists.txt

@@ -71,19 +71,12 @@ set(P3DISPLAY_SOURCES
 set(P3DISPLAY_IGATEEXT
   graphicsStateGuardian_ext.cxx
   graphicsStateGuardian_ext.h
+  graphicsWindow_ext.cxx
+  graphicsWindow_ext.h
+  pythonGraphicsWindowProc.cxx
+  pythonGraphicsWindowProc.h
 )
 
-if(HAVE_PYTHON)
-  set(P3DISPLAY_HEADERS
-    ${P3DISPLAY_HEADERS}
-    pythonGraphicsWindowProc.h
-  )
-  set(P3DISPLAY_SOURCES
-    ${P3DISPLAY_SOURCES}
-    pythonGraphicsWindowProc.cxx
-  )
-endif()
-
 if(APPLE)
   set(P3DISPLAY_HEADERS
     ${P3DISPLAY_HEADERS}

+ 1 - 0
panda/src/display/Sources.pp

@@ -31,6 +31,7 @@
     graphicsStateGuardian_ext.cxx graphicsStateGuardian_ext.h \
     graphicsThreadingModel.I graphicsThreadingModel.h \
     graphicsWindow.I graphicsWindow.h \
+    graphicsWindow_ext.cxx graphicsWindow_ext.h \
     graphicsWindowInputDevice.I  \
     graphicsWindowInputDevice.h \
     graphicsWindowProc.h \

+ 0 - 48
panda/src/display/graphicsWindow.cxx

@@ -903,54 +903,6 @@ mouse_mode_absolute() {
 
 }
 
-#ifdef HAVE_PYTHON
-
-////////////////////////////////////////////////////////////////////
-//     Function: GraphicsWindow::add_custom_event_handler
-//       Access: Published
-//  Description: Adds a python event handler to be called
-//               when a window event occurs.
-//               
-////////////////////////////////////////////////////////////////////
-void GraphicsWindow::
-add_python_event_handler(PyObject* handler, PyObject* name){
-  PythonGraphicsWindowProc* pgwp = new PythonGraphicsWindowProc(handler, name);
-  _python_window_proc_classes.insert(pgwp);
-  add_window_proc(pgwp);
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: GraphicsWindow::remove_custom_event_handler
-//       Access: Published
-//  Description: Removes the specified python event handler.
-//               
-////////////////////////////////////////////////////////////////////
-void GraphicsWindow::
-remove_python_event_handler(PyObject* name){
-  list<PythonGraphicsWindowProc*> toRemove;
-  PythonWinProcClasses::iterator iter;
-  for (iter = _python_window_proc_classes.begin(); iter != _python_window_proc_classes.end(); ++iter) {
-    PythonGraphicsWindowProc* pgwp = *iter;
-    if (PyObject_RichCompareBool(pgwp->get_name(), name, Py_EQ) == 1) {
-      toRemove.push_back(pgwp);
-    }
-#if PY_MAJOR_VERSION < 3
-    else if (PyObject_Compare(pgwp->get_name(), name) == 0) {
-      toRemove.push_back(pgwp);
-    }
-#endif
-  }
-  list<PythonGraphicsWindowProc*>::iterator iter2;
-  for (iter2 = toRemove.begin(); iter2 != toRemove.end(); ++iter2) {
-    PythonGraphicsWindowProc* pgwp = *iter2;
-    remove_window_proc(pgwp);
-    _python_window_proc_classes.erase(pgwp);
-    delete pgwp;
-  }
-}
-
-#endif // HAVE_PYTHON
-
 ////////////////////////////////////////////////////////////////////
 //     Function: GraphicsWindow::is_touch_event
 //       Access: Published, Virtual

+ 2 - 9
panda/src/display/graphicsWindow.h

@@ -21,9 +21,6 @@
 #include "graphicsWindowInputDevice.h"
 #include "graphicsWindowProc.h"
 #include "graphicsWindowProcCallbackData.h"
-#ifdef HAVE_PYTHON
-#include "pythonGraphicsWindowProc.h"
-#endif
 #include "windowProperties.h"
 #include "mouseData.h"
 #include "modifierButtons.h"
@@ -94,11 +91,6 @@ PUBLISHED:
   virtual bool move_pointer(int device, int x, int y);
   virtual void close_ime();
 
-#ifdef HAVE_PYTHON
-  void add_python_event_handler(PyObject* handler, PyObject* name);
-  void remove_python_event_handler(PyObject* name);
-#endif
-
 public:
   // No need to publish these.
   bool has_button_event(int device) const;
@@ -169,7 +161,7 @@ private:
   bool _unexposed_draw;
 
 #ifdef HAVE_PYTHON
-  typedef pset<PythonGraphicsWindowProc*> PythonWinProcClasses;
+  typedef pset<GraphicsWindowProc*> PythonWinProcClasses;
   PythonWinProcClasses _python_window_proc_classes;
 #endif
 
@@ -191,6 +183,7 @@ private:
   static TypeHandle _type_handle;
 
   friend class GraphicsEngine;
+  friend class Extension<GraphicsWindow>;
 };
 
 #include "graphicsWindow.I"

+ 63 - 0
panda/src/display/graphicsWindow_ext.cxx

@@ -0,0 +1,63 @@
+// Filename: graphicsWindow_ext.cxx
+// Created by:  CFSworks (11Oct14)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) Carnegie Mellon University.  All rights reserved.
+//
+// All use of this software is subject to the terms of the revised BSD
+// license.  You should have received a copy of this license along
+// with this source code in a file named "LICENSE."
+//
+////////////////////////////////////////////////////////////////////
+
+#include "graphicsWindow_ext.h"
+
+#ifdef HAVE_PYTHON
+
+////////////////////////////////////////////////////////////////////
+//     Function: Extension<GraphicsWindow>::add_custom_event_handler
+//       Access: Published
+//  Description: Adds a python event handler to be called
+//               when a window event occurs.
+//               
+////////////////////////////////////////////////////////////////////
+void Extension<GraphicsWindow>::
+add_python_event_handler(PyObject* handler, PyObject* name){
+  PythonGraphicsWindowProc* pgwp = new PythonGraphicsWindowProc(handler, name);
+  _this->_python_window_proc_classes.insert(pgwp);
+  _this->add_window_proc(pgwp);
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Extension<GraphicsWindow>::remove_custom_event_handler
+//       Access: Published
+//  Description: Removes the specified python event handler.
+//               
+////////////////////////////////////////////////////////////////////
+void Extension<GraphicsWindow>::
+remove_python_event_handler(PyObject* name){
+  list<PythonGraphicsWindowProc*> toRemove;
+  GraphicsWindow::PythonWinProcClasses::iterator iter;
+  for (iter = _this->_python_window_proc_classes.begin(); iter != _this->_python_window_proc_classes.end(); ++iter) {
+    PythonGraphicsWindowProc* pgwp = (PythonGraphicsWindowProc*)*iter;
+    if (PyObject_RichCompareBool(pgwp->get_name(), name, Py_EQ) == 1) {
+      toRemove.push_back(pgwp);
+    }
+#if PY_MAJOR_VERSION < 3
+    else if (PyObject_Compare(pgwp->get_name(), name) == 0) {
+      toRemove.push_back(pgwp);
+    }
+#endif
+  }
+  list<PythonGraphicsWindowProc*>::iterator iter2;
+  for (iter2 = toRemove.begin(); iter2 != toRemove.end(); ++iter2) {
+    PythonGraphicsWindowProc* pgwp = *iter2;
+    _this->remove_window_proc(pgwp);
+    _this->_python_window_proc_classes.erase(pgwp);
+    delete pgwp;
+  }
+}
+
+#endif  // HAVE_PYTHON

+ 42 - 0
panda/src/display/graphicsWindow_ext.h

@@ -0,0 +1,42 @@
+// Filename: renderState_ext.h
+// Created by:  CFSworks (11Oct14)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) Carnegie Mellon University.  All rights reserved.
+//
+// All use of this software is subject to the terms of the revised BSD
+// license.  You should have received a copy of this license along
+// with this source code in a file named "LICENSE."
+//
+////////////////////////////////////////////////////////////////////
+
+#ifndef GRAPHICSWINDOW_EXT_H
+#define GRAPHICSWINDOW_EXT_H
+
+#include "dtoolbase.h"
+
+#ifdef HAVE_PYTHON
+
+#include "extension.h"
+#include "graphicsWindow.h"
+#include "pythonGraphicsWindowProc.h"
+#include "py_panda.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : Extension<GraphicsWindow>
+// Description : This class defines the extension methods for
+//               GraphicsWindow, which are called instead of
+//               any C++ methods with the same prototype.
+////////////////////////////////////////////////////////////////////
+template<>
+class Extension<GraphicsWindow> : public ExtensionBase<GraphicsWindow> {
+public:
+  void add_python_event_handler(PyObject* handler, PyObject* name);
+  void remove_python_event_handler(PyObject* name);
+};
+
+#endif  // HAVE_PYTHON
+
+#endif  // GRAPHICSWINDOW_EXT_H