From 3e4dfc47e7803d16d14ffe655f9568871c4f2339 Mon Sep 17 00:00:00 2001 From: Steve Zesch Date: Sat, 24 Nov 2012 20:47:50 -0500 Subject: GTK2 support. Menu fix. Code cleanups. --- src/mate-calc.c | 258 +++++----------------------------------- src/math-converter.c | 2 +- src/math-display.c | 4 +- src/math-variable-popup.c | 6 +- src/math-window.c | 292 ++++++++++++++++++++++++++++++++++++++++++++-- src/math-window.h | 11 +- 6 files changed, 326 insertions(+), 247 deletions(-) (limited to 'src') diff --git a/src/mate-calc.c b/src/mate-calc.c index 15efc97..f23ff38 100644 --- a/src/mate-calc.c +++ b/src/mate-calc.c @@ -23,7 +23,6 @@ static GSettings *settings = NULL; static MathWindow *window; -static MathPreferencesDialog *preferences_dialog; static void version(const gchar *progname) @@ -249,12 +248,9 @@ programming_base_cb(MathButtons *buttons, GParamSpec *spec) } -static void -mode_cb(MathButtons *buttons, GParamSpec *spec, GApplication *app) +/*static void +mode_cb(MathButtons *buttons, GParamSpec *spec) { - const char *state; - GAction *action; - g_settings_set_enum(settings, "button-mode", math_buttons_get_mode(buttons)); switch(math_buttons_get_mode(buttons)) @@ -277,162 +273,17 @@ mode_cb(MathButtons *buttons, GParamSpec *spec, GApplication *app) state = "programming"; break; } - - action = g_action_map_lookup_action(G_ACTION_MAP(app), "mode"); - g_simple_action_set_state(G_SIMPLE_ACTION(action), - g_variant_new_string(state)); -} - - -static void -copy_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - math_equation_copy(math_window_get_equation(window)); -} +}*/ static void -paste_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) +quit_cb(MathWindow *window) { - math_equation_paste(math_window_get_equation(window)); + gtk_main_quit(); } -static void -undo_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - math_equation_undo(math_window_get_equation(window)); -} - - -static void -redo_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - math_equation_redo(math_window_get_equation(window)); -} - - -static void -mode_changed_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - const char *mode_str; - int mode = BASIC; - - mode_str = g_variant_get_string(parameter, NULL); - if (strcmp(mode_str, "basic") == 0) - mode = BASIC; - else if (strcmp(mode_str, "advanced") == 0) - mode = ADVANCED; - else if (strcmp(mode_str, "financial") == 0) - mode = FINANCIAL; - else if (strcmp(mode_str, "programming") == 0) - mode = PROGRAMMING; - math_buttons_set_mode(math_window_get_buttons(window), mode); -} - - -static void -show_preferences_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - if (!preferences_dialog) { - preferences_dialog = math_preferences_dialog_new(math_window_get_equation(window)); - gtk_window_set_transient_for(GTK_WINDOW(preferences_dialog), GTK_WINDOW(window)); - } - gtk_window_present(GTK_WINDOW(preferences_dialog)); -} - - -static void -help_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - GdkScreen *screen; - GError *error = NULL; - - screen = gtk_widget_get_screen(GTK_WIDGET(window)); - gtk_show_uri(screen, "help:mate-calc", gtk_get_current_event_time(), &error); - - if (error != NULL) - { - GtkWidget *d; - /* Translators: Error message displayed when unable to launch help browser */ - const char *message = _("Unable to open help file"); - - d = gtk_message_dialog_new(GTK_WINDOW (window), - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - "%s", message); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG (d), - "%s", error->message); - g_signal_connect(d, "response", G_CALLBACK(gtk_widget_destroy), NULL); - gtk_window_present(GTK_WINDOW(d)); - - g_error_free(error); - } -} - - -static void -about_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - const gchar *authors[] = { - "Rich Burridge ", - "Robert Ancell ", - "Klaus Niederkrüger ", - "Robin Sonefors ", - NULL - }; - const gchar *documenters[] = { - "Sun Microsystems", - NULL - }; - - /* The translator credits. Please translate this with your name(s). */ - const gchar *translator_credits = _("translator-credits"); - - /* The license this software is under (GPL2+) */ - char *license = _("mate-calc is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 2 of the License, or\n" - "(at your option) any later version.\n" - "\n" - "mate-calc is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "GNU General Public License for more details.\n" - "\n" - "You should have received a copy of the GNU General Public License\n" - "along with mate-calc; if not, write to the Free Software Foundation, Inc.,\n" - "151 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA"); - - gtk_show_about_dialog(GTK_WINDOW(window), - "name", - /* Program name in the about dialog */ - _("mate-calc"), - "version", VERSION, - "copyright", - /* Copyright notice in the about dialog */ - _("\xc2\xa9 1986–2010 The gcalctool authors\n 2011-2012 mate-calc authors"), - "license", license, - "comments", - /* Short description in the about dialog */ - _("Calculator with financial and scientific modes."), - "authors", authors, - "documenters", documenters, - "translator_credits", translator_credits, - "logo-icon-name", "accessories-calculator", - "website", "http://mate-desktop.org", - NULL); -} - - -static void -quit_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) -{ - gtk_widget_destroy(GTK_WIDGET(window)); -} - - -static GActionEntry app_entries[] = { +/*static GActionEntry app_entries[] = { { "copy", copy_cb, NULL, NULL, NULL }, { "paste", paste_cb, NULL, NULL, NULL }, { "undo", undo_cb, NULL, NULL, NULL }, @@ -442,11 +293,10 @@ static GActionEntry app_entries[] = { { "help", help_cb, NULL, NULL, NULL }, { "about", about_cb, NULL, NULL, NULL }, { "quit", quit_cb, NULL, NULL, NULL }, -}; +};*/ -static void -startup_cb(GApplication *application) +int main(int argc, char **argv) { MathEquation *equation; MathButtons *buttons; @@ -457,7 +307,16 @@ startup_cb(GApplication *application) ButtonMode button_mode; gchar *source_currency, *target_currency; gchar *source_units, *target_units; - GMenu *menu, *section; + + g_type_init(); + + setlocale(LC_ALL, ""); + bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain(GETTEXT_PACKAGE); + + /* Seed random number generator. */ + srand48((long) time((time_t *) 0)); settings = g_settings_new ("org.mate.calc"); accuracy = g_settings_get_int(settings, "accuracy"); @@ -500,80 +359,23 @@ startup_cb(GApplication *application) g_signal_connect(equation, "notify::source-units", G_CALLBACK(source_units_cb), NULL); g_signal_connect(equation, "notify::target-units", G_CALLBACK(target_units_cb), NULL); - g_action_map_add_action_entries(G_ACTION_MAP(application), app_entries, G_N_ELEMENTS(app_entries), NULL); - - window = math_window_new(GTK_APPLICATION(application), equation); - buttons = math_window_get_buttons(window); - math_buttons_set_programming_base(buttons, base); - math_buttons_set_mode(buttons, button_mode); // FIXME: We load the basic buttons even if we immediately switch to the next type - g_signal_connect(buttons, "notify::programming-base", G_CALLBACK(programming_base_cb), NULL); - g_signal_connect(buttons, "notify::mode", G_CALLBACK(mode_cb), application); - mode_cb (buttons, NULL, application); - - menu = g_menu_new(); - - section = g_menu_new(); - g_menu_append(section, _("Basic"), "app.mode::basic"); - g_menu_append(section, _("Advanced"), "app.mode::advanced"); - g_menu_append(section, _("Financial"), "app.mode::financial"); - g_menu_append(section, _("Programming"), "app.mode::programming"); - g_menu_append_section(menu, _("Mode"), G_MENU_MODEL(section)); - - section = g_menu_new(); - g_menu_append(section, _("Preferences"), "app.preferences"); - g_menu_append_section(menu, NULL, G_MENU_MODEL(section)); - - section = g_menu_new(); - g_menu_append(section, _("About Calculator"), "app.about"); - g_menu_append(section, _("Help"), "app.help"); - g_menu_append(section, _("Quit"), "app.quit"); - g_menu_append_section(menu, NULL, G_MENU_MODEL(section)); - - gtk_application_set_app_menu(GTK_APPLICATION(application), G_MENU_MODEL(menu)); - - gtk_application_add_accelerator(GTK_APPLICATION(application), "Q", "app.quit", NULL); - gtk_application_add_accelerator(GTK_APPLICATION(application), "F1", "app.help", NULL); - gtk_application_add_accelerator(GTK_APPLICATION(application), "C", "app.copy", NULL); - gtk_application_add_accelerator(GTK_APPLICATION(application), "V", "app.paste", NULL); - gtk_application_add_accelerator(GTK_APPLICATION(application), "Z", "app.undo", NULL); - gtk_application_add_accelerator(GTK_APPLICATION(application), "Z", "app.redo", NULL); -} - - -static void -activate_cb(GApplication *application) -{ - gtk_window_present(GTK_WINDOW(window)); -} - - -int -main(int argc, char **argv) -{ - GtkApplication *app; - int status; - - setlocale(LC_ALL, ""); - bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); - bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); - textdomain(GETTEXT_PACKAGE); - - /* Seed random number generator. */ - srand48((long) time((time_t *) 0)); - - g_type_init(); - get_options(argc, argv); gtk_init(&argc, &argv); - gtk_window_set_default_icon_name("accessories-calculator"); + //gtk_window_set_default_icon_name("accessories-calculator"); - app = gtk_application_new(NULL, G_APPLICATION_NON_UNIQUE); - g_signal_connect(app, "startup", G_CALLBACK(startup_cb), NULL); - g_signal_connect(app, "activate", G_CALLBACK(activate_cb), NULL); + window = math_window_new(equation); + buttons = math_window_get_buttons(window); + g_signal_connect(G_OBJECT(window), "quit", G_CALLBACK(quit_cb), NULL); + math_buttons_set_programming_base(buttons, base); + math_buttons_set_mode(buttons, button_mode); // FIXME: We load the basic buttons even if we immediately switch to the next type + g_signal_connect(buttons, "notify::programming-base", G_CALLBACK(programming_base_cb), NULL); + //g_signal_connect(buttons, "notify::mode", G_CALLBACK(mode_cb), NULL); + //mode_cb (buttons, NULL); - status = g_application_run(G_APPLICATION(app), argc, argv); + gtk_widget_show(GTK_WIDGET(window)); + gtk_main(); - return status; + return 0; } diff --git a/src/math-converter.c b/src/math-converter.c index ff28500..2f543fe 100644 --- a/src/math-converter.c +++ b/src/math-converter.c @@ -391,7 +391,7 @@ math_converter_init(MathConverter *converter) gtk_box_set_spacing(GTK_BOX(converter), 6); - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(converter), hbox, FALSE, TRUE, 0); diff --git a/src/math-display.c b/src/math-display.c index 6718665..fb5af8b 100644 --- a/src/math-display.c +++ b/src/math-display.c @@ -326,7 +326,7 @@ create_gui(MathDisplay *display) int i; GtkStyle *style; - main_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + main_box = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(display), main_box); g_signal_connect(display, "key-press-event", G_CALLBACK(key_press_cb), display); @@ -350,7 +350,7 @@ create_gui(MathDisplay *display) g_signal_connect(display->priv->text_view, "key-press-event", G_CALLBACK(display_key_press_cb), display); gtk_box_pack_start(GTK_BOX(main_box), display->priv->text_view, TRUE, TRUE, 0); - info_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + info_box = gtk_hbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(main_box), info_box, FALSE, TRUE, 0); info_view = gtk_text_view_new(); diff --git a/src/math-variable-popup.c b/src/math-variable-popup.c index d033571..1287f7a 100644 --- a/src/math-variable-popup.c +++ b/src/math-variable-popup.c @@ -131,7 +131,7 @@ make_variable_entry(MathVariablePopup *popup, const gchar *name, const MPNumber GtkWidget *hbox, *button, *label; gchar *text; - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + hbox = gtk_hbox_new(FALSE, 6); if (value) { @@ -211,7 +211,7 @@ math_variable_popup_set_property(GObject *object, } g_strfreev(names); - entry = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + entry = gtk_hbox_new(FALSE, 6); gtk_widget_show(entry); // TODO: Show greyed "variable name" text to give user a hint how to use @@ -301,7 +301,7 @@ math_variable_popup_init(MathVariablePopup *popup) /* Destroy this window when it loses focus */ g_signal_connect(G_OBJECT(popup), "focus-out-event", G_CALLBACK(variable_focus_out_event_cb), popup); - popup->priv->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); + popup->priv->vbox = gtk_vbox_new(FALSE, 6); gtk_box_set_homogeneous(GTK_BOX(popup->priv->vbox), TRUE); gtk_container_add(GTK_CONTAINER(popup), popup->priv->vbox); gtk_widget_show(popup->priv->vbox); diff --git a/src/math-window.c b/src/math-window.c index 4ecc5f7..4692ec8 100644 --- a/src/math-window.c +++ b/src/math-window.c @@ -22,23 +22,39 @@ enum { struct MathWindowPrivate { + GtkWidget *menu_bar; MathEquation *equation; MathDisplay *display; MathButtons *buttons; + MathPreferencesDialog *preferences_dialog; gboolean right_aligned; + GtkWidget *mode_basic_menu_item; + GtkWidget *mode_advanced_menu_item; + GtkWidget *mode_financial_menu_item; + GtkWidget *mode_programming_menu_item; }; -G_DEFINE_TYPE (MathWindow, math_window, GTK_TYPE_APPLICATION_WINDOW); +G_DEFINE_TYPE (MathWindow, math_window, GTK_TYPE_WINDOW); +enum +{ + QUIT, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0, }; MathWindow * -math_window_new(GtkApplication *app, MathEquation *equation) +math_window_new(MathEquation *equation) { return g_object_new(math_window_get_type(), - "application", app, - "equation", equation, NULL); + "equation", equation, NULL); } +GtkWidget *math_window_get_menu_bar(MathWindow *window) +{ + return window->priv->menu_bar; +} MathEquation * math_window_get_equation(MathWindow *window) @@ -83,9 +99,32 @@ math_window_critical_error(MathWindow *window, const gchar *title, const gchar * gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(GTK_WIDGET(window)); + g_signal_emit(window, signals[QUIT], 0); +} + +static void mode_changed_cb(GtkWidget *menu, MathWindow *window) +{ + int mode; + + if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu))) + { + return; + } + + mode = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu), "calcmode")); + math_buttons_set_mode(window->priv->buttons, mode); } +static void show_preferences_cb(GtkMenuItem *menu, MathWindow *window) +{ + if (!window->priv->preferences_dialog) + { + window->priv->preferences_dialog = math_preferences_dialog_new(window->priv->equation); + gtk_window_set_transient_for(GTK_WINDOW(window->priv->preferences_dialog), GTK_WINDOW(window)); + } + + gtk_window_present(GTK_WINDOW(window->priv->preferences_dialog)); +} static gboolean key_press_cb(MathWindow *window, GdkEventKey *event) @@ -118,6 +157,104 @@ key_press_cb(MathWindow *window, GdkEventKey *event) return result; } +static void delete_cb(MathWindow *window, GdkEvent *event) +{ + g_signal_emit(window, signals[QUIT], 0); +} + +static void copy_cb(GtkWidget *widget, MathWindow *window) +{ + math_equation_copy(window->priv->equation); +} + +static void paste_cb(GtkWidget *widget, MathWindow *window) +{ + math_equation_paste(window->priv->equation); +} + +static void undo_cb(GtkWidget *widget, MathWindow *window) +{ + math_equation_undo(window->priv->equation); +} + +static void redo_cb(GtkWidget *widget, MathWindow *window) +{ + math_equation_redo(window->priv->equation); +} + +static void help_cb(GtkWidget *widget, MathWindow *window) +{ + GdkScreen *screen; + GError *error = NULL; + + screen = gtk_widget_get_screen(GTK_WIDGET(window)); + gtk_show_uri(screen, "ghelp:mate-calc", gtk_get_current_event_time(), &error); + + if (error != NULL) + { + GtkWidget *d; + /* Translators: Error message displayed when unable to launch help browser */ + const char *message = _("Unable to open help file"); + + d = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", message); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(d), "%s", error->message); + g_signal_connect(d, "respones", G_CALLBACK(gtk_widget_destroy), NULL); + gtk_window_present(GTK_WINDOW (d)); + + g_error_free(error); + } +} + +static void about_cb(GtkWidget* widget, MathWindow* window) +{ + char* authors[] = { + "Rich Burridge ", + "Robert Ancell ", + "Klaus Niederkrüger ", + NULL + }; + + char* documenters[] = { + "Sun Microsystems", + NULL + }; + + /* The translator credits. Please translate this with your name(s). */ + char* translator_credits = _("translator-credits"); + + char copyright[] = \ + "Copyright \xc2\xa9 1986–2010 The GCalctool authors\n" + "Copyright \xc2\xa9 2011-2012 MATE developers"; + + /* The license this software is under (GPL2+) */ + char* license = _("mate-calc is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "mate-calc is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with mate-calc; if not, write to the Free Software Foundation, Inc.,\n" + "151 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA"); + + gtk_show_about_dialog(GTK_WINDOW(window), + "name", _("mate-calc"), + "version", VERSION, + "copyright", copyright, + "license", license, + "comments", _("Calculator with financial and scientific modes."), + "authors", authors, + "documenters", documenters, + "translator_credits", translator_credits, + "logo-icon-name", "accessories-calculator", + "website", "http://mate-desktop.org", + NULL); +} static void scroll_changed_cb(GtkAdjustment *adjustment, MathWindow *window) @@ -136,18 +273,144 @@ scroll_value_changed_cb(GtkAdjustment *adjustment, MathWindow *window) window->priv->right_aligned = FALSE; } +static void button_mode_changed_cb(MathButtons *buttons, GParamSpec *spec, MathWindow *window) +{ + GtkWidget *menu; + + switch (math_buttons_get_mode(buttons)) + { + default: + case BASIC: + menu = window->priv->mode_basic_menu_item; + break; + case ADVANCED: + menu = window->priv->mode_advanced_menu_item; + break; + case FINANCIAL: + menu = window->priv->mode_financial_menu_item; + break; + case PROGRAMMING: + menu = window->priv->mode_programming_menu_item; + break; + } + + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), TRUE); +} + +static GtkWidget *add_menu(GtkWidget *menu_bar, const gchar *name) +{ + GtkWidget *menu_item; + GtkWidget *menu; + + menu_item = gtk_menu_item_new_with_mnemonic(name); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_item); + gtk_widget_show(menu_item); + menu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), menu); + + return menu; +} + +static void quit_cb(GtkWidget* widget, MathWindow* window) +{ + g_signal_emit(window, signals[QUIT], 0); +} + +static GtkWidget *add_menu_item(GtkWidget *menu, GtkWidget *menu_item, GCallback callback, gpointer callback_data) +{ + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); + gtk_widget_show(menu_item); + + if (callback) + { + g_signal_connect(G_OBJECT(menu_item), "activate", callback, callback_data); + } + + return menu_item; +} + +static GtkWidget *radio_menu_item_new(GSList **group, const gchar *name) +{ + GtkWidget *menu_item = gtk_radio_menu_item_new_with_mnemonic(*group, name); + + *group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menu_item)); + + return menu_item; +} + +static void create_menu(MathWindow* window) +{ + GtkAccelGroup* accel_group; + GtkWidget* menu; + GtkWidget* menu_item; + GSList* group = NULL; + + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); + + /* Calculator menu */ + #define CALCULATOR_MENU_LABEL _("_Calculator") + /* Mode menu */ + #define MODE_MENU_LABEL _("_Mode") + /* Help menu label */ + #define HELP_MENU_LABEL _("_Help") + /* Basic menu label */ + #define MODE_BASIC_LABEL _("_Basic") + /* Advanced menu label */ + #define MODE_ADVANCED_LABEL _("_Advanced") + /* Financial menu label */ + #define MODE_FINANCIAL_LABEL _("_Financial") + /* Programming menu label */ + #define MODE_PROGRAMMING_LABEL _("_Programming") + /* Help>Contents menu label */ + #define HELP_CONTENTS_LABEL _("_Contents") + + menu = add_menu(window->priv->menu_bar, CALCULATOR_MENU_LABEL); + add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, accel_group), G_CALLBACK(copy_cb), window); + add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, accel_group), G_CALLBACK(paste_cb), window); + menu_item = add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDO, accel_group), G_CALLBACK(undo_cb), window); + gtk_widget_add_accelerator(menu_item, "activate", accel_group, GDK_z, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + menu_item = add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_REDO, accel_group), G_CALLBACK(redo_cb), window); + gtk_widget_add_accelerator(menu_item, "activate", accel_group, GDK_z, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); + add_menu_item(menu, gtk_separator_menu_item_new(), NULL, NULL); + add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, accel_group), G_CALLBACK(show_preferences_cb), window); + add_menu_item(menu, gtk_separator_menu_item_new(), NULL, NULL); + menu_item = add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group), G_CALLBACK(quit_cb), window); + gtk_widget_add_accelerator(menu_item, "activate", accel_group, GDK_w, GDK_CONTROL_MASK, 0); + + menu = add_menu(window->priv->menu_bar, MODE_MENU_LABEL); + window->priv->mode_basic_menu_item = add_menu_item(menu, radio_menu_item_new(&group, MODE_BASIC_LABEL), G_CALLBACK(mode_changed_cb), window); + g_object_set_data(G_OBJECT(window->priv->mode_basic_menu_item), "calcmode", GINT_TO_POINTER(BASIC)); + window->priv->mode_advanced_menu_item = add_menu_item(menu, radio_menu_item_new(&group, MODE_ADVANCED_LABEL), G_CALLBACK(mode_changed_cb), window); + g_object_set_data(G_OBJECT(window->priv->mode_advanced_menu_item), "calcmode", GINT_TO_POINTER(ADVANCED)); + window->priv->mode_financial_menu_item = add_menu_item(menu, radio_menu_item_new(&group, MODE_FINANCIAL_LABEL), G_CALLBACK(mode_changed_cb), window); + g_object_set_data(G_OBJECT(window->priv->mode_financial_menu_item), "calcmode", GINT_TO_POINTER(FINANCIAL)); + window->priv->mode_programming_menu_item = add_menu_item(menu, radio_menu_item_new(&group, MODE_PROGRAMMING_LABEL), G_CALLBACK(mode_changed_cb), window); + g_object_set_data(G_OBJECT(window->priv->mode_programming_menu_item), "calcmode", GINT_TO_POINTER(PROGRAMMING)); + + menu = add_menu(window->priv->menu_bar, HELP_MENU_LABEL); + menu_item = add_menu_item(menu, gtk_menu_item_new_with_mnemonic(HELP_CONTENTS_LABEL), G_CALLBACK(help_cb), window); + gtk_widget_add_accelerator(menu_item, "activate", accel_group, GDK_F1, 0, GTK_ACCEL_VISIBLE); + add_menu_item(menu, gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, accel_group), G_CALLBACK(about_cb), window); +} static void create_gui(MathWindow *window) { GtkWidget *main_vbox, *vbox; GtkWidget *scrolled_window; - - main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + + main_vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), main_vbox); gtk_widget_show(main_vbox); - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); + window->priv->menu_bar = gtk_menu_bar_new(); + gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->menu_bar, TRUE, TRUE, 0); + gtk_widget_show(window->priv->menu_bar); + + create_menu(window); + + vbox = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); gtk_box_pack_start(GTK_BOX(main_vbox), vbox, TRUE, TRUE, 0); gtk_widget_show(vbox); @@ -155,7 +418,7 @@ create_gui(MathWindow *window) scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scrolled_window), FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scrolled_window), TRUE, TRUE, 0); g_signal_connect(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scrolled_window)), "changed", G_CALLBACK(scroll_changed_cb), window); g_signal_connect(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scrolled_window)), "value-changed", G_CALLBACK(scroll_value_changed_cb), window); window->priv->right_aligned = TRUE; @@ -166,6 +429,8 @@ create_gui(MathWindow *window) gtk_widget_show(GTK_WIDGET(window->priv->display)); window->priv->buttons = math_buttons_new(window->priv->equation); + g_signal_connect(window->priv->buttons, "notify::mode", G_CALLBACK(button_mode_changed_cb), window); + button_mode_changed_cb(window->priv->buttons, NULL, window); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(window->priv->buttons), TRUE, TRUE, 0); gtk_widget_show(GTK_WIDGET(window->priv->buttons)); } @@ -231,6 +496,14 @@ math_window_class_init(MathWindowClass *klass) "Equation being calculated", math_equation_get_type(), G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + signals[QUIT] = g_signal_new("quit", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MathWindowClass, quit), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } @@ -244,4 +517,5 @@ math_window_init(MathWindow *window) gtk_window_set_role(GTK_WINDOW(window), "mate-calc"); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); g_signal_connect_after(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press_cb), NULL); + g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(delete_cb), NULL); } diff --git a/src/math-window.h b/src/math-window.h index 22360fa..5575cf3 100644 --- a/src/math-window.h +++ b/src/math-window.h @@ -16,6 +16,7 @@ #include "math-equation.h" #include "math-display.h" #include "math-buttons.h" +#include "math-preferences.h" G_BEGIN_DECLS @@ -25,20 +26,22 @@ typedef struct MathWindowPrivate MathWindowPrivate; typedef struct { - GtkApplicationWindow parent_instance; + GtkWindow parent_instance; MathWindowPrivate *priv; } MathWindow; typedef struct { - GtkApplicationWindowClass parent_class; + GtkWindowClass parent_class; - void (*quit)(MathWindow *window); + void (*quit) (MathWindow *window); } MathWindowClass; GType math_window_get_type(void); -MathWindow *math_window_new(GtkApplication *app, MathEquation *equation); +MathWindow *math_window_new(MathEquation *equation); + +GtkWidget *math_window_get_menu_bar(MathWindow *window); MathEquation *math_window_get_equation(MathWindow *window); -- cgit v1.2.1