| 335 |
/* タブが切り替わる時のイベントハンドリング */ |
/* タブが切り替わる時のイベントハンドリング */ |
| 336 |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) { |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) { |
| 337 |
/* タブに対応する情報が格納された構造体を切替える */ |
/* タブに対応する情報が格納された構造体を切替える */ |
| 338 |
Shiki_CURRENT_TAB_INFO = (ShikiBuffer *)g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, pagenum); |
Shiki_CURRENT_TAB_INFO = (ShikiBuffer *)g_list_nth_data(Shiki_EDITOR_BUFFER_LIST, pagenum); |
| 339 |
|
|
| 340 |
/* 現在のタブ番号を切替える */ |
/* 現在のタブ番号を切替える */ |
| 341 |
Shiki_CURRENT_TAB_NUM = pagenum; |
Shiki_CURRENT_TAB_NUM = pagenum; |
| 482 |
return FALSE; |
return FALSE; |
| 483 |
} |
} |
| 484 |
|
|
| 485 |
|
ScmClass *ShikiBufferClass; |
| 486 |
|
static gint compBuffer(gconstpointer a, gconstpointer b) { |
| 487 |
|
return ((ShikiBuffer *)a)->text_buffer == b ? 0 : 1; |
| 488 |
|
} |
| 489 |
|
|
| 490 |
|
static void buffer_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx) { |
| 491 |
|
GtkTextBuffer *b = SHIKI_BUFFER_UNBOX(obj); |
| 492 |
|
GList *l = g_list_find_custom(Shiki_EDITOR_BUFFER_LIST, b, compBuffer); |
| 493 |
|
if(l) |
| 494 |
|
Scm_Printf(out, "#<buffer: %s>", ((ShikiBuffer *)(l->data))->name); |
| 495 |
|
else |
| 496 |
|
Scm_Printf(out, "#<deleted buffer: %p>", b); |
| 497 |
|
} |
| 498 |
|
|
| 499 |
|
static void buffer_cleanup(ScmObj obj) |
| 500 |
|
{ |
| 501 |
|
g_object_unref(SHIKI_BUFFER_UNBOX(obj)); |
| 502 |
|
} |
| 503 |
|
|
| 504 |
/* ノートブックにタブとページ (バッファ) を追加 */ |
/* ノートブックにタブとページ (バッファ) を追加 */ |
| 505 |
static void get_buffer_create(gchar *filename) { |
static void get_buffer_create(gchar *filename) { |
| 506 |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
| 512 |
tabinfo->name = g_path_get_basename(filename); |
tabinfo->name = g_path_get_basename(filename); |
| 513 |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 7); |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 7); |
| 514 |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
| 515 |
|
|
| 516 |
|
ShikiBufferClass = Scm_MakeForeignPointerClass(SCM_MODULE(tabinfo->env), |
| 517 |
|
"<buffer>", buffer_print, buffer_cleanup, |
| 518 |
|
SCM_FOREIGN_POINTER_KEEP_IDENTITY |
| 519 |
|
| |
| 520 |
|
SCM_FOREIGN_POINTER_MAP_NULL); |
| 521 |
|
|
| 522 |
/* xyzzy lisp 関数を登録 */ |
/* xyzzy lisp 関数を登録 */ |
| 523 |
Scm_Init_xyzzylisp(SCM_MODULE(tabinfo->env)); |
Scm_Init_xyzzylisp(SCM_MODULE(tabinfo->env)); |
| 558 |
/* タブをノートブックに登録する */ |
/* タブをノートブックに登録する */ |
| 559 |
gtk_notebook_append_page(Shiki_EDITOR_NOTEBOOK, GTK_WIDGET(tabinfo->tabpage), gtk_label_new(tabinfo->tabpage_label)); |
gtk_notebook_append_page(Shiki_EDITOR_NOTEBOOK, GTK_WIDGET(tabinfo->tabpage), gtk_label_new(tabinfo->tabpage_label)); |
| 560 |
/* 対応するタブ情報を大域テーブルに保存しておく */ |
/* 対応するタブ情報を大域テーブルに保存しておく */ |
| 561 |
Shiki_EDITOR_TAB_INFO_LIST = g_list_append(Shiki_EDITOR_TAB_INFO_LIST, tabinfo); |
Shiki_EDITOR_BUFFER_LIST = g_list_append(Shiki_EDITOR_BUFFER_LIST, tabinfo); |
| 562 |
|
|
| 563 |
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 564 |
/* 開いたページに移動する */ |
/* 開いたページに移動する */ |
| 565 |
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_BUFFER_LIST) - 1); |
| 566 |
} |
} |
| 567 |
|
|
| 568 |
static void append_default_tabpage_handler() { |
static void append_default_tabpage_handler() { |
| 572 |
/* ノートブックからタブとページ (バッファ) を削除 */ |
/* ノートブックからタブとページ (バッファ) を削除 */ |
| 573 |
static void remove_tabpage() { |
static void remove_tabpage() { |
| 574 |
/* タブが 1 つしか残っていなかったら消させない */ |
/* タブが 1 つしか残っていなかったら消させない */ |
| 575 |
if(g_list_length(Shiki_EDITOR_TAB_INFO_LIST) == 1) |
if(g_list_length(Shiki_EDITOR_BUFFER_LIST) == 1) |
| 576 |
return; |
return; |
| 577 |
if(!not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER)) { |
if(!not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER)) { |
| 578 |
/* デリートハンドラをエディタトップレベルのウィジットから取り除く */ |
/* デリートハンドラをエディタトップレベルのウィジットから取り除く */ |
| 583 |
g_free(Shiki_CURRENT_TAB_TITLE); |
g_free(Shiki_CURRENT_TAB_TITLE); |
| 584 |
g_free(Shiki_CURRENT_BASENAME); |
g_free(Shiki_CURRENT_BASENAME); |
| 585 |
g_free(Shiki_CURRENT_FILENAME); |
g_free(Shiki_CURRENT_FILENAME); |
| 586 |
Shiki_EDITOR_TAB_INFO_LIST = g_list_delete_link(Shiki_EDITOR_TAB_INFO_LIST, g_list_nth(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM)); |
Shiki_EDITOR_BUFFER_LIST = g_list_delete_link(Shiki_EDITOR_BUFFER_LIST, g_list_nth(Shiki_EDITOR_BUFFER_LIST, Shiki_CURRENT_TAB_NUM)); |
| 587 |
g_free(Shiki_CURRENT_TAB_INFO); |
g_free(Shiki_CURRENT_TAB_INFO); |
| 588 |
|
|
| 589 |
/* カレントのタブ情報を更新 */ |
/* カレントのタブ情報を更新 */ |
| 590 |
Shiki_CURRENT_TAB_INFO = g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM); |
Shiki_CURRENT_TAB_INFO = g_list_nth_data(Shiki_EDITOR_BUFFER_LIST, Shiki_CURRENT_TAB_NUM); |
| 591 |
gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, Shiki_CURRENT_TAB_NUM); |
gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, Shiki_CURRENT_TAB_NUM); |
| 592 |
/* ウィジットを強制的に再描画 */ |
/* ウィジットを強制的に再描画 */ |
| 593 |
gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |