gem-graph-client/libide/code/ide-source-style-scheme.c

118 lines
3.6 KiB
C

/* ide-source-style-scheme.c
*
* Copyright 2016-2019 Christian Hergert <chergert@redhat.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#define G_LOG_DOMAIN "ide-source-style-scheme"
#include "config.h"
#include <string.h>
#include "ide-source-style-scheme.h"
gboolean
ide_source_style_scheme_apply_style (GtkSourceStyleScheme *style_scheme,
const gchar *style_name,
GtkTextTag *tag)
{
g_autofree gchar *foreground = NULL;
g_autofree gchar *background = NULL;
g_autofree gchar *underline_color = NULL;
GdkRGBA underline_rgba;
GtkSourceStyle *style;
const gchar *colon;
PangoUnderline pango_underline;
gboolean foreground_set = FALSE;
gboolean background_set = FALSE;
gboolean bold = FALSE;
gboolean bold_set = FALSE;
gboolean underline_set = FALSE;
gboolean underline_color_set = FALSE;
gboolean italic = FALSE;
gboolean italic_set = FALSE;
g_return_val_if_fail (!style_scheme || GTK_SOURCE_IS_STYLE_SCHEME (style_scheme), FALSE);
g_return_val_if_fail (style_name != NULL, FALSE);
g_object_set (tag,
"foreground-set", FALSE,
"background-set", FALSE,
"weight-set", FALSE,
"underline-set", FALSE,
"underline-rgba-set", FALSE,
"style-set", FALSE,
NULL);
if (style_scheme == NULL)
return FALSE;
style = gtk_source_style_scheme_get_style (style_scheme, style_name);
if (style == NULL && (colon = strchr (style_name, ':')))
{
gchar defname[64];
g_snprintf (defname, sizeof defname, "def%s", colon);
style = gtk_source_style_scheme_get_style (style_scheme, defname);
}
if (style == NULL)
return FALSE;
g_object_get (style,
"background", &background,
"background-set", &background_set,
"foreground", &foreground,
"foreground-set", &foreground_set,
"bold", &bold,
"bold-set", &bold_set,
"pango-underline", &pango_underline,
"underline-set", &underline_set,
"underline-color", &underline_color,
"underline-color-set", &underline_color_set,
"italic", &italic,
"italic-set", &italic_set,
NULL);
if (background_set)
g_object_set (tag, "background", background, NULL);
if (foreground_set)
g_object_set (tag, "foreground", foreground, NULL);
if (bold_set && bold)
g_object_set (tag, "weight", PANGO_WEIGHT_BOLD, NULL);
if (italic_set && italic)
g_object_set (tag, "style", PANGO_STYLE_ITALIC, NULL);
if (underline_set)
g_object_set (tag, "underline", pango_underline, NULL);
if (underline_color_set && underline_color != NULL)
{
gdk_rgba_parse (&underline_rgba, underline_color);
g_object_set (tag,
"underline-rgba", &underline_rgba,
NULL);
}
return TRUE;
}