summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-12-24 16:29:08 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-12-24 16:29:08 (GMT)
commitf3578d35758ac47991806233ceba8d566160260b (patch)
tree2407285f053d51b0820946a0a957868693936ab9 /plugins/pychrysalide/gtkext
parent93dfdc30d815629a7e0c9393f0e8f0462844ff56 (diff)
Added a way to retrieve RGBA colors from the current GTK style.
Diffstat (limited to 'plugins/pychrysalide/gtkext')
-rw-r--r--plugins/pychrysalide/gtkext/easygtk.c85
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 }