Implémenter la superposition dans le terminal

Je veux créer une superposition dans le terminal

Ce Q & D montre l’heure en bas à droite

#include  #include  #include  #include  #include  #include  #include  static char termbuf[2048]; int main() { char *termtype = getenv("TERM"); time_t timer; char buffer[26]; struct tm* tm_info; if (tgetent(termbuf, termtype) < 0) { error(EXIT_FAILURE, 0, "Could not access the termcap data base.\n"); return 1; } int lines = tgetnum("li"); int columns = tgetnum("co"); int pos=1; while (1) { time(&timer); tm_info = localtime(&timer); strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info); printf("\033[s"); fflush(stdout); printf("\033[%d;%dH%s\n", lines - 2, columns - 20, buffer); printf("\033[u"); sleep(1); } return 0; } 

il est compilé avec:

 $ gcc time-overlay.c -ltermcap -o time-overlay 

Et pour l’utiliser:

 $ ./time-overlay & 

Il montrera:

  2017-04-29 12:29:15 

Et garder le temps de mise à jour.

Arrêter:

 $ fg Ctrl+C 

Mais existe-t-il un meilleur moyen de le faire avec une bibliothèque qui abstrait les appels de bas niveau (comme enregistrer la position du curseur ou imprimer une ligne / un col)?

Je veux conserver la sortie du terminal existant (pour que les curses avec initscr () ne fonctionnent pas)

Voici comment utiliser termcap (ou n’importe quoi qui fournit une interface termcap, par exemple ncurses):

 #include  #include  #include  #include  #include  #include  #define MAXTERM 2048 #define EndOf(s) (s) + strlen(s) int main(void) { char termbuf[MAXTERM]; char workbuf[MAXTERM]; char *working = workbuf; int lines, columns; char *save_cursor, *move_cursor, *restore_cursor; if (tgetent(termbuf, getenv("TERM")) < 0) { fprintf(stderr, "Could not access the termcap database.\n"); return EXIT_FAILURE; } lines = tgetnum("li"); columns = tgetnum("co"); save_cursor = tgetstr("sc", &working); move_cursor = tgetstr("cm", &working); restore_cursor = tgetstr("rc", &working); while (1) { time_t timer; char buffer[1024]; struct tm *tm_info; time(&timer); tm_info = localtime(&timer); strcpy(buffer, save_cursor); sprintf(EndOf(buffer), tgoto(move_cursor, columns - 20, lines - 2)); strftime(EndOf(buffer), 26, "%Y-%m-%d %H:%M:%S", tm_info); strcat(buffer, restore_cursor); write(fileno(stderr), buffer, strlen(buffer)); sleep(1); } return EXIT_SUCCESS; } 

Il pourrait encore être amélioré, car toutes les descriptions de terminal ne garantissent pas que les différentes chaînes renvoyées par tgetstr sont bien évidemment gérées, et les applications termcap ont toujours des problèmes de dépassement de mémoire tampon.