diff options
| -rw-r--r-- | TODO | 13 | ||||
| -rw-r--r-- | gramscii.c | 158 | 
2 files changed, 98 insertions, 73 deletions
| @@ -1,9 +1,14 @@  + optimize redraws (i.e., avoid to redraw if possible) -- change cursor shape according to action -+ implement box +- (?) change cursor shape according to action +- save to file  - implement arrow -- set different box styles -+ add status bar +- 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) +* set different line styles (done for hl, vl, corner) +* add status bar +* implement box @@ -26,14 +26,12 @@  #define WIDTH  100  #define HEIGHT  25 +#define NOFIX 0x0 +#define FIX   0x1 +  #define BG        ' '  #define PTR       '+'  #define UND       '_' -#define LINE_H    '-' -#define LINE_V    '|' -#define DBLINE_H  '=' -#define DBLINE_V  'u' -#define BLDLINE   '#'  #define ARR_L     '<'  #define ARR_R     '>'  #define ARR_U     '^' @@ -52,10 +50,15 @@ int y;  int step;  char cursor;  char corner; -char box_line_h; -char box_line_v; -char arrow_line_h; -char arrow_line_v; +char hlines[]  = {"-~=#@._"}; +char vlines[]  = {"|H#@:;i"}; +char corners[] = {"+'H#@.\""}; +int hlines_sz= sizeof(hlines); +int vlines_sz= sizeof(vlines); +int corners_sz = sizeof(corners); +int cur_hl, cur_vl, cur_corn; +char line_h; +char line_v;  struct termios t1, t2; @@ -69,8 +72,6 @@ void cleanup(int s){  void show_cursor(){  	printf("\033[%d;%df", y+1, x+1); -	//putchar(screen[y][x]); -	//printf("\033[%d;%df", y+1, x+2);  }  void set(char c){ @@ -88,46 +89,46 @@ void draw_xy(int x, int y, char c){  	putchar(c);	  } -void clear(){ -	screen[y][x] = BG; -} -  void init_screen(){  	int i;  	for(i=0; i<HEIGHT; i++){  		memset(screen[i], ' ', WIDTH);  		screen[i][WIDTH]='\0';  	} -	cursor = PTR; -	corner = PTR; -	box_line_h = LINE_H; -	box_line_v = LINE_V; -	arrow_line_h = LINE_H;	 -	arrow_line_v = LINE_V;	 +	cur_corn = 0; +	corner = corners[0]; +	cur_hl = cur_vl = 0; +	line_h = hlines[cur_hl]; +	line_v = vlines[cur_vl];  }  char* state_str(){  	switch(state){  		case MOVE: -			return "mv "; +			return "mov";  		case TEXT:  			return "txt";  		case BOX:  			return "box";  		case ARROW:  			return "arr"; +		default: +			return "ERR";  	} +	return "ERR";	  }  void status_bar(){  	printf("\033[%d;1f\033[7m", HEIGHT+1); -	printf(" x: %d y: %d -- mode: %s", x, y, state_str()); +	printf(" x: %3d y: %3d -- mode: %4s hl: %c vl: %c cn: %c %10s",  +		x, y, state_str(), line_h, line_v, corner, ""); +  	printf("\033[0m");  } -int redraw(){ +void redraw(){  	int i;  	printf("\033[2J\033[1;1H"); @@ -171,11 +172,12 @@ void check_bound(){  } +/*****  text, box, arrows  *****/ +  void get_text(){  	char c; -	int orig_x = x, orig_y = y; +	int orig_x = x; -	//cursor = UND;  	redraw();  	while((c=getchar())!=EOF && c != 27){  		if(c=='\n'){ @@ -194,59 +196,38 @@ void get_text(){  		status_bar();  		show_cursor();  	} -	cursor = PTR;  	state=MOVE;  } -void fix_box(int x1, int y1){ +void draw_box(int x1, int y1, int fix){  	int xmin, ymin, xmax, ymax;  	int i; -	 -	xmin = MIN(x, x1); -	xmax = MAX(x, x1); -	ymin = MIN(y, y1); -	ymax = MAX(y, y1); +	void (*f)(int, int, char); -	 -	for(i=xmin+1; i<=xmax; i++){ -		set_xy(i, ymin, box_line_h); -		set_xy(i, ymax, box_line_h); -	} -	for(i=ymin+1; i<=ymax; i++){ -		set_xy(xmin, i, box_line_v); -		set_xy(xmax, i, box_line_v); -	} -	set_xy(xmin, ymin, corner); -	set_xy(xmin, ymax, corner); -	set_xy(xmax, ymin, corner); -	set_xy(xmax, ymax, corner); -} - -void draw_box(int x1, int y1){ - -	int xmin, ymin, xmax, ymax; -	int i; +	if (fix == FIX) +		f = set_xy; +	else +		f = draw_xy;  	xmin = MIN(x, x1);  	xmax = MAX(x, x1);  	ymin = MIN(y, y1);  	ymax = MAX(y, y1); -	  	for(i=xmin+1; i<=xmax; i++){ -		draw_xy(i, ymin, box_line_h); -		draw_xy(i, ymax, box_line_h); +		f(i, ymin, line_h); +		f(i, ymax, line_h);  	}  	for(i=ymin+1; i<=ymax; i++){ -		draw_xy(xmin, i, box_line_v); -		draw_xy(xmax, i, box_line_v); +		f(xmin, i, line_v); +		f(xmax, i, line_v);  	} -	draw_xy(xmin, ymin, corner); -	draw_xy(xmin, ymax, corner); -	draw_xy(xmax, ymin, corner); -	draw_xy(xmax, ymax, corner); +	f(xmin, ymin, corner); +	f(xmin, ymax, corner); +	f(xmax, ymin, corner); +	f(xmax, ymax, corner);  	show_cursor();  } @@ -254,10 +235,10 @@ void draw_box(int x1, int y1){  void get_box(){  	char c;  	int orig_x=x, orig_y=y; - -	set(PTR); +	  	redraw(); -	while((c=getchar())!=EOF && c != 27){ +	draw_box(x,y,NOFIX); +	while((c=getchar())!=EOF && c != 27 && c!= 'b'){  		switch(c){  			case 'H': step = 5;  			case 'h':  @@ -278,16 +259,44 @@ void get_box(){  		}  		check_bound();  		redraw(); -		draw_box(orig_x, orig_y); +		draw_box(orig_x, orig_y, NOFIX);  		status_bar();  		show_cursor();  	} -	fix_box(orig_x, orig_y); +	if (c == 'b') +		draw_box(orig_x, orig_y, FIX);  	redraw(); +	state = MOVE;  } -int commands(){ +void write_file(){ +	char fname[256]; +	FILE *f; +} + +void toggle_hline(){ + +	cur_hl = (cur_hl + 1) % hlines_sz; +	line_h = hlines[cur_hl]; +	 +} + +void toggle_corner(){ +	 +	cur_corn = (cur_corn + 1 ) % corners_sz; +	corner = corners[cur_corn]; + +} + +void toggle_vline(){ + +	cur_vl = (cur_vl + 1) % vlines_sz; +	line_v = vlines[cur_vl]; + +} + +void commands(){  	char c;  	while((c=getchar())!=EOF){ @@ -321,8 +330,21 @@ int commands(){  				redraw();  				break;  			case 'b': +				state = BOX;  				get_box();  				break; +			case 'w': +				write_file(); +				break; +			case '-': +				toggle_hline(); +				break; +			case '|': +				toggle_vline(); +				break; +			case '+': +				toggle_corner(); +				break;  			case 'Q':  			case 'q':  				cleanup(0); @@ -332,8 +354,6 @@ int commands(){  				//statu("got: %d\n", c);  		}  		check_bound(); -		//update(); -		//redraw();  		status_bar();  		show_cursor();  		step = 1; | 
