[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs dired.c qe.c qe.h,
Charlie Gordon <=