| 162 |
/* 本当に終了してもよろしいですか ? ダイアログの初期化 */ |
/* 本当に終了してもよろしいですか ? ダイアログの初期化 */ |
| 163 |
g_signal_connect(G_OBJECT(dialog_window), "delete_event", G_CALLBACK(gtk_false), NULL); |
g_signal_connect(G_OBJECT(dialog_window), "delete_event", G_CALLBACK(gtk_false), NULL); |
| 164 |
g_signal_connect(G_OBJECT(dialog_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
g_signal_connect(G_OBJECT(dialog_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
| 165 |
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox), |
| 166 |
|
gtk_label_new("バッファが変更されています.\nセーブしないで終了しますか ?"), TRUE, TRUE, 0); |
| 167 |
gtk_window_set_title(GTK_WINDOW (dialog_window), "Really Quit ?"); |
gtk_window_set_title(GTK_WINDOW (dialog_window), "Really Quit ?"); |
| 168 |
/* YES のボタン */ |
/* YES のボタン */ |
| 169 |
yes_button = gtk_button_new_with_label("YES"); |
yes_button = gtk_button_new_with_label("はい (Y)"); |
| 170 |
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); |
| 171 |
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)); |
| 172 |
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); |
| 173 |
|
|
| 174 |
/* NO のボタン */ |
/* NO のボタン */ |
| 175 |
no_button = gtk_button_new_with_label("NO"); |
no_button = gtk_button_new_with_label("いいえ (N)"); |
| 176 |
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); |
| 177 |
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)); |
| 178 |
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); |
| 213 |
gtk_widget_set_size_request(GTK_WIDGET(view), 500, 500); |
gtk_widget_set_size_request(GTK_WIDGET(view), 500, 500); |
| 214 |
|
|
| 215 |
/* 様々な初期化処理 */ |
/* 様々な初期化処理 */ |
|
|
|
| 216 |
/* 括弧の強調表示のためのタグを作る */ |
/* 括弧の強調表示のためのタグを作る */ |
| 217 |
gtk_text_buffer_create_tag (buffer, "parent_emphasis_background", "background", "green", NULL); |
gtk_text_buffer_create_tag (buffer, "parent_emphasis_background", "background", "green", NULL); |
| 218 |
|
|
| 441 |
/* キーが押された */ |
/* キーが押された */ |
| 442 |
static gboolean signal_key_press_handler (GtkWidget *notebook, GdkEventKey *event, gpointer p) { |
static gboolean signal_key_press_handler (GtkWidget *notebook, GdkEventKey *event, gpointer p) { |
| 443 |
GtkTextBuffer *buffer = get_text_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
GtkTextBuffer *buffer = get_text_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 444 |
|
//static gint metakey_pressed = 0; |
| 445 |
|
static gint controlx_pressed = 0; |
| 446 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 447 |
|
|
| 448 |
/* 括弧の対応の強調を無効に */ |
/* 括弧の対応の強調を無効に */ |
| 450 |
gtk_text_buffer_get_end_iter(buffer, &end); |
gtk_text_buffer_get_end_iter(buffer, &end); |
| 451 |
gtk_text_buffer_remove_tag_by_name(buffer, "parent_emphasis_background", &start, &end); |
gtk_text_buffer_remove_tag_by_name(buffer, "parent_emphasis_background", &start, &end); |
| 452 |
|
|
| 453 |
/* コントロールキーが押されている */ |
/* C-x */ |
| 454 |
if(event->state & GDK_CONTROL_MASK) { |
if(event->keyval == GDK_x && event->state & GDK_CONTROL_MASK) { |
| 455 |
switch(event->keyval) { |
controlx_pressed++; |
| 456 |
case GDK_f : /* Ctrl + f : forward */ |
g_print("C-x "); |
| 457 |
forward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
} else if(event->state & GDK_CONTROL_MASK) { |
| 458 |
break; |
if(controlx_pressed > 0) { |
| 459 |
case GDK_b : /* Ctrl + b : backward */ |
g_print("C-%s\n", event->string); |
| 460 |
backward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
switch(event->keyval) { |
| 461 |
break; |
case GDK_c :/* C-x C-c : 終了 */ |
| 462 |
case GDK_n : /* Ctrl + n : next line */ |
{/* "delete-event" を発生させる.ウィンドウの × ボタンが押されたのと同じ */ |
| 463 |
line_forward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
GdkEvent ev; |
| 464 |
break; |
|
| 465 |
case GDK_p : /* Ctrl + p : previous line */ |
ev.any.type = GDK_DELETE; |
| 466 |
line_backward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
ev.any.window = editor_window->window; |
| 467 |
break; |
ev.any.send_event = FALSE; |
| 468 |
|
gdk_event_put (&ev); |
| 469 |
case GDK_j : /* Ctrl + j : カーソル手前の S 式の評価 */ |
} |
| 470 |
{ |
break; |
| 471 |
gchar *code; |
|
| 472 |
GtkTextIter start, end; |
case GDK_f : /* C-x C-f : ファイル開く */ |
| 473 |
|
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
| 474 |
/* カーソルの位置を取得 */ |
g_print("C-f\n"); |
| 475 |
gtk_text_buffer_get_iter_at_mark(buffer, &end, gtk_text_buffer_get_insert(buffer)); |
break; |
| 476 |
|
|
| 477 |
gtk_text_iter_backward_find_char(&end, is_kokka, NULL, NULL); |
case GDK_s : /* C-x C-s : ファイル保存 */ |
| 478 |
start = end; |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
| 479 |
gtk_text_iter_forward_char(&end); |
break; |
| 480 |
|
|
| 481 |
/* カーソル位置の前にある S 式を切り出す */ |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
| 482 |
if(!search_sexp_string(&start)) return FALSE; |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
| 483 |
|
break; |
| 484 |
code = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); |
} |
| 485 |
gtk_text_buffer_insert(buffer, &end, "\n\n", -1); |
controlx_pressed = 0; |
| 486 |
gtk_text_buffer_insert(buffer, &end, eval_cstring_by_gauche(code), -1); |
} else { |
| 487 |
g_free(code); |
switch(event->keyval) { |
| 488 |
} |
case GDK_f : /* Ctrl + f : forward */ |
| 489 |
break; |
forward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 490 |
|
break; |
| 491 |
case GDK_O : /* Ctrl + O : ファイル開く */ |
case GDK_b : /* Ctrl + b : backward */ |
| 492 |
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
backward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 493 |
break; |
break; |
| 494 |
|
case GDK_n : /* Ctrl + n : next line */ |
| 495 |
case GDK_s : /* Ctrl + s : ファイル保存 */ |
line_forward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 496 |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
break; |
| 497 |
break; |
case GDK_p : /* Ctrl + p : previous line */ |
| 498 |
|
line_backward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 499 |
case GDK_w : /* Ctrl + w : ファイル別名保存 */ |
break; |
| 500 |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
|
| 501 |
break; |
case GDK_j : /* Ctrl + j : カーソル手前の S 式の評価 */ |
| 502 |
|
{ |
| 503 |
case GDK_t : /* Ctrl + t : タブを開く */ |
gchar *code; |
| 504 |
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), new_scrolled_text_buffer(), gtk_label_new("*scratch*")); |
GtkTextIter start, end; |
| 505 |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
|
| 506 |
break; |
/* カーソルの位置を取得 */ |
| 507 |
|
gtk_text_buffer_get_iter_at_mark(buffer, &end, gtk_text_buffer_get_insert(buffer)); |
| 508 |
case GDK_C : /* Ctrl + c : タブを閉じる */ |
|
| 509 |
remove_tabpage(GTK_NOTEBOOK(notebook)); |
gtk_text_iter_backward_find_char(&end, is_kokka, NULL, NULL); |
| 510 |
break; |
start = end; |
| 511 |
|
gtk_text_iter_forward_char(&end); |
| 512 |
case GDK_q :/* Ctrl + q : 終了 */ |
|
| 513 |
{ |
/* カーソル位置の前にある S 式を切り出す */ |
| 514 |
/* "delete-event" を発生させる.ウィンドウの × ボタンが押されたのと同じ */ |
if(!search_sexp_string(&start)) return FALSE; |
| 515 |
GdkEvent ev; |
|
| 516 |
|
code = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); |
| 517 |
ev.any.type = GDK_DELETE; |
gtk_text_buffer_insert(buffer, &end, "\n\n", -1); |
| 518 |
ev.any.window = editor_window->window; |
gtk_text_buffer_insert(buffer, &end, eval_cstring_by_gauche(code), -1); |
| 519 |
ev.any.send_event = FALSE; |
g_free(code); |
| 520 |
gdk_event_put (&ev); |
} |
| 521 |
} |
break; |
| 522 |
break; |
|
| 523 |
|
case GDK_t : /* Ctrl + t : タブを開く */ |
| 524 |
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), new_scrolled_text_buffer(), gtk_label_new("*scratch*")); |
| 525 |
|
gtk_widget_show_all(GTK_WIDGET(notebook)); |
| 526 |
|
break; |
| 527 |
|
|
| 528 |
|
case GDK_k : /* Ctrl + k : タブを閉じる */ |
| 529 |
|
remove_tabpage(GTK_NOTEBOOK(notebook)); |
| 530 |
|
break; |
| 531 |
|
} |
| 532 |
} |
} |
| 533 |
} |
} |
| 534 |
return FALSE; |
return FALSE; |
| 661 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
| 662 |
"まだ内容が保存されていない場合は警告します"); |
"まだ内容が保存されていない場合は警告します"); |
| 663 |
|
|
| 664 |
|
gtk_widget_grab_focus(notebook); |
| 665 |
gtk_widget_show_all(editor_window); |
gtk_widget_show_all(editor_window); |
| 666 |
} |
} |
| 667 |
|
|