add crop-to-visible function (C) - gramscii - A simple editor for ASCII box-and… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit a99759398841d86928c7ad4d8248f907765cbeb2 | |
parent b38ed132a7df231fc08ce384d8559e6648fdd0cc | |
Author: KatolaZ <[email protected]> | |
Date: Sat, 27 Jul 2019 08:31:24 +0100 | |
add crop-to-visible function (C) | |
Diffstat: | |
M TODO | 2 +- | |
M config.mk | 2 +- | |
M draw.c | 1 + | |
M gramscii.1 | 5 +++++ | |
M gramscii.h | 1 + | |
M screen.c | 30 +++++++++++++++++++++++++++--- | |
6 files changed, 36 insertions(+), 5 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,5 +1,4 @@ | |
+ optimize redraws (redraw only the modified rectangle) | |
-+ add crop command (C) | |
- fix bug with 'g' commands in arrow mode | |
- add screen geometry option (-g 25x80?) | |
- read file at point | |
@@ -25,6 +24,7 @@ | |
- allow scrolling (both vertical and horizontal) | |
- catch SIGWINCH and react appropriately (after scrolling is | |
enabled) | |
+* add crop command (C) | |
* reorganise code | |
* change screen management (i.e., dynamic array of lines) | |
* add action multiplier (e.g., "7h" moves left by 7 cols) | |
diff --git a/config.mk b/config.mk | |
@@ -2,5 +2,5 @@ PREFIX = /usr/local | |
BINDIR = ${PREFIX}/bin | |
MANDIR = ${PREFIX}/share/man | |
-CFLAGS = -O3 -std=c90 -pedantic -Wall | |
+CFLAGS = -O0 -std=c99 -pedantic -Wall | |
CC = cc | |
diff --git a/draw.c b/draw.c | |
@@ -303,6 +303,7 @@ void visual_box(FILE *fc){ | |
f = get_key(fc, "fill char: "); /** FALLTHROUG… | |
case 'x':/* erase */ | |
erase_box(orig_x, orig_y, f); | |
+ erase_blank_lines(MIN(y,orig_y), MAX(y, orig_y… | |
modified = 1; | |
goto vis_exit; | |
break; | |
diff --git a/gramscii.1 b/gramscii.1 | |
@@ -52,6 +52,11 @@ mode: | |
.BI R | |
Redraw the screen | |
.TP 5m | |
+.BI C | |
+Crop chart to the largest non-blank region. The first line and the first | |
+column of the cropped chart will contain the first non-blank line and | |
+the first non-blank column of the original chart, respectively. | |
+.TP 5m | |
.BI q | |
Quit gramscii, and prompt for a filename if the current screen contains | |
unsaved changes. | |
diff --git a/gramscii.h b/gramscii.h | |
@@ -120,6 +120,7 @@ void erase_line(int i); | |
void erase_screen(); | |
void go_to(int where); | |
void crop_to_nonblank(); | |
+void erase_blank_lines(int y1, int y2); | |
/** drawing-related functions **/ | |
int change_style(char c); | |
diff --git a/screen.c b/screen.c | |
@@ -197,6 +197,26 @@ void update_current(){ | |
fflush(stdout); | |
} | |
+void erase_blank_lines(int y1, int y2){ | |
+ int j; | |
+ if (y1 > y2){ | |
+ y1 ^= y2; | |
+ y2 ^= y1; | |
+ y1 ^= y2; | |
+ } | |
+ | |
+ for (; y1 <= y2; y1++){ | |
+ j = screen[y1].lst; | |
+ while (j>=0 && isblank(screen[y1].s[j])) | |
+ j--; | |
+ if (j<0){ | |
+ screen[y1].lst = -1; | |
+ screen[y1].s[0] = '\0'; | |
+ } | |
+ } | |
+} | |
+ | |
+ | |
void erase_line(int i){ | |
screen[i].lst = -1; | |
screen[i].s[0] = '\0'; | |
@@ -446,13 +466,16 @@ void find_nonblank_rect(int *x1, int *y1, int *x2, int *y… | |
*y2 = i; | |
if (i < *y1) | |
*y1 = i; | |
- if (screen[i].lst > *x2) | |
- *x2 = screen[i].lst; | |
j = 0; | |
- while(j <= screen[i].lst && isblank(first=screen[i].s[j])) | |
+ while((j <= screen[i].lst) && isblank(first=screen[i].s[j])) | |
j++; | |
if (j < *x1) | |
*x1 = j; | |
+ j = screen[i].lst; | |
+ while(isblank(screen[i].s[j])) | |
+ j--; | |
+ if (j > *x2) | |
+ *x2 = j; | |
} | |
} | |
@@ -478,6 +501,7 @@ void crop_to_nonblank(){ | |
fprintf(stderr, "crop rectangle: (%d, %d)-(%d, %d)\n", x1, y1, x2, y2); | |
#endif | |
crop_to_rect(x1, y1, x2, y2); | |
+ modified=1; | |
redraw(); | |
} | |