1 #if defined(HAVE_CONFIG_H) && !defined(GEANYPY_WINDOWS)
2 # include "config.h"
3 #endif
4
5 #include "geanypy.h"
6
7 typedef struct
8 {
9 PyObject_HEAD
10 GeanyApp *app;
11 } App;
12
13
14 static void
App_dealloc(App * self)15 App_dealloc(App *self)
16 {
17 g_return_if_fail(self != NULL);
18 self->ob_type->tp_free((PyObject *) self);
19 }
20
21
22 static int
App_init(App * self)23 App_init(App *self)
24 {
25 g_return_val_if_fail(self != NULL, -1);
26 g_return_val_if_fail(geany_data, -1);
27 self->app = geany_data->app;
28 return 0;
29 }
30
31
32 static PyObject *
App_get_property(App * self,const gchar * prop_name)33 App_get_property(App *self, const gchar *prop_name)
34 {
35 g_return_val_if_fail(self != NULL, NULL);
36 g_return_val_if_fail(prop_name != NULL, NULL);
37
38 if (!self->app)
39 {
40 PyErr_SetString(PyExc_RuntimeError,
41 "App instance not initialized properly");
42 return NULL;
43 }
44
45 if (g_str_equal(prop_name, "configdir") && self->app->configdir)
46 return PyString_FromString(self->app->configdir);
47 #if ENABLE_PRIVATE
48 else if (g_str_equal(prop_name, "datadir") && self->app->datadir)
49 return PyString_FromString(self->app->datadir);
50 else if (g_str_equal(prop_name, "docdir") && self->app->docdir)
51 return PyString_FromString(self->app->docdir);
52 #endif
53 else if (g_str_equal(prop_name, "debug_mode") && self->app->debug_mode)
54 {
55 if (self->app->debug_mode)
56 Py_RETURN_TRUE;
57 else
58 Py_RETURN_FALSE;
59 }
60 else if (g_str_equal(prop_name, "project") && self->app->project)
61 return (PyObject *) GEANYPY_NEW(Project);
62
63 Py_RETURN_NONE;
64 }
65 GEANYPY_PROPS_READONLY(App);
66
67
68 static PyGetSetDef App_getseters[] = {
69 GEANYPY_GETSETDEF(App, "configdir",
70 "User configuration directory, usually ~/.config/geany. "),
71 #ifdef ENABLE_PRIVATE
72 GEANYPY_GETSETDEF(App, "datadir", "Geany's data directory."),
73 GEANYPY_GETSETDEF(App, "docdir", "Geany's documentation directory."),
74 #endif
75 GEANYPY_GETSETDEF(App, "debug_mode",
76 "True if debug messages should be printed."),
77 GEANYPY_GETSETDEF(App, "project",
78 "Currently active project or None if none is open."),
79 { NULL }
80 };
81
82
83 static PyTypeObject AppType = {
84 PyObject_HEAD_INIT(NULL)
85 0, /* ob_size */
86 "geany.app.App", /* tp_name */
87 sizeof(App), /* tp_basicsize */
88 0, /* tp_itemsize */
89 (destructor) App_dealloc, /* tp_dealloc */
90 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* tp_print - tp_as_buffer */
91 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
92 "Wrapper around a GeanyApp structure.", /* tp_doc */
93 0, 0, 0, 0, 0, 0, 0, 0, /* tp_traverse - tp_members */
94 App_getseters, /* tp_getset */
95 0, 0, 0, 0, 0, /* tp_base - tp_dictoffset */
96 (initproc) App_init, /* tp_init */
97 0, 0, /* tp_alloc - tp_new */
98 };
99
100
101 static PyMethodDef AppModule_methods[] = { { NULL } };
102
103
initapp(void)104 PyMODINIT_FUNC initapp(void)
105 {
106 PyObject *m;
107
108 AppType.tp_new = PyType_GenericNew;
109 if (PyType_Ready(&AppType) < 0)
110 return;
111
112 m = Py_InitModule3("app", AppModule_methods, "Application information");
113
114 Py_INCREF(&AppType);
115 PyModule_AddObject(m, "App", (PyObject *) &AppType);
116 }
117