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 PyGILState_STATE state;
175 state = pyg_gil_state_ensure();
176 PyObject *wrapper = pygobject_new(G_OBJECT(bindable));
178 PyObject_CallMethod(wrapper, list->data, "O", Py_None);
180 pyg_gil_state_release(state);
185 _wrap_register_bindings(PyObject *self, PyObject *args)
189 PyObject *key, *value, *gbindings;
190 GntBindableClass *bindable;
192 if (!PyArg_ParseTuple(args, "O!:gnt.register_bindings",
193 &PyType_Type, &class)) {
194 /* Make sure it's a GntBindableClass subclass */
195 PyErr_SetString(PyExc_TypeError,
196 "argument must be a GntBindable subclass");
200 gbindings = PyDict_GetItemString(class->tp_dict, "__gntbindings__");
204 if (!PyDict_Check(gbindings)) {
205 PyErr_SetString(PyExc_TypeError,
206 "__gntbindings__ attribute not a dict!");
210 bindable = g_type_class_ref(pyg_type_from_object((PyObject *)class));
211 while (PyDict_Next(gbindings, &pos, &key, &value)) {
212 const char *trigger, *callback, *name;
216 if (!PyString_Check(key)) {
217 PyErr_SetString(PyExc_TypeError,
218 "__gntbindings__ keys must be strings");
219 g_type_class_unref(bindable);
222 name = PyString_AsString(key);
224 if (!PyTuple_Check(value) ||
225 !PyArg_ParseTuple(value, "ss", &callback, &trigger)) {
226 PyErr_SetString(PyExc_TypeError,
227 "__gntbindings__ values must be (callback, trigger) tupples");
228 g_type_class_unref(bindable);
232 gnt_bindable_class_register_action(bindable, name, pygnt_binding_callback,
233 trigger, g_strdup(callback), NULL);
234 cbname = g_strdup_printf("%s::%s", class->tp_name, name);
235 g_hash_table_replace(bindings, cbname, g_strdup(callback));
236 /* Do not free cbname here. */
239 PyDict_DelItemString(class->tp_dict, "__gntbindings__");
240 g_type_class_unref(bindable);
249 _wrap_show_menu(PyGObject *self, PyObject *args, PyObject *kwargs)
253 if (!PyArg_ParseTuple(args, "O!:gnt.show_menu", &PyGntMenu_Type, &menu)) {
257 gnt_screen_menu_show(GNT_MENU(menu->obj));
265 gnt_util_get_text_bound
267 define get_text_bound
269 _wrap_get_text_bound(PyGObject *self, PyObject *args)
275 if (!PyArg_ParseTuple(args, "s:gnt.get_text_bound", &text)) {
279 gnt_util_get_text_bound(text, &w, &h);
281 list = PyList_New(0);
282 PyList_Append(list, PyInt_FromLong((long)w));
283 PyList_Append(list, PyInt_FromLong((long)h));
287 override gnt_main noargs
289 _wrap_gnt_main(PyObject *self)
291 if (pyg_threads_enabled)
292 pyg_enable_threads();
294 pyg_begin_allow_threads;
296 pyg_end_allow_threads;