Develop and Download Open Source Software

Browse CVS Repository

Diff of /shiki/shiki/shiki.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.15 by aloha, Sat Nov 11 07:28:54 2006 UTC revision 1.16 by aloha, Sat Nov 11 08:52:57 2006 UTC
# Line 31  Line 31 
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);
# Line 47  static gchar *load_cstring_by_gauche(gch Line 67  static gchar *load_cstring_by_gauche(gch
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);
# Line 72  static void load_scheme_file_by_gauche(G Line 92  static void load_scheme_file_by_gauche(G
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  }  }
# Line 121  static void font_selection_ok(GtkWidget Line 141  static void font_selection_ok(GtkWidget
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  }  }
# Line 158  static gint get_current_line_number(GtkT Line 178  static gint get_current_line_number(GtkT
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    
# Line 214  static gchar *get_filename_from_dialog(c Line 234  static gchar *get_filename_from_dialog(c
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  /* ファイルを保存するイベントハンドラ */  /* ファイルを保存するイベントハンドラ */
# Line 238  static void save_file_as_from_notebook(G Line 258  static void save_file_as_from_notebook(G
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  }  }
# Line 286  gboolean not_yet_save_changes_really_qui Line 306  gboolean not_yet_save_changes_really_qui
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 ();
# Line 317  static GtkWidget *new_scrolled_text_buff Line 337  static GtkWidget *new_scrolled_text_buff
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    /* 様々な初期化処理 */    /* 様々な初期化処理 */
# Line 358  static void open_file_from_notebook(GtkN Line 378  static void open_file_from_notebook(GtkN
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
# Line 405  static void load_region_handler(GtkWidge Line 425  static void load_region_handler(GtkWidge
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  }  }
# Line 469  static gint get_parent_nest_level_at_cur Line 489  static gint get_parent_nest_level_at_cur
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  }  }
# Line 496  static void tabsborder_on_off(GtkButton Line 516  static void tabsborder_on_off(GtkButton
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    }    }
# Line 523  static void rotate_tab_position(GtkButto Line 543  static void rotate_tab_position(GtkButto
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  /* キーが押された */  /* キーが押された */
# Line 551  static gboolean signal_key_press_handler Line 571  static gboolean signal_key_press_handler
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) {
# Line 576  static gboolean signal_key_press_handler Line 596  static gboolean signal_key_press_handler
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;
# Line 585  static gboolean signal_key_press_handler Line 605  static gboolean signal_key_press_handler
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;
# Line 614  static gboolean signal_key_release_handl Line 634  static gboolean signal_key_release_handl
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);
# Line 622  static gboolean signal_key_release_handl Line 642  static gboolean signal_key_release_handl
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        }        }
# Line 676  static gboolean signal_key_release_handl Line 696  static gboolean signal_key_release_handl
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    
# Line 685  static gboolean signal_key_release_handl Line 705  static gboolean signal_key_release_handl
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;
# Line 696  static void editor_window_init() { Line 716  static void editor_window_init() {
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);
# Line 746  static void editor_window_init() { Line 766  static void editor_window_init() {
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");
# Line 796  static void editor_window_init() { Line 816  static void editor_window_init() {
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));
# Line 811  static void editor_window_init() { Line 831  static void editor_window_init() {
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[]) {
# Line 819  int main(int argc, char *argv[]) { Line 839  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;

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.16

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26