/** * Display a message in the status bar. * * \param message Message to display. */ void gsb_status_message ( gchar * message ) { if ( ! main_statusbar || ! GTK_IS_STATUSBAR ( main_statusbar ) ) return; gsb_status_clear (); message_id = gtk_statusbar_push ( GTK_STATUSBAR (main_statusbar), context_id, message ); /* force status message to be displayed NOW */ update_gui ( ); }
void traitement_sigsegv ( gint signal_nb ) { gchar *gsb_file_default_dir; gchar *errmsg = g_strdup ( "" ); gchar *old_errmsg; gchar *tmpstr; GtkWidget * dialog; #ifdef HAVE_BACKTRACE GtkWidget * expander; #endif /* il y a 3 possibilités : */ /* soit on était en train de charger un fichier, c'est que celui-ci est corrompu */ /* soit on était en train de sauver un fichier, et là on peut rien faire */ /* sinon on essaie de sauver le fichier sous le nom entouré de # */ if ( run.is_loading || run.is_saving || !gsb_file_get_modified ( ) ) { if ( run.is_loading ) { old_errmsg = errmsg; errmsg = g_strconcat ( errmsg, _("File is corrupted."), NULL ); g_free ( old_errmsg ); } if ( run.is_saving ) { old_errmsg = errmsg; errmsg = g_strconcat ( errmsg, _("Error occured saving file."), NULL ); g_free ( old_errmsg ); } } else { /* c'est un bug pendant le fonctionnement de Grisbi s'il n'y a pas de nom de fichier, on le crée, sinon on rajoute # autour */ gsb_file_default_dir = (gchar *) my_get_gsb_file_default_dir(); if ( nom_fichier_comptes ) /* set # around the filename */ nom_fichier_comptes = g_path_get_basename (nom_fichier_comptes); else /* no name for the file, create it */ nom_fichier_comptes = g_strconcat ( gsb_file_default_dir, "/#grisbi_crash_no_name#", NULL ); gsb_status_message ( _("Save file") ); gsb_file_save_save_file ( nom_fichier_comptes, conf.compress_file, FALSE ); gsb_status_clear(); old_errmsg = errmsg; errmsg = g_strconcat ( errmsg, g_strdup_printf ( _("Grisbi made a backup file at '%s'."), nom_fichier_comptes ), NULL ); g_free ( old_errmsg ); } old_errmsg = errmsg; errmsg = g_strconcat ( errmsg, "\n\n", _("Please report this problem to <tt>http://www.grisbi.org/bugtracking/</tt>. "), NULL ); g_free ( old_errmsg ); #ifdef HAVE_BACKTRACE old_errmsg = errmsg; errmsg = g_strconcat ( errmsg, _("Copy and paste the following backtrace with your bug " "report."), NULL ); g_free ( old_errmsg ); #endif dialog = dialogue_special_no_run ( GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, make_hint ( _("Grisbi terminated due to a segmentation fault."), errmsg )); g_free ( errmsg ); #ifdef HAVE_BACKTRACE tmpstr = g_strconcat ( "<b>", _("Backtrace"), "</b>", NULL ); expander = gtk_expander_new ( tmpstr ); g_free ( tmpstr ); gtk_expander_set_use_markup ( GTK_EXPANDER ( expander ), TRUE ); gtk_container_add ( GTK_CONTAINER ( expander ), print_backtrace() ); gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG(dialog)->vbox ), expander, FALSE, FALSE, 6 ); gtk_widget_show_all ( dialog ); #endif gtk_dialog_run ( GTK_DIALOG ( dialog ) ); /* on évite le message du fichier ouvert à la prochaine ouverture */ gsb_file_util_modify_lock ( FALSE ); exit(1); }