Wednesday, January 11, 2012

[L] curses

curses里面封装了一下对terminal 还有cursor的用法,从我之前一篇blog也可以看出如果不封装是多么令人肾虚。

需要搞明白一点的是,前面是对terminal进行操作,这个是对X window进行操作。所以从本质上来讲是不一样的。但是用起来感觉没什么大不同。。

1. initscr(), endwin()
  init之后,整个屏幕被刷掉,生成一个新屏幕。在这里只能用curses里面的printw,scanw之类的。因为这是它自己的屏幕。之后endwin()退出。

2. move(x,y)
  封装得够简单了。

3. attron, attroff
  对输出属性进行设置,试一下就知道了。
  至于属性设置参考这里:
  http://www.mkssoftware.com/docs/man3/curs_attr.3.asp

4. refresh()
  把整个屏幕刷新一遍。比如initscr之后,如果不refresh,那么屏幕原来有的还在,很混乱。
  本来应该是所有动作之后都应该refresh一下,但是有些试了下不要也行。个人猜测是覆盖的原因。如果有覆盖的话要refresh().
  还有一点要注意的就是,必须有change 才会刷新。如果没有change还是不变的。如果没有change硬要刷新的话也行,用touchwin(WINDOW).

5. cbreak(), echo()
  前者相当于之前的non-canonical,就是不是一行输入了。变成一个个输入,包括换行。
  后者指定是否回显。

实践代码如下,因为都是终端运行即可见了,所以样例也不用贴了。


代码一:

*注意一点:中间getchar()的时候,不论输入什么也不会回显的。这是因为被流弄走了,但是不会保留在window上。而getstr(), getch()则会留在屏幕上,如果不把echo()关掉的话。


/*
 * =====================================================================================
 *
 *       Filename:  screen1.c
 *
 *    Description:  Uses of curses.h
 *
 *        Version:  1.0
 *        Created:  Wednesday, January 11, 2012 02:55:22 HKT
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Hongchao Deng (fengjingchao), fengjingchao@gmail.com
 *        Company:  Sun Yat-sen University
 *
 * =====================================================================================
 */


#include <errno.h>
#include <math.h>  
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <curses.h>


#define PW_LEN 256
#define NAME_LEN 256


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:  main function
 * =====================================================================================
 */
int
main ( int argc, char *argv[] )
{
   /* Parameters */
   char *scan_ptr;
   char witch_one[] = "First Witch  ";
   char witch_two[] = "Second Witch ";


   /* TODO */
   initscr();


    
   move(5,15);
   attron(A_BOLD);
   printw("%s", "Macintosh");
   attroff(A_BOLD);
   refresh();
   getchar();
   
   move(8,15);
   attron(A_STANDOUT);
   printw("Thunder and lighting");
   attroff(A_STANDOUT);
   refresh();
   getchar();


   move(10,10);
   printw("TEST PRINT");
   move(11,23);
   printw("TEST PRINT");
   refresh();
   getchar();


   attron(A_DIM);
   scan_ptr = witch_one + strlen(witch_one) - 1;
   while(scan_ptr != witch_one){
      move(10,10);
      insch(*--scan_ptr);
   }
   attroff(A_DIM);
   refresh();
   getchar();


   move(LINES -1, COLS -1);
   printw("%s",witch_two);
   refresh();
   getchar();


   clear(); 


   char name[NAME_LEN];
   char password[PW_LEN];


   char *real_password = "123456";


   move(5,10);
   printw("Please login");


   move(7,10);
   printw("User name: ");
   getstr(name);


   move(8,10);
   printw("Password: ");
//   refresh();
   
   cbreak();
   noecho();


   memset(password,0,sizeof(password));
   
   int i=0;
   for(;i<PW_LEN;i++){
      password[i] = getch();
      if( password[i] == '\n') break;
      move(8,20+i);
      addch('*');
//      refresh();
   }
   
   echo();
   nocbreak();


   endwin();
return EXIT_SUCCESS;
} /* ----------  end of function main  ---------- */




××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
代码二:
展示多个window的情况





/*
 * =====================================================================================
 *
 *       Filename:  multiw.c
 *
 *    Description:  Managing Multiple Windows
 *
 *        Version:  1.0
 *        Created:  Wednesday, January 11, 2012 07:42:44 HKT
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Hongchao Deng (fengjingchao), fengjingchao@gmail.com
 *        Company:  Sun Yat-sen University
 *
 * =====================================================================================
 */




#include <errno.h>
#include <math.h>  
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <curses.h>


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:  main function
 * =====================================================================================
 */
int
main ( int argc, char *argv[] )
{
   WINDOW *new_window_ptr;
   WINDOW *popup_window_ptr;


   int x_loop;
   int y_loop;


   char letter = 'a';
   
   initscr();
   
   move(5,5);
   printw("Testing multiple windows");
   refresh();
   sleep(1);


   for ( y_loop = 0;y_loop < LINES -1 ;++y_loop ) {
      for (x_loop = 0; x_loop < COLS -1; ++x_loop) {
         mvaddch(y_loop,x_loop,letter);
         letter++;
         if(letter >'z') letter = 'a';
      }
   }
   refresh();
   getchar();


   new_window_ptr = newwin(10,20,5,5);
   mvwprintw(new_window_ptr,2,5,"Testing multiple windows");
   mvwprintw(new_window_ptr,5,10,"*********************************************************");
   wrefresh(new_window_ptr);
   getchar();


   letter = '0';
   for ( y_loop = 0;y_loop < LINES -1 ;++y_loop ) {
      for (x_loop = 0; x_loop < COLS -1; ++x_loop) {
         mvaddch(y_loop,x_loop,letter);
         letter++;
         if(letter >'9') letter = '0';
      }
   }
  
   refresh();
   getchar();


   wrefresh(new_window_ptr);
   getchar();


   touchwin(new_window_ptr);
   wrefresh(new_window_ptr);
   getchar();


   endwin();


return EXIT_SUCCESS;
} /* ----------  end of function main  ---------- */



No comments:

Post a Comment