2 * pygnt- Python bindings for the GNT toolkit.
3 * Copyright (C) 2007 Sadrul Habib Chowdhury <sadrul@pidgin.im>
5 * gnt.override: Some generic wrappers.
6 * Support for specifying custom bindings.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301
26 #include "pygobject.h"
28 #include "gntbindable.h"
29 #include "gntwidget.h"
31 #include "gntbutton.h"
32 #include "gntcheckbox.h"
33 #include "gntcolors.h"
34 #include "gntcombobox.h"
36 #include "gntfilesel.h"
41 #include "gntmenuitem.h"
42 #include "gntmenuitemcheck.h"
43 #include "gntslider.h"
45 #include "gnttextview.h"
48 #include "gntwindow.h"
53 #define gnt_menu_item_new gnt_menuitem_new
54 #define gnt_menu_item_set_submenu gnt_menuitem_set_submenu
55 #define gnt_menu_item_get_submenu gnt_menuitem_get_submenu
56 #define gnt_menu_item_set_trigger gnt_menuitem_set_trigger
57 #define gnt_menu_item_get_trigger gnt_menuitem_get_trigger
58 #define gnt_menu_item_set_id gnt_menuitem_set_id
59 #define gnt_menu_item_get_id gnt_menuitem_get_id
60 #define gnt_menu_item_activate gnt_menuitem_activate
62 #define gnt_menu_item_check_new gnt_menuitem_check_new
63 #define gnt_menu_item_check_get_checked gnt_menuitem_check_get_checked
64 #define gnt_menu_item_check_set_checked gnt_menuitem_check_set_checked
66 /* This will keep track of the callbacks for different bindings for custom
83 import gobject.GObject as PyGObject_Type
90 _wrap_set_flag(PyGObject *self, PyObject *args, PyObject *kwargs)
92 static char *kwlist[] = {"flags", NULL};
96 if (!PyArg_ParseTuple(args, "O!i:gnt.set_flag", &PyGntWidget_Type, &widget,
101 GNT_WIDGET_SET_FLAGS(widget->obj, flags);
109 _wrap_unset_flag(PyGObject *self, PyObject *args, PyObject *kwargs)
111 static char *kwlist[] = {"flags", NULL};
115 if (!PyArg_ParseTuple(args, "O!i:gnt.unset_flag", &PyGntWidget_Type, &widget,
120 GNT_WIDGET_UNSET_FLAGS(widget->obj, flags);
126 define screen_size noargs
128 _wrap_screen_size(PyObject *self)
130 PyObject *list = PyList_New(0);
135 PyList_Append(list, PyInt_FromLong((long)getmaxx(stdscr)));
136 PyList_Append(list, PyInt_FromLong((long)getmaxy(stdscr)));
141 override gnt_register_action
142 static GHashTable *actions;
147 _wrap_gnt_register_action(PyGObject *self, PyObject *args, PyObject *kwargs)
149 static char *kwlist[] = {"name", "callback", NULL};
154 if (!PyArg_ParseTuple(args, "sO:gnt.gnt_register_action", &name, &callback)) {
158 if (!PyCallable_Check(callback)) {
159 PyErr_SetString(PyExc_TypeError, "the callback must be callable ... doh!");
163 gnt_register_action(name, callback->obj);
169 define register_bindings
172 pygnt_binding_callback(GntBindable *bindable, GList *list)
174 PyObject *wrapper = pygobject_new(G_OBJECT(bindable));
176 PyObject_CallMethod(wrapper, list->data, "O", Py_None);
182 _wrap_register_bindings(PyObject *self, PyObject *args)
186 PyObject *key, *value, *gbindings;
187 GntBindableClass *bindable;
189 if (!PyArg_ParseTuple(args, "O!:gnt.register_bindings",
190 &PyType_Type, &class)) {
191 /* Make sure it's a GntBindableClass subclass */
192 PyErr_SetString(PyExc_TypeError,
193 "argument must be a GntBindable subclass");
197 gbindings = PyDict_GetItemString(class->tp_dict, "__gntbindings__");
201 if (!PyDict_Check(gbindings)) {
202 PyErr_SetString(PyExc_TypeError,
203 "__gntbindings__ attribute not a dict!");
207 bindable = g_type_class_ref(pyg_type_from_object((PyObject *)class));
208 while (PyDict_Next(gbindings, &pos, &key, &value)) {
209 const char *trigger, *callback, *name;
213 if (!PyString_Check(key)) {
214 PyErr_SetString(PyExc_TypeError,
215 "__gntbindings__ keys must be strings");
216 g_type_class_unref(bindable);
219 name = PyString_AsString(key);
221 if (!PyTuple_Check(value) ||
222 !PyArg_ParseTuple(value, "ss", &callback, &trigger)) {
223 PyErr_SetString(PyExc_TypeError,
224 "__gntbindings__ values must be (callback, trigger) tupples");
225 g_type_class_unref(bindable);
229 gnt_bindable_class_register_action(bindable, name, pygnt_binding_callback,
230 trigger, g_strdup(callback), NULL);
231 cbname = g_strdup_printf("%s::%s", class->tp_name, name);
232 g_hash_table_replace(bindings, cbname, g_strdup(callback));
233 /* Do not free cbname here. */
236 PyDict_DelItemString(class->tp_dict, "__gntbindings__");
237 g_type_class_unref(bindable);
246 _wrap_show_menu(PyGObject *self, PyObject *args, PyObject *kwargs)
250 if (!PyArg_ParseTuple(args, "O!:gnt.show_menu", &PyGntMenu_Type, &menu)) {
254 gnt_screen_menu_show(GNT_MENU(menu->obj));
262 gnt_util_get_text_bound
264 define get_text_bound
266 _wrap_get_text_bound(PyGObject *self, PyObject *args)
272 if (!PyArg_ParseTuple(args, "s:gnt.get_text_bound", &text)) {
276 gnt_util_get_text_bound(text, &w, &h);
278 list = PyList_New(0);
279 PyList_Append(list, PyInt_FromLong((long)w));
280 PyList_Append(list, PyInt_FromLong((long)h));
284 override gnt_main noargs
286 _wrap_gnt_main(PyObject *self)
288 if (pyg_threads_enabled)
289 pyg_enable_threads();
291 pyg_begin_allow_threads;
293 pyg_end_allow_threads;