qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs dired.c qe.c qe.h


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs dired.c qe.c qe.h
Date: Mon, 13 Jan 2014 11:00:44 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        14/01/13 11:00:44

Modified files:
        .              : dired.c qe.c qe.h 

Log message:
        add BF_TRANSIENT buffer flag: buffer freed upon window close
        
        * closing a window with a 'transient' buffer frees unless it is viewed 
in another window

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/dired.c?cvsroot=qemacs&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.117&r2=1.118
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.117&r2=1.118

Patches:
Index: dired.c
===================================================================
RCS file: /sources/qemacs/qemacs/dired.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- dired.c     6 Jan 2014 09:40:20 -0000       1.33
+++ dired.c     13 Jan 2014 11:00:43 -0000      1.34
@@ -406,7 +406,7 @@
 static void dired_view_file(EditState *s, const char *filename)
 {
     EditBuffer *b;
-    EditState *e, *e1;
+    EditState *e;
 
     e = find_window(s, KEY_RIGHT);
     if (!e)
@@ -415,15 +415,9 @@
     /* CG: Should use the do_find_alternate to replace buffer */
     b = e->b;
     if ((b->flags & BF_PREVIEW) && !b->modified) {
+        /* free the buffer if no longer viewed */
+        b->flags |= BF_TRANSIENT;
         switch_to_buffer(e, NULL);
-        /* Before freeing buffer, make sure it isn't used by another window.
-         * This could happen if we split the view window and continue 
browsing. */
-        for (e1 = s->qe_state->first_window; e1 != NULL; e1 = e1->next_window) 
{
-            if (e1 != s && e1->b == b)
-                break;
-        }
-        if (!e1)
-            eb_free(b);
     }
 
     if (e) {
@@ -498,6 +492,9 @@
 
     list_mode.mode_init(s, saved_data);
 
+    /* XXX: File system charset should be detected automatically */
+    eb_set_charset(s->b, &charset_utf8);
+
     hs = s->mode_data;
     hs->sort_mode = DIRED_SORT_GROUP | DIRED_SORT_NAME;
 

Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -b -r1.117 -r1.118
--- qe.c        12 Jan 2014 01:39:10 -0000      1.117
+++ qe.c        13 Jan 2014 11:00:43 -0000      1.118
@@ -337,9 +337,9 @@
             for (i = 0; i < kd->nb_keys; i++) {
                 switch (kd->keys[i]) {
                 case KEY_CTRL('h'):
-                    kd->keys[i] = set ? KEY_META('h') : 127;
+                    kd->keys[i] = set ? KEY_META('h') : KEY_DEL;
                     break;
-                case 127:
+                case KEY_DEL:
                     if (set)
                         kd->keys[i] = KEY_CTRL('h');
                     break;
@@ -4528,7 +4528,7 @@
 
     b1 = s->b;
     if (b1) {
-        /* save old buffer data if no other window uses the buffer */
+        /* save mode data if no other window uses the buffer */
         for (e = qs->first_window; e != NULL; e = e->next_window) {
             if (e != s && e->b == b1)
                 break;
@@ -4536,12 +4536,21 @@
         if (e) {
             /* no need to save mode data */
             /* CG: bogus! e and s might have different modes */
+            /* Keep the buffer contents */
+            b1->flags &= ~BF_TRANSIENT;
+        } else {
+            /* if no more window uses the buffer:
+             * - if transient contents, free the buffer
+             * - otherwise, save the mode data in the buffer.
+             *   CG: Should free previous such data ?
+             */
+            if (b1->flags & BF_TRANSIENT) {
+                eb_free(b1);
+                b1 = NULL;
         } else {
-            /* if no more window uses the buffer, then save the data
-               in the buffer */
-            /* CG: Should free previous such data ? */
             b1->saved_data = s->mode->mode_save_data(s);
         }
+        }
         /* now we can close the mode */
         edit_set_mode(s, NULL);
     }
@@ -4885,7 +4894,7 @@
                buffer */
             if (!completion_popup_window) {
                 EditBuffer *b;
-                b = eb_new("*completion*", BF_SYSTEM | BF_UTF8);
+                b = eb_new("*completion*", BF_SYSTEM | BF_UTF8 | BF_TRANSIENT);
                 w1 = qs->screen->width;
                 h1 = qs->screen->height - qs->status_height;
                 w = (w1 * 3) / 4;
@@ -5031,7 +5040,6 @@
 void do_minibuffer_exit(EditState *s, int do_abort)
 {
     QEmacsState *qs = s->qe_state;
-    EditBuffer *b = s->b;
     StringArray *hist = minibuffer_history;
     static void (*cb)(void *opaque, char *buf);
     static void *opaque;
@@ -5052,9 +5060,7 @@
     /* remove completion popup if present */
     /* CG: assuming completion_popup_window != s */
     if (completion_popup_window) {
-        EditBuffer *b1 = completion_popup_window->b;
         edit_close(completion_popup_window);
-        eb_free(b1);
         do_refresh(s);
     }
 
@@ -5067,10 +5073,11 @@
             add_string(hist, buf);
     }
 
+    s->b->flags |= BF_TRANSIENT;
     edit_close(s);
-    eb_free(b);
+
     /* restore active window */
-    qs->active_window = minibuffer_saved_active;
+    qs->active_window = check_window(minibuffer_saved_active);
 
     /* force status update */
     //pstrcpy(qs->status_shadow, sizeof(qs->status_shadow), " ");
@@ -5182,18 +5189,9 @@
 void do_less_exit(EditState *s)
 {
     QEmacsState *qs = s->qe_state;
-    EditBuffer *b;
-    EditState *e;
 
-    /* CG: Should make buffer transient, free'd upon last window close? */
-    b = s->b;
-    for (e = qs->first_window; e != NULL; e = e->next_window) {
-        if (e != s && e->b == b)
-            break;
-    }
+    s->b->flags |= BF_TRANSIENT;
     edit_close(s);
-    if (!e)
-        eb_free(b);
 
     qs->active_window = check_window(popup_saved_active);
     popup_saved_active = NULL;

Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -b -r1.117 -r1.118
--- qe.h        12 Jan 2014 01:39:10 -0000      1.117
+++ qe.h        13 Jan 2014 11:00:44 -0000      1.118
@@ -713,6 +713,7 @@
 #define BF_DIRED     0x0100  /* buffer is interactive dired */
 #define BF_UTF8      0x0200  /* buffer charset is utf-8 */
 #define BF_RAW       0x0400  /* buffer charset is raw (same as latin1) */
+#define BF_TRANSIENT 0x0800  /* buffer is deleted upon window close */
 
 struct EditBuffer {
     Page *page_table;
@@ -1565,7 +1566,7 @@
 EditState *edit_new(EditBuffer *b,
                     int x1, int y1, int width, int height, int flags);
 void edit_detach(EditState *s);
-void edit_append(EditState *s, EditState *e);
+EditState *check_window(EditState *s);
 EditState *edit_find(EditBuffer *b);
 void do_refresh(EditState *s);
 // should take direction argument



reply via email to

[Prev in Thread] Current Thread [Next in Thread]