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.32 by aloha, Thu Nov 16 08:52:02 2006 UTC revision 1.33 by aloha, Thu Nov 16 16:15:34 2006 UTC
# Line 91  struct { Line 91  struct {
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();
# Line 102  static gchar *get_filename_from_dialog(c Line 105  static gchar *get_filename_from_dialog(c
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);
# Line 199  static void switch_tabpage_handler(GtkNo Line 203  static void switch_tabpage_handler(GtkNo
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;
# Line 273  static gboolean signal_key_press_handler Line 302  static gboolean signal_key_press_handler
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 : タブを閉じる */
# Line 338  static void append_tabpage(gchar *filena Line 345  static void append_tabpage(gchar *filena
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);
# Line 347  static void append_tabpage(gchar *filena Line 354  static void append_tabpage(gchar *filena
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);
# Line 362  static void append_tabpage(gchar *filena Line 369  static void append_tabpage(gchar *filena
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 つしか残っていなかったら消させない */
# Line 411  static void load_scheme_file_by_gauche() Line 422  static void load_scheme_file_by_gauche()
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    
# Line 557  static void save_file() { Line 568  static void save_file() {
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    
# Line 643  static void open_file(gchar *filename) { Line 654  static void open_file(gchar *filename) {
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    
# Line 733  static gboolean is_kokka(gunichar ch, gp Line 744  static gboolean is_kokka(gunichar ch, gp
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    
# Line 750  static gboolean search_sexp(GtkTextIter Line 761  static gboolean search_sexp(GtkTextIter
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))
# Line 775  static gboolean search_last_sexp(GtkText Line 786  static gboolean search_last_sexp(GtkText
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;
# Line 965  static void open_online_help() { Line 976  static void open_online_help() {
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    /* カーソル位置を先頭に */    /* カーソル位置を先頭に */
# Line 1073  static void shiki_editor_window_init(int Line 1089  static void shiki_editor_window_init(int
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));

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.33

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