gnucash maint: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Tue Sep 2 09:29:16 EDT 2014


Updated	 via  https://github.com/Gnucash/gnucash/commit/87654e69 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ac1990fc (commit)
	 via  https://github.com/Gnucash/gnucash/commit/61cd3f11 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/904afd8b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/0a394c5b (commit)
	from  https://github.com/Gnucash/gnucash/commit/8d9b3c7c (commit)



commit 87654e69f6ed4e13ffacce4348ccd2e814832636
Author: Geert Janssens <janssens-geert at telenet.be>
Date:   Tue Sep 2 14:50:32 2014 +0200

    Bug 434462 - register color don't work correct with system theme color - Part 2
    
    This commit fixes this for (business) entry ledgers.

diff --git a/src/business/business-ledger/gncEntryLedger.h b/src/business/business-ledger/gncEntryLedger.h
index a8668df..3a7532d 100644
--- a/src/business/business-ledger/gncEntryLedger.h
+++ b/src/business/business-ledger/gncEntryLedger.h
@@ -49,17 +49,6 @@ typedef enum
     GNCENTRY_NUM_REGISTER_TYPES
 } GncEntryLedgerType;
 
-typedef struct entry_ledger_colors
-{
-    guint32 header_bg_color;
-
-    guint32 primary_bg_color;
-    guint32 secondary_bg_color;
-
-    guint32 primary_active_bg_color;
-    guint32 secondary_active_bg_color;
-} GncEntryLedgerColors;
-
 #define ENTRY_IACCT_CELL	"inv-account"
 #define ENTRY_BACCT_CELL	"bill-account"
 #define ENTRY_ACTN_CELL		"action"
diff --git a/src/business/business-ledger/gncEntryLedgerModel.c b/src/business/business-ledger/gncEntryLedgerModel.c
index 96a0dca..87b8991 100644
--- a/src/business/business-ledger/gncEntryLedgerModel.c
+++ b/src/business/business-ledger/gncEntryLedgerModel.c
@@ -36,15 +36,6 @@
 #include "gncEntryLedgerP.h"
 #include "gncEntryLedgerModel.h"
 
-static GncEntryLedgerColors reg_colors =
-{
-    0x96B183,
-    0xBFDEB9,
-    0xF6FFDA,
-
-    0xFFEF98,
-    0xFFEF98,
-};
 
 /** Private Interfaces ***********************************************/
 
@@ -927,42 +918,84 @@ static CellIOFlags get_qty_io_flags (VirtualLocation virt_loc, gpointer user_dat
 /* GET BG_COLORS */
 
 static guint32
-gnc_entry_ledger_get_bg_color (VirtualLocation virt_loc,
-                               gboolean *hatching, gpointer user_data)
+gnc_entry_ledger_get_color_internal (VirtualLocation virt_loc,
+                                     GncEntryLedger *ledger,
+                                     const guint32 *color_table,
+                                     gboolean foreground)
 {
-    GncEntryLedger *ledger = user_data;
+    const char *cursor_name;
     VirtualCell *vcell;
-    guint32 bg_color;
     gboolean is_current;
+    guint32 colorbase = 0; /* By default return background colors */
 
-    if (hatching)
-        *hatching = FALSE;
-
-    bg_color = 0xffffff; /* white */
+    if (foreground)
+        colorbase = COLOR_UNKNOWN_FG; /* a bit of enum arithmetic */
 
-    if (!ledger) return bg_color;
+    if (!ledger)
+        return color_table[colorbase + COLOR_UNKNOWN_BG];
 
     if (gnc_table_virtual_location_in_header (ledger->table, virt_loc))
-        return reg_colors.header_bg_color;
+        return color_table[colorbase + COLOR_HEADER_BG];
 
     vcell = gnc_table_get_virtual_cell (ledger->table, virt_loc.vcell_loc);
     if (!vcell || !vcell->cellblock)
-        return bg_color;
+        return color_table[colorbase + COLOR_UNKNOWN_BG];
 
     if ((virt_loc.phys_col_offset < vcell->cellblock->start_col) ||
             (virt_loc.phys_col_offset > vcell->cellblock->stop_col))
-        return bg_color;
+        return color_table[colorbase + COLOR_UNKNOWN_BG];
 
-    is_current = virt_cell_loc_equal
-                 (ledger->table->current_cursor_loc.vcell_loc, virt_loc.vcell_loc);
+    is_current = virt_cell_loc_equal (ledger->table->current_cursor_loc.vcell_loc,
+                                      virt_loc.vcell_loc);
 
     if (is_current)
         return vcell->start_primary_color ?
-               reg_colors.primary_active_bg_color :
-               reg_colors.secondary_active_bg_color;
+                color_table[colorbase + COLOR_PRIMARY_BG_ACTIVE] :
+                color_table[colorbase + COLOR_SECONDARY_BG_ACTIVE];
 
     return vcell->start_primary_color ?
-           reg_colors.primary_bg_color : reg_colors.secondary_bg_color;
+            color_table[colorbase + COLOR_PRIMARY_BG] : color_table[colorbase + COLOR_SECONDARY_BG];
+
+}
+
+static guint32
+gnc_entry_ledger_get_fg_color (VirtualLocation virt_loc,
+                               gpointer user_data)
+{
+    GncEntryLedger *ledger = user_data;
+    return gnc_entry_ledger_get_color_internal (virt_loc, ledger, reg_colors_default, TRUE);
+}
+
+static guint32
+gnc_entry_ledger_get_gtkrc_fg_color (VirtualLocation virt_loc,
+                                     gpointer user_data)
+{
+    GncEntryLedger *ledger = user_data;
+    return gnc_entry_ledger_get_color_internal (virt_loc, ledger, reg_colors_gtkrc, TRUE);
+}
+
+static guint32
+gnc_entry_ledger_get_bg_color (VirtualLocation virt_loc,
+                               gboolean *hatching, gpointer user_data)
+{
+    GncEntryLedger *ledger = user_data;
+
+    if (hatching)
+        *hatching = FALSE;
+
+    return gnc_entry_ledger_get_color_internal (virt_loc, ledger, reg_colors_default, FALSE);
+}
+
+static guint32
+gnc_entry_ledger_get_gtkrc_bg_color (VirtualLocation virt_loc,
+                                     gboolean *hatching, gpointer user_data)
+{
+    GncEntryLedger *ledger = user_data;
+
+    if (hatching)
+        *hatching = FALSE;
+
+    return gnc_entry_ledger_get_color_internal (virt_loc, ledger, reg_colors_gtkrc, FALSE);
 }
 
 /* SAVE CELLS */
@@ -1214,9 +1247,18 @@ static void gnc_entry_ledger_model_new_handlers (TableModel *model,
     };
     unsigned int i;
 
+    gnc_table_model_set_default_fg_color_handler
+    (model, gnc_entry_ledger_get_fg_color);
+
+    gnc_table_model_set_fg_color_handler
+    (model, gnc_entry_ledger_get_gtkrc_fg_color, "gtkrc");
+
     gnc_table_model_set_default_bg_color_handler
     (model, gnc_entry_ledger_get_bg_color);
 
+    gnc_table_model_set_bg_color_handler
+    (model, gnc_entry_ledger_get_gtkrc_bg_color, "gtkrc");
+
 
     for (i = 0; i < (sizeof(models) / sizeof(*models)); i++)
     {
diff --git a/src/register/ledger-core/split-register-model.c b/src/register/ledger-core/split-register-model.c
index 4ef9333..253dcac 100644
--- a/src/register/ledger-core/split-register-model.c
+++ b/src/register/ledger-core/split-register-model.c
@@ -39,66 +39,6 @@
 #include "split-register-p.h"
 #include "engine-helpers.h"
 
-
-typedef enum
-{
-    COLOR_TABLE_DEFAULT,
-    COLOR_TABLE_GTKRC,
-} SplitRegisterColorTable;
-
-/* Alternative color tables to use for the register.
- * The colors in this array are ordered according to the RegisterColor Enum
- * Be careful to respect this order !
- */
-static const guint32 reg_colors_default [] =
-{
-    0xFFFFFF,     // COLOR_UNKNOWN_BG
-    0x96B183,     // COLOR_HEADER_BG
-    0xBFDEB9,     // COLOR_PRIMARY_BG
-    0xFFEF98,     // COLOR_PRIMARY_BG_ACTIVE
-    0xF6FFDA,     // COLOR_SECONDARY_BG
-    0xFFEF98,     // COLOR_SECONDARY_BG_ACTIVE
-    0xEDE7D3,     // COLOR_SPLIT_BG
-    0xFFEF98,     // COLOR_SPLIT_BG_ACTIVE
-
-    0x000000,     // COLOR_UNKNOWN_FG
-    0x000000,     // COLOR_HEADER_FG
-    0x000000,     // COLOR_PRIMARY_FG
-    0x000000,     // COLOR_PRIMARY_FG_ACTIVE
-    0x000000,     // COLOR_SECONDARY_FG
-    0x000000,     // COLOR_SECONDARY_FG_ACTIVE
-    0x000000,     // COLOR_SPLIT_FG
-    0x000000,     // COLOR_SPLIT_FG_ACTIVE
-
-    0xFF0000,     // COLOR_NEGATIVE
-};
-
-/* The colors in this array are ordered according to the RegisterColor Enum
- * Be careful to respect this order !
- */
-static const guint32 reg_colors_gtkrc [] =
-{
-    COLOR_UNKNOWN_BG,          // COLOR_UNKNOWN_BG
-    COLOR_HEADER_BG,           // COLOR_HEADER_BG
-    COLOR_PRIMARY_BG,          // COLOR_PRIMARY_BG
-    COLOR_PRIMARY_BG_ACTIVE,   // COLOR_PRIMARY_BG_ACTIVE
-    COLOR_SECONDARY_BG,        // COLOR_SECONDARY_BG
-    COLOR_SECONDARY_BG_ACTIVE, // COLOR_SECONDARY_BG_ACTIVE
-    COLOR_SPLIT_BG,            // COLOR_SPLIT_BG
-    COLOR_SPLIT_BG_ACTIVE,     // COLOR_SPLIT_BG_ACTIVE
-
-    COLOR_UNKNOWN_FG,          // COLOR_UNKNOWN_FG
-    COLOR_HEADER_FG,           // COLOR_HEADER_FG
-    COLOR_PRIMARY_FG,          // COLOR_PRIMARY_FG
-    COLOR_PRIMARY_FG_ACTIVE,   // COLOR_PRIMARY_FG_ACTIVE
-    COLOR_SECONDARY_FG,        // COLOR_SECONDARY_FG
-    COLOR_SECONDARY_FG_ACTIVE, // COLOR_SECONDARY_FG_ACTIVE
-    COLOR_SPLIT_FG,            // COLOR_SPLIT_FG
-    COLOR_SPLIT_FG_ACTIVE,     // COLOR_SPLIT_FG_ACTIVE
-
-    COLOR_NEGATIVE,            // COLOR_NEGATIVE
-};
-
 /* This static indicates the debugging module that this .o belongs to. */
 static QofLogModule log_module = GNC_MOD_LEDGER;
 
diff --git a/src/register/ledger-core/split-register-model.h b/src/register/ledger-core/split-register-model.h
index fc9b0df..1f264c4 100644
--- a/src/register/ledger-core/split-register-model.h
+++ b/src/register/ledger-core/split-register-model.h
@@ -28,33 +28,4 @@
 TableModel * gnc_split_register_model_new (void);
 TableModel * gnc_template_register_model_new (void);
 
-typedef enum
-{
-    /* Colors used for background drawing */
-    COLOR_UNKNOWN_BG,
-    COLOR_HEADER_BG,
-    COLOR_PRIMARY_BG,
-    COLOR_PRIMARY_BG_ACTIVE,
-    COLOR_SECONDARY_BG,
-    COLOR_SECONDARY_BG_ACTIVE,
-    COLOR_SPLIT_BG,
-    COLOR_SPLIT_BG_ACTIVE,
-
-    /* Colors used for foreground drawing (text etc)
-     * ATTENTION: the background and foreground lists should have
-     *            the same types (the same amount of entries) !
-     *            The code relies on this ! */
-    COLOR_UNKNOWN_FG,
-    COLOR_HEADER_FG,
-    COLOR_PRIMARY_FG,
-    COLOR_PRIMARY_FG_ACTIVE,
-    COLOR_SECONDARY_FG,
-    COLOR_SECONDARY_FG_ACTIVE,
-    COLOR_SPLIT_FG,
-    COLOR_SPLIT_FG_ACTIVE,
-
-    /* Other colors */
-    COLOR_NEGATIVE, /* Color to use for negative numbers */
-} RegisterColor;
-
 #endif
diff --git a/src/register/register-core/table-allgui.h b/src/register/register-core/table-allgui.h
index 5fe7a91..2738738 100644
--- a/src/register/register-core/table-allgui.h
+++ b/src/register/register-core/table-allgui.h
@@ -156,6 +156,92 @@ struct table
     gpointer ui_data;
 };
 
+/** Color definitions used for table elements */
+typedef enum
+{
+    /* Colors used for background drawing */
+    COLOR_UNKNOWN_BG,
+    COLOR_HEADER_BG,
+    COLOR_PRIMARY_BG,
+    COLOR_PRIMARY_BG_ACTIVE,
+    COLOR_SECONDARY_BG,
+    COLOR_SECONDARY_BG_ACTIVE,
+    COLOR_SPLIT_BG,
+    COLOR_SPLIT_BG_ACTIVE,
+
+    /* Colors used for foreground drawing (text etc)
+     * ATTENTION: the background and foreground lists should have
+     *            the same types (the same amount of entries) !
+     *            The code relies on this ! */
+    COLOR_UNKNOWN_FG,
+    COLOR_HEADER_FG,
+    COLOR_PRIMARY_FG,
+    COLOR_PRIMARY_FG_ACTIVE,
+    COLOR_SECONDARY_FG,
+    COLOR_SECONDARY_FG_ACTIVE,
+    COLOR_SPLIT_FG,
+    COLOR_SPLIT_FG_ACTIVE,
+
+    /* Other colors */
+    COLOR_NEGATIVE, /* Color to use for negative numbers */
+} RegisterColor;
+
+
+
+
+/* Alternative color tables to use for the register.
+ * The colors in this array are ordered according to the RegisterColor Enum
+ * Be careful to respect this order !
+ */
+static const guint32 reg_colors_default [] =
+{
+    0xFFFFFF,     // COLOR_UNKNOWN_BG
+    0x96B183,     // COLOR_HEADER_BG
+    0xBFDEB9,     // COLOR_PRIMARY_BG
+    0xFFEF98,     // COLOR_PRIMARY_BG_ACTIVE
+    0xF6FFDA,     // COLOR_SECONDARY_BG
+    0xFFEF98,     // COLOR_SECONDARY_BG_ACTIVE
+    0xEDE7D3,     // COLOR_SPLIT_BG
+    0xFFEF98,     // COLOR_SPLIT_BG_ACTIVE
+
+    0x000000,     // COLOR_UNKNOWN_FG
+    0x000000,     // COLOR_HEADER_FG
+    0x000000,     // COLOR_PRIMARY_FG
+    0x000000,     // COLOR_PRIMARY_FG_ACTIVE
+    0x000000,     // COLOR_SECONDARY_FG
+    0x000000,     // COLOR_SECONDARY_FG_ACTIVE
+    0x000000,     // COLOR_SPLIT_FG
+    0x000000,     // COLOR_SPLIT_FG_ACTIVE
+
+    0xFF0000,     // COLOR_NEGATIVE
+};
+
+/* The colors in this array are ordered according to the RegisterColor Enum
+ * Be careful to respect this order !
+ */
+static const guint32 reg_colors_gtkrc [] =
+{
+    COLOR_UNKNOWN_BG,          // COLOR_UNKNOWN_BG
+    COLOR_HEADER_BG,           // COLOR_HEADER_BG
+    COLOR_PRIMARY_BG,          // COLOR_PRIMARY_BG
+    COLOR_PRIMARY_BG_ACTIVE,   // COLOR_PRIMARY_BG_ACTIVE
+    COLOR_SECONDARY_BG,        // COLOR_SECONDARY_BG
+    COLOR_SECONDARY_BG_ACTIVE, // COLOR_SECONDARY_BG_ACTIVE
+    COLOR_SPLIT_BG,            // COLOR_SPLIT_BG
+    COLOR_SPLIT_BG_ACTIVE,     // COLOR_SPLIT_BG_ACTIVE
+
+    COLOR_UNKNOWN_FG,          // COLOR_UNKNOWN_FG
+    COLOR_HEADER_FG,           // COLOR_HEADER_FG
+    COLOR_PRIMARY_FG,          // COLOR_PRIMARY_FG
+    COLOR_PRIMARY_FG_ACTIVE,   // COLOR_PRIMARY_FG_ACTIVE
+    COLOR_SECONDARY_FG,        // COLOR_SECONDARY_FG
+    COLOR_SECONDARY_FG_ACTIVE, // COLOR_SECONDARY_FG_ACTIVE
+    COLOR_SPLIT_FG,            // COLOR_SPLIT_FG
+    COLOR_SPLIT_FG_ACTIVE,     // COLOR_SPLIT_FG_ACTIVE
+
+    COLOR_NEGATIVE,            // COLOR_NEGATIVE
+};
+
 
 /* Set the default gui handlers used by new tables. */
 void gnc_table_set_default_gui_handlers (TableGUIHandlers *gui_handlers);

commit ac1990fc9d0f67beb03a8e132c65031d20a0138d
Author: Geert Janssens <janssens-geert at telenet.be>
Date:   Sat Aug 30 17:39:49 2014 +0200

    Bug 434462 - register color don't work correct with system theme color - Part 1
    
    This commit fixes this for ordinary registers. Entry ledgers (business) aren't handled yet.

diff --git a/src/register/ledger-core/split-register-model.c b/src/register/ledger-core/split-register-model.c
index af029da..4ef9333 100644
--- a/src/register/ledger-core/split-register-model.c
+++ b/src/register/ledger-core/split-register-model.c
@@ -60,6 +60,17 @@ static const guint32 reg_colors_default [] =
     0xFFEF98,     // COLOR_SECONDARY_BG_ACTIVE
     0xEDE7D3,     // COLOR_SPLIT_BG
     0xFFEF98,     // COLOR_SPLIT_BG_ACTIVE
+
+    0x000000,     // COLOR_UNKNOWN_FG
+    0x000000,     // COLOR_HEADER_FG
+    0x000000,     // COLOR_PRIMARY_FG
+    0x000000,     // COLOR_PRIMARY_FG_ACTIVE
+    0x000000,     // COLOR_SECONDARY_FG
+    0x000000,     // COLOR_SECONDARY_FG_ACTIVE
+    0x000000,     // COLOR_SPLIT_FG
+    0x000000,     // COLOR_SPLIT_FG_ACTIVE
+
+    0xFF0000,     // COLOR_NEGATIVE
 };
 
 /* The colors in this array are ordered according to the RegisterColor Enum
@@ -75,6 +86,17 @@ static const guint32 reg_colors_gtkrc [] =
     COLOR_SECONDARY_BG_ACTIVE, // COLOR_SECONDARY_BG_ACTIVE
     COLOR_SPLIT_BG,            // COLOR_SPLIT_BG
     COLOR_SPLIT_BG_ACTIVE,     // COLOR_SPLIT_BG_ACTIVE
+
+    COLOR_UNKNOWN_FG,          // COLOR_UNKNOWN_FG
+    COLOR_HEADER_FG,           // COLOR_HEADER_FG
+    COLOR_PRIMARY_FG,          // COLOR_PRIMARY_FG
+    COLOR_PRIMARY_FG_ACTIVE,   // COLOR_PRIMARY_FG_ACTIVE
+    COLOR_SECONDARY_FG,        // COLOR_SECONDARY_FG
+    COLOR_SECONDARY_FG_ACTIVE, // COLOR_SECONDARY_FG_ACTIVE
+    COLOR_SPLIT_FG,            // COLOR_SPLIT_FG
+    COLOR_SPLIT_FG_ACTIVE,     // COLOR_SPLIT_FG_ACTIVE
+
+    COLOR_NEGATIVE,            // COLOR_NEGATIVE
 };
 
 /* This static indicates the debugging module that this .o belongs to. */
@@ -539,84 +561,33 @@ get_trans_total_balance (SplitRegister *reg, Transaction *trans)
 }
 
 static guint32
-gnc_split_register_get_fg_color (VirtualLocation virt_loc,
-                                 gpointer user_data)
-{
-    SplitRegister *reg = user_data;
-    const guint32 black = 0x000000;
-    const guint32 red   = 0xff0000;
-    const char * cell_name;
-    gboolean is_current;
-    gnc_numeric value;
-    Split *split;
-
-    if (!use_red_for_negative)
-        return black;
-
-    split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
-    if (!split)
-        return black;
-
-    cell_name = gnc_table_get_cell_name (reg->table, virt_loc);
-
-    if (gnc_cell_name_equal (cell_name, TSHRS_CELL))
-        value = get_trans_total_amount (reg, xaccSplitGetParent (split));
-    else if (gnc_cell_name_equal (cell_name, SHRS_CELL))
-    {
-        if (virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
-                                      virt_loc.vcell_loc))
-            value = gnc_price_cell_get_value
-                     ((PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
-                             SHRS_CELL));
-        else
-            value = xaccSplitGetAmount (split);
-    }
-    else if (gnc_cell_name_equal (cell_name, BALN_CELL))
-        value = xaccSplitGetBalance (split);
-    else if (gnc_cell_name_equal (cell_name, RBALN_CELL))
-        value = gnc_split_register_get_rbaln (virt_loc, user_data, TRUE);
-    else if (gnc_cell_name_equal (cell_name, TBALN_CELL))
-        value = get_trans_total_balance (reg, xaccSplitGetParent (split));
-
-    if ((gnc_cell_name_equal (cell_name, BALN_CELL)) ||
-            (gnc_cell_name_equal (cell_name, RBALN_CELL)) ||
-            (gnc_cell_name_equal (cell_name, TBALN_CELL)))
-        {
-            Account *account = xaccSplitGetAccount (split);
-            if (gnc_reverse_balance (account))
-                value = gnc_numeric_neg (value);
-        }
-
-    if (gnc_numeric_negative_p (value))
-        return red;
-
-    return black;
-}
-
-static guint32
-gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
-                                          SplitRegister *reg,
-                                          const guint32 *color_table,
-                                          guint32 default_color)
+gnc_split_register_get_color_internal (VirtualLocation virt_loc,
+                                       SplitRegister *reg,
+                                       const guint32 *color_table,
+                                       gboolean foreground)
 {
     const char *cursor_name;
     VirtualCell *vcell;
     gboolean is_current;
     gboolean double_alternate_virt;
+    guint32 colorbase = 0; /* By default return background colors */
+
+    if (foreground)
+        colorbase = COLOR_UNKNOWN_FG; /* a bit of enum arithmetic */
 
     if (!reg)
-        return default_color;
+        return color_table[colorbase + COLOR_UNKNOWN_BG];
 
     if (gnc_table_virtual_location_in_header (reg->table, virt_loc))
-        return color_table[COLOR_HEADER_BG];
+        return color_table[colorbase + COLOR_HEADER_BG];
 
     vcell = gnc_table_get_virtual_cell (reg->table, virt_loc.vcell_loc);
     if (!vcell || !vcell->cellblock)
-        return default_color;
+        return color_table[colorbase + COLOR_UNKNOWN_BG];
 
     if ((virt_loc.phys_col_offset < vcell->cellblock->start_col) ||
             (virt_loc.phys_col_offset > vcell->cellblock->stop_col))
-        return default_color;
+        return color_table[colorbase + COLOR_UNKNOWN_BG];
 
     is_current = virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
                                       virt_loc.vcell_loc);
@@ -628,11 +599,11 @@ gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
     {
         if (is_current)
             return vcell->start_primary_color ?
-                    color_table[COLOR_PRIMARY_BG_ACTIVE] :
-                    color_table[COLOR_SECONDARY_BG_ACTIVE];
+                    color_table[colorbase + COLOR_PRIMARY_BG_ACTIVE] :
+                    color_table[colorbase + COLOR_SECONDARY_BG_ACTIVE];
 
         return vcell->start_primary_color ?
-                color_table[COLOR_PRIMARY_BG] : color_table[COLOR_SECONDARY_BG];
+                color_table[colorbase + COLOR_PRIMARY_BG] : color_table[colorbase + COLOR_SECONDARY_BG];
     }
 
     if (g_strcmp0 (cursor_name, CURSOR_DOUBLE_JOURNAL) == 0 ||
@@ -646,35 +617,108 @@ gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
         {
             if (double_alternate_virt)
                 return vcell->start_primary_color ?
-                        color_table[COLOR_PRIMARY_BG_ACTIVE] :
-                        color_table[COLOR_SECONDARY_BG_ACTIVE];
+                        color_table[colorbase + COLOR_PRIMARY_BG_ACTIVE] :
+                        color_table[colorbase + COLOR_SECONDARY_BG_ACTIVE];
 
             return (virt_loc.phys_row_offset % 2 == 0) ?
-                    color_table[COLOR_PRIMARY_BG_ACTIVE] :
-                    color_table[COLOR_SECONDARY_BG_ACTIVE];
+                    color_table[colorbase + COLOR_PRIMARY_BG_ACTIVE] :
+                    color_table[colorbase + COLOR_SECONDARY_BG_ACTIVE];
         }
 
         if (double_alternate_virt)
             return vcell->start_primary_color ?
-                    color_table[COLOR_PRIMARY_BG] :
-                    color_table[COLOR_SECONDARY_BG];
+                    color_table[colorbase + COLOR_PRIMARY_BG] :
+                    color_table[colorbase + COLOR_SECONDARY_BG];
 
         return (virt_loc.phys_row_offset % 2 == 0) ?
-                color_table[COLOR_PRIMARY_BG] :
-                color_table[COLOR_SECONDARY_BG];
+                color_table[colorbase + COLOR_PRIMARY_BG] :
+                color_table[colorbase + COLOR_SECONDARY_BG];
     }
 
     if (g_strcmp0 (cursor_name, CURSOR_SPLIT) == 0)
     {
         if (is_current)
-            return color_table[COLOR_SPLIT_BG_ACTIVE];
+            return color_table[colorbase + COLOR_SPLIT_BG_ACTIVE];
 
-        return color_table[COLOR_SPLIT_BG];
+        return color_table[colorbase + COLOR_SPLIT_BG];
     }
 
     PWARN ("Unexpected cursor: %s\n", cursor_name);
 
-    return default_color;
+    return color_table[colorbase + COLOR_UNKNOWN_BG];
+}
+
+static guint32
+gnc_split_register_get_fg_color_internal (VirtualLocation virt_loc,
+                                          SplitRegister *reg,
+                                          const guint32 *color_table)
+{
+    const guint32 red_color = color_table[COLOR_NEGATIVE];
+    guint32 fg_color;
+    const char * cell_name;
+    gboolean is_current;
+    gnc_numeric value;
+    Split *split;
+
+    fg_color = gnc_split_register_get_color_internal (virt_loc, reg, color_table, TRUE);
+
+    if (!use_red_for_negative)
+        return fg_color;
+
+    split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
+    if (!split)
+        return fg_color;
+
+    cell_name = gnc_table_get_cell_name (reg->table, virt_loc);
+
+    if (gnc_cell_name_equal (cell_name, TSHRS_CELL))
+        value = get_trans_total_amount (reg, xaccSplitGetParent (split));
+    else if (gnc_cell_name_equal (cell_name, SHRS_CELL))
+    {
+        if (virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
+                                      virt_loc.vcell_loc))
+            value = gnc_price_cell_get_value
+                     ((PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
+                             SHRS_CELL));
+        else
+            value = xaccSplitGetAmount (split);
+    }
+    else if (gnc_cell_name_equal (cell_name, BALN_CELL))
+        value = xaccSplitGetBalance (split);
+    else if (gnc_cell_name_equal (cell_name, RBALN_CELL))
+        value = gnc_split_register_get_rbaln (virt_loc, reg, TRUE);
+    else if (gnc_cell_name_equal (cell_name, TBALN_CELL))
+        value = get_trans_total_balance (reg, xaccSplitGetParent (split));
+
+    if ((gnc_cell_name_equal (cell_name, BALN_CELL)) ||
+            (gnc_cell_name_equal (cell_name, RBALN_CELL)) ||
+            (gnc_cell_name_equal (cell_name, TBALN_CELL)))
+        {
+            Account *account = xaccSplitGetAccount (split);
+            if (gnc_reverse_balance (account))
+                value = gnc_numeric_neg (value);
+        }
+
+    if (gnc_numeric_negative_p (value))
+        return red_color;
+
+    return fg_color;
+}
+
+static guint32
+gnc_split_register_get_fg_color (VirtualLocation virt_loc,
+                                 gpointer user_data)
+{
+    SplitRegister *reg = user_data;
+    return gnc_split_register_get_fg_color_internal (virt_loc, reg, reg_colors_default);
+}
+
+static guint32
+gnc_split_register_get_gtkrc_fg_color (VirtualLocation virt_loc,
+                                       gpointer user_data)
+{
+    SplitRegister *reg = user_data;
+    return gnc_split_register_get_fg_color_internal (virt_loc, reg, reg_colors_gtkrc);
 }
 
 static guint32
@@ -687,7 +731,7 @@ gnc_split_register_get_bg_color (VirtualLocation virt_loc,
     if (hatching)
         *hatching = FALSE;
 
-    return gnc_split_register_get_bg_color_internal (virt_loc, reg, reg_colors_default, 0xffffff);
+    return gnc_split_register_get_color_internal (virt_loc, reg, reg_colors_default, FALSE);
 }
 
 
@@ -701,7 +745,7 @@ gnc_split_register_get_gtkrc_bg_color (VirtualLocation virt_loc,
     if (hatching)
         *hatching = FALSE;
 
-    return gnc_split_register_get_bg_color_internal (virt_loc, reg, reg_colors_gtkrc, COLOR_UNKNOWN_BG);
+    return gnc_split_register_get_color_internal (virt_loc, reg, reg_colors_gtkrc, FALSE);
 }
 
 static guint32
@@ -2611,6 +2655,9 @@ gnc_split_register_model_new (void)
     gnc_table_model_set_fg_color_handler(
         model, gnc_split_register_get_fg_color, RBALN_CELL);
 
+    gnc_table_model_set_fg_color_handler(
+        model, gnc_split_register_get_gtkrc_fg_color, "gtkrc");
+
 
     gnc_table_model_set_default_bg_color_handler(
         model, gnc_split_register_get_bg_color);
diff --git a/src/register/ledger-core/split-register-model.h b/src/register/ledger-core/split-register-model.h
index f26e28c..fc9b0df 100644
--- a/src/register/ledger-core/split-register-model.h
+++ b/src/register/ledger-core/split-register-model.h
@@ -30,6 +30,7 @@ TableModel * gnc_template_register_model_new (void);
 
 typedef enum
 {
+    /* Colors used for background drawing */
     COLOR_UNKNOWN_BG,
     COLOR_HEADER_BG,
     COLOR_PRIMARY_BG,
@@ -38,6 +39,22 @@ typedef enum
     COLOR_SECONDARY_BG_ACTIVE,
     COLOR_SPLIT_BG,
     COLOR_SPLIT_BG_ACTIVE,
+
+    /* Colors used for foreground drawing (text etc)
+     * ATTENTION: the background and foreground lists should have
+     *            the same types (the same amount of entries) !
+     *            The code relies on this ! */
+    COLOR_UNKNOWN_FG,
+    COLOR_HEADER_FG,
+    COLOR_PRIMARY_FG,
+    COLOR_PRIMARY_FG_ACTIVE,
+    COLOR_SECONDARY_FG,
+    COLOR_SECONDARY_FG_ACTIVE,
+    COLOR_SPLIT_FG,
+    COLOR_SPLIT_FG_ACTIVE,
+
+    /* Other colors */
+    COLOR_NEGATIVE, /* Color to use for negative numbers */
 } RegisterColor;
 
 #endif
diff --git a/src/register/register-core/table-allgui.c b/src/register/register-core/table-allgui.c
index 29ec9b0..8e7a010 100644
--- a/src/register/register-core/table-allgui.c
+++ b/src/register/register-core/table-allgui.c
@@ -345,25 +345,39 @@ gnc_table_get_label (Table *table, VirtualLocation virt_loc)
     return label;
 }
 
-guint32
-gnc_table_get_fg_color (Table *table, VirtualLocation virt_loc)
+static guint32
+gnc_table_get_fg_color_internal (Table *table, VirtualLocation virt_loc,
+                                 gboolean want_gtkrc)
 {
     TableGetFGColorHandler fg_color_handler;
-    const char *cell_name;
+    const char *handler_name = "gtkrc";
 
     if (!table || !table->model)
         return 0x0; /* black */
 
-    cell_name = gnc_table_get_cell_name (table, virt_loc);
+    if (!want_gtkrc)
+        handler_name = gnc_table_get_cell_name (table, virt_loc);
 
     fg_color_handler = gnc_table_model_get_fg_color_handler (table->model,
-                       cell_name);
+                       handler_name);
     if (!fg_color_handler)
         return 0x0;
 
     return fg_color_handler (virt_loc, table->model->handler_user_data);
 }
 
+guint32
+gnc_table_get_fg_color (Table *table, VirtualLocation virt_loc)
+{
+    return gnc_table_get_fg_color_internal (table, virt_loc, FALSE);
+}
+
+guint32
+gnc_table_get_gtkrc_fg_color (Table *table, VirtualLocation virt_loc)
+{
+    return gnc_table_get_fg_color_internal (table, virt_loc, TRUE);
+}
+
 static guint32
 gnc_table_get_bg_color_internal (Table *table, VirtualLocation virt_loc,
                                  gboolean *hatching,
diff --git a/src/register/register-core/table-allgui.h b/src/register/register-core/table-allgui.h
index 0f7bbd4..5fe7a91 100644
--- a/src/register/register-core/table-allgui.h
+++ b/src/register/register-core/table-allgui.h
@@ -210,6 +210,8 @@ CellIOFlags    gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc);
 
 guint32        gnc_table_get_fg_color (Table *table, VirtualLocation virt_loc);
 
+guint32        gnc_table_get_gtkrc_fg_color (Table *table, VirtualLocation virt_loc);
+
 guint32        gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc,
                                        gboolean *hatching);
 guint32        gnc_table_get_gtkrc_bg_color (Table *table, VirtualLocation virt_loc,
diff --git a/src/register/register-gnome/gnucash-grid.c b/src/register/register-gnome/gnucash-grid.c
index d357c8f..3272104 100644
--- a/src/register/register-gnome/gnucash-grid.c
+++ b/src/register/register-gnome/gnucash-grid.c
@@ -605,17 +605,25 @@ draw_cell (GnucashGrid *grid,
     context = pango_layout_get_context (layout);
     font = pango_font_description_copy (pango_context_get_font_description (context));
 
-    argb = gnc_table_get_fg_color (table, virt_loc);
-#ifdef READONLY_LINES_WITH_CHANGED_FG_COLOR
-    // Are we in a read-only row? Then make the foreground color somewhat less black
-    if ((virt_loc.phys_row_offset == (block->style->nrows - 1))
-            && (table->model->dividing_row_upper >= 0)
-            && (virt_loc.vcell_loc.virt_row < table->model->dividing_row_upper))
+    if (grid->sheet->use_theme_colors)
     {
-        argb = inc_intensity_10percent(argb);
+        color_type = gnc_table_get_gtkrc_fg_color (table, virt_loc);
+        fg_color = get_gtkrc_color(grid->sheet, color_type);
     }
+    else
+    {
+        argb = gnc_table_get_fg_color (table, virt_loc);
+#ifdef READONLY_LINES_WITH_CHANGED_FG_COLOR
+        // Are we in a read-only row? Then make the foreground color somewhat less black
+        if ((virt_loc.phys_row_offset == (block->style->nrows - 1))
+                && (table->model->dividing_row_upper >= 0)
+                && (virt_loc.vcell_loc.virt_row < table->model->dividing_row_upper))
+        {
+            argb = inc_intensity_10percent(argb);
+        }
 #endif
-    fg_color = gnucash_color_argb_to_gdk (argb);
+        fg_color = gnucash_color_argb_to_gdk (argb);
+    }
 
     gdk_gc_set_foreground (grid->gc, fg_color);
 
diff --git a/src/register/register-gnome/gnucash-header.c b/src/register/register-gnome/gnucash-header.c
index 7d902d5..dab6873 100644
--- a/src/register/register-gnome/gnucash-header.c
+++ b/src/register/register-gnome/gnucash-header.c
@@ -75,7 +75,7 @@ gnc_header_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
     VirtualLocation virt_loc;
     VirtualCell *vcell;
     CellDimensions *cd;
-    GdkColor *bg_color;
+    GdkColor *bg_color, *fg_color;
     int xpaint, ypaint;
     const char *text;
     CellBlock *cb;
@@ -94,11 +94,15 @@ gnc_header_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
         color_type = gnc_table_get_gtkrc_bg_color (table, virt_loc,
                      NULL);
         bg_color = get_gtkrc_color(header->sheet, color_type);
+        color_type = gnc_table_get_gtkrc_fg_color (table, virt_loc);
+        fg_color = get_gtkrc_color(header->sheet, color_type);
     }
     else
     {
         argb = gnc_table_get_bg_color (table, virt_loc, NULL);
         bg_color = gnucash_color_argb_to_gdk (argb);
+        argb = gnc_table_get_fg_color (table, virt_loc);
+        fg_color = gnucash_color_argb_to_gdk (argb);
     }
 
     h = style->dimensions->height;
@@ -111,7 +115,7 @@ gnc_header_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
                         style->dimensions->width, h);
 
     gdk_gc_set_line_attributes (header->gc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
-    gdk_gc_set_foreground (header->gc, &gn_black);
+    gdk_gc_set_foreground (header->gc, fg_color);
 
     gdk_draw_rectangle (drawable, header->gc, FALSE, -x, -y,
                         style->dimensions->width, h);
@@ -121,7 +125,7 @@ gnc_header_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
 
     gdk_gc_set_line_attributes (header->gc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
     gdk_gc_set_background (header->gc, &gn_white);
-    gdk_gc_set_foreground (header->gc, &gn_black);
+    gdk_gc_set_foreground (header->gc, fg_color);
     /*font = gnucash_register_font;*/
 
     vcell = gnc_table_get_virtual_cell
diff --git a/src/register/register-gnome/gnucash-item-edit.c b/src/register/register-gnome/gnucash-item-edit.c
index 3486ffb..9b34102 100644
--- a/src/register/register-gnome/gnucash-item-edit.c
+++ b/src/register/register-gnome/gnucash-item-edit.c
@@ -196,16 +196,20 @@ gnc_item_edit_draw_info (GncItemEdit *item_edit, int x, int y, TextDrawInfo *inf
                      item_edit->virt_loc,
                      &hatching);
         info->bg_color = get_gtkrc_color(item_edit->sheet, color_type);
+        color_type = gnc_table_get_gtkrc_fg_color (table,
+                     item_edit->virt_loc);
+        info->fg_color = get_gtkrc_color(item_edit->sheet, color_type);
     }
     else
     {
         argb = gnc_table_get_bg_color (table, item_edit->virt_loc,
                                        &hatching);
         info->bg_color = gnucash_color_argb_to_gdk (argb);
+        argb = gnc_table_get_fg_color (table, item_edit->virt_loc);
+        info->fg_color = gnucash_color_argb_to_gdk (argb);
     }
 
     info->hatching = hatching;
-    info->fg_color = &gn_black;
 
     info->bg_color2 = &gn_dark_gray;
     info->fg_color2 = &gn_white;
diff --git a/src/register/register-gnome/gnucash-sheet.c b/src/register/register-gnome/gnucash-sheet.c
index 03f6918..06c639e 100644
--- a/src/register/register-gnome/gnucash-sheet.c
+++ b/src/register/register-gnome/gnucash-sheet.c
@@ -2609,31 +2609,49 @@ get_gtkrc_color (GnucashSheet *sheet,
 {
     GtkWidget *widget = NULL;
     GtkStyle *style;
-    GdkColor *white;
+    GdkColor *white, *black, *red;
     GdkColor *color = NULL;
 
     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;
 
+    case COLOR_UNKNOWN_BG:
+        return white;
+
+    case COLOR_UNKNOWN_FG:
+        return black;
+
+    case COLOR_NEGATIVE:
+        return red;
+
     case COLOR_HEADER_BG:
+    case COLOR_HEADER_FG:
         widget = sheet->header_color;
         break;
 
     case COLOR_PRIMARY_BG:
     case COLOR_PRIMARY_BG_ACTIVE:
+    case COLOR_PRIMARY_FG:
+    case COLOR_PRIMARY_FG_ACTIVE:
         widget = sheet->primary_color;
         break;
 
     case COLOR_SECONDARY_BG:
     case COLOR_SECONDARY_BG_ACTIVE:
+    case COLOR_SECONDARY_FG:
+    case COLOR_SECONDARY_FG_ACTIVE:
         widget = sheet->secondary_color;
         break;
 
     case COLOR_SPLIT_BG:
     case COLOR_SPLIT_BG_ACTIVE:
+    case COLOR_SPLIT_FG:
+    case COLOR_SPLIT_FG_ACTIVE:
         widget = sheet->split_color;
         break;
     }
@@ -2659,6 +2677,19 @@ get_gtkrc_color (GnucashSheet *sheet,
     case COLOR_SPLIT_BG_ACTIVE:
         color = &style->base[GTK_STATE_SELECTED];
         break;
+
+    case COLOR_HEADER_FG:
+    case COLOR_PRIMARY_FG:
+    case COLOR_SECONDARY_FG:
+    case COLOR_SPLIT_FG:
+        color = &style->text[GTK_STATE_NORMAL];
+        break;
+
+    case COLOR_PRIMARY_FG_ACTIVE:
+    case COLOR_SECONDARY_FG_ACTIVE:
+    case COLOR_SPLIT_FG_ACTIVE:
+        color = &style->text[GTK_STATE_SELECTED];
+        break;
     }
 
     gnucash_color_alloc_gdk(color);

commit 61cd3f1106c4549fcad404aa7eeef463a014a93e
Author: Geert Janssens <janssens-geert at telenet.be>
Date:   Sat Aug 30 16:09:01 2014 +0200

    Rename enum elements to make room for foreground equivalents

diff --git a/src/register/ledger-core/split-register-model.c b/src/register/ledger-core/split-register-model.c
index 2e34b4e..af029da 100644
--- a/src/register/ledger-core/split-register-model.c
+++ b/src/register/ledger-core/split-register-model.c
@@ -52,14 +52,14 @@ typedef enum
  */
 static const guint32 reg_colors_default [] =
 {
-    0x000000,     // COLOR_UNKNOWN
-    0x96B183,     // COLOR_HEADER
-    0xBFDEB9,     // COLOR_PRIMARY
-    0xFFEF98,     // COLOR_PRIMARY_ACTIVE
-    0xF6FFDA,     // COLOR_SECONDARY
-    0xFFEF98,     // COLOR_SECONDARY_ACTIVE
-    0xEDE7D3,     // COLOR_SPLIT
-    0xFFEF98,     // COLOR_SPLIT_ACTIVE
+    0xFFFFFF,     // COLOR_UNKNOWN_BG
+    0x96B183,     // COLOR_HEADER_BG
+    0xBFDEB9,     // COLOR_PRIMARY_BG
+    0xFFEF98,     // COLOR_PRIMARY_BG_ACTIVE
+    0xF6FFDA,     // COLOR_SECONDARY_BG
+    0xFFEF98,     // COLOR_SECONDARY_BG_ACTIVE
+    0xEDE7D3,     // COLOR_SPLIT_BG
+    0xFFEF98,     // COLOR_SPLIT_BG_ACTIVE
 };
 
 /* The colors in this array are ordered according to the RegisterColor Enum
@@ -67,14 +67,14 @@ static const guint32 reg_colors_default [] =
  */
 static const guint32 reg_colors_gtkrc [] =
 {
-    COLOR_UNKNOWN,          // COLOR_UNKNOWN
-    COLOR_HEADER,           // COLOR_HEADER
-    COLOR_PRIMARY,          // COLOR_PRIMARY
-    COLOR_PRIMARY_ACTIVE,   // COLOR_PRIMARY_ACTIVE
-    COLOR_SECONDARY,        // COLOR_SECONDARY
-    COLOR_SECONDARY_ACTIVE, // COLOR_SECONDARY_ACTIVE
-    COLOR_SPLIT,            // COLOR_SPLIT
-    COLOR_SPLIT_ACTIVE,     // COLOR_SPLIT_ACTIVE
+    COLOR_UNKNOWN_BG,          // COLOR_UNKNOWN_BG
+    COLOR_HEADER_BG,           // COLOR_HEADER_BG
+    COLOR_PRIMARY_BG,          // COLOR_PRIMARY_BG
+    COLOR_PRIMARY_BG_ACTIVE,   // COLOR_PRIMARY_BG_ACTIVE
+    COLOR_SECONDARY_BG,        // COLOR_SECONDARY_BG
+    COLOR_SECONDARY_BG_ACTIVE, // COLOR_SECONDARY_BG_ACTIVE
+    COLOR_SPLIT_BG,            // COLOR_SPLIT_BG
+    COLOR_SPLIT_BG_ACTIVE,     // COLOR_SPLIT_BG_ACTIVE
 };
 
 /* This static indicates the debugging module that this .o belongs to. */
@@ -608,7 +608,7 @@ gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
         return default_color;
 
     if (gnc_table_virtual_location_in_header (reg->table, virt_loc))
-        return color_table[COLOR_HEADER];
+        return color_table[COLOR_HEADER_BG];
 
     vcell = gnc_table_get_virtual_cell (reg->table, virt_loc.vcell_loc);
     if (!vcell || !vcell->cellblock)
@@ -628,11 +628,11 @@ gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
     {
         if (is_current)
             return vcell->start_primary_color ?
-                    color_table[COLOR_PRIMARY_ACTIVE] :
-                    color_table[COLOR_SECONDARY_ACTIVE];
+                    color_table[COLOR_PRIMARY_BG_ACTIVE] :
+                    color_table[COLOR_SECONDARY_BG_ACTIVE];
 
         return vcell->start_primary_color ?
-                color_table[COLOR_PRIMARY] : color_table[COLOR_SECONDARY];
+                color_table[COLOR_PRIMARY_BG] : color_table[COLOR_SECONDARY_BG];
     }
 
     if (g_strcmp0 (cursor_name, CURSOR_DOUBLE_JOURNAL) == 0 ||
@@ -646,30 +646,30 @@ gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
         {
             if (double_alternate_virt)
                 return vcell->start_primary_color ?
-                        color_table[COLOR_PRIMARY_ACTIVE] :
-                        color_table[COLOR_SECONDARY_ACTIVE];
+                        color_table[COLOR_PRIMARY_BG_ACTIVE] :
+                        color_table[COLOR_SECONDARY_BG_ACTIVE];
 
             return (virt_loc.phys_row_offset % 2 == 0) ?
-                    color_table[COLOR_PRIMARY_ACTIVE] :
-                    color_table[COLOR_SECONDARY_ACTIVE];
+                    color_table[COLOR_PRIMARY_BG_ACTIVE] :
+                    color_table[COLOR_SECONDARY_BG_ACTIVE];
         }
 
         if (double_alternate_virt)
             return vcell->start_primary_color ?
-                    color_table[COLOR_PRIMARY] :
-                    color_table[COLOR_SECONDARY];
+                    color_table[COLOR_PRIMARY_BG] :
+                    color_table[COLOR_SECONDARY_BG];
 
         return (virt_loc.phys_row_offset % 2 == 0) ?
-                color_table[COLOR_PRIMARY] :
-                color_table[COLOR_SECONDARY];
+                color_table[COLOR_PRIMARY_BG] :
+                color_table[COLOR_SECONDARY_BG];
     }
 
     if (g_strcmp0 (cursor_name, CURSOR_SPLIT) == 0)
     {
         if (is_current)
-            return color_table[COLOR_SPLIT_ACTIVE];
+            return color_table[COLOR_SPLIT_BG_ACTIVE];
 
-        return color_table[COLOR_SPLIT];
+        return color_table[COLOR_SPLIT_BG];
     }
 
     PWARN ("Unexpected cursor: %s\n", cursor_name);
@@ -701,7 +701,7 @@ gnc_split_register_get_gtkrc_bg_color (VirtualLocation virt_loc,
     if (hatching)
         *hatching = FALSE;
 
-    return gnc_split_register_get_bg_color_internal (virt_loc, reg, reg_colors_gtkrc, COLOR_UNKNOWN);
+    return gnc_split_register_get_bg_color_internal (virt_loc, reg, reg_colors_gtkrc, COLOR_UNKNOWN_BG);
 }
 
 static guint32
diff --git a/src/register/ledger-core/split-register-model.h b/src/register/ledger-core/split-register-model.h
index e3ace1b..f26e28c 100644
--- a/src/register/ledger-core/split-register-model.h
+++ b/src/register/ledger-core/split-register-model.h
@@ -30,14 +30,14 @@ TableModel * gnc_template_register_model_new (void);
 
 typedef enum
 {
-    COLOR_UNKNOWN,
-    COLOR_HEADER,
-    COLOR_PRIMARY,
-    COLOR_PRIMARY_ACTIVE,
-    COLOR_SECONDARY,
-    COLOR_SECONDARY_ACTIVE,
-    COLOR_SPLIT,
-    COLOR_SPLIT_ACTIVE,
+    COLOR_UNKNOWN_BG,
+    COLOR_HEADER_BG,
+    COLOR_PRIMARY_BG,
+    COLOR_PRIMARY_BG_ACTIVE,
+    COLOR_SECONDARY_BG,
+    COLOR_SECONDARY_BG_ACTIVE,
+    COLOR_SPLIT_BG,
+    COLOR_SPLIT_BG_ACTIVE,
 } RegisterColor;
 
 #endif
diff --git a/src/register/register-gnome/gnucash-sheet.c b/src/register/register-gnome/gnucash-sheet.c
index 1c17b76..03f6918 100644
--- a/src/register/register-gnome/gnucash-sheet.c
+++ b/src/register/register-gnome/gnucash-sheet.c
@@ -2618,22 +2618,22 @@ get_gtkrc_color (GnucashSheet *sheet,
     default:
         return white;
 
-    case COLOR_HEADER:
+    case COLOR_HEADER_BG:
         widget = sheet->header_color;
         break;
 
-    case COLOR_PRIMARY:
-    case COLOR_PRIMARY_ACTIVE:
+    case COLOR_PRIMARY_BG:
+    case COLOR_PRIMARY_BG_ACTIVE:
         widget = sheet->primary_color;
         break;
 
-    case COLOR_SECONDARY:
-    case COLOR_SECONDARY_ACTIVE:
+    case COLOR_SECONDARY_BG:
+    case COLOR_SECONDARY_BG_ACTIVE:
         widget = sheet->secondary_color;
         break;
 
-    case COLOR_SPLIT:
-    case COLOR_SPLIT_ACTIVE:
+    case COLOR_SPLIT_BG:
+    case COLOR_SPLIT_BG_ACTIVE:
         widget = sheet->split_color;
         break;
     }
@@ -2647,16 +2647,16 @@ get_gtkrc_color (GnucashSheet *sheet,
     default:
         return white;
 
-    case COLOR_HEADER:
-    case COLOR_PRIMARY:
-    case COLOR_SECONDARY:
-    case COLOR_SPLIT:
+    case COLOR_HEADER_BG:
+    case COLOR_PRIMARY_BG:
+    case COLOR_SECONDARY_BG:
+    case COLOR_SPLIT_BG:
         color = &style->base[GTK_STATE_NORMAL];
         break;
 
-    case COLOR_PRIMARY_ACTIVE:
-    case COLOR_SECONDARY_ACTIVE:
-    case COLOR_SPLIT_ACTIVE:
+    case COLOR_PRIMARY_BG_ACTIVE:
+    case COLOR_SECONDARY_BG_ACTIVE:
+    case COLOR_SPLIT_BG_ACTIVE:
         color = &style->base[GTK_STATE_SELECTED];
         break;
     }

commit 904afd8bd517f20897883200feb0b821d0407b8f
Author: Geert Janssens <janssens-geert at telenet.be>
Date:   Sat Aug 30 15:51:22 2014 +0200

    Refactor register color functions to reduce duplication

diff --git a/src/register/ledger-core/split-register-model.c b/src/register/ledger-core/split-register-model.c
index 4ff22af..2e34b4e 100644
--- a/src/register/ledger-core/split-register-model.c
+++ b/src/register/ledger-core/split-register-model.c
@@ -40,15 +40,41 @@
 #include "engine-helpers.h"
 
 
-static SplitRegisterColors reg_colors =
-{
-    0x96B183,
-    0xBFDEB9,
-    0xF6FFDA,
-    0xFFEF98,
-    0xFFEF98,
-    0xEDE7D3,
-    0xFFEF98,
+typedef enum
+{
+    COLOR_TABLE_DEFAULT,
+    COLOR_TABLE_GTKRC,
+} SplitRegisterColorTable;
+
+/* Alternative color tables to use for the register.
+ * The colors in this array are ordered according to the RegisterColor Enum
+ * Be careful to respect this order !
+ */
+static const guint32 reg_colors_default [] =
+{
+    0x000000,     // COLOR_UNKNOWN
+    0x96B183,     // COLOR_HEADER
+    0xBFDEB9,     // COLOR_PRIMARY
+    0xFFEF98,     // COLOR_PRIMARY_ACTIVE
+    0xF6FFDA,     // COLOR_SECONDARY
+    0xFFEF98,     // COLOR_SECONDARY_ACTIVE
+    0xEDE7D3,     // COLOR_SPLIT
+    0xFFEF98,     // COLOR_SPLIT_ACTIVE
+};
+
+/* The colors in this array are ordered according to the RegisterColor Enum
+ * Be careful to respect this order !
+ */
+static const guint32 reg_colors_gtkrc [] =
+{
+    COLOR_UNKNOWN,          // COLOR_UNKNOWN
+    COLOR_HEADER,           // COLOR_HEADER
+    COLOR_PRIMARY,          // COLOR_PRIMARY
+    COLOR_PRIMARY_ACTIVE,   // COLOR_PRIMARY_ACTIVE
+    COLOR_SECONDARY,        // COLOR_SECONDARY
+    COLOR_SECONDARY_ACTIVE, // COLOR_SECONDARY_ACTIVE
+    COLOR_SPLIT,            // COLOR_SPLIT
+    COLOR_SPLIT_ACTIVE,     // COLOR_SPLIT_ACTIVE
 };
 
 /* This static indicates the debugging module that this .o belongs to. */
@@ -513,15 +539,15 @@ get_trans_total_balance (SplitRegister *reg, Transaction *trans)
 }
 
 static guint32
-gnc_split_register_get_shares_fg_color (VirtualLocation virt_loc,
-                                        gpointer user_data)
+gnc_split_register_get_fg_color (VirtualLocation virt_loc,
+                                 gpointer user_data)
 {
     SplitRegister *reg = user_data;
     const guint32 black = 0x000000;
     const guint32 red   = 0xff0000;
     const char * cell_name;
     gboolean is_current;
-    gnc_numeric shares;
+    gnc_numeric value;
     Split *split;
 
     if (!use_red_for_negative)
@@ -533,96 +559,64 @@ gnc_split_register_get_shares_fg_color (VirtualLocation virt_loc,
 
     cell_name = gnc_table_get_cell_name (reg->table, virt_loc);
 
-    is_current = virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
-                                      virt_loc.vcell_loc);
-
     if (gnc_cell_name_equal (cell_name, TSHRS_CELL))
-        shares = get_trans_total_amount (reg, xaccSplitGetParent (split));
-    else if (is_current)
-        shares = gnc_price_cell_get_value
-                 ((PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
-                         SHRS_CELL));
-    else
-        shares = xaccSplitGetAmount (split);
-
-    if (gnc_numeric_negative_p (shares))
-        return red;
-
-    return black;
-}
-
-static guint32
-gnc_split_register_get_balance_fg_color (VirtualLocation virt_loc,
-        gpointer user_data)
-{
-    SplitRegister *reg = user_data;
-    const guint32 black = 0x000000;
-    const guint32 red   = 0xff0000;
-    const char * cell_name;
-    gnc_numeric balance;
-    Split *split;
-
-    if (!use_red_for_negative)
-        return black;
-
-    split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
-    if (!split)
-        return black;
-
-    cell_name = gnc_table_get_cell_name (reg->table, virt_loc);
-
-    if (gnc_cell_name_equal (cell_name, BALN_CELL))
-        balance = xaccSplitGetBalance (split);
-    else if (gnc_cell_name_equal (cell_name, RBALN_CELL))
-        balance = gnc_split_register_get_rbaln (virt_loc, user_data, TRUE);
-    else
-        balance = get_trans_total_balance (reg, xaccSplitGetParent (split));
-
+        value = get_trans_total_amount (reg, xaccSplitGetParent (split));
+    else if (gnc_cell_name_equal (cell_name, SHRS_CELL))
     {
-        Account *account;
-
-        account = xaccSplitGetAccount (split);
-
-        if (gnc_reverse_balance (account))
-            balance = gnc_numeric_neg (balance);
+        if (virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
+                                      virt_loc.vcell_loc))
+            value = gnc_price_cell_get_value
+                     ((PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
+                             SHRS_CELL));
+        else
+            value = xaccSplitGetAmount (split);
     }
+    else if (gnc_cell_name_equal (cell_name, BALN_CELL))
+        value = xaccSplitGetBalance (split);
+    else if (gnc_cell_name_equal (cell_name, RBALN_CELL))
+        value = gnc_split_register_get_rbaln (virt_loc, user_data, TRUE);
+    else if (gnc_cell_name_equal (cell_name, TBALN_CELL))
+        value = get_trans_total_balance (reg, xaccSplitGetParent (split));
+
+    if ((gnc_cell_name_equal (cell_name, BALN_CELL)) ||
+            (gnc_cell_name_equal (cell_name, RBALN_CELL)) ||
+            (gnc_cell_name_equal (cell_name, TBALN_CELL)))
+        {
+            Account *account = xaccSplitGetAccount (split);
+            if (gnc_reverse_balance (account))
+                value = gnc_numeric_neg (value);
+        }
 
-    if (gnc_numeric_negative_p (balance))
+    if (gnc_numeric_negative_p (value))
         return red;
 
     return black;
 }
 
 static guint32
-gnc_split_register_get_bg_color (VirtualLocation virt_loc,
-                                 gboolean *hatching,
-                                 gpointer user_data)
+gnc_split_register_get_bg_color_internal (VirtualLocation virt_loc,
+                                          SplitRegister *reg,
+                                          const guint32 *color_table,
+                                          guint32 default_color)
 {
-    SplitRegister *reg = user_data;
     const char *cursor_name;
     VirtualCell *vcell;
-    guint32 bg_color;
     gboolean is_current;
     gboolean double_alternate_virt;
 
-    if (hatching)
-        *hatching = FALSE;
-
-    bg_color = 0xffffff; /* white */
-
     if (!reg)
-        return bg_color;
+        return default_color;
 
     if (gnc_table_virtual_location_in_header (reg->table, virt_loc))
-        return reg_colors.header_bg_color;
+        return color_table[COLOR_HEADER];
 
     vcell = gnc_table_get_virtual_cell (reg->table, virt_loc.vcell_loc);
     if (!vcell || !vcell->cellblock)
-        return bg_color;
+        return default_color;
 
     if ((virt_loc.phys_col_offset < vcell->cellblock->start_col) ||
             (virt_loc.phys_col_offset > vcell->cellblock->stop_col))
-        return bg_color;
+        return default_color;
 
     is_current = virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
                                       virt_loc.vcell_loc);
@@ -634,11 +628,11 @@ gnc_split_register_get_bg_color (VirtualLocation virt_loc,
     {
         if (is_current)
             return vcell->start_primary_color ?
-                   reg_colors.primary_active_bg_color :
-                   reg_colors.secondary_active_bg_color;
+                    color_table[COLOR_PRIMARY_ACTIVE] :
+                    color_table[COLOR_SECONDARY_ACTIVE];
 
         return vcell->start_primary_color ?
-               reg_colors.primary_bg_color : reg_colors.secondary_bg_color;
+                color_table[COLOR_PRIMARY] : color_table[COLOR_SECONDARY];
     }
 
     if (g_strcmp0 (cursor_name, CURSOR_DOUBLE_JOURNAL) == 0 ||
@@ -652,119 +646,62 @@ gnc_split_register_get_bg_color (VirtualLocation virt_loc,
         {
             if (double_alternate_virt)
                 return vcell->start_primary_color ?
-                       reg_colors.primary_active_bg_color :
-                       reg_colors.secondary_active_bg_color;
+                        color_table[COLOR_PRIMARY_ACTIVE] :
+                        color_table[COLOR_SECONDARY_ACTIVE];
 
             return (virt_loc.phys_row_offset % 2 == 0) ?
-                   reg_colors.primary_active_bg_color :
-                   reg_colors.secondary_active_bg_color;
+                    color_table[COLOR_PRIMARY_ACTIVE] :
+                    color_table[COLOR_SECONDARY_ACTIVE];
         }
 
         if (double_alternate_virt)
             return vcell->start_primary_color ?
-                   reg_colors.primary_bg_color :
-                   reg_colors.secondary_bg_color;
+                    color_table[COLOR_PRIMARY] :
+                    color_table[COLOR_SECONDARY];
 
         return (virt_loc.phys_row_offset % 2 == 0) ?
-               reg_colors.primary_bg_color :
-               reg_colors.secondary_bg_color;
+                color_table[COLOR_PRIMARY] :
+                color_table[COLOR_SECONDARY];
     }
 
     if (g_strcmp0 (cursor_name, CURSOR_SPLIT) == 0)
     {
         if (is_current)
-            return reg_colors.split_active_bg_color;
+            return color_table[COLOR_SPLIT_ACTIVE];
 
-        return reg_colors.split_bg_color;
+        return color_table[COLOR_SPLIT];
     }
 
     PWARN ("Unexpected cursor: %s\n", cursor_name);
 
-    return bg_color;
+    return default_color;
 }
 
-static RegisterColor
-gnc_split_register_get_gtkrc_bg_color (VirtualLocation virt_loc,
-                                       gboolean *hatching,
-                                       gpointer user_data)
+static guint32
+gnc_split_register_get_bg_color (VirtualLocation virt_loc,
+        gboolean *hatching,
+        gpointer user_data)
 {
     SplitRegister *reg = user_data;
-    const char *cursor_name;
-    VirtualCell *vcell;
-    gboolean is_current;
-    gboolean double_alternate_virt;
-
-    if (!reg)
-        return COLOR_UNKNOWN;
-
-    if (gnc_table_virtual_location_in_header (reg->table, virt_loc))
-        return COLOR_HEADER;
-
-    vcell = gnc_table_get_virtual_cell (reg->table, virt_loc.vcell_loc);
-    if (!vcell || !vcell->cellblock)
-        return COLOR_UNKNOWN;
-
-    if ((virt_loc.phys_col_offset < vcell->cellblock->start_col) ||
-            (virt_loc.phys_col_offset > vcell->cellblock->stop_col))
-        return COLOR_UNKNOWN;
-
-    is_current = virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc,
-                                      virt_loc.vcell_loc);
-
-    cursor_name = vcell->cellblock->cursor_name;
-
-    if (g_strcmp0 (cursor_name, CURSOR_SINGLE_JOURNAL) == 0 ||
-            g_strcmp0 (cursor_name, CURSOR_SINGLE_LEDGER) == 0)
-    {
-        if (is_current)
-            return vcell->start_primary_color ?
-                   COLOR_PRIMARY_ACTIVE :
-                   COLOR_SECONDARY_ACTIVE;
-
-        return vcell->start_primary_color ?
-               COLOR_PRIMARY : COLOR_SECONDARY;
-    }
-
-    if (g_strcmp0 (cursor_name, CURSOR_DOUBLE_JOURNAL) == 0 ||
-            g_strcmp0 (cursor_name, CURSOR_DOUBLE_JOURNAL_NUM_ACTN) == 0 ||
-            g_strcmp0 (cursor_name, CURSOR_DOUBLE_LEDGER) == 0 ||
-            g_strcmp0 (cursor_name, CURSOR_DOUBLE_LEDGER_NUM_ACTN) == 0)
-    {
-        double_alternate_virt = gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
-                                                    GNC_PREF_ALT_COLOR_BY_TRANS);
-        if (is_current)
-        {
-            if (double_alternate_virt)
-                return vcell->start_primary_color ?
-                       COLOR_PRIMARY_ACTIVE :
-                       COLOR_SECONDARY_ACTIVE;
-
-            return (virt_loc.phys_row_offset % 2 == 0) ?
-                   COLOR_PRIMARY_ACTIVE :
-                   COLOR_SECONDARY_ACTIVE;
-        }
 
-        if (double_alternate_virt)
-            return vcell->start_primary_color ?
-                   COLOR_PRIMARY :
-                   COLOR_SECONDARY;
+    if (hatching)
+        *hatching = FALSE;
 
-        return (virt_loc.phys_row_offset % 2 == 0) ?
-               COLOR_PRIMARY :
-               COLOR_SECONDARY;
-    }
+    return gnc_split_register_get_bg_color_internal (virt_loc, reg, reg_colors_default, 0xffffff);
+}
 
-    if (g_strcmp0 (cursor_name, CURSOR_SPLIT) == 0)
-    {
-        if (is_current)
-            return COLOR_SPLIT_ACTIVE;
 
-        return COLOR_SPLIT;
-    }
+static RegisterColor
+gnc_split_register_get_gtkrc_bg_color (VirtualLocation virt_loc,
+                                       gboolean *hatching,
+                                       gpointer user_data)
+{
+    SplitRegister *reg = user_data;
 
-    PWARN ("Unexpected cursor: %s\n", cursor_name);
+    if (hatching)
+        *hatching = FALSE;
 
-    return COLOR_UNKNOWN;
+    return gnc_split_register_get_bg_color_internal (virt_loc, reg, reg_colors_gtkrc, COLOR_UNKNOWN);
 }
 
 static guint32
@@ -2660,19 +2597,19 @@ gnc_split_register_model_new (void)
 
 
     gnc_table_model_set_fg_color_handler(
-        model, gnc_split_register_get_shares_fg_color, SHRS_CELL);
+        model, gnc_split_register_get_fg_color, SHRS_CELL);
 
     gnc_table_model_set_fg_color_handler(
-        model, gnc_split_register_get_shares_fg_color, TSHRS_CELL);
+        model, gnc_split_register_get_fg_color, TSHRS_CELL);
 
     gnc_table_model_set_fg_color_handler(
-        model, gnc_split_register_get_balance_fg_color, BALN_CELL);
+        model, gnc_split_register_get_fg_color, BALN_CELL);
 
     gnc_table_model_set_fg_color_handler(
-        model, gnc_split_register_get_balance_fg_color, TBALN_CELL);
+        model, gnc_split_register_get_fg_color, TBALN_CELL);
 
     gnc_table_model_set_fg_color_handler(
-        model, gnc_split_register_get_balance_fg_color, RBALN_CELL);
+        model, gnc_split_register_get_fg_color, RBALN_CELL);
 
 
     gnc_table_model_set_default_bg_color_handler(
diff --git a/src/register/ledger-core/split-register.h b/src/register/ledger-core/split-register.h
index b7ba1b4..5e82a04 100644
--- a/src/register/ledger-core/split-register.h
+++ b/src/register/ledger-core/split-register.h
@@ -238,20 +238,6 @@ typedef enum
     NUM_CURSOR_CLASSES
 } CursorClass;
 
-typedef struct split_register_colors
-{
-    guint32 header_bg_color;
-
-    guint32 primary_bg_color;
-    guint32 secondary_bg_color;
-
-    guint32 primary_active_bg_color;
-    guint32 secondary_active_bg_color;
-
-    guint32 split_bg_color;
-    guint32 split_active_bg_color;
-} SplitRegisterColors;
-
 
 /** @brief A split register created with ::gnc_split_register_new */
 typedef struct split_register SplitRegister;
diff --git a/src/register/register-core/table-allgui.c b/src/register/register-core/table-allgui.c
index 3a9041f..29ec9b0 100644
--- a/src/register/register-core/table-allgui.c
+++ b/src/register/register-core/table-allgui.c
@@ -364,12 +364,13 @@ gnc_table_get_fg_color (Table *table, VirtualLocation virt_loc)
     return fg_color_handler (virt_loc, table->model->handler_user_data);
 }
 
-guint32
-gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc,
-                        gboolean *hatching)
+static guint32
+gnc_table_get_bg_color_internal (Table *table, VirtualLocation virt_loc,
+                                 gboolean *hatching,
+                                 gboolean want_gtkrc)
 {
     TableGetBGColorHandler bg_color_handler;
-    const char *cell_name;
+    const char *handler_name = "gtkrc";
 
     if (hatching)
         *hatching = FALSE;
@@ -377,10 +378,11 @@ gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc,
     if (!table || !table->model)
         return 0xffffff; /* white */
 
-    cell_name = gnc_table_get_cell_name (table, virt_loc);
+    if (!want_gtkrc)
+        handler_name = gnc_table_get_cell_name (table, virt_loc);
 
     bg_color_handler = gnc_table_model_get_bg_color_handler (table->model,
-                       cell_name);
+            handler_name);
     if (!bg_color_handler)
         return 0xffffff;
 
@@ -389,24 +391,17 @@ gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc,
 }
 
 guint32
+gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc,
+                        gboolean *hatching)
+{
+    return gnc_table_get_bg_color_internal (table, virt_loc, hatching, FALSE);
+}
+
+guint32
 gnc_table_get_gtkrc_bg_color (Table *table, VirtualLocation virt_loc,
                               gboolean *hatching)
 {
-    TableGetBGColorHandler bg_color_handler;
-
-    if (hatching)
-        *hatching = FALSE;
-
-    if (!table || !table->model)
-        return 0xffffff; /* white */
-
-    bg_color_handler = gnc_table_model_get_bg_color_handler (table->model,
-                       "gtkrc");
-    if (!bg_color_handler)
-        return 0xffffff;
-
-    return bg_color_handler (virt_loc, hatching,
-                             table->model->handler_user_data);
+    return gnc_table_get_bg_color_internal (table, virt_loc, hatching, TRUE);
 }
 
 void

commit 0a394c5bba98b54011777668f3f8226b5962af6c
Author: Geert Janssens <janssens-geert at telenet.be>
Date:   Sat Aug 30 12:24:32 2014 +0200

    Bug 711440 - Tab labels have different background colour than containing gui element

diff --git a/src/gnome-utils/gnc-main-window.c b/src/gnome-utils/gnc-main-window.c
index 4ab4257..0635cf7 100644
--- a/src/gnome-utils/gnc-main-window.c
+++ b/src/gnome-utils/gnc-main-window.c
@@ -130,7 +130,6 @@ static void gnc_main_window_destroy (GtkObject *object);
 
 static void gnc_main_window_setup_window (GncMainWindow *window);
 static void gnc_window_main_window_init (GncWindowIface *iface);
-static gboolean main_window_find_tab_event (GncMainWindow *window, GncPluginPage *page, GtkWidget **event_p);
 #ifndef MAC_INTEGRATION
 static void gnc_main_window_update_all_menu_items (void);
 #endif
@@ -2009,31 +2008,11 @@ static void
 gnc_main_window_update_tab_color_one_page (GncPluginPage *page,
         gpointer user_data)
 {
-    GncMainWindow        *window = user_data;
-    GncMainWindowPrivate *priv;
     const gchar          *color_string;
-    GdkColor              tab_color;
-    GtkWidget            *event_box;
 
     ENTER("page %p", page);
-
-    priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
-
-    /* Get the event box to update the tab */
-    main_window_find_tab_event(window, page, &event_box);
-
     color_string = gnc_plugin_page_get_page_color(page);
-    if (color_string == NULL) color_string = "";
-    if (gdk_color_parse(color_string, &tab_color) && priv->show_color_tabs)
-    {
-        gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &tab_color);
-        gtk_widget_modify_bg(event_box, GTK_STATE_ACTIVE, &tab_color);
-    }
-    else
-    {
-        gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, NULL);
-        gtk_widget_modify_bg(event_box, GTK_STATE_ACTIVE, NULL);
-    }
+    main_window_update_page_color (page, color_string);
     LEAVE(" ");
 }
 
@@ -2142,7 +2121,7 @@ main_window_find_tab_items (GncMainWindow *window,
                             GtkWidget **entry_p)
 {
     GncMainWindowPrivate *priv;
-    GtkWidget *tab_hbox, *widget, *event_box;
+    GtkWidget *tab_hbox, *widget, *tab_widget;
     GList *children, *tmp;
 
     ENTER("window %p, page %p, label_p %p, entry_p %p",
@@ -2156,10 +2135,17 @@ main_window_find_tab_items (GncMainWindow *window,
         return FALSE;
     }
 
-    event_box = gtk_notebook_get_tab_label(GTK_NOTEBOOK(priv->notebook),
+    tab_widget = gtk_notebook_get_tab_label(GTK_NOTEBOOK(priv->notebook),
                                            page->notebook_page);
-
-    tab_hbox = gtk_bin_get_child(GTK_BIN(event_box));
+    if (GTK_IS_EVENT_BOX (tab_widget))
+        tab_hbox = gtk_bin_get_child(GTK_BIN(tab_widget));
+    else if (GTK_IS_HBOX (tab_widget))
+        tab_hbox = tab_widget;
+    else
+    {
+        PWARN ("Unknown widget for tab label %p", tab_widget);
+        return FALSE;
+    }
 
     children = gtk_container_get_children(GTK_CONTAINER(tab_hbox));
     for (tmp = children; tmp; tmp = g_list_next(tmp))
@@ -2181,16 +2167,15 @@ main_window_find_tab_items (GncMainWindow *window,
 }
 
 static gboolean
-main_window_find_tab_event (GncMainWindow *window,
-                            GncPluginPage *page,
-                            GtkWidget **event_p)
+main_window_find_tab_widget (GncMainWindow *window,
+                             GncPluginPage *page,
+                             GtkWidget **widget_p)
 {
     GncMainWindowPrivate *priv;
-    GtkWidget *event_box;
 
-    ENTER("window %p, page %p, event %p",
-          window, page, event_p);
-    *event_p = NULL;
+    ENTER("window %p, page %p, widget %p",
+          window, page, widget_p);
+    *widget_p = NULL;
 
     if (!page->notebook_page)
     {
@@ -2199,17 +2184,11 @@ main_window_find_tab_event (GncMainWindow *window,
     }
 
     priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
-    event_box = gtk_notebook_get_tab_label(GTK_NOTEBOOK(priv->notebook),
+    *widget_p = gtk_notebook_get_tab_label(GTK_NOTEBOOK(priv->notebook),
                                            page->notebook_page);
-    if (GTK_IS_EVENT_BOX(event_box))
-    {
-        *event_p = event_box;
-        LEAVE("event %p", *event_p);
-        return (TRUE);
-    }
 
-    LEAVE("event %p", *event_p);
-    return (FALSE);
+    LEAVE("widget %p", *widget_p);
+    return TRUE;
 }
 
 void
@@ -2218,7 +2197,7 @@ main_window_update_page_name (GncPluginPage *page,
 {
     GncMainWindow *window;
     GncMainWindowPrivate *priv;
-    GtkWidget *label, *entry, *event_box;
+    GtkWidget *label, *entry;
     gchar *name, *old_page_name, *old_page_long_name;
 
     ENTER(" ");
@@ -2264,14 +2243,15 @@ main_window_update_page_name (GncPluginPage *page,
     {
         gchar *new_page_long_name;
         gint string_position;
+        GtkWidget *tab_widget;
 
         string_position = strlen(old_page_long_name) - strlen(old_page_name);
         new_page_long_name = g_strconcat(g_strndup(old_page_long_name, string_position), name, NULL);
 
         gnc_plugin_page_set_page_long_name(page, new_page_long_name);
 
-        if (main_window_find_tab_event(window, page, &event_box))
-            gtk_widget_set_tooltip_text(event_box, new_page_long_name);
+        if (main_window_find_tab_widget(window, page, &tab_widget))
+            gtk_widget_set_tooltip_text(tab_widget, new_page_long_name);
 
         g_free(new_page_long_name);
     }
@@ -2300,44 +2280,55 @@ main_window_update_page_color (GncPluginPage *page,
 {
     GncMainWindow *window;
     GncMainWindowPrivate *priv;
-    GtkWidget *event_box;
+    GtkWidget *tab_widget;
     GdkColor tab_color;
-    gchar *color_string;
+    gchar *color_string = NULL;
+    gboolean want_color = FALSE;
 
     ENTER(" ");
-    if ((color_in == NULL) || (*color_in == '\0'))
-    {
-        LEAVE("no string");
-        return;
-    }
-    color_string = g_strstrip(g_strdup(color_in));
+    if (color_in)
+        color_string = g_strstrip(g_strdup(color_in));
 
-    /* Optimization, if the color hasn't changed, don't update. */
-    if (*color_string == '\0' || 0 == g_strcmp0(color_string, gnc_plugin_page_get_page_color(page)))
-    {
-        g_free(color_string);
-        LEAVE("empty string or color unchanged");
-        return;
-    }
+    if (color_string && *color_string != '\0')
+        want_color = TRUE;
 
     /* Update the plugin */
     window = GNC_MAIN_WINDOW(page->window);
-    gnc_plugin_page_set_page_color(page, color_string);
-
-    priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
+    if (want_color)
+        gnc_plugin_page_set_page_color(page, color_string);
+    else
+        gnc_plugin_page_set_page_color(page, NULL);
 
     /* Update the notebook tab */
-    main_window_find_tab_event(window, page, &event_box);
+    main_window_find_tab_widget (window, page, &tab_widget);
+    priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
 
-    if (gdk_color_parse(color_string, &tab_color) && priv->show_color_tabs)
+    if (want_color && gdk_color_parse(color_string, &tab_color) && priv->show_color_tabs)
     {
-        gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &tab_color);
-        gtk_widget_modify_bg(event_box, GTK_STATE_ACTIVE, &tab_color);
+        if (!GTK_IS_EVENT_BOX (tab_widget))
+        {
+            GtkWidget *event_box = gtk_event_box_new ();
+            g_object_ref (tab_widget);
+            gtk_notebook_set_tab_label (GTK_NOTEBOOK(priv->notebook),
+                                        page->notebook_page, event_box);
+            gtk_container_add (GTK_CONTAINER(event_box), tab_widget);
+            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);
     }
     else
     {
-        gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, NULL);
-        gtk_widget_modify_bg(event_box, GTK_STATE_ACTIVE, NULL);
+        if (GTK_IS_EVENT_BOX (tab_widget))
+        {
+            GtkWidget *tab_hbox = gtk_bin_get_child(GTK_BIN(tab_widget));
+            g_object_ref (tab_hbox);
+            gtk_container_remove (GTK_CONTAINER(tab_widget), tab_hbox);
+            gtk_notebook_set_tab_label (GTK_NOTEBOOK(priv->notebook),
+                                        page->notebook_page, tab_hbox);
+            g_object_unref (tab_hbox);
+        }
     }
     g_free(color_string);
     LEAVE("done");
@@ -2882,7 +2873,7 @@ gnc_main_window_open_page (GncMainWindow *window,
 {
     GncMainWindowPrivate *priv;
     GtkWidget *tab_hbox;
-    GtkWidget *label, *entry, *event_box;
+    GtkWidget *label, *entry;
     const gchar *icon, *text, *color_string;
     GtkWidget *image;
     GList *tmp;
@@ -2955,27 +2946,10 @@ gnc_main_window_open_page (GncMainWindow *window,
     else
         gtk_box_pack_start (GTK_BOX (tab_hbox), label, TRUE, TRUE, 0);
 
-    event_box = gtk_event_box_new();
-    gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box), TRUE);
-    gtk_widget_show(event_box);
-    gtk_container_add(GTK_CONTAINER(event_box), tab_hbox);
-    color_string = gnc_plugin_page_get_page_color(page);
-    if (color_string == NULL) color_string = "";
-    if (gdk_color_parse(color_string, &tab_color) && priv->show_color_tabs)
-    {
-        gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &tab_color);
-        gtk_widget_modify_bg(event_box, GTK_STATE_ACTIVE, &tab_color);
-    }
-    else
-    {
-        gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, NULL);
-        gtk_widget_modify_bg(event_box, GTK_STATE_ACTIVE, NULL);
-    }
-
     text = gnc_plugin_page_get_page_long_name(page);
     if (text)
     {
-        gtk_widget_set_tooltip_text(event_box, text);
+        gtk_widget_set_tooltip_text(tab_hbox, text);
     }
 
     entry = gtk_entry_new();
@@ -3029,7 +3003,10 @@ gnc_main_window_open_page (GncMainWindow *window,
     /*
      * Now install it all in the window.
      */
-    gnc_main_window_connect(window, page, event_box, label);
+    gnc_main_window_connect(window, page, tab_hbox, label);
+
+    color_string = gnc_plugin_page_get_page_color(page);
+    main_window_update_page_color (page, color_string);
     LEAVE("");
 }
 
diff --git a/src/gnome-utils/gnc-plugin-page.c b/src/gnome-utils/gnc-plugin-page.c
index 86a803b..55b4dc9 100644
--- a/src/gnome-utils/gnc-plugin-page.c
+++ b/src/gnome-utils/gnc-plugin-page.c
@@ -868,7 +868,8 @@ gnc_plugin_page_set_page_color (GncPluginPage *page, const gchar *color)
     priv = GNC_PLUGIN_PAGE_GET_PRIVATE(page);
     if (priv->page_color)
         g_free(priv->page_color);
-    priv->page_color = g_strdup(color);
+    if (color)
+        priv->page_color = g_strdup(color);
 }
 
 



Summary of changes:
 src/business/business-ledger/gncEntryLedger.h      |  11 -
 src/business/business-ledger/gncEntryLedgerModel.c |  94 +++++--
 src/gnome-utils/gnc-main-window.c                  | 155 +++++------
 src/gnome-utils/gnc-plugin-page.c                  |   3 +-
 src/register/ledger-core/split-register-model.c    | 302 ++++++++-------------
 src/register/ledger-core/split-register-model.h    |  12 -
 src/register/ledger-core/split-register.h          |  14 -
 src/register/register-core/table-allgui.c          |  59 ++--
 src/register/register-core/table-allgui.h          |  88 ++++++
 src/register/register-gnome/gnucash-grid.c         |  24 +-
 src/register/register-gnome/gnucash-header.c       |  10 +-
 src/register/register-gnome/gnucash-item-edit.c    |   6 +-
 src/register/register-gnome/gnucash-sheet.c        |  61 ++++-
 13 files changed, 445 insertions(+), 394 deletions(-)



More information about the gnucash-changes mailing list