| 250 |
|
|
| 251 |
/* ノートブックにタブとページ (バッファ) を追加 */ |
/* ノートブックにタブとページ (バッファ) を追加 */ |
| 252 |
GtkTextBuffer *Shiki_new_buffer_create(gchar *filename) { |
GtkTextBuffer *Shiki_new_buffer_create(gchar *filename) { |
| 253 |
|
|
| 254 |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
| 255 |
/* ShikiBuffer には,タブに関連する情報が全て保持されている */ |
/* ShikiBuffer には,タブに関連する情報が全て保持されている */ |
| 256 |
ShikiBuffer *tabinfo = g_malloc(sizeof(ShikiBuffer)); |
ShikiBuffer *tabinfo = g_malloc(sizeof(ShikiBuffer)); |
| 261 |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 10); |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 10); |
| 262 |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
| 263 |
|
|
| 264 |
|
/* バッファ名を一意にする */ |
| 265 |
|
if(g_hash_table_lookup(Shiki_EDITOR_BUFNAME_HASH, tabinfo->name) == NULL) |
| 266 |
|
g_hash_table_insert(Shiki_EDITOR_BUFNAME_HASH, tabinfo->name, GUINT_TO_POINTER(TRUE)); |
| 267 |
|
else { |
| 268 |
|
gint i = 1; |
| 269 |
|
gchar *base = tabinfo->name; |
| 270 |
|
while(TRUE) { |
| 271 |
|
tabinfo->name = g_strdup_printf ("%s<%d>", base, i); |
| 272 |
|
if(g_hash_table_lookup(Shiki_EDITOR_BUFNAME_HASH, tabinfo->name) == NULL) { |
| 273 |
|
g_hash_table_insert(Shiki_EDITOR_BUFNAME_HASH, tabinfo->name, GUINT_TO_POINTER(TRUE)); |
| 274 |
|
g_free(base); |
| 275 |
|
break; |
| 276 |
|
} |
| 277 |
|
g_free(tabinfo->name); |
| 278 |
|
i++; |
| 279 |
|
} |
| 280 |
|
} |
| 281 |
|
|
| 282 |
|
|
| 283 |
/* 環境が GC されるのを防ぐ */ |
/* 環境が GC されるのを防ぐ */ |
| 284 |
Scm_Define(SCM_CURRENT_MODULE(), SCM_SYMBOL(SCM_INTERN(tabinfo->name)), tabinfo->env); |
Scm_Define(SCM_CURRENT_MODULE(), SCM_SYMBOL(SCM_INTERN(tabinfo->name)), tabinfo->env); |
| 285 |
|
|
| 398 |
ShikiBuffer *tabInfo = bufListElem->data; |
ShikiBuffer *tabInfo = bufListElem->data; |
| 399 |
gint bufNum = g_list_position(Shiki_EDITOR_BUFFER_LIST, bufListElem); |
gint bufNum = g_list_position(Shiki_EDITOR_BUFFER_LIST, bufListElem); |
| 400 |
|
|
| 401 |
|
/* g_print("%d page delete.\n", bufNum); */ |
| 402 |
|
|
| 403 |
|
g_print("buffer list length = %d\n", g_list_length(Shiki_EDITOR_BUFFER_LIST)); |
| 404 |
/* タブが 1 つしか残っていなかったら消させない */ |
/* タブが 1 つしか残っていなかったら消させない */ |
| 405 |
if(g_list_length(Shiki_EDITOR_BUFFER_LIST) == 1) |
if(g_list_length(Shiki_EDITOR_BUFFER_LIST) == 1) |
| 406 |
return; |
return; |
| 408 |
/* Scheme 世界の束縛を絶つ */ |
/* Scheme 世界の束縛を絶つ */ |
| 409 |
Scm_Define(SCM_CURRENT_MODULE(), SCM_SYMBOL(SCM_INTERN(tabInfo->name)), SCM_FALSE); |
Scm_Define(SCM_CURRENT_MODULE(), SCM_SYMBOL(SCM_INTERN(tabInfo->name)), SCM_FALSE); |
| 410 |
|
|
| 411 |
|
/* バッファ名を削除 */ |
| 412 |
|
g_hash_table_remove(Shiki_EDITOR_BUFNAME_HASH, tabInfo->name); |
| 413 |
/* デリートハンドラをエディタトップレベルのウィジットから取り除く */ |
/* デリートハンドラをエディタトップレベルのウィジットから取り除く */ |
| 414 |
g_signal_handler_disconnect(Shiki_EDITOR_WINDOW, tabInfo->delete_handler_id); |
g_signal_handler_disconnect(Shiki_EDITOR_WINDOW, tabInfo->delete_handler_id); |
| 415 |
Shiki_EDITOR_BUFFER_LIST = g_list_delete_link(Shiki_EDITOR_BUFFER_LIST, bufListElem); |
Shiki_EDITOR_BUFFER_LIST = g_list_delete_link(Shiki_EDITOR_BUFFER_LIST, bufListElem); |
| 416 |
gtk_widget_destroy(GTK_WIDGET(tabInfo->tabpage)); |
|
| 417 |
|
/* double delete bug ! */ |
| 418 |
|
/* gtk_widget_destroy(GTK_WIDGET(tabInfo->tabpage)); */ |
| 419 |
g_free(tabInfo->tabpage_label); |
g_free(tabInfo->tabpage_label); |
| 420 |
g_free(tabInfo->name); |
g_free(tabInfo->name); |
| 421 |
g_free(tabInfo->filename); |
g_free(tabInfo->filename); |
| 423 |
gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, bufNum); |
gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, bufNum); |
| 424 |
/* 強制再描画 */ |
/* 強制再描画 */ |
| 425 |
gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 426 |
|
gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, bufNum > 0 ? bufNum-1 : 0); |
| 427 |
} |
} |
| 428 |
|
|
| 429 |
GtkTextBuffer *Shiki_find_buffer(const gchar *name) { |
GtkTextBuffer *Shiki_find_buffer(const gchar *name) { |