Gtk3: Convert GdkColor into GdkRGBA

Only gnc-dense-cal.[ch] is left untouched because it's use
of color is tightly coupled to the use of GtkStyle. This
latter needs conversion as well, but would be too much to
add in one commit.

Additionally the register code uses GtkStyle to extract
colors. This has been partially converted to using GdkRGBA
with the inconvenient side effect that depending on how
a color is retrieved it has to be freed with gdk_rgba_free
or not. This may be cleaned up later.
This commit is contained in:
Geert Janssens 2017-03-13 22:36:03 +01:00
parent f07ad114c4
commit e26480ccbb
15 changed files with 166 additions and 275 deletions

View File

@ -208,7 +208,7 @@ gnc_account_to_ui(AccountWindow *aw)
Account *account;
gnc_commodity * commodity;
const char *string;
GdkColor color;
GdkRGBA color;
gboolean flag, nonstd_scu;
gint index;
@ -230,9 +230,9 @@ gnc_account_to_ui(AccountWindow *aw)
string = xaccAccountGetColor (account);
if (string == NULL) string = "";
if (gdk_color_parse(string, &color))
if (gdk_rgba_parse(&color, string))
{
gtk_color_button_set_color(GTK_COLOR_BUTTON(aw->color_entry_button), &color);
gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(aw->color_entry_button), &color);
}
commodity = xaccAccountGetCommodity (account);
@ -337,7 +337,7 @@ gnc_ui_to_account(AccountWindow *aw)
Account *parent_account;
const char *old_string;
const char *string;
GdkColor color;
GdkRGBA color;
gboolean flag;
gnc_numeric balance;
gboolean use_equity, nonstd;
@ -376,8 +376,8 @@ gnc_ui_to_account(AccountWindow *aw)
if (g_strcmp0 (string, old_string) != 0)
xaccAccountSetDescription (account, string);
gtk_color_button_get_color(GTK_COLOR_BUTTON(aw->color_entry_button), &color );
string = gdk_color_to_string(&color);
gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(aw->color_entry_button), &color );
string = gdk_rgba_to_string(&color);
if (g_strcmp0 (string, DEFAULT_COLOR) == 0)
string = "Not Set";
@ -1219,11 +1219,11 @@ gnc_account_name_changed_cb(GtkWidget *widget, gpointer data)
void
gnc_account_color_default_cb(GtkWidget *widget, gpointer data)
{
GdkColor color;
GdkRGBA color;
AccountWindow *aw = data;
gdk_color_parse( DEFAULT_COLOR, &color);
gtk_color_button_set_color(GTK_COLOR_BUTTON(aw->color_entry_button), &color);
gdk_rgba_parse(&color, DEFAULT_COLOR);
gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(aw->color_entry_button), &color);
}

View File

@ -133,18 +133,6 @@ gnc_option_get_gtk_widget (GNCOption *option)
return (GtkWidget *)gnc_option_get_widget(option);
}
static inline gint
color_d_to_i16 (double d)
{
return (d * 0xFFFF);
}
static inline double
color_i16_to_d (gint i16)
{
return ((double)i16 / 0xFFFF);
}
static void
gnc_options_dialog_changed_internal (GtkWidget *widget, gboolean sensitive)
{
@ -2917,22 +2905,19 @@ static gboolean
gnc_option_set_ui_value_color (GNCOption *option, gboolean use_default,
GtkWidget *widget, SCM value)
{
gdouble red, green, blue, alpha;
GdkRGBA color;
if (gnc_option_get_color_info(option, use_default,
&red, &green, &blue, &alpha))
&color.red, &color.green,
&color.blue, &color.alpha))
{
GtkColorButton *color_button;
GdkColor color;
GtkColorChooser *color_button;
DEBUG("red %f, green %f, blue %f, alpha %f", red, green, blue, alpha);
color_button = GTK_COLOR_BUTTON(widget);
DEBUG("red %f, green %f, blue %f, alpha %f",
color.red, color.green, color.blue, color.alpha);
color_button = GTK_COLOR_CHOOSER(widget);
color.red = color_d_to_i16(red);
color.green = color_d_to_i16(green);
color.blue = color_d_to_i16(blue);
gtk_color_button_set_color(color_button, &color);
gtk_color_button_set_alpha(color_button, color_d_to_i16(alpha));
gtk_color_chooser_set_rgba(color_button, &color);
return FALSE;
}
@ -3488,28 +3473,23 @@ static SCM
gnc_option_get_ui_value_color (GNCOption *option, GtkWidget *widget)
{
SCM result;
GtkColorButton *color_button;
GdkColor color;
gdouble red, green, blue, alpha;
GtkColorChooser *color_button;
GdkRGBA color;
gdouble scale;
ENTER("option %p(%s), widget %p",
option, gnc_option_name(option), widget);
color_button = GTK_COLOR_BUTTON(widget);
gtk_color_button_get_color(color_button, &color);
red = color_i16_to_d(color.red);
green = color_i16_to_d(color.green);
blue = color_i16_to_d(color.blue);
alpha = color_i16_to_d(gtk_color_button_get_alpha(color_button));
color_button = GTK_COLOR_CHOOSER(widget);
gtk_color_chooser_get_rgba(color_button, &color);
scale = gnc_option_color_range(option);
result = SCM_EOL;
result = scm_cons(scm_from_double (alpha * scale), result);
result = scm_cons(scm_from_double (blue * scale), result);
result = scm_cons(scm_from_double (green * scale), result);
result = scm_cons(scm_from_double (red * scale), result);
result = scm_cons(scm_from_double (color.alpha * scale), result);
result = scm_cons(scm_from_double (color.blue * scale), result);
result = scm_cons(scm_from_double (color.green * scale), result);
result = scm_cons(scm_from_double (color.red * scale), result);
return result;
}

View File

@ -346,39 +346,33 @@ gnc_dense_cal_init(GncDenseCal *dcal)
gtk_widget_realize(GTK_WIDGET(dcal->transPopup));
}
gdk_color_parse(MONTH_THIS_COLOR, &dcal->weekColors[MONTH_THIS]);
gdk_color_parse(MONTH_THAT_COLOR, &dcal->weekColors[MONTH_THAT]);
gdk_rgba_parse(&dcal->weekColors[MONTH_THIS], MONTH_THIS_COLOR);
gdk_rgba_parse(&dcal->weekColors[MONTH_THAT], MONTH_THAT_COLOR);
/* success array must be as big as number of colors */
g_assert(MAX_COLORS == (sizeof(colorAllocSuccess)/sizeof(gboolean)));
if (gdk_colormap_alloc_colors(gdk_colormap_get_system(),
dcal->weekColors,
MAX_COLORS, TRUE, TRUE,
colorAllocSuccess) > 0)
{
g_error("error allocating colors");
}
/* Deal with the various label sizes. */
{
gint i;
gint maxWidth, maxHeight;
GtkStyle *style;
PangoLayout *layout;
PangoFontDescription *font_desc;
gint font_size;
gint font_size_reduction_units = 1;
GtkStyleContext *stylectxt;
GtkStateFlags state_flags;
layout = gtk_widget_create_pango_layout(GTK_WIDGET(dcal), NULL);
style = gtk_widget_get_style(GTK_WIDGET(dcal));
font_desc = pango_font_description_copy(style->font_desc);
stylectxt = gtk_widget_get_style_context (GTK_WIDGET(dcal));
state_flags = gtk_style_context_get_state (stylectxt);
gtk_style_context_get (stylectxt, state_flags,
GTK_STYLE_PROPERTY_FONT, &font_desc, NULL);
font_size = pango_font_description_get_size(font_desc);
font_size -= font_size_reduction_units * PANGO_SCALE;
pango_font_description_set_size(font_desc, font_size);
gtk_widget_modify_font(GTK_WIDGET(dcal), font_desc);
gtk_widget_override_font(GTK_WIDGET(dcal), font_desc);
pango_font_description_free(font_desc);
maxWidth = maxHeight = 0;
@ -707,10 +701,6 @@ gnc_dense_cal_realize (GtkWidget *widget, gpointer user_data)
recompute_x_y_scales(dcal);
gdc_reconfig(dcal);
gtk_style_set_background(gtk_widget_get_style (widget),
gtk_widget_get_window (widget),
GTK_STATE_ACTIVE);
}
static void
@ -887,8 +877,10 @@ static void
gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
{
GtkWidget *widget;
GtkStyleContext *stylectxt;
GtkStateFlags state_flags;
GtkAllocation alloc;
GdkColor color;
GdkRGBA color;
gint i;
int maxWidth;
PangoLayout *layout;
@ -908,10 +900,10 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
LOG_AND_RESET(timer, "create_pango_layout");
gtk_widget_get_allocation (GTK_WIDGET(dcal->cal_drawing_area), &alloc);
color = gtk_widget_get_style (widget)->white;
cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
stylectxt = gtk_widget_get_style_context (widget);
state_flags = gtk_style_context_get_state (stylectxt);
gtk_style_context_get_background_color (stylectxt, state_flags, &color);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_rectangle (cr, 0, 0,
cairo_image_surface_get_width (dcal->surface),
cairo_image_surface_get_height (dcal->surface));
@ -942,9 +934,7 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
{
rect = (GdkRectangle*)mcListIter->data;
color = dcal->weekColors[ i % 2 ];
cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_rectangle (cr, rect->x, rect->y,
rect->width, rect->height);
cairo_fill (cr);
@ -960,11 +950,8 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
int i;
int x1, x2, y1, y2;
gdk_color_parse(MARK_COLOR, &color);
gdk_colormap_alloc_color(gdk_colormap_get_system(), &color, TRUE, TRUE);
cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
gdk_rgba_parse(&color, MARK_COLOR);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
for (i = 0; i < dcal->numMarks; i++)
{
@ -1000,11 +987,9 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
h = col_height(dcal);
/* draw the outside border [inside the month labels] */
color = gtk_widget_get_style (widget)->fg[gtk_widget_get_state (widget)];
gtk_style_context_get_border_color (stylectxt, state_flags, &color);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_set_line_width (cr, 1);
cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
cairo_rectangle (cr, x + 0.5, y + 0.5, w, h);
cairo_stroke (cr);
@ -1048,10 +1033,8 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
- (day_label_width / 2);
label_y_offset = y - dcal->dayLabelHeight;
pango_layout_set_text(layout, day_label_str, -1);
color = gtk_widget_get_style (widget)->text[gtk_widget_get_state (widget)];
cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
gtk_style_context_get_color (stylectxt, state_flags, &color);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_move_to (cr, label_x_offset, label_y_offset);
pango_cairo_show_layout (cr, layout);
}

View File

@ -84,7 +84,7 @@ struct _GncDenseCal
gdc_month_coords monthPositions[12];
GdkColor weekColors[MAX_COLORS];
GdkRGBA weekColors[MAX_COLORS];
guint label_width;
guint label_height;

View File

@ -35,6 +35,7 @@
#include "config.h"
#include <glib/gi18n.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include "gnc-plugin.h"
@ -2259,7 +2260,7 @@ main_window_update_page_color (GncPluginPage *page,
GncMainWindow *window;
GncMainWindowPrivate *priv;
GtkWidget *tab_widget;
GdkColor tab_color;
GdkRGBA tab_color;
gchar *color_string = NULL;
gboolean want_color = FALSE;
@ -2281,7 +2282,7 @@ main_window_update_page_color (GncPluginPage *page,
main_window_find_tab_widget (window, page, &tab_widget);
priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
if (want_color && gdk_color_parse(color_string, &tab_color) && priv->show_color_tabs)
if (want_color && gdk_rgba_parse(&tab_color, color_string) && priv->show_color_tabs)
{
if (!GTK_IS_EVENT_BOX (tab_widget))
{
@ -2293,8 +2294,8 @@ main_window_update_page_color (GncPluginPage *page,
g_object_unref (tab_widget);
tab_widget = event_box;
}
gtk_widget_modify_bg(tab_widget, GTK_STATE_NORMAL, &tab_color);
gtk_widget_modify_bg(tab_widget, GTK_STATE_ACTIVE, &tab_color);
gtk_widget_override_background_color (tab_widget, GTK_STATE_NORMAL, &tab_color);
gtk_widget_override_background_color (tab_widget, GTK_STATE_ACTIVE, &tab_color);
}
else
{
@ -2856,7 +2857,6 @@ gnc_main_window_open_page (GncMainWindow *window,
GtkWidget *image;
GList *tmp;
gint width;
GdkColor tab_color;
ENTER("window %p, page %p", window, page);
if (window)

View File

@ -600,7 +600,7 @@ acc_color_data_func (GtkTreeViewColumn *col,
GncTreeViewAccountPrivate *priv;
gchar *acc_color = NULL, *acc_cond_color = NULL;
gchar *item;
GdkColor color;
GdkRGBA color;
gchar *column_name;
GList *renderers;
@ -616,7 +616,7 @@ acc_color_data_func (GtkTreeViewColumn *col,
g_free (item);
/* Test if the color string represents a valid color */
if (acc_color && (!gdk_color_parse(acc_color, &color)))
if (acc_color && (!gdk_rgba_parse(&color, acc_color)))
{
g_free (acc_color);
acc_color = NULL;

View File

@ -5779,7 +5779,7 @@ gtv_sr_editable_start_editing_cb (GtkCellRenderer *cr, GtkCellEditable *editable
/* Lets change the background of the entry widgets */
{
GdkColor color;
GdkRGBA color;
const gchar *row_color;
gboolean is_trow1 = FALSE;
gboolean is_trow2 = FALSE;
@ -5794,10 +5794,10 @@ gtv_sr_editable_start_editing_cb (GtkCellRenderer *cr, GtkCellEditable *editable
row_color = gnc_tree_model_split_reg_get_row_color (model, is_trow1, is_trow2, is_split, indices[0]);
if (gdk_color_parse (row_color, &color))
if (gdk_rgba_parse (&color, row_color))
{
if (entry != NULL)
gtk_widget_modify_base (GTK_WIDGET (entry), GTK_STATE_NORMAL, &color);
gtk_widget_override_background_color (GTK_WIDGET (entry), GTK_STATE_FLAG_NORMAL, &color);
}
}

View File

@ -179,7 +179,7 @@ csv_account_import (CsvImportInfo *info)
QofBook *book;
Account *acc, *parent, *root;
gboolean valid;
GdkColor testcolor;
GdkRGBA testcolor;
GtkTreeIter iter;
gchar *type, *full_name, *name, *code, *description, *color;
gchar *notes, *commoditym, *commodityn, *hidden, *tax, *place_holder;
@ -271,7 +271,7 @@ csv_account_import (CsvImportInfo *info)
if (g_strcmp0 (color, "") != 0)
{
if (gdk_color_parse (color, &testcolor))
if (gdk_rgba_parse (&testcolor, color))
xaccAccountSetColor (acc, color);
}
@ -311,7 +311,7 @@ csv_account_import (CsvImportInfo *info)
info->num_updates = info->num_updates + 1;
if (g_strcmp0 (color, "") != 0)
{
if (gdk_color_parse (color, &testcolor))
if (gdk_rgba_parse (&testcolor, color))
xaccAccountSetColor (acc, color);
}

View File

@ -57,9 +57,9 @@ struct _main_matcher_info
GtkWidget *assistant;
GtkTreeView *view;
GNCImportSettings *user_settings;
GdkColor color_back_red;
GdkColor color_back_green;
GdkColor color_back_yellow;
GdkRGBA color_back_red;
GdkRGBA color_back_green;
GdkRGBA color_back_yellow;
int selected_row;
GNCTransactionProcessedCB transaction_processed_cb;
gpointer user_data;
@ -215,11 +215,14 @@ on_matcher_help_clicked (GtkButton *button, gpointer user_data)
gnc_builder_add_from_file (builder, "dialog-import.glade", "matcher_help");
box = GTK_WIDGET(gtk_builder_get_object (builder, "red"));
gtk_widget_modify_bg(box, GTK_STATE_NORMAL, &info->color_back_red);
gtk_widget_override_background_color(box, GTK_STATE_FLAG_NORMAL,
&info->color_back_red);
box = GTK_WIDGET(gtk_builder_get_object (builder, "yellow"));
gtk_widget_modify_bg(box, GTK_STATE_NORMAL, &info->color_back_yellow);
gtk_widget_override_background_color(box, GTK_STATE_FLAG_NORMAL,
&info->color_back_yellow);
box = GTK_WIDGET(gtk_builder_get_object (builder, "green"));
gtk_widget_modify_bg(box, GTK_STATE_NORMAL, &info->color_back_green);
gtk_widget_override_background_color(box, GTK_STATE_FLAG_NORMAL,
&info->color_back_green);
help_dialog = GTK_WIDGET(gtk_builder_get_object (builder, "matcher_help"));
gtk_window_set_transient_for(GTK_WINDOW(help_dialog),
@ -546,9 +549,9 @@ GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
GTK_WINDOW (parent));*/
/*Initialise the colors */
gdk_color_parse(COLOR_RED, &info->color_back_red);
gdk_color_parse(COLOR_YELLOW, &info->color_back_yellow);
gdk_color_parse(COLOR_GREEN, &info->color_back_green);
gdk_rgba_parse(&info->color_back_red, COLOR_RED);
gdk_rgba_parse(&info->color_back_yellow, COLOR_YELLOW);
gdk_rgba_parse(&info->color_back_green, COLOR_GREEN);
if (heading)
gtk_label_set_text (GTK_LABEL (heading_label), heading);
@ -608,9 +611,9 @@ GNCImportMainMatcher * gnc_gen_trans_assist_new (GtkWidget *parent,
g_assert (heading_label != NULL);
/*Initialise the colors */
gdk_color_parse(COLOR_RED, &info->color_back_red);
gdk_color_parse(COLOR_YELLOW, &info->color_back_yellow);
gdk_color_parse(COLOR_GREEN, &info->color_back_green);
gdk_rgba_parse(&info->color_back_red, COLOR_RED);
gdk_rgba_parse(&info->color_back_yellow, COLOR_YELLOW);
gdk_rgba_parse(&info->color_back_green, COLOR_GREEN);
if (heading)
gtk_label_set_text (GTK_LABEL (heading_label), heading);

View File

@ -38,15 +38,14 @@
#include <config.h>
#endif
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include "gnucash-color.h"
static int color_inited;
/* Public Colors */
GdkColor gn_white, gn_black, gn_light_gray;
GdkColor gn_dark_gray, gn_blue, gn_red, gn_yellow;
GdkRGBA gn_white, gn_black, gn_light_gray;
GdkRGBA gn_dark_gray, gn_blue, gn_red, gn_yellow;
static GHashTable *color_hash_table = NULL;
@ -69,61 +68,14 @@ color_equal (gconstpointer v, gconstpointer w)
}
gulong
gnucash_color_alloc (gushort red, gushort green, gushort blue)
{
GdkColormap *colormap = gtk_widget_get_default_colormap ();
GdkColor *c;
if (!color_inited)
gnucash_color_init ();
c = g_new0 (GdkColor, 1);
c->red = red;
c->green = green;
c->blue = blue;
g_return_val_if_fail (gdk_colormap_alloc_color (colormap, c, FALSE, TRUE), 0);
return c->pixel;
}
void
gnucash_color_alloc_gdk (GdkColor *c)
{
GdkColormap *colormap = gtk_widget_get_default_colormap ();
g_return_if_fail (c != NULL);
g_assert (gdk_colormap_alloc_color (colormap, c,
FALSE, TRUE));
}
void
gnucash_color_alloc_name (const char *name, GdkColor *c)
{
GdkColormap *colormap = gtk_widget_get_default_colormap ();
g_return_if_fail (name != NULL);
g_return_if_fail (c != NULL);
gdk_color_parse (name, c);
c->pixel = 0;
g_assert (gdk_colormap_alloc_color (colormap, c,
FALSE, TRUE));
}
/* This function takes an argb spec for a color and returns an
* allocated GdkColor. We take care of allocating and managing
* allocated GdkRGBA. We take care of allocating and managing
* the colors. Caller must not touch the returned color.
*/
GdkColor *
GdkRGBA *
gnucash_color_argb_to_gdk (guint32 argb)
{
GdkColor *color;
GdkRGBA *color;
const guint32 key = argb;
guint32 *newkey;
@ -132,16 +84,15 @@ gnucash_color_argb_to_gdk (guint32 argb)
if (color)
return color;
color = g_new0(GdkColor, 1);
color = g_new0(GdkRGBA, 1);
newkey = g_new0(guint32, 1);
*newkey = key;
color->red = (argb & 0xff0000) >> 8;
color->green = argb & 0xff00;
color->blue = (argb & 0xff) << 8;
gnucash_color_alloc_gdk(color);
color->red = ((argb & 0xff0000) >> 8)/ 65535.0;
color->green = (argb & 0xff00) / 65535.0;
color->blue = ((argb & 0xff) << 8) / 65535.0;
color->alpha = 1.0;
g_hash_table_insert (color_hash_table, newkey, color);
@ -153,14 +104,14 @@ void
gnucash_color_init (void)
{
/* Allocate the default colors */
gnucash_color_alloc_name ("white", &gn_white);
gnucash_color_alloc_name ("black", &gn_black);
gdk_rgba_parse (&gn_white, "white");
gdk_rgba_parse (&gn_black, "black");
gnucash_color_alloc_name ("gray60", &gn_light_gray);
gnucash_color_alloc_name ("gray40", &gn_dark_gray);
gnucash_color_alloc_name ("blue", &gn_blue);
gnucash_color_alloc_name ("red", &gn_red);
gnucash_color_alloc_name ("yellow", &gn_yellow);
gdk_rgba_parse (&gn_light_gray, "gray60");
gdk_rgba_parse (&gn_dark_gray, "gray40");
gdk_rgba_parse (&gn_blue, "blue");
gdk_rgba_parse (&gn_red, "red");
gdk_rgba_parse (&gn_yellow, "yellow");
if (!color_hash_table)
color_hash_table = g_hash_table_new (color_hash, color_equal);
@ -168,15 +119,4 @@ gnucash_color_init (void)
color_inited = 1;
}
void
to_cairo_rgb (GdkColor *gdk_col, cairo_rgb *c_col)
{
g_return_if_fail(gdk_col != NULL);
g_return_if_fail(c_col != NULL);
c_col->red = gdk_col->red / 65535.0;
c_col->green = gdk_col->green / 65535.0;
c_col->blue = gdk_col->blue / 65535.0;
}

View File

@ -30,27 +30,14 @@
* @{
*/
/** @file gnucash-color.h
* @brief Wrap GdkColor for use in Register Gnome classes.
* @brief Convenience wrapper around GdkRGBA for use in Register Gnome classes.
*/
void gnucash_color_init (void);
/** Return the pixel value for the given red, green and blue */
gulong gnucash_color_alloc (gushort red, gushort green, gushort blue);
void gnucash_color_alloc_name (const char *name, GdkColor *color);
void gnucash_color_alloc_gdk (GdkColor *color);
GdkColor *gnucash_color_argb_to_gdk (guint32 argb);
GdkRGBA *gnucash_color_argb_to_gdk (guint32 argb);
typedef struct
{
double red;
double green;
double blue;
} cairo_rgb;
void to_cairo_rgb (GdkColor *gdk_col, cairo_rgb *c_col);
extern GdkColor gn_white, gn_light_gray, gn_dark_gray;
extern GdkColor gn_black, gn_blue, gn_red, gn_yellow;
extern GdkRGBA gn_white, gn_light_gray, gn_dark_gray;
extern GdkRGBA gn_black, gn_blue, gn_red, gn_yellow;
/** @} */
#endif /* GNUCASH_COLOR_H */

View File

@ -66,8 +66,7 @@ gnc_header_draw_offscreen (GncHeader *header)
Table *table = header->sheet->table;
VirtualLocation virt_loc;
VirtualCell *vcell;
GdkColor *gdk_bg_col, *gdk_fg_col;
cairo_rgb fg_color, bg_color;
GdkRGBA *fg_color, *bg_color;
int row_offset;
CellBlock *cb;
int i;
@ -82,22 +81,19 @@ gnc_header_draw_offscreen (GncHeader *header)
{
guint32 color_type;
color_type = gnc_table_get_gtkrc_bg_color (table, virt_loc, NULL);
gdk_bg_col = get_gtkrc_color(header->sheet, color_type);
bg_color = get_gtkrc_color(header->sheet, color_type);
color_type = gnc_table_get_gtkrc_fg_color (table, virt_loc);
gdk_fg_col = get_gtkrc_color(header->sheet, color_type);
fg_color = get_gtkrc_color(header->sheet, color_type);
}
else
{
guint32 argb;
argb = gnc_table_get_bg_color (table, virt_loc, NULL);
gdk_bg_col = gnucash_color_argb_to_gdk (argb);
bg_color = gnucash_color_argb_to_gdk (argb);
argb = gnc_table_get_fg_color (table, virt_loc);
gdk_fg_col = gnucash_color_argb_to_gdk (argb);
fg_color = gnucash_color_argb_to_gdk (argb);
}
to_cairo_rgb(gdk_fg_col, &fg_color);
to_cairo_rgb(gdk_bg_col, &bg_color);
if (header->surface)
cairo_surface_destroy (header->surface);
header->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
@ -106,9 +102,9 @@ gnc_header_draw_offscreen (GncHeader *header)
cr = cairo_create (header->surface);
cairo_rectangle (cr, 0.5, 0.5, header->width - 1.0, header->height - 1.0);
cairo_set_source_rgb (cr, bg_color.red, bg_color.green, bg_color.blue);
cairo_set_source_rgb (cr, bg_color->red, bg_color->green, bg_color->blue);
cairo_fill_preserve (cr);
cairo_set_source_rgb (cr, fg_color.red, fg_color.green, fg_color.blue);
cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
cairo_set_line_width (cr, 1.0);
cairo_stroke (cr);
// cairo_set_line_width (cr, 1.0);
@ -200,6 +196,11 @@ gnc_header_draw_offscreen (GncHeader *header)
row_offset += h;
}
if (header->sheet->use_theme_colors)
{
gdk_rgba_free(bg_color);
gdk_rgba_free(fg_color);
}
cairo_destroy (cr);
}

View File

@ -283,34 +283,34 @@ static guint32 dec_intensity_10percent(guint32 argb)
/* Actual drawing routines */
G_INLINE_FUNC void
draw_cell_line (cairo_t *cr, cairo_rgb *bg_color,
draw_cell_line (cairo_t *cr, GdkRGBA *bg_color,
double x1, double y1, double x2, double y2,
PhysicalCellBorderLineStyle style);
void
draw_cell_line (cairo_t *cr, cairo_rgb *bg_color,
draw_cell_line (cairo_t *cr, GdkRGBA *bg_color,
double x1, double y1, double x2, double y2,
PhysicalCellBorderLineStyle style)
{
cairo_rgb fg_color;
GdkRGBA *fg_color;
switch (style)
{
case CELL_BORDER_LINE_NONE:
fg_color = *bg_color;
fg_color = bg_color;
break;
case CELL_BORDER_LINE_LIGHT:
to_cairo_rgb (&gn_light_gray, &fg_color);
fg_color = &gn_light_gray;
break;
case CELL_BORDER_LINE_NORMAL:
case CELL_BORDER_LINE_HEAVY:
to_cairo_rgb (&gn_black, &fg_color);
fg_color = &gn_black;
break;
case CELL_BORDER_LINE_HIGHLIGHT:
to_cairo_rgb (&gn_red, &fg_color);
fg_color = &gn_red;
break;
default:
@ -318,7 +318,7 @@ draw_cell_line (cairo_t *cr, cairo_rgb *bg_color,
}
cairo_set_line_width (cr, 1.0);
cairo_set_source_rgb (cr, fg_color.red, fg_color.green, fg_color.blue);
cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
cairo_move_to (cr, x1, y1);
cairo_line_to (cr, x2, y2);
cairo_stroke (cr);
@ -328,14 +328,14 @@ static void
draw_hatching (cairo_t *cr,
double x, double y, G_GNUC_UNUSED double width, double height)
{
cairo_rgb fg_color;
GdkRGBA *fg_color;
double h_x = x + 2.5;
double h_y = y + 2.5;
double h_size = height / 3 - 1;
cairo_set_line_width (cr, 1.0);
to_cairo_rgb(&gn_light_gray, &fg_color);
cairo_set_source_rgb (cr, fg_color.red, fg_color.green, fg_color.blue);
fg_color = &gn_light_gray;
cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
cairo_rectangle (cr, h_x, h_y, h_size, h_size);
@ -349,7 +349,7 @@ draw_hatching (cairo_t *cr,
static void
draw_divider_line (cairo_t *cr, VirtualLocation virt_loc,
int div_row, int n_phys_rows, cairo_rgb *fg_color,
int div_row, int n_phys_rows, GdkRGBA *fg_color,
double x, double y, double width, double height)
{
double offset;
@ -389,8 +389,7 @@ draw_cell (GnucashSheet *sheet,
PangoContext *context;
PangoFontDescription *font;
PangoRectangle logical_rect;
GdkColor *gdk_bg_color, *gdk_fg_color;
cairo_rgb bg_color, fg_color;
GdkRGBA *bg_color, *fg_color;
GdkRectangle rect;
gboolean hatching;
guint32 argb, color_type;
@ -400,7 +399,7 @@ draw_cell (GnucashSheet *sheet,
{
color_type = gnc_table_get_gtkrc_bg_color (table, virt_loc,
&hatching);
gdk_bg_color = get_gtkrc_color(sheet, color_type);
bg_color = get_gtkrc_color(sheet, color_type);
}
else
{
@ -412,18 +411,17 @@ draw_cell (GnucashSheet *sheet,
{
argb = dec_intensity_10percent(argb);
}
gdk_bg_color = gnucash_color_argb_to_gdk (argb);
bg_color = gnucash_color_argb_to_gdk (argb);
}
to_cairo_rgb(gdk_bg_color, &bg_color);
cairo_set_source_rgb (cr, bg_color.red, bg_color.green, bg_color.blue);
cairo_set_source_rgb (cr, bg_color->red, bg_color->green, bg_color->blue);
cairo_rectangle (cr, x, y, width, height);
cairo_fill (cr);
get_cell_borders (sheet, virt_loc, &borders);
/* top */
draw_cell_line (cr, &bg_color,
draw_cell_line (cr, bg_color,
(borders.top >= borders.left ? x : x + 1.0),
y + 0.5,
(borders.top >= borders.right ?
@ -432,7 +430,7 @@ draw_cell (GnucashSheet *sheet,
borders.top);
/* bottom */
draw_cell_line (cr, &bg_color,
draw_cell_line (cr, bg_color,
(borders.bottom >= borders.left ? x : x + 1),
y + height + 0.5,
(borders.bottom >= borders.right ?
@ -441,7 +439,7 @@ draw_cell (GnucashSheet *sheet,
borders.bottom);
/* left */
draw_cell_line (cr, &bg_color,
draw_cell_line (cr, bg_color,
x + 0.5,
(borders.left > borders.top ? y : y + 1),
x + 0.5,
@ -450,7 +448,7 @@ draw_cell (GnucashSheet *sheet,
borders.left);
/* right */
draw_cell_line (cr, &bg_color,
draw_cell_line (cr, bg_color,
x + width + 0.5,
(borders.right > borders.top ? y : y + 1),
x + width + 0.5,
@ -463,21 +461,21 @@ draw_cell (GnucashSheet *sheet,
x, y, width, height);
/* dividing line upper (red) */
to_cairo_rgb (&gn_red, &fg_color);
fg_color = &gn_red;
draw_divider_line(cr, virt_loc,
table->model->dividing_row_upper, block->style->nrows,
&fg_color, x, y, width, height);
fg_color, x, y, width, height);
/* dividing line (blue) */
to_cairo_rgb (&gn_blue, &fg_color);
fg_color = &gn_blue;
draw_divider_line(cr, virt_loc,
table->model->dividing_row, block->style->nrows,
&fg_color, x, y, width, height);
fg_color, x, y, width, height);
/* dividing line lower (blue) */
draw_divider_line(cr, virt_loc,
table->model->dividing_row_lower, block->style->nrows,
&fg_color, x, y, width, height);
fg_color, x, y, width, height);
text = gnc_table_get_entry (table, virt_loc);
@ -490,7 +488,7 @@ draw_cell (GnucashSheet *sheet,
if (sheet->use_theme_colors)
{
color_type = gnc_table_get_gtkrc_fg_color (table, virt_loc);
gdk_fg_color = get_gtkrc_color(sheet, color_type);
fg_color = get_gtkrc_color(sheet, color_type);
}
else
{
@ -504,11 +502,9 @@ draw_cell (GnucashSheet *sheet,
argb = inc_intensity_10percent(argb);
}
#endif
gdk_fg_color = gnucash_color_argb_to_gdk (argb);
fg_color = gnucash_color_argb_to_gdk (argb);
}
to_cairo_rgb (gdk_fg_color, &fg_color);
/* If this is the currently open transaction and
there is no text in this cell */
if ((table->current_cursor_loc.vcell_loc.virt_row ==
@ -518,12 +514,12 @@ draw_cell (GnucashSheet *sheet,
text = gnc_table_get_label (table, virt_loc);
if ((text == NULL) || (*text == '\0'))
goto exit;
to_cairo_rgb (&gn_light_gray, &fg_color);
fg_color = &gn_light_gray;
pango_layout_set_text (layout, text, strlen (text));
pango_font_description_set_style (font, PANGO_STYLE_ITALIC);
pango_context_set_font_description (context, font);
}
cairo_set_source_rgb (cr, fg_color.red, fg_color.green, fg_color.blue);
cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
if ((text == NULL) || (*text == '\0'))
{
@ -575,6 +571,12 @@ exit:
pango_context_set_font_description (context, font);
pango_font_description_free (font);
g_object_unref (layout);
if (sheet->use_theme_colors)
{
gdk_rgba_free(bg_color);
gdk_rgba_free(fg_color);
}
}
static void
@ -680,9 +682,9 @@ void
gnucash_sheet_draw_cursor (GnucashCursor *cursor, cairo_t *cr)
{
GnucashCursorCell *cc = &(cursor->cell);
cairo_rgb fg_color;
GdkRGBA *fg_color;
to_cairo_rgb(&gn_black, &fg_color);
fg_color = &gn_black;
/* draw the rectangle around the entire active
* virtual *row */
@ -690,13 +692,13 @@ gnucash_sheet_draw_cursor (GnucashCursor *cursor, cairo_t *cr)
cursor->w - 1.0, cursor->h - 1.0);
cairo_move_to (cr, cursor->x, cursor->y + cursor->h - 1.5);
cairo_rel_line_to (cr, cursor->w, 0);
cairo_set_source_rgb (cr, fg_color.red, fg_color.green, fg_color.blue);
cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
cairo_set_line_width (cr, 1.0);
cairo_stroke (cr);
cairo_rectangle (cr, cc->x + 0.5, cursor->y + cc->y + 0.5,
cc->w - 1.0, cc->h - 1.0);
cairo_set_source_rgb (cr, fg_color.red, fg_color.green, fg_color.blue);
cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
cairo_set_line_width (cr, 1.0);
cairo_stroke (cr);
}

View File

@ -2311,31 +2311,27 @@ gnucash_sheet_realize_entry (GnucashSheet *sheet, GtkWidget *entry)
*/
/** Map a cell type to a gtkrc specified color. */
GdkColor *
GdkRGBA *
get_gtkrc_color (GnucashSheet *sheet,
RegisterColor field_type)
{
GtkWidget *widget = NULL;
GtkStyle *style;
GdkColor *white, *black, *red;
GdkColor *color = NULL;
GtkStyleContext *stylectxt;
GdkRGBA color;
white = gnucash_color_argb_to_gdk (0xFFFFFF);
black = gnucash_color_argb_to_gdk (0x000000);
red = gnucash_color_argb_to_gdk (0xFF0000); /* Hardcoded...*/
switch (field_type)
{
default:
return white;
return gdk_rgba_copy (&gn_white);
case COLOR_UNKNOWN_BG:
return white;
return gdk_rgba_copy (&gn_white);
case COLOR_UNKNOWN_FG:
return black;
return gdk_rgba_copy (&gn_black);
case COLOR_NEGATIVE:
return red;
return gdk_rgba_copy (&gn_red); // FIXME shouldn't be hardcoded...
case COLOR_HEADER_BG:
case COLOR_HEADER_FG:
@ -2364,44 +2360,43 @@ get_gtkrc_color (GnucashSheet *sheet,
break;
}
style = gtk_widget_get_style(widget);
if (!style)
return white;
stylectxt = gtk_widget_get_style_context (widget);
if (!stylectxt)
return gdk_rgba_copy (&gn_white);
switch (field_type)
{
default:
return white;
return gdk_rgba_copy (&gn_white);
case COLOR_HEADER_BG:
case COLOR_PRIMARY_BG:
case COLOR_SECONDARY_BG:
case COLOR_SPLIT_BG:
color = &style->base[GTK_STATE_NORMAL];
gtk_style_context_get_background_color(stylectxt, GTK_STATE_FLAG_NORMAL, &color);
break;
case COLOR_PRIMARY_BG_ACTIVE:
case COLOR_SECONDARY_BG_ACTIVE:
case COLOR_SPLIT_BG_ACTIVE:
color = &style->base[GTK_STATE_SELECTED];
gtk_style_context_get_background_color(stylectxt, GTK_STATE_FLAG_SELECTED, &color);
break;
case COLOR_HEADER_FG:
case COLOR_PRIMARY_FG:
case COLOR_SECONDARY_FG:
case COLOR_SPLIT_FG:
color = &style->text[GTK_STATE_NORMAL];
gtk_style_context_get_color(stylectxt, GTK_STATE_FLAG_NORMAL, &color);
break;
case COLOR_PRIMARY_FG_ACTIVE:
case COLOR_SECONDARY_FG_ACTIVE:
case COLOR_SPLIT_FG_ACTIVE:
color = &style->text[GTK_STATE_SELECTED];
gtk_style_context_get_color(stylectxt, GTK_STATE_FLAG_SELECTED, &color);
break;
}
gnucash_color_alloc_gdk(color);
return color;
return gdk_rgba_copy (&color);
}
/** Create the entries used for nameing register colors in gtkrc. */

View File

@ -105,7 +105,7 @@ void gnucash_sheet_update_adjustments (GnucashSheet *sheet);
void gnucash_sheet_set_window (GnucashSheet *sheet, GtkWidget *window);
GdkColor *get_gtkrc_color (GnucashSheet *sheet, RegisterColor field_type);
GdkRGBA *get_gtkrc_color (GnucashSheet *sheet, RegisterColor field_type);
/** @} */
#endif