From db0ff83efbd6105c04d5ab84c85094e887e97b9a Mon Sep 17 00:00:00 2001
From: Robin Dunn <robin@alldunn.com>
Date: Mon, 8 Apr 2002 20:56:34 +0000
Subject: [PATCH] Updates to match recent CVS changes. Plugged some resource
 count leaks.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15042 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 wxPython/src/controls.i        |   4 +
 wxPython/src/controls2.i       |   4 +
 wxPython/src/events.i          |  22 +++--
 wxPython/src/fonts.i           |   6 +-
 wxPython/src/grid.i            |  17 +++-
 wxPython/src/helpers.cpp       |  46 +++++++--
 wxPython/src/helpers.h         |  18 +++-
 wxPython/src/image.i           |  10 +-
 wxPython/src/msw/controls.cpp  |  38 +++++++
 wxPython/src/msw/controls.py   |   3 +
 wxPython/src/msw/controls2.cpp |   3 +
 wxPython/src/msw/controls2.py  |   3 +
 wxPython/src/msw/events.cpp    | 176 +++++++++++++++++++++++++++++++++
 wxPython/src/msw/events.py     |  16 +++
 wxPython/src/msw/fonts.cpp     |  62 +++++++++++-
 wxPython/src/msw/fonts.py      |  10 ++
 wxPython/src/msw/grid.cpp      |  17 +++-
 wxPython/src/msw/image.cpp     |  50 ----------
 wxPython/src/msw/image.py      |   3 -
 19 files changed, 427 insertions(+), 81 deletions(-)

diff --git a/wxPython/src/controls.i b/wxPython/src/controls.i
index bb8a78bfff..64e69048f4 100644
--- a/wxPython/src/controls.i
+++ b/wxPython/src/controls.i
@@ -809,6 +809,10 @@ public:
     void WriteText(const wxString& text);
     void AppendText(const wxString& text);
 
+    // insert the character which would have resulted from this key event,
+    // return TRUE if anything has been inserted
+    bool EmulateKeyPress(const wxKeyEvent& event);
+
     // text control under some platforms supports the text styles: these
     // methods allow to apply the given text style to the given selection or to
     // set/get the style which will be used for all appended text
diff --git a/wxPython/src/controls2.i b/wxPython/src/controls2.i
index 2ad60661cc..36512cc58b 100644
--- a/wxPython/src/controls2.i
+++ b/wxPython/src/controls2.i
@@ -1325,6 +1325,10 @@ enum {
     wxDIRCTRL_SELECT_FIRST,
     wxDIRCTRL_SHOW_FILTERS,
     wxDIRCTRL_3D_INTERNAL,
+    wxDIRCTRL_EDITABLE,
+
+    wxID_TREECTRL,
+    wxID_FILTERLISTCTRL,
 };
 
 
diff --git a/wxPython/src/events.i b/wxPython/src/events.i
index b735d07ae3..c270a652bc 100644
--- a/wxPython/src/events.i
+++ b/wxPython/src/events.i
@@ -206,18 +206,26 @@ public:
     long GetKeyCode();
     bool HasModifiers();
 
+    // get the raw key code (platform-dependent)
+    long GetRawKeyCode() const;
+
+    // get the raw key flags (platform-dependent)
+    long GetRawKeyFlags() const;
+
     long GetX();
     long GetY();
     wxPoint GetPosition();
     %name(GetPositionTuple) void GetPosition(long* OUTPUT, long* OUTPUT);
 
-    long          m_x, m_y;
-    long          m_keyCode;
-    bool          m_controlDown;
-    bool          m_shiftDown;
-    bool          m_altDown;
-    bool          m_metaDown;
-    bool          m_scanCode;
+    long        m_x, m_y;
+    long        m_keyCode;
+    bool        m_controlDown;
+    bool        m_shiftDown;
+    bool        m_altDown;
+    bool        m_metaDown;
+    bool        m_scanCode;
+    long        m_rawCode;
+    long        m_rawFlags;
 
 };
 
diff --git a/wxPython/src/fonts.i b/wxPython/src/fonts.i
index 454e4af1bc..7506801a9d 100644
--- a/wxPython/src/fonts.i
+++ b/wxPython/src/fonts.i
@@ -17,7 +17,6 @@
 #include "helpers.h"
 #include <wx/fontmap.h>
 #include <wx/fontenc.h>
-#include <wx/fontmap.h>
 #include <wx/fontutil.h>
 #include <wx/fontenum.h>
 #include <wx/intl.h>
@@ -223,6 +222,11 @@ public:
     wxFontMapper();
     ~wxFontMapper();
 
+    // return instance of the wxFontMapper singleton
+    static wxFontMapper *Get();
+    // set the sigleton to 'mapper' instance and return previous one
+    static wxFontMapper *Set(wxFontMapper *mapper);
+
 
     // find an alternative for the given encoding (which is supposed to not be
     // available on this system). If successful, return TRUE and rwxFontEcoding
diff --git a/wxPython/src/grid.i b/wxPython/src/grid.i
index b5af636a9d..b0249ef931 100644
--- a/wxPython/src/grid.i
+++ b/wxPython/src/grid.i
@@ -531,8 +531,23 @@ public:
                               wxPyConstructObject((void*)&dc,   "wxDC", 0),
                               row, col));
             if (ro) {
-                if (!SWIG_GetPtrObj(ro, (void **)&ptr, "_wxSize_p"))
+                const char* errmsg = "GetBestSize should return a 2-tuple of integers or a wxSize object.";
+                if (!SWIG_GetPtrObj(ro, (void **)&ptr, "_wxSize_p")) {
                     rval = *ptr;
+                }
+                else if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {
+                    PyObject* o1 = PySequence_GetItem(ro, 0);
+                    PyObject* o2 = PySequence_GetItem(ro, 1);
+                    if (PyNumber_Check(o1) && PyNumber_Check(o2))
+                        rval = wxSize(PyInt_AsLong(o1), PyInt_AsLong(o2));
+                    else
+                        PyErr_SetString(PyExc_TypeError, errmsg);
+                    Py_DECREF(o1);
+                    Py_DECREF(o2);
+                }
+                else {
+                    PyErr_SetString(PyExc_TypeError, errmsg);
+                }
                 Py_DECREF(ro);
             }
         }
diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp
index 8d602244e0..aa48fa7128 100644
--- a/wxPython/src/helpers.cpp
+++ b/wxPython/src/helpers.cpp
@@ -1777,7 +1777,14 @@ bool wxSize_helper(PyObject* source, wxSize** obj) {
     else if (PySequence_Check(source) && PyObject_Length(source) == 2) {
         PyObject* o1 = PySequence_GetItem(source, 0);
         PyObject* o2 = PySequence_GetItem(source, 1);
+        if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
+            Py_DECREF(o1);
+            Py_DECREF(o2);
+            goto error;
+        }
         **obj = wxSize(PyInt_AsLong(o1), PyInt_AsLong(o2));
+        Py_DECREF(o1);
+        Py_DECREF(o2);
         return TRUE;
     }
 
@@ -1800,15 +1807,15 @@ bool wxPoint_helper(PyObject* source, wxPoint** obj) {
     if (PySequence_Check(source) && PySequence_Length(source) == 2) {
         PyObject* o1 = PySequence_GetItem(source, 0);
         PyObject* o2 = PySequence_GetItem(source, 1);
-                // This should really check for integers, not numbers -- but that would break code.
-                if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
-                        Py_DECREF(o1);
-                    Py_DECREF(o2);
-                        goto error;
-                }
-                **obj = wxPoint(PyInt_AsLong(o1), PyInt_AsLong(o2));
-                Py_DECREF(o1);
-                Py_DECREF(o2);
+        // This should really check for integers, not numbers -- but that would break code.
+        if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
+            Py_DECREF(o1);
+            Py_DECREF(o2);
+            goto error;
+        }
+        **obj = wxPoint(PyInt_AsLong(o1), PyInt_AsLong(o2));
+        Py_DECREF(o1);
+        Py_DECREF(o2);
         return TRUE;
     }
  error:
@@ -1832,7 +1839,14 @@ bool wxRealPoint_helper(PyObject* source, wxRealPoint** obj) {
     else if (PySequence_Check(source) && PyObject_Length(source) == 2) {
         PyObject* o1 = PySequence_GetItem(source, 0);
         PyObject* o2 = PySequence_GetItem(source, 1);
+        if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
+            Py_DECREF(o1);
+            Py_DECREF(o2);
+            goto error;
+        }
         **obj = wxRealPoint(PyFloat_AsDouble(o1), PyFloat_AsDouble(o2));
+        Py_DECREF(o1);
+        Py_DECREF(o2);
         return TRUE;
     }
 
@@ -1860,8 +1874,20 @@ bool wxRect_helper(PyObject* source, wxRect** obj) {
         PyObject* o2 = PySequence_GetItem(source, 1);
         PyObject* o3 = PySequence_GetItem(source, 2);
         PyObject* o4 = PySequence_GetItem(source, 3);
+        if (!PyNumber_Check(o1) || !PyNumber_Check(o2) ||
+            !PyNumber_Check(o3) || !PyNumber_Check(o4)) {
+            Py_DECREF(o1);
+            Py_DECREF(o2);
+            Py_DECREF(o3);
+            Py_DECREF(o4);
+            goto error;
+        }
         **obj = wxRect(PyInt_AsLong(o1), PyInt_AsLong(o2),
-                     PyInt_AsLong(o3), PyInt_AsLong(o4));
+                       PyInt_AsLong(o3), PyInt_AsLong(o4));
+        Py_DECREF(o1);
+        Py_DECREF(o2);
+        Py_DECREF(o3);
+        Py_DECREF(o4);
         return TRUE;
     }
 
diff --git a/wxPython/src/helpers.h b/wxPython/src/helpers.h
index 64d394ef00..50ba510883 100644
--- a/wxPython/src/helpers.h
+++ b/wxPython/src/helpers.h
@@ -1070,8 +1070,9 @@ public:
 
 #define IMP_PYCALLBACK_wxSize__pure(CLASS, PCLASS, CBNAME)                      \
     wxSize CLASS::CBNAME() {                                                    \
+        const char* errmsg = #CBNAME " should return a 2-tuple of integers or a wxSize object."; \
         wxSize rval(0,0);                                                       \
-        wxPyBeginBlockThreads();                            \
+        wxPyBeginBlockThreads();                                                \
         if (wxPyCBH_findCallback(m_myInst, #CBNAME)) {                          \
             PyObject* ro;                                                       \
             wxSize*   ptr;                                                      \
@@ -1079,10 +1080,23 @@ public:
             if (ro) {                                                           \
                 if (! SWIG_GetPtrObj(ro, (void **)&ptr, "_wxSize_p"))           \
                     rval = *ptr;                                                \
+                else if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {    \
+                    PyObject* o1 = PySequence_GetItem(ro, 0);                   \
+                    PyObject* o2 = PySequence_GetItem(ro, 1);                   \
+                    if (PyNumber_Check(o1) && PyNumber_Check(o2))               \
+                        rval = wxSize(PyInt_AsLong(o1), PyInt_AsLong(o2));      \
+                    else                                                        \
+                        PyErr_SetString(PyExc_TypeError, errmsg);               \
+                    Py_DECREF(o1);                                              \
+                    Py_DECREF(o2);                                              \
+                }                                                               \
+                else {                                                          \
+                    PyErr_SetString(PyExc_TypeError, errmsg);                   \
+                }                                                               \
                 Py_DECREF(ro);                                                  \
             }                                                                   \
         }                                                                       \
-        wxPyEndBlockThreads();                                             \
+        wxPyEndBlockThreads();                                                  \
         return rval;                                                            \
     }
 
diff --git a/wxPython/src/image.i b/wxPython/src/image.i
index f3d7dc9294..837336efe8 100644
--- a/wxPython/src/image.i
+++ b/wxPython/src/image.i
@@ -136,11 +136,11 @@ public:
     bool SetMaskFromImage(const wxImage & mask,
                           byte mr, byte mg, byte mb);
 
-    void DoFloodFill (wxCoord x, wxCoord y,
-        const wxBrush & fillBrush,
-        const wxColour& testColour,
-        int style = wxFLOOD_SURFACE,
-        int LogicalFunction = wxCOPY /* currently unused */ ) ;
+//      void DoFloodFill (wxCoord x, wxCoord y,
+//          const wxBrush & fillBrush,
+//          const wxColour& testColour,
+//          int style = wxFLOOD_SURFACE,
+//          int LogicalFunction = wxCOPY /* currently unused */ ) ;
 
     static bool CanRead( const wxString& name );
     static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY );
diff --git a/wxPython/src/msw/controls.cpp b/wxPython/src/msw/controls.cpp
index 5861abf826..a0fe2a045b 100644
--- a/wxPython/src/msw/controls.cpp
+++ b/wxPython/src/msw/controls.cpp
@@ -7014,6 +7014,43 @@ static PyObject *_wrap_wxTextCtrl_AppendText(PyObject *self, PyObject *args, PyO
     return _resultobj;
 }
 
+#define wxTextCtrl_EmulateKeyPress(_swigobj,_swigarg0)  (_swigobj->EmulateKeyPress(_swigarg0))
+static PyObject *_wrap_wxTextCtrl_EmulateKeyPress(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxTextCtrl * _arg0;
+    wxKeyEvent * _arg1;
+    PyObject * _argo0 = 0;
+    PyObject * _argo1 = 0;
+    char *_kwnames[] = { "self","event", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxTextCtrl_EmulateKeyPress",_kwnames,&_argo0,&_argo1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextCtrl_EmulateKeyPress. Expected _wxTextCtrl_p.");
+        return NULL;
+        }
+    }
+    if (_argo1) {
+        if (_argo1 == Py_None) { _arg1 = NULL; }
+        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxTextCtrl_EmulateKeyPress. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (bool )wxTextCtrl_EmulateKeyPress(_arg0,*_arg1);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
 #define wxTextCtrl_SetStyle(_swigobj,_swigarg0,_swigarg1,_swigarg2)  (_swigobj->SetStyle(_swigarg0,_swigarg1,_swigarg2))
 static PyObject *_wrap_wxTextCtrl_SetStyle(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -11475,6 +11512,7 @@ static PyMethodDef controlscMethods[] = {
 	 { "wxTextCtrl_GetDefaultStyle", (PyCFunction) _wrap_wxTextCtrl_GetDefaultStyle, METH_VARARGS | METH_KEYWORDS },
 	 { "wxTextCtrl_SetDefaultStyle", (PyCFunction) _wrap_wxTextCtrl_SetDefaultStyle, METH_VARARGS | METH_KEYWORDS },
 	 { "wxTextCtrl_SetStyle", (PyCFunction) _wrap_wxTextCtrl_SetStyle, METH_VARARGS | METH_KEYWORDS },
+	 { "wxTextCtrl_EmulateKeyPress", (PyCFunction) _wrap_wxTextCtrl_EmulateKeyPress, METH_VARARGS | METH_KEYWORDS },
 	 { "wxTextCtrl_AppendText", (PyCFunction) _wrap_wxTextCtrl_AppendText, METH_VARARGS | METH_KEYWORDS },
 	 { "wxTextCtrl_WriteText", (PyCFunction) _wrap_wxTextCtrl_WriteText, METH_VARARGS | METH_KEYWORDS },
 	 { "wxTextCtrl_SetMaxLength", (PyCFunction) _wrap_wxTextCtrl_SetMaxLength, METH_VARARGS | METH_KEYWORDS },
diff --git a/wxPython/src/msw/controls.py b/wxPython/src/msw/controls.py
index 0469e1edce..ccdd4ce7f7 100644
--- a/wxPython/src/msw/controls.py
+++ b/wxPython/src/msw/controls.py
@@ -673,6 +673,9 @@ class wxTextCtrlPtr(wxControlPtr):
     def AppendText(self, *_args, **_kwargs):
         val = apply(controlsc.wxTextCtrl_AppendText,(self,) + _args, _kwargs)
         return val
+    def EmulateKeyPress(self, *_args, **_kwargs):
+        val = apply(controlsc.wxTextCtrl_EmulateKeyPress,(self,) + _args, _kwargs)
+        return val
     def SetStyle(self, *_args, **_kwargs):
         val = apply(controlsc.wxTextCtrl_SetStyle,(self,) + _args, _kwargs)
         return val
diff --git a/wxPython/src/msw/controls2.cpp b/wxPython/src/msw/controls2.cpp
index 37b50d5c43..8e514a4f4f 100644
--- a/wxPython/src/msw/controls2.cpp
+++ b/wxPython/src/msw/controls2.cpp
@@ -11381,6 +11381,9 @@ SWIGEXPORT(void) initcontrols2c() {
 	 PyDict_SetItemString(d,"wxDIRCTRL_SELECT_FIRST", PyInt_FromLong((long) wxDIRCTRL_SELECT_FIRST));
 	 PyDict_SetItemString(d,"wxDIRCTRL_SHOW_FILTERS", PyInt_FromLong((long) wxDIRCTRL_SHOW_FILTERS));
 	 PyDict_SetItemString(d,"wxDIRCTRL_3D_INTERNAL", PyInt_FromLong((long) wxDIRCTRL_3D_INTERNAL));
+	 PyDict_SetItemString(d,"wxDIRCTRL_EDITABLE", PyInt_FromLong((long) wxDIRCTRL_EDITABLE));
+	 PyDict_SetItemString(d,"wxID_TREECTRL", PyInt_FromLong((long) wxID_TREECTRL));
+	 PyDict_SetItemString(d,"wxID_FILTERLISTCTRL", PyInt_FromLong((long) wxID_FILTERLISTCTRL));
 
     // Map renamed classes back to their common name for OOR
     wxPyPtrTypeMap_Add("wxTreeItemData", "wxPyTreeItemData");
diff --git a/wxPython/src/msw/controls2.py b/wxPython/src/msw/controls2.py
index 41d9056f0f..f5dc4bd723 100644
--- a/wxPython/src/msw/controls2.py
+++ b/wxPython/src/msw/controls2.py
@@ -1433,3 +1433,6 @@ wxDIRCTRL_DIR_ONLY = controls2c.wxDIRCTRL_DIR_ONLY
 wxDIRCTRL_SELECT_FIRST = controls2c.wxDIRCTRL_SELECT_FIRST
 wxDIRCTRL_SHOW_FILTERS = controls2c.wxDIRCTRL_SHOW_FILTERS
 wxDIRCTRL_3D_INTERNAL = controls2c.wxDIRCTRL_3D_INTERNAL
+wxDIRCTRL_EDITABLE = controls2c.wxDIRCTRL_EDITABLE
+wxID_TREECTRL = controls2c.wxID_TREECTRL
+wxID_FILTERLISTCTRL = controls2c.wxID_FILTERLISTCTRL
diff --git a/wxPython/src/msw/events.cpp b/wxPython/src/msw/events.cpp
index 7dd5e886c3..d50d9e5b3b 100644
--- a/wxPython/src/msw/events.cpp
+++ b/wxPython/src/msw/events.cpp
@@ -3371,6 +3371,62 @@ static PyObject *_wrap_wxKeyEvent_HasModifiers(PyObject *self, PyObject *args, P
     return _resultobj;
 }
 
+#define wxKeyEvent_GetRawKeyCode(_swigobj)  (_swigobj->GetRawKeyCode())
+static PyObject *_wrap_wxKeyEvent_GetRawKeyCode(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxKeyEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxKeyEvent_GetRawKeyCode",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxKeyEvent_GetRawKeyCode. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (long )wxKeyEvent_GetRawKeyCode(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
+#define wxKeyEvent_GetRawKeyFlags(_swigobj)  (_swigobj->GetRawKeyFlags())
+static PyObject *_wrap_wxKeyEvent_GetRawKeyFlags(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxKeyEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxKeyEvent_GetRawKeyFlags",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxKeyEvent_GetRawKeyFlags. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (long )wxKeyEvent_GetRawKeyFlags(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
 #define wxKeyEvent_GetX(_swigobj)  (_swigobj->GetX())
 static PyObject *_wrap_wxKeyEvent_GetX(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -3971,6 +4027,120 @@ static PyObject *_wrap_wxKeyEvent_m_scanCode_get(PyObject *self, PyObject *args,
     return _resultobj;
 }
 
+#define wxKeyEvent_m_rawCode_set(_swigobj,_swigval) (_swigobj->m_rawCode = _swigval,_swigval)
+static PyObject *_wrap_wxKeyEvent_m_rawCode_set(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxKeyEvent * _arg0;
+    long  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","m_rawCode", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Ol:wxKeyEvent_m_rawCode_set",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxKeyEvent_m_rawCode_set. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (long )wxKeyEvent_m_rawCode_set(_arg0,_arg1);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
+#define wxKeyEvent_m_rawCode_get(_swigobj) ((long ) _swigobj->m_rawCode)
+static PyObject *_wrap_wxKeyEvent_m_rawCode_get(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxKeyEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxKeyEvent_m_rawCode_get",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxKeyEvent_m_rawCode_get. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (long )wxKeyEvent_m_rawCode_get(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
+#define wxKeyEvent_m_rawFlags_set(_swigobj,_swigval) (_swigobj->m_rawFlags = _swigval,_swigval)
+static PyObject *_wrap_wxKeyEvent_m_rawFlags_set(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxKeyEvent * _arg0;
+    long  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","m_rawFlags", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Ol:wxKeyEvent_m_rawFlags_set",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxKeyEvent_m_rawFlags_set. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (long )wxKeyEvent_m_rawFlags_set(_arg0,_arg1);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
+#define wxKeyEvent_m_rawFlags_get(_swigobj) ((long ) _swigobj->m_rawFlags)
+static PyObject *_wrap_wxKeyEvent_m_rawFlags_get(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxKeyEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxKeyEvent_m_rawFlags_get",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxKeyEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxKeyEvent_m_rawFlags_get. Expected _wxKeyEvent_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (long )wxKeyEvent_m_rawFlags_get(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
 static void *SwigwxNavigationKeyEventTowxEvent(void *ptr) {
     wxNavigationKeyEvent *src;
     wxEvent *dest;
@@ -7213,6 +7383,10 @@ static PyMethodDef eventscMethods[] = {
 	 { "wxNavigationKeyEvent_SetDirection", (PyCFunction) _wrap_wxNavigationKeyEvent_SetDirection, METH_VARARGS | METH_KEYWORDS },
 	 { "wxNavigationKeyEvent_GetDirection", (PyCFunction) _wrap_wxNavigationKeyEvent_GetDirection, METH_VARARGS | METH_KEYWORDS },
 	 { "new_wxNavigationKeyEvent", (PyCFunction) _wrap_new_wxNavigationKeyEvent, METH_VARARGS | METH_KEYWORDS },
+	 { "wxKeyEvent_m_rawFlags_get", (PyCFunction) _wrap_wxKeyEvent_m_rawFlags_get, METH_VARARGS | METH_KEYWORDS },
+	 { "wxKeyEvent_m_rawFlags_set", (PyCFunction) _wrap_wxKeyEvent_m_rawFlags_set, METH_VARARGS | METH_KEYWORDS },
+	 { "wxKeyEvent_m_rawCode_get", (PyCFunction) _wrap_wxKeyEvent_m_rawCode_get, METH_VARARGS | METH_KEYWORDS },
+	 { "wxKeyEvent_m_rawCode_set", (PyCFunction) _wrap_wxKeyEvent_m_rawCode_set, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_m_scanCode_get", (PyCFunction) _wrap_wxKeyEvent_m_scanCode_get, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_m_scanCode_set", (PyCFunction) _wrap_wxKeyEvent_m_scanCode_set, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_m_metaDown_get", (PyCFunction) _wrap_wxKeyEvent_m_metaDown_get, METH_VARARGS | METH_KEYWORDS },
@@ -7233,6 +7407,8 @@ static PyMethodDef eventscMethods[] = {
 	 { "wxKeyEvent_GetPosition", (PyCFunction) _wrap_wxKeyEvent_GetPosition, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_GetY", (PyCFunction) _wrap_wxKeyEvent_GetY, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_GetX", (PyCFunction) _wrap_wxKeyEvent_GetX, METH_VARARGS | METH_KEYWORDS },
+	 { "wxKeyEvent_GetRawKeyFlags", (PyCFunction) _wrap_wxKeyEvent_GetRawKeyFlags, METH_VARARGS | METH_KEYWORDS },
+	 { "wxKeyEvent_GetRawKeyCode", (PyCFunction) _wrap_wxKeyEvent_GetRawKeyCode, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_HasModifiers", (PyCFunction) _wrap_wxKeyEvent_HasModifiers, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_GetKeyCode", (PyCFunction) _wrap_wxKeyEvent_GetKeyCode, METH_VARARGS | METH_KEYWORDS },
 	 { "wxKeyEvent_KeyCode", (PyCFunction) _wrap_wxKeyEvent_KeyCode, METH_VARARGS | METH_KEYWORDS },
diff --git a/wxPython/src/msw/events.py b/wxPython/src/msw/events.py
index abb06e397a..f92eb87163 100644
--- a/wxPython/src/msw/events.py
+++ b/wxPython/src/msw/events.py
@@ -414,6 +414,12 @@ class wxKeyEventPtr(wxEventPtr):
     def HasModifiers(self, *_args, **_kwargs):
         val = apply(eventsc.wxKeyEvent_HasModifiers,(self,) + _args, _kwargs)
         return val
+    def GetRawKeyCode(self, *_args, **_kwargs):
+        val = apply(eventsc.wxKeyEvent_GetRawKeyCode,(self,) + _args, _kwargs)
+        return val
+    def GetRawKeyFlags(self, *_args, **_kwargs):
+        val = apply(eventsc.wxKeyEvent_GetRawKeyFlags,(self,) + _args, _kwargs)
+        return val
     def GetX(self, *_args, **_kwargs):
         val = apply(eventsc.wxKeyEvent_GetX,(self,) + _args, _kwargs)
         return val
@@ -452,6 +458,12 @@ class wxKeyEventPtr(wxEventPtr):
         if name == "m_scanCode" :
             eventsc.wxKeyEvent_m_scanCode_set(self,value)
             return
+        if name == "m_rawCode" :
+            eventsc.wxKeyEvent_m_rawCode_set(self,value)
+            return
+        if name == "m_rawFlags" :
+            eventsc.wxKeyEvent_m_rawFlags_set(self,value)
+            return
         self.__dict__[name] = value
     def __getattr__(self,name):
         if name == "m_x" : 
@@ -470,6 +482,10 @@ class wxKeyEventPtr(wxEventPtr):
             return eventsc.wxKeyEvent_m_metaDown_get(self)
         if name == "m_scanCode" : 
             return eventsc.wxKeyEvent_m_scanCode_get(self)
+        if name == "m_rawCode" : 
+            return eventsc.wxKeyEvent_m_rawCode_get(self)
+        if name == "m_rawFlags" : 
+            return eventsc.wxKeyEvent_m_rawFlags_get(self)
         raise AttributeError,name
     def __repr__(self):
         return "<C wxKeyEvent instance at %s>" % (self.this,)
diff --git a/wxPython/src/msw/fonts.cpp b/wxPython/src/msw/fonts.cpp
index 39b827d2dd..665cd6bee6 100644
--- a/wxPython/src/msw/fonts.cpp
+++ b/wxPython/src/msw/fonts.cpp
@@ -58,7 +58,6 @@ extern PyObject *SWIG_newvarlink(void);
 #include "helpers.h"
 #include <wx/fontmap.h>
 #include <wx/fontenc.h>
-#include <wx/fontmap.h>
 #include <wx/fontutil.h>
 #include <wx/fontenum.h>
 #include <wx/intl.h>
@@ -893,6 +892,65 @@ static PyObject *_wrap_delete_wxFontMapper(PyObject *self, PyObject *args, PyObj
     return _resultobj;
 }
 
+static PyObject *_wrap_wxFontMapper_Get(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxFontMapper * _result;
+    char *_kwnames[] = {  NULL };
+    char _ptemp[128];
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,":wxFontMapper_Get",_kwnames)) 
+        return NULL;
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (wxFontMapper *)wxFontMapper::Get();
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    if (_result) {
+        SWIG_MakePtr(_ptemp, (char *) _result,"_wxFontMapper_p");
+        _resultobj = Py_BuildValue("s",_ptemp);
+    } else {
+        Py_INCREF(Py_None);
+        _resultobj = Py_None;
+    }
+    return _resultobj;
+}
+
+static PyObject *_wrap_wxFontMapper_Set(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxFontMapper * _result;
+    wxFontMapper * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "mapper", NULL };
+    char _ptemp[128];
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxFontMapper_Set",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxFontMapper_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxFontMapper_Set. Expected _wxFontMapper_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (wxFontMapper *)wxFontMapper::Set(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    if (_result) {
+        SWIG_MakePtr(_ptemp, (char *) _result,"_wxFontMapper_p");
+        _resultobj = Py_BuildValue("s",_ptemp);
+    } else {
+        Py_INCREF(Py_None);
+        _resultobj = Py_None;
+    }
+    return _resultobj;
+}
+
 static PyObject * wxFontMapper_GetAltForEncoding(wxFontMapper *self,wxFontEncoding  encoding,const wxString & facename,bool  interactive) {
             wxFontEncoding alt_enc;
             if (self->GetAltForEncoding(encoding, &alt_enc, facename, interactive))
@@ -3660,6 +3718,8 @@ static PyMethodDef fontscMethods[] = {
 	 { "wxFontMapper_CharsetToEncoding", (PyCFunction) _wrap_wxFontMapper_CharsetToEncoding, METH_VARARGS | METH_KEYWORDS },
 	 { "wxFontMapper_IsEncodingAvailable", (PyCFunction) _wrap_wxFontMapper_IsEncodingAvailable, METH_VARARGS | METH_KEYWORDS },
 	 { "wxFontMapper_GetAltForEncoding", (PyCFunction) _wrap_wxFontMapper_GetAltForEncoding, METH_VARARGS | METH_KEYWORDS },
+	 { "wxFontMapper_Set", (PyCFunction) _wrap_wxFontMapper_Set, METH_VARARGS | METH_KEYWORDS },
+	 { "wxFontMapper_Get", (PyCFunction) _wrap_wxFontMapper_Get, METH_VARARGS | METH_KEYWORDS },
 	 { "delete_wxFontMapper", (PyCFunction) _wrap_delete_wxFontMapper, METH_VARARGS | METH_KEYWORDS },
 	 { "new_wxFontMapper", (PyCFunction) _wrap_new_wxFontMapper, METH_VARARGS | METH_KEYWORDS },
 	 { "wxNativeFontInfo_ToUserString", (PyCFunction) _wrap_wxNativeFontInfo_ToUserString, METH_VARARGS | METH_KEYWORDS },
diff --git a/wxPython/src/msw/fonts.py b/wxPython/src/msw/fonts.py
index 6b237f4e73..67f10f0940 100644
--- a/wxPython/src/msw/fonts.py
+++ b/wxPython/src/msw/fonts.py
@@ -381,6 +381,16 @@ def wxGetLocale(*_args, **_kwargs):
 
 wxGetTranslation = fontsc.wxGetTranslation
 
+def wxFontMapper_Get(*_args, **_kwargs):
+    val = apply(fontsc.wxFontMapper_Get,_args,_kwargs)
+    if val: val = wxFontMapperPtr(val)
+    return val
+
+def wxFontMapper_Set(*_args, **_kwargs):
+    val = apply(fontsc.wxFontMapper_Set,_args,_kwargs)
+    if val: val = wxFontMapperPtr(val)
+    return val
+
 wxFontMapper_GetEncodingName = fontsc.wxFontMapper_GetEncodingName
 
 wxFontMapper_GetEncodingDescription = fontsc.wxFontMapper_GetEncodingDescription
diff --git a/wxPython/src/msw/grid.cpp b/wxPython/src/msw/grid.cpp
index 1fbab3b304..82af203c89 100644
--- a/wxPython/src/msw/grid.cpp
+++ b/wxPython/src/msw/grid.cpp
@@ -519,8 +519,23 @@ public:
                               wxPyConstructObject((void*)&dc,   "wxDC", 0),
                               row, col));
             if (ro) {
-                if (!SWIG_GetPtrObj(ro, (void **)&ptr, "_wxSize_p"))
+                const char* errmsg = "GetBestSize should return a 2-tuple of integers or a wxSize object.";
+                if (!SWIG_GetPtrObj(ro, (void **)&ptr, "_wxSize_p")) {
                     rval = *ptr;
+                }
+                else if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {
+                    PyObject* o1 = PySequence_GetItem(ro, 0);
+                    PyObject* o2 = PySequence_GetItem(ro, 1);
+                    if (PyNumber_Check(o1) && PyNumber_Check(o2))
+                        rval = wxSize(PyInt_AsLong(o1), PyInt_AsLong(o2));
+                    else
+                        PyErr_SetString(PyExc_TypeError, errmsg);
+                    Py_DECREF(o1);
+                    Py_DECREF(o2);
+                }
+                else {
+                    PyErr_SetString(PyExc_TypeError, errmsg);
+                }
                 Py_DECREF(ro);
             }
         }
diff --git a/wxPython/src/msw/image.cpp b/wxPython/src/msw/image.cpp
index 648bd9b26a..4bffe16f97 100644
--- a/wxPython/src/msw/image.cpp
+++ b/wxPython/src/msw/image.cpp
@@ -1685,55 +1685,6 @@ static PyObject *_wrap_wxImage_SetMaskFromImage(PyObject *self, PyObject *args,
     return _resultobj;
 }
 
-#define wxImage_DoFloodFill(_swigobj,_swigarg0,_swigarg1,_swigarg2,_swigarg3,_swigarg4,_swigarg5)  (_swigobj->DoFloodFill(_swigarg0,_swigarg1,_swigarg2,_swigarg3,_swigarg4,_swigarg5))
-static PyObject *_wrap_wxImage_DoFloodFill(PyObject *self, PyObject *args, PyObject *kwargs) {
-    PyObject * _resultobj;
-    wxImage * _arg0;
-    wxCoord  _arg1;
-    wxCoord  _arg2;
-    wxBrush * _arg3;
-    wxColour * _arg4;
-    int  _arg5 = (int ) wxFLOOD_SURFACE;
-    int  _arg6 = (int ) wxCOPY;
-    PyObject * _argo0 = 0;
-    PyObject * _argo3 = 0;
-    wxColour  temp;
-    PyObject * _obj4 = 0;
-    char *_kwnames[] = { "self","x","y","fillBrush","testColour","style","LogicalFunction", NULL };
-
-    self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiiOO|ii:wxImage_DoFloodFill",_kwnames,&_argo0,&_arg1,&_arg2,&_argo3,&_obj4,&_arg5,&_arg6)) 
-        return NULL;
-    if (_argo0) {
-        if (_argo0 == Py_None) { _arg0 = NULL; }
-        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxImage_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxImage_DoFloodFill. Expected _wxImage_p.");
-        return NULL;
-        }
-    }
-    if (_argo3) {
-        if (_argo3 == Py_None) { _arg3 = NULL; }
-        else if (SWIG_GetPtrObj(_argo3,(void **) &_arg3,"_wxBrush_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 4 of wxImage_DoFloodFill. Expected _wxBrush_p.");
-        return NULL;
-        }
-    }
-{
-    _arg4 = &temp;
-    if (! wxColour_helper(_obj4, &_arg4))
-        return NULL;
-}
-{
-    PyThreadState* __tstate = wxPyBeginAllowThreads();
-    wxImage_DoFloodFill(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6);
-
-    wxPyEndAllowThreads(__tstate);
-    if (PyErr_Occurred()) return NULL;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
-    return _resultobj;
-}
-
 static PyObject *_wrap_wxImage_CanRead(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     bool  _result;
@@ -3192,7 +3143,6 @@ static PyMethodDef imagecMethods[] = {
 	 { "wxImage_LoadFile", (PyCFunction) _wrap_wxImage_LoadFile, METH_VARARGS | METH_KEYWORDS },
 	 { "wxImage_GetImageCount", (PyCFunction) _wrap_wxImage_GetImageCount, METH_VARARGS | METH_KEYWORDS },
 	 { "wxImage_CanRead", (PyCFunction) _wrap_wxImage_CanRead, METH_VARARGS | METH_KEYWORDS },
-	 { "wxImage_DoFloodFill", (PyCFunction) _wrap_wxImage_DoFloodFill, METH_VARARGS | METH_KEYWORDS },
 	 { "wxImage_SetMaskFromImage", (PyCFunction) _wrap_wxImage_SetMaskFromImage, METH_VARARGS | METH_KEYWORDS },
 	 { "wxImage_FindFirstUnusedColour", (PyCFunction) _wrap_wxImage_FindFirstUnusedColour, METH_VARARGS | METH_KEYWORDS },
 	 { "wxImage_GetBlue", (PyCFunction) _wrap_wxImage_GetBlue, METH_VARARGS | METH_KEYWORDS },
diff --git a/wxPython/src/msw/image.py b/wxPython/src/msw/image.py
index a96f5b3829..844a22e954 100644
--- a/wxPython/src/msw/image.py
+++ b/wxPython/src/msw/image.py
@@ -227,9 +227,6 @@ class wxImagePtr(wxObjectPtr):
     def SetMaskFromImage(self, *_args, **_kwargs):
         val = apply(imagec.wxImage_SetMaskFromImage,(self,) + _args, _kwargs)
         return val
-    def DoFloodFill(self, *_args, **_kwargs):
-        val = apply(imagec.wxImage_DoFloodFill,(self,) + _args, _kwargs)
-        return val
     def LoadFile(self, *_args, **_kwargs):
         val = apply(imagec.wxImage_LoadFile,(self,) + _args, _kwargs)
         return val
-- 
2.47.2