summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKatolaZ <katolaz@freaknet.org>2019-07-19 18:03:29 +0100
committerKatolaZ <katolaz@freaknet.org>2019-07-19 18:03:29 +0100
commit52a48d7718c6467da380a51f49327323e15e00c7 (patch)
tree277bcad9c7160cb4fa752979ab5903459813a56d
parenta2bf8545d73621de7cfa3a06663d1b94fdc668c4 (diff)
save to file works
-rw-r--r--TODO16
-rw-r--r--gramscii.c110
2 files changed, 102 insertions, 24 deletions
diff --git a/TODO b/TODO
index 1b6139d..b4d36cd 100644
--- a/TODO
+++ b/TODO
@@ -1,14 +1,20 @@
+ optimize redraws (i.e., avoid to redraw if possible)
- (?) change cursor shape according to action
-- save to file
-- implement auto-arrow 'A' (automatic end-char)
-- implement delete 'x' or 'd'
+- auto-arrow 'A' (automatic end-char)
+- delete -- 'x' or 'd'
+- load from file
+- read file at point
+- visual selection
+ - crop
+ - fill
+ - delete
+ - yank/put
+- undo (by storing lines changed across insert/remove operations)
- manage special chars (DEL/CANC) during text insert
(also do not print unmanaged chars!)
-- load from file
-- insert file at position
- get screen geometry
- allow scrolling (both vertical and horizontal)
+* save to file
* implement arrow
* set different line styles (done for hl, vl, corner)
* add status bar
diff --git a/gramscii.c b/gramscii.c
index 1d75b34..6011842 100644
--- a/gramscii.c
+++ b/gramscii.c
@@ -41,6 +41,10 @@
#define ARR_D 'v'
+#define HOME 0x01
+#define END 0x02
+#define MIDDLE 0x04
+
#define MIN(x,y) (x) < (y) ? (x) : (y)
#define MAX(x,y) (x) > (y) ? (x) : (y)
@@ -71,7 +75,7 @@ char line_v;
char mark_st;
char mark_end;
-struct termios t1, t2;
+struct termios t1, t2, t3;
void cleanup(int s){
@@ -245,6 +249,13 @@ void draw_box(int x1, int y1, int fix){
}
+void move_around(char c){
+
+
+
+}
+
+
void get_box(){
char c;
int orig_x=x, orig_y=y;
@@ -285,28 +296,12 @@ void get_box(){
int progr_x(int dir){
- switch(dir){
- case DIR_L:
- return -1;
- case DIR_R:
- return +1;
- default:
- return 0;
- }
- return 0;
+ return dir == DIR_L ? -1 : dir == DIR_R ? 1: 0;
}
int progr_y(int dir){
- switch(dir){
- case DIR_D:
- return +1;
- case DIR_U:
- return -1;
- default:
- return 0;
- }
- return 0;
+ return dir == DIR_U ? -1 : dir == DIR_D ? 1: 0;
}
@@ -412,9 +407,58 @@ void get_arrow(){
state = MOVE;
}
+char get_key(char *s){
+
+ printf("\033[%d;1f\033[7m", HEIGHT+1);
+ printf("%100s", " ");
+ printf("\033[%d;1f\033[7m", HEIGHT+1);
+ printf("%s ", s);
+ printf("\033[0m");
+ return getchar();
+}
+
+void get_string(char *s, int sz){
+
+ printf("\033[%d;1f\033[7m", HEIGHT+1);
+ printf("%100s", " ");
+ printf("\033[%d;1f\033[7m", HEIGHT+1);
+ /* We must activate echo now */
+ t3 = t2;
+ t3.c_lflag |= (ECHO | ICANON);
+ tcsetattr(0, TCSANOW, &t3);
+ printf("Write to: ");
+ printf("\033[0m");
+ fgets(s, sz, stdin);
+ s[strlen(s)-1] = '\0';
+ tcsetattr(0, TCSANOW, &t2);
+}
+
+int is_yes(char c){
+ return c=='y' ? 1 : c == 'Y'? 1 : 0;
+}
+
void write_file(){
char fname[256];
FILE *f;
+ int i;
+
+ get_string(fname, 255);
+ if (f=fopen(fname, "r")){
+ if (!is_yes(get_key("File exists. Overwrite [y/N]?")) ){
+ fclose(f);
+ return;
+ }
+ fclose(f);
+ }
+ if((f=fopen(fname, "w"))==NULL){
+ get_key("Error opening file.");
+ return;
+ }
+ for (i=0; i<HEIGHT; i++){
+ fprintf(f, "%s\n", screen[i]);
+ }
+ fclose(f);
+ get_key("File saved.");
}
void toggle_hline(){
@@ -450,6 +494,25 @@ void toggle_end_mark(){
mark_end = end_marks[cur_end];
}
+void go_to(int where){
+ switch(where){
+ case HOME:
+ x = y = 0;
+ break;
+ case END:
+ x = WIDTH-1;
+ y = HEIGHT-1;
+ break;
+ case MIDDLE:
+ x = WIDTH/2;
+ y = HEIGHT/2;
+ break;
+ }
+ check_bound();
+ show_cursor();
+}
+
+
void commands(){
char c;
@@ -494,6 +557,15 @@ void commands(){
case 'w':
write_file();
break;
+ case 'g':
+ go_to(HOME);
+ break;
+ case 'G':
+ go_to(END);
+ break;
+ case 'm':
+ go_to(MIDDLE);
+ break;
case '-':
toggle_hline();
break;