| 41 |
static GtkWidget *statusbar; |
static GtkWidget *statusbar; |
| 42 |
static GtkWidget *modeline_label; |
static GtkWidget *modeline_label; |
| 43 |
|
|
| 44 |
|
/* gauche を起動して文字列をロード */ |
| 45 |
|
static gchar *load_cstring_by_gauche(gchar *s) { |
| 46 |
|
gchar *msg; |
| 47 |
|
|
| 48 |
|
ScmObj result, error; |
| 49 |
|
/* 入力文字列ポートを開く */ |
| 50 |
|
ScmObj is = Scm_MakeInputStringPort(SCM_STRING(SCM_MAKE_STR(s)), TRUE); |
| 51 |
|
/* 出力文字列ポート開く */ |
| 52 |
|
ScmObj os = Scm_MakeOutputStringPort(TRUE); |
| 53 |
|
|
| 54 |
|
Scm_Define(Scm_UserModule(), SCM_SYMBOL(SCM_INTERN("*input*")), is); |
| 55 |
|
Scm_Define(Scm_UserModule(), SCM_SYMBOL(SCM_INTERN("*error*")), SCM_FALSE); |
| 56 |
|
/* Scheme のレベルでエラーハンドリングをしつつ,ポートから順番に S 式を読み込み,評価していく.コンパイルエラーなどは *error* に捕捉される */ |
| 57 |
|
result = Scm_EvalCString("(guard (e (else (set! *error* e) #f)) (eval (load-from-port *input*) (current-module)))", SCM_OBJ(Scm_UserModule())); |
| 58 |
|
|
| 59 |
|
error = Scm_GlobalVariableRef(Scm_UserModule(), SCM_SYMBOL(SCM_INTERN("*error*")), 0); |
| 60 |
|
|
| 61 |
|
/* 文字列を評価した結果をポートに書き込む */ |
| 62 |
|
if (!SCM_FALSEP(error)) |
| 63 |
|
Scm_Write(error, os, SCM_WRITE_DISPLAY); |
| 64 |
|
else |
| 65 |
|
Scm_Write(result, os, SCM_WRITE_DISPLAY); |
| 66 |
|
|
| 67 |
|
msg = Scm_GetString(SCM_STRING(Scm_GetOutputString(SCM_PORT(os)))); |
| 68 |
|
/* ポート閉じる */ |
| 69 |
|
Scm_ClosePort(SCM_PORT(is)); |
| 70 |
|
Scm_ClosePort(SCM_PORT(os)); |
| 71 |
|
|
| 72 |
|
return msg; |
| 73 |
|
} |
| 74 |
|
|
| 75 |
static void font_selection_ok(GtkWidget *button, GtkWidget *font_dialog) { |
static void font_selection_ok(GtkWidget *button, GtkWidget *font_dialog) { |
| 76 |
gchar *font_name = gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG (font_dialog)); |
gchar *font_name = gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG (font_dialog)); |
| 77 |
if(font_name) { |
if(font_name) { |
| 356 |
return msg; |
return msg; |
| 357 |
} |
} |
| 358 |
|
|
| 359 |
/* 緑ボタンのハンドリング.バッファの選択されている S 式を評価 */ |
/* 緑ボタンのハンドリング.バッファの選択範囲の S 式をロード (逐次評価) */ |
| 360 |
static void buffer_exec_handler(GtkWidget *widget, GtkWidget *notebook) { |
static void buffer_exec_handler(GtkWidget *widget, GtkWidget *notebook) { |
| 361 |
|
|
| 362 |
GtkTextIter start, end, p; |
GtkTextIter start, end, p; |
| 367 |
/* マウスで選択されている範囲の文字列を取得 */ |
/* マウスで選択されている範囲の文字列を取得 */ |
| 368 |
if(gtk_text_buffer_get_selection_bounds(current_text_buffer, &start, &end)) { |
if(gtk_text_buffer_get_selection_bounds(current_text_buffer, &start, &end)) { |
| 369 |
code = gtk_text_buffer_get_text(current_text_buffer, &start, &end, FALSE); |
code = gtk_text_buffer_get_text(current_text_buffer, &start, &end, FALSE); |
| 370 |
gtk_text_buffer_insert(current_text_buffer, &p, eval_cstring_by_gauche(code), -1); |
gtk_text_buffer_insert(current_text_buffer, &p, load_cstring_by_gauche(code), -1); |
| 371 |
g_free(code); |
g_free(code); |
| 372 |
} |
} |
| 373 |
} |
} |