summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog18
-rw-r--r--Makefile.am15
-rw-r--r--configure.in2
-rw-r--r--gdkimlibmodule.c4
-rw-r--r--generate/Makefile.am8
-rw-r--r--generate/gtklists.defs2
-rw-r--r--gtk.py2
-rw-r--r--gtkmodule.c127
-rw-r--r--pygtk.spec2
9 files changed, 151 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index 9898d12f..0ed384ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)))
diff --git a/gtk.py b/gtk.py
index 31a7558f..d2398641 100644
--- a/gtk.py
+++ b/gtk.py
@@ -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");
}
diff --git a/pygtk.spec b/pygtk.spec
index 44490ec2..79b4a9a6 100644
--- a/pygtk.spec
+++ b/pygtk.spec
@@ -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