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 (>kui_bar_foreground_color, &style->base[GTK_STATE_SELECTED], sizeof (GdkColor));
326 memcpy (>kui_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", >kui_bar_foreground_color.red, >kui_bar_foreground_color.green, >kui_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", >kui_bar_background_color.red, >kui_bar_background_color.green, >kui_bar_background_color.blue);
336
337 }
338
339 if (!override_tabstrip_colors) {
340 memcpy (>kui_tabstrip_dark_color, &style->dark[GTK_STATE_NORMAL], sizeof (GdkColor));
341 memcpy (>kui_tabstrip_mid_color, &style->mid[GTK_STATE_NORMAL], sizeof (GdkColor));
342 memcpy (>kui_tabstrip_light_color, &style->light[GTK_STATE_NORMAL], sizeof (GdkColor));
343 memcpy (>kui_tabstrip_base_color, &style->bg[GTK_STATE_NORMAL], sizeof (GdkColor));
344 memcpy (>kui_tabstrip_text_color, &style->text[GTK_STATE_NORMAL], sizeof (GdkColor));
345 memcpy (>kui_tabstrip_playing_text_color, &style->text[GTK_STATE_NORMAL], sizeof (GdkColor));
346 memcpy (>kui_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", >kui_tabstrip_dark_color.red, >kui_tabstrip_dark_color.green, >kui_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", >kui_tabstrip_mid_color.red, >kui_tabstrip_mid_color.green, >kui_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", >kui_tabstrip_light_color.red, >kui_tabstrip_light_color.green, >kui_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", >kui_tabstrip_base_color.red, >kui_tabstrip_base_color.green, >kui_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", >kui_tabstrip_text_color.red, >kui_tabstrip_text_color.green, >kui_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", >kui_tabstrip_playing_text_color.red, >kui_tabstrip_playing_text_color.green, >kui_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", >kui_tabstrip_selected_text_color.red, >kui_tabstrip_selected_text_color.green, >kui_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 (>kui_listview_even_row_color, &style->light[GTK_STATE_NORMAL], sizeof (GdkColor));
383 memcpy (>kui_listview_odd_row_color, &style->mid[GTK_STATE_NORMAL], sizeof (GdkColor));
384 memcpy (>kui_listview_selection_color, &style->bg[GTK_STATE_SELECTED], sizeof (GdkColor));
385 memcpy (>kui_listview_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
386 memcpy (>kui_listview_selected_text_color, &style->fg[GTK_STATE_SELECTED], sizeof (GdkColor));
387 memcpy (>kui_listview_playing_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
388 memcpy (>kui_listview_group_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
389 memcpy (>kui_listview_column_text_color, &style->fg[GTK_STATE_NORMAL], sizeof (GdkColor));
390 memcpy (>kui_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", >kui_listview_even_row_color.red, >kui_listview_even_row_color.green, >kui_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", >kui_listview_odd_row_color.red, >kui_listview_odd_row_color.green, >kui_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", >kui_listview_selection_color.red, >kui_listview_selection_color.green, >kui_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", >kui_listview_text_color.red, >kui_listview_text_color.green, >kui_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", >kui_listview_selected_text_color.red, >kui_listview_selected_text_color.green, >kui_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", >kui_listview_playing_text_color.red, >kui_listview_playing_text_color.green, >kui_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", >kui_listview_group_text_color.red, >kui_listview_group_text_color.green, >kui_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", >kui_listview_column_text_color.red, >kui_listview_column_text_color.green, >kui_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", >kui_listview_cursor_color.red, >kui_listview_cursor_color.green, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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, >kui_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