diff --git a/editor.c b/editor.c index 1e165e8..c7fd632 100644 --- a/editor.c +++ b/editor.c @@ -1,110 +1,98 @@ -#ifdef _WIN32 - #include // PDCurses verwenden, wenn auf Windows kompiliert -#else - #include // Ncurses verwenden, wenn auf Unix/Linux kompiliert -#endif -#include #include +#include +#include +#include #include #define CTRL_KEY(k) ((k) & 0x1f) -void init_ncurses() { - initscr(); // Startet den ncurses-Modus - raw(); // Direktes Erfassen der Eingaben (kein Zeilenpuffer) - keypad(stdscr, TRUE); // Ermöglicht die Nutzung von Funktionstasten wie den Pfeiltasten - noecho(); // Verhindert, dass Eingaben direkt ausgegeben werden - curs_set(1); // Cursor sichtbar machen +struct termios orig_termios; + +void disable_raw_mode() { + tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios); } -void shutdown_ncurses() { - endwin(); // Beendet den ncurses-Modus +void enable_raw_mode() { + tcgetattr(STDIN_FILENO, &orig_termios); + atexit(disable_raw_mode); + + struct termios raw = orig_termios; + raw.c_lflag &= ~(ECHO | ICANON | ISIG); + raw.c_iflag &= ~(IXON); + + tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw); } void load_file(const char *filename) { FILE *file = fopen(filename, "r"); if (file == NULL) { - mvprintw(1, 0, "Fehler beim Öffnen der Datei %s.", filename); + printf("Fehler beim Öffnen der Datei %s.\n", filename); return; } - int y = 1; char line[256]; while (fgets(line, sizeof(line), file)) { - mvprintw(y++, 0, "%s", line); + printf("%s", line); } fclose(file); } -void insert_char(int y, int x, char ch) { - int max_x = getmaxx(stdscr); - char line[max_x - x]; - - // Speichere den Rest der Zeile ab der aktuellen Position - for (int i = 0; i < max_x - x - 1; ++i) { - line[i] = mvinch(y, x + i) & A_CHARTEXT; - } - line[max_x - x - 1] = '\0'; - - // Setze das neue Zeichen an der aktuellen Position - mvaddch(y, x, ch); - - // Schreibe den Rest der Zeile wieder zurück, um den Text nach rechts zu verschieben - mvprintw(y, x + 1, "%s", line); - move(y, x + 1); -} - void editor_loop() { int ch; - while ((ch = getch()) != 27) { // Beenden mit ESC (ASCII 27) - int y = getcury(stdscr); - int x = getcurx(stdscr); - switch (ch) { - case KEY_UP: - // Cursor nach oben bewegen - move(y - 1, x); - break; - case KEY_DOWN: - // Cursor nach unten bewegen - move(y + 1, x); - break; - case KEY_LEFT: - // Cursor nach links bewegen - move(y, x - 1); - break; - case KEY_RIGHT: - // Cursor nach rechts bewegen - move(y, x + 1); - break; - case KEY_BACKSPACE: - case 127: - // Zeichen löschen (Rückschritt) - move(y, x - 1); - delch(); - break; - case KEY_DC: - // Zeichen löschen (Entfernen) - delch(); - break; - default: - // Zeichen einfügen und Rest der Zeile nach rechts verschieben - insert_char(y, x, ch); - break; + while (1) { + ch = getchar(); + if (ch == '\x1b') { + char seq[3]; + if (read(STDIN_FILENO, &seq[0], 1) != 1) continue; + if (read(STDIN_FILENO, &seq[1], 1) != 1) continue; + + if (seq[0] == '[') { + switch (seq[1]) { + case 'A': + // Cursor nach oben bewegen (nicht implementiert) + printf("\033[A"); + break; + case 'B': + // Cursor nach unten bewegen (nicht implementiert) + printf("\033[B"); + break; + case 'C': + // Cursor nach rechts bewegen + printf("\033[C"); + break; + case 'D': + // Cursor nach links bewegen + printf("\033[D"); + break; + } + } + } else if (ch == 27) { + // ESC-Taste zum Beenden + break; + } else { + switch (ch) { + case 127: + // Zeichen löschen (Rückschritt) + printf("\b \b"); + break; + default: + // Zeichen anzeigen + putchar(ch); + break; + } } - refresh(); + fflush(stdout); } } int main() { - init_ncurses(); + enable_raw_mode(); - mvprintw(0, 0, "Willkommen zu deinem Texteditor! Drücke ESC zum Beenden."); + printf("Willkommen zu deinem Texteditor! Drücke ESC zum Beenden.\n"); load_file("test.txt"); - refresh(); editor_loop(); - shutdown_ncurses(); return 0; }