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. P>
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). p>
3 Réponses :
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 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: p>
Si n em> est positif, alors Donc, vous devrez économiser manuellement l'entrée et la réimprimer lors du défilement. P> LI>
ol> SIGWINCH CODE> SIGWINCH CODE
RESTIZETERM CODE> Dans le gestionnaire lorsque l'utilisateur redimensionne la fenêtre de l'extérieur de l'application em> (à l'aide de la souris, probablement). P> li>
STDSRC code>
est défilé. n em> les lignes sont perdues
Du haut de
STDSCR code> et n em> blanc
Les lignes sont insérées en bas. Si
n em> est négatif puis
STDSCR code> est défilé vers le bas. n em> lignes vierges sont
inséré en haut de
STDSCR code> et
n em> les lignes sont perdues du fond. p>
blockQuote>
@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).
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"); }
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: p>
signal.h code>
(notez que SIGWINCH code> est absent) li>
ul>
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 . p>
En ce qui concerne la documentation, @larsmans semble citer défilement (3 ) code>
, mais pas des liens citant comparables pour ncurses et "POSIX". Pour ce que ça vaut la peine: p>
- ncurses (semble aborder les points implicites être unique NetBSD) li>
- X / Open (est nécessairement plus générale, comme il est destiné à couvrir les différentes implémentations) li>
ul>
Retour à la question OP: p>
- le programme échantillon ne montre pas l'utilisation OP
resizeterm code> ni resize_term code>. 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 code> est assez clair que ncurses ne provoque pas le terminal à redimensionner. Pour que em> (sur certains terminaux), on peut utiliser le -s code> option redimensionnement code>
(un programme utilitaire xterm code>
). En cas de succès, qui redimensionne le terminal, ce qui envoie un SIGWINCH code>.
ncurses a un gestionnaire de signal prédéfini pour cela, mais en application em> niveau, la manipulation KEY_RESIZE code> est la manière recommandée. Il existe plusieurs programmes dans NCurses exemples qui font. Li>
- déplacer les lignes up em> dans une fenêtre se déplace nécessairement une sur em> de la fenêtre. Cela implique que les lignes sont décalées dans em> la fenêtre REMPLACER em> 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). Li>
ol>
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 i> physiques.