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