44
48
static const char *mode_names[] = { "BASIC", "ADVANCED", "FINANCIAL",
45
49
"SCIENTIFIC", "PROGRAMMING", NULL };
48
const char *widget_name;
52
static ButtonData button_data[] = {
54
{"eulers_number", "e"},
57
{"numeric_point", "."},
61
{"modulus_divide", " mod "},
68
{"natural_logarithm", "ln"},
72
{"hyperbolic_sine", "sinh"},
73
{"hyperbolic_cosine", "cosh"},
74
{"hyperbolic_tangent", "tanh"},
80
{"integer_portion", "int"},
81
{"fractional_portion", "frac"},
82
{"ones_complement", "ones"},
83
{"twos_complement", "twos"},
51
#define MAX_ACCELERATORS 8
52
struct button_widget {
55
guint accelerator_mods[MAX_ACCELERATORS];
56
guint accelerator_keys[MAX_ACCELERATORS];
90
static char *registers[] = {"a", "b", "c", "x", "y", "z", NULL};
91
#define MAX_REGISTERS 6
93
59
/* Window titles dependant on mode */
94
60
static char *titles[] = {
95
61
/* Translators: The window title when in basic mode */
97
/* Translators: The window title when in advanced mode */
98
N_("Calculator — Advanced"),
63
/* Translators: The window title when in advanced mode */
64
N_("Calculator - Advanced"),
99
65
/* Translators: The window title when in financial mode */
100
N_("Calculator — Financial"),
66
N_("Calculator - Financial"),
101
67
/* Translators: The window title when in scientific mode */
102
N_("Calculator — Scientific"),
68
N_("Calculator - Scientific"),
103
69
/* Translators: The window title when in programming mode */
104
N_("Calculator — Programming")
70
N_("Calculator - Programming")
73
/* Window titles dependant on mode and hostname */
74
static char *hostname_titles[] = {
75
/* Translators: The window title when in basic mode. %s is replaced with the hostname. */
76
N_("Calculator [%s]"),
77
/* Translators: The window title when in advanced mode. %s is replaced with the hostname. */
78
N_("Calculator [%s] - Advanced"),
79
/* Translators: The window title when in financial mode. %s is replaced with the hostname. */
80
N_("Calculator [%s] - Financial"),
81
/* Translators: The window title when in scientific mode. %s is replaced with the hostname. */
82
N_("Calculator [%s] - Scientific"),
83
/* Translators: The window title when in programming mode. %s is replaced with the hostname. */
84
N_("Calculator [%s] - Programming")
107
87
/* The names of each field in the dialogs for the financial functions */
108
static char *finc_dialog_fields[][5] = {
88
static char *finc_dialog_fields[FINC_NUM_DIALOGS][5] = {
109
89
{"ctrm_pint", "ctrm_fv", "ctrm_pv", NULL, NULL},
110
90
{"ddb_cost", "ddb_life", "ddb_period", NULL, NULL},
111
91
{"fv_pmt", "fv_pint", "fv_n", NULL, NULL},
116
96
{"sln_cost", "sln_salvage", "sln_life", NULL, NULL},
117
97
{"syd_cost", "syd_salvage", "syd_life", "syd_period", NULL},
118
98
{"term_pmt", "term_fv", "term_pint", NULL, NULL},
119
{NULL, NULL, NULL, NULL, NULL}
122
#define UI_FILE UI_DIR "/gcalctool.ui"
123
#define UI_FINC_FILE UI_DIR "/financial.ui"
101
/* This table shows the keyboard values that are currently being used:
103
* | a b c d e f g h i j k l m n o p q r s t u v w x y z
104
*-----------+-----------------------------------------------------
105
* Lower: | a b c d e f g h i j k l m n o p q r s t u v w x z
106
* Upper: | A C D E F G H I J K M N O P Q R S T W X Y Z
107
* Numeric: | 0 1 2 3 4 5 6 7 8 9
108
* Other: | @ . + - * / = % ( ) # < > [ { | & ~ ^ ? ! :
109
* | BackSpace Delete Return
110
*-----------+-----------------------------------------------------
113
static struct button_widget button_widgets[] = {
116
{ GDK_0, GDK_KP_0, GDK_KP_Insert, 0 }},
120
{ GDK_1, GDK_KP_1, GDK_KP_End, GDK_R13, 0 }},
124
{ GDK_2, GDK_KP_2, GDK_KP_Down, 0 }},
128
{ GDK_3, GDK_KP_3, GDK_KP_Page_Down, GDK_R15, 0 }},
132
{ GDK_4, GDK_KP_4, GDK_KP_Left, 0 }},
136
{ GDK_5, GDK_KP_5, GDK_KP_Begin, GDK_R11, 0 }},
140
{ GDK_6, GDK_KP_6, GDK_KP_Right, 0 }},
144
{ GDK_7, GDK_KP_7, GDK_KP_Home, GDK_R7, 0 }},
148
{ GDK_8, GDK_KP_8, GDK_KP_Up, 0 }},
152
{ GDK_9, GDK_KP_9, GDK_KP_Page_Up, GDK_R9, 0 }},
178
{FN_CLEAR, "clear_simple",
179
{ GDK_SHIFT_MASK, 0 },
182
{FN_CLEAR, "clear_advanced",
183
{ GDK_SHIFT_MASK, 0 },
186
{FN_SHIFT, "shift_left",
190
{FN_SHIFT, "shift_right",
194
{FN_SET_ACCURACY, "accuracy",
198
{FN_CONSTANT, "constants",
200
{ GDK_numbersign, 0 }},
202
{FN_FUNCTION, "functions",
210
{FN_RECALL, "recall",
214
{FN_EXCHANGE, "exchange",
218
{FN_CLEAR_ENTRY, "clear_entry_simple",
219
{ GDK_CONTROL_MASK, 0, 0 },
220
{ GDK_BackSpace, GDK_Escape, 0 }},
222
{FN_CLEAR_ENTRY, "clear_entry_advanced",
223
{ GDK_CONTROL_MASK, 0, 0 },
224
{ GDK_BackSpace, GDK_Escape, 0 }},
226
{FN_BACKSPACE, "backspace_simple",
228
{ GDK_BackSpace, 0 }},
230
{FN_BACKSPACE, "backspace_advanced",
232
{ GDK_BackSpace, 0 }},
234
{FN_NUMERIC_POINT, "numeric_point",
236
{ GDK_period, GDK_KP_Decimal, GDK_KP_Delete, GDK_KP_Separator, 0 }},
238
{FN_CALCULATE, "result",
240
{ GDK_equal, GDK_KP_Enter, GDK_Return, 0 }},
242
{FN_START_BLOCK, "start_group",
244
{ GDK_parenleft, 0 }},
246
{FN_END_BLOCK, "end_group",
248
{ GDK_parenright, 0 }},
252
{ GDK_plus, GDK_KP_Add, 0 }},
254
{FN_SUBTRACT, "subtract",
256
{ GDK_minus, GDK_KP_Subtract, GDK_R4, 0 }},
258
{FN_MULTIPLY, "multiply",
260
{ GDK_asterisk, GDK_multiply, GDK_KP_Multiply, GDK_R6, 0 }},
262
{FN_DIVIDE, "divide",
264
{ GDK_slash, GDK_division, GDK_KP_Divide, GDK_R5, 0 }},
266
{FN_CHANGE_SIGN, "change_sign_simple",
270
{FN_CHANGE_SIGN, "change_sign_advanced",
274
{FN_INTEGER, "integer_portion",
278
{FN_FRACTION, "fractional_portion",
282
{FN_PERCENTAGE, "percentage",
286
{FN_SQUARE, "square",
290
{FN_SQUARE_ROOT, "sqrt",
294
{FN_RECIPROCAL, "reciprocal",
298
{FN_ABSOLUTE_VALUE_FUNC, "abs",
304
{ GDK_bracketleft, 0 }},
306
{FN_MODULUS_DIVIDE, "modulus_divide",
310
{FN_1S_COMPLEMENT, "1s",
314
{FN_2S_COMPLEMENT, "2s",
318
{FN_EXPONENTIAL, "exponential",
322
{FN_FACTORIAL, "factorial",
326
{FN_RANDOM, "random",
328
{ GDK_question, 0 }},
332
{ GDK_asciitilde, 0 }},
340
{ GDK_ampersand, 0 }},
348
{ GDK_braceleft, 0 }},
374
{FN_NATURAL_LOGARITHM, "natural_logarithm",
378
{FN_E_POW_X, "natural_logarithm",
382
{FN_LOGARITHM, "logarithm",
386
{FN_10_POW_X, "logarithm",
390
{FN_LOGARITHM2, "logarithm2",
394
{FN_2_POW_X, "logarithm2",
398
{FN_X_POW_Y, "x_pow_y",
400
{ GDK_o, GDK_caret, GDK_asciicircum, GDK_dead_circumflex, 0 }},
402
{FN_X_POW_Y_INV, "x_pow_y",
406
{FN_FINC_CTRM, "finc_compounding_term",
410
{FN_FINC_DDB, "finc_double_declining_depreciation",
414
{FN_FINC_FV, "finc_future_value",
418
{FN_FINC_GPM, "finc_gross_profit_margin",
422
{FN_FINC_PMT, "finc_periodic_payment",
426
{FN_FINC_PV, "finc_present_value",
430
{FN_FINC_RATE, "finc_periodic_interest_rate",
434
{FN_FINC_SLN, "finc_straight_line_depreciation",
438
{FN_FINC_SYD, "finc_sum_of_the_years_digits_depreciation",
442
{FN_FINC_TERM, "finc_term",
446
#define NBUTTONS (sizeof(button_widgets) / sizeof(struct button_widget))
448
#define UI_FILE PACKAGE_UI_DIR "/gcalctool.ui"
449
#define UI_FINC_FILE PACKAGE_UI_DIR "/financial.ui"
125
451
#define MAXBITS 64 /* Bit panel: number of bit fields. */
330
664
gtk_window_move(GTK_WINDOW(popup), popup_x, popup_y);
668
ui_set_accuracy(int accuracy)
673
/* Translators: Accuracy Popup: Menu item to show the accuracy dialog. %d is replaced with the current accuracy. */
674
SNPRINTF(text, MAXLINE, _("_Other (%d) ..."), accuracy);
675
widget = gtk_bin_get_child(GTK_BIN(GET_OBJECT("acc_item_other")));
676
gtk_label_set_markup_with_mnemonic(GTK_LABEL(widget), text);
678
gtk_widget_set_tooltip_text (GET_WIDGET("calc_accuracy_button"),
679
/* Translators: Tooltip for accuracy button */
680
ngettext("Set accuracy from 0 to %d numeric place. [A]",
681
"Set accuracy from 0 to %d numeric places. [A]",
684
if (accuracy >= 0 && accuracy <= 9) {
685
SNPRINTF(text, MAXLINE, "acc_item%d", accuracy);
686
widget = GET_WIDGET(text);
687
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE);
690
gtk_spin_button_set_value(GTK_SPIN_BUTTON(X.precision_spin), (double)accuracy);
692
/* Hide the manual dialog */
693
gtk_widget_hide(X.precision_dialog);
695
/* Rebuild registers with new format */
701
ui_update_modifier_mode()
703
static char *sine_labels[] = {
704
/* Translators: The sine button */
706
/* Translators: The inverse sine button */
707
N_("sin<sup>−1</sup>"),
708
/* Translators: The hyperbolic sine button */
710
/* Translators: The inverse hyperbolic sine button */
711
N_("sinh<sup>−1</sup>")};
712
static char *sine_tooltips[] = {
713
/* Translators: The sine tooltip */
715
/* Translators: The inverse sine tooltip */
716
N_("Inverse Sine [K]"),
717
/* Translators: The hyperbolic sine tooltip */
718
N_("Hyperbolic Sine [k]"),
719
/* Translators: The hyperbolic inverse sine tooltip */
720
N_("Hyperbolic Inverse Sine [K]")};
721
static int sine_functions[] = {FN_SIN, FN_ASIN, FN_SINH, FN_ASINH};
722
static char *cosine_labels[] = {
723
/* Translators: The cosine button */
725
/* Translators: The inverse cosine button */
726
N_("cos<sup>−1</sup>"),
727
/* Translators: The hyperbolic cosine button */
729
/* Translators: The inverse hyperbolic cosine button */
730
N_("cosh<sup>−1</sup>")};
731
static char *cosine_tooltips[] = {
732
/* Translators: The cosine tooltip */
734
/* Translators: The inverse cosine tooltip */
735
N_("Inverse Cosine [J]"),
736
/* Translators: The hyperbolic cosine tooltip */
737
N_("Hyperbolic Cosine [j]"),
738
/* Translators: The hyperbolic inverse cosine tooltip */
739
N_("Hyperbolic Inverse Cosine [J]")};
740
static int cosine_functions[] = {FN_COS, FN_ACOS, FN_COSH, FN_ACOSH};
741
static char *tangent_labels[] = {
742
/* Translators: The tangent button */
744
/* Translators: The inverse tangent button */
745
N_("tan<sup>−1</sup>"),
746
/* Translators: The hyperbolic tangent button */
748
/* Translators: The inverse hyperbolic tangent button */
749
N_("tanh<sup>−1</sup>")};
750
static char *tangent_tooltips[] = {
751
/* Translators: The tangent tooltip */
753
/* Translators: The inverse tangent tooltip */
754
N_("Inverse Tangent [W]"),
755
/* Translators: The hyperbolic tangent tooltip */
756
N_("Hyperbolic Tangent [w]"),
757
/* Translators: The hyperbolic inverse tangent tooltip */
758
N_("Hyperbolic Inverse Tangent [W]")};
759
static int tangent_functions[] = {FN_TAN, FN_ATAN, FN_TANH, FN_ATANH};
761
static char *ln_labels[] = {
762
/* Translators: The natural logaritm button */
764
/* Translators: The e to the power of x button */
765
N_("e<sup><i>x</i></sup>")};
766
static char *ln_tooltips[] = {
767
/* Translators: Tooltip for the natural log button */
768
N_("Natural logarithm [n]"),
769
/* Translators: Tooltip for the e to the power of x button */
770
N_("e to the power of the displayed value [N]")};
771
static int ln_functions[] = {FN_NATURAL_LOGARITHM, FN_E_POW_X};
773
static char *log_labels[] = {
774
/* Translators: The 10-based logaritm button */
776
/* Translators: The 10 to the power of x button */
777
N_("10<sup><i>x</i></sup>")};
778
static char *log_tooltips[] = {
779
/* Translators: Tooltip for the log base 10 button */
780
N_("Base 10 logarithm [g]"),
781
/* Translators: Tooltip for the 10 to the power of x button */
782
N_("10 to the power of displayed value [G]")};
783
static int log_functions[] = {FN_LOGARITHM, FN_10_POW_X};
785
static char *log2_labels[] = {
786
/* Translators: The 2-based logaritm button */
787
N_("log<sub>2</sub>"),
788
/* Translators: The 2 to the power of x button */
789
N_("2<sup><i>x</i></sup>")};
790
static char *log2_tooltips[] = {
791
/* Translators: Tooltip for the log base 2 button */
792
N_("Base 2 logarithm [h]"),
793
/* Translators: Tooltip for the 2 to the power of x button */
794
N_("2 to the power of the displayed value [H]")};
795
static int log2_functions[] = {FN_LOGARITHM2, FN_2_POW_X};
797
static char *x_pow_y_labels[] = {
798
/* Translators: The x to the power of y button */
799
N_("x<sup><i>y</i></sup>"),
800
/* Translators: The x to the power of reciprocal y button */
801
N_("x<sup>1/<i>y</i></sup>")};
802
static char *x_pow_y_tooltips[] = {
803
/* Translators: Tooltip for the x to the power of y button */
804
N_("Raise displayed value to the power of y [o]"),
805
/* Translators: Tooltip for the x to the power of reciprocal y button */
806
N_("Raise displayed value to the power of reciprocal y [O]")};
807
static int x_pow_y_functions[] = {FN_X_POW_Y, FN_X_POW_Y_INV};
811
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.inverse_toggle)))
814
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("natural_logarithm_label")),
815
_(ln_labels[index]));
816
gtk_widget_set_tooltip_text(GET_WIDGET("calc_natural_logarithm_button"),
817
_(ln_tooltips[index]));
818
set_int_data(X.ui, "calc_natural_logarithm_button", "calc_function", ln_functions[index]);
820
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("logarithm_label")),
821
_(log_labels[index]));
822
gtk_widget_set_tooltip_text(GET_WIDGET("calc_logarithm_button"),
823
_(log_tooltips[index]));
824
set_int_data(X.ui, "calc_logarithm_button", "calc_function", log_functions[index]);
826
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("logarithm2_label")),
827
_(log2_labels[index]));
828
gtk_widget_set_tooltip_text(GET_WIDGET("calc_logarithm2_button"),
829
_(log2_tooltips[index]));
830
set_int_data(X.ui, "calc_logarithm2_button", "calc_function", log2_functions[index]);
832
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("x_pow_y_label")),
833
_(x_pow_y_labels[index]));
834
gtk_widget_set_tooltip_text(GET_WIDGET("calc_x_pow_y_button"),
835
_(x_pow_y_tooltips[index]));
836
set_int_data(X.ui, "calc_x_pow_y_button", "calc_function", x_pow_y_functions[index]);
838
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.hyperbolic_toggle)))
841
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("sine_label")),
842
_(sine_labels[index]));
843
gtk_widget_set_tooltip_text(GET_WIDGET("calc_sine_button"),
844
_(sine_tooltips[index]));
845
set_int_data(X.ui, "calc_sine_button", "calc_function", sine_functions[index]);
847
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("cosine_label")),
848
_(cosine_labels[index]));
849
gtk_widget_set_tooltip_text(GET_WIDGET("calc_cosine_button"),
850
_(cosine_tooltips[index]));
851
set_int_data(X.ui, "calc_cosine_button", "calc_function", cosine_functions[index]);
853
gtk_label_set_markup(GTK_LABEL(GET_OBJECT("tangent_label")),
854
_(tangent_labels[index]));
855
gtk_widget_set_tooltip_text(GET_WIDGET("calc_tangent_button"),
856
_(tangent_tooltips[index]));
857
set_int_data(X.ui, "calc_tangent_button", "calc_function", tangent_functions[index]);
862
ui_set_trigonometric_mode(MPAngleUnit units)
868
radio = X.radian_radio;
871
radio = X.degree_radio;
874
radio = X.gradian_radio;
877
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), 1);
882
ui_set_numeric_mode(DisplayFormat mode)
884
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.display_mode_radios[mode]), 1);
889
ui_set_show_thousands_separator(gboolean visible)
893
display_set_show_thousands_separator(&v->display, visible);
895
menu = GET_WIDGET("show_thousands_separator_menu");
896
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), visible);
898
/* Rebuild registers */
904
ui_set_show_trailing_zeroes(gboolean visible)
908
display_set_show_trailing_zeroes(&v->display, visible);
910
/* Rebuild registers */
913
menu = GET_WIDGET("show_trailing_zeroes_menu");
914
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), visible);
915
menu = GET_WIDGET("acc_trailing_zeroes_item");
916
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), visible);
335
921
ui_set_undo_enabled(gboolean undo, gboolean redo)
337
// gtk_widget_set_sensitive(GET_WIDGET("undo_menu"), undo);
338
// gtk_widget_set_sensitive(GET_WIDGET("redo_menu"), redo);
923
gtk_widget_set_sensitive(GET_WIDGET("undo_menu"), undo);
924
gtk_widget_set_sensitive(GET_WIDGET("redo_menu"), redo);
931
Display *dpy = GDK_DISPLAY();
932
char client_hostname[MAXLINE] = "";
933
char hostname[MAXHOSTNAMELEN];
934
char *display = DisplayString(dpy);
935
char *scanner = display;
937
gethostname(hostname, MAXHOSTNAMELEN);
942
while (*scanner != ':')
947
if (strcmp(display, hostname) &&
948
strcmp(display, "localhost") &&
949
strcmp(display, "unix") &&
951
SNPRINTF(client_hostname, MAXLINE, " [%s] ", hostname);
955
if (client_hostname[0] == '\0')
958
return strdup(client_hostname);
428
1022
gtk_widget_hide(GTK_WIDGET(GET_FINC_WIDGET(dialog)));
432
1026
ui_set_mode(ModeType mode)
1030
char *hostname, title[MAXLINE];
434
1031
GtkWidget *menu;
1033
if (X.mode != mode) {
1036
// FIXME: These should affect display but not the actual UI settings
1037
if (mode != PROGRAMMING)
1039
if (mode != SCIENTIFIC) {
1040
ui_set_numeric_mode(FIX);
1041
do_button(FN_SET_ACCURACY, DEFAULT_ACCURACY);
1044
ui_set_show_trailing_zeroes(FALSE);
1046
ui_make_registers();
439
1050
set_enumerated_resource(R_MODE, mode_names, (int)mode);
441
1052
/* Show/enable the widgets used in this mode */
1053
g_object_set(G_OBJECT(X.bas_panel), "visible", mode == BASIC, NULL);
442
1054
g_object_set(G_OBJECT(X.adv_panel), "visible", mode != BASIC, NULL);
443
1055
g_object_set(G_OBJECT(X.fin_panel), "visible", mode == FINANCIAL, NULL);
1056
g_object_set(G_OBJECT(X.sci_mode_panel), "visible", mode == SCIENTIFIC, NULL);
1057
g_object_set(G_OBJECT(X.prog_mode_panel), "visible", mode == PROGRAMMING, NULL);
444
1058
g_object_set(G_OBJECT(X.sci_panel), "visible", mode == SCIENTIFIC, NULL);
445
1059
g_object_set(G_OBJECT(X.prog_panel), "visible", mode == PROGRAMMING, NULL);
446
1060
g_object_set(G_OBJECT(X.bit_panel), "visible", mode == PROGRAMMING, NULL);
448
gtk_window_set_title(GTK_WINDOW(X.main_window), gettext(titles[mode]));
1061
gtk_widget_set_sensitive(GET_WIDGET("show_trailing_zeroes_menu"), mode != BASIC);
1062
gtk_widget_set_sensitive(GET_WIDGET("show_registers_menu"), mode != BASIC);
1064
/* HACK: Some horrible hack down below to keep the buttons the same size.
1065
* There must be a safer way of doing this... */
1066
r = g_new0(GtkRequisition, 1);
1067
gtk_widget_size_request(X.menubar, r);
1070
gtk_widget_size_request(X.display_item, r);
1071
w = MAX(w, r->width);
1074
#if GTK_CHECK_VERSION (2,17,7)
1075
if (gtk_widget_get_visible (GTK_WIDGET (X.fin_panel))) {
1077
if (GTK_WIDGET_VISIBLE(X.fin_panel)) {
1079
gtk_widget_size_request(X.fin_panel, r);
1080
w = MAX(w, r->width);
1084
#if GTK_CHECK_VERSION (2,17,7)
1085
if (gtk_widget_get_visible (GTK_WIDGET (X.sci_mode_panel))) {
1087
if (GTK_WIDGET_VISIBLE(X.sci_mode_panel)) {
1089
gtk_widget_size_request(X.sci_mode_panel, r);
1090
w = MAX(w, r->width);
1094
#if GTK_CHECK_VERSION (2,17,7)
1095
if (gtk_widget_get_visible (GTK_WIDGET (X.prog_mode_panel))) {
1097
if (GTK_WIDGET_VISIBLE(X.prog_mode_panel)) {
1099
gtk_widget_size_request(X.prog_mode_panel, r);
1100
w = MAX(w, r->width);
1104
#if GTK_CHECK_VERSION (2,17,7)
1105
if (gtk_widget_get_visible (GTK_WIDGET (X.sci_panel))) {
1107
if (GTK_WIDGET_VISIBLE(X.sci_panel)) {
1109
gtk_widget_size_request(X.sci_panel, r);
1110
w = MAX(w, r->width);
1114
#if GTK_CHECK_VERSION (2,17,7)
1115
if (gtk_widget_get_visible (GTK_WIDGET (X.prog_panel))) {
1117
if (GTK_WIDGET_VISIBLE(X.prog_panel)) {
1119
gtk_widget_size_request(X.prog_panel, r);
1120
w = MAX(w, r->width);
1125
/* For initial display. */
1126
gtk_window_set_default_size(GTK_WINDOW(X.main_window), w, h);
1127
gtk_window_resize(GTK_WINDOW(X.main_window), w, h);
1130
if((hostname = make_hostname())) {
1131
SNPRINTF(title, MAXLINE, gettext(hostname_titles[mode]), hostname);
1134
SNPRINTF(title, MAXLINE, "%s", gettext(titles[mode]));
1136
gtk_window_set_title(GTK_WINDOW(X.main_window), title);
450
1138
/* Update the menu */
1241
/* When an error condition occurs:
1243
* - make insensitive all buttons except Clr.
1244
* - make all Scientific mode toggles and checkboxes insensitive.
1245
* - make all menubar items insensitive except:
1249
* When the error condition is cleared, resensitise everything, setting
1250
* the numeric base buttons correctly.
1253
ui_set_error_state(gboolean error)
1259
for (i = 0; i < NBUTTONS; i++)
1260
gtk_widget_set_sensitive(X.buttons[i], !v->error);
1261
/* Clr button always sensitive. */
1262
gtk_widget_set_sensitive(X.clear_buttons[0], TRUE);
1263
gtk_widget_set_sensitive(X.clear_buttons[1], TRUE);
1266
ui_set_base(v->base);
1268
gtk_widget_set_sensitive(X.sci_mode_panel, !v->error);
1269
gtk_widget_set_sensitive(X.prog_mode_panel, !v->error);
1271
gtk_widget_set_sensitive(GET_WIDGET("copy_menu"), !v->error);
1272
gtk_widget_set_sensitive(GET_WIDGET("paste_menu"), !v->error);
1273
gtk_widget_set_sensitive(GET_WIDGET("undo_menu"), !v->error);
1274
gtk_widget_set_sensitive(GET_WIDGET("redo_menu"), !v->error);
1275
gtk_widget_set_sensitive(GET_WIDGET("insert_ascii_menu"), !v->error);
1277
gtk_widget_set_sensitive(GET_WIDGET("view_basic_menu"), !v->error);
1278
gtk_widget_set_sensitive(GET_WIDGET("view_advanced_menu"), !v->error);
1279
gtk_widget_set_sensitive(GET_WIDGET("view_financial_menu"), !v->error);
1280
gtk_widget_set_sensitive(GET_WIDGET("view_scientific_menu"), !v->error);
1281
gtk_widget_set_sensitive(GET_WIDGET("show_trailing_zeroes_menu"),
1282
!v->error && (X.mode != BASIC));
1283
gtk_widget_set_sensitive(GET_WIDGET("show_thousands_separator_menu"),
1285
gtk_widget_set_sensitive(GET_WIDGET("show_registers_menu"), !v->error);
1287
gtk_widget_set_sensitive(GET_WIDGET("about_menu"), !v->error);
1299
ui_set_base(int base)
1306
for (i = 0; i < 16; i++)
1307
gtk_widget_set_sensitive(X.digit_buttons[i], i < base);
1311
widget = X.binary_radio;
1314
widget = X.octal_radio;
1317
widget = X.decimal_radio;
1320
widget = X.hexadecimal_radio;
1325
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
1330
ui_set_wordlen(int len)
1336
widget = X.word_length_radios[0];
1339
widget = X.word_length_radios[1];
1342
widget = X.word_length_radios[2];
1347
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), 1);
1352
ui_set_registers_visible(gboolean visible)
1356
ui_make_registers();
1358
menu = GET_WIDGET("show_registers_menu");
1359
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), visible);
1361
gtk_widget_realize(X.register_dialog);
1364
if (gdk_window_is_visible(gtk_widget_get_window(X.register_dialog))) {
1365
gdk_window_raise(gtk_widget_get_window(X.register_dialog));
1368
position_popup(X.main_window, X.register_dialog, POPUP_ABOVE);
1369
gtk_widget_show(X.register_dialog);
1371
gtk_widget_hide(X.register_dialog);
1374
set_boolean_resource(R_REGS, visible);
543
1380
about_cb(GtkWidget *widget)
545
1382
const gchar *authors[] = {
546
1383
"Rich Burridge <rich.burridge@sun.com>",
1384
"Sami Pietila <sampie@ariana-dsl.utu.fi>",
547
1385
"Robert Ancell <robert.ancell@gmail.com>",
548
1386
"Klaus Niederkrüger <kniederk@umpa.ens-lyon.fr>",
752
1718
g_object_set_data(o, "finc_dialog", GINT_TO_POINTER(i));
756
currency_amount_upper = GTK_SPIN_BUTTON(gtk_builder_get_object(
758
"currency_amount_upper"));
759
currency_amount_lower = GTK_SPIN_BUTTON(gtk_builder_get_object(
761
"currency_amount_lower"));
762
currency_type_upper = GTK_COMBO_BOX(gtk_builder_get_object(
764
"currency_type_upper"));
765
currency_type_lower = GTK_COMBO_BOX(gtk_builder_get_object(
767
"currency_type_lower"));
769
currency_store = gtk_list_store_new(2,
773
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(currency_store),
777
gtk_combo_box_set_model(currency_type_upper,
778
GTK_TREE_MODEL(currency_store));
779
gtk_combo_box_set_model(currency_type_lower,
780
GTK_TREE_MODEL(currency_store));
782
render = gtk_cell_renderer_text_new();
784
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(currency_type_upper),
787
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(currency_type_lower),
791
gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(currency_type_upper),
795
gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(currency_type_lower),
800
set_int_data(X.financial, "currency_amount_upper", "target", CURRENCY_TARGET_LOWER);
801
set_int_data(X.financial, "currency_amount_lower", "target", CURRENCY_TARGET_UPPER);
803
1722
gtk_builder_connect_signals(X.financial, NULL);
1726
update_constants_menu(void)
1728
char mline[MAXLINE], value[MAXLINE];
1731
for (i = 0; i < MAX_CONSTANTS; i++) {
1732
display_make_number(&v->display, value, MAXLINE, constant_get_value(i), 10, TRUE);
1733
SNPRINTF(mline, MAXLINE,
1734
"<span weight=\"bold\">%s_%1d:</span> %s [%s]", _("C"), i,
1736
constant_get_name(i));
1737
gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.constant_menu_labels[i]), mline);
1743
update_functions_menu(void)
1745
char mline[MAXLINE];
1748
for (i = 0; i < MAX_FUNCTIONS; i++) {
1749
const char *name, *value;
1751
name = function_get_name(i);
1752
value = function_get_value(i);
1754
if (strlen(value) != 0) {
1755
SNPRINTF(mline, MAXLINE,
1756
"<span weight=\"bold\">%s_%1d:</span> %s [%s]",
1757
_("F"), i, value, name);
1758
gtk_widget_show(gtk_widget_get_parent(X.function_menu_labels[i]));
1759
gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.function_menu_labels[i]), mline);
1762
gtk_widget_hide(gtk_widget_get_parent(X.function_menu_labels[i]));
1769
edit_constants_response_cb(GtkDialog *dialog, gint id)
1776
if (id == GTK_RESPONSE_HELP)
1779
if (id == GTK_RESPONSE_ACCEPT) {
1780
if (gtk_tree_model_get_iter_first(X.constants_model, &iter)) {
1783
gtk_tree_model_get(X.constants_model, &iter,
1784
COLUMN_NUMBER, &number,
1785
COLUMN_VALUE, &value,
1786
COLUMN_DESCRIPTION, &description, -1);
1787
// FIXME: Have to delocalize
1788
mp_set_from_string(value, 10, &temp);
1789
constant_set(number, description, &temp);
1790
} while (gtk_tree_model_iter_next(X.constants_model, &iter));
1794
gtk_widget_hide(GTK_WIDGET(dialog));
1800
edit_constants_delete_cb(GtkDialog *dialog)
1802
edit_constants_response_cb(dialog, GTK_RESPONSE_CANCEL);
1809
edit_functions_response_cb(GtkDialog *dialog, gint id)
1816
if (id == GTK_RESPONSE_HELP)
1819
if (id == GTK_RESPONSE_ACCEPT) {
1820
if (gtk_tree_model_get_iter_first(X.functions_model, &iter)) {
1822
gtk_tree_model_get(X.functions_model, &iter,
1823
COLUMN_NUMBER, &number,
1824
COLUMN_VALUE, &value,
1825
COLUMN_DESCRIPTION, &description, -1);
1826
function_set(number, description, value);
1827
} while (gtk_tree_model_iter_next(X.functions_model, &iter));
1831
gtk_widget_hide(GTK_WIDGET(dialog));
1837
edit_functions_delete_cb(GtkDialog *dialog)
1839
edit_functions_response_cb(dialog, GTK_RESPONSE_CANCEL);
1844
static GtkTreeModel *
1845
create_constants_model()
1848
GtkListStore *model;
1850
char constant[MAXLINE];
1852
model = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
1853
G_TYPE_STRING, G_TYPE_BOOLEAN);
1854
for (i = 0; i < MAX_CONSTANTS; i++) {
1855
gtk_list_store_append(model, &iter);
1857
display_make_number(&v->display, constant, MAXLINE, constant_get_value(i), 10, TRUE);
1858
gtk_list_store_set(model, &iter,
1860
COLUMN_EDITABLE, TRUE,
1861
COLUMN_VALUE, constant,
1862
COLUMN_DESCRIPTION, constant_get_name(i),
1866
return GTK_TREE_MODEL(model);
1870
static GtkTreeModel *
1871
create_functions_model()
1874
GtkListStore *model;
1877
model = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
1878
G_TYPE_STRING, G_TYPE_BOOLEAN);
1879
for (i = 0; i < MAX_FUNCTIONS; i++) {
1880
gtk_list_store_append(model, &iter);
1882
gtk_list_store_set(model, &iter,
1884
COLUMN_EDITABLE, TRUE,
1885
COLUMN_VALUE, function_get_value(i),
1886
COLUMN_DESCRIPTION, function_get_name(i),
1890
return GTK_TREE_MODEL(model);
1895
ui_make_registers() /* Calculate memory register frame values. */
1897
char mval[MAXLINE], key[MAXLINE], value[MAXLINE];
1900
for (n = 0; n < MAX_REGISTERS; n++) {
1903
register_get(n, &temp);
1904
display_make_number(&v->display, mval, MAXLINE, &temp, v->base, TRUE);
1905
gtk_entry_set_width_chars(GTK_ENTRY(X.register_entries[n]), strlen(mval));
1906
gtk_entry_set_text(GTK_ENTRY(X.register_entries[n]), mval);
1908
SNPRINTF(key, MAXLINE, "register%d", n);
1909
display_make_number(&v->display, value, MAXLINE, &temp, 10, TRUE);
1910
set_resource(key, value);
1920
(void) gdk_window_get_origin(gtk_widget_get_window(X.main_window), &x, &y);
1921
set_int_resource(R_XPOS, x);
1922
set_int_resource(R_YPOS, y);
809
1928
bit_toggle_cb(GtkWidget *event_box, GdkEventButton *event)
811
do_button(FN_TOGGLE_BIT,
812
g_object_get_data(G_OBJECT(event_box), "bit_index"));
1931
index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(event_box), "bit_index"));
1932
do_button(FN_TOGGLE_BIT, index);
819
set_superscript_cb(GtkWidget *widget)
1939
menu_item_select_cb(GtkWidget *widget)
821
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
822
X.can_super_minus = TRUE;
823
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.subscript_toggle), FALSE);
826
X.can_super_minus = FALSE;
1941
GtkStatusbar *statusbar = GTK_STATUSBAR(X.statusbar);
1945
context_id = gtk_statusbar_get_context_id(statusbar, "menuhelp");
1947
tooltip = (gchar *)g_object_get_data(G_OBJECT(widget), "tooltip");
1949
gtk_statusbar_push(statusbar, context_id, tooltip);
832
set_subscript_cb(GtkWidget *widget)
834
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
835
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.superscript_toggle), FALSE);
1955
menu_item_deselect_cb(GtkWidget *widget)
1957
GtkStatusbar *statusbar = GTK_STATUSBAR(X.statusbar);
1960
context_id = gtk_statusbar_get_context_id(statusbar, "menuhelp");
1961
gtk_statusbar_pop(statusbar, context_id);
1966
set_menubar_tooltip(gchar *menu_name)
1971
menu = GET_WIDGET(menu_name);
1972
tooltip = gtk_widget_get_tooltip_text(menu);
1973
g_object_set_data(G_OBJECT(menu), "tooltip", tooltip);
1974
gtk_widget_set_tooltip_text(menu, NULL);
840
1979
update_memory_menus()
1981
char mstr[MAXLINE], value[MAXLINE];
844
for (i = 0; registers[i] != NULL; i++) {
845
char value[MAXLINE] = "", mstr[MAXLINE];
848
t = register_get_value(registers[i]);
850
display_make_number(&v->display, value, MAXLINE, t);
851
SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s</span> = %s", registers[i], value);
1984
for (i = 0; i < MAX_REGISTERS; i++) {
1986
register_get(i, &temp);
1987
display_make_number(&v->display, value, MAXLINE, &temp, v->base, TRUE);
1988
SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s_%d:</span> %s",
1989
/* Translators: R is the short form of register used inter alia in popup menus */
852
1991
gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.memory_store_labels[i]), mstr);
853
1992
gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.memory_recall_labels[i]), mstr);
1993
gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.memory_exchange_labels[i]), mstr);
857
/* The Copy function key has been pressed. */
1998
get_display() /* The Copy function key has been pressed. */
861
2000
gchar *string = NULL;
862
2001
GtkTextIter start, end;
914
solve_cb(GtkWidget *widget, GdkEventButton *event)
916
do_button(FN_CALCULATE, NULL);
922
clear_cb(GtkWidget *widget, GdkEventButton *event)
924
do_button(FN_CLEAR, NULL);
930
finc_cb(GtkWidget *widget, GdkEventButton *event)
932
do_finc(g_object_get_data(G_OBJECT(widget), "finc_dialog"));
936
recalculate_currency(CurrencyTargetRow target)
938
int upper_index, lower_index;
940
GtkComboBox *combo_upper = GTK_COMBO_BOX(gtk_builder_get_object(
942
"currency_type_upper"));
943
GtkComboBox *combo_lower = GTK_COMBO_BOX(gtk_builder_get_object(
945
"currency_type_lower"));
946
GtkSpinButton *spin_upper = GTK_SPIN_BUTTON(gtk_builder_get_object(
948
"currency_amount_upper"));
949
GtkSpinButton *spin_lower = GTK_SPIN_BUTTON(gtk_builder_get_object(
951
"currency_amount_lower"));
953
GtkTreeModel *model = gtk_combo_box_get_model(combo_upper);
956
if (!gtk_combo_box_get_active_iter(combo_upper, &iter))
958
gtk_tree_model_get(model, &iter, 0, &upper_index, -1);
960
if (!gtk_combo_box_get_active_iter(combo_lower, &iter))
962
gtk_tree_model_get(model, &iter, 0, &lower_index, -1);
964
if (target == CURRENCY_TARGET_LOWER) {
965
MPNumber input, output;
966
mp_set_from_double (gtk_spin_button_get_value(spin_upper), &input);
967
currency_convert(&input, upper_index, lower_index, &output);
968
if (!mp_is_zero(&output))
969
gtk_spin_button_set_value(spin_lower, mp_cast_to_double(&output));
971
MPNumber input, output;
972
mp_set_from_double (gtk_spin_button_get_value(spin_lower), &input);
973
currency_convert(&input, lower_index, upper_index, &output);
974
if (!mp_is_zero(&output))
975
gtk_spin_button_set_value(spin_upper, mp_cast_to_double(&output));
981
currency_type_cb(GtkComboBox *combo, gpointer user_data)
983
recalculate_currency(CURRENCY_TARGET_LOWER);
988
currency_amount_cb (GtkSpinButton *spinbutton, gpointer user_data)
990
recalculate_currency(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spinbutton),
995
setup_currency_rates ()
997
static int has_run = 0;
999
GtkListStore *currency_store;
1000
GObject *currency_type;
1005
if (currency_rates_needs_update()) {
1006
GtkWidget *dialog = gtk_message_dialog_new(NULL, 0,
1009
/* Translators: Title of the error dialog when prompting to download currency rates */
1010
N_("You don't have any recent currency rates. Should some be downloaded now?"));
1011
int response = gtk_dialog_run(GTK_DIALOG(dialog));
1012
gtk_widget_destroy(dialog);
1014
if (response == GTK_RESPONSE_YES) {
1015
if (!currency_download_rates()) {
1016
dialog = gtk_message_dialog_new(NULL, 0,
1019
/* Translators: Title of the error dialog when unable to download currency rates */
1020
N_("Currency rates could not be downloaded. You may receive inaccurate results, or you may not receive any results at all."));
1024
currency_load_rates();
1026
currency_type = gtk_builder_get_object(X.financial, "currency_type_upper");
1027
currency_store = GTK_LIST_STORE(gtk_combo_box_get_model(
1028
GTK_COMBO_BOX(currency_type)));
1030
for (i = 0; currency_names[i].short_name; i++) {
1034
if ((index = currency_get_index(currency_names[i].short_name)) < 0) {
1037
gtk_list_store_append(currency_store, &iter);
1038
gtk_list_store_set(currency_store, &iter,
1040
1, gettext(currency_names[i].long_name),
1049
currency_cb(GtkWidget *widget, GdkEventButton *event)
1052
GtkSpinButton *c_amount_upper, *c_amount_lower;
1053
MPNumber display_val;
1055
if (X.financial == NULL)
1056
setup_finc_dialogs();
1058
setup_currency_rates();
1060
win = GTK_DIALOG(gtk_builder_get_object(X.financial, "currency_dialog"));
1061
c_amount_upper = GTK_SPIN_BUTTON(gtk_builder_get_object(
1063
"currency_amount_upper"));
1064
c_amount_lower = GTK_SPIN_BUTTON(gtk_builder_get_object(
1066
"currency_amount_lower"));
1067
if (display_is_usable_number(&v->display, &display_val)) {
1068
double start_val = mp_cast_to_double(&display_val);
1069
gtk_spin_button_set_value(c_amount_upper, start_val);
1071
gtk_widget_grab_focus(GTK_WIDGET(c_amount_upper));
1073
if (gtk_dialog_run(win) == GTK_RESPONSE_OK) {
1076
result = g_strdup_printf("%.2f",
1077
gtk_spin_button_get_value(c_amount_lower));
1078
mp_set_from_string(result, &display_val);
1081
display_set_number(&v->display, &display_val);
1084
gtk_widget_hide(GTK_WIDGET(win));
1089
popup_cb(GtkWidget *widget, GdkEventButton *event)
2078
button_cb(GtkWidget *widget, GdkEventButton *event)
1091
2081
GtkWidget *menu;
1094
/* If gcalctool is being driven by gok, the on-screen keyboard
1095
* assistive technology, it's possible that the event returned by
1096
* gtk_get_current_event() is NULL. If this is the case, we need
1097
* to fudge the popping up on the menu associated with this menu
1101
update_memory_menus();
2084
#if GTK_CHECK_VERSION (2,17,7)
2085
GtkAllocation allocation;
2088
function = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "calc_function"));
1103
2089
menu = (GtkWidget *)g_object_get_data(G_OBJECT(widget), "calc_menu");
1104
if (event == NULL) {
1105
GtkAllocation allocation;
1107
if (X.mode == PROGRAMMING) {
2090
dialog = g_object_get_data(G_OBJECT(widget), "finc_dialog");
2092
if (menu == NULL && dialog == NULL) {
2093
do_button(function, 0);
2094
} else if (dialog != NULL) {
2097
/* If gcalctool is being driven by gok, the on-screen keyboard
2098
* assistive technology, it's possible that the event returned by
2099
* gtk_get_current_event() is NULL. If this is the case, we need
2100
* to fudge the popping up on the menu associated with this menu
2104
update_constants_menu();
2105
update_functions_menu();
2106
update_memory_menus();
2108
if (event == NULL) {
1108
2109
gdk_window_get_origin(gtk_widget_get_window(widget), &loc.x, &loc.y);
1109
gtk_widget_get_allocation(widget, &allocation);
2110
#if GTK_CHECK_VERSION (2,17,7)
2111
gtk_widget_get_allocation (widget, &allocation);
1110
2112
loc.x += allocation.x;
1111
2113
loc.y += allocation.y;
1113
gdk_window_get_origin(gtk_widget_get_window(X.display_item), &loc.x, &loc.y);
1114
gtk_widget_get_allocation(X.display_item, &allocation);
1115
loc.x += allocation.x + allocation.width;
1116
loc.y += allocation.y + allocation.height;
1118
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, menu_pos_func,
1119
(gpointer) &loc, 0, gtk_get_current_event_time());
1120
} else if (event->button == 1) {
1121
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
1122
event->button, event->time);
1129
factorize_cb(GtkWidget *widget, GdkEventButton *event)
1131
do_button(FN_FACTORIZE, NULL);
1137
digit_cb(GtkWidget *widget, GdkEventButton *event)
1139
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.superscript_toggle)))
1140
do_text(g_object_get_data(G_OBJECT(widget), "calc_superscript_text"));
1141
else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.subscript_toggle)))
1142
do_text(g_object_get_data(G_OBJECT(widget), "calc_subscript_text"));
1144
do_text(g_object_get_data(G_OBJECT(widget), "calc_text"));
1151
/* If has a number already in a base, then solve and convert it */
1152
if (!display_is_result(&v->display) && display_is_number_with_base(&v->display))
1153
do_button(FN_CALCULATE, NULL);
1155
if (display_is_result(&v->display)) {
1157
display_convert (&v->display, BIN);
1159
display_convert (&v->display, OCT);
1160
else if (base == 16)
1161
display_convert (&v->display, HEX);
1163
display_convert (&v->display, DEC);
1170
else if (base == 16)
1180
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.superscript_toggle), TRUE);
1187
if (X.can_super_minus) {
1189
X.can_super_minus = FALSE;
1193
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.superscript_toggle), FALSE);
1200
base_cb(GtkWidget *widget, GdkEventButton *event)
1202
do_base(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "base")));
1208
exponent_cb(GtkWidget *widget, GdkEventButton *event)
1216
subtract_cb(GtkWidget *widget, GdkEventButton *event)
1224
button_cb(GtkWidget *widget, GdkEventButton *event)
1226
do_text(g_object_get_data(G_OBJECT(widget), "calc_text"));
2115
loc.x += widget->allocation.x;
2116
loc.y += widget->allocation.y;
2118
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, menu_pos_func,
2119
(gpointer) &loc, 0, gtk_get_current_event_time());
2120
} else if (event->button == 1) {
2121
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
2122
event->button, event->time);
1231
2129
select_display_entry(int offset)
1233
2131
GtkTextIter iter;
1235
2133
gtk_text_buffer_get_iter_at_offset(X.display_buffer, &iter, offset);
1236
2134
gtk_text_buffer_place_cursor(X.display_buffer, &iter);
1237
2135
gtk_widget_grab_focus(X.display_item);
1241
2139
G_MODULE_EXPORT
1243
2141
main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
1246
const char *conversions[] = {"*", "/", NULL};
1247
const char *conversion_values[] = {"×", "÷", NULL };
1249
2146
/* Only look at the modifiers we use */
1250
2147
state = event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK);
1252
// FIXME: Convert event to character
1253
// FIXME: Or safer to intercept characters as they enter the text input (handles input methods)
1255
2149
if (check_for_localized_numeric_point(event->keyval) == TRUE) {
1256
2150
event->state = 0;
1257
2151
event->keyval = GDK_KP_Decimal;
1261
if (state == GDK_CONTROL_MASK) {
1262
switch(event->keyval)
1274
do_button(FN_FACTORIZE, NULL);
1296
if (state == GDK_CONTROL_MASK ||
1297
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.superscript_toggle))) {
1298
switch(event->keyval)
1332
else if (state == GDK_MOD1_MASK ||
1333
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(X.subscript_toggle))) {
1334
switch(event->keyval)
2154
/* Accuracy shortcuts */
2155
if (state == GDK_CONTROL_MASK && (X.mode == SCIENTIFIC ||
2156
X.mode == PROGRAMMING)) {
2157
switch (event->keyval) {
2159
do_button(FN_SET_ACCURACY, 0);
2162
do_button(FN_SET_ACCURACY, 1);
2165
do_button(FN_SET_ACCURACY, 2);
2168
do_button(FN_SET_ACCURACY, 3);
2171
do_button(FN_SET_ACCURACY, 4);
2174
do_button(FN_SET_ACCURACY, 5);
2177
do_button(FN_SET_ACCURACY, 6);
2180
do_button(FN_SET_ACCURACY, 7);
2183
do_button(FN_SET_ACCURACY, 8);
2186
do_button(FN_SET_ACCURACY, 9);
2191
/* Connect home and end keys to move into the display entry */
2192
if (!gtk_widget_is_focus(X.display_item)) {
2193
if (event->keyval == GDK_Home) { /* || event->keyval == GDK_Left) { */
2194
select_display_entry(0);
2196
} else if (event->keyval == GDK_End) { /* || event->keyval == GDK_Right) { */
2197
select_display_entry(-1);
2202
/* Whitespace (but don't override activating buttons from the keyboard) */
2203
if (gtk_widget_is_focus(X.display_item) && event->keyval == GDK_space && state == 0) {
2204
do_button(FN_SPACE, 0);
2208
/* Absolute value */
2209
/*if (event->keyval == GDK_bar && state == 0) {
2210
do_button(FN_ABSOLUTE_VALUE, 0);
1369
2214
/* Delete in display */
1370
2215
if (event->keyval == GDK_Delete && state == 0 && (event->state & GDK_SHIFT_MASK) == 0) {
1371
do_button(FN_DELETE, NULL);
1374
if (event->keyval == GDK_BackSpace && state == 0 && (event->state & GDK_SHIFT_MASK) == 0) {
1375
do_button(FN_BACKSPACE, NULL);
1380
if ((event->keyval == GDK_Escape && state == 0) ||
1381
(event->keyval == GDK_BackSpace && state == GDK_CONTROL_MASK) ||
1382
(event->keyval == GDK_Delete && state == GDK_SHIFT_MASK)) {
1383
do_button(FN_CLEAR, NULL);
1388
if ((event->keyval == GDK_Return && state == 0) ||
1389
(event->keyval == GDK_KP_Enter && state == 0)) {
1390
if (gtk_widget_has_focus(X.display_item)) {
1391
do_button(FN_CALCULATE, NULL);
1399
if (state == GDK_CONTROL_MASK && event->keyval == GDK_minus)
1402
X.can_super_minus = FALSE;
1409
// FIXME: event->string deprecated
1411
if (strcmp(event->string, "-") == 0 || strcmp(event->string, "−") == 0) {
1416
for (i = 0; conversions[i]; i++) {
1417
if (strcmp(event->string, conversions[i]) == 0) {
1418
do_text(conversion_values[i]);
1422
if (strcmp(event->string, ".") == 0) {
1427
/* Some keyboards use this keyval for '^' (e.g. German) */
1428
if (event->keyval == GDK_dead_circumflex) {
1433
switch(*event->string)
1436
popup_cb(GET_WIDGET("calc_shift_left_button"), NULL);
1439
popup_cb(GET_WIDGET("calc_shift_right_button"), NULL);
1442
do_button(FN_CALCULATE, NULL);
1446
/* Don't override space - it is used in UI */
1447
if (event->string[0] == ' ' && !gtk_widget_has_focus(X.display_item))
1450
if (event->string[0] != '\0') {
1451
do_text(event->string);
1459
G_MODULE_EXPORT void
2216
do_button(FN_DELETE, 0);
2220
/* Shift inverse mode based on if shift is pressed */
2221
if (event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R) {
2222
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.inverse_toggle),
2227
for (i = 0; i < NBUTTONS; i++) {
2228
button = X.buttons[i];
2230
/* Check if function is available */
2231
#if GTK_CHECK_VERSION (2,17,5)
2232
if (!gtk_widget_is_sensitive (button))
2234
if (!GTK_WIDGET_IS_SENSITIVE(button))
2238
/* In basic mode only allow buttons that the user can see */
2239
if (X.mode == BASIC &&
2240
#if GTK_CHECK_VERSION (2,17,5)
2241
(!gtk_widget_get_visible (gtk_widget_get_parent(button)) ||
2242
!gtk_widget_get_visible (button)))
2244
(!GTK_WIDGET_VISIBLE(gtk_widget_get_parent(button)) ||
2245
!GTK_WIDGET_VISIBLE(button)))
2249
// FIXME: This is a bit hacky - needs to be rethought
2250
for (j = 0; button_widgets[i].accelerator_keys[j] != 0; j++) {
2251
if (button_widgets[i].accelerator_keys[j] == event->keyval &&
2252
(button_widgets[i].accelerator_mods[j] & ~GDK_SHIFT_MASK) == state) {
2254
// If we use shift for this shortcut then check it was in the original mask
2255
if ((button_widgets[i].accelerator_mods[j] & GDK_SHIFT_MASK) &&
2256
!(event->state & GDK_SHIFT_MASK))
2259
// Hack if this is a multi-function button
2260
if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "calc_function")) !=
2261
button_widgets[i].function)
2262
do_button(button_widgets[i].function, 0);
2264
button_cb(button, NULL);
2276
main_window_key_release_cb(GtkWidget *widget, GdkEventKey *event)
2278
if (event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R) {
2279
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(X.inverse_toggle),
1460
2289
edit_cb(GtkWidget *widget)
1462
2291
gboolean can_paste, can_copy;
1464
2293
can_copy = gtk_text_buffer_get_has_selection(X.display_buffer);
1465
2294
can_paste = gtk_clipboard_wait_is_text_available(
1466
2295
gtk_clipboard_get(X.clipboard_atom));
1468
2297
gtk_widget_set_sensitive(GET_WIDGET("copy_menu"), can_copy);
1469
2298
gtk_widget_set_sensitive(GET_WIDGET("paste_menu"), can_paste);
1473
2302
G_MODULE_EXPORT
1475
2304
copy_cb(GtkWidget *widget)
1653
2608
X.adv_panel = GET_WIDGET("advanced_panel");
1654
2609
X.fin_panel = GET_WIDGET("financial_panel");
1655
2610
X.bit_panel = GET_WIDGET("bit_panel");
1656
X.superscript_toggle = GET_WIDGET("superscript_togglebutton");
1657
X.subscript_toggle = GET_WIDGET("subscript_togglebutton");
1658
X.preferences_dialog = GET_WIDGET("preferences_dialog");
1659
X.info_buffer = GTK_TEXT_BUFFER(GET_OBJECT("info_buffer"));
1661
/* Connect text to buttons */
1662
for (i = 0; button_data[i].widget_name != NULL; i++) {
1663
SNPRINTF(name, MAXLINE, "calc_%s_button", button_data[i].widget_name);
1664
set_string_data(X.ui, name, "calc_text", button_data[i].data);
1667
/* Localize buttons */
2611
X.clear_buttons[0] = GET_WIDGET("calc_clear_simple_button");
2612
X.clear_buttons[1] = GET_WIDGET("calc_clear_advanced_button");
2613
X.sci_mode_panel = GET_WIDGET("scientific_mode_panel");
2614
X.prog_mode_panel = GET_WIDGET("programming_mode_panel");
2615
X.degree_radio = GET_WIDGET("degrees_radio");
2616
X.gradian_radio = GET_WIDGET("gradians_radio");
2617
X.radian_radio = GET_WIDGET("radians_radio");
2618
X.binary_radio = GET_WIDGET("binary_radio");
2619
X.octal_radio = GET_WIDGET("octal_radio");
2620
X.decimal_radio = GET_WIDGET("decimal_radio");
2621
X.hexadecimal_radio = GET_WIDGET("hexadecimal_radio");
2622
X.display_mode_radios[0] = GET_WIDGET("engineering_radio");
2623
X.display_mode_radios[1] = GET_WIDGET("fixed_point_radio");
2624
X.display_mode_radios[2] = GET_WIDGET("scientific_radio");
2625
X.word_length_radios[0] = GET_WIDGET("64bit_radio");
2626
X.word_length_radios[1] = GET_WIDGET("32bit_radio");
2627
X.word_length_radios[2] = GET_WIDGET("16bit_radio");
2628
X.inverse_toggle = GET_WIDGET("inverse_check");
2629
X.hyperbolic_toggle = GET_WIDGET("hyperbolic_check");
2630
X.statusbar = GET_WIDGET("statusbar");
1668
2631
for (i = 0; i < 16; i++) {
1669
SNPRINTF(name, MAXLINE, "calc_%d_button", i);
1670
gtk_button_set_label(GTK_BUTTON(GET_OBJECT(name)), v->digits[i]);
1671
set_string_data(X.ui, name, "calc_text", v->digits[i]);
1673
gtk_button_set_label(GTK_BUTTON(GET_OBJECT("calc_numeric_point_button")), v->radix);
1675
/* Connect super and subscript */
1676
for (i = 0; i < 10; i++) {
1677
SNPRINTF(name, MAXLINE, "calc_%d_button", i);
1678
set_string_data(X.ui, name, "calc_subscript_text", subscript_digits[i]);
1679
set_string_data(X.ui, name, "calc_superscript_text", superscript_digits[i]);
1682
/* Set base button data */
1683
set_int_data(X.ui, "calc_base_2_button", "base", 2);
1684
set_int_data(X.ui, "calc_base_8_button", "base", 8);
1685
set_int_data(X.ui, "calc_base_16_button", "base", 16);
1687
/* Connect menus to popup buttons */
2632
SNPRINTF(name, MAXLINE, "calc_%x_button", i);
2633
X.digit_buttons[i] = GET_WIDGET(name);
2635
for (i = 0; i < MAX_REGISTERS; i++) {
2636
SNPRINTF(name, MAXLINE, "register_entry_%d", i);
2637
X.register_entries[i] = GET_WIDGET(name);
2640
/* Load buttons and set them all to be the same size */
2641
size_group = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
2642
for (i = 0; i < NBUTTONS; i++) {
2643
SNPRINTF(name, MAXLINE, "calc_%s_button",
2644
button_widgets[i].widget_name);
2645
X.buttons[i] = GET_WIDGET(name);
2646
assert(X.buttons[i] != NULL);
2648
gtk_size_group_add_widget(size_group, X.buttons[i]);
2650
g_object_set_data(G_OBJECT(X.buttons[i]), "calc_function", GINT_TO_POINTER(button_widgets[i].function));
2653
/* Make popup buttons */
2654
set_data(X.ui, "calc_accuracy_button", "calc_menu", GET_WIDGET("accuracy_popup"));
1688
2655
set_data(X.ui, "calc_shift_left_button", "calc_menu", GET_WIDGET("left_shift_popup"));
1689
2656
set_data(X.ui, "calc_shift_right_button", "calc_menu", GET_WIDGET("right_shift_popup"));
2658
set_data(X.ui, "calc_constants_button", "calc_menu", GET_WIDGET("constants_popup"));
2659
for (i = 0; i < MAX_CONSTANTS; i++) {
2660
SNPRINTF(name, MAXLINE, "constant_menu_item%d", i);
2661
widget = GET_WIDGET(name);
2662
g_object_set_data(G_OBJECT(widget), "constant_id", GINT_TO_POINTER(i));
2663
X.constant_menu_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
2666
set_data(X.ui, "calc_functions_button", "calc_menu", GET_WIDGET("functions_popup"));
2667
for (i = 0; i < MAX_FUNCTIONS; i++) {
2668
SNPRINTF(name, MAXLINE, "function_menu_item%d", i);
2669
widget = GET_WIDGET(name);
2670
g_object_set_data(G_OBJECT(widget), "function_id", GINT_TO_POINTER(i));
2671
X.function_menu_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
1690
2674
set_data(X.ui, "calc_store_button", "calc_menu", GET_WIDGET("memory_store_popup"));
1691
2675
set_data(X.ui, "calc_recall_button", "calc_menu", GET_WIDGET("memory_recall_popup"));
1693
/* Get labels from popup menus */
1694
for (i = 0; registers[i]; i++) {
2676
set_data(X.ui, "calc_exchange_button", "calc_menu", GET_WIDGET("memory_exchange_popup"));
2677
for (i = 0; i < MAX_REGISTERS; i++) {
1695
2678
SNPRINTF(name, MAXLINE, "store_menu_item%d", i);
1696
2679
widget = GET_WIDGET(name);
1697
g_object_set_data(G_OBJECT(widget), "register_id", registers[i]);
2680
g_object_set_data(G_OBJECT(widget), "register_id", GINT_TO_POINTER(i));
1698
2681
X.memory_store_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
1700
2683
SNPRINTF(name, MAXLINE, "recall_menu_item%d", i);
1701
2684
widget = GET_WIDGET(name);
1702
g_object_set_data(G_OBJECT(widget), "register_id", registers[i]);
2685
g_object_set_data(G_OBJECT(widget), "register_id", GINT_TO_POINTER(i));
1703
2686
X.memory_recall_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
2688
SNPRINTF(name, MAXLINE, "exchange_menu_item%d", i);
2689
widget = GET_WIDGET(name);
2690
g_object_set_data(G_OBJECT(widget), "register_id", GINT_TO_POINTER(i));
2691
X.memory_exchange_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
1706
2694
/* Load bit panel */
1710
2698
SNPRINTF(name, MAXLINE, "bit_eventbox_%d", i);
1711
2699
set_int_data(X.ui, name, "bit_index", i);
2702
/* Make menu tooltips displayed in the status bar */
2703
set_menubar_tooltip("quit_menu");
2704
set_menubar_tooltip("copy_menu");
2705
set_menubar_tooltip("paste_menu");
2706
set_menubar_tooltip("insert_ascii_menu");
2707
set_menubar_tooltip("undo_menu");
2708
set_menubar_tooltip("redo_menu");
2709
set_menubar_tooltip("view_basic_menu");
2710
set_menubar_tooltip("view_advanced_menu");
2711
set_menubar_tooltip("view_financial_menu");
2712
set_menubar_tooltip("view_scientific_menu");
2713
set_menubar_tooltip("show_trailing_zeroes_menu");
2714
set_menubar_tooltip("show_thousands_separator_menu");
2715
set_menubar_tooltip("show_registers_menu");
2716
set_menubar_tooltip("help_menu");
2717
set_menubar_tooltip("about_menu");
1714
2719
/* Make dialogs transient of the main window */
1715
2720
gtk_window_set_transient_for(GTK_WINDOW(X.ascii_dialog), GTK_WINDOW(X.main_window));
2721
gtk_window_set_transient_for(GTK_WINDOW(X.precision_dialog), GTK_WINDOW(X.main_window));
2722
gtk_window_set_transient_for(GTK_WINDOW(X.register_dialog), GTK_WINDOW(X.main_window));
2723
gtk_window_set_transient_for(GTK_WINDOW(X.constants_dialog),
2724
GTK_WINDOW(X.main_window));
2726
/* Can't set max length for spin buttons in Glade 2 */
2727
gtk_entry_set_max_length(GTK_ENTRY(X.precision_spin), 2);
2729
gtk_dialog_set_default_response(GTK_DIALOG(X.constants_dialog),
2730
GTK_RESPONSE_ACCEPT);
2732
/* Make constant tree model */
2733
X.constants_model = create_constants_model();
2734
treeview = GET_WIDGET("edit_constants_treeview");
2735
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), X.constants_model);
2736
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
2737
GTK_SELECTION_SINGLE);
2738
/* Translators: Edit Constants Dialog: Constant number column title */
2739
add_cf_column(GTK_TREE_VIEW(treeview), _("No."), COLUMN_NUMBER, FALSE);
2740
/* Translators: Edit Constants Dialog: Constant value column title */
2741
add_cf_column(GTK_TREE_VIEW(treeview), _("Value"), COLUMN_VALUE, TRUE);
2742
/* Translators: Edit Constants Dialog: Constant description column title */
2743
add_cf_column(GTK_TREE_VIEW(treeview), _("Description"), COLUMN_DESCRIPTION, TRUE);
2745
/* Make function tree model */
2746
X.functions_model = create_functions_model();
2747
treeview = GET_WIDGET("edit_functions_treeview");
2748
gtk_dialog_set_default_response(GTK_DIALOG(X.function_dialog),
2749
GTK_RESPONSE_ACCEPT);
2750
gtk_window_set_transient_for(GTK_WINDOW(X.function_dialog),
2751
GTK_WINDOW(X.main_window));
2752
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), X.functions_model);
2753
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
2754
GTK_SELECTION_SINGLE);
2755
/* Translators: Edit Functions Dialog: Function number column title */
2756
add_cf_column(GTK_TREE_VIEW(treeview), _("No."),
2757
COLUMN_NUMBER, FALSE);
2758
/* Translators: Edit Functions Dialog: Function value column title */
2759
add_cf_column(GTK_TREE_VIEW(treeview), _("Value"),
2760
COLUMN_VALUE, TRUE);
2761
/* Translators: Edit Functions Dialog: Function description column title */
2762
add_cf_column(GTK_TREE_VIEW(treeview), _("Description"),
2763
COLUMN_DESCRIPTION, TRUE);
1717
2765
X.display_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(X.display_item));
1718
2766
gtk_widget_ensure_style(X.display_item);
1802
angle_unit_combobox_changed_cb(GtkWidget *combo)
1806
GtkTreeModel *model;
1814
{"degrees", MP_DEGREES},
1815
{"radians" , MP_RADIANS},
1816
{"gradians", MP_GRADIANS},
1820
model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
1821
gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter);
1822
gtk_tree_model_get(model, &iter, 1, &value, -1);
1823
for (i = 0; unit_map[i].value != NULL && strcmp(unit_map[i].value, value) != 0; i++);
1824
display_set_angle_unit(&v->display, unit_map[i].units);
1826
set_resource(R_TRIG, value);
1832
display_format_combobox_changed_cb(GtkWidget *combo)
1836
GtkTreeModel *model;
1841
DisplayFormat format;
1847
{"hexadecimal", HEX},
1848
{"scientific", SCI},
1849
{"engineering", ENG},
1853
model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
1854
gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter);
1855
gtk_tree_model_get(model, &iter, 1, &value, -1);
1856
for (i = 0; mode_map[i].value != NULL && strcmp(mode_map[i].value, value) != 0; i++);
1857
display_set_format(&v->display, mode_map[i].format);
1859
set_resource(R_DISPLAY, value);
1865
word_size_combobox_changed_cb(GtkWidget *combo)
1868
GtkTreeModel *model;
1871
model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
1872
gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter);
1873
gtk_tree_model_get(model, &iter, 1, &value, -1);
1874
display_set_word_size(&v->display, value);
1876
set_int_resource(R_WORDLEN, value);
1882
decimal_places_spin_change_value_cb(GtkWidget *spin)
1886
value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
1887
display_set_accuracy(&v->display, value);
1889
set_int_resource(R_ACCURACY, value);
1895
thousands_separator_check_toggled_cb(GtkWidget *check)
1899
value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
1900
display_set_show_thousands_separator(&v->display, value);
1901
set_boolean_resource(R_TSEP, value);
1907
trailing_zeroes_check_toggled_cb(GtkWidget *check)
1911
value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
1912
display_set_show_trailing_zeroes(&v->display, value);
1913
set_boolean_resource(R_ZEROES, value);
1918
set_combo_box_from_config(const gchar *name, const gchar *key_name, GType key_type)
1921
GtkTreeModel *model;
1922
gchar *str_key_value = NULL;
1927
combo = GET_WIDGET(name);
1928
model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
1929
valid = gtk_tree_model_get_iter_first(model, &iter);
1934
str_key_value = get_resource(key_name);
1939
if (!get_int_resource(key_name, &int_key_value))
1949
gboolean matched = FALSE;
1954
gtk_tree_model_get(model, &iter, 1, &str_value, -1);
1955
matched = strcmp(str_value, str_key_value) == 0;
1958
gtk_tree_model_get(model, &iter, 1, &int_value, -1);
1959
matched = int_value == int_key_value;
1968
valid = gtk_tree_model_iter_next(model, &iter);
1971
valid = gtk_tree_model_get_iter_first(model, &iter);
1973
gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter);
1975
g_free(str_key_value);
1984
2864
/* Create main gcalctool window. */
1985
2865
create_main_window();
2867
/* Load configuration */
2868
ui_set_show_thousands_separator(v->display.show_tsep);
2869
ui_set_show_trailing_zeroes(v->display.show_zeroes);
2871
ui_set_mode(X.mode);
2872
ui_set_numeric_mode(v->display.format);
2873
ui_set_base(v->base);
2874
ui_set_wordlen(v->wordlen);
2875
ui_set_accuracy(v->accuracy);
1986
2876
ui_set_undo_enabled(FALSE, FALSE);
1988
set_combo_box_from_config("angle_unit_combobox", R_TRIG, G_TYPE_STRING);
1989
set_combo_box_from_config("display_format_combobox", R_DISPLAY, G_TYPE_STRING);
1990
set_combo_box_from_config("word_size_combobox", R_WORDLEN, G_TYPE_INT);
1992
if (!get_int_resource(R_ACCURACY, &value))
1994
gtk_spin_button_set_value(GTK_SPIN_BUTTON(GET_OBJECT("decimal_places_spin")), value);
1996
if (!get_boolean_resource(R_TSEP, &value))
1998
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(GET_OBJECT("thousands_separator_check")), value);
2000
if (!get_boolean_resource(R_ZEROES, &value))
2002
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(GET_OBJECT("trailing_zeroes_check")), value);
2007
add_buttons_to_size_group()
2010
GtkSizeGroup *size_group;
2012
const char *button_names[] = {
2013
"calc_finc_straight_line_depreciation_button",
2014
"calc_finc_periodic_interest_rate_button",
2015
"calc_finc_present_value_button",
2016
"calc_finc_periodic_payment_button",
2017
"calc_finc_future_value_button",
2018
"calc_finc_gross_profit_margin_button",
2019
"calc_finc_double_declining_depreciation_button",
2020
"calc_finc_compounding_term_button",
2021
"calc_finc_sum_of_the_years_digits_depreciation_button",
2022
"calc_finc_term_button",
2023
"calc_store_button",
2024
"calc_recall_button",
2026
"calc_modulus_divide_button",
2028
"calc_x_pow_y_button",
2029
"calc_logarithm_button",
2030
"calc_inverse_button",
2031
"calc_natural_logarithm_button",
2032
"calc_eulers_number_button",
2034
"calc_factorial_button",
2035
"calc_integer_portion_button",
2036
"calc_exponential_button",
2037
"calc_fractional_portion_button",
2038
"calc_imaginary_button",
2039
"subscript_togglebutton",
2040
"superscript_togglebutton",
2048
"calc_divide_button",
2052
"calc_numeric_point_button",
2053
"calc_result_button",
2055
"calc_multiply_button",
2056
"calc_subtract_button",
2058
"calc_clear_button",
2059
"calc_start_group_button",
2060
"calc_end_group_button",
2061
"calc_percentage_button",
2072
"calc_ones_complement_button",
2073
"calc_twos_complement_button",
2074
"calc_shift_right_button",
2075
"calc_shift_left_button",
2076
"calc_trunc_button",
2077
"calc_random_button",
2078
"calc_base_2_button",
2079
"calc_base_8_button",
2080
"calc_base_16_button",
2081
"calc_si_kilo_button",
2082
"calc_si_milli_button",
2083
"calc_si_micro_button",
2084
"calc_si_mega_button",
2085
"calc_si_giga_button",
2086
"calc_si_peta_button",
2087
"calc_si_femto_button",
2088
"calc_si_pico_button",
2089
"calc_si_nano_button",
2090
"calc_tangent_button",
2092
"calc_cosine_button",
2093
"calc_hyperbolic_cosine_button",
2094
"calc_hyperbolic_sine_button",
2095
"calc_hyperbolic_tangent_button",
2096
"calc_character_button",
2099
size_group = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
2100
for (i = 0; button_names[i] != NULL; i++)
2101
gtk_size_group_add_widget(size_group, GET_WIDGET(button_names[i]));
2877
ui_update_modifier_mode();
2879
/* Show the memory register window? */
2880
ui_make_registers();
2881
if (get_boolean_resource(R_REGS, &boolval))
2882
ui_set_registers_visible(boolval);
2884
/* Set default accuracy menu item */
2885
/* Translators: Accuracy Popup: Menu item to reset the accuracy to the default value. %d is replaced with the default value. */
2886
SNPRINTF(text, MAXLINE, _("Reset to _Default (%d)"), DEFAULT_ACCURACY);
2887
widget = gtk_bin_get_child(GTK_BIN(GET_OBJECT("acc_item_default")));
2888
gtk_label_set_markup_with_mnemonic(GTK_LABEL(widget), text);
2108
ui_set_mode(X.mode);
2894
ui_set_base(v->base);
2895
ui_set_wordlen(v->wordlen);
2896
ui_set_trigonometric_mode(v->ttype);
2897
ui_set_numeric_mode(v->display.format);
2110
2899
gtk_widget_show(X.main_window);
2112
/* Add buttons to size group so they are all the same size.
2114
* This is supported in GtkBuilder but it does not appear to work, setting
2115
* the group after showing the widgets works. It would have been preferrable
2116
* to make the table homogeneous but this does not ignore hidden rows.
2118
add_buttons_to_size_group();