ncurses INPUT problem



  • hi leute!

    ich habe eine frage und zwar ist es moeglich mit ncurses eine tastenabfrage NUR dann zu machen waenn eine taste gedrueckt ist? also in dem sinn:

    while(1){
       if(TASTEGEDRUECKT)
          char x = getch();
    }/*end while*/
    

    damit will ich das bezwecken, das die schleife nicht auf eine eingabe wartet sondern einfach weiter macht bis eine eingabe getaetigt wird



  • man nodelay
    man halfdelay

    Außerdem hat das mit ANSI C _nichts_ zu tun. Es gibt auch ein Linuxforum.



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • hi

    so hab mir das nun angeschaut aber es will nicht funken was hat es da?

    int main(void){
        /*init vars*/
        WINDOW *backround;
        char input = 'r';
    
        /*init nCurses*/
        initscr();
        backround=newwin(0,0,0,0);
        nodelay(backround, TRUE);
        curs_set(FALSE);
    
        if(backround == NULL)
            endwin();
    
        /*hauptschleife*/
        while(1){
            if(getchar() != ERR)
                input = getchar();
            mvaddch(LINES / 2, 5, 'i');   
            refresh();
        }/*end while*/
    
        /*exit programm*/
        endwin();
        return 0;
    }/*end main*/
    

    es wird einfach nicht ueber das getchar druebergesprungen kann mir villeicht jemand ein codebeispiel darueber zeigen??

    danke



  • Naja, getchar hat wiederrum mit ncurses nicht zu tun.



  • Hallo!

    Benutze noecho() nach initscr(). Mit

    int c = 0; if ((c = getch()) != 0)
    

    kann die Tasteneingabe in eine Variable gespeichert werden.

    Gruß
    Michael



  • hi!

    ich habs nun so probiert:

    int main(void){
        /*init vars*/
        WINDOW *backround;
    
        /*init nCurses*/
        initscr();
        noecho();
        nodelay(backround, FALSE);
        backround=newwin(0,0,50,60);
    
        curs_set(FALSE);
    
        if(backround == NULL)
            endwin();
    
        int i = 1;
        /*hauptschleife*/
        while(1){
            int c = 'a';
            if ((c = getch()) != 0);
            mvaddch(LINES / 2, 5, c);
            mvaddch(LINES / 3, i, 'g');
            i++;
            refresh();
        }/*end while*/
    
        /*exit programm*/
        endwin();
        return 0;
    }/*end main*/
    

    es muesste nun waenn ich das prog starte gleich anfangen lauter g s auf die konsole zu schreiben aber das tut es nicht es wartet immer auf eine eingabe bei jedem schleifendurchlauf 😞 (was es nicht sollte)!!

    ich bekomm es einfach nicht hin

    wie wuerdet ihr das loesen?

    ps: kann man auch mit ncurses einzelne pixel bzw linien zeichnen?

    danke!



  • keine ne ahnung wie das funken koennte?



  • Hab ich das richtig verstanden, du willst einfach nur schauen ob eine taste gedrückt wurde?

    wenn ja dann würde ich das in C so machen.

    if(kbhit())
    {
      c=getch();
      //und dann deine eigendliche abfrage
    }
    

    das kbhit ist immer nur dann true wenn auch wirklich eine eingab an der Tastatur erfolgt ist



  • Hallo!

    Hier mal ein kleines Beispielprogramm:

    #include <ncurses.h>
    
    int main (void)
    {
        WINDOW *mainwin;
        int c = 0, i, j;
    
        initscr(); 
        noecho();
        cbreak();
    
        if (has_colors())
        {
    	start_color();
    	init_pair(1, COLOR_YELLOW, COLOR_BLUE);
        }
    
        mainwin = newwin(LINES, COLS, 0, 0);
        wbkgd(mainwin, COLOR_PAIR(1));
        keypad(mainwin, TRUE);
        nodelay(mainwin, TRUE); // WICHTIG!
    
        while(1)
        {
    	for (i = 0; i < LINES; i++)
    	    for (j = 0; j < COLS; j++)
    	    {
    		c = wgetch(mainwin); // WICHTIG!
    		if (c == 'q')
    		    goto quit;
    		mvwaddch(mainwin, i, j, ACS_HLINE);
    		wrefresh(mainwin);
    		sleep(1); // muss nicht sein!
    	    }
        }
        quit:
        endwin();
        exit(0);
    }
    

    Gruß
    Michael



  • Hallo!

    ps: kann man auch mit ncurses einzelne pixel bzw linien zeichnen?

    Ncurses ist eine library, die nur zeichenorientiert arbeitet. Es können nur Buchstaben, Zahlen, Sonderzeichen oder auch einfache Linienzeichen dargestellt werden. Einzelne Pixel können auf der Konsole mit SVGAlib angesprochen werden.

    Gruß
    Michael


Anmelden zum Antworten