1 /*
2     DeaDBeeF -- the music player
3     Copyright (C) 2009-2015 Alexey Yakovenko and other contributors
4 
5     This software is provided 'as-is', without any express or implied
6     warranty.  In no event will the authors be held liable for any damages
7     arising from the use of this software.
8 
9     Permission is granted to anyone to use this software for any purpose,
10     including commercial applications, and to alter it and redistribute it
11     freely, subject to the following restrictions:
12 
13     1. The origin of this software must not be misrepresented; you must not
14      claim that you wrote the original software. If you use this software
15      in a product, an acknowledgment in the product documentation would be
16      appreciated but is not required.
17 
18     2. Altered source versions must be plainly marked as such, and must not be
19      misrepresented as being the original software.
20 
21     3. This notice may not be removed or altered from any source distribution.
22 */
23 
24 #ifdef HAVE_CONFIG_H
25 #  include <config.h>
26 #endif
27 
28 #include <gtk/gtk.h>
29 //#include <gdk/gdkkeysyms.h>
30 #include <string.h>
31 #include "drawing.h"
32 #include "support.h"
33 #include "gtkui.h"
34 
35 static char gtkui_listview_text_font[1000];
36 static char gtkui_listview_group_text_font[1000];
37 static char gtkui_listview_column_text_font[1000];
38 static char gtkui_tabstrip_text_font[1000];
39 
40 static PangoFontDescription *
get_new_font_description_from_type(int type)41 get_new_font_description_from_type (int type)
42 {
43     PangoFontDescription *desc;
44     switch (type) {
45         case DDB_LIST_FONT:
46             desc = pango_font_description_from_string (gtkui_listview_text_font);
47             break;
48         case DDB_GROUP_FONT:
49             desc = pango_font_description_from_string (gtkui_listview_group_text_font);
50             break;
51         case DDB_TABSTRIP_FONT:
52             desc = pango_font_description_from_string (gtkui_tabstrip_text_font);
53             break;
54         case DDB_COLUMN_FONT:
55             desc = pango_font_description_from_string (gtkui_listview_column_text_font);
56             break;
57         default:
58             desc = NULL;
59     }
60     return desc;
61 }
62 
63 static int
get_pango_alignment(int align)64 get_pango_alignment (int align)
65 {
66     int alignment = 0;
67     switch (align) {
68         case 0:
69             alignment = PANGO_ALIGN_LEFT;
70             break;
71         case 1:
72             alignment = PANGO_ALIGN_RIGHT;
73             break;
74         case 2:
75             alignment = PANGO_ALIGN_CENTER;
76             break;
77         default:
78             alignment = PANGO_ALIGN_LEFT;
79             break;
80     }
81     return alignment;
82 }
83 
84 void
draw_begin(drawctx_t * ctx,cairo_t * cr)85 draw_begin (drawctx_t *ctx, cairo_t *cr) {
86     ctx->drawable = cr;
87 }
88 
89 void
draw_end(drawctx_t * ctx)90 draw_end (drawctx_t *ctx) {
91     ctx->drawable = NULL;
92 }
93 
94 void
draw_set_fg_color(drawctx_t * ctx,float * rgb)95 draw_set_fg_color (drawctx_t *ctx, float *rgb) {
96     cairo_set_source_rgb (ctx->drawable, rgb[0], rgb[1], rgb[2]);
97 }
98 
99 void
draw_line(drawctx_t * ctx,float x1,float y1,float x2,float y2)100 draw_line (drawctx_t *ctx, float x1, float y1, float x2, float y2) {
101     cairo_move_to (ctx->drawable, x1, y1);
102     cairo_line_to (ctx->drawable, x2, y2);
103     cairo_stroke (ctx->drawable);
104 }
105 
106 void
draw_rect(drawctx_t * ctx,float x,float y,float w,float h,int fill)107 draw_rect (drawctx_t *ctx, float x, float y, float w, float h, int fill) {
108     cairo_rectangle (ctx->drawable, x, y, w, h);
109     fill ? cairo_fill (ctx->drawable) : cairo_stroke (ctx->drawable);
110 }
111 
112 void
draw_free(drawctx_t * ctx)113 draw_free (drawctx_t *ctx) {
114     draw_end (ctx);
115     if (ctx->pangoctx) {
116         g_object_unref (ctx->pangoctx);
117         ctx->pangoctx = NULL;
118     }
119     if (ctx->pangolayout) {
120         g_object_unref (ctx->pangolayout);
121         ctx->pangolayout = NULL;
122     }
123     if (ctx->font_style) {
124         g_object_unref (ctx->font_style);
125         ctx->font_style = NULL;
126     }
127 }
128 
129 void
draw_init_font(drawctx_t * ctx,int type,int reset)130 draw_init_font (drawctx_t *ctx, int type, int reset) {
131     if (reset || !ctx->pango_ready) {
132         if (ctx->pangoctx) {
133             g_object_unref (ctx->pangoctx);
134             ctx->pangoctx = NULL;
135         }
136         if (ctx->pangolayout) {
137             g_object_unref (ctx->pangolayout);
138             ctx->pangolayout = NULL;
139         }
140         if (ctx->font_style) {
141             g_object_unref (ctx->font_style);
142             ctx->font_style = NULL;
143         }
144 
145         ctx->font_style = gtk_style_new ();
146         if (ctx->font_style->font_desc) {
147             pango_font_description_free (ctx->font_style->font_desc);
148             ctx->font_style->font_desc = get_new_font_description_from_type (type);
149         }
150 
151         ctx->pangoctx = gdk_pango_context_get ();
152         ctx->pangolayout = pango_layout_new (ctx->pangoctx);
153         pango_layout_set_ellipsize (ctx->pangolayout, PANGO_ELLIPSIZE_END);
154         PangoFontDescription *desc = ctx->font_style->font_desc;
155         ctx->font_weight = pango_font_description_get_weight (desc);
156         pango_layout_set_font_description (ctx->pangolayout, desc);
157         ctx->pango_ready = 1;
158     }
159     else if (ctx->pango_ready) {
160         PangoFontDescription *desc = ctx->font_style->font_desc;
161         pango_layout_set_font_description (ctx->pangolayout, desc);
162     }
163 }
164 
165 void
draw_init_font_style(drawctx_t * ctx,int bold,int italic,int type)166 draw_init_font_style (drawctx_t *ctx, int bold, int italic, int type) {
167     PangoFontDescription *desc_default = ctx->font_style->font_desc;
168     if (desc_default != NULL) {
169         pango_layout_set_font_description (ctx->pangolayout, desc_default);
170     }
171     PangoFontDescription *desc = pango_font_description_copy (pango_layout_get_font_description (ctx->pangolayout));
172     if (bold) {
173         pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
174     }
175     if (italic) {
176         pango_font_description_set_style (desc, PANGO_STYLE_ITALIC);
177     }
178     pango_layout_set_font_description (ctx->pangolayout, desc);
179     pango_font_description_free (desc);
180 }
181 
182 void
draw_init_font_normal(drawctx_t * ctx)183 draw_init_font_normal (drawctx_t *ctx) {
184     pango_font_description_set_weight (ctx->font_style->font_desc, ctx->font_weight);
185     pango_layout_set_font_description (ctx->pangolayout, ctx->font_style->font_desc);
186 }
187 
188 float
draw_get_font_size(drawctx_t * ctx)189 draw_get_font_size (drawctx_t *ctx) {
190     draw_init_font (ctx, 0, 0);
191     GdkScreen *screen = gdk_screen_get_default ();
192     float dpi = gdk_screen_get_resolution (screen);
193     PangoFontDescription *desc = ctx->font_style->font_desc;
194     return (float)(pango_font_description_get_size (desc) / PANGO_SCALE * dpi / 72);
195 }
196 
197 void
draw_text(drawctx_t * ctx,float x,float y,int width,int align,const char * text)198 draw_text (drawctx_t *ctx, float x, float y, int width, int align, const char *text) {
199     draw_init_font (ctx, 0, 0);
200     pango_layout_set_width (ctx->pangolayout, width*PANGO_SCALE);
201     pango_layout_set_alignment (ctx->pangolayout, get_pango_alignment (align));
202     pango_layout_set_text (ctx->pangolayout, text, -1);
203     cairo_move_to (ctx->drawable, x, y);
204     pango_cairo_show_layout (ctx->drawable, ctx->pangolayout);
205 }
206 
207 void
draw_text_custom(drawctx_t * ctx,float x,float y,int width,int align,int type,int bold,int italic,const char * text)208 draw_text_custom (drawctx_t *ctx, float x, float y, int width, int align, int type, int bold, int italic, const char *text) {
209     draw_init_font (ctx, type, 0);
210     if (bold || italic) {
211         draw_init_font_style (ctx, bold, italic, type);
212     }
213     pango_layout_set_width (ctx->pangolayout, width*PANGO_SCALE);
214     pango_layout_set_alignment (ctx->pangolayout, get_pango_alignment (align));
215     pango_layout_set_text (ctx->pangolayout, text, -1);
216     cairo_move_to (ctx->drawable, x, y);
217     pango_cairo_show_layout (ctx->drawable, ctx->pangolayout);
218 }
219 
220 void
draw_text_with_colors(drawctx_t * ctx,float x,float y,int width,int align,const char * text)221 draw_text_with_colors (drawctx_t *ctx, float x, float y, int width, int align, const char *text) {
222     draw_init_font (ctx, 0, 0);
223     pango_layout_set_width (ctx->pangolayout, width*PANGO_SCALE);
224     pango_layout_set_alignment (ctx->pangolayout, get_pango_alignment (align));
225     pango_layout_set_text (ctx->pangolayout, text, -1);
226 //    gdk_draw_layout_with_colors (ctx->drawable, gc, x, y, ctx->pangolayout, &clrfg, &clrbg);
227     cairo_move_to (ctx->drawable, x, y);
228     pango_cairo_show_layout (ctx->drawable, ctx->pangolayout);
229 }
230 
231 void
draw_get_layout_extents(drawctx_t * ctx,int * w,int * h)232 draw_get_layout_extents (drawctx_t *ctx, int *w, int *h) {
233     PangoRectangle log;
234     pango_layout_get_pixel_extents (ctx->pangolayout, NULL, &log);
235     if (w) {
236         *w = log.width;
237     }
238     if (h) {
239         *h = log.height;
240     }
241 }
242 
243 void
draw_get_text_extents(drawctx_t * ctx,const char * text,int len,int * w,int * h)244 draw_get_text_extents (drawctx_t *ctx, const char *text, int len, int *w, int *h) {
245     draw_init_font (ctx, 0, 0);
246     pango_layout_set_width (ctx->pangolayout, -1);
247     pango_layout_set_alignment (ctx->pangolayout, PANGO_ALIGN_LEFT);
248     pango_layout_set_text (ctx->pangolayout, text, len);
249     draw_get_layout_extents (ctx, w, h);
250 }
251 
252 int
draw_get_listview_rowheight(drawctx_t * ctx)253 draw_get_listview_rowheight (drawctx_t *ctx) {
254     PangoFontDescription *font_desc = pango_font_description_copy (pango_layout_get_font_description (ctx->pangolayout));
255     PangoFontMetrics *metrics = pango_context_get_metrics (ctx->pangoctx,
256             font_desc,
257             pango_context_get_language (ctx->pangoctx));
258     int row_height = (pango_font_metrics_get_ascent (metrics) +
259             pango_font_metrics_get_descent (metrics));
260     pango_font_metrics_unref (metrics);
261     pango_font_description_free (font_desc);
262     return PANGO_PIXELS(row_height)+6;
263 }
264 
265 void
drawctx_init(drawctx_t * ctx)266 drawctx_init (drawctx_t *ctx) {
267     memset (ctx, 0, sizeof (drawctx_t));
268     ctx->font_weight = PANGO_WEIGHT_NORMAL;
269 }
270 
271 static GdkColor gtkui_bar_foreground_color;
272 static GdkColor gtkui_bar_background_color;
273 
274 static GdkColor gtkui_tabstrip_dark_color;
275 static GdkColor gtkui_tabstrip_mid_color;
276 static GdkColor gtkui_tabstrip_light_color;
277 static GdkColor gtkui_tabstrip_base_color;
278 static GdkColor gtkui_tabstrip_text_color;
279 static GdkColor gtkui_tabstrip_playing_text_color;
280 static GdkColor gtkui_tabstrip_selected_text_color;
281 
282 static GdkColor gtkui_listview_even_row_color;
283 static GdkColor gtkui_listview_odd_row_color;
284 static GdkColor gtkui_listview_selection_color;
285 static GdkColor gtkui_listview_text_color;
286 static GdkColor gtkui_listview_selected_text_color;
287 static GdkColor gtkui_listview_playing_text_color;
288 static GdkColor gtkui_listview_group_text_color;
289 static GdkColor gtkui_listview_column_text_color;
290 static GdkColor gtkui_listview_cursor_color;
291 
292 static int override_listview_colors = 0;
293 static int override_bar_colors = 0;
294 static int override_tabstrip_colors = 0;
295 
296 int
gtkui_override_listview_colors(void)297 gtkui_override_listview_colors (void) {
298     return override_listview_colors;
299 }
300 
301 int
gtkui_override_bar_colors(void)302 gtkui_override_bar_colors (void) {
303     return override_bar_colors;
304 }
305 
306 int
gtkui_override_tabstrip_colors(void)307 gtkui_override_tabstrip_colors (void) {
308     return override_tabstrip_colors;
309 }
310 
311 void
gtkui_init_theme_colors(void)312 gtkui_init_theme_colors (void) {
313     deadbeef->conf_lock ();
314     override_listview_colors= deadbeef->conf_get_int ("gtkui.override_listview_colors", 0);
315     override_bar_colors = deadbeef->conf_get_int ("gtkui.override_bar_colors", 0);
316     override_tabstrip_colors = deadbeef->conf_get_int ("gtkui.override_tabstrip_colors", 0);
317 
318     extern GtkWidget *mainwin;
319     GtkStyle *style = gtk_widget_get_style (mainwin);
320     char color_text[100];
321     const char *clr;
322     const char *font_name = pango_font_description_to_string (style->font_desc);
323 
324     if (!override_bar_colors) {
325         memcpy (&gtkui_bar_foreground_color, &style->base[GTK_STATE_SELECTED], sizeof (GdkColor));
326         memcpy (&gtkui_bar_background_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
327     }
328     else {
329         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->base[GTK_STATE_SELECTED].red, style->base[GTK_STATE_SELECTED].green, style->base[GTK_STATE_SELECTED].blue);
330         clr = deadbeef->conf_get_str_fast ("gtkui.color.bar_foreground", color_text);
331         sscanf (clr, "%hd %hd %hd", &gtkui_bar_foreground_color.red, &gtkui_bar_foreground_color.green, &gtkui_bar_foreground_color.blue);
332 
333         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_NORMAL].red, style->fg[GTK_STATE_NORMAL].green, style->fg[GTK_STATE_NORMAL].blue);
334         clr = deadbeef->conf_get_str_fast ("gtkui.color.bar_background", color_text);
335         sscanf (clr, "%hd %hd %hd", &gtkui_bar_background_color.red, &gtkui_bar_background_color.green, &gtkui_bar_background_color.blue);
336 
337     }
338 
339     if (!override_tabstrip_colors) {
340         memcpy (&gtkui_tabstrip_dark_color, &style->dark[GTK_STATE_NORMAL], sizeof (GdkColor));
341         memcpy (&gtkui_tabstrip_mid_color, &style->mid[GTK_STATE_NORMAL], sizeof (GdkColor));
342         memcpy (&gtkui_tabstrip_light_color, &style->light[GTK_STATE_NORMAL], sizeof (GdkColor));
343         memcpy (&gtkui_tabstrip_base_color, &style->bg[GTK_STATE_NORMAL], sizeof (GdkColor));
344         memcpy (&gtkui_tabstrip_text_color, &style->text[GTK_STATE_NORMAL], sizeof (GdkColor));
345         memcpy (&gtkui_tabstrip_playing_text_color, &style->text[GTK_STATE_NORMAL], sizeof (GdkColor));
346         memcpy (&gtkui_tabstrip_selected_text_color, &style->text[GTK_STATE_NORMAL], sizeof (GdkColor));
347         strncpy (gtkui_tabstrip_text_font, font_name, sizeof (gtkui_tabstrip_text_font));
348     }
349     else {
350         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->dark[GTK_STATE_NORMAL].red, style->dark[GTK_STATE_NORMAL].green, style->dark[GTK_STATE_NORMAL].blue);
351         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_dark", color_text);
352         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_dark_color.red, &gtkui_tabstrip_dark_color.green, &gtkui_tabstrip_dark_color.blue);
353 
354         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->mid[GTK_STATE_NORMAL].red, style->mid[GTK_STATE_NORMAL].green, style->mid[GTK_STATE_NORMAL].blue);
355         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_mid", color_text);
356         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_mid_color.red, &gtkui_tabstrip_mid_color.green, &gtkui_tabstrip_mid_color.blue);
357 
358         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->light[GTK_STATE_NORMAL].red, style->light[GTK_STATE_NORMAL].green, style->light[GTK_STATE_NORMAL].blue);
359         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_light", color_text);
360         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_light_color.red, &gtkui_tabstrip_light_color.green, &gtkui_tabstrip_light_color.blue);
361 
362         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->bg[GTK_STATE_NORMAL].red, style->bg[GTK_STATE_NORMAL].green, style->bg[GTK_STATE_NORMAL].blue);
363         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_base", color_text);
364         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_base_color.red, &gtkui_tabstrip_base_color.green, &gtkui_tabstrip_base_color.blue);
365 
366         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->text[GTK_STATE_NORMAL].red, style->text[GTK_STATE_NORMAL].green, style->text[GTK_STATE_NORMAL].blue);
367         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_text", color_text);
368         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_text_color.red, &gtkui_tabstrip_text_color.green, &gtkui_tabstrip_text_color.blue);
369 
370         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->text[GTK_STATE_NORMAL].red, style->text[GTK_STATE_NORMAL].green, style->text[GTK_STATE_NORMAL].blue);
371         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_playing_text", color_text);
372         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_playing_text_color.red, &gtkui_tabstrip_playing_text_color.green, &gtkui_tabstrip_playing_text_color.blue);
373 
374         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->text[GTK_STATE_NORMAL].red, style->text[GTK_STATE_NORMAL].green, style->text[GTK_STATE_NORMAL].blue);
375         clr = deadbeef->conf_get_str_fast ("gtkui.color.tabstrip_selected_text", color_text);
376         sscanf (clr, "%hd %hd %hd", &gtkui_tabstrip_selected_text_color.red, &gtkui_tabstrip_selected_text_color.green, &gtkui_tabstrip_selected_text_color.blue);
377 
378         strncpy (gtkui_tabstrip_text_font, deadbeef->conf_get_str_fast ("gtkui.font.tabstrip_text", font_name), sizeof (gtkui_tabstrip_text_font));
379     }
380 
381     if (!override_listview_colors) {
382         memcpy (&gtkui_listview_even_row_color, &style->light[GTK_STATE_NORMAL], sizeof (GdkColor));
383         memcpy (&gtkui_listview_odd_row_color, &style->mid[GTK_STATE_NORMAL], sizeof (GdkColor));
384         memcpy (&gtkui_listview_selection_color, &style->bg[GTK_STATE_SELECTED], sizeof (GdkColor));
385         memcpy (&gtkui_listview_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
386         memcpy (&gtkui_listview_selected_text_color, &style->fg[GTK_STATE_SELECTED], sizeof (GdkColor));
387         memcpy (&gtkui_listview_playing_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
388         memcpy (&gtkui_listview_group_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
389         memcpy (&gtkui_listview_column_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
390         memcpy (&gtkui_listview_cursor_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
391         strncpy (gtkui_listview_text_font, font_name, sizeof (gtkui_listview_text_font));
392         strncpy (gtkui_listview_group_text_font, font_name, sizeof (gtkui_listview_group_text_font));
393         strncpy (gtkui_listview_column_text_font, font_name, sizeof (gtkui_listview_column_text_font));
394     }
395     else {
396         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->light[GTK_STATE_NORMAL].red, style->light[GTK_STATE_NORMAL].green, style->light[GTK_STATE_NORMAL].blue);
397         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_even_row", color_text);
398         sscanf (clr, "%hd %hd %hd", &gtkui_listview_even_row_color.red, &gtkui_listview_even_row_color.green, &gtkui_listview_even_row_color.blue);
399 
400         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->mid[GTK_STATE_NORMAL].red, style->mid[GTK_STATE_NORMAL].green, style->mid[GTK_STATE_NORMAL].blue);
401         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_odd_row", color_text);
402         sscanf (clr, "%hd %hd %hd", &gtkui_listview_odd_row_color.red, &gtkui_listview_odd_row_color.green, &gtkui_listview_odd_row_color.blue);
403 
404         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->bg[GTK_STATE_SELECTED].red, style->bg[GTK_STATE_SELECTED].green, style->bg[GTK_STATE_SELECTED].blue);
405         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_selection", color_text);
406         sscanf (clr, "%hd %hd %hd", &gtkui_listview_selection_color.red, &gtkui_listview_selection_color.green, &gtkui_listview_selection_color.blue);
407 
408         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_NORMAL].red, style->fg[GTK_STATE_NORMAL].green, style->fg[GTK_STATE_NORMAL].blue);
409         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_text", color_text);
410         sscanf (clr, "%hd %hd %hd", &gtkui_listview_text_color.red, &gtkui_listview_text_color.green, &gtkui_listview_text_color.blue);
411 
412         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_SELECTED].red, style->fg[GTK_STATE_SELECTED].green, style->fg[GTK_STATE_SELECTED].blue);
413         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_selected_text", color_text);
414         sscanf (clr, "%hd %hd %hd", &gtkui_listview_selected_text_color.red, &gtkui_listview_selected_text_color.green, &gtkui_listview_selected_text_color.blue);
415 
416         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_NORMAL].red, style->fg[GTK_STATE_NORMAL].green, style->fg[GTK_STATE_NORMAL].blue);
417         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_playing_text", color_text);
418         sscanf (clr, "%hd %hd %hd", &gtkui_listview_playing_text_color.red, &gtkui_listview_playing_text_color.green, &gtkui_listview_playing_text_color.blue);
419 
420         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_NORMAL].red, style->fg[GTK_STATE_NORMAL].green, style->fg[GTK_STATE_NORMAL].blue);
421         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_group_text", color_text);
422         sscanf (clr, "%hd %hd %hd", &gtkui_listview_group_text_color.red, &gtkui_listview_group_text_color.green, &gtkui_listview_group_text_color.blue);
423 
424         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_NORMAL].red, style->fg[GTK_STATE_NORMAL].green, style->fg[GTK_STATE_NORMAL].blue);
425         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_column_text", color_text);
426         sscanf (clr, "%hd %hd %hd", &gtkui_listview_column_text_color.red, &gtkui_listview_column_text_color.green, &gtkui_listview_column_text_color.blue);
427 
428         snprintf (color_text, sizeof (color_text), "%hd %hd %hd", style->fg[GTK_STATE_SELECTED].red, style->fg[GTK_STATE_SELECTED].green, style->fg[GTK_STATE_SELECTED].blue);
429         clr = deadbeef->conf_get_str_fast ("gtkui.color.listview_cursor", color_text);
430         sscanf (clr, "%hd %hd %hd", &gtkui_listview_cursor_color.red, &gtkui_listview_cursor_color.green, &gtkui_listview_cursor_color.blue);
431 
432         strncpy (gtkui_listview_text_font, deadbeef->conf_get_str_fast ("gtkui.font.listview_text", font_name), sizeof (gtkui_listview_text_font));
433         strncpy (gtkui_listview_group_text_font, deadbeef->conf_get_str_fast ("gtkui.font.listview_group_text", font_name), sizeof (gtkui_listview_group_text_font));
434         strncpy (gtkui_listview_column_text_font, deadbeef->conf_get_str_fast ("gtkui.font.listview_column_text", font_name), sizeof (gtkui_listview_column_text_font));
435     }
436     deadbeef->conf_unlock ();
437 }
438 
439 void
gtkui_get_bar_foreground_color(GdkColor * clr)440 gtkui_get_bar_foreground_color (GdkColor *clr) {
441     memcpy (clr, &gtkui_bar_foreground_color, sizeof (GdkColor));
442 }
443 
444 void
gtkui_get_bar_background_color(GdkColor * clr)445 gtkui_get_bar_background_color (GdkColor *clr) {
446     memcpy (clr, &gtkui_bar_background_color, sizeof (GdkColor));
447 }
448 
449 void
gtkui_get_tabstrip_dark_color(GdkColor * clr)450 gtkui_get_tabstrip_dark_color (GdkColor *clr) {
451     memcpy (clr, &gtkui_tabstrip_dark_color, sizeof (GdkColor));
452 }
453 
454 void
gtkui_get_tabstrip_mid_color(GdkColor * clr)455 gtkui_get_tabstrip_mid_color (GdkColor *clr) {
456     memcpy (clr, &gtkui_tabstrip_mid_color, sizeof (GdkColor));
457 }
458 
459 void
gtkui_get_tabstrip_light_color(GdkColor * clr)460 gtkui_get_tabstrip_light_color (GdkColor *clr) {
461     memcpy (clr, &gtkui_tabstrip_light_color, sizeof (GdkColor));
462 }
463 
464 void
gtkui_get_tabstrip_base_color(GdkColor * clr)465 gtkui_get_tabstrip_base_color (GdkColor *clr) {
466     memcpy (clr, &gtkui_tabstrip_base_color, sizeof (GdkColor));
467 }
468 
469 void
gtkui_get_tabstrip_text_color(GdkColor * clr)470 gtkui_get_tabstrip_text_color (GdkColor *clr) {
471     memcpy (clr, &gtkui_tabstrip_text_color, sizeof (GdkColor));
472 }
473 
474 void
gtkui_get_tabstrip_playing_text_color(GdkColor * clr)475 gtkui_get_tabstrip_playing_text_color (GdkColor *clr) {
476     memcpy (clr, &gtkui_tabstrip_playing_text_color, sizeof (GdkColor));
477 }
478 
479 void
gtkui_get_tabstrip_selected_text_color(GdkColor * clr)480 gtkui_get_tabstrip_selected_text_color (GdkColor *clr) {
481     memcpy (clr, &gtkui_tabstrip_selected_text_color, sizeof (GdkColor));
482 }
483 
484 void
gtkui_get_listview_even_row_color(GdkColor * clr)485 gtkui_get_listview_even_row_color (GdkColor *clr) {
486     memcpy (clr, &gtkui_listview_even_row_color, sizeof (GdkColor));
487 }
488 
489 void
gtkui_get_listview_odd_row_color(GdkColor * clr)490 gtkui_get_listview_odd_row_color (GdkColor *clr) {
491     memcpy (clr, &gtkui_listview_odd_row_color, sizeof (GdkColor));
492 }
493 
494 void
gtkui_get_listview_selection_color(GdkColor * clr)495 gtkui_get_listview_selection_color (GdkColor *clr) {
496     memcpy (clr, &gtkui_listview_selection_color, sizeof (GdkColor));
497 }
498 
499 void
gtkui_get_listview_text_color(GdkColor * clr)500 gtkui_get_listview_text_color (GdkColor *clr) {
501     memcpy (clr, &gtkui_listview_text_color, sizeof (GdkColor));
502 }
503 
504 void
gtkui_get_listview_selected_text_color(GdkColor * clr)505 gtkui_get_listview_selected_text_color (GdkColor *clr) {
506     memcpy (clr, &gtkui_listview_selected_text_color, sizeof (GdkColor));
507 }
508 
509 void
gtkui_get_listview_playing_text_color(GdkColor * clr)510 gtkui_get_listview_playing_text_color (GdkColor *clr) {
511     memcpy (clr, &gtkui_listview_playing_text_color, sizeof (GdkColor));
512 }
513 
514 void
gtkui_get_listview_group_text_color(GdkColor * clr)515 gtkui_get_listview_group_text_color (GdkColor *clr) {
516     memcpy (clr, &gtkui_listview_group_text_color, sizeof (GdkColor));
517 }
518 
519 void
gtkui_get_listview_column_text_color(GdkColor * clr)520 gtkui_get_listview_column_text_color (GdkColor *clr) {
521     memcpy (clr, &gtkui_listview_column_text_color, sizeof (GdkColor));
522 }
523 
524 void
gtkui_get_listview_cursor_color(GdkColor * clr)525 gtkui_get_listview_cursor_color (GdkColor *clr) {
526     memcpy (clr, &gtkui_listview_cursor_color, sizeof (GdkColor));
527 }
528 
529 const char *
gtkui_get_listview_text_font()530 gtkui_get_listview_text_font () {
531     return gtkui_listview_text_font;
532 }
533 
534 const char *
gtkui_get_listview_group_text_font()535 gtkui_get_listview_group_text_font () {
536     return gtkui_listview_group_text_font;
537 }
538 
539 const char *
gtkui_get_listview_column_text_font()540 gtkui_get_listview_column_text_font () {
541     return gtkui_listview_column_text_font;
542 }
543 
544 const char *
gtkui_get_tabstrip_text_font()545 gtkui_get_tabstrip_text_font () {
546     return gtkui_tabstrip_text_font;
547 }
548