| 71 |
gtk_widget_destroy(dialog); |
gtk_widget_destroy(dialog); |
| 72 |
return filename; |
return filename; |
| 73 |
} |
} |
| 74 |
|
/* 現在表示されているページのテキストビューワを取り出す */ |
| 75 |
/* 現在表示されているページのテキストバッファを取り出す */ |
static GtkTextView* get_text_view_from_current_tabpage(GtkNotebook* notebook) { |
|
static GtkTextBuffer* get_text_buffer_from_current_tabpage(GtkNotebook* notebook) { |
|
| 76 |
gint pagenum = gtk_notebook_get_current_page(notebook); |
gint pagenum = gtk_notebook_get_current_page(notebook); |
| 77 |
GtkScrolledWindow *scrolledwindow = GTK_SCROLLED_WINDOW(gtk_notebook_get_nth_page(notebook, pagenum)); |
GtkScrolledWindow *scrolledwindow = GTK_SCROLLED_WINDOW(gtk_notebook_get_nth_page(notebook, pagenum)); |
| 78 |
/* GtkBin は一つしか子を持たない抽象コンテナクラス */ |
/* GtkBin は一つしか子を持たない抽象コンテナクラス */ |
| 79 |
GtkTextView *view = GTK_TEXT_VIEW(gtk_bin_get_child(GTK_BIN(scrolledwindow))); |
return GTK_TEXT_VIEW(gtk_bin_get_child(GTK_BIN(scrolledwindow))); |
| 80 |
return gtk_text_view_get_buffer(view); |
} |
| 81 |
|
|
| 82 |
|
|
| 83 |
|
/* 現在表示されているページのテキストバッファを取り出す */ |
| 84 |
|
static GtkTextBuffer* get_text_buffer_from_current_tabpage(GtkNotebook* notebook) { |
| 85 |
|
return gtk_text_view_get_buffer(get_text_view_from_current_tabpage(notebook)); |
| 86 |
} |
} |
| 87 |
|
|
| 88 |
/* 現在表示されているタブが開いているファイルの名前を返す */ |
/* 現在表示されているタブが開いているファイルの名前を返す */ |
| 212 |
gtk_widget_set_size_request(GTK_WIDGET(view), 500, 500); |
gtk_widget_set_size_request(GTK_WIDGET(view), 500, 500); |
| 213 |
|
|
| 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 |
|
|
| 233 |
GtkTextBuffer *buffer; |
GtkTextBuffer *buffer; |
| 234 |
GtkWidget *scrolledwindow; |
GtkWidget *scrolledwindow; |
| 235 |
GtkTextIter p; |
GtkTextIter p; |
| 236 |
|
|
| 237 |
/* 新しいバッファを開く */ |
/* 新しいバッファを開く */ |
| 238 |
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), |
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), |
| 239 |
scrolledwindow = new_scrolled_text_buffer(), |
scrolledwindow = new_scrolled_text_buffer(), |
| 240 |
gtk_label_new(filename)); |
gtk_label_new(filename)); |
| 241 |
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtk_bin_get_child(GTK_BIN(scrolledwindow)))); |
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtk_bin_get_child(GTK_BIN(scrolledwindow)))); |
| 242 |
|
|
| 243 |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 406 |
|
|
| 407 |
/* 特定のキー操作のハンドリング */ |
/* 特定のキー操作のハンドリング */ |
| 408 |
|
|
| 409 |
|
/* カーソルの移動 ^npfb */ |
| 410 |
|
static void forward_buffer_from_current_tabpage(GtkNotebook *notebook) { |
| 411 |
|
GtkTextBuffer *b = get_text_buffer_from_current_tabpage(notebook); |
| 412 |
|
GtkTextIter p; |
| 413 |
|
gtk_text_buffer_get_iter_at_mark(b,&p, gtk_text_buffer_get_insert(b)); |
| 414 |
|
gtk_text_iter_forward_char(&p); |
| 415 |
|
gtk_text_buffer_place_cursor(b, &p); |
| 416 |
|
} |
| 417 |
|
static void backward_buffer_from_current_tabpage(GtkNotebook *notebook) { |
| 418 |
|
GtkTextBuffer *b = get_text_buffer_from_current_tabpage(notebook); |
| 419 |
|
GtkTextIter p; |
| 420 |
|
gtk_text_buffer_get_iter_at_mark(b,&p, gtk_text_buffer_get_insert(b)); |
| 421 |
|
gtk_text_iter_backward_char(&p); |
| 422 |
|
gtk_text_buffer_place_cursor(b, &p); |
| 423 |
|
} |
| 424 |
|
static void line_forward_buffer_from_current_tabpage(GtkNotebook *notebook) { |
| 425 |
|
GtkTextView *v = get_text_view_from_current_tabpage(notebook); |
| 426 |
|
GtkTextBuffer *b = gtk_text_view_get_buffer(v); |
| 427 |
|
GtkTextIter p; |
| 428 |
|
gtk_text_buffer_get_iter_at_mark(b,&p, gtk_text_buffer_get_insert(b)); |
| 429 |
|
gtk_text_view_forward_display_line(v, &p); |
| 430 |
|
gtk_text_buffer_place_cursor(b, &p); |
| 431 |
|
} |
| 432 |
|
static void line_backward_buffer_from_current_tabpage(GtkNotebook *notebook) { |
| 433 |
|
GtkTextView *v = get_text_view_from_current_tabpage(notebook); |
| 434 |
|
GtkTextBuffer *b = gtk_text_view_get_buffer(v); |
| 435 |
|
GtkTextIter p; |
| 436 |
|
gtk_text_buffer_get_iter_at_mark(b,&p, gtk_text_buffer_get_insert(b)); |
| 437 |
|
gtk_text_view_backward_display_line(v, &p); |
| 438 |
|
gtk_text_buffer_place_cursor(b, &p); |
| 439 |
|
} |
| 440 |
|
|
| 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)); |
| 449 |
gtk_text_buffer_get_end_iter(buffer, &end); |
gtk_text_buffer_get_end_iter(buffer, &end); |
| 450 |
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); |
| 451 |
|
|
| 452 |
|
/* Ctrl + f : forward */ |
| 453 |
|
if(event->keyval == GDK_f && event->state & GDK_CONTROL_MASK) { |
| 454 |
|
forward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 455 |
|
} |
| 456 |
|
/* Ctrl + b : backward */ |
| 457 |
|
if(event->keyval == GDK_b && event->state & GDK_CONTROL_MASK) { |
| 458 |
|
backward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 459 |
|
} |
| 460 |
|
/* Ctrl + n : next line */ |
| 461 |
|
if(event->keyval == GDK_n && event->state & GDK_CONTROL_MASK) { |
| 462 |
|
line_forward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 463 |
|
} |
| 464 |
|
/* Ctrl + p : previous line */ |
| 465 |
|
if(event->keyval == GDK_p && event->state & GDK_CONTROL_MASK) { |
| 466 |
|
line_backward_buffer_from_current_tabpage(GTK_NOTEBOOK(notebook)); |
| 467 |
|
} |
| 468 |
|
|
| 469 |
/* Ctrl + j : カーソル手前の S 式の評価 */ |
/* Ctrl + j : カーソル手前の S 式の評価 */ |
| 470 |
if(event->keyval == GDK_j && event->state & GDK_CONTROL_MASK) { |
if(event->keyval == GDK_j && event->state & GDK_CONTROL_MASK) { |
| 471 |
gchar *code; |
gchar *code; |
| 501 |
if(event->keyval == GDK_w && event->state & GDK_CONTROL_MASK) { |
if(event->keyval == GDK_w && event->state & GDK_CONTROL_MASK) { |
| 502 |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
| 503 |
} |
} |
| 504 |
|
|
| 505 |
/* Ctrl + t : タブを開く */ |
/* Ctrl + t : タブを開く */ |
| 506 |
if(event->keyval == GDK_t && event->state & GDK_CONTROL_MASK) { |
if(event->keyval == GDK_t && event->state & GDK_CONTROL_MASK) { |
| 507 |
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), new_scrolled_text_buffer(), gtk_label_new("*scratch*")); |
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), new_scrolled_text_buffer(), gtk_label_new("*scratch*")); |