| 31 |
|
|
| 32 |
static gint editor_indent_width = 2; |
static gint editor_indent_width = 2; |
| 33 |
|
|
| 34 |
static GtkWidget *editor_window; |
/* タブごとのファイル名や異なる Scheme 環境を保持している管理用構造体 */ |
| 35 |
static GtkScrolledWindow *current_tabpage; |
typedef struct { |
| 36 |
static gint current_tabpage_num; |
gchar *filename; /* フルパス */ |
| 37 |
static const gchar *current_tabpage_label; |
ScmObj env; |
| 38 |
static GtkTextView *current_text_view; |
} ShikiTabInfo; |
| 39 |
static GtkTextBuffer *current_text_buffer; |
|
| 40 |
|
struct { |
| 41 |
static GtkWidget *statusbar; |
GtkWidget *editor_window; |
| 42 |
static GtkWidget *modeline_label; |
GtkWidget *statusbar; |
| 43 |
|
GtkWidget *modeline_label; |
| 44 |
|
GtkScrolledWindow *current_tabpage; |
| 45 |
|
gint current_tabpage_num; |
| 46 |
|
const gchar *current_tabpage_label; |
| 47 |
|
GtkTextView *current_text_view; |
| 48 |
|
GtkTextBuffer *current_text_buffer; |
| 49 |
|
ShikiTabInfo *current_tabpage_info; |
| 50 |
|
} shiki_editor; |
| 51 |
|
|
| 52 |
|
#define Shiki_EDITOR_WINDOW shiki_editor.editor_window |
| 53 |
|
#define Shiki_EDITOR_STATUSBAR shiki_editor.statusbar |
| 54 |
|
#define Shiki_EDITOR_MODELINE_LABEL shiki_editor.modeline_label |
| 55 |
|
#define Shiki_CURRENT_TAB shiki_editor.current_tabpage |
| 56 |
|
#define Shiki_CURRENT_TAB_NUM shiki_editor.current_tabpage_num |
| 57 |
|
#define Shiki_CURRENT_TAB_TITLE shiki_editor.current_tabpage_label |
| 58 |
|
#define Shiki_CURRENT_TAB_INFO shiki_editor.current_tabpage_info |
| 59 |
|
#define Shiki_CURRENT_SCHEME_ENV (shiki_editor.current_tabpage_info)->env |
| 60 |
|
#define Shiki_CURRENT_FILENAME (shiki_editor.current_tabpage_info)->filename |
| 61 |
|
#define Shiki_CURRENT_TEXT_BUFFER shiki_editor.current_text_buffer |
| 62 |
|
#define Shiki_CURRENT_TEXT_VIEW shiki_editor.current_text_view |
| 63 |
|
|
| 64 |
static gchar *get_all_buffer_contents(GtkTextBuffer *buffer); |
static gchar *get_all_buffer_contents(GtkTextBuffer *buffer); |
| 65 |
static gchar *load_cstring_by_gauche(gchar *s); |
static gchar *load_cstring_by_gauche(gchar *s); |
| 67 |
/* バッファの内容を消去 */ |
/* バッファの内容を消去 */ |
| 68 |
static void clear_current_buffer() { |
static void clear_current_buffer() { |
| 69 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 70 |
gtk_text_buffer_get_start_iter(current_text_buffer, &start); |
gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &start); |
| 71 |
gtk_text_buffer_get_end_iter(current_text_buffer, &end); |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end); |
| 72 |
gtk_text_buffer_delete(current_text_buffer, &start, &end); |
gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end); |
| 73 |
} |
} |
| 74 |
|
|
| 75 |
/* バッファをまるごとロード */ |
/* バッファをまるごとロード */ |
| 76 |
static void load_buffer_by_gauche() { |
static void load_buffer_by_gauche() { |
| 77 |
GtkTextIter p; |
GtkTextIter p; |
| 78 |
gtk_text_buffer_get_end_iter(current_text_buffer, &p); |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 79 |
gtk_text_buffer_insert(current_text_buffer, &p, "\n\n", -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n\n", -1); |
| 80 |
gtk_text_buffer_insert(current_text_buffer, &p, load_cstring_by_gauche(get_all_buffer_contents(current_text_buffer)), -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(get_all_buffer_contents(Shiki_CURRENT_TEXT_BUFFER)), -1); |
| 81 |
} |
} |
| 82 |
|
|
| 83 |
static gchar *get_filename_from_dialog(const gchar *msg); |
static gchar *get_filename_from_dialog(const gchar *msg); |
| 92 |
|
|
| 93 |
if(!filename) return; |
if(!filename) return; |
| 94 |
|
|
| 95 |
gtk_text_buffer_get_end_iter(current_text_buffer, &p); |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 96 |
gtk_text_buffer_insert(current_text_buffer, &p, "\n\n", -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n\n", -1); |
| 97 |
|
|
| 98 |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
| 99 |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 100 |
gtk_text_buffer_insert(current_text_buffer, &p, load_cstring_by_gauche(text), -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(text), -1); |
| 101 |
else |
else |
| 102 |
gtk_text_buffer_insert(current_text_buffer, &p, load_cstring_by_gauche(contents), -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(contents), -1); |
| 103 |
} |
} |
| 104 |
g_free(text); g_free(contents); g_free(filename); |
g_free(text); g_free(contents); g_free(filename); |
| 105 |
} |
} |
| 141 |
GtkRcStyle *style = gtk_rc_style_new (); |
GtkRcStyle *style = gtk_rc_style_new (); |
| 142 |
pango_font_description_free(style->font_desc); |
pango_font_description_free(style->font_desc); |
| 143 |
style->font_desc = pango_font_description_from_string(font_name); |
style->font_desc = pango_font_description_from_string(font_name); |
| 144 |
gtk_widget_modify_style (GTK_WIDGET(current_text_view), style); |
gtk_widget_modify_style (GTK_WIDGET(Shiki_CURRENT_TEXT_VIEW), style); |
| 145 |
g_free (font_name); |
g_free (font_name); |
| 146 |
} |
} |
| 147 |
} |
} |
| 178 |
|
|
| 179 |
/* バッファの状態に合わせてモードラインを変更 */ |
/* バッファの状態に合わせてモードラインを変更 */ |
| 180 |
static void update_modeline_label() { |
static void update_modeline_label() { |
| 181 |
gchar* basename = g_path_get_basename(current_tabpage_label); |
gchar* basename = g_path_get_basename(Shiki_CURRENT_TAB_TITLE); |
| 182 |
gchar* l = g_strdup_printf("-E:%s %-10s (Gauche Interaction)--L%d--------------------------------------", |
gchar* l = g_strdup_printf("-E:%s %-10s (Gauche Interaction)--L%d--------------------------------------", |
| 183 |
gtk_text_buffer_get_modified(current_text_buffer) ? "**" : "--", |
gtk_text_buffer_get_modified(Shiki_CURRENT_TEXT_BUFFER) ? "**" : "--", |
| 184 |
basename, get_current_line_number(current_text_buffer)); |
basename, get_current_line_number(Shiki_CURRENT_TEXT_BUFFER)); |
| 185 |
gtk_label_set_text(GTK_LABEL(modeline_label), l); |
gtk_label_set_text(GTK_LABEL(Shiki_EDITOR_MODELINE_LABEL), l); |
| 186 |
g_free(l); g_free(basename); |
g_free(l); g_free(basename); |
| 187 |
} |
} |
| 188 |
|
|
| 234 |
static void save_file_from_notebook(GtkNotebook *notebook) { |
static void save_file_from_notebook(GtkNotebook *notebook) { |
| 235 |
|
|
| 236 |
/* 変更が無ければ何もしない */ |
/* 変更が無ければ何もしない */ |
| 237 |
if(!gtk_text_buffer_get_modified(current_text_buffer)) return; |
if(!gtk_text_buffer_get_modified(Shiki_CURRENT_TEXT_BUFFER)) return; |
| 238 |
|
|
| 239 |
/* まだファイル名が設定されていなかったら,ダイアログを開いて入力させる */ |
/* まだファイル名が設定されていなかったら,ダイアログを開いて入力させる */ |
| 240 |
if(g_ascii_strcasecmp("*scratch*", current_tabpage_label) == 0) { |
if(g_ascii_strcasecmp("*scratch*", Shiki_CURRENT_TAB_TITLE) == 0) { |
| 241 |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
| 242 |
if(!filename) return; |
if(!filename) return; |
| 243 |
if(!save_text_buffer(filename, current_text_buffer)) return; |
if(!save_text_buffer(filename, Shiki_CURRENT_TEXT_BUFFER)) return; |
| 244 |
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(current_tabpage), filename); |
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(Shiki_CURRENT_TAB), filename); |
| 245 |
gtk_window_set_title (GTK_WINDOW(editor_window), filename); |
gtk_window_set_title (GTK_WINDOW(Shiki_EDITOR_WINDOW), filename); |
| 246 |
g_free(filename); |
g_free(filename); |
| 247 |
} else |
} else |
| 248 |
save_text_buffer(current_tabpage_label, current_text_buffer); |
save_text_buffer(Shiki_CURRENT_TAB_TITLE, Shiki_CURRENT_TEXT_BUFFER); |
| 249 |
} |
} |
| 250 |
|
|
| 251 |
/* ファイルを保存するイベントハンドラ */ |
/* ファイルを保存するイベントハンドラ */ |
| 258 |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
| 259 |
|
|
| 260 |
if(!filename) return; |
if(!filename) return; |
| 261 |
if(!save_text_buffer(filename, current_text_buffer)) return; |
if(!save_text_buffer(filename, Shiki_CURRENT_TEXT_BUFFER)) return; |
| 262 |
|
|
| 263 |
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(current_tabpage), filename); |
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(Shiki_CURRENT_TAB), filename); |
| 264 |
gtk_window_set_title (GTK_WINDOW (editor_window), filename); |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 265 |
|
|
| 266 |
g_free(filename); |
g_free(filename); |
| 267 |
} |
} |
| 306 |
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); |
| 307 |
|
|
| 308 |
gtk_window_set_modal(GTK_WINDOW(dialog_window), TRUE); |
gtk_window_set_modal(GTK_WINDOW(dialog_window), TRUE); |
| 309 |
gtk_window_set_transient_for(GTK_WINDOW(dialog_window), GTK_WINDOW (editor_window)); |
gtk_window_set_transient_for(GTK_WINDOW(dialog_window), GTK_WINDOW (Shiki_EDITOR_WINDOW)); |
| 310 |
|
|
| 311 |
gtk_widget_show_all(dialog_window); |
gtk_widget_show_all(dialog_window); |
| 312 |
gtk_main (); |
gtk_main (); |
| 337 |
view = gtk_text_view_new(); |
view = gtk_text_view_new(); |
| 338 |
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); |
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); |
| 339 |
gtk_container_add(GTK_CONTAINER(scrolledwindow), view); |
gtk_container_add(GTK_CONTAINER(scrolledwindow), view); |
| 340 |
g_signal_connect(G_OBJECT(editor_window), "delete_event", G_CALLBACK(delete_event_handler), buffer); |
g_signal_connect(G_OBJECT(Shiki_EDITOR_WINDOW), "delete_event", G_CALLBACK(delete_event_handler), buffer); |
| 341 |
gtk_widget_set_size_request(GTK_WIDGET(view), 500, 600); |
gtk_widget_set_size_request(GTK_WIDGET(view), 500, 600); |
| 342 |
g_signal_connect(buffer, "mark_set", G_CALLBACK(text_buffer_cursor_moved_handler), view); |
g_signal_connect(buffer, "mark_set", G_CALLBACK(text_buffer_cursor_moved_handler), view); |
| 343 |
/* 様々な初期化処理 */ |
/* 様々な初期化処理 */ |
| 378 |
gtk_text_buffer_get_start_iter(buffer, &p); |
gtk_text_buffer_get_start_iter(buffer, &p); |
| 379 |
gtk_text_buffer_place_cursor(buffer, &p); |
gtk_text_buffer_place_cursor(buffer, &p); |
| 380 |
update_modeline_label(); |
update_modeline_label(); |
| 381 |
gtk_window_set_title (GTK_WINDOW (editor_window), filename); |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 382 |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
| 383 |
g_free(contents); g_free(text); g_free(filename); |
g_free(contents); g_free(text); g_free(filename); |
| 384 |
} else |
} else |
| 425 |
|
|
| 426 |
GtkTextIter start, end, p; |
GtkTextIter start, end, p; |
| 427 |
gchar *code; |
gchar *code; |
| 428 |
gtk_text_buffer_get_end_iter(current_text_buffer, &p); |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 429 |
gtk_text_buffer_insert(current_text_buffer, &p, "\n\n", -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n\n", -1); |
| 430 |
|
|
| 431 |
/* マウスで選択されている範囲の文字列を取得 */ |
/* マウスで選択されている範囲の文字列を取得 */ |
| 432 |
if(gtk_text_buffer_get_selection_bounds(current_text_buffer, &start, &end)) { |
if(gtk_text_buffer_get_selection_bounds(Shiki_CURRENT_TEXT_BUFFER, &start, &end)) { |
| 433 |
code = gtk_text_buffer_get_text(current_text_buffer, &start, &end, FALSE); |
code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE); |
| 434 |
gtk_text_buffer_insert(current_text_buffer, &p, load_cstring_by_gauche(code), -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(code), -1); |
| 435 |
g_free(code); |
g_free(code); |
| 436 |
} |
} |
| 437 |
} |
} |
| 489 |
static void switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum, gpointer p) { |
static void switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum, gpointer p) { |
| 490 |
|
|
| 491 |
/* 現在のタブ,ビューワ,バッファを切替える */ |
/* 現在のタブ,ビューワ,バッファを切替える */ |
| 492 |
current_tabpage = GTK_SCROLLED_WINDOW(gtk_notebook_get_nth_page(notebook, pagenum)); |
Shiki_CURRENT_TAB = GTK_SCROLLED_WINDOW(gtk_notebook_get_nth_page(notebook, pagenum)); |
| 493 |
current_tabpage_num = pagenum; |
Shiki_CURRENT_TAB_NUM = pagenum; |
| 494 |
/* GtkBin は一つしか子を持たない抽象コンテナクラス */ |
/* GtkBin は一つしか子を持たない抽象コンテナクラス */ |
| 495 |
current_text_view = GTK_TEXT_VIEW(gtk_bin_get_child(GTK_BIN(current_tabpage))); |
Shiki_CURRENT_TEXT_VIEW = GTK_TEXT_VIEW(gtk_bin_get_child(GTK_BIN(Shiki_CURRENT_TAB))); |
| 496 |
current_text_buffer = gtk_text_view_get_buffer(current_text_view); |
Shiki_CURRENT_TEXT_BUFFER = gtk_text_view_get_buffer(Shiki_CURRENT_TEXT_VIEW); |
| 497 |
|
|
| 498 |
/* タブのラベルをウィンドウのタイトルに */ |
/* タブのラベルをウィンドウのタイトルに */ |
| 499 |
gtk_window_set_title (GTK_WINDOW(editor_window), current_tabpage_label = gtk_notebook_get_tab_label_text(notebook, GTK_WIDGET(current_tabpage))); |
gtk_window_set_title (GTK_WINDOW(Shiki_EDITOR_WINDOW), Shiki_CURRENT_TAB_TITLE = gtk_notebook_get_tab_label_text(notebook, GTK_WIDGET(Shiki_CURRENT_TAB))); |
| 500 |
|
|
| 501 |
update_modeline_label(); |
update_modeline_label(); |
| 502 |
} |
} |
| 516 |
|
|
| 517 |
/* ノートブックからページを削除 */ |
/* ノートブックからページを削除 */ |
| 518 |
static void remove_tabpage(GtkNotebook *notebook) { |
static void remove_tabpage(GtkNotebook *notebook) { |
| 519 |
if(!not_yet_save_changes_really_quit(current_text_buffer)) { |
if(!not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER)) { |
| 520 |
gtk_notebook_remove_page(notebook, current_tabpage_num); |
gtk_notebook_remove_page(notebook, Shiki_CURRENT_TAB_NUM); |
| 521 |
/* ウィジットを強制的に再描画 */ |
/* ウィジットを強制的に再描画 */ |
| 522 |
gtk_widget_queue_draw(GTK_WIDGET(notebook)); |
gtk_widget_queue_draw(GTK_WIDGET(notebook)); |
| 523 |
} |
} |
| 543 |
/* カーソルの移動 ^npfb */ |
/* カーソルの移動 ^npfb */ |
| 544 |
static void forward_current_buffer() { |
static void forward_current_buffer() { |
| 545 |
GtkTextIter p; |
GtkTextIter p; |
| 546 |
gtk_text_buffer_get_iter_at_mark(current_text_buffer,&p, gtk_text_buffer_get_insert(current_text_buffer)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 547 |
gtk_text_iter_forward_char(&p); |
gtk_text_iter_forward_char(&p); |
| 548 |
gtk_text_buffer_place_cursor(current_text_buffer, &p); |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 549 |
} |
} |
| 550 |
static void backward_current_buffer() { |
static void backward_current_buffer() { |
| 551 |
GtkTextIter p; |
GtkTextIter p; |
| 552 |
gtk_text_buffer_get_iter_at_mark(current_text_buffer,&p, gtk_text_buffer_get_insert(current_text_buffer)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 553 |
gtk_text_iter_backward_char(&p); |
gtk_text_iter_backward_char(&p); |
| 554 |
gtk_text_buffer_place_cursor(current_text_buffer, &p); |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 555 |
} |
} |
| 556 |
static void line_forward_current_buffer() { |
static void line_forward_current_buffer() { |
| 557 |
GtkTextIter p; |
GtkTextIter p; |
| 558 |
gtk_text_buffer_get_iter_at_mark(current_text_buffer, &p, gtk_text_buffer_get_insert(current_text_buffer)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 559 |
gtk_text_view_forward_display_line(current_text_view, &p); |
gtk_text_view_forward_display_line(Shiki_CURRENT_TEXT_VIEW, &p); |
| 560 |
gtk_text_buffer_place_cursor(current_text_buffer, &p); |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 561 |
} |
} |
| 562 |
static void line_backward_current_buffer() { |
static void line_backward_current_buffer() { |
| 563 |
GtkTextIter p; |
GtkTextIter p; |
| 564 |
gtk_text_buffer_get_iter_at_mark(current_text_buffer,&p, gtk_text_buffer_get_insert(current_text_buffer)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 565 |
gtk_text_view_backward_display_line(current_text_view, &p); |
gtk_text_view_backward_display_line(Shiki_CURRENT_TEXT_VIEW, &p); |
| 566 |
gtk_text_buffer_place_cursor(current_text_buffer, &p); |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 567 |
} |
} |
| 568 |
|
|
| 569 |
/* キーが押された */ |
/* キーが押された */ |
| 571 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 572 |
|
|
| 573 |
/* 括弧の対応の強調を無効に */ |
/* 括弧の対応の強調を無効に */ |
| 574 |
gtk_text_buffer_get_start_iter(current_text_buffer, &start); |
gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &start); |
| 575 |
gtk_text_buffer_get_end_iter(current_text_buffer, &end); |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end); |
| 576 |
gtk_text_buffer_remove_tag_by_name(current_text_buffer, "parent_emphasis_background", &start, &end); |
gtk_text_buffer_remove_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "parent_emphasis_background", &start, &end); |
| 577 |
|
|
| 578 |
if(event->state & GDK_CONTROL_MASK) { |
if(event->state & GDK_CONTROL_MASK) { |
| 579 |
switch(event->keyval) { |
switch(event->keyval) { |
| 596 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 597 |
|
|
| 598 |
/* カーソルの位置を取得 */ |
/* カーソルの位置を取得 */ |
| 599 |
gtk_text_buffer_get_iter_at_mark(current_text_buffer, &end, gtk_text_buffer_get_insert(current_text_buffer)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 600 |
|
|
| 601 |
gtk_text_iter_backward_find_char(&end, is_kokka, NULL, NULL); |
gtk_text_iter_backward_find_char(&end, is_kokka, NULL, NULL); |
| 602 |
start = end; |
start = end; |
| 605 |
/* カーソル位置の前にある S 式を切り出す */ |
/* カーソル位置の前にある S 式を切り出す */ |
| 606 |
if(!search_sexp_string(&start)) return FALSE; |
if(!search_sexp_string(&start)) return FALSE; |
| 607 |
|
|
| 608 |
code = gtk_text_buffer_get_text(current_text_buffer, &start, &end, FALSE); |
code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE); |
| 609 |
gtk_text_buffer_insert(current_text_buffer, &end, "\n\n", -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1); |
| 610 |
gtk_text_buffer_insert(current_text_buffer, &end, eval_cstring_by_gauche(code), -1); |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, eval_cstring_by_gauche(code), -1); |
| 611 |
g_free(code); |
g_free(code); |
| 612 |
} |
} |
| 613 |
break; |
break; |
| 634 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 635 |
|
|
| 636 |
/* カーソルの位置を取得 */ |
/* カーソルの位置を取得 */ |
| 637 |
gtk_text_buffer_get_iter_at_mark(current_text_buffer, &end, gtk_text_buffer_get_insert(current_text_buffer)); |
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 638 |
|
|
| 639 |
start = end; |
start = end; |
| 640 |
gtk_text_iter_backward_char(&start); |
gtk_text_iter_backward_char(&start); |
| 642 |
/* カーソル位置の前にある S 式を切り出す */ |
/* カーソル位置の前にある S 式を切り出す */ |
| 643 |
if(!search_sexp_string(&start)) return FALSE; |
if(!search_sexp_string(&start)) return FALSE; |
| 644 |
|
|
| 645 |
gtk_text_buffer_apply_tag_by_name(current_text_buffer, "parent_emphasis_background", &start, &end); |
gtk_text_buffer_apply_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "parent_emphasis_background", &start, &end); |
| 646 |
} |
} |
| 647 |
|
|
| 648 |
/* 改行されるたびに,自動的に括弧のネストの深さに応じた数のスペース (インデント) が行頭に入る */ |
/* 改行されるたびに,自動的に括弧のネストの深さに応じた数のスペース (インデント) が行頭に入る */ |
| 649 |
if(event->keyval == GDK_Return) { |
if(event->keyval == GDK_Return) { |
| 650 |
gint indentWidth = get_parent_nest_level_at_cursor(current_text_buffer) * editor_indent_width; |
gint indentWidth = get_parent_nest_level_at_cursor(Shiki_CURRENT_TEXT_BUFFER) * editor_indent_width; |
| 651 |
gchar *indent = g_strnfill(indentWidth, ' '); |
gchar *indent = g_strnfill(indentWidth, ' '); |
| 652 |
gtk_text_buffer_insert_at_cursor(current_text_buffer, indent, -1); |
gtk_text_buffer_insert_at_cursor(Shiki_CURRENT_TEXT_BUFFER, indent, -1); |
| 653 |
g_free(indent); |
g_free(indent); |
| 654 |
} |
} |
| 655 |
|
|
| 656 |
/* C-x */ |
/* C-x */ |
| 657 |
if(event->keyval == GDK_x && event->state & GDK_CONTROL_MASK) { |
if(event->keyval == GDK_x && event->state & GDK_CONTROL_MASK) { |
| 658 |
controlx_pressed++; |
controlx_pressed++; |
| 659 |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-x -"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-x -"); |
| 660 |
} else if(event->state & GDK_CONTROL_MASK) { |
} else if(event->state & GDK_CONTROL_MASK) { |
| 661 |
|
|
| 662 |
if(controlx_pressed > 0) { |
if(controlx_pressed > 0) { |
| 663 |
switch(event->keyval) { |
switch(event->keyval) { |
| 664 |
case GDK_c :/* C-x C-c : 終了 */ |
case GDK_c :/* C-x C-c : 終了 */ |
| 665 |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-c"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-c"); |
| 666 |
{/* "delete-event" を発生させる.ウィンドウの × ボタンが押されたのと同じ */ |
{/* "delete-event" を発生させる.ウィンドウの × ボタンが押されたのと同じ */ |
| 667 |
GdkEvent ev; |
GdkEvent ev; |
| 668 |
|
|
| 669 |
ev.any.type = GDK_DELETE; |
ev.any.type = GDK_DELETE; |
| 670 |
ev.any.window = editor_window->window; |
ev.any.window = Shiki_EDITOR_WINDOW->window; |
| 671 |
ev.any.send_event = FALSE; |
ev.any.send_event = FALSE; |
| 672 |
gdk_event_put (&ev); |
gdk_event_put (&ev); |
| 673 |
} |
} |
| 674 |
break; |
break; |
| 675 |
|
|
| 676 |
case GDK_f : /* C-x C-f : ファイル開く */ |
case GDK_f : /* C-x C-f : ファイル開く */ |
| 677 |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-f"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-f"); |
| 678 |
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
| 679 |
break; |
break; |
| 680 |
|
|
| 681 |
case GDK_s : /* C-x C-s : ファイル保存 */ |
case GDK_s : /* C-x C-s : ファイル保存 */ |
| 682 |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-s"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-s"); |
| 683 |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
| 684 |
break; |
break; |
| 685 |
|
|
| 686 |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
| 687 |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "C-w"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-w"); |
| 688 |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
| 689 |
break; |
break; |
| 690 |
} |
} |
| 696 |
metakey_pressed = 0; |
metakey_pressed = 0; |
| 697 |
controlx_pressed = 0; |
controlx_pressed = 0; |
| 698 |
|
|
| 699 |
gtk_statusbar_push(GTK_STATUSBAR(statusbar), GPOINTER_TO_INT(contextid), "Quit"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "Quit"); |
| 700 |
break; |
break; |
| 701 |
} |
} |
| 702 |
|
|
| 705 |
} |
} |
| 706 |
|
|
| 707 |
/* エディタの編集画面の初期化 */ |
/* エディタの編集画面の初期化 */ |
| 708 |
static void editor_window_init() { |
static void shiki_editor_window_init() { |
| 709 |
GtkWidget *vbox, *toolbar, *notebook; |
GtkWidget *vbox, *toolbar, *notebook; |
| 710 |
GtkToolItem *icon; |
GtkToolItem *icon; |
| 711 |
GtkIconSize iconsize; |
GtkIconSize iconsize; |
| 716 |
gint contextid; |
gint contextid; |
| 717 |
|
|
| 718 |
/* 窓を作る */ |
/* 窓を作る */ |
| 719 |
editor_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
Shiki_EDITOR_WINDOW = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 720 |
g_signal_connect(G_OBJECT(editor_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
g_signal_connect(G_OBJECT(Shiki_EDITOR_WINDOW), "destroy", G_CALLBACK(gtk_main_quit), NULL); |
| 721 |
|
|
| 722 |
/* パッキングボックスを作る */ |
/* パッキングボックスを作る */ |
| 723 |
vbox = gtk_vbox_new(FALSE, 0); |
vbox = gtk_vbox_new(FALSE, 0); |
| 766 |
gtk_tool_item_set_tooltip(eicon, toolbar_tips, "選択範囲の S 式をロードします (load-region-lisp)", |
gtk_tool_item_set_tooltip(eicon, toolbar_tips, "選択範囲の S 式をロードします (load-region-lisp)", |
| 767 |
"Scheme (gauche) で評価できる S 式を評価します."); |
"Scheme (gauche) で評価できる S 式を評価します."); |
| 768 |
|
|
| 769 |
gtk_container_add(GTK_CONTAINER(editor_window), vbox); |
gtk_container_add(GTK_CONTAINER(Shiki_EDITOR_WINDOW), vbox); |
| 770 |
gtk_container_add(GTK_CONTAINER(vbox), notebook); |
gtk_container_add(GTK_CONTAINER(vbox), notebook); |
| 771 |
|
|
| 772 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-apply", iconsize), "append"); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-apply", iconsize), "append"); |
| 816 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 817 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "このアプリケーションについて", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "このアプリケーションについて", ""); |
| 818 |
|
|
| 819 |
gtk_box_pack_start(GTK_BOX(vbox), modeline_label = gtk_label_new("-E:** *scratch* (Gauche Interaction)--L1--All---------------------------------"), TRUE, TRUE, 0); |
gtk_box_pack_start(GTK_BOX(vbox), Shiki_EDITOR_MODELINE_LABEL = gtk_label_new("-E:** *scratch* (Gauche Interaction)--L1--All---------------------------------"), TRUE, TRUE, 0); |
| 820 |
|
|
| 821 |
/* C-x C-s などの状態を表示するステータスバーをウィンドウボトムに追加 */ |
/* C-x C-s などの状態を表示するステータスバーをウィンドウボトムに追加 */ |
| 822 |
statusbar = gtk_statusbar_new(); |
Shiki_EDITOR_STATUSBAR = gtk_statusbar_new(); |
| 823 |
gtk_box_pack_start(GTK_BOX(vbox), statusbar, TRUE, TRUE, 0); |
gtk_box_pack_start(GTK_BOX(vbox), Shiki_EDITOR_STATUSBAR, TRUE, TRUE, 0); |
| 824 |
contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), ""); |
contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), ""); |
| 825 |
|
|
| 826 |
/* キーバインドのハンドリングを登録 */ |
/* キーバインドのハンドリングを登録 */ |
| 827 |
g_signal_connect(G_OBJECT(notebook), "key-press-event", G_CALLBACK (signal_key_press_handler), GINT_TO_POINTER(contextid)); |
g_signal_connect(G_OBJECT(notebook), "key-press-event", G_CALLBACK (signal_key_press_handler), GINT_TO_POINTER(contextid)); |
| 831 |
gtk_notebook_prepend_page(GTK_NOTEBOOK(notebook), new_scrolled_text_buffer(), gtk_label_new("*scratch*")); |
gtk_notebook_prepend_page(GTK_NOTEBOOK(notebook), new_scrolled_text_buffer(), gtk_label_new("*scratch*")); |
| 832 |
|
|
| 833 |
gtk_widget_grab_focus(notebook); |
gtk_widget_grab_focus(notebook); |
| 834 |
gtk_widget_show_all(editor_window); |
gtk_widget_show_all(Shiki_EDITOR_WINDOW); |
| 835 |
} |
} |
| 836 |
|
|
| 837 |
int main(int argc, char *argv[]) { |
int main(int argc, char *argv[]) { |
| 839 |
gtk_set_locale(); |
gtk_set_locale(); |
| 840 |
gtk_init(&argc, &argv); |
gtk_init(&argc, &argv); |
| 841 |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
| 842 |
editor_window_init(); |
shiki_editor_window_init(); |
| 843 |
gtk_main(); |
gtk_main(); |
| 844 |
Scm_Exit(0); |
Scm_Exit(0); |
| 845 |
return 0; |
return 0; |