diff --git a/src/gtk_style.c b/src/gtk_style.c new file mode 100644 index 0000000000000000000000000000000000000000..b86c33a03a63ef741fa9cdf174e258accabdd7ec --- /dev/null +++ b/src/gtk_style.c @@ -0,0 +1,271 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_MEMORY_H +#include <memory.h> +#endif +#include <stdio.h> +#ifdef HAVE_STRING_H +#include <string.h> +#endif + +#include <glib.h> +#include <gdk/gdk.h> +#include <gtk/gtk.h> +#include <pango/pango-font.h> + +#include <libxfce4util/libxfce4util.h> + +char *states[] = { + "normal", "active", "prelight", "selected", "insensitive", NULL +}; + +char *names[] = { + "fg", "bg", "text", "base", "light", "dark", "mid", NULL +}; + +#define GTKSTYLE_FG 0 +#define GTKSTYLE_BG 1 +#define GTKSTYLE_TEXT 2 +#define GTKSTYLE_BASE 3 +#define GTKSTYLE_LIGHT 4 +#define GTKSTYLE_DARK 5 +#define GTKSTYLE_MID 6 + +static gint +state_value (const gchar * s) +{ + gchar *t; + gint u; + + t = states[0]; + u = 0; + + while ((states[u]) && (strcmp (states[u], s))) + { + u++; + } + if (states[u]) + { + return (u); + } + return (0); +} + +static gint +name_value (const gchar * s) +{ + gchar *t; + gint u; + + t = names[0]; + u = 0; + + while ((names[u]) && (strcmp (names[u], s))) + { + u++; + } + if (names[u]) + { + return (u); + } + return (0); +} + +static gchar * +print_color (GtkWidget * win, GdkColor * c) +{ + gchar *s; + GdkColor real_color; + GdkColormap *cmap; + + s = g_new (gchar, 14); + cmap = gtk_widget_get_colormap (GTK_WIDGET (win)); + if (cmap && GDK_IS_COLORMAP (cmap)) + { + gdk_colormap_query_color (cmap, c->pixel, &real_color); + g_snprintf (s, 14, "#%04x%04x%04x", real_color.red, real_color.green, + real_color.blue); + } + else + { + g_snprintf (s, 14, "#%04x%04x%04x", c->red, c->green, c->blue); + } + return (s); +} + +static gchar * +print_colors (GtkWidget * win, GdkColor * x, int n) +{ + return (print_color (win, x + n)); +} + +static gchar * +print_rc_style (GtkWidget * win, const gchar * name, const gchar * state, + GtkStyle * style) +{ + gchar *s; + gint n, m; + g_return_val_if_fail (state != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + n = state_value (state); + m = name_value (name); + + switch (m) + { + case GTKSTYLE_FG: + s = print_colors (win, style->fg, n); + break; + case GTKSTYLE_BG: + s = print_colors (win, style->bg, n); + break; + case GTKSTYLE_TEXT: + s = print_colors (win, style->text, n); + break; + case GTKSTYLE_BASE: + s = print_colors (win, style->base, n); + break; + case GTKSTYLE_LIGHT: + s = print_colors (win, style->light, n); + break; + case GTKSTYLE_DARK: + s = print_colors (win, style->dark, n); + break; + default: + case GTKSTYLE_MID: + s = print_colors (win, style->mid, n); + break; + } + return (s); +} + +gchar * +get_style (GtkWidget * win, const gchar * name, const gchar * state) +{ + GtkStyle *style = NULL; + gchar *s = NULL; + + TRACE ("entering get_style"); + + g_return_val_if_fail (win != NULL, NULL); + g_return_val_if_fail (GTK_IS_WIDGET (win), NULL); + g_return_val_if_fail (GTK_WIDGET_REALIZED (win), NULL); + + style = gtk_rc_get_style (win); + if (!style) + { + style = gtk_widget_get_style (win); + } + s = print_rc_style (win, name, state, style); + TRACE ("%s[%s]=%s", name, state, s); + return (s); +} + +static GdkGC * +_get_style_gc (const gchar * name, const gchar * state, GtkStyle * style) +{ + GdkGC *gc = NULL; + gint n, m; + + g_return_val_if_fail (state != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail (style != NULL, NULL); + g_return_val_if_fail (GTK_IS_STYLE(style), NULL); + + n = state_value (state); + m = name_value (name); + + switch (m) + { + case GTKSTYLE_FG: + gc = style->fg_gc[n]; + break; + case GTKSTYLE_BG: + gc = style->bg_gc[n]; + break; + case GTKSTYLE_TEXT: + gc = style->text_gc[n]; + break; + case GTKSTYLE_BASE: + gc = style->base_gc[n]; + break; + case GTKSTYLE_LIGHT: + gc = style->light_gc[n]; + break; + case GTKSTYLE_DARK: + gc = style->dark_gc[n]; + break; + default: + case GTKSTYLE_MID: + gc = style->mid_gc[n]; + break; + } + + return (gc); +} + +GdkGC * +get_style_gc (GtkWidget * win, const gchar * name, const gchar * state) +{ + GtkStyle *style = NULL; + + TRACE ("entering get_style_gc"); + + g_return_val_if_fail (win != NULL, NULL); + g_return_val_if_fail (GTK_IS_WIDGET (win), NULL); + g_return_val_if_fail (GTK_WIDGET_REALIZED (win), NULL); + + style = gtk_rc_get_style (win); + if (!style) + { + style = gtk_widget_get_style (win); + } + if (!style) + { + style = gtk_widget_get_default_style (); + } + return (_get_style_gc (name, state, style)); +} + +PangoFontDescription * +get_font_desc (GtkWidget * win) +{ + TRACE ("entering get_font_desc"); + + g_return_val_if_fail (win != NULL, NULL); + g_return_val_if_fail (GTK_IS_WIDGET (win), NULL); + g_return_val_if_fail (GTK_WIDGET_REALIZED (win), NULL); + + return (win->style->font_desc); +} + +PangoContext * +pango_get_context (GtkWidget * win) +{ + TRACE ("entering pango_get_context"); + + g_return_val_if_fail (win != NULL, NULL); + g_return_val_if_fail (GTK_IS_WIDGET (win), NULL); + g_return_val_if_fail (GTK_WIDGET_REALIZED (win), NULL); + + return (gtk_widget_get_pango_context (win)); +}