[gcalctool] Make scientific notation button behave the same as keyboard shortcut (i.e. go into superscript mode)



commit 8b09d6b78e9483b2b986102e1d05821b17fa0cad
Author: Robert Ancell <robert ancell gmail com>
Date:   Tue Feb 23 12:14:05 2010 +1100

    Make scientific notation button behave the same as keyboard shortcut (i.e. go into superscript mode).
    Only allow superscript minus to be entered if can make a valid superscript number, otherwise revert to standard minus.

 NEWS              |    6 ++++
 data/gcalctool.ui |    4 +-
 src/gtk.c         |   71 ++++++++++++++++++++++++++++++++++++++++++++---------
 3 files changed, 67 insertions(+), 14 deletions(-)
---
diff --git a/NEWS b/NEWS
index 7bcf80d..c4ec1da 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,12 @@ Overview of changes in gcalctool 5.29.92
 
     * Add shortcuts to change base (Ctrl+B, Ctrl+O, Ctrl+D, Ctrl+H), and change
       the displayed number base on results.
+
+    * Make scientific notation button behave the same as keyboard shortcut (i.e.
+      go into superscript mode).
+      
+    * Only allow superscript minus to be entered if can make a valid superscript
+      number, otherwise revert to standard minus.
  
 Overview of changes in gcalctool 5.29.91
 
diff --git a/data/gcalctool.ui b/data/gcalctool.ui
index 37983b6..eeeeb73 100644
--- a/data/gcalctool.ui
+++ b/data/gcalctool.ui
@@ -2333,7 +2333,7 @@
                     <property name="border_width">3</property>
                     <property name="use_underline">True</property>
                     <property name="focus_on_click">False</property>
-                    <signal name="clicked" handler="button_cb"/>
+                    <signal name="clicked" handler="subtract_cb"/>
                   </object>
                   <packing>
                     <property name="left_attach">3</property>
@@ -2841,7 +2841,7 @@
                         <property name="AtkObject::accessible-name" translatable="yes" comments="Accessible name for the scientific exponent button">Scientific Exponent</property>
                       </object>
                     </child>
-                    <signal name="clicked" handler="button_cb"/>
+                    <signal name="clicked" handler="exponent_cb"/>
                     <child>
                       <object class="GtkLabel" id="label2">
                         <property name="visible">True</property>
diff --git a/src/gtk.c b/src/gtk.c
index f001525..2bede45 100644
--- a/src/gtk.c
+++ b/src/gtk.c
@@ -56,12 +56,10 @@ static ButtonData button_data[] = {
     {"ans",                "ans"},
     {"numeric_point",      "."},
     {"add",                "+"},
-    {"subtract",           "â??"},
     {"multiply",           "Ã?"},
     {"divide",             "÷"},
     {"modulus_divide",     " mod "},
     {"x_pow_y",            "^"},
-    {"exponential",        "Ã?10^"},
     {"percentage",         "%"},
     {"factorial",          "!"},
     {"abs",                "|"},
@@ -173,6 +171,8 @@ typedef struct {
     GtkWidget *superscript_toggle;
     GtkWidget *subscript_toggle;
 
+    gboolean can_super_minus;
+
     /* Labels for popup menus */
     GtkWidget *memory_store_labels[MAX_REGISTERS];
     GtkWidget *memory_recall_labels[MAX_REGISTERS];
@@ -216,8 +216,8 @@ typedef enum {
     CURRENCY_TARGET_LOWER
 } CurrencyTargetRow;
 
-static const char *subscript_digits[] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??"};
-static const char *superscript_digits[] = {"�", "¹", "²", "³", "�", "�", "�", "�", "�", "�"};
+static const char *subscript_digits[] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", NULL};
+static const char *superscript_digits[] = {"�", "¹", "²", "³", "�", "�", "�", "�", "�", "�", NULL};
 
 static void load_ui(GtkBuilder *ui, const gchar *filename)
 {
@@ -371,6 +371,10 @@ do_button(int function, gpointer arg)
 {
     GtkTextIter start, end;
     gint cursor_start, cursor_end;
+  
+    /* Can't enter superscript minus after entering digits */
+    if (function == FN_TEXT && strstr("�¹²³������", (char *)arg) != NULL)
+        X.can_super_minus = FALSE;
 
     /* Disable super/subscript mode when finished entering */
     if (function == FN_CALCULATE ||
@@ -814,8 +818,12 @@ G_MODULE_EXPORT
 void
 set_superscript_cb(GtkWidget *widget)
 {
-    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+       X.can_super_minus = TRUE;
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.subscript_toggle), FALSE);
+    }
+    else
+       X.can_super_minus = FALSE;
 }
 
 
@@ -1161,6 +1169,28 @@ do_base(gint base)
 }
 
 
+static void
+do_exponent()
+{
+    do_text("Ã?10");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.superscript_toggle), TRUE);
+}
+
+
+static void
+do_subtract()
+{
+    if (X.can_super_minus) {
+        do_text("â?»");
+        X.can_super_minus = FALSE;
+    }
+    else {
+        do_text("â??");
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.superscript_toggle), FALSE);
+    }
+}
+
+
 G_MODULE_EXPORT
 void
 base_cb(GtkWidget *widget, GdkEventButton *event)
@@ -1171,6 +1201,22 @@ base_cb(GtkWidget *widget, GdkEventButton *event)
 
 G_MODULE_EXPORT
 void
+exponent_cb(GtkWidget *widget, GdkEventButton *event)
+{
+    do_exponent();
+}
+
+
+G_MODULE_EXPORT
+void
+subtract_cb(GtkWidget *widget, GdkEventButton *event)
+{
+    do_subtract();
+}
+
+
+G_MODULE_EXPORT
+void
 button_cb(GtkWidget *widget, GdkEventButton *event)
 {
     do_text(g_object_get_data(G_OBJECT(widget), "calc_text"));
@@ -1193,8 +1239,8 @@ gboolean
 main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
 {
     int i, state;
-    const char *conversions[]       = {"-", "*", "/", NULL};
-    const char *conversion_values[] = {"â??", "Ã?", "÷", NULL };
+    const char *conversions[]       = {"*", "/", NULL};
+    const char *conversion_values[] = {"�", "÷", NULL };
 
     /* Only look at the modifiers we use */
     state = event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK);
@@ -1218,8 +1264,7 @@ main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
             do_base(10);
             return TRUE;
         case GDK_e:
-            do_text("Ã?10");
-            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.superscript_toggle), TRUE);
+            do_exponent();
             return TRUE;
         case GDK_f:
             do_button(FN_FACTORIZE, NULL);
@@ -1248,9 +1293,6 @@ main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.superscript_toggle))) {
         switch(event->keyval)
         {
-        case GDK_minus:
-            do_text("â?»");
-            return TRUE;
         case GDK_0:
             do_text("â?°");
             return TRUE;
@@ -1355,6 +1397,11 @@ main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
 
     // FIXME: event->string deprecated
 
+    if (strcmp(event->string, "-") == 0 || strcmp(event->string, "â??") == 0) {
+        do_subtract();
+        return TRUE;
+    }
+
     for (i = 0; conversions[i]; i++) {
         if (strcmp(event->string, conversions[i]) == 0) {
             do_text(conversion_values[i]);



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