static void insert_variable_cb(GtkWidget *widget, MathVariablePopup *popup) { const gchar *name; name = g_object_get_data(G_OBJECT(widget), "variable_name"); math_equation_insert(popup->priv->equation, name); gtk_widget_destroy(gtk_widget_get_toplevel(widget)); }
static gboolean display_key_press_cb(GtkWidget *widget, GdkEventKey *event, MathDisplay *display) { int state; guint32 c; guint new_keyval = 0; /* Treat keypad keys as numbers even when numlock is off */ switch(event->keyval) { case GDK_KEY_KP_Delete: /* Period without numlock */ new_keyval = GDK_KEY_KP_Decimal; break; case GDK_KEY_KP_Insert: new_keyval = GDK_KEY_0; break; case GDK_KEY_KP_End: new_keyval = GDK_KEY_1; break; case GDK_KEY_KP_Down: new_keyval = GDK_KEY_2; break; case GDK_KEY_KP_Page_Down: new_keyval = GDK_KEY_3; break; case GDK_KEY_KP_Left: new_keyval = GDK_KEY_4; break; case GDK_KEY_KP_Begin: /* This is apparently what "5" does when numlock is off. */ new_keyval = GDK_KEY_5; break; case GDK_KEY_KP_Right: new_keyval = GDK_KEY_6; break; case GDK_KEY_KP_Home: new_keyval = GDK_KEY_7; break; case GDK_KEY_KP_Up: new_keyval = GDK_KEY_8; break; case GDK_KEY_KP_Page_Up: new_keyval = GDK_KEY_9; break; } if (new_keyval) { gboolean result; GdkEvent *new_event; new_event = gdk_event_copy((GdkEvent *)event); ((GdkEventKey *)new_event)->keyval = new_keyval; g_signal_emit_by_name(widget, "key-press-event", new_event, &result); gdk_event_free(new_event); return result; } state = event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK); c = gdk_keyval_to_unicode(event->keyval); /* Solve on enter */ if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter) { math_equation_solve(display->priv->equation); return TRUE; } /* Clear on escape */ if ((event->keyval == GDK_KEY_Escape && state == 0) || (event->keyval == GDK_KEY_BackSpace && state == GDK_CONTROL_MASK) || (event->keyval == GDK_KEY_Delete && state == GDK_SHIFT_MASK)) { math_equation_clear(display->priv->equation); return TRUE; } /* Numeric keypad will often insert '.' regardless of locale */ if (event->keyval == GDK_KEY_KP_Decimal) { math_equation_insert_numeric_point(display->priv->equation); return TRUE; } /* Substitute */ if (state == 0) { if (c == '*') { math_equation_insert(display->priv->equation, "×"); return TRUE; } if (c == '/') { math_equation_insert(display->priv->equation, "÷"); return TRUE; } if (c == '-') { math_equation_insert_subtract(display->priv->equation); return TRUE; } } /* Shortcuts */ if (state == GDK_CONTROL_MASK) { switch(event->keyval) { case GDK_KEY_bracketleft: math_equation_insert(display->priv->equation, "⌈"); return TRUE; case GDK_KEY_bracketright: math_equation_insert(display->priv->equation, "⌉"); return TRUE; case GDK_KEY_e: math_equation_insert_exponent(display->priv->equation); return TRUE; case GDK_KEY_f: math_equation_factorize(display->priv->equation); return TRUE; case GDK_KEY_i: math_equation_insert(display->priv->equation, "⁻¹"); return TRUE; case GDK_KEY_p: math_equation_insert(display->priv->equation, "π"); return TRUE; case GDK_KEY_r: math_equation_insert(display->priv->equation, "√"); return TRUE; case GDK_KEY_u: math_equation_insert(display->priv->equation, "µ"); return TRUE; case GDK_KEY_minus: math_equation_insert(display->priv->equation, "⁻"); return TRUE; case GDK_KEY_apostrophe: math_equation_insert(display->priv->equation, "°"); return TRUE; } } if (state == GDK_MOD1_MASK) { switch(event->keyval) { case GDK_KEY_bracketleft: math_equation_insert(display->priv->equation, "⌊"); return TRUE; case GDK_KEY_bracketright: math_equation_insert(display->priv->equation, "⌋"); return TRUE; } } if (state == GDK_CONTROL_MASK || math_equation_get_number_mode(display->priv->equation) == SUPERSCRIPT) { switch(event->keyval) { case GDK_KEY_0: case GDK_KEY_KP_0: math_equation_insert(display->priv->equation, "⁰"); return TRUE; case GDK_KEY_1: case GDK_KEY_KP_1: math_equation_insert(display->priv->equation, "¹"); return TRUE; case GDK_KEY_2: case GDK_KEY_KP_2: math_equation_insert(display->priv->equation, "²"); return TRUE; case GDK_KEY_3: case GDK_KEY_KP_3: math_equation_insert(display->priv->equation, "³"); return TRUE; case GDK_KEY_4: case GDK_KEY_KP_4: math_equation_insert(display->priv->equation, "⁴"); return TRUE; case GDK_KEY_5: case GDK_KEY_KP_5: math_equation_insert(display->priv->equation, "⁵"); return TRUE; case GDK_KEY_6: case GDK_KEY_KP_6: math_equation_insert(display->priv->equation, "⁶"); return TRUE; case GDK_KEY_7: case GDK_KEY_KP_7: math_equation_insert(display->priv->equation, "⁷"); return TRUE; case GDK_KEY_8: case GDK_KEY_KP_8: math_equation_insert(display->priv->equation, "⁸"); return TRUE; case GDK_KEY_9: case GDK_KEY_KP_9: math_equation_insert(display->priv->equation, "⁹"); return TRUE; } } else if (state == GDK_MOD1_MASK || math_equation_get_number_mode(display->priv->equation) == SUBSCRIPT) { switch(event->keyval) { case GDK_KEY_0: case GDK_KEY_KP_0: math_equation_insert(display->priv->equation, "₀"); return TRUE; case GDK_KEY_1: case GDK_KEY_KP_1: math_equation_insert(display->priv->equation, "₁"); return TRUE; case GDK_KEY_2: case GDK_KEY_KP_2: math_equation_insert(display->priv->equation, "₂"); return TRUE; case GDK_KEY_3: case GDK_KEY_KP_3: math_equation_insert(display->priv->equation, "₃"); return TRUE; case GDK_KEY_4: case GDK_KEY_KP_4: math_equation_insert(display->priv->equation, "₄"); return TRUE; case GDK_KEY_5: case GDK_KEY_KP_5: math_equation_insert(display->priv->equation, "₅"); return TRUE; case GDK_KEY_6: case GDK_KEY_KP_6: math_equation_insert(display->priv->equation, "₆"); return TRUE; case GDK_KEY_7: case GDK_KEY_KP_7: math_equation_insert(display->priv->equation, "₇"); return TRUE; case GDK_KEY_8: case GDK_KEY_KP_8: math_equation_insert(display->priv->equation, "₈"); return TRUE; case GDK_KEY_9: case GDK_KEY_KP_9: math_equation_insert(display->priv->equation, "₉"); return TRUE; } } return FALSE; }