Introduction
Introduction Statistics Contact Development Disclaimer Help
change screen management -- dynamic array of lines - gramscii - A simple editor…
Log
Files
Refs
Tags
README
LICENSE
---
commit 3d53fcefe3ca3e6f25d1731c2caa0c1c0e676453
parent 0adbc2a776c36b736bb5acb7184ba559d9428bc4
Author: KatolaZ <[email protected]>
Date: Fri, 26 Jul 2019 22:55:56 +0100
change screen management -- dynamic array of lines
Diffstat:
M TODO | 6 +++---
M gramscii.c | 36 ++++++++++++++++++++++++++---…
2 files changed, 33 insertions(+), 9 deletions(-)
---
diff --git a/TODO b/TODO
@@ -1,5 +1,4 @@
+ optimize redraws (redraw only the modified rectangle)
-+ change screen management (i.e., dynamic array of lines)
- add screen geometry option (-g 25x80?)
- read file at point
- read output of command (!)
@@ -10,7 +9,7 @@
+ parse arrows (text-mode will allow movements as well)
- (?) implement CTRL+G as abort (aside ESC)
- add crop command (c)
-- remove extra blanks until EOL when saving to file
+- (?) remove extra blanks until EOL when saving to file
+ visual selection
- crop-to
- yank/put
@@ -20,8 +19,9 @@
- manage special chars (DEL/CANC) during text insert
(also do not print unmanaged chars!)
- allow scrolling (both vertical and horizontal)
-- catch SIGWINCH and react appropriately (after scroll is
+- catch SIGWINCH and react appropriately (after scrolling is
enabled)
+* change screen management (i.e., dynamic array of lines)
* add action multiplier (e.g., "7h" moves left by 7 cols)
* add scripting mode option ("-s"?)
* auto-arrow 'A' (automatic end-char)
diff --git a/gramscii.c b/gramscii.c
@@ -136,6 +136,11 @@ void cleanup(int s){
exit(0);
}
+void exit_cleanup(void){
+ cleanup(0);
+}
+
+
/*** Status bar ***/
char* state_str(){
@@ -201,6 +206,7 @@ char get_key(FILE *fc, char *msg){
printf("%*s", WIDTH, "");
printf("\033[%d;1f\033[7m", HEIGHT+1);
printf("%s", msg);
+ fflush(stdout);
printf("\033[0m");
fflush(stdout);
return fgetc(fc);
@@ -242,14 +248,33 @@ void show_cursor(){
void set_xy(int _x, int _y, char c){
- /* FIXME: check if x and y are valid!!!! */
+ line_t *tmp;
+ if (_y >= num_lines){
+ tmp = realloc(screen, (_y + LONG_STEP)* sizeof(line_t));
+ if (tmp == NULL){
+ fprintf(stderr, "Unable to allocate memory for more li…
+ exit(1);
+ }
+ else while ( num_lines < _y + LONG_STEP){
+ screen[num_lines].sz = WIDTH+1;
+ screen[num_lines].s = malloc((screen[num_lines].sz) * …
+ if (screen[num_lines].s == NULL){
+ perror("allocating screen[num_lines].s");
+ exit(1);
+ }
+ memset(screen[num_lines].s, BG, screen[num_lines].sz);
+ screen[num_lines].lst = 0;
+ screen[num_lines].s[screen[num_lines].lst+1]='\0';
+ num_lines ++;
+ }
+ }
if (screen[_y].sz < _x + 2){
screen[_y].sz = (_x +2) * 2;
screen[_y].s = realloc(screen[_y].s, screen[_y].sz * sizeof(ch…
}
while (screen[_y].lst<_x){
+ screen[_y].lst ++;
screen[_y].s[screen[_y].lst] = BG;
- screen[_y].lst += 1;
}
screen[_y].s[_x] = c;
if (_x == screen[_y].lst)
@@ -806,7 +831,7 @@ void check_modified(FILE *fc){
if (!is_yes(get_key(fc, "Unsaved changes. Write to file [y/n]?…
return;
}
- write_file(0);
+ write_file(fc);
}
}
@@ -905,7 +930,7 @@ void init_screen(){
exit(1);
}
memset(screen[i].s, BG, screen[i].sz);
- screen[i].lst = WIDTH;
+ screen[i].lst = 0;
screen[i].s[screen[i].lst+1]='\0';
}
reset_styles();
@@ -917,6 +942,7 @@ void init(){
signal(SIGINT, cleanup);
signal(SIGTERM, cleanup);
signal(SIGQUIT, cleanup);
+ atexit(exit_cleanup);
tcgetattr(0, &t1);
t2 = t1;
@@ -981,7 +1007,6 @@ void commands(FILE *fc){
case 'q':
check_modified(fc);/** FALLTHROUGH **/
case 'Q':
- cleanup(0);
exit(0);
break;
}
@@ -1028,6 +1053,5 @@ int main(int argc, char *argv[]){
argc--;
}
commands(stdin);
- cleanup(0);
return 0;
}
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.