11
votes

Comment utiliser getch à partir de malédictions sans effacer l'écran?

J'apprends à programmer en C et que je souhaite pouvoir taper des caractères dans le terminal pendant que mon code est en cours d'exécution sans appuyer sur retour kbd>. Mon programme fonctionne, cependant, lorsque j'appelle initscr () code>, l'écran est effacé - même après avoir appelé filtre () code>. La documentation pour filtre code> suggère qu'il devrait désactiver l'effacement - mais ce n'est pas le cas pour moi.

#include <stdio.h>
#include <curses.h>
#include <term.h>

int main(void) {

    int ch;

    filter();
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    while((ch = getch()) != EOF);

    endwin();

    return 0;
}


2 commentaires

Pour les PDCurs, vous pouvez définir les variables d'environnement PDC_PRESERVE_SCREEN ou PDC_RESTORE_SREN sur n'importe quelle valeur: de l'historique des fichiers:


PDC_PRESERVE_SCREEN Si cette variable d'environnement est définie, les PDCurses n'effaceront pas l'écran sur le blanc par défaut sur Black au démarrage. Cela vous permet de superposer une fenêtre sur le dessus du fond de l'écran existant. Pdc_restore_screen Si cette variable d'environnement est définie, les PDCurs prendront une copie du contenu de l'écran au moment du démarrage des PDCurs; Initscr (), et quand endwin () est appelé, l'écran sera restauré.


4 Réponses :


0
votes

Utiliser newterm () au lieu de initscr () , tu devrais être bien alors. Et n'oubliez pas delScreen () si vous suivez ce conseil.


6 commentaires

Bonjour, merci pour la réponse, j'ai essayé ce que vous avez dit et la fonctionnalité est la même - l'écran a été nettoyé à nouveau. À la place de initscr () j'ai fichier * fOfen_id = fopen ("/ dev / tty", "r +"); Écran * TERMREF = NEWTERM (NULL, FILE_ID, FILE_ID); et au lieu de endwin () J'ai delScreen (TERMREF) .


Étrange mais cela ne clarme pas mon écran lorsque je l'utilise au lieu de initscr () . Je l'appelle comme Newterm (null, stdin, stdout) cependant.


La seule raison pour laquelle il ne dégage pas votre écran, Mike, c'est que vous avez inversé les arguments à Newterm (). Il faut stdout, stdin, pas stdin, stdout. Je parie après la course de votre programme de test, votre entrée est folle? N'écho-t-il pas, peut-être? Si vous utilisez l'ordre d'argument correct pour Newterm (), il efface effectivement l'écran. Votre réponse est juste mal.


Pourquoi ne pas supprimer cette réponse?


Je suis tout pour cela, mais je ne peux pas sembler supprimer la réponse pendant qu'elle est acceptée @tedlyngmo. Toute aide est la bienvenue.


@ mike.dld je vois. Je me souviens maintenant que ça me passe aussi. Eh bien, cela répond à cette question. :-)



2
votes

Extension de la réponse de Mike.dld, cela fonctionne pour moi sur MacOS X 10.6.6 (GCC 4.5.2) avec la bibliothèque System Curse - sans effacer l'écran. J'ai ajouté la possibilité d'enregistrer les caractères saisis (enregistrés dans un fichier "x") et la possibilité de taper contrôler-d kbd> et d'arrêter le programme plutôt que de forcer l'utilisateur à interrompre.

#include <stdio.h>
#include <curses.h>
#include <term.h>

#define CONTROL(x)  ((x) & 0x1F)

int main(void)
{
    FILE *fp = fopen("x", "w");
    if (fp == 0)
        return(-1);
    SCREEN *s = newterm(NULL, stdin, stdout);
    if (s == 0)
        return(-1);
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    int ch;
    while ((ch = getch()) != EOF && ch != CONTROL('d'))
        fprintf(fp, "%d\n", ch);

    endwin();

    return 0;
}


2 commentaires

Cela précise l'écran pour moi (cela ne fonctionne donc pas).


@ NH2: Cela pourrait dépendre de votre type de terminal et de la saisie des malédictions que vous utilisez.



1
votes

Fondamentalement, la malédiction est conçue pour prendre en charge l'écran (ou la fenêtre, dans le cas d'une borne vitrée). Vous ne pouvez pas vraiment mélanger des malédictions avec Stdio, et vous ne pouvez pas vraiment utiliser des malédictions pour simplement entrer ou sortir quelque chose sans gâcher avec le reste de l'écran. Il y a des solutions de contournement partielle, mais vous n'allez jamais vraiment pouvoir faire fonctionner la façon dont cela semble être comme vous le souhaitez. Désolé.

Je suggérerais de réécrire votre programme d'utiliser des malédictions tout au long ou d'enquêter sur des alternatives telles que Lisline.


0 commentaires

2
votes

Vous verriez votre écran effacé dans une demande de malédiction pour l'une de ces raisons:


0 commentaires