[gcalctool] Move MathEquation from global variable



commit e47f5cba460e1b08c05dd083a80b2e029518c3aa
Author: Robert Ancell <robert ancell gmail com>
Date:   Tue Apr 6 09:00:53 2010 +1000

    Move MathEquation from global variable

 src/calctool.c       |    1 -
 src/calctool.h       |    3 --
 src/financial.c      |   68 ++++++++++++++++++++--------------------
 src/financial.h      |    3 +-
 src/math-buttons.c   |   51 ++++++++++++++++-------------
 src/math-display.c   |   86 ++++++++++++++++++++++++++++++++++++++++++++------
 src/math-display.h   |    6 +++-
 src/math-equation.c  |   16 +++++-----
 src/ui-preferences.c |   27 ++++++++-------
 src/ui.c             |   11 ++++++-
 src/ui.h             |    3 ++
 11 files changed, 180 insertions(+), 95 deletions(-)
---
diff --git a/src/calctool.c b/src/calctool.c
index 80a02e0..61438c3 100644
--- a/src/calctool.c
+++ b/src/calctool.c
@@ -217,7 +217,6 @@ main(int argc, char **argv)
 
     init_state();
     register_init();
-    v->display = math_equation_new();
     ui_gtk_init(&argc, &argv);
 
     get_options(argc, argv);
diff --git a/src/calctool.h b/src/calctool.h
index 100ef14..cc6098d 100644
--- a/src/calctool.h
+++ b/src/calctool.h
@@ -24,7 +24,6 @@
 
 #include "config.h"
 #include "mp.h"
-#include "math-equation.h"
 #include "ui.h"
 
 /* To make lint happy. */
@@ -51,8 +50,6 @@
 typedef struct {
     char *progname;           /* Name of this program. */
 
-    MathEquation *display;        /* Display stack */
-
     const char *digits[16];   /* Localized digit values */
     const char *radix;        /* Locale specific radix string. */
     const char *tsep;         /* Locale specific thousands separator. */
diff --git a/src/financial.c b/src/financial.c
index 532c580..faf0105 100644
--- a/src/financial.c
+++ b/src/financial.c
@@ -23,8 +23,8 @@
 
 #include <libintl.h>
 
-void
-calc_ctrm(MPNumber *t, MPNumber *pint, MPNumber *fv, MPNumber *pv)
+static void
+calc_ctrm(MathEquation *equation, MPNumber *t, MPNumber *pint, MPNumber *fv, MPNumber *pv)
 {
 
 /*  Cterm - pint (periodic interest rate).
@@ -43,8 +43,8 @@ calc_ctrm(MPNumber *t, MPNumber *pint, MPNumber *fv, MPNumber *pv)
 }
 
 
-void
-calc_ddb(MPNumber *t, MPNumber *cost, MPNumber *life, MPNumber *period)
+static void
+calc_ddb(MathEquation *equation, MPNumber *t, MPNumber *cost, MPNumber *life, MPNumber *period)
 {
 
 /*  Ddb   - cost    (amount paid for asset).
@@ -76,15 +76,14 @@ calc_ddb(MPNumber *t, MPNumber *cost, MPNumber *life, MPNumber *period)
     }
 
     if (len >= 0) {
-        display_set_error (v->display,
-                           ("Error: the number of periods must be positive"));
+        display_set_error (equation, ("Error: the number of periods must be positive"));
         mp_set_from_integer(0, t);
     }
 }
 
 
-void
-calc_fv(MPNumber *t, MPNumber *pmt, MPNumber *pint, MPNumber *n)
+static void
+calc_fv(MathEquation *equation, MPNumber *t, MPNumber *pmt, MPNumber *pint, MPNumber *n)
 {
 
 /*  Fv    - pmt (periodic payment).
@@ -104,8 +103,8 @@ calc_fv(MPNumber *t, MPNumber *pmt, MPNumber *pint, MPNumber *n)
 }
 
 
-void
-calc_gpm(MPNumber *t, MPNumber *cost, MPNumber *margin)
+static void
+calc_gpm(MathEquation *equation, MPNumber *t, MPNumber *cost, MPNumber *margin)
 {
 
 /*  Gpm   - cost (cost of sale).
@@ -122,8 +121,8 @@ calc_gpm(MPNumber *t, MPNumber *cost, MPNumber *margin)
 }
 
 
-void
-calc_pmt(MPNumber *t, MPNumber *prin, MPNumber *pint, MPNumber *n)
+static void
+calc_pmt(MathEquation *equation, MPNumber *t, MPNumber *prin, MPNumber *pint, MPNumber *n)
 {
 
 /*  Pmt   - prin (principal).
@@ -145,8 +144,8 @@ calc_pmt(MPNumber *t, MPNumber *prin, MPNumber *pint, MPNumber *n)
 }
 
 
-void
-calc_pv(MPNumber *t, MPNumber *pmt, MPNumber *pint, MPNumber *n)
+static void
+calc_pv(MathEquation *equation, MPNumber *t, MPNumber *pmt, MPNumber *pint, MPNumber *n)
 {
 
 /*  Pv    - pmt (periodic payment).
@@ -168,8 +167,8 @@ calc_pv(MPNumber *t, MPNumber *pmt, MPNumber *pint, MPNumber *n)
 }
 
 
-void
-calc_rate(MPNumber *t, MPNumber *fv, MPNumber *pv, MPNumber *n)
+static void
+calc_rate(MathEquation *equation, MPNumber *t, MPNumber *fv, MPNumber *pv, MPNumber *n)
 {
 
 /*  Rate  - fv (future value).
@@ -189,8 +188,8 @@ calc_rate(MPNumber *t, MPNumber *fv, MPNumber *pv, MPNumber *n)
 }
 
 
-void
-calc_sln(MPNumber *t, MPNumber *cost, MPNumber *salvage, MPNumber *life)
+static void
+calc_sln(MathEquation *equation, MPNumber *t, MPNumber *cost, MPNumber *salvage, MPNumber *life)
 {
 
 /*  Sln   - cost    (cost of the asset).
@@ -206,8 +205,8 @@ calc_sln(MPNumber *t, MPNumber *cost, MPNumber *salvage, MPNumber *life)
 }
 
 
-void
-calc_syd(MPNumber *t, MPNumber *cost, MPNumber *salvage, MPNumber *life, MPNumber *period)
+static void
+calc_syd(MathEquation *equation, MPNumber *t, MPNumber *cost, MPNumber *salvage, MPNumber *life, MPNumber *period)
 {
 
 /*  Syd   - cost    (cost of the asset).
@@ -233,8 +232,8 @@ calc_syd(MPNumber *t, MPNumber *cost, MPNumber *salvage, MPNumber *life, MPNumbe
 }
 
 
-void
-calc_term(MPNumber *t, MPNumber *pmt, MPNumber *fv, MPNumber *pint)
+static void
+calc_term(MathEquation *equation, MPNumber *t, MPNumber *pmt, MPNumber *fv, MPNumber *pint)
 {
 
 /*  Term  - pmt (periodic payment).
@@ -255,41 +254,42 @@ calc_term(MPNumber *t, MPNumber *pmt, MPNumber *fv, MPNumber *pint)
     mp_divide(&MP1, &MP2, t);
 }
 
+
 void
-do_finc_expression(int function, MPNumber *arg1, MPNumber *arg2, MPNumber *arg3, MPNumber *arg4)
+do_finc_expression(MathEquation *equation, int function, MPNumber *arg1, MPNumber *arg2, MPNumber *arg3, MPNumber *arg4)
 {
     MPNumber result;
     switch (function) {
      case FINC_CTRM_DIALOG:
-       calc_ctrm(&result, arg1, arg2, arg3);
+       calc_ctrm(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_DDB_DIALOG:
-       calc_ddb(&result, arg1, arg2, arg3);
+       calc_ddb(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_FV_DIALOG:
-       calc_fv(&result, arg1, arg2, arg3);
+       calc_fv(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_GPM_DIALOG:
-       calc_gpm(&result, arg1, arg2);
+       calc_gpm(equation, &result, arg1, arg2);
        break;
      case FINC_PMT_DIALOG:
-       calc_pmt(&result, arg1, arg2, arg3);
+       calc_pmt(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_PV_DIALOG:
-       calc_pv(&result, arg1, arg2, arg3);
+       calc_pv(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_RATE_DIALOG:
-       calc_rate(&result, arg1, arg2, arg3);
+       calc_rate(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_SLN_DIALOG:
-       calc_sln(&result, arg1, arg2, arg3);
+       calc_sln(equation, &result, arg1, arg2, arg3);
        break;
      case FINC_SYD_DIALOG:
-       calc_syd(&result, arg1, arg2, arg3, arg4);
+       calc_syd(equation, &result, arg1, arg2, arg3, arg4);
        break;
      case FINC_TERM_DIALOG:
-       calc_term(&result, arg1, arg2, arg3);
+       calc_term(equation, &result, arg1, arg2, arg3);
        break;
     }
-    display_set_number(v->display, &result);
+    display_set_number(equation, &result);
 }
diff --git a/src/financial.h b/src/financial.h
index 7b4a6f4..6aa8f3c 100644
--- a/src/financial.h
+++ b/src/financial.h
@@ -21,8 +21,9 @@
 #define FINANCIAL_H
 
 #include "mp.h"
+#include "math-equation.h"
 
-void do_finc_expression(int function, MPNumber *arg1, MPNumber *arg2, MPNumber *arg3, MPNumber *arg4);
+void do_finc_expression(MathEquation *equation, int function, MPNumber *arg1, MPNumber *arg2, MPNumber *arg3, MPNumber *arg4);
 
 enum finc_dialogs {
     FINC_CTRM_DIALOG,
diff --git a/src/math-buttons.c b/src/math-buttons.c
index de31039..213a936 100644
--- a/src/math-buttons.c
+++ b/src/math-buttons.c
@@ -20,7 +20,6 @@
 #include "register.h"
 #include "financial.h"
 #include "currency.h"
-#include "calctool.h" // FIXME: TEMP
 
 enum {
     PROP_0,
@@ -32,7 +31,7 @@ enum {
 
 struct MathButtonsPrivate
 {
-    MathDisplay *display;
+    MathDisplay *display; // FIXME: Change to MathEquation
 
     ButtonMode mode;
     GtkBuilder *basic_ui, *advanced_ui, *financial_ui, *programming_ui;
@@ -287,7 +286,7 @@ load_mode(MathButtons *buttons, ButtonMode mode)
 {
     GtkBuilder *builder, **builder_ptr;
     gint i;
-    gchar name[MAXLINE];
+    gchar *name;
     const gchar *builder_file;
     gchar *objects[] = { "button_panel", "character_code_dialog", "currency_dialog",
                          "ctrm_dialog", "ddb_dialog", "fv_dialog", "gpm_dialog",
@@ -331,18 +330,20 @@ load_mode(MathButtons *buttons, ButtonMode mode)
 
     /* Connect text to buttons */
     for (i = 0; button_data[i].widget_name != NULL; i++) {
-        snprintf(name, MAXLINE, "calc_%s_button", button_data[i].widget_name);
+        name = g_strdup_printf("calc_%s_button", button_data[i].widget_name);
         set_string_data(builder, name, "calc_text", button_data[i].data);
+        g_free(name);
     }
 
     /* Localize buttons */
     for (i = 0; i < 16; i++) {
         GtkWidget *button;
 
-        snprintf(name, MAXLINE, "calc_%d_button", i);
+        name = g_strdup_printf("calc_%d_button", i);
         button = GET_WIDGET(builder, name);     
         if (button)
             gtk_button_set_label(GTK_BUTTON(button), math_display_get_digit_text(buttons->priv->display, i));
+        g_free(name);
     }
     widget = GET_WIDGET(builder, "calc_numeric_point_button");
     if (widget)
@@ -350,9 +351,10 @@ load_mode(MathButtons *buttons, ButtonMode mode)
 
     /* Connect super and subscript */
     for (i = 0; i < 10; i++) {
-        snprintf(name, MAXLINE, "calc_%d_button", i);
+        name = g_strdup_printf("calc_%d_button", i);
         set_int_data(builder, name, "calc_digit", i);
         set_tint(GET_WIDGET(builder, name), &buttons->priv->colour_numbers, 1);
+        g_free(name);
     }
   
     widget = GET_WIDGET(builder, "superscript_togglebutton");
@@ -441,9 +443,10 @@ load_mode(MathButtons *buttons, ButtonMode mode)
 
         buttons->priv->bit_panel = GET_WIDGET(builder, "bit_table");
         for (i = 0; i < MAXBITS; i++) {
-            snprintf(name, MAXLINE, "bit_label_%d", i);
+            name = g_strdup_printf("bit_label_%d", i);
             buttons->priv->bit_labels[i] = GET_WIDGET(builder, name);
-            snprintf(name, MAXLINE, "bit_eventbox_%d", i);
+            g_free(name);
+            name = g_strdup_printf("bit_eventbox_%d", i);
             set_int_data(builder, name, "bit_index", i);
         }
     }
@@ -595,14 +598,15 @@ update_store_menu(MathButtons *buttons)
     }
 
     for (i = 0; registers[i] != NULL; i++) {
-        char value[MAXLINE] = "", mstr[MAXLINE];
+        gchar value[1024] = "", *mstr;
         MPNumber *t;
 
         t = register_get_value(registers[i]);
         if (t)
-            display_make_number(v->display, value, MAXLINE, t);
-        snprintf(mstr, MAXLINE, "<span weight=\"bold\">%s</span> = %s", registers[i], value);
+            display_make_number(math_display_get_equation(buttons->priv->display), value, 1024, t);
+        mstr = g_strdup_printf("<span weight=\"bold\">%s</span> = %s", registers[i], value);
         gtk_label_set_markup_with_mnemonic(GTK_LABEL(buttons->priv->store_menu_labels[i]), mstr);
+        g_free(mstr);
     }
 }
 
@@ -670,14 +674,15 @@ update_recall_menu(MathButtons *buttons)
     }
 
     for (i = 0; registers[i] != NULL; i++) {
-        char value[MAXLINE] = "", mstr[MAXLINE];
+        gchar value[1024] = "", *mstr;
         MPNumber *t;
 
         t = register_get_value(registers[i]);
         if (t)
-            display_make_number(v->display, value, MAXLINE, t);
-        snprintf(mstr, MAXLINE, "<span weight=\"bold\">%s</span> = %s", registers[i], value);
+            display_make_number(math_display_get_equation(buttons->priv->display), value, 1024, t);
+        mstr = g_strdup_printf("<span weight=\"bold\">%s</span> = %s", registers[i], value);
         gtk_label_set_markup_with_mnemonic(GTK_LABEL(buttons->priv->recall_menu_labels[i]), mstr);
+        g_free(mstr);
     }
 }
 
@@ -873,7 +878,7 @@ finc_response_cb(GtkWidget *widget, gint response_id, MathButtons *buttons)
     }
     gtk_widget_grab_focus(GET_WIDGET(buttons->priv->financial_ui, finc_dialog_fields[dialog][0]));
 
-    do_finc_expression(dialog, &arg[0], &arg[1], &arg[2], &arg[3]);
+    do_finc_expression(math_display_get_equation(buttons->priv->display), dialog, &arg[0], &arg[1], &arg[2], &arg[3]);
 }
 
 
@@ -996,7 +1001,7 @@ currency_cb(GtkWidget *widget, MathButtons *buttons)
     win = GTK_DIALOG(gtk_builder_get_object(buttons->priv->financial_ui, "currency_dialog"));
     c_amount_upper = GTK_SPIN_BUTTON(gtk_builder_get_object(buttons->priv->financial_ui, "currency_amount_upper"));
     c_amount_lower = GTK_SPIN_BUTTON(gtk_builder_get_object(buttons->priv->financial_ui, "currency_amount_lower"));
-    if (display_is_usable_number(v->display, &display_val)) {
+    if (display_is_usable_number(math_display_get_equation(buttons->priv->display), &display_val)) {
         double start_val = mp_cast_to_double(&display_val);
         gtk_spin_button_set_value(c_amount_upper, start_val);
     }
@@ -1009,7 +1014,7 @@ currency_cb(GtkWidget *widget, MathButtons *buttons)
         mp_set_from_string(result, &display_val);
         g_free(result);
 
-        display_set_number(v->display, &display_val);
+        display_set_number(math_display_get_equation(buttons->priv->display), &display_val);
     }
 
     gtk_widget_hide(GTK_WIDGET(win));
@@ -1123,9 +1128,9 @@ number_mode_changed_cb(MathDisplay *display, MathButtons *buttons)
 
 static void
 math_buttons_set_property (GObject      *object,
-                         guint         prop_id,
-                         const GValue *value,
-                         GParamSpec   *pspec)
+                           guint         prop_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
 {
     MathButtons *self;
 
@@ -1145,9 +1150,9 @@ math_buttons_set_property (GObject      *object,
 
 static void
 math_buttons_get_property (GObject    *object,
-                         guint       prop_id,
-                         GValue     *value,
-                         GParamSpec *pspec)
+                           guint       prop_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
 {
     MathButtons *self;
 
diff --git a/src/math-display.c b/src/math-display.c
index 1686715..bcfa0cf 100644
--- a/src/math-display.c
+++ b/src/math-display.c
@@ -20,10 +20,14 @@
 #include <gdk/gdkkeysyms.h>
 
 #include "math-display.h"
-#include "math-equation.h" // FIXME: Move into math-display.h
 #include "calctool.h" // FIXME: TEMP
 
 enum {
+    PROP_0,
+    PROP_EQUATION
+};
+
+enum {
     NUMBER_MODE_CHANGED,
     LAST_SIGNAL
 };
@@ -31,6 +35,8 @@ static guint signals[LAST_SIGNAL] = { 0, };
 
 struct MathDisplayPrivate
 {
+    MathEquation *equation;
+
     NumberMode number_mode;
     gboolean can_super_minus;
 
@@ -51,9 +57,16 @@ G_DEFINE_TYPE (MathDisplay, math_display, GTK_TYPE_VBOX);
 #define GET_WIDGET(ui, name)  GTK_WIDGET(gtk_builder_get_object(ui, name))
 
 MathDisplay *
-math_display_new()
+math_display_new(MathEquation *equation)
+{
+    return g_object_new (math_display_get_type(), "equation", equation, NULL);
+}
+
+
+MathEquation *
+math_display_get_equation(MathDisplay *display)
 {
-    return g_object_new (math_display_get_type(), NULL);
+    return display->priv->equation;
 }
 
 
@@ -134,7 +147,7 @@ do_button(MathDisplay *display, int function, gpointer arg)
         do_button(display, FN_TEXT, "^");
     }
     else {
-        display_do_function(v->display, function, arg, cursor_start, cursor_end);
+        display_do_function(display->priv->equation, function, arg, cursor_start, cursor_end);
         if (function == FN_TEXT)
             display->priv->last_text = (char *)arg;
         else
@@ -602,18 +615,18 @@ void
 math_display_set_base(MathDisplay *display, gint base)
 {
     /* If has a number already in a base, then solve and convert it */
-    if (!display_is_result(v->display) && display_is_number_with_base(v->display))
+    if (!display_is_result(display->priv->equation) && display_is_number_with_base(display->priv->equation))
         math_display_solve(display);
 
-    if (display_is_result(v->display)) {
+    if (display_is_result(display->priv->equation)) {
         if (base == 2)
-            display_convert (v->display, BIN);
+            display_convert(display->priv->equation, BIN);
         else if (base == 8)
-            display_convert (v->display, OCT);
+            display_convert(display->priv->equation, OCT);
         else if (base == 16)
-            display_convert (v->display, HEX);
+            display_convert(display->priv->equation, HEX);
         else
-            display_convert (v->display, DEC);
+            display_convert(display->priv->equation, DEC);
     }
     else {
         if (base == 2)
@@ -627,12 +640,65 @@ math_display_set_base(MathDisplay *display, gint base)
 
 
 static void
+math_display_set_property (GObject      *object,
+                           guint         prop_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+    MathDisplay *self;
+
+    self = MATH_DISPLAY (object);
+
+    switch (prop_id) {
+    case PROP_EQUATION:
+        self->priv->equation = g_value_get_object (value);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+
+static void
+math_display_get_property (GObject    *object,
+                           guint       prop_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+    MathDisplay *self;
+
+    self = MATH_DISPLAY (object);
+
+    switch (prop_id) {
+    case PROP_EQUATION:
+        g_value_set_object (value, self->priv->equation);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+
+static void
 math_display_class_init (MathDisplayClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
+    object_class->get_property = math_display_get_property;
+    object_class->set_property = math_display_set_property;
+
     g_type_class_add_private (klass, sizeof (MathDisplayPrivate));
 
+    g_object_class_install_property(object_class,
+                                    PROP_EQUATION,
+                                    g_param_spec_object("equation",
+                                                        "equation",
+                                                        "Equation being displayed",
+                                                        math_equation_get_type(),
+                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
     signals[NUMBER_MODE_CHANGED] =
         g_signal_new ("number-mode-changed",
                       G_TYPE_FROM_CLASS (klass),
diff --git a/src/math-display.h b/src/math-display.h
index b2088cf..d1872ee 100644
--- a/src/math-display.h
+++ b/src/math-display.h
@@ -22,6 +22,8 @@
 #include <glib-object.h>
 #include <gtk/gtk.h>
 
+#include "math-equation.h"
+
 G_BEGIN_DECLS
 
 #define MATH_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), math_display_get_type(), MathDisplay))
@@ -48,7 +50,9 @@ typedef enum {
 } NumberMode;
 
 GType math_display_get_type();
-MathDisplay *math_display_new();
+MathDisplay *math_display_new(MathEquation *equation);
+
+MathEquation *math_display_get_equation(MathDisplay *display);
 
 void math_display_set_base(MathDisplay *display, gint base);
 void math_display_set_number_mode(MathDisplay *display, NumberMode mode);
diff --git a/src/math-equation.c b/src/math-equation.c
index 9cea6c4..612ed72 100644
--- a/src/math-equation.c
+++ b/src/math-equation.c
@@ -914,27 +914,27 @@ do_shift(MathEquation *display, int count)
 }
 
 
-void
-do_factorize()
+static void
+do_factorize(MathEquation *equation)
 {
     MPNumber value;
 
-    if (!display_is_usable_number(v->display, &value)) {
+    if (!display_is_usable_number(equation, &value)) {
         /* Translators: Error displayed when trying to factorize a non-integer value */
         math_display_set_status(ui_get_display(X), _("Need an integer to factorize"));
         return;
     }
-    display_clear(v->display);
+    display_clear(equation);
 
     GList *factors = mp_factorize(&value);
 
-    display_insert_number(v->display, -1, -1, factors->data);
+    display_insert_number(equation, -1, -1, factors->data);
     g_slice_free(MPNumber, factors->data);
 
     GList *list = factors->next;
     for (; list != NULL; list = list->next) {
-            display_insert(v->display, -1, -1, "Ã?");
-            display_insert_number(v->display, -1, -1, list->data);
+            display_insert(equation, -1, -1, "Ã?");
+            display_insert_number(equation, -1, -1, list->data);
             g_slice_free(MPNumber, list->data);
     }
     g_list_free(factors);
@@ -990,7 +990,7 @@ display_do_function(MathEquation *display, int function, gpointer arg, int curso
             break;
 
         case FN_FACTORIZE:
-            do_factorize(display, GPOINTER_TO_INT (arg));
+            do_factorize(display);
             break;
 
         case FN_PASTE:
diff --git a/src/ui-preferences.c b/src/ui-preferences.c
index f3a8d80..f732c1f 100644
--- a/src/ui-preferences.c
+++ b/src/ui-preferences.c
@@ -26,7 +26,8 @@
           GTK_WIDGET(gtk_builder_get_object(ui, name))
 
 
-PreferencesDialog *ui_preferences_dialog_new(GCalctoolUI *ui)
+PreferencesDialog *
+ui_preferences_dialog_new(GCalctoolUI *ui)
 {
     PreferencesDialog *dialog;
   
@@ -55,7 +56,7 @@ preferences_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, PreferencesDial
 
 G_MODULE_EXPORT
 void
-angle_unit_combobox_changed_cb(GtkWidget *combo)
+angle_unit_combobox_changed_cb(GtkWidget *combo, PreferencesDialog *dialog)
 {
     int i;
     const gchar *value;
@@ -77,7 +78,7 @@ angle_unit_combobox_changed_cb(GtkWidget *combo)
     gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter);
     gtk_tree_model_get(model, &iter, 1, &value, -1);
     for (i = 0; unit_map[i].value != NULL && strcmp(unit_map[i].value, value) != 0; i++);
-    display_set_angle_unit(v->display, unit_map[i].units);
+    display_set_angle_unit(ui_get_equation(dialog->ui), unit_map[i].units);
 
     set_resource(R_TRIG, value);
 }
@@ -85,7 +86,7 @@ angle_unit_combobox_changed_cb(GtkWidget *combo)
 
 G_MODULE_EXPORT
 void
-display_format_combobox_changed_cb(GtkWidget *combo)
+display_format_combobox_changed_cb(GtkWidget *combo, PreferencesDialog *dialog)
 {
     int i;
     const gchar *value;
@@ -110,7 +111,7 @@ display_format_combobox_changed_cb(GtkWidget *combo)
     gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter);
     gtk_tree_model_get(model, &iter, 1, &value, -1);
     for (i = 0; mode_map[i].value != NULL && strcmp(mode_map[i].value, value) != 0; i++);
-    display_set_format(v->display, mode_map[i].format);
+    display_set_format(ui_get_equation(dialog->ui), mode_map[i].format);
 
     set_resource(R_DISPLAY, value);
 }
@@ -118,7 +119,7 @@ display_format_combobox_changed_cb(GtkWidget *combo)
 
 G_MODULE_EXPORT
 void
-word_size_combobox_changed_cb(GtkWidget *combo)
+word_size_combobox_changed_cb(GtkWidget *combo, PreferencesDialog *dialog)
 {
     gint value;
     GtkTreeModel *model;
@@ -127,7 +128,7 @@ word_size_combobox_changed_cb(GtkWidget *combo)
     model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
     gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter);
     gtk_tree_model_get(model, &iter, 1, &value, -1);
-    display_set_word_size(v->display, value);
+    display_set_word_size(ui_get_equation(dialog->ui), value);
 
     set_int_resource(R_WORDLEN, value);
 }
@@ -135,12 +136,12 @@ word_size_combobox_changed_cb(GtkWidget *combo)
 
 G_MODULE_EXPORT
 void
-decimal_places_spin_change_value_cb(GtkWidget *spin)
+decimal_places_spin_change_value_cb(GtkWidget *spin, PreferencesDialog *dialog)
 {
     gint value = 0;
 
     value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
-    display_set_accuracy(v->display, value);
+    display_set_accuracy(ui_get_equation(dialog->ui), value);
 
     set_int_resource(R_ACCURACY, value);
 }
@@ -148,24 +149,24 @@ decimal_places_spin_change_value_cb(GtkWidget *spin)
 
 G_MODULE_EXPORT
 void
-thousands_separator_check_toggled_cb(GtkWidget *check)
+thousands_separator_check_toggled_cb(GtkWidget *check, PreferencesDialog *dialog)
 {
     gboolean value;
 
     value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
-    display_set_show_thousands_separator(v->display, value);
+    display_set_show_thousands_separator(ui_get_equation(dialog->ui), value);
     set_boolean_resource(R_TSEP, value);
 }
 
 
 G_MODULE_EXPORT
 void
-trailing_zeroes_check_toggled_cb(GtkWidget *check)
+trailing_zeroes_check_toggled_cb(GtkWidget *check, PreferencesDialog *dialog)
 {
     gboolean value;
 
     value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
-    display_set_show_trailing_zeroes(v->display, value);
+    display_set_show_trailing_zeroes(ui_get_equation(dialog->ui), value);
     set_boolean_resource(R_ZEROES, value);
 }
 
diff --git a/src/ui.c b/src/ui.c
index e279b72..c8cb834 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -28,6 +28,7 @@ struct GCalctoolUIPrivate
 {
     GtkBuilder *ui;
     GtkWidget *main_window;
+    MathEquation *equation;
     MathDisplay *display;
     MathButtons *buttons;
     PreferencesDialog *preferences_dialog;
@@ -56,6 +57,12 @@ ui_new()
 }
 
 
+MathEquation *ui_get_equation(GCalctoolUI *ui)
+{
+    return ui->priv->equation;
+}
+
+
 MathDisplay *
 ui_get_display(GCalctoolUI *ui)
 {
@@ -301,6 +308,8 @@ ui_init(GCalctoolUI *ui)
     int i;
 
     ui->priv = G_TYPE_INSTANCE_GET_PRIVATE (ui, ui_get_type(), GCalctoolUIPrivate);
+  
+    ui->priv->equation = math_equation_new();
 
     ui->priv->ui = gtk_builder_new();
     gtk_builder_add_from_file(ui->priv->ui, UI_FILE, &error);
@@ -333,7 +342,7 @@ ui_init(GCalctoolUI *ui)
     ui->priv->right_aligned = TRUE;
     gtk_widget_show(scrolled_window);
 
-    ui->priv->display = math_display_new();
+    ui->priv->display = math_display_new(ui->priv->equation);
     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), GTK_WIDGET(ui->priv->display));
     gtk_widget_show(GTK_WIDGET(ui->priv->display));
 
diff --git a/src/ui.h b/src/ui.h
index 2bdbf15..e591828 100644
--- a/src/ui.h
+++ b/src/ui.h
@@ -21,6 +21,7 @@
 #define UI_H
 
 #include <glib-object.h>
+#include "math-equation.h"
 #include "math-display.h"
 #include "math-buttons.h"
 
@@ -47,6 +48,8 @@ GType ui_get_type();
 
 GCalctoolUI *ui_new(void);
 
+MathEquation *ui_get_equation(GCalctoolUI *ui);
+
 MathDisplay *ui_get_display(GCalctoolUI *ui);
 
 MathButtons *ui_get_buttons(GCalctoolUI *ui);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]