Develop and Download Open Source Software

Browse CVS Repository

Diff of /shiki/shiki/buffer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.17 by aloha, Sat Feb 3 11:23:38 2007 UTC revision 1.18 by aloha, Sun Feb 18 09:59:14 2007 UTC
# Line 250  static void cursor_moved_handler() { Line 250  static void cursor_moved_handler() {
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));
# Line 260  GtkTextBuffer *Shiki_new_buffer_create(g Line 261  GtkTextBuffer *Shiki_new_buffer_create(g
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    
# Line 378  void Shiki_delete_buffer(GtkTextBuffer * Line 398  void Shiki_delete_buffer(GtkTextBuffer *
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;
# Line 385  void Shiki_delete_buffer(GtkTextBuffer * Line 408  void Shiki_delete_buffer(GtkTextBuffer *
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);
# Line 396  void Shiki_delete_buffer(GtkTextBuffer * Line 423  void Shiki_delete_buffer(GtkTextBuffer *
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) {

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.18

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