| 91 |
static void append_tabpage(gchar *filename); |
static void append_tabpage(gchar *filename); |
| 92 |
static void remove_tabpage(); |
static void remove_tabpage(); |
| 93 |
|
|
| 94 |
|
/* foo_bar_handler() は,イベントハンドラのためのラッパー */ |
| 95 |
|
static void append_default_tabpage_handler(); |
| 96 |
|
|
| 97 |
/* ファイル関係 */ |
/* ファイル関係 */ |
| 98 |
static void open_file(gchar *filename); |
static void open_file(gchar *filename); |
| 99 |
static void open_file_handler(); |
static void open_file_handler(); |
| 105 |
static gchar* get_all_buffer_contents(GtkTextBuffer *buffer); |
static gchar* get_all_buffer_contents(GtkTextBuffer *buffer); |
| 106 |
static gboolean save_text_buffer(const gchar *filename, GtkTextBuffer *buffer); |
static gboolean save_text_buffer(const gchar *filename, GtkTextBuffer *buffer); |
| 107 |
static void clear_current_buffer(); |
static void clear_current_buffer(); |
| 108 |
|
static void undo(); |
| 109 |
|
|
| 110 |
static void insert_text_handler(GtkTextBuffer *buffer, GtkTextIter *p, gchar *str, gint len); |
static void insert_text_handler(GtkTextBuffer *buffer, GtkTextIter *p, gchar *str, gint len); |
| 111 |
static void delete_range_handler(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end); |
static void delete_range_handler(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end); |
| 203 |
update_modeline_label(); |
update_modeline_label(); |
| 204 |
} |
} |
| 205 |
|
|
| 206 |
|
static void undo() { |
| 207 |
|
g_print("Undo\n"); |
| 208 |
|
GtkTextIter start, end; |
| 209 |
|
ShikiUndoInfo *undoInfo = g_list_nth_data(Shiki_CURRENT_UNDO_INFO_LIST, 0); |
| 210 |
|
if(!undoInfo) { |
| 211 |
|
g_print("これ以上 Undo できません\n"); |
| 212 |
|
return; |
| 213 |
|
} |
| 214 |
|
gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->start); |
| 215 |
|
gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &end, undoInfo->end); |
| 216 |
|
|
| 217 |
|
if(undoInfo->action == SHIKI_UNDO_INSERT) { |
| 218 |
|
Shiki_CURRENT_UNDO_INFO_LIST = g_list_delete_link(Shiki_CURRENT_UNDO_INFO_LIST, g_list_first(Shiki_CURRENT_UNDO_INFO_LIST)); |
| 219 |
|
gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end); |
| 220 |
|
g_free(undoInfo->str); |
| 221 |
|
g_free(undoInfo); |
| 222 |
|
} else if(undoInfo->action == SHIKI_UNDO_DELETE) { |
| 223 |
|
Shiki_CURRENT_UNDO_INFO_LIST = g_list_delete_link(Shiki_CURRENT_UNDO_INFO_LIST, g_list_first(Shiki_CURRENT_UNDO_INFO_LIST)); |
| 224 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->str, -1); |
| 225 |
|
g_free(undoInfo->str); |
| 226 |
|
g_free(undoInfo); |
| 227 |
|
} |
| 228 |
|
|
| 229 |
|
} |
| 230 |
|
|
| 231 |
/* キーが押された */ |
/* キーが押された */ |
| 232 |
static gboolean signal_key_press_handler (GtkWidget *notebook, GdkEventKey *event, gpointer contextid) { |
static gboolean signal_key_press_handler (GtkWidget *notebook, GdkEventKey *event, gpointer contextid) { |
| 233 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 302 |
break; |
break; |
| 303 |
|
|
| 304 |
case GDK_underscore : /* Ctrl + _ : Undo */ |
case GDK_underscore : /* Ctrl + _ : Undo */ |
| 305 |
{ |
undo(); |
|
g_print("undo\n"); |
|
|
GtkTextIter start, end; |
|
|
ShikiUndoInfo *undoInfo = g_list_nth_data(Shiki_CURRENT_UNDO_INFO_LIST, 0); |
|
|
if(!undoInfo) { |
|
|
g_print("これ以上 Undo できません\n"); |
|
|
return FALSE; |
|
|
} |
|
|
gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->start); |
|
|
gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &end, undoInfo->end); |
|
|
|
|
|
if(undoInfo->action == SHIKI_UNDO_INSERT) { |
|
|
Shiki_CURRENT_UNDO_INFO_LIST = g_list_delete_link(Shiki_CURRENT_UNDO_INFO_LIST, g_list_first(Shiki_CURRENT_UNDO_INFO_LIST)); |
|
|
gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end); |
|
|
g_free(undoInfo->str); |
|
|
g_free(undoInfo); |
|
|
} else if(undoInfo->action == SHIKI_UNDO_DELETE) { |
|
|
Shiki_CURRENT_UNDO_INFO_LIST = g_list_delete_link(Shiki_CURRENT_UNDO_INFO_LIST, g_list_first(Shiki_CURRENT_UNDO_INFO_LIST)); |
|
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->str, -1); |
|
|
g_free(undoInfo->str); |
|
|
g_free(undoInfo); |
|
|
} |
|
|
} |
|
| 306 |
break; |
break; |
| 307 |
|
|
| 308 |
case GDK_t : /* Ctrl + t : タブを開く */ |
case GDK_t : /* Ctrl + t : タブを開く */ |
| 309 |
append_tabpage(g_strdup("*scratch*")); |
append_default_tabpage_handler(); |
| 310 |
break; |
break; |
| 311 |
|
|
| 312 |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
| 345 |
/* 枠の中に格納するテキストビューワと,テキストバッファを作る */ |
/* 枠の中に格納するテキストビューワと,テキストバッファを作る */ |
| 346 |
tabinfo->text_view = GTK_TEXT_VIEW(gtk_text_view_new()); |
tabinfo->text_view = GTK_TEXT_VIEW(gtk_text_view_new()); |
| 347 |
tabinfo->text_buffer = gtk_text_view_get_buffer(tabinfo->text_view); |
tabinfo->text_buffer = gtk_text_view_get_buffer(tabinfo->text_view); |
| 348 |
|
|
| 349 |
gtk_container_add(GTK_CONTAINER(tabinfo->tabpage), GTK_WIDGET(tabinfo->text_view)); |
gtk_container_add(GTK_CONTAINER(tabinfo->tabpage), GTK_WIDGET(tabinfo->text_view)); |
| 350 |
gtk_widget_set_size_request(GTK_WIDGET(tabinfo->text_view), 500, 500); |
gtk_widget_set_size_request(GTK_WIDGET(tabinfo->text_view), 500, 500); |
| 351 |
g_signal_connect(tabinfo->text_buffer, "mark_set", G_CALLBACK(text_buffer_cursor_moved_handler), tabinfo->text_view); |
g_signal_connect(tabinfo->text_buffer, "mark_set", G_CALLBACK(text_buffer_cursor_moved_handler), tabinfo->text_view); |
| 354 |
|
|
| 355 |
/* タブを削除する際,デリートハンドラを削除しておかないと警告が出るから */ |
/* タブを削除する際,デリートハンドラを削除しておかないと警告が出るから */ |
| 356 |
tabinfo->delete_handler_id = g_signal_connect(Shiki_EDITOR_WINDOW, "delete_event", G_CALLBACK(delete_event_handler), tabinfo->text_buffer); |
tabinfo->delete_handler_id = g_signal_connect(Shiki_EDITOR_WINDOW, "delete_event", G_CALLBACK(delete_event_handler), tabinfo->text_buffer); |
| 357 |
|
|
| 358 |
/* 様々な初期化処理 */ |
/* 様々な初期化処理 */ |
| 359 |
/* 括弧の強調表示のためのタグを作る */ |
/* 括弧の強調表示のためのタグを作る */ |
| 360 |
gtk_text_buffer_create_tag (tabinfo->text_buffer, "parent_emphasis_background", "background", "green", NULL); |
gtk_text_buffer_create_tag (tabinfo->text_buffer, "parent_emphasis_background", "background", "green", NULL); |
| 369 |
gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, g_list_length(Shiki_EDITOR_TAB_INFO_LIST) - 1); |
gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, g_list_length(Shiki_EDITOR_TAB_INFO_LIST) - 1); |
| 370 |
} |
} |
| 371 |
|
|
| 372 |
|
static void append_default_tabpage_handler() { |
| 373 |
|
append_tabpage(g_strdup("*scratch*")); |
| 374 |
|
} |
| 375 |
|
|
| 376 |
/* ノートブックからタブとページ (バッファ) を削除 */ |
/* ノートブックからタブとページ (バッファ) を削除 */ |
| 377 |
static void remove_tabpage() { |
static void remove_tabpage() { |
| 378 |
/* タブが 1 つしか残っていなかったら消させない */ |
/* タブが 1 つしか残っていなかったら消させない */ |
| 422 |
GtkTextIter p; |
GtkTextIter p; |
| 423 |
|
|
| 424 |
if(!filename) return; |
if(!filename) return; |
| 425 |
|
|
| 426 |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 427 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n\n", -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n\n", -1); |
| 428 |
|
|
| 568 |
|
|
| 569 |
/* ヘルプへの変更は保存しない */ |
/* ヘルプへの変更は保存しない */ |
| 570 |
if(g_ascii_strcasecmp("*help*", Shiki_CURRENT_TAB_TITLE) == 0) return; |
if(g_ascii_strcasecmp("*help*", Shiki_CURRENT_TAB_TITLE) == 0) return; |
| 571 |
|
|
| 572 |
/* 変更が無ければ何もしない */ |
/* 変更が無ければ何もしない */ |
| 573 |
if(!gtk_text_buffer_get_modified(Shiki_CURRENT_TEXT_BUFFER)) return; |
if(!gtk_text_buffer_get_modified(Shiki_CURRENT_TEXT_BUFFER)) return; |
| 574 |
|
|
| 654 |
gchar *contents, *text; |
gchar *contents, *text; |
| 655 |
gsize br, bw, len; |
gsize br, bw, len; |
| 656 |
GError *err = NULL; |
GError *err = NULL; |
| 657 |
|
|
| 658 |
g_return_if_fail(filename != NULL); |
g_return_if_fail(filename != NULL); |
| 659 |
|
|
| 660 |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
| 661 |
GtkTextIter p; |
GtkTextIter p; |
| 662 |
|
|
| 744 |
|
|
| 745 |
/* カーソル以降の '(' に対応する ')' までの文字列 (S 式) を切り出す */ |
/* カーソル以降の '(' に対応する ')' までの文字列 (S 式) を切り出す */ |
| 746 |
static gboolean search_sexp(GtkTextIter *start, GtkTextIter *end) { |
static gboolean search_sexp(GtkTextIter *start, GtkTextIter *end) { |
| 747 |
|
|
| 748 |
/* カーソルの位置を取得 */ |
/* カーソルの位置を取得 */ |
| 749 |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, start, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, start, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 750 |
|
|
| 761 |
|
|
| 762 |
static gboolean search_sexp_kokka(GtkTextIter *end) { |
static gboolean search_sexp_kokka(GtkTextIter *end) { |
| 763 |
gint nest_level = 0; |
gint nest_level = 0; |
| 764 |
|
|
| 765 |
/* 対応する ')' を探す */ |
/* 対応する ')' を探す */ |
| 766 |
while(1) { |
while(1) { |
| 767 |
if(!gtk_text_iter_forward_find_char(end, is_kakko_or_kokka, NULL, NULL)) |
if(!gtk_text_iter_forward_find_char(end, is_kakko_or_kokka, NULL, NULL)) |
| 786 |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 787 |
|
|
| 788 |
gtk_text_iter_backward_char(end); |
gtk_text_iter_backward_char(end); |
| 789 |
|
|
| 790 |
if(gtk_text_iter_get_char(end) != ')') |
if(gtk_text_iter_get_char(end) != ')') |
| 791 |
gtk_text_iter_backward_find_char(end, is_kokka, NULL, NULL); |
gtk_text_iter_backward_find_char(end, is_kokka, NULL, NULL); |
| 792 |
*start = *end; |
*start = *end; |
| 976 |
"[ギアのアイコン] 選択領域を gauche にロード (region-compile)\n" |
"[ギアのアイコン] 選択領域を gauche にロード (region-compile)\n" |
| 977 |
"[マーキング (ちょん) のアイコン] タブの on/off\n" |
"[マーキング (ちょん) のアイコン] タブの on/off\n" |
| 978 |
"[工具 (スパナ) のアイコン] タブの位置の調整\n" |
"[工具 (スパナ) のアイコン] タブの位置の調整\n" |
| 979 |
"[まる + アイコン] 新規バッファを開く (Ctrl + t) (tab)\n" |
"[まる + アイコン] 新規バッファを開く (C-t) (tab)\n" |
| 980 |
|
"[左向き矢印アイコン] やり直し (C-_)\n" |
| 981 |
"[ゴミ箱アイコン] バッファをクリア\n" |
"[ゴミ箱アイコン] バッファをクリア\n" |
| 982 |
"[× アイコン] バッファを閉じる (Ctrl + k) (kill buffer)\n" |
"[× アイコン] バッファを閉じる (C-k) (kill buffer)\n" |
| 983 |
"[A アイコン] フォントの選択\n" |
"[A アイコン] フォントの選択\n" |
| 984 |
"[顔みたいなアイコン] Scheme ファイルのロード\n" |
"[顔みたいなアイコン] Scheme ファイルのロード\n" |
| 985 |
"[緑っぽい,変換アイコン] バッファの内容を全てロード\n" |
"[緑っぽい,変換アイコン] バッファの内容を全てロード\n" |
| 986 |
"[ヘルプ (?) アイコン] このヘルプ画面を表示します\n" |
"[ヘルプ (?) アイコン] このヘルプ画面を表示します\n" |
| 987 |
"[info アイコン] このアプリケーションについての情報\n\n" |
"[info アイコン] このアプリケーションについての情報\n" |
| 988 |
|
"\n" |
| 989 |
"C-f : → に移動 (forward)\n" |
"C-f : → に移動 (forward)\n" |
| 990 |
"C-b : ← に移動 (backward)\n" |
"C-b : ← に移動 (backward)\n" |
| 991 |
"C-n : ↓ に移動 (next line)\n" |
"C-n : ↓ に移動 (next line)\n" |
| 992 |
"C-p : ↑ に移動 (previous line)\n\n" |
"C-p : ↑ に移動 (previous line)\n" |
| 993 |
"C-h : バックスペース\n\n" |
"\n" |
| 994 |
|
"C-h : バックスペース\n" |
| 995 |
"C-w : カット\n" |
"C-w : カット\n" |
| 996 |
"C-y : ヤンク (ペースト)\n\n" |
"C-y : ヤンク (ペースト)\n" |
| 997 |
|
"\n" |
| 998 |
"C-e : カーソル後ろの S 式を評価 (eval-expression)\n" |
"C-e : カーソル後ろの S 式を評価 (eval-expression)\n" |
| 999 |
"C-j : カーソル手前の S 式を評価 (eval-last-sexp)\n" |
"C-j : カーソル手前の S 式を評価 (eval-last-sexp)\n" |
| 1000 |
"(emacs/xyzzy の *scratch* バッファと同じ)\n\n" |
"(emacs/xyzzy の *scratch* バッファと同じ)\n" |
| 1001 |
|
"\n" |
| 1002 |
"C-M-@ : カーソル以降の S 式を選択 (mark-sexp)\n" |
"C-M-@ : カーソル以降の S 式を選択 (mark-sexp)\n" |
| 1003 |
"C-M-SPC : カーソル手前の S 式を選択 (mark-last-sexp)\n" |
"C-M-SPC : カーソル手前の S 式を選択 (mark-last-sexp)\n" |
| 1004 |
"C-x C-c : 終了.ウィンドウの × ボタンを押したのと同じ\n\n" |
"C-x C-c : 終了.ウィンドウの × ボタンを押したのと同じ\n" |
| 1005 |
|
"\n" |
| 1006 |
"また,内容が失われる恐れがあるときには全て「Really Quit ?」のように警告します.\n", -1); |
"また,内容が失われる恐れがあるときには全て「Really Quit ?」のように警告します.\n", -1); |
| 1007 |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
| 1008 |
/* カーソル位置を先頭に */ |
/* カーソル位置を先頭に */ |
| 1089 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "タブ位置の設定", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "タブ位置の設定", ""); |
| 1090 |
|
|
| 1091 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-add", iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-add", iconsize), ""); |
| 1092 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(append_tabpage), NULL); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(append_default_tabpage_handler), NULL); |
| 1093 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 1094 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "新規バッファを開きます", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "新規バッファを開きます", ""); |
| 1095 |
|
|
| 1096 |
|
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-undo", iconsize), ""); |
| 1097 |
|
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(undo), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
| 1098 |
|
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 1099 |
|
gtk_tool_item_set_tooltip(icon, toolbar_tips, "Undo",""); |
| 1100 |
|
|
| 1101 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-delete", iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-delete", iconsize), ""); |
| 1102 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(clear_current_buffer), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(clear_current_buffer), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
| 1103 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |