Portál AbcLinuxu, 12. května 2025 08:27
getch()
?
getch()
je např. v ncurses.
getc()
(viz. man 3 getc
)
switch (getch()){ case 'a' : vypis(); break; }tak ze v dose ked stlacim klaves a, tak sa mi tato funkcia vypis hned vyvola, bez toho aby som zadaval za 'a' este 'enter'
initscr(); nodelay(); getch();
switch (getch()){ case 'a' : vypis(); break; }
initscr();
cbreak();
switch(getch())
{
case 'a': printf("hallo");
break;
}
#include <ncurses.h> int main() { initscr(); cbreak (); noecho (); switch(getch()) { case 'a': printfw("hallo"); refresh(); break; } endwin(); return 0; }
/tmp/ccVbJu1B.o: In function `main': 1.c:(.text+0x573): undefined reference to `initscr' 1.c:(.text+0x578): undefined reference to `cbreak' 1.c:(.text+0x57d): undefined reference to `stdscr' 1.c:(.text+0x585): undefined reference to `wgetch' collect2: ld returned 1 exit status
#include <curses.h> /* stdio.h neni nutne je v curses.h */ #include <ctype.h> #define COLOR2 1 /* barvicka 1. */ #define COLOR1 2 /* barvicka 2. */ int main () { int c; char *s; initscr (); cbreak (); noecho (); /* vypnuti echa */ start_color (); /* chceme barvy */ keypad (stdscr, TRUE); /* chceme klavesy pod makry KEY_neco */ curs_set(0); /* at tam ta mrska neblika */ if (!has_colors ()) { /* umi terminal barvy ? */ endwin (); fputs ("Hmm.. tady barvy nejdou !", stderr); exit (1); } /* barva - popredi - pozadi */ init_pair (COLOR1, COLOR_RED, COLOR_BLUE); /* barvicka 1. */ init_pair (COLOR2, COLOR_YELLOW, COLOR_BLACK); /* a druha */ attron (COLOR_PAIR( COLOR1 )); /* pouzivat barvu 1. */ mvaddstr (2, 5, "Cervene na modrem"); attron (COLOR_PAIR( COLOR2 )); mvaddstr (3, 5, "Zlute na cernem"); attron (A_BOLD); /* od ted vse BOLD */ mvaddstr (4, 5, "Zlute na cernem a tucne"); attroff (COLOR_PAIR( COLOR2 )); /* vypne barvu */ mvhline(LINES-2, 0, ACS_HLINE, COLS); /* nakresli caru */ mvaddstr (LINES-1, COLS-15, "F10 - konec"); mvaddstr (10, 5, "Jmeno klavesy:"); while ( (c=getch()) != KEY_F(10)) { s = (char *) keyname(c); /* jmeno klavesy ? */ mvhline(10, 20, ' ', COLS); /* smaz */ if (s) mvprintw (10, 20, "'%s'", s); else mvprintw (10, 20, "'%c'", (isprint(c) ? c : '.')); } erase (); /* smaz nase vytvory */ refresh (); endwin (); /* konec curses */ exit (0); /* ....bye */ }
initscr(); atexit((void(*)(void))endwin); cbreak(); refresh(); switch(getch()) { case 'a': printw("hallo"); sleep(1); break; }... nakonec je potřeba zavolat endwin(), jinak ti to nenavrátí terminál do původního stavu. Na psaní a kreslení je potřeba pak používat funkce z knihovny ncurses (např. printw() místo printf()).
int main(void){ int *p_pole = NULL; initscr(); atexit((void(*)(void))endwin); cbreak(); refresh(); while (1){ printf("\tmenu\n1. obrazok\n2. vypis\n3. vypocitaj\n4. nacitaj hodnoty\n5. usporiadaj\n6. koniec"); printf("\n\nzadajte svoju volbu > "); switch (getch()){ case '1' : system("clear"); obrazok(); break; case '2' : system("clear"); vypis(); break; case '3' : system("clear"); vypocitaj(); break; case '4' : system("clear"); nacitaj_hodnoty(&p_pole); break; case '5' : system("clear"); usporiadaj(p_pole); break; case '6' : return 0; } //system("clear"); } endwin(); }a po spusteni programu je cista obrazovka
#include <stdio.h> #include <termios.h> int main (void) { struct termios term; tcgetattr(0, &term); term.c_lflag &= ~ICANON; tcsetattr(0, TCSANOW, &term); setbuf(stdin, NULL); printf("Press any key to continue...\n"); getc(stdin); return 0; }
// Přečti nastavení terminálu. struct termios terminal_settings, original_terminal_settings; if (tcgetattr(input_fd, &terminal_settings) != 0) { perror("could not read terminal settings"); return false; } // Zapamatuj si je, aby je šlo obnovit na konci programu. original_terminal_settings = new struct termios; memcpy( original_terminal_settings, &terminal_settings, sizeof(struct termios) ); // Nová nastavení terminálu. terminal_settings.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); terminal_settings.c_oflag &= ~OPOST; terminal_settings.c_oflag |= ONLCR; // Překlad LF -> CRLF. terminal_settings.c_lflag &= ~ECHO; // Nevypisovat stisknuté klávesy. terminal_settings.c_lflag &= ~ECHONL; // Nevypisovat klávesu Enter. terminal_settings.c_lflag &= ~ICANON; // Vypnout kanonický režim. terminal_settings.c_lflag &= ~IEXTEN; // Vypnout rozšířené zpracování znaků. terminal_settings.c_cflag &= ~PARENB; // Žádná parita. terminal_settings.c_cflag &= ~CSIZE; terminal_settings.c_cflag |= CS8; // Osmibitové znaky. // Pošli změněná nastavení do terminálu. if (tcsetattr(input_fd, TCSADRAIN, &terminal_settings) != 0) { perror("could not change terminal settings"); return false; }Ale pokud budeš chtít kreslit menu, tak musíš ještě řídit pohyb kurzoru, barvy, atd., to znamená posílat správné řídící sekvence (jejich seznam najdeš například zde), a to bude taky slušné maso
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.