| 63 |
static gboolean save_text_buffer(const gchar *filename, GtkTextBuffer *buffer); |
static gboolean save_text_buffer(const gchar *filename, GtkTextBuffer *buffer); |
| 64 |
static void clear_current_buffer_handler(); |
static void clear_current_buffer_handler(); |
| 65 |
|
|
| 66 |
|
|
| 67 |
|
/* FIXME !!!!!! : なぜかロードすると SEGV で落ちる !!!!!!!!!!!!!!!!!!!!!! */ |
| 68 |
|
|
| 69 |
|
|
| 70 |
/* Gauche と S 式操作やインデント・キーワードハイライティング関連 */ |
/* Gauche と S 式操作やインデント・キーワードハイライティング関連 */ |
| 71 |
static gchar *load_cstring_by_gauche(gchar *s); |
static gchar *load_cstring_by_gauche(gchar *s); |
| 72 |
static void load_buffer_by_gauche(); |
static void load_buffer_by_gauche(); |
| 370 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(get_all_buffer_contents(Shiki_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); |
| 371 |
} |
} |
| 372 |
|
|
| 373 |
|
|
| 374 |
|
|
| 375 |
/* ファイルをロード */ |
/* ファイルをロード */ |
| 376 |
static void load_scheme_file_by_gauche() { |
static void load_scheme_file_by_gauche() { |
|
gchar *contents, *text = NULL; |
|
|
gsize br, bw, len; |
|
|
GError *err = NULL; |
|
| 377 |
const gchar *filename = Shiki_file_name_dialog("File Selection"); |
const gchar *filename = Shiki_file_name_dialog("File Selection"); |
|
GtkTextIter p; |
|
| 378 |
|
|
| 379 |
if(!filename) return; |
if(!filename) return; |
| 380 |
|
Shiki_load_file(filename); |
| 381 |
|
} |
| 382 |
|
|
| 383 |
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
static gint compBuffer(gconstpointer a, gconstpointer b) { |
| 384 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n\n", -1); |
return ((ShikiBuffer *)a)->text_buffer == b ? 0 : b - a; |
| 385 |
|
} |
| 386 |
|
|
| 387 |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
/* バッファに関連付けられたファイルをリロード.環境はクリアされる */ |
| 388 |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
static void reload_buffer() { |
| 389 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(text), -1); |
#if 0 |
| 390 |
else |
Shiki_CURRENT_BUFFER_ENV = Scm_MakeModule(NULL, FALSE); |
| 391 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, load_cstring_by_gauche(contents), -1); |
|
| 392 |
} |
/* xyzzy lisp 関数を登録 */ |
| 393 |
g_free(text); g_free(contents); |
Scm_Init_xyzzylisp(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV)); |
| 394 |
|
Scm_EvalCString("(set! *mode-line-format* (lambda () (format #f \"--~A- ~A (Gauche Interaction) [GtkDefault (utf8)] L~S:~S \" (if (buffer-modified-p) \"--\" \"**\") (buffer-name (selected-buffer)) (current-line-number) (current-column))))", Shiki_CURRENT_BUFFER_ENV); |
| 395 |
|
#endif |
| 396 |
|
|
| 397 |
|
Shiki_load_file(Shiki_CURRENT_FILENAME); |
| 398 |
} |
} |
| 399 |
|
|
| 400 |
|
|
| 401 |
/* gauche を起動して文字列をロード */ |
/* gauche を起動して文字列をロード */ |
| 402 |
static gchar *load_cstring_by_gauche(gchar *s) { |
static gchar *load_cstring_by_gauche(gchar *s) { |
| 403 |
gchar *msg; |
gchar *msg; |
| 404 |
|
|
| 405 |
|
g_print("%s\n", s); |
| 406 |
ScmObj result, error; |
ScmObj result, error; |
| 407 |
/* 入力文字列ポートを開く */ |
/* 入力文字列ポートを開く */ |
| 408 |
ScmObj is = Scm_MakeInputStringPort(SCM_STRING(SCM_MAKE_STR_COPYING(s)), TRUE); |
ScmObj is = Scm_MakeInputStringPort(SCM_STRING(SCM_MAKE_STR_COPYING(s)), TRUE); |
| 467 |
gtk_widget_destroy(GTK_WIDGET(about)); |
gtk_widget_destroy(GTK_WIDGET(about)); |
| 468 |
} |
} |
| 469 |
|
|
| 470 |
/* ダミー */ |
#if 0 |
| 471 |
|
/* 開発途中に使用したダミーイベントハンドラー */ |
| 472 |
static void dummy_handler() { |
static void dummy_handler() { |
| 473 |
GtkWidget *dummy = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW), |
GtkWidget *dummy = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW), |
| 474 |
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, |
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, |
| 476 |
gtk_dialog_run(GTK_DIALOG(dummy)); |
gtk_dialog_run(GTK_DIALOG(dummy)); |
| 477 |
gtk_widget_destroy(dummy); |
gtk_widget_destroy(dummy); |
| 478 |
} |
} |
| 479 |
|
#endif |
| 480 |
|
|
| 481 |
/* テキストバッファから全ての文字列を取り出す */ |
/* テキストバッファから全ての文字列を取り出す */ |
| 482 |
static gchar* get_all_buffer_contents(GtkTextBuffer *buffer) { |
static gchar* get_all_buffer_contents(GtkTextBuffer *buffer) { |
| 678 |
"[フロッピーディスクのアイコン] バッファを保存 (C-x C-s)\n" |
"[フロッピーディスクのアイコン] バッファを保存 (C-x C-s)\n" |
| 679 |
"[フロッピーとえんぴつのアイコン] バッファを別名保存 (C-x C-w)\n" |
"[フロッピーとえんぴつのアイコン] バッファを別名保存 (C-x C-w)\n" |
| 680 |
"[ギアのアイコン] 選択領域を gauche にロード\n" |
"[ギアのアイコン] 選択領域を gauche にロード\n" |
|
"[マーキング (ちょん) のアイコン] タブの on/off\n" |
|
|
"[工具 (スパナ) のアイコン] タブの位置の調整\n" |
|
| 681 |
"[新規アイコン] 新規バッファを開く (C-t)\n" |
"[新規アイコン] 新規バッファを開く (C-t)\n" |
| 682 |
"[左向き矢印アイコン] やり直し (C-_)\n" |
"[左向き矢印アイコン] やり直し (Undo) (C-\\)\n" |
| 683 |
|
"[右向き矢印アイコン] 再試行 (Redo) (C-_)\n" |
| 684 |
|
"[ルーペ] 検索\n" |
| 685 |
|
"[ルーペとペン] 置換\n" |
| 686 |
"[ゴミ箱アイコン] バッファをクリア\n" |
"[ゴミ箱アイコン] バッファをクリア\n" |
| 687 |
"\n" |
"\n" |
| 688 |
"(注 : 通常,バッファの内容が失われる恐れがあるときには警告しますが,クリアだけは警告をしません.もし間違って消してしまった場合には慌てずに Undo してください)\n" |
"(注 : 通常,バッファの内容が失われる恐れがあるときには警告しますが,クリアだけは警告をしません.もし間違って消してしまった場合には慌てずに Undo してください)\n" |
| 691 |
"[A アイコン] フォントの選択\n" |
"[A アイコン] フォントの選択\n" |
| 692 |
"[顔みたいなアイコン] Scheme ファイルのロード\n" |
"[顔みたいなアイコン] Scheme ファイルのロード\n" |
| 693 |
"[緑っぽい,変換アイコン] バッファの内容を全てロード\n" |
"[緑っぽい,変換アイコン] バッファの内容を全てロード\n" |
| 694 |
|
"[Abc] シンタックスハイライティング\n" |
| 695 |
"[ヘルプ (?) アイコン] このヘルプ画面を表示します\n" |
"[ヘルプ (?) アイコン] このヘルプ画面を表示します\n" |
| 696 |
|
"[A] フォントの選択\n" |
| 697 |
|
"[マーキング (ちょん) のアイコン] タブの on/off\n" |
| 698 |
|
"[工具 (スパナ) のアイコン] タブの位置の調整\n" |
| 699 |
"[info アイコン] このアプリケーションについての情報\n" |
"[info アイコン] このアプリケーションについての情報\n" |
| 700 |
"\n" |
"\n" |
| 701 |
"C-f : → に移動 (forward)\n" |
"C-f : → に移動 (forward)\n" |
| 827 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 828 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "置換", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "置換", ""); |
| 829 |
|
|
|
/* XXX : TODO */ |
|
| 830 |
icon = gtk_tool_button_new(gtk_image_new_from_stock (GTK_STOCK_REFRESH, iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock (GTK_STOCK_REFRESH, iconsize), ""); |
| 831 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(dummy_handler), NULL); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(reload_buffer), NULL); |
| 832 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 833 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "リロード", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "リロード", "環境はクリアされます"); |
|
|
|
|
/* TODO ここまで */ |
|
| 834 |
|
|
| 835 |
icon = gtk_tool_button_new(gtk_image_new_from_stock (GTK_STOCK_DELETE, iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock (GTK_STOCK_DELETE, iconsize), ""); |
| 836 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(clear_current_buffer_handler), NULL); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(clear_current_buffer_handler), NULL); |
| 918 |
gtk_widget_show_all(Shiki_EDITOR_WINDOW); |
gtk_widget_show_all(Shiki_EDITOR_WINDOW); |
| 919 |
} |
} |
| 920 |
|
|
| 921 |
|
ScmClass *ShikiBufferClass = NULL; |
| 922 |
|
|
| 923 |
|
static void buffer_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx) { |
| 924 |
|
GtkTextBuffer *b = SHIKI_BUFFER_UNBOX(obj); |
| 925 |
|
GList *l = g_list_find_custom(Shiki_EDITOR_BUFFER_LIST, b, compBuffer); |
| 926 |
|
if(l) |
| 927 |
|
Scm_Printf(out, "#<buffer: %s>", ((ShikiBuffer *)(l->data))->name); |
| 928 |
|
else |
| 929 |
|
Scm_Printf(out, "#<deleted buffer: %p>", b); |
| 930 |
|
} |
| 931 |
|
|
| 932 |
|
static void buffer_cleanup(ScmObj obj) |
| 933 |
|
{ |
| 934 |
|
g_object_unref(SHIKI_BUFFER_UNBOX(obj)); |
| 935 |
|
} |
| 936 |
|
|
| 937 |
int main(int argc, char *argv[]) { |
int main(int argc, char *argv[]) { |
| 938 |
/* 初期化してメインループへ */ |
/* 初期化してメインループへ */ |
| 939 |
Shiki_EDITOR_DEFAULT_LOCALE = g_locale_to_utf8(gtk_set_locale(), -1, NULL, NULL, NULL); |
Shiki_EDITOR_DEFAULT_LOCALE = g_locale_to_utf8(gtk_set_locale(), -1, NULL, NULL, NULL); |
| 940 |
gtk_init(&argc, &argv); |
gtk_init(&argc, &argv); |
| 941 |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
| 942 |
Scm_Load("gauche-init.scm", 0); |
Scm_Load("gauche-init.scm", 0); |
| 943 |
|
ShikiBufferClass = Scm_MakeForeignPointerClass(SCM_CURRENT_MODULE(), |
| 944 |
|
"<buffer>", buffer_print, buffer_cleanup, |
| 945 |
|
SCM_FOREIGN_POINTER_KEEP_IDENTITY |
| 946 |
|
| |
| 947 |
|
SCM_FOREIGN_POINTER_MAP_NULL); |
| 948 |
Shiki_editor_window_init(argc, argv); |
Shiki_editor_window_init(argc, argv); |
| 949 |
gtk_main(); |
gtk_main(); |
| 950 |
Scm_Exit(0); |
Scm_Exit(0); |