summaryrefslogtreecommitdiffstats
path: root/objects
diff options
context:
space:
mode:
authorChristopher Davis <loafier@gmail.com>2006-07-26 10:18:15 +0000
committerChristopher Davis <loafier@gmail.com>2006-07-26 10:18:15 +0000
commitc0ac6d60c5319a08148d743fd03ba3f66b22dfe0 (patch)
treec6ef42493a981f530f498c50d7573ae028c84a6a /objects
parentd01927add7ccbc6d98e31c87640b8711e2d60d4a (diff)
downloadirssi-python-c0ac6d60c5319a08148d743fd03ba3f66b22dfe0.tar.gz
irssi-python-c0ac6d60c5319a08148d743fd03ba3f66b22dfe0.tar.xz
irssi-python-c0ac6d60c5319a08148d743fd03ba3f66b22dfe0.zip
got statusbar working, needs a bit more testing
git-svn-id: http://svn.irssi.org/repos/irssi-python@4301 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'objects')
-rw-r--r--objects/Makefile4
-rw-r--r--objects/factory.c3
-rw-r--r--objects/factory.h1
-rw-r--r--objects/pyscript-object.c30
-rw-r--r--objects/pyscript-object.h1
-rw-r--r--objects/statusbar-item-object.c217
-rw-r--r--objects/statusbar-item-object.h22
7 files changed, 276 insertions, 2 deletions
diff --git a/objects/Makefile b/objects/Makefile
index 39f6195..db2c7bb 100644
--- a/objects/Makefile
+++ b/objects/Makefile
@@ -1,7 +1,7 @@
CC = gcc
PYTHON = /usr/include/python2.4
-IRSSI = /usr/local/include/irssi
+IRSSI = /home/chrisd/irssi-0.8.10
CFLAGS = -fpic -ggdb -Wall -I$(PYTHON) -I$(IRSSI) -I$(IRSSI)/src \
-I$(IRSSI)/src/fe-common/core -I$(IRSSI)/src/core -I$(IRSSI)/src/fe-text \
-I$(IRSSI)/src/irc -I$(IRSSI)/src/irc/core -I$(IRSSI)/src/irc/dcc \
@@ -16,7 +16,7 @@ rawlog-object.o log-object.o logitem-object.o ignore-object.o \
dcc-object.o dcc-chat-object.o dcc-get-object.o dcc-send-object.o \
netsplit-object.o netsplit-server-object.o netsplit-channel-object.o \
notifylist-object.o process-object.o command-object.o theme-object.o \
-factory.o
+statusbar-item-object.o factory.o
pyobjects.a: $(OBJ)
ar r pyobjects.a $(OBJ)
diff --git a/objects/factory.c b/objects/factory.c
index bfc19ab..25ac611 100644
--- a/objects/factory.c
+++ b/objects/factory.c
@@ -122,6 +122,9 @@ static int init_objects(void)
if (!theme_object_init())
return 0;
+ if (!statusbar_item_object_init())
+ return 0;
+
return 1;
}
diff --git a/objects/factory.h b/objects/factory.h
index b7eb0e7..28b1e03 100644
--- a/objects/factory.h
+++ b/objects/factory.h
@@ -33,6 +33,7 @@
#include "process-object.h"
#include "command-object.h"
#include "theme-object.h"
+#include "statusbar-item-object.h"
int factory_init(void);
void factory_deinit(void);
diff --git a/objects/pyscript-object.c b/objects/pyscript-object.c
index d51761b..d2750bf 100644
--- a/objects/pyscript-object.c
+++ b/objects/pyscript-object.c
@@ -6,6 +6,7 @@
#include "pymodule.h"
#include "pysource.h"
#include "pythemes.h"
+#include "pystatusbar.h"
/* handle cycles...
Can't think of any reason why the user would put script into one of the lists
@@ -543,6 +544,25 @@ static PyObject *PyScript_theme_register(PyScript *self, PyObject *args, PyObjec
Py_RETURN_NONE;
}
+PyDoc_STRVAR(PyScript_statusbar_item_register_doc,
+ "statusbar_item_register(name, value=None, func=None) -> None\n"
+);
+static PyObject *PyScript_statusbar_item_register(PyScript *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"name", "value", "func", NULL};
+ char *name = "";
+ char *value = NULL;
+ PyObject *func = NULL;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|zO", kwlist,
+ &name, &value, &func))
+ return NULL;
+
+ pystatusbar_item_register((PyObject *)self, name, value, func);
+
+ Py_RETURN_NONE;
+}
+
/* Methods for object */
static PyMethodDef PyScript_methods[] = {
{"command_bind", (PyCFunction)PyScript_command_bind, METH_VARARGS | METH_KEYWORDS,
@@ -579,6 +599,8 @@ static PyMethodDef PyScript_methods[] = {
PyScript_settings_remove_doc},
{"theme_register", (PyCFunction)PyScript_theme_register, METH_VARARGS | METH_KEYWORDS,
PyScript_theme_register_doc},
+ {"statusbar_item_register", (PyCFunction)PyScript_statusbar_item_register, METH_VARARGS | METH_KEYWORDS,
+ PyScript_statusbar_item_register_doc},
{NULL} /* Sentinel */
};
@@ -738,6 +760,13 @@ void pyscript_remove_themes(PyObject *script)
pythemes_unregister(pyscript_get_name(script));
}
+void pyscript_remove_statusbars(PyObject *script)
+{
+ g_return_if_fail(pyscript_check(script));
+
+ pystatusbar_cleanup_script(script);
+}
+
void pyscript_clear_modules(PyObject *script)
{
PyScript *self;
@@ -755,6 +784,7 @@ void pyscript_cleanup(PyObject *script)
pyscript_remove_sources(script);
pyscript_remove_settings(script);
pyscript_remove_themes(script);
+ pyscript_remove_statusbars(script);
pyscript_clear_modules(script);
}
diff --git a/objects/pyscript-object.h b/objects/pyscript-object.h
index 644571d..624a578 100644
--- a/objects/pyscript-object.h
+++ b/objects/pyscript-object.h
@@ -22,6 +22,7 @@ void pyscript_remove_signals(PyObject *script);
void pyscript_remove_sources(PyObject *script);
void pyscript_remove_settings(PyObject *script);
void pyscript_remove_themes(PyObject *script);
+void pyscript_remove_statusbars(PyObject *script);
void pyscript_clear_modules(PyObject *script);
void pyscript_cleanup(PyObject *script);
#define pyscript_check(op) PyObject_TypeCheck(op, &PyScriptType)
diff --git a/objects/statusbar-item-object.c b/objects/statusbar-item-object.c
new file mode 100644
index 0000000..14b0208
--- /dev/null
+++ b/objects/statusbar-item-object.c
@@ -0,0 +1,217 @@
+#include <Python.h>
+#include "pyirssi.h"
+#include "pymodule.h"
+#include "factory.h"
+#include "statusbar-item-object.h"
+
+/* monitor "statusbar item destroyed" signal */
+static void statusbar_item_cleanup(SBAR_ITEM_REC *sbar_item)
+{
+ PyStatusbarItem *pysbar_item = signal_get_user_data();
+
+ if (sbar_item == pysbar_item->data)
+ {
+ pysbar_item->data = NULL;
+ pysbar_item->cleanup_installed = 0;
+ signal_remove_data("statusbar item_destroy", statusbar_item_cleanup, pysbar_item);
+ }
+}
+
+static void PyStatusbarItem_dealloc(PyStatusbarItem *self)
+{
+ if (self->cleanup_installed)
+ signal_remove_data("sbar_itemlist remove", statusbar_item_cleanup, self);
+
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *PyStatusbarItem_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyStatusbarItem *self;
+
+ self = (PyStatusbarItem *)type->tp_alloc(type, 0);
+ if (!self)
+ return NULL;
+
+ return (PyObject *)self;
+}
+
+/* Getter */
+PyDoc_STRVAR(PyStatusbarItem_min_size_doc,
+ "min size"
+);
+static PyObject *PyStatusbarItem_min_size_get(PyStatusbarItem *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(self->data->min_size);
+}
+
+PyDoc_STRVAR(PyStatusbarItem_max_size_doc,
+ "max size"
+);
+static PyObject *PyStatusbarItem_max_size_get(PyStatusbarItem *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(self->data->max_size);
+}
+
+PyDoc_STRVAR(PyStatusbarItem_xpos_doc,
+ "x position"
+);
+static PyObject *PyStatusbarItem_xpos_get(PyStatusbarItem *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(self->data->xpos);
+}
+
+PyDoc_STRVAR(PyStatusbarItem_size_doc,
+ "size"
+);
+static PyObject *PyStatusbarItem_size_get(PyStatusbarItem *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(self->data->size);
+}
+
+PyDoc_STRVAR(PyStatusbarItem_window_doc,
+ "parent window for statusbar item"
+);
+static PyObject *PyStatusbarItem_window_get(PyStatusbarItem *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_OBJ_OR_NONE(self->window);
+}
+
+/* specialized getters/setters */
+static PyGetSetDef PyStatusbarItem_getseters[] = {
+ {"min_size", (getter)PyStatusbarItem_min_size_get, NULL,
+ PyStatusbarItem_min_size_doc, NULL},
+ {"max_size", (getter)PyStatusbarItem_max_size_get, NULL,
+ PyStatusbarItem_max_size_doc, NULL},
+ {"xpos", (getter)PyStatusbarItem_xpos_get, NULL,
+ PyStatusbarItem_xpos_doc, NULL},
+ {"size", (getter)PyStatusbarItem_size_get, NULL,
+ PyStatusbarItem_size_doc, NULL},
+ {"window", (getter)PyStatusbarItem_window_get, NULL,
+ PyStatusbarItem_window_doc, NULL},
+ {NULL}
+};
+
+/* Methods */
+PyDoc_STRVAR(PyStatusbarItem_default_handler_doc,
+ "default_handler(get_size_only, str=None, data="", escape_vars=True) -> None\n"
+ "\n"
+ "Run default handler of item to print to statusbar\n"
+);
+static PyObject *PyStatusbarItem_default_handler(PyStatusbarItem *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"get_size_only", "str", "data", "escape_vars", NULL};
+ int get_size_only = 0;
+ char *str = NULL;
+ char *data = "";
+ int escape_vars = TRUE;
+
+ RET_NULL_IF_INVALID(self->data);
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "i|zsi", kwlist,
+ &get_size_only, &str, &data, &escape_vars))
+ return NULL;
+
+ if (str && !*str)
+ str = NULL;
+
+ statusbar_item_default_handler(self->data, get_size_only, str, data, escape_vars);
+
+ Py_RETURN_NONE;
+}
+
+/* Methods for object */
+static PyMethodDef PyStatusbarItem_methods[] = {
+ {"default_handler", (PyCFunction)PyStatusbarItem_default_handler, METH_VARARGS | METH_KEYWORDS,
+ PyStatusbarItem_default_handler_doc},
+ {NULL} /* Sentinel */
+};
+
+PyTypeObject PyStatusbarItemType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "StatusbarItem", /*tp_name*/
+ sizeof(PyStatusbarItem), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)PyStatusbarItem_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*/
+ "PyStatusbarItem objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PyStatusbarItem_methods, /* tp_methods */
+ 0, /* tp_members */
+ PyStatusbarItem_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 */
+ PyStatusbarItem_new, /* tp_new */
+};
+
+
+/* sbar_item factory function */
+PyObject *pystatusbar_item_new(void *sbar_item)
+{
+ SBAR_ITEM_REC *si;
+ PyStatusbarItem *pysbar_item;
+ PyObject *window = NULL;
+
+ si = sbar_item;
+ if (si->bar->parent_window)
+ {
+ window = pywindow_new(si->bar->parent_window);
+ if (!window)
+ return NULL;
+ }
+
+ pysbar_item = py_inst(PyStatusbarItem, PyStatusbarItemType);
+ if (!pysbar_item)
+ return NULL;
+
+ pysbar_item->window = window;
+
+ pysbar_item->data = sbar_item;
+ pysbar_item->cleanup_installed = 1;
+ signal_add_last_data("statusbar item destroyed", statusbar_item_cleanup, pysbar_item);
+
+ return (PyObject *)pysbar_item;
+}
+
+int statusbar_item_object_init(void)
+{
+ g_return_val_if_fail(py_module != NULL, 0);
+
+ if (PyType_Ready(&PyStatusbarItemType) < 0)
+ return 0;
+
+ Py_INCREF(&PyStatusbarItemType);
+ PyModule_AddObject(py_module, "StatusbarItem", (PyObject *)&PyStatusbarItemType);
+
+ return 1;
+}
diff --git a/objects/statusbar-item-object.h b/objects/statusbar-item-object.h
new file mode 100644
index 0000000..19243f4
--- /dev/null
+++ b/objects/statusbar-item-object.h
@@ -0,0 +1,22 @@
+#ifndef _SBAR_ITEM_OBJECT_H_
+#define _SBAR_ITEM_OBJECT_H_
+
+#include <Python.h>
+#include "base-objects.h"
+
+/* forward */
+struct SBAR_ITEM_REC;
+
+typedef struct
+{
+ PyIrssiFinal_HEAD(struct SBAR_ITEM_REC)
+ PyObject *window;
+} PyStatusbarItem;
+
+extern PyTypeObject PyStatusbarItemType;
+
+int statusbar_item_object_init(void);
+PyObject *pystatusbar_item_new(void *sbar_item);
+#define pystatusbar_item_check(op) PyObject_TypeCheck(op, &PyStatusbarItemType)
+
+#endif