0

問題

ncurses プログラムに永続性を追加したいと思います:終了時に最後に表示された画面をディスクに書き込み、エントリ時に最後に表示された画面をディスクから読み戻します。可能であれば、背景色と前景色を含めます。

質問

  1. NWindow または NPanel に表示される ncurses からテキストのブロック全体を読み取る方法はありますか? または、独自のバッファーを維持し、基本的に (バッファーと ncurses に対して) 2 回書き込み/読み取りを行う必要がありますか?
  2. COLOR_PAIR 情報についても同じ質問です。

答え

以下のRiciの答えは完璧ですが、呼び出し順序を正しくするために少し実験する必要がありました.

利用方法

以下のコードは、色の保存と復元に非常に役立ちます。

  • スクリーン ダンプ ファイルを書き出すために、引数なしで 1 回実行します/tmp/scr.dump
  • readファイルから読み取る引数を指定して再度実行します。

コード

#include <ncurses.h>
#include <string.h>

void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string);
int main(int argc, char *argv[])
{

   bool read_mode = ( argc>1 && !strcmp( argv[1], "read" ));

   initscr();          /* Start curses mode        */

   if(has_colors() == FALSE)
   {
       endwin();
       printf("Your terminal does not support color\n");
       return 1;
   }
   start_color();              /* Start color          */
   use_default_colors();   // allow for -1 to mean default color
   init_pair(1, COLOR_RED, -1);

   if ( read_mode )
   {
       refresh();
       if ( scr_restore( "/tmp/scr.dump" )!=OK )
       {
           fprintf( stderr, "ERROR DURING RESTORE\n" );
           return 1;
       }
       doupdate();

       attron(COLOR_PAIR(1));
       print_in_middle(stdscr, LINES / 2 + 9, 0, 0, "Read from /tmp/scr.dump" );
       attroff(COLOR_PAIR(1));
   } else {
       attron(COLOR_PAIR(1));
       print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! In color ...");
       attroff(COLOR_PAIR(1));

       if ( scr_dump( "/tmp/scr.dump" )!=OK )
       {
           fprintf( stderr, "ERROR WHILE DUMPING" );
           return 1;
       }
   }

  getch();
   endwin();
}

void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
{  int length, x, y;
   float temp;

   if(win == NULL)
       win = stdscr;
   getyx(win, y, x);
   if(startx != 0)
       x = startx;
   if(starty != 0)
       y = starty;
   if(width == 0)
       width = 80;

   length = strlen(string);
   temp = (width - length)/ 2;
   x = startx + (int)temp;
   mvwprintw(win, y, x, "%s", string);
   refresh();
}
4

1 に答える 1