| 137 |
static void text_buffer_cursor_moved_handler(); |
static void text_buffer_cursor_moved_handler(); |
| 138 |
|
|
| 139 |
/* 確認 */ |
/* 確認 */ |
|
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag); |
|
|
static void really_quit_dialog_no(GtkWidget *widget, gint *flag); |
|
| 140 |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
| 141 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer); |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer); |
| 142 |
|
|
| 664 |
static gchar *get_filename_from_dialog(const gchar *msg) { |
static gchar *get_filename_from_dialog(const gchar *msg) { |
| 665 |
|
|
| 666 |
GtkWidget *dialog = gtk_file_selection_new(msg); |
GtkWidget *dialog = gtk_file_selection_new(msg); |
| 667 |
int resp = gtk_dialog_run(GTK_DIALOG(dialog)); |
gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); |
| 668 |
gchar *filename = NULL; |
gchar *filename = NULL; |
| 669 |
|
|
| 670 |
/* gtk_file_selection_get_filename が返す文字列定数は静的に確保されたバッファを指しているので,コピーしなければならない */ |
/* gtk_file_selection_get_filename が返す文字列定数は静的に確保されたバッファを指しているので,コピーしなければならない */ |
| 709 |
g_free(filename); |
g_free(filename); |
| 710 |
} |
} |
| 711 |
|
|
|
/* YES ボタン,NO ボタンそれぞれで呼ばれる callback */ |
|
|
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag){*flag = FALSE;} |
|
|
static void really_quit_dialog_no(GtkWidget *widget, gint *flag){*flag = TRUE;} |
|
|
|
|
| 712 |
/* 本当に終了してもよろしいですか ? */ |
/* 本当に終了してもよろしいですか ? */ |
| 713 |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer) { |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer) { |
| 714 |
GtkWidget *yes_button, *no_button; |
GtkWidget *dialog; |
| 715 |
static GtkWidget *dialog_window = NULL; |
gint resp; |
| 716 |
|
|
| 717 |
/* 変更が無ければそのまま終了 */ |
/* 変更が無ければそのまま終了 */ |
| 718 |
if(!gtk_text_buffer_get_modified(buffer)) return FALSE; |
if(!gtk_text_buffer_get_modified(buffer)) return FALSE; |
| 719 |
|
|
| 720 |
if(dialog_window == NULL) { |
dialog = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW), |
| 721 |
gboolean flag = TRUE; |
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, |
| 722 |
dialog_window = gtk_dialog_new (); |
GTK_BUTTONS_YES_NO, "バッファが変更されています.\nセーブしないで終了しますか ?");; |
| 723 |
|
|
| 724 |
/* 本当に終了してもよろしいですか ? ダイアログの初期化 */ |
resp = gtk_dialog_run(GTK_DIALOG(dialog)); |
| 725 |
g_signal_connect(G_OBJECT(dialog_window), "delete_event", G_CALLBACK(gtk_false), NULL); |
gtk_widget_destroy(dialog); |
| 726 |
g_signal_connect(G_OBJECT(dialog_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
/* "delete_event" の返り値が FALSE ならば"destory" が発行され,window は破壊される */ |
| 727 |
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox), |
if(GTK_RESPONSE_YES == resp) |
| 728 |
gtk_label_new("バッファが変更されています.\nセーブしないで終了しますか ?"), TRUE, TRUE, 0); |
return FALSE; |
|
gtk_window_set_title(GTK_WINDOW (dialog_window), "Really Quit ?"); |
|
|
/* YES のボタン */ |
|
|
yes_button = gtk_button_new_with_mnemonic("はい (_Y)"); |
|
|
g_signal_connect(GTK_OBJECT(yes_button), "clicked", G_CALLBACK(really_quit_dialog_yes), &flag); |
|
|
g_signal_connect_swapped(GTK_OBJECT(yes_button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog_window)); |
|
|
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area), yes_button, TRUE, TRUE, 0); |
|
|
|
|
|
/* NO のボタン */ |
|
|
no_button = gtk_button_new_with_mnemonic("いいえ (_N)"); |
|
|
g_signal_connect(GTK_OBJECT(no_button), "clicked", G_CALLBACK(really_quit_dialog_no), &flag); |
|
|
g_signal_connect_swapped(GTK_OBJECT(no_button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog_window)); |
|
|
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area), no_button, TRUE, TRUE, 0); |
|
|
|
|
|
gtk_window_set_modal(GTK_WINDOW(dialog_window), TRUE); |
|
|
gtk_window_set_transient_for(GTK_WINDOW(dialog_window), GTK_WINDOW (Shiki_EDITOR_WINDOW)); |
|
|
|
|
|
gtk_widget_show_all(dialog_window); |
|
|
gtk_main (); |
|
|
dialog_window = NULL; |
|
|
|
|
|
/* "delete_event" の返り値が FALSE ならば"destory" が発行され,window は破壊される */ |
|
|
return flag; |
|
|
} |
|
| 729 |
return TRUE; |
return TRUE; |
| 730 |
} |
} |
| 731 |
|
|
| 732 |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
| 733 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer){ |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer){ |
| 734 |
return not_yet_save_changes_really_quit(buffer); |
return not_yet_save_changes_really_quit(buffer); |