From 17e291fd05d66fe232e2f409d54331c495b2fbd0 Mon Sep 17 00:00:00 2001 From: Perberos Date: Thu, 1 Dec 2011 22:29:22 -0300 Subject: moving from https://github.com/perberos/mate-desktop-environment --- python/Makefile.am | 20 + python/matemenu.c | 1948 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1968 insertions(+) create mode 100644 python/Makefile.am create mode 100644 python/matemenu.c (limited to 'python') diff --git a/python/Makefile.am b/python/Makefile.am new file mode 100644 index 0000000..0f55476 --- /dev/null +++ b/python/Makefile.am @@ -0,0 +1,20 @@ +AM_CPPFLAGS = \ + $(GLIB_CFLAGS) \ + $(PYTHON_INCLUDES) \ + -I$(srcdir)/../libmenu \ + -DMATEMENU_I_KNOW_THIS_IS_UNSTABLE \ + $(DISABLE_DEPRECATED_CFLAGS) \ + $(DEBUG_CFLAGS) + +AM_CFLAGS = \ + $(WARN_CFLAGS) \ + $(NO_STRICT_ALIASING_CFLAGS) + +matemenudir = $(pyexecdir) +matemenu_LTLIBRARIES = matemenu.la + +matemenu_la_SOURCES = matemenu.c +matemenu_la_LDFLAGS = -module -avoid-version -fPIC -export-symbols-regex initmatemenu +matemenu_la_LIBADD = $(GLIB_LIBS) $(PYTHON_LIBS) $(top_builddir)/libmenu/libmate-menu.la + +-include $(top_srcdir)/git.mk diff --git a/python/matemenu.c b/python/matemenu.c new file mode 100644 index 0000000..596c106 --- /dev/null +++ b/python/matemenu.c @@ -0,0 +1,1948 @@ +/* + * Copyright (C) 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include + +typedef struct { + PyObject_HEAD + MateMenuTree* tree; + GSList* callbacks; +} PyMateMenuTree; + +typedef struct { + PyObject* tree; + PyObject* callback; + PyObject* user_data; +} PyMateMenuTreeCallback; + +typedef struct { + PyObject_HEAD + MateMenuTreeItem* item; +} PyMateMenuTreeItem; + +typedef PyMateMenuTreeItem PyMateMenuTreeDirectory; +typedef PyMateMenuTreeItem PyMateMenuTreeEntry; +typedef PyMateMenuTreeItem PyMateMenuTreeSeparator; +typedef PyMateMenuTreeItem PyMateMenuTreeHeader; +typedef PyMateMenuTreeItem PyMateMenuTreeAlias; + +static PyMateMenuTree* pymatemenu_tree_wrap(MateMenuTree* tree); +static PyMateMenuTreeDirectory* pymatemenu_tree_directory_wrap(MateMenuTreeDirectory* directory); +static PyMateMenuTreeEntry* pymatemenu_tree_entry_wrap(MateMenuTreeEntry* entry); +static PyMateMenuTreeSeparator* pymatemenu_tree_separator_wrap(MateMenuTreeSeparator* separator); +static PyMateMenuTreeHeader* pymatemenu_tree_header_wrap(MateMenuTreeHeader* header); +static PyMateMenuTreeAlias* pymatemenu_tree_alias_wrap(MateMenuTreeAlias* alias); + +static inline PyObject* lookup_item_type_str(const char* item_type_str) +{ + PyObject* module; + + module = PyDict_GetItemString(PyImport_GetModuleDict(), "matemenu"); + + return PyDict_GetItemString(PyModule_GetDict(module), item_type_str); +} + +static void pymatemenu_tree_item_dealloc(PyMateMenuTreeItem* self) +{ + if (self->item != NULL) + { + matemenu_tree_item_set_user_data(self->item, NULL, NULL); + matemenu_tree_item_unref(self->item); + self->item = NULL; + } + + PyObject_DEL (self); +} + +static PyObject* pymatemenu_tree_item_get_type(PyObject* self, PyObject* args) +{ + PyMateMenuTreeItem* item; + PyObject* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Item.get_type")) + { + return NULL; + } + } + + item = (PyMateMenuTreeItem*) self; + + switch (matemenu_tree_item_get_type(item->item)) + { + case MATEMENU_TREE_ITEM_DIRECTORY: + retval = lookup_item_type_str("TYPE_DIRECTORY"); + break; + + case MATEMENU_TREE_ITEM_ENTRY: + retval = lookup_item_type_str("TYPE_ENTRY"); + break; + + case MATEMENU_TREE_ITEM_SEPARATOR: + retval = lookup_item_type_str("TYPE_SEPARATOR"); + break; + + case MATEMENU_TREE_ITEM_HEADER: + retval = lookup_item_type_str("TYPE_HEADER"); + break; + + case MATEMENU_TREE_ITEM_ALIAS: + retval = lookup_item_type_str("TYPE_ALIAS"); + break; + + default: + g_assert_not_reached(); + break; + } + + Py_INCREF(retval); + + return retval; +} + +static PyObject* pymatemenu_tree_item_get_parent(PyObject* self, PyObject* args) +{ + PyMateMenuTreeItem* item; + MateMenuTreeDirectory* parent; + PyMateMenuTreeDirectory* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Item.get_parent")) + { + return NULL; + } + } + + item = (PyMateMenuTreeItem*) self; + + parent = matemenu_tree_item_get_parent(item->item); + + if (parent == NULL) + { + Py_INCREF(Py_None); + + return Py_None; + } + + retval = pymatemenu_tree_directory_wrap(parent); + + matemenu_tree_item_unref(parent); + + return (PyObject*) retval; +} + +static struct PyMethodDef pymatemenu_tree_item_methods[] = { + {"get_type", pymatemenu_tree_item_get_type, METH_VARARGS}, + {"get_parent", pymatemenu_tree_item_get_parent, METH_VARARGS}, + {NULL, NULL, 0} +}; + +static PyTypeObject PyMateMenuTreeItem_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Item", /* tp_name */ + sizeof(PyMateMenuTreeItem), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_item_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) 0, /* tp_getattro */ + (setattrofunc) 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + pymatemenu_tree_item_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyObject* pymatemenu_tree_directory_get_contents(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + PyObject* retval; + GSList* contents; + GSList* tmp; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Directory.get_contents")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + retval = PyList_New(0); + + contents = matemenu_tree_directory_get_contents(MATEMENU_TREE_DIRECTORY(directory->item)); + + tmp = contents; + + while (tmp != NULL) + { + MateMenuTreeItem* item = tmp->data; + PyObject* pyitem; + + switch (matemenu_tree_item_get_type(item)) + { + case MATEMENU_TREE_ITEM_DIRECTORY: + pyitem = (PyObject*) pymatemenu_tree_directory_wrap(MATEMENU_TREE_DIRECTORY(item)); + break; + + case MATEMENU_TREE_ITEM_ENTRY: + pyitem = (PyObject*) pymatemenu_tree_entry_wrap(MATEMENU_TREE_ENTRY(item)); + break; + + case MATEMENU_TREE_ITEM_SEPARATOR: + pyitem = (PyObject*) pymatemenu_tree_separator_wrap(MATEMENU_TREE_SEPARATOR(item)); + break; + + case MATEMENU_TREE_ITEM_HEADER: + pyitem = (PyObject*) pymatemenu_tree_header_wrap(MATEMENU_TREE_HEADER(item)); + break; + + case MATEMENU_TREE_ITEM_ALIAS: + pyitem = (PyObject*) pymatemenu_tree_alias_wrap(MATEMENU_TREE_ALIAS(item)); + break; + + default: + g_assert_not_reached(); + break; + } + + PyList_Append(retval, pyitem); + Py_DECREF(pyitem); + + matemenu_tree_item_unref(item); + + tmp = tmp->next; + } + + g_slist_free(contents); + + return retval; +} + +static PyObject* pymatemenu_tree_directory_get_name(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + const char* name; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Directory.get_name")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + name = matemenu_tree_directory_get_name(MATEMENU_TREE_DIRECTORY(directory->item)); + + if (name == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(name); +} + +static PyObject* pymatemenu_tree_directory_get_comment(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + const char* comment; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Directory.get_comment")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + comment = matemenu_tree_directory_get_comment(MATEMENU_TREE_DIRECTORY(directory->item)); + + if (comment == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(comment); +} + +static PyObject* pymatemenu_tree_directory_get_icon(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + const char* icon; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Directory.get_icon")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + icon = matemenu_tree_directory_get_icon(MATEMENU_TREE_DIRECTORY(directory->item)); + + if (icon == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(icon); +} + +static PyObject* pymatemenu_tree_directory_get_desktop_file_path(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + const char* path; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Directory.get_desktop_file_path")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + path = matemenu_tree_directory_get_desktop_file_path(MATEMENU_TREE_DIRECTORY(directory->item)); + + if (path == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(path); +} + +static PyObject* pymatemenu_tree_directory_get_menu_id(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + const char* menu_id; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Directory.get_menu_id")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + menu_id = matemenu_tree_directory_get_menu_id(MATEMENU_TREE_DIRECTORY(directory->item)); + + if (menu_id == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(menu_id); +} + +static PyObject* pymatemenu_tree_directory_get_tree(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + MateMenuTree* tree; + PyMateMenuTree* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Item.get_tree")) + { + return NULL; + } + } + + directory = (PyMateMenuTreeDirectory*) self; + + tree = matemenu_tree_directory_get_tree(MATEMENU_TREE_DIRECTORY(directory->item)); + + if (tree == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = pymatemenu_tree_wrap(tree); + + matemenu_tree_unref(tree); + + return (PyObject*) retval; +} + +static PyObject* pymatemenu_tree_directory_make_path(PyObject* self, PyObject* args) +{ + PyMateMenuTreeDirectory* directory; + PyMateMenuTreeEntry* entry; + PyObject* retval; + char* path; + + if (!PyArg_ParseTuple(args, "O:matemenu.Directory.make_path", &entry)) + { + return NULL; + } + + directory = (PyMateMenuTreeDirectory*) self; + + path = matemenu_tree_directory_make_path(MATEMENU_TREE_DIRECTORY(directory->item), MATEMENU_TREE_ENTRY(entry->item)); + + if (path == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = PyString_FromString(path); + + g_free(path); + + return retval; +} + +static PyObject* pymatemenu_tree_directory_getattro(PyMateMenuTreeDirectory* self, PyObject* py_attr) +{ + if (PyString_Check(py_attr)) + { + char* attr; + + attr = PyString_AsString(py_attr); + + if (!strcmp(attr, "__members__")) + { + return Py_BuildValue("[sssssssss]", + "type", + "parent", + "contents", + "name", + "comment", + "icon", + "desktop_file_path", + "menu_id", + "tree"); + } + else if (!strcmp(attr, "type")) + { + return pymatemenu_tree_item_get_type((PyObject*) self, NULL); + } + else if (!strcmp(attr, "parent")) + { + return pymatemenu_tree_item_get_parent((PyObject*) self, NULL); + } + else if (!strcmp(attr, "contents")) + { + return pymatemenu_tree_directory_get_contents((PyObject*) self, NULL); + } + else if (!strcmp(attr, "name")) + { + return pymatemenu_tree_directory_get_name((PyObject*) self, NULL); + } + else if (!strcmp(attr, "comment")) + { + return pymatemenu_tree_directory_get_comment((PyObject*) self, NULL); + } + else if (!strcmp(attr, "icon")) + { + return pymatemenu_tree_directory_get_icon((PyObject*) self, NULL); + } + else if (!strcmp(attr, "desktop_file_path")) + { + return pymatemenu_tree_directory_get_desktop_file_path((PyObject*) self, NULL); + } + else if (!strcmp(attr, "menu_id")) + { + return pymatemenu_tree_directory_get_menu_id((PyObject*) self, NULL); + } + else if (!strcmp(attr, "tree")) + { + return pymatemenu_tree_directory_get_tree((PyObject*) self, NULL); + } + } + + return PyObject_GenericGetAttr((PyObject*) self, py_attr); +} + +static struct PyMethodDef pymatemenu_tree_directory_methods[] = { + {"get_contents", pymatemenu_tree_directory_get_contents, METH_VARARGS}, + {"get_name", pymatemenu_tree_directory_get_name, METH_VARARGS}, + {"get_comment", pymatemenu_tree_directory_get_comment, METH_VARARGS}, + {"get_icon", pymatemenu_tree_directory_get_icon, METH_VARARGS}, + {"get_desktop_file_path", pymatemenu_tree_directory_get_desktop_file_path, METH_VARARGS}, + {"get_menu_id", pymatemenu_tree_directory_get_menu_id, METH_VARARGS}, + {"get_tree", pymatemenu_tree_directory_get_tree, METH_VARARGS}, + {"make_path", pymatemenu_tree_directory_make_path, METH_VARARGS}, + {NULL, NULL, 0} +}; + +static PyTypeObject PyMateMenuTreeDirectory_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Directory", /* tp_name */ + sizeof(PyMateMenuTreeDirectory), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_item_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) pymatemenu_tree_directory_getattro, /* tp_getattro */ + (setattrofunc) 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + pymatemenu_tree_directory_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyMateMenuTreeDirectory* pymatemenu_tree_directory_wrap(MateMenuTreeDirectory* directory) +{ + PyMateMenuTreeDirectory* retval; + + if ((retval = matemenu_tree_item_get_user_data(MATEMENU_TREE_ITEM(directory))) != NULL) + { + Py_INCREF(retval); + return retval; + } + + if (!(retval = (PyMateMenuTreeDirectory*) PyObject_NEW(PyMateMenuTreeDirectory, &PyMateMenuTreeDirectory_Type))) + { + return NULL; + } + + retval->item = matemenu_tree_item_ref(directory); + + matemenu_tree_item_set_user_data(MATEMENU_TREE_ITEM(directory), retval, NULL); + + return retval; +} + +static PyObject* pymatemenu_tree_entry_get_name(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* name; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_name")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + name = matemenu_tree_entry_get_name(MATEMENU_TREE_ENTRY(entry->item)); + + if (name == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(name); +} + +static PyObject* pymatemenu_tree_entry_get_generic_name(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* generic_name; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_generic_name")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + generic_name = matemenu_tree_entry_get_generic_name(MATEMENU_TREE_ENTRY(entry->item)); + + if (generic_name == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(generic_name); +} + +static PyObject* pymatemenu_tree_entry_get_display_name(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* display_name; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_display_name")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + display_name = matemenu_tree_entry_get_display_name(MATEMENU_TREE_ENTRY(entry->item)); + + if (display_name == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(display_name); +} + +static PyObject* pymatemenu_tree_entry_get_comment(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* comment; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_comment")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + comment = matemenu_tree_entry_get_comment(MATEMENU_TREE_ENTRY(entry->item)); + + if (comment == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(comment); +} + +static PyObject* pymatemenu_tree_entry_get_icon(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* icon; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_icon")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + icon = matemenu_tree_entry_get_icon(MATEMENU_TREE_ENTRY(entry->item)); + + if (icon == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(icon); +} + +static PyObject* pymatemenu_tree_entry_get_exec(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* exec; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_exec")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + exec = matemenu_tree_entry_get_exec(MATEMENU_TREE_ENTRY(entry->item)); + + if (exec == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(exec); +} + +static PyObject* pymatemenu_tree_entry_get_launch_in_terminal(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + PyObject* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_launch_in_terminal")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + if (matemenu_tree_entry_get_launch_in_terminal(MATEMENU_TREE_ENTRY(entry->item))) + { + retval = Py_True; + } + else + { + retval = Py_False; + } + + Py_INCREF(retval); + + return retval; +} + +static PyObject* pymatemenu_tree_entry_get_desktop_file_path(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* desktop_file_path; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_desktop_file_path")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + desktop_file_path = matemenu_tree_entry_get_desktop_file_path(MATEMENU_TREE_ENTRY(entry->item)); + + if (desktop_file_path == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(desktop_file_path); +} + +static PyObject* pymatemenu_tree_entry_get_desktop_file_id(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + const char* desktop_file_id; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_desktop_file_id")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + desktop_file_id = matemenu_tree_entry_get_desktop_file_id(MATEMENU_TREE_ENTRY(entry->item)); + + if (desktop_file_id == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(desktop_file_id); +} + +static PyObject* pymatemenu_tree_entry_get_is_excluded(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + PyObject* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_is_excluded")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + retval = matemenu_tree_entry_get_is_excluded(MATEMENU_TREE_ENTRY(entry->item)) ? Py_True : Py_False; + Py_INCREF(retval); + + return retval; +} + +static PyObject* pymatemenu_tree_entry_get_is_nodisplay(PyObject* self, PyObject* args) +{ + PyMateMenuTreeEntry* entry; + PyObject* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Entry.get_is_nodisplay")) + { + return NULL; + } + } + + entry = (PyMateMenuTreeEntry*) self; + + if (matemenu_tree_entry_get_is_nodisplay(MATEMENU_TREE_ENTRY(entry->item))) + { + retval = Py_True; + } + else + { + retval = Py_False; + } + + Py_INCREF(retval); + + return retval; +} + +static PyObject* pymatemenu_tree_entry_getattro(PyMateMenuTreeEntry* self, PyObject* py_attr) +{ + if (PyString_Check(py_attr)) + { + char* attr; + + attr = PyString_AsString(py_attr); + + if (!strcmp(attr, "__members__")) + { + return Py_BuildValue("[sssssssssss]", + "type", + "parent", + "name", + "comment", + "icon", + "exec_info", + "launch_in_terminal", + "desktop_file_path", + "desktop_file_id", + "is_excluded", + "is_nodisplay"); + } + else if (!strcmp(attr, "type")) + { + return pymatemenu_tree_item_get_type((PyObject*) self, NULL); + } + else if (!strcmp(attr, "parent")) + { + return pymatemenu_tree_item_get_parent((PyObject*) self, NULL); + } + else if (!strcmp(attr, "name")) + { + return pymatemenu_tree_entry_get_name((PyObject*) self, NULL); + } + else if (!strcmp(attr, "generic_name")) + { + return pymatemenu_tree_entry_get_generic_name((PyObject*) self, NULL); + } + else if (!strcmp(attr, "display_name")) + { + return pymatemenu_tree_entry_get_display_name((PyObject*) self, NULL); + } + else if (!strcmp(attr, "comment")) + { + return pymatemenu_tree_entry_get_comment((PyObject*) self, NULL); + } + else if (!strcmp(attr, "icon")) + { + return pymatemenu_tree_entry_get_icon((PyObject*) self, NULL); + } + else if (!strcmp(attr, "exec_info")) + { + return pymatemenu_tree_entry_get_exec((PyObject*) self, NULL); + } + else if (!strcmp(attr, "launch_in_terminal")) + { + return pymatemenu_tree_entry_get_launch_in_terminal((PyObject*) self, NULL); + } + else if (!strcmp(attr, "desktop_file_path")) + { + return pymatemenu_tree_entry_get_desktop_file_path((PyObject*) self, NULL); + } + else if (!strcmp(attr, "desktop_file_id")) + { + return pymatemenu_tree_entry_get_desktop_file_id((PyObject*) self, NULL); + } + else if (!strcmp(attr, "is_excluded")) + { + return pymatemenu_tree_entry_get_is_excluded((PyObject*) self, NULL); + } + else if (!strcmp(attr, "is_nodisplay")) + { + return pymatemenu_tree_entry_get_is_nodisplay((PyObject*) self, NULL); + } + } + + return PyObject_GenericGetAttr((PyObject*) self, py_attr); +} + +static struct PyMethodDef pymatemenu_tree_entry_methods[] = { + {"get_name", pymatemenu_tree_entry_get_name, METH_VARARGS}, + {"get_generic_name", pymatemenu_tree_entry_get_generic_name, METH_VARARGS}, + {"get_display_name", pymatemenu_tree_entry_get_display_name, METH_VARARGS}, + {"get_comment", pymatemenu_tree_entry_get_comment, METH_VARARGS}, + {"get_icon", pymatemenu_tree_entry_get_icon, METH_VARARGS}, + {"get_exec", pymatemenu_tree_entry_get_exec, METH_VARARGS}, + {"get_launch_in_terminal", pymatemenu_tree_entry_get_launch_in_terminal, METH_VARARGS}, + {"get_desktop_file_path", pymatemenu_tree_entry_get_desktop_file_path, METH_VARARGS}, + {"get_desktop_file_id", pymatemenu_tree_entry_get_desktop_file_id, METH_VARARGS}, + {"get_is_excluded", pymatemenu_tree_entry_get_is_excluded, METH_VARARGS}, + {"get_is_nodisplay", pymatemenu_tree_entry_get_is_nodisplay, METH_VARARGS}, + {NULL, NULL, 0} +}; + +static PyTypeObject PyMateMenuTreeEntry_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Entry", /* tp_name */ + sizeof(PyMateMenuTreeEntry), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_item_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) pymatemenu_tree_entry_getattro, /* tp_getattro */ + (setattrofunc) 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + pymatemenu_tree_entry_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyMateMenuTreeEntry* pymatemenu_tree_entry_wrap(MateMenuTreeEntry* entry) +{ + PyMateMenuTreeEntry* retval; + + if ((retval = matemenu_tree_item_get_user_data(MATEMENU_TREE_ITEM(entry))) != NULL) + { + Py_INCREF(retval); + return retval; + } + + if (!(retval = (PyMateMenuTreeEntry*) PyObject_NEW(PyMateMenuTreeEntry, &PyMateMenuTreeEntry_Type))) + { + return NULL; + } + + retval->item = matemenu_tree_item_ref(entry); + + matemenu_tree_item_set_user_data(MATEMENU_TREE_ITEM(entry), retval, NULL); + + return retval; +} + +static PyTypeObject PyMateMenuTreeSeparator_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Separator", /* tp_name */ + sizeof(PyMateMenuTreeSeparator), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_item_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) 0, /* tp_getattro */ + (setattrofunc) 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + NULL, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyMateMenuTreeSeparator* pymatemenu_tree_separator_wrap(MateMenuTreeSeparator* separator) +{ + PyMateMenuTreeSeparator* retval; + + if ((retval = matemenu_tree_item_get_user_data(MATEMENU_TREE_ITEM(separator))) != NULL) + { + Py_INCREF(retval); + return retval; + } + + if (!(retval = (PyMateMenuTreeSeparator*) PyObject_NEW(PyMateMenuTreeSeparator, &PyMateMenuTreeSeparator_Type))) + { + return NULL; + } + + retval->item = matemenu_tree_item_ref(separator); + + matemenu_tree_item_set_user_data(MATEMENU_TREE_ITEM(separator), retval, NULL); + + return retval; +} + +static PyObject* pymatemenu_tree_header_get_directory(PyObject* self, PyObject* args) +{ + PyMateMenuTreeHeader* header; + MateMenuTreeDirectory* directory; + PyMateMenuTreeDirectory* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Header.get_directory")) + { + return NULL; + } + } + + header = (PyMateMenuTreeHeader*) self; + + directory = matemenu_tree_header_get_directory(MATEMENU_TREE_HEADER(header->item)); + + if (directory == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = pymatemenu_tree_directory_wrap(directory); + + matemenu_tree_item_unref(directory); + + return (PyObject*) retval; +} + +static PyObject* pymatemenu_tree_header_getattro(PyMateMenuTreeHeader* self, PyObject* py_attr) +{ + if (PyString_Check(py_attr)) + { + char* attr; + + attr = PyString_AsString(py_attr); + + if (!strcmp(attr, "__members__")) + { + return Py_BuildValue("[sss]", + "type", + "parent", + "directory"); + } + else if (!strcmp(attr, "type")) + { + return pymatemenu_tree_item_get_type((PyObject*) self, NULL); + } + else if (!strcmp(attr, "parent")) + { + return pymatemenu_tree_item_get_parent((PyObject*) self, NULL); + } + else if (!strcmp(attr, "directory")) + { + return pymatemenu_tree_header_get_directory((PyObject*) self, NULL); + } + } + + return PyObject_GenericGetAttr((PyObject*) self, py_attr); +} + +static struct PyMethodDef pymatemenu_tree_header_methods[] = { + {"get_directory", pymatemenu_tree_header_get_directory, METH_VARARGS}, + {NULL, NULL, 0} +}; + +static PyTypeObject PyMateMenuTreeHeader_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Header", /* tp_name */ + sizeof(PyMateMenuTreeHeader), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_item_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) pymatemenu_tree_header_getattro, /* tp_getattro */ + (setattrofunc) 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + pymatemenu_tree_header_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyMateMenuTreeHeader* pymatemenu_tree_header_wrap(MateMenuTreeHeader* header) +{ + PyMateMenuTreeHeader* retval; + + if ((retval = matemenu_tree_item_get_user_data(MATEMENU_TREE_ITEM(header))) != NULL) + { + Py_INCREF(retval); + return retval; + } + + if (!(retval = (PyMateMenuTreeHeader*) PyObject_NEW(PyMateMenuTreeHeader, &PyMateMenuTreeHeader_Type))) + { + return NULL; + } + + retval->item = matemenu_tree_item_ref(header); + + matemenu_tree_item_set_user_data(MATEMENU_TREE_ITEM(header), retval, NULL); + + return retval; +} + +static PyObject* pymatemenu_tree_alias_get_directory(PyObject*self, PyObject* args) +{ + PyMateMenuTreeAlias* alias; + MateMenuTreeDirectory* directory; + PyMateMenuTreeDirectory* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Alias.get_directory")) + { + return NULL; + } + } + + alias = (PyMateMenuTreeAlias*) self; + + directory = matemenu_tree_alias_get_directory(MATEMENU_TREE_ALIAS(alias->item)); + + if (directory == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = pymatemenu_tree_directory_wrap(directory); + + matemenu_tree_item_unref(directory); + + return (PyObject*) retval; +} + +static PyObject* pymatemenu_tree_alias_get_item(PyObject* self, PyObject* args) +{ + PyMateMenuTreeAlias* alias; + MateMenuTreeItem* item; + PyObject* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Alias.get_item")) + { + return NULL; + } + } + + alias = (PyMateMenuTreeAlias*) self; + + item = matemenu_tree_alias_get_item(MATEMENU_TREE_ALIAS(alias->item)); + + if (item == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + switch (matemenu_tree_item_get_type(item)) + { + case MATEMENU_TREE_ITEM_DIRECTORY: + retval = (PyObject*) pymatemenu_tree_directory_wrap(MATEMENU_TREE_DIRECTORY(item)); + break; + + case MATEMENU_TREE_ITEM_ENTRY: + retval = (PyObject*) pymatemenu_tree_entry_wrap(MATEMENU_TREE_ENTRY(item)); + break; + + default: + g_assert_not_reached(); + break; + } + + matemenu_tree_item_unref(item); + + return retval; +} + +static PyObject* pymatemenu_tree_alias_getattro(PyMateMenuTreeAlias* self, PyObject* py_attr) +{ + if (PyString_Check(py_attr)) + { + char* attr; + + attr = PyString_AsString(py_attr); + + if (!strcmp(attr, "__members__")) + { + return Py_BuildValue("[ssss]", + "type", + "parent", + "directory", + "item"); + } + else if (!strcmp(attr, "type")) + { + return pymatemenu_tree_item_get_type((PyObject*) self, NULL); + } + else if (!strcmp(attr, "parent")) + { + return pymatemenu_tree_item_get_parent((PyObject*) self, NULL); + } + else if (!strcmp(attr, "directory")) + { + return pymatemenu_tree_alias_get_directory((PyObject*) self, NULL); + } + else if (!strcmp(attr, "item")) + { + return pymatemenu_tree_alias_get_item((PyObject*) self, NULL); + } + } + + return PyObject_GenericGetAttr((PyObject*) self, py_attr); +} + +static struct PyMethodDef pymatemenu_tree_alias_methods[] = { + {"get_directory", pymatemenu_tree_alias_get_directory, METH_VARARGS}, + {"get_item", pymatemenu_tree_alias_get_item, METH_VARARGS}, + {NULL, NULL, 0} +}; + +static PyTypeObject PyMateMenuTreeAlias_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Alias", /* tp_name */ + sizeof(PyMateMenuTreeAlias), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_item_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) pymatemenu_tree_alias_getattro, /* tp_getattro */ + (setattrofunc) 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + pymatemenu_tree_alias_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyMateMenuTreeAlias* pymatemenu_tree_alias_wrap(MateMenuTreeAlias* alias) +{ + PyMateMenuTreeAlias* retval; + + if ((retval = matemenu_tree_item_get_user_data(MATEMENU_TREE_ITEM(alias))) != NULL) + { + Py_INCREF(retval); + return retval; + } + + if (!(retval = (PyMateMenuTreeAlias*) PyObject_NEW(PyMateMenuTreeAlias, &PyMateMenuTreeAlias_Type))) + { + return NULL; + } + + retval->item = matemenu_tree_item_ref(alias); + + matemenu_tree_item_set_user_data(MATEMENU_TREE_ITEM(alias), retval, NULL); + + return retval; +} + +static PyObject* pymatemenu_tree_get_menu_file(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + const char* menu_file; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Tree.get_menu_file")) + { + return NULL; + } + } + + tree = (PyMateMenuTree*) self; + + menu_file = matemenu_tree_get_menu_file(tree->tree); + + if (menu_file == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + return PyString_FromString(menu_file); +} + +static PyObject* pymatemenu_tree_get_root_directory(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + MateMenuTreeDirectory* directory; + PyMateMenuTreeDirectory* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Tree.get_root_directory")) + { + return NULL; + } + } + + tree = (PyMateMenuTree*) self; + + directory = matemenu_tree_get_root_directory(tree->tree); + + if (directory == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = pymatemenu_tree_directory_wrap (directory); + + matemenu_tree_item_unref(directory); + + return (PyObject*) retval; +} + +static PyObject* pymatemenu_tree_get_directory_from_path(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + MateMenuTreeDirectory* directory; + PyMateMenuTreeDirectory* retval; + char* path; + + if (!PyArg_ParseTuple(args, "s:matemenu.Tree.get_directory_from_path", &path)) + { + return NULL; + } + + tree = (PyMateMenuTree*) self; + + directory = matemenu_tree_get_directory_from_path(tree->tree, path); + + if (directory == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = pymatemenu_tree_directory_wrap(directory); + + matemenu_tree_item_unref(directory); + + return (PyObject*) retval; +} + +static PyObject* pymatemenu_tree_get_sort_key(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + PyObject* retval; + + if (args != NULL) + { + if (!PyArg_ParseTuple(args, ":matemenu.Tree.get_sort_key")) + { + return NULL; + } + } + + tree = (PyMateMenuTree*) self; + + switch (matemenu_tree_get_sort_key(tree->tree)) + { + case MATEMENU_TREE_SORT_NAME: + retval = lookup_item_type_str("SORT_NAME"); + break; + + case MATEMENU_TREE_SORT_DISPLAY_NAME: + retval = lookup_item_type_str("SORT_DISPLAY_NAME"); + break; + + default: + g_assert_not_reached(); + break; + } + + return (PyObject*) retval; +} + +static PyObject* pymatemenu_tree_set_sort_key(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + int sort_key; + + if (!PyArg_ParseTuple(args, "i:matemenu.Tree.set_sort_key", &sort_key)) + { + return NULL; + } + + tree = (PyMateMenuTree*) self; + + matemenu_tree_set_sort_key(tree->tree, sort_key); + + return Py_None; +} + +static PyMateMenuTreeCallback* pymatemenu_tree_callback_new(PyObject* tree, PyObject* callback, PyObject* user_data) +{ + PyMateMenuTreeCallback* retval; + + retval = g_new0(PyMateMenuTreeCallback, 1); + + Py_INCREF(tree); + retval->tree = tree; + + Py_INCREF(callback); + retval->callback = callback; + + Py_XINCREF(user_data); + retval->user_data = user_data; + + return retval; +} + +static void pymatemenu_tree_callback_free(PyMateMenuTreeCallback* callback) +{ + Py_XDECREF(callback->user_data); + callback->user_data = NULL; + + Py_DECREF(callback->callback); + callback->callback = NULL; + + Py_DECREF(callback->tree); + callback->tree = NULL; + + g_free(callback); +} + +static void pymatemenu_tree_handle_monitor_callback(MateMenuTree* tree, PyMateMenuTreeCallback* callback) +{ + PyObject* args; + PyObject* ret; + PyGILState_STATE gstate; + + gstate = PyGILState_Ensure(); + + args = PyTuple_New(callback->user_data ? 2 : 1); + + Py_INCREF(callback->tree); + PyTuple_SET_ITEM(args, 0, callback->tree); + + if (callback->user_data != NULL) + { + Py_INCREF(callback->user_data); + PyTuple_SET_ITEM(args, 1, callback->user_data); + } + + ret = PyObject_CallObject(callback->callback, args); + + Py_XDECREF(ret); + Py_DECREF(args); + + PyGILState_Release(gstate); +} + +static PyObject* pymatemenu_tree_add_monitor(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + PyMateMenuTreeCallback* callback; + PyObject* pycallback; + PyObject* pyuser_data = NULL; + + if (!PyArg_ParseTuple(args, "O|O:matemenu.Tree.add_monitor", &pycallback, &pyuser_data)) + { + return NULL; + } + + if (!PyCallable_Check(pycallback)) + { + PyErr_SetString(PyExc_TypeError, "callback must be callable"); + return NULL; + } + + tree = (PyMateMenuTree*) self; + + callback = pymatemenu_tree_callback_new(self, pycallback, pyuser_data); + + tree->callbacks = g_slist_append(tree->callbacks, callback); + + { + MateMenuTreeDirectory* dir = matemenu_tree_get_root_directory(tree->tree); + if (dir) + { + matemenu_tree_item_unref(dir); + } + } + + matemenu_tree_add_monitor(tree->tree, (MateMenuTreeChangedFunc) pymatemenu_tree_handle_monitor_callback, callback); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* pymatemenu_tree_remove_monitor(PyObject* self, PyObject* args) +{ + PyMateMenuTree* tree; + PyObject* pycallback; + PyObject* pyuser_data; + GSList* tmp; + + if (!PyArg_ParseTuple(args, "O|O:matemenu.Tree.remove_monitor", &pycallback, &pyuser_data)) + { + return NULL; + } + + tree = (PyMateMenuTree*) self; + + tmp = tree->callbacks; + + while (tmp != NULL) + { + PyMateMenuTreeCallback* callback = tmp->data; + GSList* next = tmp->next; + + if (callback->callback == pycallback && callback->user_data == pyuser_data) + { + tree->callbacks = g_slist_delete_link(tree->callbacks, tmp); + pymatemenu_tree_callback_free(callback); + } + + tmp = next; + } + + Py_INCREF(Py_None); + + return Py_None; +} + +static void pymatemenu_tree_dealloc(PyMateMenuTree* self) +{ + g_slist_foreach(self->callbacks, (GFunc) pymatemenu_tree_callback_free, NULL); + g_slist_free(self->callbacks); + self->callbacks = NULL; + + if (self->tree != NULL) + { + matemenu_tree_unref(self->tree); + } + + self->tree = NULL; + + PyObject_DEL(self); +} + +static PyObject* pymatemenu_tree_getattro(PyMateMenuTree* self, PyObject* py_attr) +{ + if (PyString_Check(py_attr)) + { + char* attr; + + attr = PyString_AsString(py_attr); + + if (!strcmp(attr, "__members__")) + { + return Py_BuildValue("[sss]", "root", "menu_file", "sort_key"); + } + else if (!strcmp(attr, "root")) + { + return pymatemenu_tree_get_root_directory((PyObject*) self, NULL); + } + else if (!strcmp(attr, "menu_file")) + { + return pymatemenu_tree_get_menu_file((PyObject*) self, NULL); + } + else if (!strcmp(attr, "sort_key")) + { + return pymatemenu_tree_get_sort_key((PyObject*) self, NULL); + } + } + + return PyObject_GenericGetAttr((PyObject*) self, py_attr); +} + +static int pymatemenu_tree_setattro(PyMateMenuTree* self, PyObject* py_attr, PyObject* py_value) +{ + PyMateMenuTree* tree; + + tree = (PyMateMenuTree*) self; + + if (PyString_Check(py_attr)) + { + char* attr; + + attr = PyString_AsString(py_attr); + + if (!strcmp(attr, "sort_key")) + { + if (PyInt_Check(py_value)) + { + int sort_key; + + sort_key = PyInt_AsLong(py_value); + + if (sort_key < MATEMENU_TREE_SORT_FIRST || sort_key > MATEMENU_TREE_SORT_LAST) + { + return -1; + } + + matemenu_tree_set_sort_key(tree->tree, sort_key); + + return 0; + } + } + } + + return -1; +} + +static struct PyMethodDef pymatemenu_tree_methods[] = { + {"get_menu_file", pymatemenu_tree_get_menu_file, METH_VARARGS}, + {"get_root_directory", pymatemenu_tree_get_root_directory, METH_VARARGS}, + {"get_directory_from_path", pymatemenu_tree_get_directory_from_path, METH_VARARGS}, + {"get_sort_key", pymatemenu_tree_get_sort_key, METH_VARARGS}, + {"set_sort_key", pymatemenu_tree_set_sort_key, METH_VARARGS}, + {"add_monitor", pymatemenu_tree_add_monitor, METH_VARARGS}, + {"remove_monitor", pymatemenu_tree_remove_monitor, METH_VARARGS}, + {NULL, NULL, 0} +}; + +static PyTypeObject PyMateMenuTree_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "matemenu.Tree", /* tp_name */ + sizeof(PyMateMenuTree), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pymatemenu_tree_dealloc, /* tp_dealloc */ + (printfunc) 0, /* tp_print */ + (getattrfunc) 0, /* tp_getattr */ + (setattrfunc) 0, /* tp_setattr */ + (cmpfunc) 0, /* tp_compare */ + (reprfunc) 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc) 0, /* tp_hash */ + (ternaryfunc) 0, /* tp_call */ + (reprfunc) 0, /* tp_str */ + (getattrofunc) pymatemenu_tree_getattro, /* tp_getattro */ + (setattrofunc) pymatemenu_tree_setattro, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + NULL, /* Documentation string */ + (traverseproc) 0, /* tp_traverse */ + (inquiry) 0, /* tp_clear */ + (richcmpfunc) 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + (getiterfunc) 0, /* tp_iter */ + (iternextfunc) 0, /* tp_iternext */ + pymatemenu_tree_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + (PyTypeObject*) 0, /* tp_base */ + (PyObject*) 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + (inquiry) 0, /* tp_is_gc */ + (PyObject*) 0, /* tp_bases */ +}; + +static PyMateMenuTree* pymatemenu_tree_wrap(MateMenuTree* tree) +{ + PyMateMenuTree* retval; + + if ((retval = matemenu_tree_get_user_data(tree)) != NULL) + { + Py_INCREF(retval); + return retval; + } + + if (!(retval = (PyMateMenuTree*) PyObject_NEW(PyMateMenuTree, &PyMateMenuTree_Type))) + { + return NULL; + } + + retval->tree = matemenu_tree_ref(tree); + retval->callbacks = NULL; + + matemenu_tree_set_user_data(tree, retval, NULL); + + return retval; +} + +static PyObject* pymatemenu_lookup_tree(PyObject* self, PyObject* args) +{ + char* menu_file; + + MateMenuTree* tree; + PyMateMenuTree* retval; + int flags; + + flags = MATEMENU_TREE_FLAGS_NONE; + + if (!PyArg_ParseTuple(args, "s|i:matemenu.lookup_tree", &menu_file, &flags)) + { + return NULL; + } + + if (!(tree = matemenu_tree_lookup(menu_file, flags))) + { + Py_INCREF(Py_None); + return Py_None; + } + + retval = pymatemenu_tree_wrap(tree); + + matemenu_tree_unref(tree); + + return (PyObject*) retval; +} + +static struct PyMethodDef pymatemenu_methods[] = { + {"lookup_tree", pymatemenu_lookup_tree, METH_VARARGS}, + {NULL, NULL, 0 } +}; + +void initmatemenu(void); + +DL_EXPORT(void) initmatemenu(void) +{ + PyObject* mod; + + mod = Py_InitModule4("matemenu", pymatemenu_methods, 0, 0, PYTHON_API_VERSION); + + #define REGISTER_TYPE(t, n) G_STMT_START \ + { \ + t.ob_type = &PyType_Type; \ + PyType_Ready(&t); \ + PyModule_AddObject(mod, n, (PyObject*) &t); \ + } G_STMT_END + + REGISTER_TYPE(PyMateMenuTree_Type, "Tree"); + REGISTER_TYPE(PyMateMenuTreeItem_Type, "Item"); + + #define REGISTER_ITEM_TYPE(t, n) G_STMT_START \ + { \ + t.ob_type = &PyType_Type; \ + t.tp_base = &PyMateMenuTreeItem_Type; \ + PyType_Ready(&t); \ + PyModule_AddObject(mod, n, (PyObject*) &t); \ + } G_STMT_END + + REGISTER_ITEM_TYPE(PyMateMenuTreeDirectory_Type, "Directory"); + REGISTER_ITEM_TYPE(PyMateMenuTreeEntry_Type, "Entry"); + REGISTER_ITEM_TYPE(PyMateMenuTreeSeparator_Type, "Separator"); + REGISTER_ITEM_TYPE(PyMateMenuTreeHeader_Type, "Header"); + REGISTER_ITEM_TYPE(PyMateMenuTreeAlias_Type, "Alias"); + + PyModule_AddIntConstant(mod, "TYPE_INVALID", MATEMENU_TREE_ITEM_INVALID); + PyModule_AddIntConstant(mod, "TYPE_DIRECTORY", MATEMENU_TREE_ITEM_DIRECTORY); + PyModule_AddIntConstant(mod, "TYPE_ENTRY", MATEMENU_TREE_ITEM_ENTRY); + PyModule_AddIntConstant(mod, "TYPE_SEPARATOR", MATEMENU_TREE_ITEM_SEPARATOR); + PyModule_AddIntConstant(mod, "TYPE_HEADER", MATEMENU_TREE_ITEM_HEADER); + PyModule_AddIntConstant(mod, "TYPE_ALIAS", MATEMENU_TREE_ITEM_ALIAS); + + PyModule_AddIntConstant(mod, "FLAGS_NONE", MATEMENU_TREE_FLAGS_NONE); + PyModule_AddIntConstant(mod, "FLAGS_INCLUDE_EXCLUDED", MATEMENU_TREE_FLAGS_INCLUDE_EXCLUDED); + PyModule_AddIntConstant(mod, "FLAGS_SHOW_EMPTY", MATEMENU_TREE_FLAGS_SHOW_EMPTY); + PyModule_AddIntConstant(mod, "FLAGS_INCLUDE_NODISPLAY", MATEMENU_TREE_FLAGS_INCLUDE_NODISPLAY); + PyModule_AddIntConstant(mod, "FLAGS_SHOW_ALL_SEPARATORS", MATEMENU_TREE_FLAGS_SHOW_ALL_SEPARATORS); + + PyModule_AddIntConstant(mod, "SORT_NAME", MATEMENU_TREE_SORT_NAME); + PyModule_AddIntConstant(mod, "SORT_DISPLAY_NAME", MATEMENU_TREE_SORT_DISPLAY_NAME); +} -- cgit v1.2.1