/* PMail - GNOME/GTK/Python email client Copyright (C) 2000 Scott Bender This file is part of PMail. PMail is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. PMail is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with PMail; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include static PyObject *_image_func = 0; static XmImageInfo *imageProc(TWidget w, String url, TPointer tp) { PyObject *ret, *tuple; char *res; tuple = PyTuple_New(1); PyTuple_SetItem(tuple, 0, PyString_FromString(url)); ret = PyObject_CallObject(_image_func, tuple); if (ret == NULL) { if (PyGtk_FatalExceptions) gtk_main_quit(); else { PyErr_Print(); PyErr_Clear(); } return; } res = PyString_AsString(ret); return XmHTMLImageDefaultProc(w, res, NULL, 0); } static PyObject *_wrap_gtk_xhtml_set_image_proc(PyObject *self, PyObject *args) { PyGtk_Object *obj; int signum; if (!PyArg_ParseTuple(args, "O!O:set_image_proc", &PyGtk_Type, &obj, &_image_func)) return NULL; if (!PyCallable_Check(_image_func)) { PyErr_SetString(PyExc_TypeError, "third argument must be callable"); return NULL; } Py_INCREF(_image_func); gtk_xmhtml_set_image_procs(GTK_XMHTML(PyGtk_Get(obj)), imageProc, 0, 0, 0); return Py_None; } static PyObject *_wrap_gtk_xmhtml_set_anchor_underline_type(PyObject *self, PyObject *args) { int underline_type; PyObject *html; if (!PyArg_ParseTuple(args, "O!i:gtk_xmhtml_set_anchor_underline_type", &PyGtk_Type, &html, &underline_type)) return NULL; gtk_xmhtml_set_anchor_underline_type(GTK_XMHTML(PyGtk_Get(html)), underline_type); Py_INCREF(Py_None); return Py_None; } static PyObject *_wrap_gnome_mime_get_value(PyObject *self, PyObject *args) { char *mime_type, *key; const char *res; if (!PyArg_ParseTuple(args, "ss:gnome_mime_get_value", &mime_type, &key)) return NULL; res = gnome_mime_get_value(mime_type, key); if (res == 0) { return Py_None; } return PyString_FromString(res); } static _my_spell_func(GnomeSpell *speller, gpointer arg1, gpointer user_data) { printf("_my_spell_func\n"); } static PyObject *_setup_gnome_spell(PyObject *self, PyObject *args) { PyObject *p_spell; GnomeSpell *spell; GtkWindow *win; PyObject *func; if (!PyArg_ParseTuple(args, "O!O:gnome_mime_get_value", &PyGtk_Type, &p_spell, &func)) return NULL; win = GTK_WINDOW(PyGtk_Get(p_spell)); spell = GNOME_SPELL(win); gtk_signal_connect(GTK_OBJECT(spell), "found-word", _my_spell_func, func); return Py_None; } static PyObject *_window_set_parent(PyObject *self, PyObject *args) { PyObject *p_dialog, *p_parent; GtkWindow *parent, *dialog; gint p_w = 0, p_h = 0; if (!PyArg_ParseTuple(args, "O!O!:window_set_parent", &PyGtk_Type, &p_dialog, &PyGtk_Type, &p_parent)) return NULL; dialog = GTK_WINDOW(PyGtk_Get(p_dialog)); parent = GTK_WINDOW(PyGtk_Get(p_parent)); if (dialog == NULL || !GTK_IS_WINDOW(dialog) || parent == NULL || !GTK_IS_WINDOW(parent) || parent == GTK_WINDOW(dialog)) { PyErr_SetString(PyExc_TypeError, "invalid argument"); return NULL; } gtk_window_set_transient_for (GTK_WINDOW(dialog), parent); if ( gnome_preferences_get_dialog_centered() ) { /* User wants us to center over parent */ gint x, y, w, h, dialog_x, dialog_y, dialog_w = 0, dialog_h = 0; if ( ! GTK_WIDGET_VISIBLE(parent)) return; /* Can't get its size/pos */ /* Throw out other positioning */ gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_NONE); gdk_window_get_origin(GTK_WIDGET(parent)->window, &x, &y); gdk_window_get_size(GTK_WIDGET(parent)->window, &w, &h); if (GTK_WIDGET_VISIBLE(dialog)) { gdk_window_get_size(GTK_WIDGET(dialog)->window, &dialog_w, &dialog_h); } else if ( p_w && p_h ) { dialog_w = p_w; dialog_h = p_h; } if ( dialog_w && dialog_h ) { dialog_x = x + w/2 - dialog_w/2; dialog_y = y + h/2 - dialog_h/2; } else { dialog_x = x + w/4; dialog_y = y + h/4; } gtk_widget_set_uposition(GTK_WIDGET(dialog), dialog_x, dialog_y); } return Py_None; } static PyObject *_spellinfo_get_original(PyObject *self, PyObject *args) { PyObject *pobj; GnomeSpellInfo *info; if (!PyArg_ParseTuple(args, "O:spellinfo_get_original", &pobj)) return NULL; info = PyCObject_AsVoidPtr(pobj); printf("original = %s\n", info->original); return PyString_FromString(info->original); } static PyMethodDef pmailextensionMethods[] = { { "gtk_xmhtml_set_image_proc", _wrap_gtk_xhtml_set_image_proc, 1 }, { "gtk_xmhtml_set_anchor_underline_type", _wrap_gtk_xmhtml_set_anchor_underline_type, 1 }, { "gnome_mime_get_value", _wrap_gnome_mime_get_value, 1 }, { "window_set_parent", _window_set_parent, 1 }, { "setup_gnome_spell", _setup_gnome_spell, 1 }, // { "spellinfo_get_replacement", _spellinfo_get_replacement, 1 }, // { "spellinfo_get_word", _spellinfo_get_word, 1 }, // { "spellinfo_get_offet", _spellinfo_get_offet, 1 }, { NULL, NULL, 0 } }; void init_pmailextensions() { PyObject *m, *d; m = Py_InitModule("_pmailextensions", pmailextensionMethods); init_pygtk(); if (PyErr_Occurred()) Py_FatalError("can't initialise module _pmailextensions"); }