summaryrefslogtreecommitdiffstats
path: root/objects/main-window-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'objects/main-window-object.c')
-rw-r--r--objects/main-window-object.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/objects/main-window-object.c b/objects/main-window-object.c
new file mode 100644
index 0000000..331cef6
--- /dev/null
+++ b/objects/main-window-object.c
@@ -0,0 +1,199 @@
+#include <Python.h>
+#include "pyirssi.h"
+#include "pymodule.h"
+#include "main-window-object.h"
+#include "factory.h"
+#include "pycore.h"
+
+#define MW(data) ((MAIN_WINDOW_REC *) data)
+
+/* monitor "mainwindow destroyed" signal */
+static void main_window_cleanup(MAIN_WINDOW_REC *mw)
+{
+ PyMainWindow *pymw = signal_get_user_data();
+
+ if (mw == pymw->data)
+ {
+ pymw->data = NULL;
+ pymw->cleanup_installed = 0;
+ signal_remove_data("mainwindow destroyed", main_window_cleanup, pymw);
+ }
+}
+
+static void PyMainWindow_dealloc(PyMainWindow *self)
+{
+ if (self->cleanup_installed)
+ signal_remove_data("mainwindow destroyed", main_window_cleanup, self);
+
+ Py_XDECREF(self->active);
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *PyMainWindow_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyMainWindow *self;
+
+ self = (PyMainWindow *)type->tp_alloc(type, 0);
+ if (!self)
+ return NULL;
+
+ return (PyObject *)self;
+}
+
+/* getters */
+PyDoc_STRVAR(PyMainWindow_active_doc,
+ "active window object"
+);
+static PyObject *PyMainWindow_active_get(PyMainWindow *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_OBJ_OR_NONE(self->active);
+}
+
+PyDoc_STRVAR(PyMainWindow_first_line_doc,
+ "first line used by this window (0..x) (includes statusbars)"
+);
+static PyObject *PyMainWindow_first_line_get(PyMainWindow *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(MW(self->data)->first_line);
+}
+
+PyDoc_STRVAR(PyMainWindow_last_line_doc,
+ "last line used by this window (0..x) (includes statusbars)"
+);
+static PyObject *PyMainWindow_last_line_get(PyMainWindow *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(MW(self->data)->last_line);
+}
+
+PyDoc_STRVAR(PyMainWindow_width_doc,
+ "width of the window (includes statusbars)"
+);
+static PyObject *PyMainWindow_width_get(PyMainWindow *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(MW(self->data)->width);
+}
+
+PyDoc_STRVAR(PyMainWindow_height_doc,
+ "height of the window (includes statusbars)"
+);
+static PyObject *PyMainWindow_height_get(PyMainWindow *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(MW(self->data)->height);
+}
+
+PyDoc_STRVAR(PyMainWindow_statusbar_lines_doc,
+ "???"
+);
+static PyObject *PyMainWindow_statusbar_lines_get(PyMainWindow *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(MW(self->data)->statusbar_lines);
+}
+
+/* specialized getters/setters */
+static PyGetSetDef PyMainWindow_getseters[] = {
+ {"active", (getter)PyMainWindow_active_get, NULL,
+ PyMainWindow_active_doc, NULL},
+ {"first_line", (getter)PyMainWindow_first_line_get, NULL,
+ PyMainWindow_first_line_doc, NULL},
+ {"last_line", (getter)PyMainWindow_last_line_get, NULL,
+ PyMainWindow_last_line_doc, NULL},
+ {"width", (getter)PyMainWindow_width_get, NULL,
+ PyMainWindow_width_doc, NULL},
+ {"height", (getter)PyMainWindow_height_get, NULL,
+ PyMainWindow_height_doc, NULL},
+ {"statusbar_lines", (getter)PyMainWindow_statusbar_lines_get, NULL,
+ PyMainWindow_statusbar_lines_doc, NULL},
+ {NULL}
+};
+
+/* Methods for object */
+static PyMethodDef PyMainWindow_methods[] = {
+ {NULL} /* Sentinel */
+};
+
+PyTypeObject PyMainWindowType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "MainWindow", /*tp_name*/
+ sizeof(PyMainWindow), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)PyMainWindow_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ "PyMainWindow objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PyMainWindow_methods, /* tp_methods */
+ 0, /* tp_members */
+ PyMainWindow_getseters, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ PyMainWindow_new, /* tp_new */
+};
+
+
+/* main window wrapper factory function */
+PyObject *pymain_window_new(MAIN_WINDOW_REC *mw)
+{
+ PyObject *pyactive = NULL;
+ PyMainWindow *pymw;
+
+ pyactive = pywindow_new(mw->active);
+ if (!pyactive)
+ return NULL;
+
+ pymw = py_inst(PyMainWindow, PyMainWindowType);
+ if (!pymw)
+ {
+ Py_XDECREF(pyactive);
+ return NULL;
+ }
+
+ pymw->active = pyactive;
+ pymw->data = mw;
+ pymw->cleanup_installed = 1;
+ signal_add_last_data("mainwindow destroyed", main_window_cleanup, pymw);
+
+ return (PyObject *)pymw;
+}
+
+int main_window_object_init(void)
+{
+ g_return_val_if_fail(py_module != NULL, 0);
+
+ if (PyType_Ready(&PyMainWindowType) < 0)
+ return 0;
+
+ Py_INCREF(&PyMainWindowType);
+ PyModule_AddObject(py_module, "MainWindow", (PyObject *)&PyMainWindowType);
+
+ return 1;
+}