diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-12-24 16:29:08 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-12-24 16:29:08 (GMT) |
commit | f3578d35758ac47991806233ceba8d566160260b (patch) | |
tree | 2407285f053d51b0820946a0a957868693936ab9 /plugins | |
parent | 93dfdc30d815629a7e0c9393f0e8f0462844ff56 (diff) |
Added a way to retrieve RGBA colors from the current GTK style.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/pychrysalide/gtkext/easygtk.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/plugins/pychrysalide/gtkext/easygtk.c b/plugins/pychrysalide/gtkext/easygtk.c index fe57c7e..a489cd1 100644 --- a/plugins/pychrysalide/gtkext/easygtk.c +++ b/plugins/pychrysalide/gtkext/easygtk.c @@ -41,6 +41,9 @@ " useful features GTK is missing." +/* Identifie la couleur de base associée à un style GTK. */ +static PyObject *py_easygtk_get_color_from_style(PyObject *, PyObject *); + /* Détermine l'indice d'un composant dans un conteneur GTK. */ static PyObject *py_easygtk_find_contained_child_index(PyObject *, PyObject *); @@ -54,6 +57,87 @@ static PyObject *py_easygtk_get_nth_contained_child(PyObject *, PyObject *); * Paramètres : self = NULL car méthode statique. * * args = paramètres à transmettre à l'appel natif. * * * +* Description : Identifie la couleur de base associée à un style GTK. * +* * +* Retour : Bilan présumé de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_easygtk_get_color_from_style(PyObject *self, PyObject *args) +{ + PyObject *result; /* Désignation à retourner */ + const char *class; /* Classe de style GTK */ + int background; /* Nature du traitement */ + int ret; /* Bilan de lecture des args. */ + GdkRGBA color; /* Couleur obtenue */ + bool status; /* Bilan de la récupération */ + PyObject *gdk_mod; /* Module Python Gdk */ + PyObject *rgba_type; /* Classe "GtkRGBA" */ + PyObject *rgba_args; /* Arguments pour l'appel */ + +#define EASYGTK_GET_COLOR_FROM_STYLE_METHOD PYTHON_METHOD_DEF \ +( \ + get_color_from_style, "cls, background, /", \ + METH_VARARGS | METH_STATIC, py_easygtk, \ + "Find the index of a given child widget inside a GTK container" \ + " children.\n" \ + "\n" \ + "The *containter* argument must be a Gtk.Container instance and" \ + " *child* a Gtk.Widget instance.\n" \ + "\n" \ + "The result is the found index or -1 in case of error." \ +) + + ret = PyArg_ParseTuple(args, "sp", &class, &background); + if (!ret) return NULL; + + status = get_color_from_style(class, background, &color); + + if (status) + { + gdk_mod = PyImport_ImportModule("gi.repository.Gdk"); + + if (gdk_mod == NULL) + { + PyErr_SetString(PyExc_TypeError, "unable to find the Gtk Python module"); + goto done; + } + + rgba_type = PyObject_GetAttrString(gdk_mod, "RGBA"); + + Py_DECREF(gdk_mod); + + rgba_args = PyTuple_New(4); + PyTuple_SetItem(rgba_args, 0, PyFloat_FromDouble(color.red)); + PyTuple_SetItem(rgba_args, 1, PyFloat_FromDouble(color.green)); + PyTuple_SetItem(rgba_args, 2, PyFloat_FromDouble(color.blue)); + PyTuple_SetItem(rgba_args, 3, PyFloat_FromDouble(color.alpha)); + + result = PyObject_CallObject(rgba_type, rgba_args); + + Py_DECREF(rgba_args); + + } + + else + { + done: + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = NULL car méthode statique. * +* args = paramètres à transmettre à l'appel natif. * +* * * Description : Détermine l'indice d'un composant dans un conteneur GTK. * * * * Retour : Indice du composant dans le conteneur ou -1 si non trouvé. * @@ -165,6 +249,7 @@ static PyObject *py_easygtk_get_nth_contained_child(PyObject *self, PyObject *ar PyTypeObject *get_python_easygtk_type(void) { static PyMethodDef py_easygtk_methods[] = { + EASYGTK_GET_COLOR_FROM_STYLE_METHOD, EASYGTK_FIND_CONTAINED_CHILD_INDEX_METHOD, EASYGTK_GET_NTH_CONTAINED_CHILD_METHOD, { NULL } |