diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | Makefile.am | 15 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | gdkimlibmodule.c | 4 | ||||
-rw-r--r-- | generate/Makefile.am | 8 | ||||
-rw-r--r-- | generate/gtklists.defs | 2 | ||||
-rw-r--r-- | gtk.py | 2 | ||||
-rw-r--r-- | gtkmodule.c | 127 | ||||
-rw-r--r-- | pygtk.spec | 2 |
9 files changed, 151 insertions, 29 deletions
@@ -1,3 +1,21 @@ +1999-03-12 James Henstridge <james@daa.com.au> + + * configure.in, pygtk.spec: increased version number to 0.5.12. + + * gtkmodule.c: added optional support for not catching exceptions in + callbacks. This way it should be a lot easier to debug a pygtk + program with pdb. + + * gtkmodule.c, gtk.py: a few fixes for problems sent in by + Chi-Deok Hwang. This includes a fix to GtkWidget.event(), + assignments to GtkStyle attributes throwing exceptions, + font loading getting reference counting correct and throwing + exceptions for bad font names and allowing None to be passed + as a colour to GnomeCanvasItem.set() (the fix is in pygtk). + + * generate/gtklists.defs (gtk_ctree_new): I had missed this + function in previous releases. + 1999-02-24 James Henstridge <james@daa.com.au> * gtk.py: made changes to match those in the defs files and _gtk. diff --git a/Makefile.am b/Makefile.am index 75e432ee..a67efab4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -21,15 +21,18 @@ noinst_PYTHON = mkgtk.py description.py # stuff to automatically generate gtkmodule_*.c GENERATE = generate/scmexpr.py generate/generate.py -GTKMODULE_DEFS = generate/gtk.defs generate/gtkbase.defs \ - generate/gtkcontainers.defs generate/gtkdata.defs generate/gtkedit.defs \ - generate/gtkenums.defs generate/gtklists.defs generate/gtkmenus.defs \ - generate/gtkmisc.defs generate/gtkranges.defs generate/gtkdnd.defs -gtkmodule_defs.c gtkmodule_impl.c: mkgtk.py $(GENERATE) $(GTKMODULE_DEFS) +GTKMODULE_DEFS = generate/gtk.defs \ + generate/gtkbase.defs generate/gtkcontainers.defs \ + generate/gtkdata.defs generate/gtkedit.defs \ + generate/gtkenums.defs generate/gtklists.defs \ + generate/gtkmenus.defs generate/gtkmisc.defs \ + generate/gtkranges.defs generate/gtkdnd.defs + +$(srcdir)/gtkmodule_defs.c $(srcdir)/gtkmodule_impl.c: $(srcdir)/mkgtk.py $(GENERATE) $(GTKMODULE_DEFS) cd $(srcdir) && $(PYTHON) mkgtk.py -gtkmodule.o: gtkmodule_defs.c gtkmodule_impl.c +gtkmodule.o: gtkmodule.c gtkmodule_defs.c gtkmodule_impl.c EXTRA_DIST = \ pygtk.spec \ diff --git a/configure.in b/configure.in index eaf0ed67..0b847af7 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ AC_INIT dnl for gnome-python: -AM_INIT_AUTOMAKE(pygtk, 0.5.11) +AM_INIT_AUTOMAKE(pygtk, 0.5.12) AM_PATH_PYTHON AM_INIT_PYEXEC_MOD diff --git a/gdkimlibmodule.c b/gdkimlibmodule.c index 55f6b43b..d76f6848 100644 --- a/gdkimlibmodule.c +++ b/gdkimlibmodule.c @@ -814,6 +814,10 @@ void init_gdkimlib() { /* get types and exported functions out of _gtkmodule */ m = PyImport_ImportModule("_gtk"); + if (m == NULL) { + Py_FatalError("couldn't import _gtk"); + return; + } d = PyModule_GetDict(m); Py_DECREF(m); diff --git a/generate/Makefile.am b/generate/Makefile.am index 681ec31a..5aa0f4f1 100644 --- a/generate/Makefile.am +++ b/generate/Makefile.am @@ -2,12 +2,12 @@ noinst_PYTHON = generate.py scmexpr.py EXTRA_DIST = gtk.defs gtkbase.defs gtkcontainers.defs gtkdata.defs \ gtkedit.defs gtkenums.defs gtklists.defs gtkmenus.defs gtkmisc.defs \ - gtkranges.defs gtkdnd.defs gtk.ignore + gtkranges.defs gtkdnd.defs all: gtk.ignore gtk.ignore: ../gtkmodule.c - echo "# ignore list for gtkmodule" > gtk.ignore - echo "# (automatically generated)" >> gtk.ignore + echo "# ignore list for gtkmodule" > $(srcdir)/gtk.ignore + echo "# (automatically generated)" >> $(srcdir)/gtk.ignore sed -n 's/^.*_wrap_\([a-zA-Z_]*\),.*$$/\1/p' \ - < ../gtkmodule.c >> gtk.ignore
\ No newline at end of file + < $(srcdir)/../gtkmodule.c >> $(srcdir)/gtk.ignore
\ No newline at end of file diff --git a/generate/gtklists.defs b/generate/gtklists.defs index 72d1b937..6d1c598a 100644 --- a/generate/gtklists.defs +++ b/generate/gtklists.defs @@ -624,7 +624,7 @@ ; gtk_ctree_new_with_titles -(define-func gtk_ctree_new_with_titles +(define-func gtk_ctree_new GtkWidget ((int columns) (int tree_column))) @@ -301,7 +301,7 @@ class GtkWidget(GtkObject): def ensure_style(self): _gtk.gtk_widget_ensure_style(self._o) def event(self, event): - _gtk.gtk_widget_event + _gtk.gtk_widget_event(self._o, event) def lock_accelerators(self): _gtk.gtk_widget_lock_accelerators(self._o) def get_ancestor(self, type): diff --git a/gtkmodule.c b/gtkmodule.c index 200e5fb2..43e2bb17 100644 --- a/gtkmodule.c +++ b/gtkmodule.c @@ -21,6 +21,8 @@ #include <sysmodule.h> #include <gtk/gtk.h> +static gboolean PyGtk_FatalExceptions = FALSE; + typedef struct { PyObject_HEAD GtkObject *obj; @@ -722,10 +724,11 @@ static int PyGtkStyle_SetAttr(PyGtkStyle_Object *self, char *key, PyErr_SetString(PyExc_TypeError,"white_gc attribute must be a GdkColor"); return -1; } + } else { + PyErr_SetString(PyExc_AttributeError, key); + return -1; } - - PyErr_SetString(PyExc_AttributeError, key); - return -1; + return 0; } static PyTypeObject PyGtkStyle_Type = { @@ -2331,16 +2334,22 @@ static int GtkArg_FromPyObject(GtkArg *arg, PyObject *obj) { } else if (arg->type == GTK_TYPE_GDK_COLOR) { if (PyGdkColor_Check(obj)) GTK_VALUE_BOXED(*arg) = PyGdkColor_Get(obj); + else if (obj == Py_None) + GTK_VALUE_BOXED(*arg) = NULL; else return -1; } else if (arg->type == GTK_TYPE_GDK_WINDOW) { if (PyGdkWindow_Check(obj)) GTK_VALUE_BOXED(*arg) = PyGdkWindow_Get(obj); + else if (obj == Py_None) + GTK_VALUE_BOXED(*arg) = NULL; else return -1; } else if (arg->type == GTK_TYPE_GDK_COLORMAP) { if (PyGdkColormap_Check(obj)) GTK_VALUE_BOXED(*arg) = PyGdkColormap_Get(obj); + else if (obj == Py_None) + GTK_VALUE_BOXED(*arg) = NULL; else return -1; } else if (arg->type == GTK_TYPE_GDK_DRAG_CONTEXT) { @@ -2827,8 +2836,12 @@ static void PyGtk_CallbackMarshal(GtkObject *o, gpointer data, guint nargs, ret = PyObject_CallObject(func, params); Py_DECREF(params); if (ret == NULL) { - PyErr_Print(); - PyErr_Clear(); + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } return; } GtkRet_FromPyObject(&args[nargs], ret); @@ -2862,8 +2875,12 @@ void PyGtk_SignalMarshal(GtkObject *object, /*gpointer*/ PyObject *func, Py_DECREF(params); if (ret == NULL) { - PyErr_Print(); - PyErr_Clear(); + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } return; } GtkRet_FromPyObject(&args[nparams], ret); @@ -2883,8 +2900,12 @@ static void PyGtk_HandlerMarshal(gpointer a, PyObject *func, int nargs, ret = PyObject_CallObject(func, NULL); if (ret == NULL) { - PyErr_Print(); - PyErr_Clear(); + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } *GTK_RETLOC_BOOL(args[0]) = FALSE; return; } @@ -2905,8 +2926,12 @@ static void PyGtk_InputMarshal(gpointer a, PyObject *func, int nargs, ret = PyObject_CallObject(func, tuple); Py_DECREF(tuple); if (ret == NULL) { - PyErr_Print(); - PyErr_Clear(); + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } } else Py_DECREF(ret); } @@ -3196,6 +3221,17 @@ static PyObject * _wrap_gtk_init(PyObject *self, PyObject *args) { return Py_None; } +static PyObject *_wrap_gtk_main(PyObject *self, PyObject *args) { + if (!PyArg_ParseTuple(args, ":gtk_main")) + return NULL; + gtk_main(); + + if (PyErr_Occurred()) + return NULL; + Py_INCREF(Py_None); + return Py_None; +} + static PyObject *_wrap_gtk_main_iteration(PyObject *self, PyObject *args) { int block = 1; @@ -4089,8 +4125,12 @@ static void PyGtk_item_factory_cb(PyObject *callback, guint action, ret = PyObject_CallFunction(callback, "iO", action, PyGtk_New((GtkObject *)widget)); if (ret == NULL) { - PyErr_Print(); - PyErr_Clear(); + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } } else Py_DECREF(ret); } @@ -4158,8 +4198,12 @@ static void PyGtk_MenuPosition(GtkMenu *menu, int *x, int *y, PyObject *func) { ret = PyObject_CallFunction(func, "Oii", PyGtk_New(GTK_OBJECT(menu)), *x, *y); if (ret == NULL || !PyArg_ParseTuple(ret, "ii", x, y)) { - PyErr_Print(); - PyErr_Clear(); + if (PyGtk_FatalExceptions) + gtk_main_quit(); + else { + PyErr_Print(); + PyErr_Clear(); + } if (ret) Py_DECREF(ret); } else Py_DECREF(ret); @@ -4692,6 +4736,42 @@ static PyObject *_wrap_gdk_pixmap_colormap_create_from_xpm_d(PyObject *self, PyO return ret; } +static PyObject *_wrap_gdk_font_load(PyObject *self, PyObject *args) { + gchar *name; + GdkFont *font; + PyObject *ret; + + if (!PyArg_ParseTuple(args, "s:gdk_font_load", &name)) + return NULL; + font = gdk_font_load(name); + if (font) { + ret = PyGdkFont_New(font); + gdk_font_unref(font); + return ret; + } else { + PyErr_SetString(PyExc_RuntimeError, "couldn't load the font"); + return NULL; + } +} + +static PyObject *_wrap_gdk_fontset_load(PyObject *self, PyObject *args) { + gchar *name; + GdkFont *font; + PyObject *ret; + + if (!PyArg_ParseTuple(args, "s:gdk_fontset_load", &name)) + return NULL; + font = gdk_fontset_load(name); + if (font) { + ret = PyGdkFont_New(font); + gdk_font_unref(font); + return ret; + } else { + PyErr_SetString(PyExc_RuntimeError, "couldn't load the font"); + return NULL; + } +} + static PyObject *_wrap_gdk_draw_polygon(PyObject *self, PyObject *args) { PyObject *win, *gc, *seq, *item; gint filled, npoints, i; @@ -5384,6 +5464,7 @@ static PyMethodDef _gtkmoduleMethods[] = { { "gtk_signal_handler_unblock_by_data", _wrap_gtk_signal_handler_unblock_by_data, 1 }, { "gtk_signal_emitv_by_name", _wrap_gtk_signal_emitv_by_name, 1 }, { "gtk_init", _wrap_gtk_init, 1 }, + { "gtk_main", _wrap_gtk_main, 1 }, { "gtk_main_iteration", _wrap_gtk_main_iteration, 1 }, { "gtk_timeout_add", _wrap_gtk_timeout_add, 1 }, { "gtk_idle_add", _wrap_gtk_idle_add, 1 }, @@ -5482,6 +5563,8 @@ static PyMethodDef _gtkmoduleMethods[] = { { "gdk_pixmap_create_from_xpm_d", _wrap_gdk_pixmap_create_from_xpm_d, 1 }, { "gdk_pixmap_colormap_create_from_xpm", _wrap_gdk_pixmap_colormap_create_from_xpm, 1 }, { "gdk_pixmap_colormap_create_from_xpm_d", _wrap_gdk_pixmap_colormap_create_from_xpm_d, 1 }, + { "gdk_font_load", _wrap_gdk_font_load, 1 }, + { "gdk_fontset_load", _wrap_gdk_fontset_load, 1 }, { "gdk_draw_polygon", _wrap_gdk_draw_polygon, 1 }, { "gdk_draw_text", _wrap_gdk_draw_text, 1 }, { "gdk_draw_points", _wrap_gdk_draw_points, 1 }, @@ -5600,6 +5683,20 @@ void init_gtk() { d=PyCObject_FromVoidPtr(PyGtk_RegisterBoxed, NULL)); Py_DECREF(d); + m = PyImport_ImportModule("os"); + if (m == NULL) { + Py_FatalError("couldn't import os"); + return; + } + d = PyModule_GetDict(m); + Py_DECREF(m); + d = PyDict_GetItemString(d, "environ"); + d = PyMapping_GetItemString(d, "PYGTK_FATAL_EXCEPTIONS"); + if (d == NULL) + PyErr_Clear(); + else + PyGtk_FatalExceptions = PyObject_IsTrue(d); + if (PyErr_Occurred()) Py_FatalError("can't initialise module _gtk"); } @@ -1,7 +1,7 @@ %define py_prefix /usr # py_ver should only be 3 characters (1.5.1 == 1.5) %define py_ver 1.5 -%define ver 0.5.11 +%define ver 0.5.12 Summary: Python bindings for the GTK+ widget set. Name: pygtk |