diff --git a/kitty/cursor.c b/kitty/cursor.c new file mode 100644 index 000000000..e1869eba0 --- /dev/null +++ b/kitty/cursor.c @@ -0,0 +1,100 @@ +/* + * cursor.c + * Copyright (C) 2016 Kovid Goyal + * + * Distributed under terms of the GPL3 license. + */ + +#include "data-types.h" + +#include + +#define INIT_NONE(x) Py_INCREF(Py_None); x = Py_None; + +static PyObject * +Cursor_new(PyTypeObject *type, PyObject UNUSED *args, PyObject UNUSED *kwds) { + Cursor *self; + + self = (Cursor *)type->tp_alloc(type, 0); + if (self != NULL) { + INIT_NONE(self->shape); + INIT_NONE(self->blink); + INIT_NONE(self->color); + self->hidden = Py_False; Py_INCREF(Py_False); + self->bold = 0; self->italic = 0; self->reverse = 0; self->strikethrough = 0; self->decoration = 0; + self->fg = 0; self->bg = 0; self->decoration_fg = 0; + self->x = PyLong_FromLong(0); self->y = PyLong_FromLong(0); + if (self->x == NULL || self->y == NULL) { Py_DECREF(self); self = NULL; } + } + return (PyObject*) self; +} + +static void +Cursor_dealloc(Cursor* self) { + Py_XDECREF(self->shape); + Py_XDECREF(self->blink); + Py_XDECREF(self->color); + Py_XDECREF(self->hidden); + Py_XDECREF(self->x); + Py_XDECREF(self->y); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +// Boilerplate {{{ + +static PyMemberDef Cursor_members[] = { + {"x", T_OBJECT_EX, offsetof(Cursor, x), 0, "x"}, + {"y", T_OBJECT_EX, offsetof(Cursor, y), 0, "y"}, + {"shape", T_OBJECT_EX, offsetof(Cursor, shape), 0, "shape"}, + {"blink", T_OBJECT_EX, offsetof(Cursor, blink), 0, "blink"}, + {"color", T_OBJECT_EX, offsetof(Cursor, color), 0, "color"}, + {"hidden", T_OBJECT_EX, offsetof(Cursor, hidden), 0, "hidden"}, + {NULL} /* Sentinel */ +}; + +static PyMethodDef Cursor_methods[] = { + {NULL} /* Sentinel */ +}; + +PyTypeObject Cursor_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "fast_data_types.Cursor", + sizeof(Cursor), + 0, /* tp_itemsize */ + (destructor)Cursor_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 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, /* tp_flags */ + "Cursors", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + Cursor_methods, /* tp_methods */ + Cursor_members, /* tp_members */ + 0, /* 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 */ + Cursor_new, /* tp_new */ +}; +// }} + diff --git a/kitty/data-types.c b/kitty/data-types.c index efa294df4..ce1663504 100644 --- a/kitty/data-types.c +++ b/kitty/data-types.c @@ -8,6 +8,7 @@ #include "data-types.h" extern PyTypeObject LineBuf_Type; +extern PyTypeObject Cursor_Type; static PyMethodDef module_methods[] = { {NULL, NULL, 0, NULL} /* Sentinel */ @@ -27,12 +28,15 @@ PyInit_fast_data_types(void) { if (PyType_Ready(&LineBuf_Type) < 0) return NULL; + if (PyType_Ready(&Cursor_Type) < 0) return NULL; m = PyModule_Create(&module); if (m == NULL) return NULL; if (m != NULL) { Py_INCREF(&LineBuf_Type); PyModule_AddObject(m, "LineBuf", (PyObject *)&LineBuf_Type); + Py_INCREF(&Cursor_Type); + PyModule_AddObject(m, "Cursor", (PyObject *)&Cursor_Type); } return m; diff --git a/kitty/data-types.h b/kitty/data-types.h index 1d61c097b..5b2c7d8d3 100644 --- a/kitty/data-types.h +++ b/kitty/data-types.h @@ -19,7 +19,24 @@ typedef uint32_t decoration_type; typedef uint32_t combining_type; typedef unsigned int index_type; #define CELL_SIZE (sizeof(char_type) + sizeof(color_type) + sizeof(decoration_type) + sizeof(combining_type)) + #define CHAR_MASK 0xFFFFFF +#define ATTRS_SHIFT 24 +#define WIDTH_MASK 0xFF +#define DECORATION_SHIFT 2 +#define BOLD_SHIFT 4 +#define ITALIC_SHIFT 5 +#define REVERSE_SHIFT 6 +#define STRIKE_SHIFT 7 +#define DECORATION_MASK (1 << DECORATION_SHIFT) +#define BOLD_MASK (1 << BOLD_SHIFT) +#define ITALIC_MASK (1 << ITALIC_SHIFT) +#define REVERSE_MASK (1 << REVERSE_SHIFT) +#define STRIKE_MASK (1 << STRIKE_SHIFT) +#define COL_MASK 0xFFFFFFFF +#define COL_SHIFT 32 +#define HAS_BG_MASK (0xFF << COL_SHIFT) + typedef struct { PyObject_HEAD @@ -37,4 +54,11 @@ typedef struct { } LineBuf; +typedef struct { + PyObject_HEAD + PyObject *x, *y, *shape, *blink, *hidden, *color; + uint8_t bold, italic, reverse, strikethrough, decoration; + uint32_t fg, bg, decoration_fg; + +} Cursor; diff --git a/setup.py b/setup.py index d90ca5f60..929f7b417 100644 --- a/setup.py +++ b/setup.py @@ -68,4 +68,4 @@ if __name__ == '__main__': if sys.version_info < (3, 5): raise SystemExit('python >= 3.5 required') init_env() - compile_c_extension('kitty/fast_data_types', 'kitty/data-types.c', 'kitty/line-buf.c') + compile_c_extension('kitty/fast_data_types', 'kitty/data-types.c', 'kitty/line-buf.c', 'kitty/cursor.c')