mirror of
https://github.com/bobbimanners/emailler.git
synced 2024-11-17 15:07:30 +00:00
Fixed some screen corruption bugs. Addressed some other irritations.
This commit is contained in:
parent
b2b1a03dec
commit
4a920c5bbc
68
apps/edit.c
68
apps/edit.c
@ -6,8 +6,8 @@
|
|||||||
// Note use my fork of cc65 to get a flashing cursor!!
|
// Note use my fork of cc65 to get a flashing cursor!!
|
||||||
|
|
||||||
// TODO: Improve status line, refresh it properly
|
// TODO: Improve status line, refresh it properly
|
||||||
// TODO: Still some lingering screen update bugs (prob after status line)
|
// TODO: Minor bug - can delete more chars from status line than should be able to
|
||||||
// TODO: Should be smarter about redrawing in when updating selection!!!
|
// TODO: Should be smarter about redrawing when updating selection!!!
|
||||||
// TODO: Doesn't check for error cases when calling gap buffer functions
|
// TODO: Doesn't check for error cases when calling gap buffer functions
|
||||||
// TODO: Make use of aux mem
|
// TODO: Make use of aux mem
|
||||||
|
|
||||||
@ -22,7 +22,7 @@
|
|||||||
#define NCOLS 80 // Width of editing screen
|
#define NCOLS 80 // Width of editing screen
|
||||||
#define NROWS 22 // Height of editing screen
|
#define NROWS 22 // Height of editing screen
|
||||||
#define CURSORROW 10 // Row cursor is initially shown on (if enough text)
|
#define CURSORROW 10 // Row cursor is initially shown on (if enough text)
|
||||||
#define PROMPT_ROW NROWS + 2 // Row where input prompt is shown
|
#define PROMPT_ROW NROWS + 1 // Row where input prompt is shown
|
||||||
|
|
||||||
#define EOL '\r' // For ProDOS
|
#define EOL '\r' // For ProDOS
|
||||||
|
|
||||||
@ -96,8 +96,9 @@ char openapple[] = "\x0f\x1b""A\x18\x0e";
|
|||||||
void goto_prompt_row(void) {
|
void goto_prompt_row(void) {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
putchar(HOME);
|
putchar(HOME);
|
||||||
for (i = 0; i < PROMPT_ROW - 1; ++i)
|
for (i = 0; i < PROMPT_ROW; ++i)
|
||||||
putchar(CURDOWN);
|
putchar(CURDOWN);
|
||||||
|
gotoxy(1, PROMPT_ROW);
|
||||||
}
|
}
|
||||||
#pragma code-name (pop)
|
#pragma code-name (pop)
|
||||||
|
|
||||||
@ -116,6 +117,7 @@ uint8_t prompt_for_name(char *prompt, uint8_t is_file) {
|
|||||||
goto_prompt_row();
|
goto_prompt_row();
|
||||||
putchar(CLREOL);
|
putchar(CLREOL);
|
||||||
printf("%c%s>%c", INVERSE, prompt, NORMAL);
|
printf("%c%s>%c", INVERSE, prompt, NORMAL);
|
||||||
|
gotox(2 + strlen(prompt));
|
||||||
i = 0;
|
i = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
c = cgetc();
|
c = cgetc();
|
||||||
@ -130,9 +132,9 @@ uint8_t prompt_for_name(char *prompt, uint8_t is_file) {
|
|||||||
case BACKSPACE:
|
case BACKSPACE:
|
||||||
case DELETE:
|
case DELETE:
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
putchar(BACKSPACE);
|
gotox(wherex() - 1);
|
||||||
putchar(' ');
|
cputc(' ');
|
||||||
putchar(BACKSPACE);
|
gotox(wherex() - 1);
|
||||||
--i;
|
--i;
|
||||||
} else
|
} else
|
||||||
putchar(BELL);
|
putchar(BELL);
|
||||||
@ -142,7 +144,7 @@ uint8_t prompt_for_name(char *prompt, uint8_t is_file) {
|
|||||||
i = 255;
|
i = 255;
|
||||||
goto esc_pressed;
|
goto esc_pressed;
|
||||||
default:
|
default:
|
||||||
putchar(c);
|
cputc(c);
|
||||||
userentry[i++] = c;
|
userentry[i++] = c;
|
||||||
}
|
}
|
||||||
if (i == 79)
|
if (i == 79)
|
||||||
@ -305,6 +307,7 @@ uint8_t load_file(char *filename) {
|
|||||||
FILE *fp = fopen(filename, "r");
|
FILE *fp = fopen(filename, "r");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return 1;
|
return 1;
|
||||||
|
goto_prompt_row();
|
||||||
gapbegin = 0;
|
gapbegin = 0;
|
||||||
gapend = BUFSZ - 1;
|
gapend = BUFSZ - 1;
|
||||||
col = 0;
|
col = 0;
|
||||||
@ -332,7 +335,7 @@ uint8_t load_file(char *filename) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((gapbegin % 1000) == 0)
|
if ((gapbegin % 1000) == 0)
|
||||||
putchar('.');
|
cputc('.');
|
||||||
}
|
}
|
||||||
--gapbegin; // Eat EOF character
|
--gapbegin; // Eat EOF character
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -345,19 +348,23 @@ uint8_t load_file(char *filename) {
|
|||||||
* filename - name of file to load
|
* filename - name of file to load
|
||||||
* Returns 0 on success
|
* Returns 0 on success
|
||||||
* 1 if file can't be opened
|
* 1 if file can't be opened
|
||||||
* 2 gapbuf is corrupt
|
|
||||||
*/
|
*/
|
||||||
#pragma code-name (push, "LC")
|
#pragma code-name (push, "LC")
|
||||||
uint8_t save_file(char *filename) {
|
uint8_t save_file(char *filename) {
|
||||||
char c;
|
char c;
|
||||||
|
uint16_t p = gapbegin;
|
||||||
FILE *fp = fopen(filename, "w");
|
FILE *fp = fopen(filename, "w");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return 1;
|
return 1;
|
||||||
if (jump_pos(0))
|
jump_pos(0);
|
||||||
return 2;
|
goto_prompt_row();
|
||||||
while (get_char(&c) == 0)
|
while (get_char(&c) == 0) {
|
||||||
fputc(c, fp);
|
fputc(c, fp);
|
||||||
|
if ((gapbegin % 1000) == 0)
|
||||||
|
cputc('.');
|
||||||
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
jump_pos(p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#pragma code-name (pop)
|
#pragma code-name (pop)
|
||||||
@ -390,7 +397,7 @@ uint8_t read_char_update_pos(void) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (do_print)
|
if (do_print)
|
||||||
putchar(c);
|
cputc(c);
|
||||||
++col;
|
++col;
|
||||||
if (do_print)
|
if (do_print)
|
||||||
rowlen[row] = col;
|
rowlen[row] = col;
|
||||||
@ -464,17 +471,17 @@ void draw_screen(void) {
|
|||||||
read_char_update_pos();
|
read_char_update_pos();
|
||||||
|
|
||||||
goto_prompt_row();
|
goto_prompt_row();
|
||||||
|
printf("%s-? Help ", openapple);
|
||||||
|
gotox(10);
|
||||||
revers(1);
|
revers(1);
|
||||||
if (strlen(filename)) {
|
if (strlen(filename)) {
|
||||||
printf("%c File:%s", modified ? '*' : ' ', filename);
|
cprintf(" %c File:%s", modified ? '*' : ' ', filename);
|
||||||
for (startpos = 0; startpos < 64 - strlen(filename); ++startpos)
|
for (startpos = 0; startpos < 62 - strlen(filename); ++startpos)
|
||||||
putchar(' ');
|
cputc(' ');
|
||||||
} else {
|
} else {
|
||||||
printf(
|
cprintf(
|
||||||
"File:NONE ");
|
" File:NONE ");
|
||||||
}
|
}
|
||||||
printf("%s-? Help", openapple);
|
|
||||||
putchar(HOME);
|
|
||||||
|
|
||||||
gotoxy(curscol, cursrow);
|
gotoxy(curscol, cursrow);
|
||||||
cursor(1);
|
cursor(1);
|
||||||
@ -548,7 +555,9 @@ void update_after_delete_char(void) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Erase char to left of cursor & update row, col
|
// Erase char to left of cursor & update row, col
|
||||||
putchar(BACKSPACE);
|
gotox(wherex() - 1);
|
||||||
|
cputc(' ');
|
||||||
|
gotox(wherex() - 1);
|
||||||
if (col > 0)
|
if (col > 0)
|
||||||
--col;
|
--col;
|
||||||
else {
|
else {
|
||||||
@ -609,6 +618,7 @@ void update_after_insert_char(void) {
|
|||||||
|
|
||||||
curscol = col;
|
curscol = col;
|
||||||
cursrow = row;
|
cursrow = row;
|
||||||
|
gotoxy(curscol, cursrow);
|
||||||
|
|
||||||
if (cursrow == NROWS) {
|
if (cursrow == NROWS) {
|
||||||
scroll_down();
|
scroll_down();
|
||||||
@ -793,32 +803,29 @@ void word_right(void) {
|
|||||||
/*
|
/*
|
||||||
* Jump forward 15 screen lines
|
* Jump forward 15 screen lines
|
||||||
*/
|
*/
|
||||||
#pragma code-name (push, "LC")
|
|
||||||
void page_down(void) {
|
void page_down(void) {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i = 0; i < 15; ++i)
|
for (i = 0; i < 15; ++i)
|
||||||
if (cursor_down() == 1)
|
if (cursor_down() == 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#pragma code-name (pop)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Jump back 15 screen lines
|
* Jump back 15 screen lines
|
||||||
*/
|
*/
|
||||||
#pragma code-name (push, "LC")
|
|
||||||
void page_up(void) {
|
void page_up(void) {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i = 0; i < 15; ++i)
|
for (i = 0; i < 15; ++i)
|
||||||
if (cursor_up() == 1)
|
if (cursor_up() == 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#pragma code-name (pop)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Help screen
|
* Help screen
|
||||||
*/
|
*/
|
||||||
#pragma code-name (push, "LC")
|
#pragma code-name (push, "LC")
|
||||||
void help(void) {
|
void help(void) {
|
||||||
|
revers(0);
|
||||||
cursor(0);
|
cursor(0);
|
||||||
clrscr();
|
clrscr();
|
||||||
printf("EDITOR HELP\n\n");
|
printf("EDITOR HELP\n\n");
|
||||||
@ -831,9 +838,9 @@ void help(void) {
|
|||||||
printf(" %s-Q Quit\n", openapple);
|
printf(" %s-Q Quit\n", openapple);
|
||||||
printf(" %s-R Replace string\n", openapple);
|
printf(" %s-R Replace string\n", openapple);
|
||||||
printf(" %s-S Save file\n", openapple);
|
printf(" %s-S Save file\n", openapple);
|
||||||
printf(" [Return] Mark end of paragraph\n");
|
printf(" [Return] End paragraph\n");
|
||||||
printf(" [Delete] Delete character left\n");
|
printf(" [Delete] Delete char left\n");
|
||||||
printf(" %s-[Delete] Delete character right\n", openapple);
|
printf(" %s-[Delete] Delete char right\n", openapple);
|
||||||
printf(" Arrows Move the cursor\n");
|
printf(" Arrows Move the cursor\n");
|
||||||
printf(" %s-Up arrow Page up\n", openapple);
|
printf(" %s-Up arrow Page up\n", openapple);
|
||||||
printf(" %s-Down arrow Page down\n", openapple);
|
printf(" %s-Down arrow Page down\n", openapple);
|
||||||
@ -895,7 +902,7 @@ int edit(char *fname) {
|
|||||||
videomode(VIDEOMODE_80COL);
|
videomode(VIDEOMODE_80COL);
|
||||||
if (fname) {
|
if (fname) {
|
||||||
strcpy(filename, fname);
|
strcpy(filename, fname);
|
||||||
printf("Loading file %s ", filename);
|
cprintf("Loading file %s ", filename);
|
||||||
if (load_file(filename)) {
|
if (load_file(filename)) {
|
||||||
sprintf(userentry, "Can't load %s", filename);
|
sprintf(userentry, "Can't load %s", filename);
|
||||||
show_error(userentry);
|
show_error(userentry);
|
||||||
@ -1122,6 +1129,7 @@ int edit(char *fname) {
|
|||||||
case 0x80 + 'S': // OA-S "Save"
|
case 0x80 + 'S': // OA-S "Save"
|
||||||
case 0x80 + 's': // OA-s
|
case 0x80 + 's': // OA-s
|
||||||
save();
|
save();
|
||||||
|
draw_screen();
|
||||||
break;
|
break;
|
||||||
case 0x80 + DELETE: // OA-Backspace
|
case 0x80 + DELETE: // OA-Backspace
|
||||||
case 0x04: // Ctrl-D "DELETE"
|
case 0x04: // Ctrl-D "DELETE"
|
||||||
|
Loading…
Reference in New Issue
Block a user