Создаю текстовый редактор на C++, и курсор не хочет двигатьсяC++

Программы на C++. Форум разработчиков
Anonymous
Создаю текстовый редактор на C++, и курсор не хочет двигаться

Сообщение Anonymous »

Я новичок, поэтому, пожалуйста, не будьте слишком строги ко мне, я следую руководству, которое дал мой друг, по созданию текстового редактора с C++ на WSL, я уже создал функциональные возможности для клавиши со стрелками, но они по какой-то причине отказываются двигаться.
Я пытался изменить функцию editorMoveCursor, добавляя дополнительные операторы if, но это не сработало
Я пытался изменить кое-что с функциями, связанными с памятью, потому что До этого у меня была ошибка сегментации, поэтому я, хотя это могло быть связано, не сработало.

Код: Выделить всё

/*** includes ***/

enum editorKey {
ARROW_LEFT = 1000,
ARROW_RIGHT,
ARROW_UP,
ARROW_DOWN,
DEL_KEY,
HOME_KEY,
END_KEY,
PAGE_UP,
PAGE_DOWN
};
struct editorConfig {
int cx, cy;
int rowoff; // row offset
int coloff; // column offset
int screenrows;
int screencols;
int numrows;
std::vector row;
struct termios orig_termios;
};

editorConfig E;

/*** terminal ***/

void killswitch(const char *s) {
write(STDOUT_FILENO, "\x1b[2J", 4);
write(STDOUT_FILENO, "\x1b[H", 3);

perror(s);
exit(1);
}

int editorReadKey() {
int nread;
char c;
while ((nread = read(STDIN_FILENO, &c, 1)) != 1) {
if (nread == -1 && errno != EAGAIN) killswitch("read");
}

if (c == '\x1b') {
char seq[3];

if (read(STDIN_FILENO, &seq[0], 1) != 1) return '\x1b';
if (read(STDIN_FILENO, &seq[1], 1) != 1) return '\x1b';

if (seq[0] == '[') {
if (seq[1] >= '0' && seq[1] = E.rowoff + E.screenrows) { // check if moved outside window
E.rowoff = E.cy - E.screenrows + 1;
}
if (E.cx < E.coloff) {
E.coloff = E.cx;
}
if (E.cx >= E.coloff + E.screencols) {
E.coloff = E.cx - E.screencols + 1;
}
}

void editorDrawRows(abuf *ab) {
int y;
for (y = 0; y < E.screenrows; y++) {
int filerow = y + E.rowoff; // to display each y position
if (filerow >= E.numrows) {
if (E.numrows == 0 && y == E.screenrows / 3) {
char welcome[80];
int welcomelen = snprintf(welcome, sizeof(welcome),
"Kilo editor -- version %s", KILO_VERSION);
if (welcomelen > E.screencols) welcomelen = E.screencols;
int padding = (E.screencols - welcomelen) / 2;
if (padding) {
abAppend(ab, "~", 1);
padding--;
}
while (padding--) abAppend(ab, " ", 1);
abAppend(ab, welcome, welcomelen);
} else {
abAppend(ab, "~", 1);
}
} else {
int len = E.row[filerow].rsize - E.coloff;
if (len < 0) len = 0;
if (len >  E.screencols) len = E.screencols;
abAppend(ab, &E.row[filerow].render[E.coloff], len);
}

abAppend(ab, "\x1b[K", 3);
if (y < E.screenrows - 1) {
abAppend(ab, "\r\n", 2);
}
}
}

void editorRefreshScreen() {
editorScroll();
abuf ab;

abAppend(&ab, "\x1b[?25l", 6);
abAppend(&ab, "\x1b[H", 3);

editorDrawRows(&ab);

char buf[32];
snprintf(buf, sizeof(buf), "\x1b[%d;%dH", (E.cy - E.rowoff) + 1, (E.cx - E.coloff) + 1);
abAppend(&ab, buf, strlen(buf));

abAppend(&ab, "\x1b[?25h", 6);

write(STDOUT_FILENO, ab.b, ab.len);
abFree(&ab);
}

/*** input ***/

void editorMoveCursor(int key) {
erow *row = (E.cy >= E.numrows) ? nullptr : &E.row[E.cy];
switch (key) {
case ARROW_LEFT:
if (E.cx != 0) {
E.cx--;
} else if (E.cy > 0) {
E.cy--;
E.cx = E.row[E.cy].size;
}
break;
case ARROW_RIGHT:
if (row && E.cx < row->size) {
E.cx++;
} else if (row && E.cx == row->size) {
E.cy++;
E.cx = 0;
}
break;
case ARROW_UP:
if (E.cy != 0) {
E.cy--;
}
break;
case ARROW_DOWN:
if (E.cy < E.numrows - 1) {
E.cy++;
}
break;
}
row = (E.cy >= E.numrows) ? nullptr : &E.row[E.cy];
int rowlen = row ? row->size : 0;
if (E.cx > rowlen) {
E.cx = rowlen;
}
}

void editorProcessKeypress() {
int c = editorReadKey();

switch (c) {
case CTRL_KEY('q'):
write(STDOUT_FILENO, "\x1b[2J", 4);
write(STDOUT_FILENO, "\x1b[H", 3);
exit(0);
break;

case HOME_KEY:
E.cx = 0;
break;

case END_KEY:
E.cx = E.screencols - 1;
break;

case PAGE_UP:
case PAGE_DOWN:
{
int times = E.screenrows;
while (times--)
editorMoveCursor(c == PAGE_UP ? ARROW_UP : ARROW_DOWN);
}
break;

case ARROW_UP:
case ARROW_DOWN:
case ARROW_LEFT:
case ARROW_RIGHT:
editorMoveCursor(c);
break;
}
}

если вы хотите, чтобы весь код находился здесь: https://github.com/AnasAlmukahal/text-e ... n/kilo.cpp

Подробнее здесь: https://stackoverflow.com/questions/786 ... nt-to-move

Вернуться в «C++»