| 38 |
static GtkTextView *current_text_view; |
static GtkTextView *current_text_view; |
| 39 |
static GtkTextBuffer *current_text_buffer; |
static GtkTextBuffer *current_text_buffer; |
| 40 |
|
|
| 41 |
|
static GtkWidget *statusbar; |
| 42 |
|
|
| 43 |
/* テキストバッファから全ての文字列を取り出す */ |
/* テキストバッファから全ての文字列を取り出す */ |
| 44 |
static gchar* get_all_buffer_contents(GtkTextBuffer *buffer) { |
static gchar* get_all_buffer_contents(GtkTextBuffer *buffer) { |
| 143 |
gtk_label_new("バッファが変更されています.\nセーブしないで終了しますか ?"), TRUE, TRUE, 0); |
gtk_label_new("バッファが変更されています.\nセーブしないで終了しますか ?"), TRUE, TRUE, 0); |
| 144 |
gtk_window_set_title(GTK_WINDOW (dialog_window), "Really Quit ?"); |
gtk_window_set_title(GTK_WINDOW (dialog_window), "Really Quit ?"); |
| 145 |
/* YES のボタン */ |
/* YES のボタン */ |
| 146 |
yes_button = gtk_button_new_with_label("はい (Y)"); |
yes_button = gtk_button_new_with_mnemonic("はい (_Y)"); |
| 147 |
g_signal_connect(GTK_OBJECT(yes_button), "clicked", G_CALLBACK(really_quit_dialog_yes), &flag); |
g_signal_connect(GTK_OBJECT(yes_button), "clicked", G_CALLBACK(really_quit_dialog_yes), &flag); |
| 148 |
g_signal_connect_swapped(GTK_OBJECT(yes_button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog_window)); |
g_signal_connect_swapped(GTK_OBJECT(yes_button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog_window)); |
| 149 |
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area), yes_button, TRUE, TRUE, 0); |
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area), yes_button, TRUE, TRUE, 0); |
| 150 |
|
|
| 151 |
/* NO のボタン */ |
/* NO のボタン */ |
| 152 |
no_button = gtk_button_new_with_label("いいえ (N)"); |
no_button = gtk_button_new_with_mnemonic("いいえ (_N)"); |
| 153 |
g_signal_connect(GTK_OBJECT(no_button), "clicked", G_CALLBACK(really_quit_dialog_no), &flag); |
g_signal_connect(GTK_OBJECT(no_button), "clicked", G_CALLBACK(really_quit_dialog_no), &flag); |
| 154 |
g_signal_connect_swapped(GTK_OBJECT(no_button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog_window)); |
g_signal_connect_swapped(GTK_OBJECT(no_button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog_window)); |
| 155 |
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area), no_button, TRUE, TRUE, 0); |
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area), no_button, TRUE, TRUE, 0); |
| 413 |
} |
} |
| 414 |
|
|
| 415 |
/* キーが押された */ |
/* キーが押された */ |
| 416 |
static gboolean signal_key_press_handler (GtkWidget *notebook, GdkEventKey *event, gpointer p) { |
static gboolean signal_key_press_handler (GtkWidget *notebook, GdkEventKey *event, gpointer contextid) { |
| 417 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 418 |
|
|
| 419 |
/* 括弧の対応の強調を無効に */ |
/* 括弧の対応の強調を無効に */ |
| 472 |
} |
} |
| 473 |
|
|
| 474 |
/* キーが離された */ |
/* キーが離された */ |
| 475 |
static gboolean signal_key_release_handler (GtkWidget *notebook, GdkEventKey *event, gpointer p) { |
static gboolean signal_key_release_handler (GtkWidget *notebook, GdkEventKey *event, gpointer contextid) { |
| 476 |
//static gint metakey_pressed = 0; |
static gint metakey_pressed = 0; |
| 477 |
static gint controlx_pressed = 0; |
static gint controlx_pressed = 0; |
| 478 |
|
|
| 479 |
if(event->keyval == GDK_parenright && event->state & GDK_SHIFT_MASK) { |
if(event->keyval == GDK_parenright && event->state & GDK_SHIFT_MASK) { |
| 502 |
/* C-x */ |
/* C-x */ |
| 503 |
if(event->keyval == GDK_x && event->state & GDK_CONTROL_MASK) { |
if(event->keyval == GDK_x && event->state & GDK_CONTROL_MASK) { |
| 504 |
controlx_pressed++; |
controlx_pressed++; |
| 505 |
g_print("C-x "); |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-x -"); |
| 506 |
} else if(event->state & GDK_CONTROL_MASK) { |
} else if(event->state & GDK_CONTROL_MASK) { |
| 507 |
|
|
| 508 |
if(controlx_pressed > 0) { |
if(controlx_pressed > 0) { |
| 509 |
switch(event->keyval) { |
switch(event->keyval) { |
| 510 |
case GDK_c :/* C-x C-c : 終了 */ |
case GDK_c :/* C-x C-c : 終了 */ |
| 511 |
g_print("C-c\n"); |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-c"); |
| 512 |
{/* "delete-event" を発生させる.ウィンドウの × ボタンが押されたのと同じ */ |
{/* "delete-event" を発生させる.ウィンドウの × ボタンが押されたのと同じ */ |
| 513 |
GdkEvent ev; |
GdkEvent ev; |
| 514 |
|
|
| 520 |
break; |
break; |
| 521 |
|
|
| 522 |
case GDK_f : /* C-x C-f : ファイル開く */ |
case GDK_f : /* C-x C-f : ファイル開く */ |
| 523 |
g_print("C-f\n"); |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-f"); |
| 524 |
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
| 525 |
break; |
break; |
| 526 |
|
|
| 527 |
case GDK_s : /* C-x C-s : ファイル保存 */ |
case GDK_s : /* C-x C-s : ファイル保存 */ |
| 528 |
g_print("C-s\n"); |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-s"); |
| 529 |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
| 530 |
break; |
break; |
| 531 |
|
|
| 532 |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
| 533 |
g_print("C-w\n"); |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-w"); |
| 534 |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
| 535 |
break; |
break; |
| 536 |
} |
} |
| 537 |
controlx_pressed = 0; |
controlx_pressed = 0; |
| 538 |
} |
} |
| 539 |
|
|
| 540 |
|
switch(event->keyval) { |
| 541 |
|
case GDK_g :/* C-g : キャンセル */ |
| 542 |
|
metakey_pressed = 0; |
| 543 |
|
controlx_pressed = 0; |
| 544 |
|
|
| 545 |
|
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "Quit"); |
| 546 |
|
break; |
| 547 |
|
} |
| 548 |
|
|
| 549 |
} |
} |
| 550 |
return FALSE; |
return FALSE; |
| 551 |
} |
} |
| 559 |
/* 「開く」「保存」「別名保存」「選択領域を実行」アイコン */ |
/* 「開く」「保存」「別名保存」「選択領域を実行」アイコン */ |
| 560 |
GtkToolItem *oicon, *sicon, *saicon, *eicon; |
GtkToolItem *oicon, *sicon, *saicon, *eicon; |
| 561 |
|
|
| 562 |
|
gint contextid; |
| 563 |
|
|
| 564 |
/* 窓を作る */ |
/* 窓を作る */ |
| 565 |
editor_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
editor_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 566 |
g_signal_connect(G_OBJECT(editor_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
g_signal_connect(G_OBJECT(editor_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
| 612 |
gtk_tool_item_set_tooltip(eicon, toolbar_tips, "選択範囲の S 式を評価します", |
gtk_tool_item_set_tooltip(eicon, toolbar_tips, "選択範囲の S 式を評価します", |
| 613 |
"Scheme (gauche) で評価できる S 式を評価します."); |
"Scheme (gauche) で評価できる S 式を評価します."); |
| 614 |
|
|
|
/* キーバインドのハンドリングを登録 */ |
|
|
g_signal_connect(G_OBJECT(notebook), "key-press-event", G_CALLBACK (signal_key_press_handler), NULL); |
|
|
g_signal_connect(G_OBJECT(notebook), "key-release-event", G_CALLBACK (signal_key_release_handler), NULL); |
|
| 615 |
gtk_container_add(GTK_CONTAINER(editor_window), vbox); |
gtk_container_add(GTK_CONTAINER(editor_window), vbox); |
| 616 |
gtk_container_add(GTK_CONTAINER(vbox), notebook); |
gtk_container_add(GTK_CONTAINER(vbox), notebook); |
| 617 |
|
|
| 641 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
| 642 |
"まだ内容が保存されていない場合は警告します"); |
"まだ内容が保存されていない場合は警告します"); |
| 643 |
|
|
| 644 |
|
/* C-x C-s などの状態を表示するステータスバーをウィンドウボトムに追加 */ |
| 645 |
|
statusbar = gtk_statusbar_new(); |
| 646 |
|
gtk_box_pack_start(GTK_BOX(vbox), statusbar, TRUE, TRUE, 0); |
| 647 |
|
contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), ""); |
| 648 |
|
|
| 649 |
|
/* キーバインドのハンドリングを登録 */ |
| 650 |
|
g_signal_connect(G_OBJECT(notebook), "key-press-event", G_CALLBACK (signal_key_press_handler), GINT_TO_POINTER(contextid)); |
| 651 |
|
g_signal_connect(G_OBJECT(notebook), "key-release-event", G_CALLBACK (signal_key_release_handler), GINT_TO_POINTER(contextid)); |
| 652 |
|
|
| 653 |
gtk_widget_grab_focus(notebook); |
gtk_widget_grab_focus(notebook); |
| 654 |
gtk_widget_show_all(editor_window); |
gtk_widget_show_all(editor_window); |
| 655 |
} |
} |