ifix bug with global movements in arrow mode - gramscii - A simple editor for ASCII box-and-arrow charts Err bitreich.org 70 1Log /scm/gramscii/log.gph bitreich.org 70 1Files /scm/gramscii/files.gph bitreich.org 70 1Refs /scm/gramscii/refs.gph bitreich.org 70 1Tags /scm/gramscii/tag bitreich.org 70 1README /scm/gramscii/file/README.md.gph bitreich.org 70 1LICENSE /scm/gramscii/file/COPYING.gph bitreich.org 70 i--- Err bitreich.org 70 1commit c16e74036e791b2c1f9c19841fc75a60067aefec /scm/gramscii/commit/c16e74036e791b2c1f9c19841fc75a60067aefec.gph bitreich.org 70 1parent 9127db5e322c1b0cd57adf90e8cfefad66020fe2 /scm/gramscii/commit/9127db5e322c1b0cd57adf90e8cfefad66020fe2.gph bitreich.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org bitreich.org 70 iDate: Thu, 8 Aug 2019 08:39:04 +0100 Err bitreich.org 70 i Err bitreich.org 70 ifix bug with global movements in arrow mode Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M TODO | 2 +- Err bitreich.org 70 i M draw.c | 24 +++++++++++++----------- Err bitreich.org 70 i M gramscii.c | 2 +- Err bitreich.org 70 i M gramscii.h | 6 ++---- Err bitreich.org 70 i M screen.c | 38 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 46 insertions(+), 26 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/gramscii/file/TODO.gph bitreich.org 70 i@@ -1,5 +1,4 @@ Err bitreich.org 70 i + optimize redraws (redraw only the modified rectangle) Err bitreich.org 70 i-- fix bug with 'g' commands in arrow mode Err bitreich.org 70 i - fir bug in reading commands from files Err bitreich.org 70 i - add screen geometry option (-g 25x80?) Err bitreich.org 70 i - read file at point Err bitreich.org 70 i@@ -18,6 +17,7 @@ Err bitreich.org 70 i - allow scrolling (both vertical and horizontal) Err bitreich.org 70 i - catch SIGWINCH and react appropriately (after scrolling is Err bitreich.org 70 i enabled) Err bitreich.org 70 i+* fix bug with 'g' commands in arrow mode Err bitreich.org 70 i * undo (by storing lines changed across insert/remove operations) Err bitreich.org 70 i * re-organise undo-ring management Err bitreich.org 70 i * add undo for arrow mode Err bitreich.org 70 1diff --git a/draw.c b/draw.c /scm/gramscii/file/draw.c.gph bitreich.org 70 i@@ -148,7 +148,7 @@ void get_box(FILE *fc){ Err bitreich.org 70 i while((c=fgetc(fc))!=EOF && c != 27 && c!= 'b' && c != '\n'){ Err bitreich.org 70 i if (change_style(c)) Err bitreich.org 70 i goto update_box; Err bitreich.org 70 i- if (!move_around(c, fc)) Err bitreich.org 70 i+ if (!move_around(c, fc, 1)) Err bitreich.org 70 i continue; Err bitreich.org 70 i check_bound(&x, &y); Err bitreich.org 70 i redraw(); Err bitreich.org 70 i@@ -166,7 +166,7 @@ update_box: Err bitreich.org 70 i mode = MOVE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void draw_arrow(int xl, int yl, char *a, int a_len, int fix){ Err bitreich.org 70 i+void draw_arrow(int xl, int yl, short *a, int a_len, int fix){ Err bitreich.org 70 i Err bitreich.org 70 i int i, j, cur_dir; Err bitreich.org 70 i char line; Err bitreich.org 70 i@@ -218,12 +218,12 @@ void get_arrow(FILE *fc){ Err bitreich.org 70 i Err bitreich.org 70 i char c; Err bitreich.org 70 i int orig_x=x, orig_y=y, arrow_len; Err bitreich.org 70 i- static char *arrow = NULL; Err bitreich.org 70 i+ static short *arrow = NULL; Err bitreich.org 70 i static int arrow_sz; Err bitreich.org 70 i Err bitreich.org 70 i if (!arrow){ Err bitreich.org 70 i arrow_sz = 100; Err bitreich.org 70 i- arrow = malloc(arrow_sz * sizeof(char)); Err bitreich.org 70 i+ arrow = malloc(arrow_sz * sizeof(short)); Err bitreich.org 70 i } Err bitreich.org 70 i arrow_len = 0; Err bitreich.org 70 i dir = DIR_N; Err bitreich.org 70 i@@ -234,17 +234,19 @@ void get_arrow(FILE *fc){ Err bitreich.org 70 i while((c=fgetc(fc))!=EOF && c != 27 && c!= 'a' && c != '\n'){ Err bitreich.org 70 i if (change_style(c)) Err bitreich.org 70 i goto update_arrow; Err bitreich.org 70 i- if (!move_around(c, fc)) Err bitreich.org 70 i+ if (!move_around(c, fc, 0)) Err bitreich.org 70 i continue; Err bitreich.org 70 i check_bound(&x, &y); Err bitreich.org 70 i /* FIXME: if we are out of bound, do nothing? */ Err bitreich.org 70 i if (arrow_len == arrow_sz){ Err bitreich.org 70 i arrow_sz *=2; Err bitreich.org 70 i- arrow = realloc(arrow, arrow_sz * sizeof(char)); Err bitreich.org 70 i+ arrow = realloc(arrow, arrow_sz * sizeof(short)); Err bitreich.org 70 i } Err bitreich.org 70 i- arrow[arrow_len++] = dir; Err bitreich.org 70 i- arrow[arrow_len++] = step; Err bitreich.org 70 i- redraw(); Err bitreich.org 70 i+ if (dir != DIR_N){ Err bitreich.org 70 i+ arrow[arrow_len++] = dir; Err bitreich.org 70 i+ arrow[arrow_len++] = step; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ redraw(); Err bitreich.org 70 i step = 1; Err bitreich.org 70 i update_arrow: Err bitreich.org 70 i draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX); Err bitreich.org 70 i@@ -289,7 +291,7 @@ void erase(FILE *fc){ Err bitreich.org 70 i status_bar(); Err bitreich.org 70 i show_cursor(); Err bitreich.org 70 i while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){ Err bitreich.org 70 i- if (!move_around(c, fc)) continue; Err bitreich.org 70 i+ if (!move_around(c, fc, 0)) continue; Err bitreich.org 70 i check_bound(&x, &y); Err bitreich.org 70 i if (first || Err bitreich.org 70 i (y != orig_y && ! opened) || Err bitreich.org 70 i@@ -329,7 +331,7 @@ void visual_box(FILE *fc){ Err bitreich.org 70 i set_video(VIDEO_REV); Err bitreich.org 70 i draw_box(x,y,NOFIX); Err bitreich.org 70 i while((c=fgetc(fc))!=EOF && c != 27 && c!= 'v' && c != '\n'){ Err bitreich.org 70 i- if (!move_around(c, fc)) switch(c){ Err bitreich.org 70 i+ if (!move_around(c, fc, 1)) switch(c){ Err bitreich.org 70 i case 'y': /* yank (copy) */ Err bitreich.org 70 i yank_region(MIN(orig_x,x), MIN(orig_y,y), MAX(orig_x, x), MAX(orig_y, y)); Err bitreich.org 70 i goto vis_exit; Err bitreich.org 70 1diff --git a/gramscii.c b/gramscii.c /scm/gramscii/file/gramscii.c.gph bitreich.org 70 i@@ -72,7 +72,7 @@ void commands(FILE *fc){ Err bitreich.org 70 i Err bitreich.org 70 i char c; Err bitreich.org 70 i while((c=fgetc(fc))!=EOF){ Err bitreich.org 70 i- if (!change_style(c) && !move_around(c, fc)){ Err bitreich.org 70 i+ if (!change_style(c) && !move_around(c, fc, 1)){ Err bitreich.org 70 i switch(c){ Err bitreich.org 70 i case 'i': Err bitreich.org 70 i mode = TEXT; Err bitreich.org 70 1diff --git a/gramscii.h b/gramscii.h /scm/gramscii/file/gramscii.h.gph bitreich.org 70 i@@ -82,9 +82,7 @@ typedef struct{ Err bitreich.org 70 i #define progr_x(d) ((d) == DIR_L ? -1 : (d) == DIR_R ? 1 : 0) Err bitreich.org 70 i #define progr_y(d) ((d) == DIR_U ? -1 : (d) == DIR_D ? 1 : 0) Err bitreich.org 70 i Err bitreich.org 70 i-/* Err bitreich.org 70 i- * #define DEBUG 1 Err bitreich.org 70 i- */ Err bitreich.org 70 i+#define DEBUG 1 Err bitreich.org 70 i Err bitreich.org 70 i /** global variables **/ Err bitreich.org 70 i Err bitreich.org 70 i@@ -140,7 +138,7 @@ struct termios t1, t2, t3; Err bitreich.org 70 i /** screen-related functions **/ Err bitreich.org 70 i void reset_styles(); Err bitreich.org 70 i void redraw(); Err bitreich.org 70 i-int move_around(char c, FILE *fc); Err bitreich.org 70 i+int move_around(char c, FILE *fc, char global); Err bitreich.org 70 i void check_bound(int *x, int *y); Err bitreich.org 70 i void status_bar(); Err bitreich.org 70 i void show_cursor(); Err bitreich.org 70 1diff --git a/screen.c b/screen.c /scm/gramscii/file/screen.c.gph bitreich.org 70 i@@ -252,39 +252,53 @@ void go_to(int where){ Err bitreich.org 70 i show_cursor(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void handle_goto(){ Err bitreich.org 70 i+void handle_goto(char global){ Err bitreich.org 70 i char c; Err bitreich.org 70 i c=getchar(); Err bitreich.org 70 i switch(c){ Err bitreich.org 70 i case 'h': Err bitreich.org 70 i dir = DIR_L; Err bitreich.org 70 i+ step = x; Err bitreich.org 70 i x = 0; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'l': Err bitreich.org 70 i dir = DIR_R; Err bitreich.org 70 i+ step = WIDTH - x -1; Err bitreich.org 70 i x = WIDTH - 1; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'j': Err bitreich.org 70 i dir = DIR_D; Err bitreich.org 70 i+ step = HEIGHT - y-1; Err bitreich.org 70 i y = HEIGHT - 1; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'k': Err bitreich.org 70 i dir = DIR_U; Err bitreich.org 70 i+ step = y; Err bitreich.org 70 i y = 0; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'g': Err bitreich.org 70 i- dir = DIR_N; Err bitreich.org 70 i- go_to(HOME); Err bitreich.org 70 i+ if (global){ Err bitreich.org 70 i+ dir = DIR_N; Err bitreich.org 70 i+ go_to(HOME); Err bitreich.org 70 i+ } else step = 0; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'G': Err bitreich.org 70 i- dir = DIR_N; Err bitreich.org 70 i- go_to(END); Err bitreich.org 70 i+ if (global){ Err bitreich.org 70 i+ dir = DIR_N; Err bitreich.org 70 i+ go_to(END); Err bitreich.org 70 i+ } else step = 0; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'm': Err bitreich.org 70 i- dir = DIR_N; Err bitreich.org 70 i- go_to(MIDDLE); Err bitreich.org 70 i+ if (global){ Err bitreich.org 70 i+ dir = DIR_N; Err bitreich.org 70 i+ go_to(MIDDLE); Err bitreich.org 70 i+ } else step = 0; Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+#ifdef DEBUG Err bitreich.org 70 i+ fprintf(stderr, "global move: dir: %d x: %d y: %d\n", dir, x, y); Err bitreich.org 70 i+#endif Err bitreich.org 70 i check_bound(&x, &y); Err bitreich.org 70 i show_cursor(); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -324,7 +338,7 @@ int get_escape(FILE *fc){ Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-int move_around(char c, FILE *fc){ Err bitreich.org 70 i+int move_around(char c, FILE *fc, char global){ Err bitreich.org 70 i Err bitreich.org 70 i if (isdigit(c)){ Err bitreich.org 70 i if (mult) Err bitreich.org 70 i@@ -365,7 +379,13 @@ int move_around(char c, FILE *fc){ Err bitreich.org 70 i x += step; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'g': Err bitreich.org 70 i- handle_goto(); Err bitreich.org 70 i+#ifdef DEBUG Err bitreich.org 70 i+ fprintf(stderr, "before global: step: %d x: %d y: %d\n", step, x, y); Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ handle_goto(global); Err bitreich.org 70 i+#ifdef DEBUG Err bitreich.org 70 i+ fprintf(stderr, "after global: step: %d x: %d y: %d\n", step, x, y); Err bitreich.org 70 i+#endif Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i return 0; Err bitreich.org 70 .