7
votes

Redimensionner le problème des terminaux et du défilement avec des ncurses

Je suis la programmation en C utilisant des bibliothèques NCurses (c'est la première fois) et j'ai deux problèmes. Je suis sur Ubuntu avec le terminal par défaut (borne gnome).

1) J'ai besoin de redimensionner le terminal. J'ai utilisé Resizeter () et redize_term (), mais ils échouent.

2) J'utilise la fonction ScrollOr () et le problème est que je perds des lignes défilées (lorsque je reviens avec WSCRL (), il y a lignes vides). xxx


2 commentaires

Je pense que vous voulez dire redimensionner le terminal, ne pas redimensionner la coquille. La plupart des terminaux ne permettent pas aux séquences d'échappement de les redimensionner, car cela serait extrêmement ennuyant pour l'utilisateur.


@R .. Bah, au moins redimensionnement des émulateurs de terminaux ne serait pas aussi gênant que le redimensionnement des terminaux physiques physiques.


3 Réponses :


8
votes
  1. Vous ne pouvez pas redimensionner la fenêtre du terminal des ncurses. Les fonctions que vous mentionnez redimensionnent la partie de la fenêtre du terminal peint sur des malédictions. L'idée est que vous attrapez le signal SIGWINCH SIGWINCH RESTIZETERM Dans le gestionnaire lorsque l'utilisateur redimensionne la fenêtre de l'extérieur de l'application (à l'aide de la souris, probablement).

  2. Ceci est le comportement prévu, bien que mal documenté dans les ncurses et dans la norme UNIX / POSIX. Documents Documents de NetBSD indiquez explicitement:

    Si n est positif, alors STDSRC est défilé. n les lignes sont perdues Du haut de STDSCR et n blanc Les lignes sont insérées en bas. Si n est négatif puis STDSCR est défilé vers le bas. n lignes vierges sont inséré en haut de STDSCR et n les lignes sont perdues du fond.

    Donc, vous devrez économiser manuellement l'entrée et la réimprimer lors du défilement.


3 commentaires

@R .. & Larsmans: Oui, je voulais dire terminal (Bash est la coquille) ... J'ai corrigé. @Larsmans: 2) J'ai édité la publication initiale en mettant un code simple.


Merci. Je savais déjà que et j'espérais qu'il y avait une autre solution ... Donc, je vais enregistrer manuellement une entrée. À propos du premier problème, je vais redimensionner la fenêtre NCurses selon la taille de la fenêtre du terminal ou je vais utiliser des séquences d'échappement pour redimensionner la fenêtre du terminal.


Il y a plusieurs problèmes avec cette réponse (voir mes commentaires).



0
votes

Vous ne pouvez pas redimensionner la fenêtre du terminal à partir de NCurses, mais vous pouvez redimensionner le terminal que le Redimensionner appel système.

#include <ncurses.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    WINDOW *ventana1;
    system("resize -s 30 80");
    initscr();
    start_color();
    ventana1 = newwin(15, 50, 0, 0);
    init_pair(1,COLOR_YELLOW,COLOR_BLUE);
    init_pair(2,COLOR_BLUE, COLOR_YELLOW);
    wbkgd(ventana1,COLOR_PAIR(1));
    wprintw(ventana1, "POLLO");
    wrefresh(ventana1);
    wgetch(ventana1);
    wgetch(ventana1);
    system("resize -s 20 60");
    wbkgd(ventana1,COLOR_PAIR(2));
    wprintw(ventana1, "POLLO");
    wrefresh(ventana1);
    wgetch(ventana1);
    wgetch(ventana1);
    system("resize -s 35 85");
    system("clear");
    wbkgd(ventana1,COLOR_PAIR(1));
    wprintw(ventana1, "POLLO");
    wrefresh(ventana1);
    wgetch(ventana1);
    wgetch(ventana1);
    delwin(ventana1);
    endwin();
    system("resize -s 25 75");
}


0 commentaires

3
votes

Posix ne couvre pas ce cas, parce que le document malédictions ne fait pas partie de POSIX. L'Open Group arrive à maintenir la documentation pour les deux:

  • X / Open MALÉDICTIONS Numéro 4 Version 2 (aperçu)
  • X / Open Curses, numéro 4 Version 2 (documentation)
  • Les spécifications de base Open Group Numéro 7 IEEE Std 1003.1, 2013 Edition (alias "POSIX")
  • signal.h (notez que SIGWINCH est absent)

    Comme indiqué dans la page de manuel resizeterm < / code> , vous ne devriez pas appeler cette fonction à partir d'un gestionnaire de signal, car il appelle les fonctions « dangereuses ». Le thème des fonctions « dangereuses » est abordée dans plusieurs endroits; que dans la documentation de gcc ferait pour commencer .

    En ce qui concerne la documentation, @larsmans semble citer défilement (3 ) , mais pas des liens citant comparables pour ncurses et "POSIX". Pour ce que ça vaut la peine:

    • ncurses (semble aborder les points implicites être unique NetBSD)
    • X / Open (est nécessairement plus générale, comme il est destiné à couvrir les différentes implémentations)

      Retour à la question OP:

      1. le programme échantillon ne montre pas l'utilisation OP resizeterm ni resize_term . On ne dit pas, mais probablement OP redimensionné la fenêtre du terminal et le programme n'a pas répondu. La page de manuel pour resizeterm est assez clair que ncurses ne provoque pas le terminal à redimensionner. Pour que (sur certains terminaux), on peut utiliser le -s option redimensionnement (un programme utilitaire xterm ). En cas de succès, qui redimensionne le terminal, ce qui envoie un SIGWINCH . ncurses a un gestionnaire de signal prédéfini pour cela, mais en application niveau, la manipulation KEY_RESIZE est la manière recommandée. Il existe plusieurs programmes dans NCurses exemples qui font.
      2. déplacer les lignes up dans une fenêtre se déplace nécessairement une sur de la fenêtre. Cela implique que les lignes sont décalées dans la fenêtre REMPLACER ceux qui ont quitté. Une « fenêtre » est juste que: une vue de taille limitée des données. Pour des vues avec la taille différente, le développeur est conseillé d'utiliser « pads » (voir page de manuel ). Les notes de la défilement page de manuel mentionnent quelques problèmes avec la couleur des blancs (les lignes de remplacement). Il est à la demande il faut laisser le blanc de remplacement ou les remplir avec les données de l'application. Curses ne le fait pas automatiquement (même pas pour les plaquettes).

0 commentaires