[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs hex.c qe.c qe.h shell.c unihex.c
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs hex.c qe.c qe.h shell.c unihex.c |
Date: |
Wed, 26 Aug 2015 22:51:25 +0000 |
CVSROOT: /sources/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 15/08/26 22:51:25
Modified files:
. : hex.c qe.c qe.h shell.c unihex.c
Log message:
modes: simplified mode setting and saving
- get rid of ModeSavedData structures
- save window data upon buffer change and mode setting
- make generic_mode_close() and generic_mode_init() local
- simplify edit_set_mode() and switch_to_buffer()
- reset w.insert, w.hex_mode, w.hex_nibble, w.unihex_mode, w.wrap
to mode specific default values upon mode change.
- split do_set_next_mode() command into qe_set_next_mode() lower level
function with an extra status parameter report new mode.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/hex.c?cvsroot=qemacs&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.208&r2=1.209
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.205&r2=1.206
http://cvs.savannah.gnu.org/viewcvs/qemacs/shell.c?cvsroot=qemacs&r1=1.99&r2=1.100
http://cvs.savannah.gnu.org/viewcvs/qemacs/unihex.c?cvsroot=qemacs&r1=1.29&r2=1.30
Patches:
Index: hex.c
===================================================================
RCS file: /sources/qemacs/qemacs/hex.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- hex.c 13 Aug 2015 23:26:59 -0000 1.44
+++ hex.c 26 Aug 2015 22:51:24 -0000 1.45
@@ -175,8 +175,9 @@
s->dump_width &= ~15;
if (s->dump_width < 16)
s->dump_width = 16;
- s->insert = 0;
s->hex_mode = 0;
+ s->unihex_mode = 0;
+ s->insert = 0;
s->wrap = WRAP_TRUNCATE;
}
return 0;
@@ -187,8 +188,8 @@
if (s) {
s->dump_width = 16;
s->hex_mode = 1;
- s->unihex_mode = 0;
s->hex_nibble = 0;
+ s->unihex_mode = 0;
s->insert = 0;
s->wrap = WRAP_TRUNCATE;
}
Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.208
retrieving revision 1.209
diff -u -b -r1.208 -r1.209
--- qe.c 26 Aug 2015 00:53:24 -0000 1.208
+++ qe.c 26 Aug 2015 22:51:24 -0000 1.209
@@ -58,7 +58,9 @@
static StringArray *get_history(const char *name);
static void qe_key_process(int key);
-static ModeSavedData *generic_mode_save_data(EditState *s);
+static int generic_save_window_data(EditState *s);
+static int generic_mode_init(EditState *s);
+static void generic_mode_close(EditState *s);
static void generic_text_display(EditState *s);
static void display1(DisplayState *s);
#ifndef CONFIG_TINY
@@ -1835,16 +1837,16 @@
s->offset = tmp;
}
-static int reload_buffer(EditState *s, EditBuffer *b, FILE *f1)
+static int reload_buffer(EditState *s, EditBuffer *b)
{
- FILE *f;
+ FILE *f, *f1 = NULL;
int ret, saved;
/* if no file associated, cannot do anything */
if (b->filename[0] == '\0')
return 0;
- if (!f1 && b->data_type == &raw_data_type) {
+ if (b->data_type == &raw_data_type) {
struct stat st;
if (stat(b->filename, &st) < 0 || !S_ISREG(st.st_mode))
@@ -1865,6 +1867,7 @@
ret = -1;
b->modified = 0;
b->save_log = saved;
+
if (!f1 && f)
fclose(f);
@@ -1881,11 +1884,9 @@
}
}
-static void edit_set_mode_full(EditState *s, ModeDef *m,
- ModeSavedData *saved_data, FILE *f1)
+void edit_set_mode(EditState *s, ModeDef *m)
{
- int size, data_count;
- int saved_data_allocated = 0;
+ int data_count;
EditState *e;
EditBuffer *b;
@@ -1895,11 +1896,6 @@
if (s->mode) {
/* save mode data if necessary */
s->interactive = 0;
- if (!saved_data) {
- saved_data = generic_mode_save_data(s);
- if (saved_data)
- saved_data_allocated = 1;
- }
if (s->mode->mode_close)
s->mode->mode_close(s);
generic_mode_close(s);
@@ -1930,10 +1926,16 @@
}
}
}
+
/* if a new mode is wanted, open it */
if (m) {
- size = m->instance_size;
s->mode_data = NULL;
+ if (m->instance_size > 0) {
+ s->mode_data = qe_mallocz_array(u8, m->instance_size);
+ /* safe fall back: use text mode */
+ if (!s->mode_data)
+ m = &text_mode;
+ }
if (m->data_type != &raw_data_type) {
/* if a non raw data type is requested, we see if we can use it */
if (b->data_type == &raw_data_type) {
@@ -1941,7 +1943,7 @@
load method */
b->data_type = m->data_type;
b->data_type_name = m->data_type->name;
- if (reload_buffer(s, b, f1) < 0) {
+ if (reload_buffer(s, b) < 0) {
/* error: reset to text mode */
m = &text_mode;
b->data_type = &raw_data_type;
@@ -1959,32 +1961,21 @@
} else {
/* if raw data and nothing loaded, we try to load */
if (b->total_size == 0 && !b->modified)
- reload_buffer(s, b, f1);
- }
- if (size > 0) {
- s->mode_data = qe_mallocz_array(u8, size);
- /* safe fall back: use text mode */
- if (!s->mode_data)
- m = &text_mode;
+ reload_buffer(s, b);
}
s->mode = m;
/* init mode */
- generic_mode_init(s, saved_data);
+ generic_mode_init(s);
m->mode_init(s, s->b, MODEF_VIEW);
if (m->colorize_func)
set_colorize_func(s, m->colorize_func);
/* modify offset_top so that its value is correct */
if (s->mode->text_backward_offset)
s->offset_top = s->mode->text_backward_offset(s, s->offset_top);
+ /* keep saved data in sync with last mode used for buffer */
+ generic_save_window_data(s);
}
- if (saved_data_allocated)
- qe_free(&saved_data);
-}
-
-void edit_set_mode(EditState *s, ModeDef *m)
-{
- edit_set_mode_full(s, m, NULL, NULL);
}
void do_set_mode(EditState *s, const char *name)
@@ -4918,73 +4909,69 @@
void switch_to_buffer(EditState *s, EditBuffer *b)
{
- EditBuffer *b1;
+ EditBuffer *b0 = s->b;
EditState *e;
- ModeSavedData *saved_data;
- int saved_data_allocated = 0;
ModeDef *mode;
/* remove region hilite */
s->region_style = 0;
- if (s->b == b)
+ if (b == b0)
return;
- b1 = s->b;
- if (b1) {
- /* save mode data if no other window uses the buffer */
- e = eb_find_window(b1, s);
- 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.
- */
- if (!(b1->flags & BF_TRANSIENT)) {
- qe_free(&b1->saved_data);
- b1->saved_mode = s->mode;
- b1->saved_data = generic_mode_save_data(s);
- }
- }
- /* now we can close the mode */
+ if (b0) {
+ /* Save generic mode data to the buffer */
+ generic_save_window_data(s);
+
+ /* Close the mode */
edit_set_mode(s, NULL);
- if (b1->flags & BF_TRANSIENT) {
- eb_free(&b1);
- } else {
- /* save buffer for predict_switch_to_buffer */
- s->last_buffer = s->b;
- }
}
/* now we can switch ! */
s->b = b;
+ /* Delete transient buffer if no other window displays it */
+ if (b0) {
+ if ((b0->flags & BF_TRANSIENT) && !eb_find_window(b0, NULL)) {
+ eb_free(&b0);
+ } else {
+ /* save buffer for predict_switch_to_buffer */
+ s->last_buffer = b0;
+ }
+ }
+
if (b) {
+ if (b->saved_data) {
+ /* Restore window mode and data from buffer saved data */
+ memcpy(s, b->saved_data, SAVED_DATA_SIZE);
+ s->offset = min(s->offset, b->total_size);
+ s->offset_top = min(s->offset_top, b->total_size);
+ mode = b->saved_mode;
+ } else {
/* Try to get window mode and data from another window */
e = eb_find_window(b, s);
if (e) {
+ memcpy(s, e, SAVED_DATA_SIZE);
mode = e->mode;
- saved_data = generic_mode_save_data(e);
- saved_data_allocated = 1;
} else {
- mode = b->saved_mode;
- saved_data = b->saved_data;
+ memset(s, 0, SAVED_DATA_SIZE);
+ mode = b->default_mode;
+ /* <default> default values */
+ s->insert = 1;
+ s->indent_size = s->qe_state->default_tab_width;
+ s->default_style = QE_STYLE_DEFAULT;
+ s->wrap = WRAP_LINE;
}
-
- /* find the mode */
+ }
+ /* validate the mode */
if (!mode)
mode = b->default_mode;
- if (!mode)
- mode = &text_mode; /* default mode */
-
- /* open it ! */
- edit_set_mode_full(s, mode, saved_data, NULL);
- if (saved_data_allocated)
- qe_free(&saved_data);
+ if (!mode) {
+ /* default mode */
+ mode = &text_mode;
+ }
+ /* initialize the mode */
+ edit_set_mode(s, mode);
}
}
@@ -6015,6 +6002,11 @@
*/
void do_set_next_mode(EditState *s, int dir)
{
+ qe_set_next_mode(s, dir, 1);
+}
+
+void qe_set_next_mode(EditState *s, int dir, int status)
+{
u8 buf[4097];
int size;
ModeDef *modes[32];
@@ -6038,8 +6030,10 @@
}
}
edit_set_mode(s, modes[found]);
+ if (status) {
put_status(s, "Mode is now %s, score=%d",
modes[found]->name, scores[found]);
+ }
}
/* Load a file and attach buffer to window `s`.
@@ -6200,7 +6194,7 @@
EditBuffer *b = s->b;
if (size >= 1024 && !b->probed) {
- do_set_next_mode(s, 0);
+ qe_set_next_mode(s, 0, 0);
}
}
@@ -6219,7 +6213,7 @@
put_status(s, "Could not read file");
}
if (!s->b->probed) {
- do_set_next_mode(s, 0);
+ qe_set_next_mode(s, 0, 0);
}
edit_display(s->qe_state);
dpy_flush(&global_screen);
@@ -6714,6 +6708,8 @@
if (s->minibuf || (s->flags & WF_POPUP))
return;
+ /* This will clone mode and mode data to the newly created window */
+ generic_save_window_data(s);
if (horiz) {
x = (s->x2 + s->x1) / 2;
e = edit_new(s->b, x, s->y1,
@@ -7189,42 +7185,38 @@
return 20;
}
-int generic_mode_init(EditState *s, ModeSavedData *saved_data)
+static int generic_mode_init(EditState *s)
{
- if (saved_data) {
- memcpy(s, saved_data->generic_data, SAVED_DATA_SIZE);
- } else {
- memset(s, 0, SAVED_DATA_SIZE);
- s->insert = 1;
- s->indent_size = 4;
- s->default_style = QE_STYLE_DEFAULT;
- s->wrap = WRAP_LINE;
- }
s->offset = min(s->offset, s->b->total_size);
s->offset_top = min(s->offset_top, s->b->total_size);
- s->hex_mode = 0;
- s->insert = 1;
eb_add_callback(s->b, eb_offset_callback, &s->offset, 0);
eb_add_callback(s->b, eb_offset_callback, &s->offset_top, 0);
set_colorize_func(s, NULL);
return 0;
}
-/* generic save mode data (saves text presentation information) */
-ModeSavedData *generic_mode_save_data(EditState *s)
+/* Save window generic window data and mode */
+static int generic_save_window_data(EditState *s)
{
- ModeSavedData *saved_data;
+ EditBuffer *b = s->b;
- saved_data = qe_mallocz(ModeSavedData);
- if (!saved_data)
- return NULL;
- saved_data->mode = s->mode;
- memcpy(saved_data->generic_data, s, SAVED_DATA_SIZE);
- return saved_data;
+ if (!b->saved_data
+ && !(b->saved_data = qe_mallocz_array(u8, SAVED_DATA_SIZE))) {
+ return -1;
+ }
+ memcpy(b->saved_data, s, SAVED_DATA_SIZE);
+ b->saved_mode = s->mode;
+ return 0;
}
-void generic_mode_close(EditState *s)
+static void generic_mode_close(EditState *s)
{
+ s->hex_mode = 0;
+ s->hex_nibble = 0;
+ s->unihex_mode = 0;
+ s->insert = 1;
+ s->wrap = WRAP_LINE;
+
/* free all callbacks or associated buffer data */
set_colorize_func(s, NULL);
eb_free_callback(s->b, eb_offset_callback, &s->offset);
Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.205
retrieving revision 1.206
diff -u -b -r1.205 -r1.206
--- qe.h 26 Aug 2015 00:53:24 -0000 1.205
+++ qe.h 26 Aug 2015 22:51:24 -0000 1.206
@@ -133,7 +133,6 @@
typedef struct QEmacsState QEmacsState;
typedef struct DisplayState DisplayState;
typedef struct ModeProbeData ModeProbeData;
-typedef struct ModeSavedData ModeSavedData;
typedef struct ModeDef ModeDef;
typedef struct QETimer QETimer;
typedef struct QEColorizeContext QEColorizeContext;
@@ -933,7 +932,7 @@
* to the same window.
*/
ModeDef *saved_mode;
- OWNED ModeSavedData *saved_data;
+ OWNED u8 *saved_data; /* SAVED_DATA_SIZE bytes */
/* default mode stuff when buffer is detached from window */
int offset;
@@ -1250,15 +1249,6 @@
EditBuffer *b;
};
-/* private data saved by a mode so that it can be restored when the
- mode is started again on a buffer */
-struct ModeSavedData {
- ModeDef *mode; /* the mode is saved there */
- char generic_data[SAVED_DATA_SIZE]; /* generic text data */
- int data_size; /* mode specific saved data */
- char data[1];
-};
-
struct ModeDef {
const char *name;
const char *mode_name;
@@ -1799,6 +1789,7 @@
void edit_invalidate(EditState *s);
void display_mode_line(EditState *s);
void edit_set_mode(EditState *s, ModeDef *m);
+void qe_set_next_mode(EditState *s, int dir, int status);
void do_set_next_mode(EditState *s, int dir);
/* loading files */
@@ -1831,8 +1822,6 @@
extern ModeDef text_mode;
-int generic_mode_init(EditState *s, ModeSavedData *saved_data);
-void generic_mode_close(EditState *s);
int text_backward_offset(EditState *s, int offset);
int text_display(EditState *s, DisplayState *ds, int offset);
Index: shell.c
===================================================================
RCS file: /sources/qemacs/qemacs/shell.c,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -b -r1.99 -r1.100
--- shell.c 26 Aug 2015 00:53:24 -0000 1.99
+++ shell.c 26 Aug 2015 22:51:25 -0000 1.100
@@ -1371,7 +1371,7 @@
if (s->shell_flags & SF_AUTO_CODING)
do_set_auto_coding(e, 0);
if (s->shell_flags & SF_AUTO_MODE)
- do_set_next_mode(e, 0);
+ qe_set_next_mode(e, 0, 0);
}
if (!(s->shell_flags & SF_INTERACTIVE)) {
shell_close(b);
Index: unihex.c
===================================================================
RCS file: /sources/qemacs/qemacs/unihex.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- unihex.c 13 Aug 2015 23:26:59 -0000 1.29
+++ unihex.c 26 Aug 2015 22:51:25 -0000 1.30
@@ -42,11 +42,10 @@
maxc = max(maxc, c);
}
- s->unihex_mode = snprintf(NULL, 0, "%x", maxc);
-
s->dump_width = 32 / s->unihex_mode;
s->hex_mode = 1;
s->hex_nibble = 0;
+ s->unihex_mode = snprintf(NULL, 0, "%x", maxc);
s->insert = 0;
s->wrap = WRAP_TRUNCATE;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs hex.c qe.c qe.h shell.c unihex.c,
Charlie Gordon <=