/*****************************************************************************/ /* Klavaro - a flexible touch typing tutor */ /* Copyright (C) 2005, 2006, 2007, 2008 Felipe Castro */ /* Copyright (C) 2009, 2010, 2011 Free Software Foundation */ /* */ /* This program is free software, licensed under the terms of the GNU */ /* General Public License as published by the Free Software Foundation, */ /* either version 3 of the License, or (at your option) any later version. */ /* You should have received a copy of the GNU General Public License */ /* along with this program. If not, see . */ /*****************************************************************************/ /* * Callbacks for widgets events */ #include #include #include #include #include #include "gtkdatabox.h" #include "auxiliar.h" #include "main.h" #include "translation.h" #include "keyboard.h" #include "tutor.h" #include "cursor.h" #include "plot.h" #include "basic.h" #include "velocity.h" #include "fluidness.h" #include "accuracy.h" #include "top10.h" #include "callbacks.h" /* * Variables */ GtkClipboard *clipboard = NULL; GtkClipboard *clipboard_2 = NULL; extern gchar *KEYB_CUSTOM; extern gchar *KEYB_EDIT; extern gchar *OTHER_DEFAULT; static gboolean callbacks_shield = FALSE; static gboolean mesg_drag_drop = FALSE; static gchar *other_renaming_undo = NULL; void callbacks_shield_set (gboolean state) { callbacks_shield = state; } /********************************************************************** * 1 - Main menu commands **********************************************************************/ G_MODULE_EXPORT void on_button_intro_clicked (GtkButton *button, gpointer user_data) { keyb_mode_intro (); } G_MODULE_EXPORT void on_button_basic_clicked (GtkButton *button, gpointer user_data) { window_save ("main"); tutor_init (TT_BASIC); } G_MODULE_EXPORT void on_button_adapt_clicked (GtkButton *button, gpointer user_data) { window_save ("main"); tutor_init (TT_ADAPT); } G_MODULE_EXPORT void on_button_velo_clicked (GtkButton *button, gpointer user_data) { window_save ("main"); tutor_init (TT_VELO); } G_MODULE_EXPORT void on_button_fluid_clicked (GtkButton *button, gpointer user_data) { window_save ("main"); tutor_init (TT_FLUID); } G_MODULE_EXPORT void on_button_help_clicked (GtkButton *button, gpointer user_data) { gtk_widget_show (get_wg ("dialog_info")); } G_MODULE_EXPORT void on_button_about_clicked (GtkButton *button, gpointer user_data) { gtk_widget_show (get_wg ("aboutdialog_klavaro")); } G_MODULE_EXPORT void on_aboutdialog_klavaro_response (GtkDialog *dialog, gint response_id, gpointer user_data) { gtk_widget_hide (GTK_WIDGET (dialog)); } G_MODULE_EXPORT void on_checkbutton_speech_toggled (GtkToggleButton * togglebutton, gpointer user_data) { if (callbacks_shield) return; main_preferences_set_boolean ("interface", "speech", gtk_toggle_button_get_active (togglebutton)); } G_MODULE_EXPORT void on_combobox_language_changed (GtkComboBox *cmb, gpointer user_data) { gchar *tmp; gint active; if (callbacks_shield) return; tmp = gtk_combo_box_get_active_text (cmb); trans_change_language (tmp); g_free (tmp); callbacks_shield_set (TRUE); active = gtk_combo_box_get_active (cmb); gtk_combo_box_set_active (GTK_COMBO_BOX (get_wg ("combobox_top10_language")), active); callbacks_shield_set (FALSE); } G_MODULE_EXPORT void on_combobox_kbd_country_changed (GtkComboBox *cmb, gpointer user_data) { if (callbacks_shield) return; keyb_set_combo_kbd_variant ("combobox_kbd_country", "combobox_kbd_variant"); main_preferences_set_string ("tutor", "keyboard", keyb_get_name ()); //g_message ("kbd_country_changed: %s", keyb_get_name ()); } G_MODULE_EXPORT void on_combobox_kbd_variant_changed (GtkComboBox *cmb, gpointer user_data) { gchar *tmp; if (callbacks_shield) return; tmp = gtk_combo_box_get_active_text (cmb); if (g_str_equal (tmp, KEYB_EDIT)) keyb_mode_edit (); else { keyb_update_from_variant ("combobox_kbd_country", "combobox_kbd_variant"); main_preferences_set_string ("tutor", "keyboard", keyb_get_name ()); } g_free (tmp); //g_message ("kbd_variant_changed: %s", keyb_get_name ()); } G_MODULE_EXPORT void on_window_main_destroy (GtkObject *obj, gpointer data) { if (callbacks_shield) return; window_save ("main"); main_preferences_set_boolean ("interface", "autostart", FALSE); main_window_pass_away (); } /********************************************************************** * 2 - Little nohelp-dialog **********************************************************************/ G_MODULE_EXPORT void on_button_info_return_clicked (GtkButton *but, gpointer user_data) { gtk_widget_hide (get_wg ("dialog_info")); } /********************************************************************** * 3 - Tutor window **********************************************************************/ G_MODULE_EXPORT void on_text_tutor_realize (GtkWidget * widget, gpointer user_data) { gboolean beep; gchar *tmp; gchar *search; gchar *tmp_font; gchar *color_cursor_blink_fg; gchar *color_cursor_blink_bg; GtkWidget *wg; GtkTextBuffer *buf; PangoFontDescription *font_desc; GdkColor color; /* * Colors of text on the tutor window (note: ordering here matters, the first tag created is in the bottom!) */ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); gtk_text_buffer_create_tag (buf, "char_keep_wrap", "background", TUTOR_CREAM, "foreground", TUTOR_BLACK, "underline", PANGO_UNDERLINE_NONE, NULL); gtk_text_buffer_create_tag (buf, "char_keep_wrap2", "background", TUTOR_CREAM, "foreground", TUTOR_BLACK, "underline", PANGO_UNDERLINE_NONE, NULL); gtk_text_buffer_create_tag (buf, "char_untouched", "background", TUTOR_CREAM, "foreground", TUTOR_BLACK, "underline", PANGO_UNDERLINE_NONE, NULL); gtk_text_buffer_create_tag (buf, "char_wrong", "background", TUTOR_RED_LITE, "foreground", TUTOR_RED, "underline", PANGO_UNDERLINE_NONE, NULL); gtk_text_buffer_create_tag (buf, "char_correct", "background", TUTOR_CREAM, "foreground", TUTOR_GREEN, "underline", PANGO_UNDERLINE_NONE, NULL); gtk_text_buffer_create_tag (buf, "char_retouched", "background", TUTOR_GRAY, "foreground", TUTOR_BROWN, "underline", PANGO_UNDERLINE_NONE, NULL); color_cursor_blink_bg = main_preferences_get_string ("colors", "cursor_blink_bg"); color_cursor_blink_fg = main_preferences_get_string ("colors", "cursor_blink_fg"); if (color_cursor_blink_fg && color_cursor_blink_bg) { gtk_text_buffer_create_tag (buf, "cursor_blink", "background", color_cursor_blink_bg, "foreground", color_cursor_blink_fg, "underline", PANGO_UNDERLINE_NONE, NULL); } else { gtk_text_buffer_create_tag (buf, "cursor_blink", "background", TUTOR_YELLOW, "foreground", TUTOR_BLACK, "underline", PANGO_UNDERLINE_NONE, NULL); } if (color_cursor_blink_fg) g_free (color_cursor_blink_fg); if (color_cursor_blink_bg) g_free (color_cursor_blink_bg); gtk_text_buffer_create_tag (buf, "text_intro", "background", TUTOR_WHITE, "foreground", TUTOR_BLACK, "underline", PANGO_UNDERLINE_NONE, NULL); tmp_font = main_preferences_get_string ("tutor", "lesson_font"); if (tmp_font == NULL) { tmp_font = g_strdup (LESSON_FONT); main_preferences_set_string ("tutor", "lesson_font", tmp_font); } gtk_text_buffer_create_tag (buf, "lesson_font", "font", tmp_font, NULL); /* Change default font throughout the widget */ font_desc = pango_font_description_from_string (tmp_font); g_free (tmp_font); gtk_widget_modify_font (widget, font_desc); pango_font_description_free (font_desc); /* Change default text color throughout the widget */ gdk_color_parse (TUTOR_BLACK, &color); gtk_widget_modify_text (widget, GTK_STATE_INSENSITIVE, &color); /* Change default background color throughout the widget */ gdk_color_parse (TUTOR_CREAM, &color); gtk_widget_modify_base (widget, GTK_STATE_INSENSITIVE, &color); /* * Turns on/off the beeps according to last time */ if (main_preferences_exist ("tutor", "tutor_beep")) beep = main_preferences_get_boolean ("tutor", "tutor_beep"); else beep = TRUE; wg = get_wg ("togglebutton_tutor_beep"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wg), beep); main_preferences_set_boolean ("tutor", "tutor_beep", beep); /* * Workaround to extend the editable lessons, from 50 to 60, * avoiding to change the translatable message in the tooltip. */ tmp = gtk_widget_get_tooltip_text (get_wg ("togglebutton_edit_basic_lesson")); search = g_strstr_len (tmp, -1, "50"); if (search) search[0] = '6'; gtk_widget_set_tooltip_text (get_wg ("togglebutton_edit_basic_lesson"), tmp); g_free (tmp); } static void cb_quick_restart () { if (tutor_get_query () == QUERY_END) return; tutor_set_query (QUERY_INTRO); tutor_process_touch (L'\0'); } G_MODULE_EXPORT void on_button_tutor_other_clicked (GtkButton * button, gpointer user_data) { GtkWidget *wg; GtkListStore *list; gtk_widget_show (get_wg ("popup_other")); wg = get_wg ("treeview_other"); list = GTK_LIST_STORE ( gtk_tree_view_get_model (GTK_TREE_VIEW (wg)) ); if (tutor_get_type () == TT_VELO) tutor_load_list_other (".words", list); else if (tutor_get_type () == TT_FLUID) tutor_load_list_other (".paragraphs", list); g_free (other_renaming_undo); other_renaming_undo = g_strdup ("*"); } G_MODULE_EXPORT void on_button_tutor_stat_clicked (GtkButton * button, gpointer user_data) { gint aux; gtk_combo_box_set_active (GTK_COMBO_BOX (get_wg ("combobox_stat_module")), tutor_get_type ()); if (tutor_get_type () == TT_BASIC) { callbacks_shield_set (TRUE); aux = basic_get_lesson () - (basic_get_lesson_increased () ? 1 : 0); aux += (aux == 0) ? 1 : 0; gtk_spin_button_set_value (GTK_SPIN_BUTTON (get_wg ("spinbutton_stat_lesson")), aux); callbacks_shield_set (FALSE); } plot_draw_chart (gtk_combo_box_get_active (GTK_COMBO_BOX (get_wg ("combobox_stat_type"))) + 1); gtk_widget_show (get_wg ("window_stat")); } G_MODULE_EXPORT void on_spinbutton_lesson_value_changed (GtkSpinButton * spinbutton, gpointer user_data) { gint tmp_int; if (callbacks_shield) return; if (tutor_get_type () == TT_BASIC) { basic_set_lesson_increased (FALSE); basic_set_lesson (gtk_spin_button_get_value_as_int (spinbutton)); basic_init_char_set (); } else if (tutor_get_type () == TT_FLUID) { tmp_int = gtk_spin_button_get_value_as_int (spinbutton); main_preferences_set_int ("tutor", "fluid_paragraphs", tmp_int); } tutor_set_query (QUERY_INTRO); tutor_process_touch (L'\0'); } G_MODULE_EXPORT void on_togglebutton_edit_basic_lesson_toggled (GtkToggleButton * togglebutton, gpointer user_data) { gchar *tmp_name; GtkWidget *wg; wg = get_wg ("entry_custom_basic_lesson"); if (gtk_toggle_button_get_active (togglebutton)) { callbacks_shield_set (TRUE); gtk_widget_show (wg); gtk_widget_grab_focus (wg); tmp_name = g_ucs4_to_utf8 (basic_get_char_set (), -1, NULL, NULL, NULL); gtk_entry_set_text (GTK_ENTRY (wg), g_strstrip (tmp_name)); gtk_entry_set_position (GTK_ENTRY (wg), -1); g_free (tmp_name); gtk_widget_set_sensitive (get_wg ("spinbutton_lesson"), FALSE); gtk_label_set_text (GTK_LABEL (get_wg ("label_heading")), _("Keys:")); } else { gtk_widget_hide (wg); tmp_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (wg))); if (tutor_get_type () == TT_BASIC) { basic_save_lesson (tmp_name); basic_init_char_set (); tutor_set_query (QUERY_INTRO); tutor_process_touch (L'\0'); gtk_widget_set_sensitive (get_wg ("spinbutton_lesson"), TRUE); } g_free (tmp_name); callbacks_shield_set (FALSE); gtk_widget_grab_focus (get_wg ("entry_mesg")); } } G_MODULE_EXPORT void on_togglebutton_toomuch_errors_toggled (GtkToggleButton * togglebutton, gpointer user_data) { cb_quick_restart (); } G_MODULE_EXPORT void on_entry_custom_basic_lesson_activate (GtkEntry * entry, gpointer user_data) { GtkWidget *wg; wg = get_wg ("togglebutton_edit_basic_lesson"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wg), FALSE); } G_MODULE_EXPORT void on_button_tutor_top10_clicked (GtkButton * button, gpointer user_data) { GtkComboBox *cmb; cmb = GTK_COMBO_BOX (get_wg ("combobox_top10")); if (gtk_combo_box_get_active (cmb) == -1) gtk_combo_box_set_active (cmb, 0); top10_message (NULL); if (gtk_combo_box_get_active (GTK_COMBO_BOX (get_wg ("combobox_top10"))) == 0) top10_show_stats (LOCAL); else top10_show_stats (GLOBAL); gtk_widget_show (get_wg ("window_top10")); } G_MODULE_EXPORT void on_button_tutor_show_keyb_clicked (GtkButton * button, gpointer user_data) { if (GTK_WIDGET_VISIBLE (get_wg ("window_hints"))) window_save ("hints"); keyb_mode_hint (); } G_MODULE_EXPORT void on_button_tutor_font_clicked (gpointer user_data) { GtkWidget *wg; gchar *font; wg = get_wg ("fontselectiondialog_tutor"); font = main_preferences_get_string ("tutor", "lesson_font"); gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG (wg), font); gtk_widget_show (wg); g_free (font); } G_MODULE_EXPORT void on_fontselectiondialog_tutor_response (GtkDialog * dialog, gint response_id, gpointer user_data) { GtkWidget *wg; GtkTextBuffer *buf; GtkTextTagTable *ttab; GtkTextIter start; GtkTextIter end; gchar *tmp_font; if (response_id == GTK_RESPONSE_CANCEL) tmp_font = main_preferences_get_string ("tutor", "lesson_font"); else tmp_font = g_strdup (gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG (dialog))); if (tmp_font == NULL) tmp_font = g_strdup (LESSON_FONT); if (response_id == GTK_RESPONSE_OK) main_preferences_set_string ("tutor", "lesson_font", tmp_font); wg = get_wg ("text_tutor"); buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wg)); ttab = gtk_text_buffer_get_tag_table (buf); gtk_text_buffer_get_bounds (buf, &start, &end); gtk_text_tag_table_remove (ttab, gtk_text_tag_table_lookup (ttab, "lesson_font")); gtk_text_buffer_create_tag (buf, "lesson_font", "font", tmp_font, NULL); gtk_text_buffer_apply_tag_by_name (buf, "lesson_font", &start, &end); g_free (tmp_font); if (response_id != GTK_RESPONSE_APPLY) gtk_widget_hide (get_wg ("fontselectiondialog_tutor")); } G_MODULE_EXPORT void on_togglebutton_tutor_beep_toggled (GtkToggleButton * togglebutton, gpointer user_data) { gboolean beep; beep = gtk_toggle_button_get_active (togglebutton); main_preferences_set_boolean ("tutor", "tutor_beep", beep); } G_MODULE_EXPORT void on_togglebutton_tutor_intro_toggled (GtkToggleButton *button, gpointer user_data) { if (callbacks_shield) return; tutor_set_query (QUERY_INTRO); if (gtk_toggle_button_get_active (button)) tutor_update (); else tutor_process_touch (UPSYM); } G_MODULE_EXPORT void on_button_tutor_back_clicked (GtkButton *button, gpointer user_data) { window_save ("tutor"); if (GTK_WIDGET_VISIBLE (get_wg ("window_hints"))) window_save ("hints"); if (GTK_WIDGET_VISIBLE (get_wg ("window_top10"))) window_save ("top10"); if (GTK_WIDGET_VISIBLE (get_wg ("window_stat"))) window_save ("stat"); gtk_widget_hide (get_wg ("window_tutor")); gtk_widget_hide (get_wg ("window_hints")); gtk_widget_hide (get_wg ("window_top10")); gtk_widget_hide (get_wg ("window_stat")); gtk_widget_hide (get_wg ("filechooser_tutor")); gtk_widget_hide (get_wg ("fontselectiondialog_tutor")); gtk_widget_show (get_wg ("window_main")); } G_MODULE_EXPORT void on_window_tutor_destroy (GtkObject * object, gpointer user_data) { if (callbacks_shield) return; window_save ("tutor"); main_preferences_set_boolean ("interface", "autostart", TRUE); main_preferences_set_int ("interface", "exercise", tutor_get_type ()); callbacks_shield_set (TRUE); main_window_pass_away (); } G_MODULE_EXPORT void on_button_tutor_close_clicked (GtkButton *button, gpointer user_data) { on_window_tutor_destroy (NULL, NULL); } G_MODULE_EXPORT void on_button_tutor_restart_clicked (GtkButton * button, gpointer user_data) { cb_quick_restart (); } G_MODULE_EXPORT void on_eventbox_tutor_restart_grab_focus (GtkWidget * widget, gpointer user_data) { cb_quick_restart (); } G_MODULE_EXPORT void on_entry_mesg_icon_release (GtkEntry *entry, GtkEntryIconPosition pos, GdkEvent *event, gpointer user_data) { cb_quick_restart (); } /* Managing the keyboard/messages entry of the tutor window */ G_MODULE_EXPORT gboolean on_entry_mesg_focus_out_event (GtkWidget * widget, GdkEventFocus * event, gpointer user_data) { if (callbacks_shield) return (FALSE); gtk_widget_grab_focus (widget); return (FALSE); } G_MODULE_EXPORT void on_entry_mesg_grab_focus (GtkWidget * widget, gpointer user_data) { if (callbacks_shield) return; gtk_editable_select_region (GTK_EDITABLE (widget), 0, 0); gtk_editable_set_position (GTK_EDITABLE (widget), -1); } G_MODULE_EXPORT void on_entry_mesg_activate (GtkEntry * entry, gpointer user_data) { gchar *tmp1; gchar *tmp2; if (callbacks_shield) return; tmp1 = g_strdup (gtk_entry_get_text (entry)); tmp2 = g_strconcat (tmp1, keyb_get_utf8_paragraph_symbol (), NULL); callbacks_shield_set (TRUE); gtk_entry_set_text (entry, tmp2); callbacks_shield_set (FALSE); g_free (tmp1); g_free (tmp2); gtk_editable_set_position (GTK_EDITABLE (entry), -1); tutor_process_touch (UPSYM); } G_MODULE_EXPORT void on_entry_mesg_delete_text (GtkEditable * editable, gint start_pos, gint end_pos, gpointer user_data) { if (callbacks_shield) return; if (end_pos - start_pos == 1) tutor_process_touch (L'\b'); else tutor_process_touch (L'\t'); } G_MODULE_EXPORT void on_entry_mesg_insert_text (GtkEditable * editable, gchar * new_text, gint new_text_length, gpointer position, gpointer user_data) { gchar *test; gchar *text; if (callbacks_shield) return; if (mesg_drag_drop) { mesg_drag_drop = FALSE; callbacks_shield_set (TRUE); gtk_editable_delete_text (editable, 0, -1); callbacks_shield_set (FALSE); if (g_str_has_prefix (new_text, "file://")) test = new_text + 7; else test = new_text; if (g_file_test (test, G_FILE_TEST_IS_REGULAR)) g_file_get_contents (test, &text, NULL, NULL); else text = g_strdup (new_text); if (tutor_get_type () == TT_VELO) velo_text_write_to_file (text, TRUE); else if (tutor_get_type () == TT_FLUID) fluid_text_write_to_file (text); g_free (text); return; } tutor_process_touch (g_utf8_get_char_validated (new_text, new_text_length)); } /* Tutor drag and drop handling */ G_MODULE_EXPORT gboolean on_entry_mesg_drag_drop (GtkWidget * widget, GdkDragContext * drag_context, gint x, gint y, guint time, gpointer user_data) { callbacks_shield_set (TRUE); gtk_entry_set_text (GTK_ENTRY (widget), ""); callbacks_shield_set (FALSE); mesg_drag_drop = TRUE; return FALSE; } /********************************************************************** * 4 - Top 10 management **********************************************************************/ G_MODULE_EXPORT void on_combobox_top10_changed (GtkComboBox *cmb, gpointer user_data) { if (callbacks_shield) return; top10_message (NULL); if (gtk_combo_box_get_active (cmb) == 0) top10_show_stats (LOCAL); else top10_show_stats (GLOBAL); } G_MODULE_EXPORT void on_combobox_top10_language_changed (GtkComboBox *cmb, gpointer user_data) { gchar *tmp; gint active; if (callbacks_shield) return; tmp = gtk_combo_box_get_active_text (cmb); trans_change_language (tmp); g_free (tmp); callbacks_shield_set (TRUE); active = gtk_combo_box_get_active (cmb); gtk_combo_box_set_active (GTK_COMBO_BOX (get_wg ("combobox_language")), active); callbacks_shield_set (FALSE); if (tutor_get_type () == TT_FLUID) tutor_init (tutor_get_type ()); on_combobox_top10_changed (GTK_COMBO_BOX (get_wg ("combobox_top10_language")), NULL); } G_MODULE_EXPORT void on_button_top10_go_www_clicked (GtkButton *button, gpointer user_data) { gchar *url; gchar *cmd; url = gtk_widget_get_tooltip_text (get_wg ("button_top10_go_www")); if (g_file_test ("/usr/bin/x-www-browser", G_FILE_TEST_IS_EXECUTABLE)) cmd = g_strdup_printf ("x-www-browser '%s' &", url); else if (g_file_test ("/usr/bin/gnome-www-browser", G_FILE_TEST_IS_EXECUTABLE)) cmd = g_strdup_printf ("gnome-www-browser '%s' &", url); else if (g_file_test ("/usr/bin/konqueror", G_FILE_TEST_IS_EXECUTABLE)) cmd = g_strdup_printf ("konqueror '%s' &", url); else if (g_file_test ("/usr/bin/firefox", G_FILE_TEST_IS_EXECUTABLE)) cmd = g_strdup_printf ("firefox '%s' &", url); else if (g_file_test ("/usr/bin/epiphany", G_FILE_TEST_IS_EXECUTABLE)) cmd = g_strdup_printf ("epiphany '%s' &", url); else if (g_file_test ("/usr/bin/galeon", G_FILE_TEST_IS_EXECUTABLE)) cmd = g_strdup_printf ("galeon '%s' &", url); else cmd = g_strdup_printf ("sensible-browser '%s' &", url); top10_message (cmd); g_printf ("Performing:\n %s\n", cmd); system (cmd); g_free (url); g_free (cmd); } G_MODULE_EXPORT void on_button_top10_publish_clicked (GtkButton * button, gpointer user_data) { GtkWidget *wg; top10_message (NULL); main_preferences_save (); wg = get_wg ("image_top10_publish"); gtk_image_set_from_stock (GTK_IMAGE (wg), "gtk-yes", GTK_ICON_SIZE_BUTTON); top10_message (_("Connecting...")); g_idle_add ((GSourceFunc) top10_global_publish, NULL); } G_MODULE_EXPORT void on_button_top10_update_clicked (GtkButton * button, gpointer user_data) { GtkWidget *wg; top10_message (NULL); main_preferences_save (); wg = get_wg ("image_top10_update"); gtk_image_set_from_stock (GTK_IMAGE (wg), "gtk-yes", GTK_ICON_SIZE_BUTTON); top10_message (_("Connecting...")); g_idle_add ((GSourceFunc) top10_global_update, NULL); } G_MODULE_EXPORT void on_button_top10_expand_clicked (GtkButton * button, gpointer user_data) { gtk_widget_hide (GTK_WIDGET (button)); gtk_widget_show (get_wg ("button_top10_noexpand")); gtk_widget_show (get_wg ("scrolledwindow_top10_2")); gtk_widget_set_size_request (get_wg ("window_top10"), 630, 400); } G_MODULE_EXPORT void on_button_top10_noexpand_clicked (GtkButton * button, gpointer user_data) { gtk_widget_hide (get_wg ("scrolledwindow_top10_2")); gtk_widget_show (get_wg ("button_top10_expand")); gtk_widget_hide (GTK_WIDGET (button)); gtk_widget_set_size_request (get_wg ("window_top10"), 350, 400); } G_MODULE_EXPORT void on_button_top10_close_clicked (GtkButton * button, gpointer user_data) { top10_message (NULL); window_save ("top10"); gtk_widget_hide (get_wg ("window_top10")); } /********************************************************************** * 5 - Keyboard window **********************************************************************/ G_MODULE_EXPORT void on_combobox_keyboard_country_changed (GtkComboBox *cmb, gpointer user_data) { gchar *tmp; if (callbacks_shield) return; keyb_set_combo_kbd_variant ("combobox_keyboard_country", "combobox_keyboard_variant"); tmp = gtk_combo_box_get_active_text (cmb); if (g_str_equal (tmp, KEYB_CUSTOM) && gtk_combo_box_get_active ( GTK_COMBO_BOX (get_wg ("combobox_keyboard_variant")) ) > -1 ) { gtk_widget_set_sensitive (get_wg ("button_kb_remove"), TRUE); } else gtk_widget_set_sensitive (get_wg ("button_kb_remove"), FALSE); g_free (tmp); } G_MODULE_EXPORT void on_combobox_keyboard_variant_changed (GtkComboBox *cmb, gpointer user_data) { gchar *tmp; if (callbacks_shield) return; keyb_update_from_variant ("combobox_keyboard_country", "combobox_keyboard_variant"); tmp = gtk_combo_box_get_active_text (GTK_COMBO_BOX (get_wg ("combobox_keyboard_country"))); if (g_str_equal (tmp, KEYB_CUSTOM) && gtk_combo_box_get_active (cmb) > -1 ) gtk_widget_set_sensitive (get_wg ("button_kb_remove"), TRUE); else gtk_widget_set_sensitive (get_wg ("button_kb_remove"), FALSE); g_free (tmp); } G_MODULE_EXPORT void on_button_kb_remove_clicked (GtkButton * button, gpointer user_data) { gchar *tmp_path = NULL; tmp_path = g_strconcat (main_path_user (), G_DIR_SEPARATOR_S, keyb_get_name (), ".kbd", NULL); if (! g_file_test (tmp_path, G_FILE_TEST_IS_REGULAR)) { gdk_beep (); g_message ("no valid keyboard to remove..."); g_free (tmp_path); return; } g_free (tmp_path); gtk_label_set_text (GTK_LABEL (get_wg ("label_confirm_action")), "REMOVE"); gtk_widget_show (get_wg ("dialog_confirm")); } G_MODULE_EXPORT void on_button_kb_save_clicked (GtkButton * button, gpointer user_data) { gchar *tmp; gchar *tmp_path; tmp = gtk_editable_get_chars (GTK_EDITABLE (get_wg ("entry_keyboard")), 0, -1); if (strlen (tmp) == 0) { g_free (tmp); tmp = g_strdup (KEYB_AUTO_SAVE); } tmp_path = g_strconcat (main_path_user (), G_DIR_SEPARATOR_S, tmp, ".kbd", NULL); keyb_set_name (tmp); g_free (tmp); gtk_label_set (GTK_LABEL (get_wg ("label_confirm_action")), "OVERWRITE"); if (g_file_test (tmp_path, G_FILE_TEST_IS_REGULAR)) gtk_widget_show (get_wg ("dialog_confirm")); else on_button_confirm_yes_clicked (GTK_BUTTON (get_wg ("button_confirm_yes")), NULL); g_free (tmp_path); } G_MODULE_EXPORT void on_button_keyboard_previous_clicked (GtkButton *but, gpointer user_data) { keyb_intro_step_previous (); } G_MODULE_EXPORT void on_button_keyboard_next_clicked (GtkButton *but, gpointer user_data) { keyb_intro_step_next (); } G_MODULE_EXPORT void on_button_keyboard_close_clicked (GtkButton *but, gpointer user_data) { hints_demo_fingers (0); gtk_widget_hide (get_wg ("window_keyboard")); } G_MODULE_EXPORT void on_button_keyboard_hands_clicked (GtkButton *but, gpointer user_data) { if (GTK_WIDGET_VISIBLE (get_wg ("window_tutor"))) if (GTK_WIDGET_VISIBLE (get_wg ("hbox_keyboard_hints"))) { gtk_widget_show (get_wg ("window_hints")); hints_update_from_char (cursor_get_char ()); } hints_demo_fingers (0); gtk_widget_hide (get_wg ("window_keyboard")); } G_MODULE_EXPORT void on_button_keyboard_cancel_clicked (GtkButton * button, gpointer user_data) { gchar *tmp; tmp = main_preferences_get_string ("tutor", "keyboard"); keyb_set_name (tmp); keyb_set_chars (); keyb_update_combos ("combobox_kbd_country", "combobox_kbd_variant"); gtk_widget_hide (get_wg ("window_keyboard")); g_free (tmp); } /* Editing the keyboard. */ G_MODULE_EXPORT void on_toggle_shift1_toggled (GtkToggleButton * togglebutton, gpointer user_data) { gboolean tog_state; GtkWidget *tog; tog = get_wg ("toggle_shift2"); tog_state = gtk_toggle_button_get_active (togglebutton); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tog), tog_state); keyb_update_virtual_layout (); keyb_edit_none (); if (GTK_WIDGET_VISIBLE (get_wg ("hbox_keyboard_hints"))) hints_update_from_button (GTK_BUTTON (togglebutton)); } G_MODULE_EXPORT void on_toggle_shift2_toggled (GtkToggleButton * togglebutton, gpointer user_data) { gboolean tog_state; GtkWidget *tog; tog = get_wg ("toggle_shift1"); tog_state = gtk_toggle_button_get_active (togglebutton); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tog), tog_state); keyb_update_virtual_layout (); keyb_edit_none (); if (GTK_WIDGET_VISIBLE (get_wg ("hbox_keyboard_hints"))) hints_update_from_button (GTK_BUTTON (togglebutton)); } G_MODULE_EXPORT void on_toggle_shift1_grab_focus (GtkToggleButton *tg, gpointer user_data) { if (callbacks_shield) return; keyb_edit_none (); } G_MODULE_EXPORT void on_toggle_shift2_grab_focus (GtkToggleButton *tg, gpointer user_data) { if (callbacks_shield) return; keyb_edit_none (); } /* All the other keys */ G_MODULE_EXPORT void on_virtual_key_grab_focus (GtkWidget *wg, gpointer user_data) { if (callbacks_shield) return; if ( GTK_WIDGET_VISIBLE (get_wg ("hbox_keyboard_hints")) ) hints_update_from_button (GTK_BUTTON (wg)); else keyb_edit_button (GTK_BUTTON (wg)); } G_MODULE_EXPORT void on_virtual_key_clicked (GtkButton * button, gpointer user_data) { if (callbacks_shield) return; if ( GTK_WIDGET_VISIBLE (get_wg ("hbox_keyboard_hints")) ) hints_update_from_button (button); else keyb_edit_button (button); } G_MODULE_EXPORT void on_virtual_key_changed (GtkEditable *edit, gpointer user_data) { gunichar ch; if (callbacks_shield) return; ch = g_utf8_get_char_validated (gtk_entry_get_text (GTK_ENTRY (edit)), -1); if (ch == (gunichar)-2 || ch == (gunichar)-1 || ch == 0) ch = L' '; keyb_change_key (ch); } /* Confirm-dialog shared tasks */ G_MODULE_EXPORT void on_dialog_confirm_show (GtkWidget * widget, gpointer user_data) { gchar *action; gchar *msg; GtkLabel *wg_label; wg_label = GTK_LABEL (get_wg ("label_confirm_action")); action = (gchar *) gtk_label_get_text (wg_label); wg_label = GTK_LABEL (get_wg ("label_confirm")); if (g_str_equal (action, "OVERWRITE")) { gtk_window_set_title (GTK_WINDOW (widget), _("Overwrite user layout")); msg = g_strdup_printf ("%s\n\n %s", _("This will OVERWRITE an existent keyboard layout."), keyb_get_name ()); gtk_label_set_text (wg_label, msg); g_free (msg); } else if (g_str_equal (action, "REMOVE")) { gtk_window_set_title (GTK_WINDOW (widget), _("Remove user layout")); msg = g_strdup_printf ("%s\n\n %s", _("This will REMOVE an existent keyboard layout."), keyb_get_name ()); gtk_label_set_text (wg_label, msg); g_free (msg); } else if (g_str_equal (action, "RESET")) { gtk_window_set_title (GTK_WINDOW (widget), _("Reset progress data")); gtk_label_set_text (wg_label, _("This will DELETE all the progress data shown in the charts.")); } else { g_warning ("No valid action for this confirm-dialog: %s", action); gtk_widget_hide (widget); } } G_MODULE_EXPORT void on_button_confirm_yes_clicked (GtkButton * button, gpointer user_data) { gchar *file; gchar *action; GtkWidget *wg; wg = get_wg ("label_confirm_action"); action = (gchar *) gtk_label_get_text (GTK_LABEL (wg)); if (g_str_equal (action, "OVERWRITE")) { keyb_save_new_layout (); keyb_set_keyboard_layouts (); keyb_update_combos ("combobox_kbd_country", "combobox_kbd_variant"); gtk_widget_hide (get_wg ("window_keyboard")); } else if (g_str_equal (action, "REMOVE")) { keyb_remove_user_layout (); } else if (g_str_equal (action, "RESET")) { file = g_build_filename (main_path_stats (), "stat_basic.txt", NULL); g_unlink (file); g_free (file); file = g_build_filename (main_path_stats (), "stat_adapt.txt", NULL); g_unlink (file); g_free (file); file = g_build_filename (main_path_stats (), "stat_velo.txt", NULL); g_unlink (file); g_free (file); file = g_build_filename (main_path_stats (), "stat_fluid.txt", NULL); g_unlink (file); g_free (file); file = g_build_filename (main_path_stats (), "scores_fluid.txt", NULL); g_unlink (file); g_free (file); accur_reset (); basic_set_lesson (1); on_combobox_stat_type_changed (NULL, NULL); } else g_warning ("No valid action selected for 'yes' confirm-button: %s", action); gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET (button))); } G_MODULE_EXPORT void on_button_confirm_no_clicked (GtkButton * button, gpointer user_data) { gchar *action; GtkWidget *wg; wg = get_wg ("label_confirm_action"); action = (gchar *) gtk_label_get_text (GTK_LABEL (wg)); if (g_str_equal (action, "OVERWRITE")) g_printf ("Not overwriting file %s.kbd\n", keyb_get_name ()); else if (g_str_equal (action, "REMOVE")) g_printf ("Not removing file %s.kbd\n", keyb_get_name ()); gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET (button))); } /******************************************************************************* * Window hints management */ G_MODULE_EXPORT void on_window_hints_check_resize (GtkContainer *cont, gpointer user_data) { static int i; static GTimer *wait = NULL; gint dx, dy; //if (callbacks_shield) return; if (wait == NULL) wait = g_timer_new (); if (g_timer_elapsed (wait, NULL) > 0.2) { g_timer_start (wait); gtk_window_get_size (get_win ("window_hints"), &dx, &dy); g_printf ("hints_check_resize: %04i x %04i (%i)\n", dx, dy, i++); } } G_MODULE_EXPORT void on_button_hints_close_clicked (GtkButton *but, gpointer user_data) { window_save ("hints"); gtk_widget_hide (get_wg ("window_hints")); } /********************************************************************** * 6 - Charts window **********************************************************************/ G_MODULE_EXPORT void on_combobox_stat_module_changed (GtkComboBox *cmb, gpointer user_data) { static gboolean init = TRUE; gint i; gchar *tmp; if (callbacks_shield == TRUE) return; if (gtk_combo_box_get_active (cmb) < 0) return; if (init) { plot_initialize (); init = FALSE; } tutor_init (gtk_combo_box_get_active (cmb)); callbacks_shield_set (TRUE); for (i = 0; i < 4; i++) gtk_combo_box_remove_text (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 0); tmp = g_strdup_printf ("%s (%%)", _("Accuracy")); gtk_combo_box_insert_text (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 0, tmp); g_free (tmp); tmp = g_strdup_printf ("%s %s", _("Speed"), _("(WPM)")); gtk_combo_box_insert_text (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 1, tmp); g_free (tmp); switch (gtk_combo_box_get_active (cmb)) { /* Uncomment this in order to enable the error plottings */ case 1: tmp = g_strdup_printf ("%s", _("Errors")); gtk_combo_box_insert_text (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 2, tmp); g_free (tmp); break; case 3: tmp = g_strdup_printf ("%s (%%)", _("Fluidity")); gtk_combo_box_insert_text (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 2, tmp); g_free (tmp); tmp = g_strdup_printf ("%s (0-10)", _("Score")); gtk_combo_box_insert_text (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 3, tmp); g_free (tmp); break; } gtk_combo_box_set_active (GTK_COMBO_BOX (get_wg ("combobox_stat_type")), 0); callbacks_shield_set (FALSE); plot_draw_chart (1); } G_MODULE_EXPORT void on_combobox_stat_type_changed (GtkComboBox *cmb, gpointer user_data) { static gboolean init = TRUE; gint active; if (callbacks_shield == TRUE) return; if (init) { plot_initialize (); init = FALSE; } active = gtk_combo_box_get_active ( GTK_COMBO_BOX (get_wg ("combobox_stat_type")) ); if (active < 0) return; if (gtk_combo_box_get_active (GTK_COMBO_BOX (get_wg ("combobox_stat_module"))) == 1 && active == 2) plot_draw_chart (6); else plot_draw_chart (active + 1); } G_MODULE_EXPORT void on_spinbutton_stat_lesson_value_changed (GtkSpinButton * spinbutton, gpointer user_data) { if (callbacks_shield) return; plot_draw_chart (gtk_combo_box_get_active (GTK_COMBO_BOX (get_wg ("combobox_stat_type"))) + 1); } G_MODULE_EXPORT void on_button_stat_reset_clicked (GtkButton * button, gpointer user_data) { gtk_label_set_text (GTK_LABEL (get_wg ("label_confirm_action")), "RESET"); gtk_widget_show (get_wg ("dialog_confirm")); } G_MODULE_EXPORT void on_button_stat_close_clicked (GtkButton * button, gpointer user_data) { callbacks_shield_set (TRUE); gtk_combo_box_set_active (GTK_COMBO_BOX ( get_wg ("combobox_stat_type")), 0 ); callbacks_shield_set (FALSE); window_save ("stat"); gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET (button))); } G_MODULE_EXPORT void on_databox_hovered (GtkDatabox *dbox, GdkEventMotion *event, gpointer user_data) { plot_pointer_update (event->x); } /********************************************************************** * 7 - Other texts popup **********************************************************************/ G_MODULE_EXPORT void on_treeview_other_realize (GtkWidget * widget, gpointer user_data) { GtkListStore *list; GtkCellRenderer *renderer; GtkTreeViewColumn *column; list = gtk_list_store_new (1, G_TYPE_STRING); gtk_tree_view_set_model (GTK_TREE_VIEW (widget), GTK_TREE_MODEL (list)); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (":-)", renderer, "text", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column); } G_MODULE_EXPORT void on_button_other_new_clicked (GtkButton * button, gpointer user_data) { gtk_widget_show (GTK_WIDGET (get_wg ("filechooser_tutor"))); } G_MODULE_EXPORT void on_button_other_cancel_clicked (GtkButton * button, gpointer user_data) { g_free (other_renaming_undo); other_renaming_undo = g_strdup ("*"); gtk_widget_hide (get_wg ("popup_other")); } G_MODULE_EXPORT void on_button_other_apply_clicked (GtkButton *button, gpointer user_data) { gchar *tmp_name; GtkTreeSelection *sel; GtkTreeModel *store; GtkTreeIter iter; gtk_widget_hide (get_wg ("popup_other")); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (get_wg ("treeview_other"))); if (gtk_tree_selection_get_selected (sel, &store, &iter) == FALSE) { tutor_set_query (QUERY_INTRO); tutor_process_touch ('\0'); return; } tutor_other_rename (gtk_entry_get_text (GTK_ENTRY (get_wg ("entry_other_rename"))), other_renaming_undo); g_free (other_renaming_undo); other_renaming_undo = g_strdup ("*"); gtk_tree_model_get (store, &iter, 0, &tmp_name, -1); if (tutor_get_type () == TT_VELO) velo_init_dict (tmp_name); else if (tutor_get_type () == TT_FLUID) fluid_init_paragraph_list (tmp_name); tutor_set_query (QUERY_INTRO); tutor_process_touch ('\0'); } G_MODULE_EXPORT void on_button_other_paste_clicked (GtkButton * button, gpointer user_data) { gchar *text; GtkWidget *wg; GtkListStore *list; if (clipboard == NULL) clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); if (clipboard_2 == NULL) clipboard_2 = gtk_clipboard_get (GDK_SELECTION_PRIMARY); text = gtk_clipboard_wait_for_text (clipboard); if (text == NULL) text = gtk_clipboard_wait_for_text (clipboard_2); if (text == NULL) { gdk_beep (); g_message ("No text in the Clipboard"); return; } wg = get_wg ("treeview_other"); list = GTK_LIST_STORE ( gtk_tree_view_get_model (GTK_TREE_VIEW (wg)) ); if (tutor_get_type () == TT_VELO) { velo_text_write_to_file (text, TRUE); tutor_load_list_other (".words", list); } else if (tutor_get_type () == TT_FLUID) { fluid_text_write_to_file (text); tutor_load_list_other (".paragraphs", list); } g_free (text); g_free (other_renaming_undo); other_renaming_undo = g_strdup ("*"); gtk_widget_hide (get_wg ("popup_other")); } G_MODULE_EXPORT void on_button_other_remove_clicked (GtkButton * button, gpointer user_data) { gchar *tmp_str; gchar *tmp_name; GtkTreeSelection *sel; GtkTreeModel *store; GtkTreeIter iter; sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (get_wg ("treeview_other"))); if (gtk_tree_selection_get_selected (sel, &store, &iter) == FALSE) { gdk_beep (); return; } gtk_tree_model_get (store, &iter, 0, &tmp_str, -1); if (g_str_equal (tmp_str, OTHER_DEFAULT)) { gdk_beep (); g_free (tmp_str); return; } tmp_name = g_build_filename (main_path_user (), tmp_str, NULL); g_free (tmp_str); if (tutor_get_type () == TT_VELO) tmp_str = g_strconcat (tmp_name, ".words", NULL); else if (tutor_get_type () == TT_FLUID) tmp_str = g_strconcat (tmp_name, ".paragraphs", NULL); g_unlink (tmp_str); g_free (tmp_str); g_free (tmp_name); gtk_list_store_remove (GTK_LIST_STORE (store), &iter); gtk_widget_set_sensitive (get_wg ("button_other_remove"), FALSE); gtk_widget_set_sensitive (get_wg ("label_other_rename"), FALSE); gtk_widget_set_sensitive (get_wg ("entry_other_rename"), FALSE); } G_MODULE_EXPORT void on_entry_other_rename_changed (GtkEditable *editable, gint start_pos, gint end_pos, gpointer user_data) { gchar *str; GtkTreeSelection *sel; GtkTreeModel *store; GtkTreeIter iter; if (callbacks_shield) return; sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (get_wg ("treeview_other"))); if (gtk_tree_selection_get_selected (sel, &store, &iter) == FALSE) { gtk_widget_set_sensitive (get_wg ("label_other_rename"), FALSE); gtk_widget_set_sensitive (get_wg ("entry_other_rename"), FALSE); return; } str = (gchar*) gtk_entry_get_text (GTK_ENTRY (get_wg ("entry_other_rename"))); if (strlen (str) > 0) gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, str, -1); else gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, other_renaming_undo, -1); } G_MODULE_EXPORT void on_entry_other_rename_activate (GtkEntry *entry, gpointer user_data) { on_button_other_apply_clicked (NULL, NULL); } G_MODULE_EXPORT void on_treeview_other_cursor_changed (GtkTreeView *treeview, gpointer user_data) { gchar *tmp_str; GtkTreeSelection *sel; GtkTreeModel *store; GtkTreeIter iter; GtkEntry *entry; sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (get_wg ("treeview_other"))); if (gtk_tree_selection_get_selected (sel, &store, &iter) == FALSE) { gtk_widget_set_sensitive (get_wg ("button_other_apply"), FALSE); return; } gtk_widget_set_sensitive (get_wg ("button_other_apply"), TRUE); entry = GTK_ENTRY (get_wg ("entry_other_rename")); if (other_renaming_undo == NULL) other_renaming_undo = g_strdup ("*"); else tutor_other_rename (gtk_entry_get_text (entry), other_renaming_undo); callbacks_shield_set (TRUE); g_free (other_renaming_undo); gtk_tree_model_get (store, &iter, 0, &tmp_str, -1); if (g_str_equal (tmp_str, OTHER_DEFAULT)) { gtk_entry_set_text (entry, ""); gtk_widget_set_sensitive (get_wg ("button_other_remove"), FALSE); gtk_widget_set_sensitive (get_wg ("label_other_rename"), FALSE); gtk_widget_set_sensitive (get_wg ("entry_other_rename"), FALSE); other_renaming_undo = g_strdup ("*"); } else { gtk_widget_set_sensitive (get_wg ("button_other_remove"), TRUE); gtk_widget_set_sensitive (get_wg ("label_other_rename"), TRUE); gtk_widget_set_sensitive (get_wg ("entry_other_rename"), TRUE); gtk_entry_set_text (entry, tmp_str); other_renaming_undo = g_strdup (tmp_str); } callbacks_shield_set (FALSE); } G_MODULE_EXPORT void on_treeview_other_row_activated (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { on_button_other_apply_clicked (NULL, NULL); } G_MODULE_EXPORT void on_button_filechooser_open_clicked (GtkButton *button, gpointer user_data) { gchar *tmp_path; GtkWidget *wg; GtkListStore *list; tmp_path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (get_wg ("filechooser_tutor"))); if (tutor_get_type () == TT_VELO) velo_create_dict (tmp_path, TRUE); else if (tutor_get_type () == TT_FLUID) fluid_copy_text_file (tmp_path); g_free (tmp_path); wg = get_wg ("treeview_other"); list = GTK_LIST_STORE ( gtk_tree_view_get_model (GTK_TREE_VIEW (wg)) ); if (tutor_get_type () == TT_VELO) tutor_load_list_other (".words", list); else if (tutor_get_type () == TT_FLUID) tutor_load_list_other (".paragraphs", list); g_free (other_renaming_undo); other_renaming_undo = g_strdup ("*"); gtk_widget_hide (get_wg ("popup_other")); gtk_widget_hide (get_wg ("filechooser_tutor")); } G_MODULE_EXPORT void on_button_filechooser_cancel_clicked (GtkButton *button, gpointer user_data) { gtk_widget_hide (get_wg ("filechooser_tutor")); } /********************************************************************** * 8 - Mangling with the windows positions **********************************************************************/ G_MODULE_EXPORT void on_window_main_show (GtkWidget *wg, gpointer user_data) { window_restore ("main"); } G_MODULE_EXPORT void on_window_tutor_show (GtkWidget *wg, gpointer user_data) { window_restore ("tutor"); } G_MODULE_EXPORT void on_window_hints_show (GtkWidget *wg, gpointer user_data) { window_restore ("hints"); } G_MODULE_EXPORT void on_window_top10_show (GtkWidget *wg, gpointer user_data) { window_restore ("top10"); } G_MODULE_EXPORT void on_window_stat_show (GtkWidget *wg, gpointer user_data) { window_restore ("stat"); } void window_restore (gchar *who) { gint x, y; gchar *str; str = g_strconcat (who, "_X", NULL); if (main_preferences_exist ("windows", str)) x = main_preferences_get_int ("windows", str); else { g_free (str); return; } g_free (str); str = g_strconcat (who, "_Y", NULL); if (main_preferences_exist ("windows", str)) y = main_preferences_get_int ("windows", str); else { g_free (str); return; } g_free (str); str = g_strconcat ("window_", who, NULL); gtk_window_move (get_win (str), x, y); g_free (str); } void window_save (gchar *who) { gint x, y; gchar *str; str = g_strconcat ("window_", who, NULL); gtk_window_get_position (get_win (str), &x, &y); g_free (str); str = g_strconcat (who, "_X", NULL); main_preferences_set_int ("windows", str, x); g_free (str); str = g_strconcat (who, "_Y", NULL); main_preferences_set_int ("windows", str, y); g_free (str); }