|
|
LXXV. Ncurses 端末画面制御関数
ncurses (new curses) は、System V Rel 4.0(及びそれ以前)のcursesのフ
リーなソフトウエアエミュレーションです。ncursesは、terminfo型式を使
用し、パッド、カラー、複数のハイライト、フォーム文字、ファンクショ
ンキーマッピングをサポートします。
このライブラリは、対話的なものであるため、
Webアプリケーションを作成する際にはほとんど使用されませんが、
コマンドラインからPHPを使用
するスクリプトを書く際には有用です。
警告 | このモジュールは、
実験的なものです。これは、これらの関数の動作、関
数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリ
リースで変更される可能性があります。注意を喚起するとともに、このモジュー
ルは使用者のリスクで使用して下さい。 |
Ncursesは以下のプラットフォームで利用可能です。
AIX BeOS Cygwin Digital Unix (aka OSF1) FreeBSD GNU/Linux HPUX IRIX OS/2 SCO OpenServer Solaris SunOS
ncursesライブラリがインストールされていることが必要です。最新のバー
ジョンを
または他のGNUミラー
サイトからダウンロードし、コンパイル、インストールして下さい。
これらの関数を動作させるには、--with-ncursesを指定してCGIまたはCLIバー
ジョンのPHPをコンパイルする必要があります。
これらの関数の動作は、php.iniの設定により変化します。
表 1. Ncurses設定オプション 名前 | デフォルト | 変更の可否 |
---|
ncurses.value | "42" | PHP_INI_ALL | ncurses.string | "foobar" | PHP_INI_ALL |
PHP_INI_* 定数の詳細と定義については、
ini_set()を参照して下さい。
この拡張モジュールはリソース型を全く定義しません。
これらの定数は、この拡張モジュールで定義されており、
この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー
ドされるかのどちらかの場合のみ使用可能です。
エラー時にncurese関数は、NCURSES_ERRを返します。
表 2. ncursesカラー定数 定数 | 意味 |
---|
NCURSES_COLOR_BLACK | no color (black) | NCURSES_COLOR_WHITE | white | NCURSES_COLOR_RED | red - supported when terminal is in color mode | NCURSES_COLOR_GREEN | green - supported when terminal is in color mod | NCURSES_COLOR_YELLOW | yellow - supported when terminal is in color mod | NCURSES_COLOR_BLUE | blue - supported when terminal is in color mod | NCURSES_COLOR_CYAN | cyan - supported when terminal is in color mod | NCURSES_COLOR_MAGENTA | magenta - supported when terminal is in color mod |
表 3. ncursesキー定数 定数 | 意味 |
---|
NCURSES_KEY_F0 - NCURSES_KEY_F64 | function keys F1 - F64 | NCURSES_KEY_DOWN | down arrow | NCURSES_KEY_UP | up arrow | NCURSES_KEY_LEFT | left arrow | NCURSES_KEY_RIGHT | right arrow | NCURSES_KEY_HOME | home key (upward+left arrow) | NCURSES_KEY_BACKSPACE | backspace | NCURSES_KEY_DL | delete line | NCURSES_KEY_IL | insert line | NCURSES_KEY_DC | delete character | NCURSES_KEY_IC | insert char or enter insert mode | NCURSES_KEY_EIC | exit insert char mode | NCURSES_KEY_CLEAR | clear screen | NCURSES_KEY_EOS | clear to end of screen | NCURSES_KEY_EOL | clear to end of line | NCURSES_KEY_SF | scroll one line forward | NCURSES_KEY_SR | scroll one line backward | NCURSES_KEY_NPAGE | next page | NCURSES_KEY_PPAGE | previous page | NCURSES_KEY_STAB | set tab | NCURSES_KEY_CTAB | clear tab | NCURSES_KEY_CATAB | clear all tabs | NCURSES_KEY_SRESET | soft (partial) reset | NCURSES_KEY_RESET | reset or hard reset | NCURSES_KEY_PRINT | print | NCURSES_KEY_LL | lower left | NCURSES_KEY_A1 | upper left of keypad | NCURSES_KEY_A3 | upper right of keypad | NCURSES_KEY_B2 | center of keypad | NCURSES_KEY_C1 | lower left of keypad | NCURSES_KEY_C3 | lower right of keypad | NCURSES_KEY_BTAB | back tab | NCURSES_KEY_BEG | beginning | NCURSES_KEY_CANCEL | cancel | NCURSES_KEY_CLOSE | close | NCURSES_KEY_COMMAND | cmd (command) | NCURSES_KEY_COPY | copy | NCURSES_KEY_CREATE | create | NCURSES_KEY_END | end | NCURSES_KEY_EXIT | exit | NCURSES_KEY_FIND | find | NCURSES_KEY_HELP | help | NCURSES_KEY_MARK | mark | NCURSES_KEY_MESSAGE | message | NCURSES_KEY_MOVE | move | NCURSES_KEY_NEXT | next | NCURSES_KEY_OPEN | open | NCURSES_KEY_OPTIONS | options | NCURSES_KEY_PREVIOUS | previous | NCURSES_KEY_REDO | redo | NCURSES_KEY_REFERENCE | ref (reference) | NCURSES_KEY_REFRESH | refresh | NCURSES_KEY_REPLACE | replace | NCURSES_KEY_RESTART | restart | NCURSES_KEY_RESUME | resume | NCURSES_KEY_SAVE | save | NCURSES_KEY_SBEG | shiftet beg (beginning) | NCURSES_KEY_SCANCEL | shifted cancel | NCURSES_KEY_SCOMMAND | shifted command | NCURSES_KEY_SCOPY | shifted copy | NCURSES_KEY_SCREATE | shifted create | NCURSES_KEY_SDC | shifted delete char | NCURSES_KEY_SDL | shifted delete line | NCURSES_KEY_SELECT | select | NCURSES_KEY_SEND | shifted end | NCURSES_KEY_SEOL | shifted end of line | NCURSES_KEY_SEXIT | shifted exit | NCURSES_KEY_SFIND | shifted find | NCURSES_KEY_SHELP | shifted help | NCURSES_KEY_SHOME | shifted home | NCURSES_KEY_SIC | shifted input | NCURSES_KEY_SLEFT | shifted left arrow | NCURSES_KEY_SMESSAGE | shifted message | NCURSES_KEY_SMOVE | shifted move | NCURSES_KEY_SNEXT | shifted next | NCURSES_KEY_SOPTIONS | shifted options | NCURSES_KEY_SPREVIOUS | shifted previous | NCURSES_KEY_SPRINT | shifted print | NCURSES_KEY_SREDO | shifted redo | NCURSES_KEY_SREPLACE | shifted replace | NCURSES_KEY_SRIGHT | shifted right arrow | NCURSES_KEY_SRSUME | shifted resume | NCURSES_KEY_SSAVE | shifted save | NCURSES_KEY_SSUSPEND | shifted suspend | NCURSES_KEY_UNDO | undo | NCURSES_KEY_MOUSE | mouse event has occured | NCURSES_KEY_MAX | maximum key value |
表 4. マウス定数 定数 | 意味 |
---|
NCURSES_BUTTON1_RELEASED - NCURSES_BUTTON4_RELEASED | button (1-4) released | NCURSES_BUTTON1_PRESSED - NCURSES_BUTTON4_PRESSED | button (1-4) pressed | NCURSES_BUTTON1_CLICKED - NCURSES_BUTTON4_CLICKED | button (1-4) clicked | NCURSES_BUTTON1_DOUBLE_CLICKED -
NCURSES_BUTTON4_DOUBLE_CLICKED | button (1-4) double clicked | NCURSES_BUTTON1_TRIPLE_CLICKED -
NCURSES_BUTTON4_TRIPLE_CLICKED | button (1-4) triple clicked | NCURSES_BUTTON_CTRL | ctrl pressed during click | NCURSES_BUTTON_SHIFT | shift pressed during click | NCURSES_BUTTON_ALT | alt pressed during click | NCURSES_ALL_MOUSE_EVENTS | report all mouse events | NCURSES_REPORT_MOUSE_POSITION | report mouse position |
add a note
User Contributed Notes
Ncurses 端末画面制御関数
kermodebear at kermodebear dot org
17-Jun-2004 07:27
An implementation of a scrolling selection box:
<?php
function ncurses_menu_select( $options, $values, $max_height = 7, $max_width = 20, $y = 2, $x = 2 ) {
$height = $max_height - 2;
$width = $max_width - 2;
$num_options = count( $options );
foreach( $options as $key => $value ) {
$options[ $key ] = substr( $value, 0, $width );
}
$menu_window = ncurses_newwin( $max_height, $max_width, $y, $x );
ncurses_wborder( $menu_window, 0, 0, 0, 0, 0, 0, 0, 0 );
$current = 0; $position = 1; $topitem = 0; for ( $a = 0; $a < min( $height, $num_options ); $a++ ) {
if ( $a == $current ) {
ncurses_wattron( $menu_window, NCURSES_A_REVERSE );
ncurses_mvwaddstr( $menu_window, 1 + $a, 1, $options[ $a ] );
ncurses_wattroff( $menu_window, NCURSES_A_REVERSE );
} else {
ncurses_mvwaddstr( $menu_window, 1 + $a, 1, $options[ $a ] );
}
}
ncurses_mvwaddstr( $menu_window, 1, 0, '*' );
ncurses_wrefresh( $menu_window );
while( ! in_array( $key = ncurses_getch( $menu_window ), array( 13, 10 ) ) ) {
if ( $key == NCURSES_KEY_UP && $current > 0 ) {
$move = -1;
} else if ( $key == NCURSES_KEY_DOWN && $current < $num_options - 1 ) {
$move = 1;
} else {
continue;
}
$current += $move;
$position += $move;
if ( $position < 1 || $position > $height ) {
if ( $position < 1 ) {
$position = 1;
} else {
$position = $height;
}
$topitem += $move;
for ( $a = 1; $a <= $height; $a++ ) {
ncurses_mvwaddstr( $menu_window, $a, 1, str_repeat( ' ', $width ) );
if ( $a == $position ) {
ncurses_wattron( $menu_window, NCURSES_A_REVERSE );
ncurses_mvwaddstr( $menu_window, $a, 1, $options[ $topitem + $a - 1 ] );
ncurses_wattroff( $menu_window, NCURSES_A_REVERSE );
} else {
ncurses_mvwaddstr( $menu_window, $a, 1, $options[ $topitem + $a - 1 ] );
}
}
} else { ncurses_wattron( $menu_window, NCURSES_A_REVERSE );
ncurses_mvwaddstr( $menu_window, $position, 1, $options[ $current ] );
ncurses_wattroff( $menu_window, NCURSES_A_REVERSE );
ncurses_mvwaddstr( $menu_window, $position - $move, 1, $options[ $current - $move ] );
}
ncurses_wborder( $menu_window, 0, 0, 0, 0, 0, 0, 0, 0 );
$dot_position = round ( ( $current / $num_options ) * ( $height - 1 ) );
ncurses_mvwaddstr( $menu_window, 1 + $dot_position, 0, '*' );
ncurses_wrefresh( $menu_window );
}
return $values[ $current ];
}
?>
kermodebear at kermodebear dot org
17-Jun-2004 05:21
Not calling ncurses_end() can (will) cause issues with terminals. Although registering a shutdown function which includes ncurses_end() may help, sometimes things go awry and you're stuck with a terminal that is acting in strange ways.
This can be fixed! *NIX systems (FreeBSD, Linux, UNIX, et al.) usually support the 'reset' command which resets the terminal settings and allows you to get things back to normal.
kermodebear at kermodebear dot org
17-Jun-2004 05:17
Here is a function that takes an associative array, presents a menu in a new window, allows the user to make a choice using up and down arrows and the enter key, and returns the value of the menu item.
Limitations include:
No way of scrolling a long list, either horiontally or vertically;
No arguments for placement on screen, although this is easy to add;
No multiple selection;
Will produce all kinds of errors and warnings if the terminal is smaller than is necessary to create the window.
I'm very new at using the ncurses library; Comments and improvements would be greatly appreciated!
<?php
function ncurses_menu_select( $menu ) {
$keys = array_keys( $menu );
$values = array_values( $menu );
$height = $width = 0;
$height = count( $menu ) + 2;
foreach( $values as $value ) {
$width = max( $width, strlen( $value ) + 2 );
}
$menu_window = ncurses_newwin( $height, $width, 5, 5 );
ncurses_wborder( $menu_window, 0,0, 0,0, 0,0, 0,0 );
$current = 0;
for( $a = 0; $a < count( $values ); $a++ ) {
if ( $a == $current ) {
ncurses_wattron( $menu_window, NCURSES_A_REVERSE );
ncurses_mvwaddstr( $menu_window, 1 + $a, 1, $values[ $a ] );
ncurses_wattroff( $menu_window, NCURSES_A_REVERSE );
} else {
ncurses_mvwaddstr( $menu_window, 1 + $a, 1, $values[ $a ] );
}
}
ncurses_wrefresh( $menu_window );
while( ! in_array( $key = ncurses_getch( $menu_window ), array( 13, 10 ) ) ) {
if ( $key == NCURSES_KEY_UP AND $current > 0 ) {
$move = -1;
} else if ( $key == NCURSES_KEY_DOWN and $current < count( $values ) - 1 ) {
$move = 1;
} else {
$move = 0;
}
ncurses_mvwaddstr( $menu_window, 1 + $current, 1, $values[ $current ] );
$current += $move;
ncurses_wattron( $menu_window, NCURSES_A_REVERSE );
ncurses_mvwaddstr( $menu_window, 1 + $current, 1, $values[ $current ] );
ncurses_wattroff( $menu_window, NCURSES_A_REVERSE );
ncurses_wrefresh( $menu_window );
}
ncurses_delwin( $menu_window );
return $keys[ $current ];
}
?>
Example Use:
<?php
$ncurse = ncurses_init();
$fullscreen = ncurses_newwin ( 0, 0, 0, 0);
ncurses_border(0,0, 0,0, 0,0, 0,0);
ncurses_refresh();
$menu_items = array(
'one' => 'Menu Item #1',
'two' => 'Menu Item #2',
'three' => 'Menu Item #3' );
$selection = ncurses_menu_select( $menu_items );
ncurses_mvaddstr( 1, 1, 'You selected ' . $menu_items[$selection] . ' with the value ' . $selection );
ncurses_refresh( $fullscreen );
ncurses_end();
?>
Habib Valanejad
25-Feb-2004 05:46
What if you want to draw a new window and after removing it, showing the pervious screen again? Unfortunately, there is no such a thing in php/ncurses as there is in original curses library (touchwin if I'm not mistaken - It has been a long time!).
However, you can do this by a simple trick! You can
dump the screen to a temp file and then restore it back
again!
Take a look at this function:
# Function: show_a_win()
# - Displays a small window and writes something in it.
# - waits for a key
# - shows the pervious screen again
function show_a_win()
{
# Dump the current screen into a temp file:
$tmpfile = tempnam("/tmp", "dump.");
# Create a new window.
$newwin = ncurses_newwin(4, 60, 10, 10);
# Write something and then refresh it
ncurses_mvwaddstr($newwin, 1, 1, "This is a test.");
ncurses_wrefresh($newwin);
# Wait for a key
ncurses_wgetch($newwin);
ncurses_delwin($newwin); /* delete the window */
/* Restore the screen the same way it was before entering
* into the function:
*/
ncurses_scr_restore($tmpfile);
unlink($tmpfile); /* Remove temp file */
}
Habib Valanejad
11-Dec-2003 10:30
Here is a function which would do the job for missing
ncurses_wclrtoeol() function:
/* wclrtoeol()
* Erases the current line to the right of the cursor
*/
function wclrtoeol($win)
{
# get current position
ncurses_getyx($win, &$crow, &$ccol);
# get maximum row and col for this window:
ncurses_getmaxyx($win, &$max_row, &$max_col);
for ($col = $ccol; $col < $max_col; $col ++){
ncurses_wmove($win, $crow, $col);
ncurses_waddch($win, 32);
}
}
rainman at darkwired dot org
14-Aug-2003 02:49
A simple article I wrote about php-ncurses:
https://www.darkwired.org/pub/papers/articles/php-ncurses/
rainman at darkwired dot org
31-Jul-2003 11:55
This is not meant as spam to get people to use my client.
I have been working on a PHP4 IRC client with ncurses interface and I think it is a useful example of how ncurses with php could be used.
It is GPL licensed so you can just go and take a loot at it.
It can be found at or
I hope this will help out some of you because php ncurses can be quite difficult I experienced :]
For any questions about the code you can ofcourse just mail me.
Habib Valanejad
25-Jun-2003 09:50
I had a small problem building php+ncurses support.
ncurses include files were installed in:
ncurses_installed_dir/include/ncurses
This caused problems when building php with ncurse support.
php was looking for include files in:
ncurses_installed_dir/include
However, include files were located in include/ncurses
I had to make symbolic links of files in ncurses directory so php could see them:
# cd ncurses_insalled_directory/include
# ln -s ncurses/* .
After that it worked.
alex at kazik dot de
19-Jun-2003 12:29
Here is a more complex example, I wrote:
philip at cornado dot com
05-Jun-2003 06:01
A nice introductory PHP + Ncurses tutorial can be seen here:
*
Habib Valanejad
28-Mar-2003 02:13
For those of you who want to check if <ENTER> key is passed,
you have to check the key agains both NL and CR keys:
function get_str()
{
for ($str = "";;){
$key = ncurses_getch();
switch ($key){
case 10: // newline
case 13: // Carrige Return
return($str);
default:
$str .= chr($key);
ncurses_refresh();
} // switch
} // for
} // get_str()
Hope that would help.
25-Mar-2003 03:18
In the example above, if you run resize from a C shell it will output the sizes in C shell syntax, run resize with -u to force Bourne syntax:
The $win parameter is just for future compatibility.
function ncurses_getmaxyx($win, &$y, &$x)
{
exec("/usr/X11R6/bin/resize -u", $output);
$cols = explode("=", $output[0]);
$rows = explode("=", $output[1]);
$x = intval($cols[1]);
$y = intval($rows[1]);
}
joeldegan AT yahoo.com
15-Dec-2002 08:26
See the documentation for ncurses_border and ncurses_wrefresh for some more examples of doing windowing and dynamic sizing.. I also posted some information to the zend.com code-gallery for doing ncurses under php.
joeldegan AT yahoo.com
14-Dec-2002 11:10
I noticed a lack of a getxy() function so I wrote one.
You may need to change the path for your resize cmd.
<?
function getxy(){
$rez = `/usr/X11R6/bin/resize`;
$rez = explode("\n",$rez);
while(list($key,$val)=each($rez)){
$a=explode("=",$val);
if(trim($a[0])=="COLUMNS"){ $COLUMNS = $a[1]; }
if(trim($a[0])=="LINES"){ $LINES = $a[1]; }
}$retval[0]=$COLUMNS;
$retval[1]=$LINES;
return $retval;
}
print_r(getxy());
?>
joeldegan AT yahoo.com
14-Dec-2002 10:37
This is from the examples that come with the latest release.
From:
php-4.3.0RC3/ext/ncurses/example1.php
I found this useful...
<?php
$n=0;
ncurses_init();
if(ncurses_has_colors()){
ncurses_start_color();
ncurses_init_pair(1,NCURSES_COLOR_RED,NCURSES_COLOR_BLACK);
ncurses_init_pair(2,NCURSES_COLOR_GREEN,NCURSES_COLOR_BLACK);
ncurses_init_pair(3,NCURSES_COLOR_YELLOW,NCURSES_COLOR_BLACK);
ncurses_init_pair(4,NCURSES_COLOR_BLUE,NCURSES_COLOR_BLACK);
ncurses_init_pair(5,NCURSES_COLOR_MAGENTA,NCURSES_COLOR_BLACK);
ncurses_init_pair(6,NCURSES_COLOR_CYAN,NCURSES_COLOR_BLACK);
ncurses_init_pair(7,NCURSES_COLOR_WHITE,NCURSES_COLOR_BLACK);
}
while(1){
for ($x=0; $x<80; $x++) {
for ($y=0; $y<24; $y++) {
$n++;
ncurses_move($y,$x);
ncurses_addch($n+64);
ncurses_color_set($n%8);
ncurses_refresh();
if($n>26)$n=0;
}
}
ncurses_getch();
}
?>
joeldegan AT yahoo.com
14-Dec-2002 06:56
actually *that* example does not work...
here is one that I took and trimmed down from the ncurses examples.
I will do some more and post them here..
<?
ncurses_init();
ncurses_noecho();
$large = ncurses_newwin(20, 60, 2, 10);
$small = ncurses_newwin(10, 30, 7, 25);
ncurses_refresh();
ncurses_wrefresh($large);
ncurses_wrefresh($small);
ncurses_mvwaddstr($small, 5, 5, " Test String ");
ncurses_wrefresh($small);
ncurses_getch();
ncurses_end(); ?>
This is from PHP 4.3.0RC0 compiled with the following flags..
./configure --prefix=/wwwroot/php --with-config-file-path=/wwwroot/php --with-mysql --enable-pcntl --with-tsrm-pthreads --enable-sysvsem --enable-sysvshm --with-curl --enable-bcmath --enable-sigchild --enable-sockets --with-ncurses
nweeks at utas dot edu dot au
08-Nov-2002 12:43
With your CGI version of PHP compiled with ncurses support, console apps are amazingly easy!
For example:
whack the following into a file, chmod +x it, and run it.
#!/usr/local/bin/php -q
<?php
ncurses_init();
ncurses_border(25,25,18,18,24,24,23,23); ncurses_move(1,1); ncurses_addstr("Welcome to NCurses");
ncurses_addstr(" with PHP!");
ncurses_refresh(); ncurses_end(); ?>
You'll notice the second addstr simply tacks onto the first.
zak at php dot net
30-May-2002 11:34
There is a simple ncurses application in the PHP source tree. See
| |