PHP: Ncurses 端末画面制御関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<syslogncurses_addch>
view the version of this page
Last updated: Tue, 21 Dec 2004

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_BLACKno color (black)
NCURSES_COLOR_WHITEwhite
NCURSES_COLOR_REDred - supported when terminal is in color mode
NCURSES_COLOR_GREENgreen - supported when terminal is in color mod
NCURSES_COLOR_YELLOWyellow - supported when terminal is in color mod
NCURSES_COLOR_BLUEblue - supported when terminal is in color mod
NCURSES_COLOR_CYANcyan - supported when terminal is in color mod
NCURSES_COLOR_MAGENTAmagenta - supported when terminal is in color mod

キー

表 3. ncursesキー定数

定数意味
NCURSES_KEY_F0 - NCURSES_KEY_F64function keys F1 - F64
NCURSES_KEY_DOWNdown arrow
NCURSES_KEY_UPup arrow
NCURSES_KEY_LEFTleft arrow
NCURSES_KEY_RIGHTright arrow
NCURSES_KEY_HOMEhome key (upward+left arrow)
NCURSES_KEY_BACKSPACEbackspace
NCURSES_KEY_DLdelete line
NCURSES_KEY_ILinsert line
NCURSES_KEY_DCdelete character
NCURSES_KEY_ICinsert char or enter insert mode
NCURSES_KEY_EICexit insert char mode
NCURSES_KEY_CLEARclear screen
NCURSES_KEY_EOSclear to end of screen
NCURSES_KEY_EOLclear to end of line
NCURSES_KEY_SFscroll one line forward
NCURSES_KEY_SRscroll one line backward
NCURSES_KEY_NPAGEnext page
NCURSES_KEY_PPAGEprevious page
NCURSES_KEY_STABset tab
NCURSES_KEY_CTABclear tab
NCURSES_KEY_CATABclear all tabs
NCURSES_KEY_SRESETsoft (partial) reset
NCURSES_KEY_RESETreset or hard reset
NCURSES_KEY_PRINTprint
NCURSES_KEY_LLlower left
NCURSES_KEY_A1upper left of keypad
NCURSES_KEY_A3upper right of keypad
NCURSES_KEY_B2center of keypad
NCURSES_KEY_C1lower left of keypad
NCURSES_KEY_C3lower right of keypad
NCURSES_KEY_BTABback tab
NCURSES_KEY_BEGbeginning
NCURSES_KEY_CANCELcancel
NCURSES_KEY_CLOSEclose
NCURSES_KEY_COMMANDcmd (command)
NCURSES_KEY_COPYcopy
NCURSES_KEY_CREATEcreate
NCURSES_KEY_ENDend
NCURSES_KEY_EXITexit
NCURSES_KEY_FINDfind
NCURSES_KEY_HELPhelp
NCURSES_KEY_MARKmark
NCURSES_KEY_MESSAGEmessage
NCURSES_KEY_MOVEmove
NCURSES_KEY_NEXTnext
NCURSES_KEY_OPENopen
NCURSES_KEY_OPTIONSoptions
NCURSES_KEY_PREVIOUSprevious
NCURSES_KEY_REDOredo
NCURSES_KEY_REFERENCEref (reference)
NCURSES_KEY_REFRESHrefresh
NCURSES_KEY_REPLACEreplace
NCURSES_KEY_RESTARTrestart
NCURSES_KEY_RESUMEresume
NCURSES_KEY_SAVEsave
NCURSES_KEY_SBEGshiftet beg (beginning)
NCURSES_KEY_SCANCELshifted cancel
NCURSES_KEY_SCOMMANDshifted command
NCURSES_KEY_SCOPYshifted copy
NCURSES_KEY_SCREATEshifted create
NCURSES_KEY_SDCshifted delete char
NCURSES_KEY_SDLshifted delete line
NCURSES_KEY_SELECTselect
NCURSES_KEY_SENDshifted end
NCURSES_KEY_SEOLshifted end of line
NCURSES_KEY_SEXITshifted exit
NCURSES_KEY_SFINDshifted find
NCURSES_KEY_SHELPshifted help
NCURSES_KEY_SHOMEshifted home
NCURSES_KEY_SICshifted input
NCURSES_KEY_SLEFTshifted left arrow
NCURSES_KEY_SMESSAGEshifted message
NCURSES_KEY_SMOVEshifted move
NCURSES_KEY_SNEXTshifted next
NCURSES_KEY_SOPTIONSshifted options
NCURSES_KEY_SPREVIOUSshifted previous
NCURSES_KEY_SPRINTshifted print
NCURSES_KEY_SREDOshifted redo
NCURSES_KEY_SREPLACEshifted replace
NCURSES_KEY_SRIGHTshifted right arrow
NCURSES_KEY_SRSUMEshifted resume
NCURSES_KEY_SSAVEshifted save
NCURSES_KEY_SSUSPENDshifted suspend
NCURSES_KEY_UNDOundo
NCURSES_KEY_MOUSEmouse event has occured
NCURSES_KEY_MAXmaximum key value

マウス

表 4. マウス定数

定数意味
NCURSES_BUTTON1_RELEASED - NCURSES_BUTTON4_RELEASEDbutton (1-4) released
NCURSES_BUTTON1_PRESSED - NCURSES_BUTTON4_PRESSEDbutton (1-4) pressed
NCURSES_BUTTON1_CLICKED - NCURSES_BUTTON4_CLICKEDbutton (1-4) clicked
NCURSES_BUTTON1_DOUBLE_CLICKED - NCURSES_BUTTON4_DOUBLE_CLICKEDbutton (1-4) double clicked
NCURSES_BUTTON1_TRIPLE_CLICKED - NCURSES_BUTTON4_TRIPLE_CLICKEDbutton (1-4) triple clicked
NCURSES_BUTTON_CTRLctrl pressed during click
NCURSES_BUTTON_SHIFTshift pressed during click
NCURSES_BUTTON_ALTalt pressed during click
NCURSES_ALL_MOUSE_EVENTSreport all mouse events
NCURSES_REPORT_MOUSE_POSITIONreport mouse position
目次
ncurses_addch --  カレント位置に文字を追加し、カーソルを進める
ncurses_addchnstr --  カレント位置に指定した長さの属性付きの文字列を追加する
ncurses_addchstr --  カレントの位置に属性付きの文字列を追加する
ncurses_addnstr --  カレントの位置に指定した長さの文字列を追加する
ncurses_addstr -- カレント位置にテキストを出力する
ncurses_assume_default_colors -- カラー0のデフォルト色を定義する
ncurses_attroff -- 指定した属性を無効とする
ncurses_attron -- 指定した属性を有効にする
ncurses_attrset -- 指定した属性を設定する
ncurses_baudrate -- 端末のボーレートを返す
ncurses_beep -- 端末のビープを鳴らす
ncurses_bkgd -- 端末画面の背景属性を設定する
ncurses_bkgdset -- 画面背景を制御する
ncurses_border -- 属性付きの文字で画面周囲に境界を描画する
ncurses_bottom_panel --  Moves a visible panel to the bottom of the stack
ncurses_can_change_color -- 端末の色を変更可能かどうか確認する
ncurses_cbreak -- 入力のバッファリングを変更する
ncurses_clear -- スクリーンをクリアする
ncurses_clrtobot -- カレント位置から最下部までスクリーンをクリアする
ncurses_clrtoeol -- カレント位置から行末までスクリーンをクリアする
ncurses_color_content --  Gets the RGB value for color
ncurses_color_set -- 前景/背景色を設定する
ncurses_curs_set -- カーソル状態を設定する
ncurses_def_prog_mode -- 端末(プログラム)モードを保存する
ncurses_def_shell_mode -- 端末(シェル)モードを保存する
ncurses_define_key -- キーコードを定義する
ncurses_del_panel --  Remove panel from the stack and delete it (but not the associated window)
ncurses_delay_output -- パディング文字を用いて端末出力を遅延させる
ncurses_delch --  カレント位置の文字を削除し、残った部分を左に移動する
ncurses_deleteln --  カレント位置の行を削除し、残りの部分を上に上げる
ncurses_delwin -- ncursesウインドウを削除する
ncurses_doupdate --  準備中の全ての出力を書き込み、端末をリフレッシュする
ncurses_echo -- キーボード入力のエコーを有効とする
ncurses_echochar -- リファレッシュを行いつつ1文字出力する
ncurses_end -- ncursesを終了し、画面を消去する
ncurses_erase -- 端末画面を消去する
ncurses_erasechar -- 消去されたカレントの文字を返す
ncurses_filter -- 
ncurses_flash -- 端末画面をフラッシュする(ビジュアルベル)
ncurses_flushinp -- キーボード入力バッファをフラッシュする
ncurses_getch -- キーボードから1文字読み込む
ncurses_getmaxyx -- Returns the size of a window
ncurses_getmouse -- マウスイベントを読みこむ
ncurses_getyx --  Returns the current cursor position for a window
ncurses_halfdelay -- 端末をハーフディレイモードにする
ncurses_has_colors -- カラー端末かどうか確認する
ncurses_has_ic -- 挿入/削除機能の有無を確認する
ncurses_has_il -- 行挿入/削除機能の有無を確認する
ncurses_has_key --  端末キーボードにおいてファンクションキーの有無を調べる
ncurses_hide_panel --  Remove panel from the stack, making it invisible
ncurses_hline --  カレント位置に属性付きの文字を用いて最大n文字長の線を水平に描画する
ncurses_inch -- カレント位置の文字と属性を取得する
ncurses_init_color -- 新規にRGB値を設定する
ncurses_init_pair -- 色の組を確保する
ncurses_init -- ncursesを初期化する
ncurses_insch --  文字を挿入し、カレント位置にある文字を含む残りの行を移動する
ncurses_insdelln --  カレント行の後に複数の行を挿入し、スクロールダウンする(負の数を指 定すると削除し、スクロールアップする)
ncurses_insertln -- 行を挿入し、残りの部分をスクロールダウンする
ncurses_insstr --  カレント位置に文字列を挿入し、残りの行を右に移動する
ncurses_instr -- 端末画面から文字列を読み込む
ncurses_isendwin --  Ncursesがendwinモードの場合、通常の画面出力が実行可能
ncurses_keyok -- キーコードを有効または無効にする
ncurses_keypad --  Turns keypad on or off
ncurses_killchar -- カレントの行削除文字を返す
ncurses_longname -- 端末の説明を返す
ncurses_meta --  Enables/Disable 8-bit meta key information
ncurses_mouse_trafo --  Transforms coordinates
ncurses_mouseinterval -- マウスボタンクリックのタイムアウトを設定する
ncurses_mousemask -- マウスオプションを設定する
ncurses_move_panel --  Moves a panel so that its upper-left corner is at [startx, starty]
ncurses_move -- 出力位置を移動する
ncurses_mvaddch -- カレント位置を移動し、文字を追加する
ncurses_mvaddchnstr --  位置を移動し、指定長の属性付きの文字列を追加する
ncurses_mvaddchstr --  位置を移動し、属性付きの文字列を追加する
ncurses_mvaddnstr -- 位置を移動し、指定長の文字列を追加する
ncurses_mvaddstr -- 位置を移動し、文字列を追加する
ncurses_mvcur -- 直ちにカーソルを移動する
ncurses_mvdelch -- 位置を移動し、文字を削除、行の残りを左シフトする
ncurses_mvgetch -- 位置を移動し、新しい位置で文字を得る
ncurses_mvhline --  位置を新しく設定し、属性付きの文字を用いて最大n文字の水平線を描画
ncurses_mvinch --  位置を移動し、新しい位置の属性付きの文字を取得する
ncurses_mvvline --  位置を新しく設定し、属性付きの文字を用いて最大n文字の垂直線を描画 する
ncurses_mvwaddstr -- ウインドウの新規位置に文字列を追加する
ncurses_napms -- スリープ
ncurses_new_panel --  Create a new panel and associate it with window
ncurses_newpad --  Creates a new pad (window)
ncurses_newwin -- 新規ウインドウを作成する
ncurses_nl -- 改行を復改/ラインフィードに変換
ncurses_nocbreak -- 端末をcookedモードに変更する
ncurses_noecho -- キーボード入力エコーを無効にする
ncurses_nonl -- 改行を復改/ラインフィードに変換しない
ncurses_noqiflush -- シグナル文字のフラッシュを無効とする
ncurses_noraw -- 端末をrawモード以外に変更する
ncurses_pair_content --  Gets the RGB value for color
ncurses_panel_above --  Returns the panel above panel
ncurses_panel_below --  Returns the panel below panel
ncurses_panel_window --  Returns the window associated with panel
ncurses_pnoutrefresh --  Copies a region from a pad into the virtual screen
ncurses_prefresh --  Copies a region from a pad into the virtual screen
ncurses_putp -- 
ncurses_qiflush -- シグナル文字のフラッシュを有効とする
ncurses_raw -- 端末をrawモードに変更する
ncurses_refresh -- 画面をリフレッシュする
ncurses_replace_panel --  Replaces the window associated with panel
ncurses_reset_prog_mode --  Resets the prog mode saved by def_prog_mode
ncurses_reset_shell_mode --  Resets the shell mode saved by def_shell_mode
ncurses_resetty -- 保存した端末モードに復帰する
ncurses_savetty -- 端末の状態を保存する
ncurses_scr_dump -- 画面の内容をファイルにダンプする
ncurses_scr_init -- ファイルダンプから画面を初期化する
ncurses_scr_restore -- ファイルダンプから画面を復帰する
ncurses_scr_set -- ファイルダンプから画面を継承する
ncurses_scrl --  カレント位置を変更せずに画面の内容をスクロールアップまたはダウン する
ncurses_show_panel --  Places an invisible panel on top of the stack, making it visible
ncurses_slk_attr -- カレントのソフトラベルキー属性を返す
ncurses_slk_attroff -- 
ncurses_slk_attron -- 
ncurses_slk_attrset -- 
ncurses_slk_clear -- 画面からソフトラベルをクリアする
ncurses_slk_color -- ソフトラベルキーの色を設定する
ncurses_slk_init -- ソフトラベルキー関数を初期化する
ncurses_slk_noutrefresh -- 仮想画面にソフトラベルキーをコピーする
ncurses_slk_refresh -- ソフトラベルキーを画面にコピーする
ncurses_slk_restore -- ソフトラベルキーを復帰する
ncurses_slk_set --  Sets function key labels
ncurses_slk_touch --  ncurses_slk_noutrefreshを実行する際に強制的に出力する
ncurses_standend -- 'standout'属性の使用を停止する
ncurses_standout -- 'standout'属性の使用を開始する
ncurses_start_color -- 色の使用を開始する
ncurses_termattrs --  端末でサポートされる全ての属性フラグの論理和を返す
ncurses_termname -- 端末の(簡略)-名を返す
ncurses_timeout -- 特別なキーシーケンスのタイムアウトを設定する
ncurses_top_panel --  Moves a visible panel to the top of the stack
ncurses_typeahead --  typeahead確認用に別のファイル記述子を指定する
ncurses_ungetch -- 入力ストリームに1文字戻す
ncurses_ungetmouse -- マウスイベントをキーにプッシュする
ncurses_update_panels --  Refreshes the virtual screen to reflect the relations between panels in the stack
ncurses_use_default_colors --  端末のデフォルト色をカラーID -1に割り付ける
ncurses_use_env -- 端末の大きさに関する環境情報の使用を制御する
ncurses_use_extended_names --  terminfo記述において拡張名の使用を制御する
ncurses_vidattr -- 
ncurses_vline --  カレント位置に最大n文字の属性付きの文字を用いて垂直線を描画する
ncurses_waddch --  Adds character at current position in a window and advance cursor
ncurses_waddstr --  Outputs text at current postion in window
ncurses_wattroff --  Turns off attributes for a window
ncurses_wattron --  Turns on attributes for a window
ncurses_wattrset --  Set the attributes for a window
ncurses_wborder -- Draws a border around the window using attributed characters
ncurses_wclear --  Clears window
ncurses_wcolor_set --  Sets windows color pairings
ncurses_werase --  Erase window contents
ncurses_wgetch --  Reads a character from keyboard (window)
ncurses_whline --  Draws a horizontal line in a window at current position using an attributed character and max. n characters long
ncurses_wmouse_trafo --  Transforms window/stdscr coordinates
ncurses_wmove --  Moves windows output position
ncurses_wnoutrefresh --  Copies window to virtual screen
ncurses_wrefresh -- 端末画面のウインドウをリフレッシュする
ncurses_wstandend --  End standout mode for a window
ncurses_wstandout --  Enter standout mode for a window
ncurses_wvline --  Draws a vertical line in a window at current position using an attributed character and max. n characters long


add a note 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 ) {
      
// Size inside of borders
      
$height = $max_height - 2;
      
$width  = $max_width  - 2;

      
// Number of options
      
$num_options = count( $options );

      
// Trim all values to fit
      
foreach( $options as $key => $value ) {
              
$options[ $key ] = substr( $value, 0, $width );
       }

      
// Create Window
      
$menu_window = ncurses_newwin( $max_height, $max_width, $y, $x );
      
ncurses_wborder( $menu_window, 0, 0, 0, 0, 0, 0, 0, 0 );

      
// Initialize Window
      
$current = 0; // Currently selected
      
$position = 1; // Position in list
      
$topitem = 0; // Top menu item
      
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 );
      
// Loop until a selection is made
      
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 we scroll off the window, redraw items.
              
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 {
// Just update changed items
                      
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 ] );
               }
              
// Update 'scroll bar dot'
              
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
/**
 * Create a simple selection menu
 * @param array Associative array; The value will be shown on the menu, while the key will be returned when the associated value is selected.
 * @return mixed
 */
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
// Initialie ncurses
$ncurse = ncurses_init();
// A full screen window
$fullscreen = ncurses_newwin ( 0, 0, 0, 0);
// Add a pretty border
ncurses_border(0,0, 0,0, 0,0, 0,0);
// Draw everything so far
ncurses_refresh();

// Set up menu array
$menu_items = array(
      
'one'  => 'Menu Item #1',
      
'two'  => 'Menu Item #2',
      
'three' => 'Menu Item #3' );
// Display menu and return selection
$selection = ncurses_menu_select( $menu_items );

// Print selection
ncurses_mvaddstr( 1, 1, 'You selected ' . $menu_items[$selection] . ' with the value ' . $selection );

// Draw updates
ncurses_refresh( $fullscreen );
// End
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(); // Clean up, and quit
?>

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); // Do a lovely border
ncurses_move(1,1); // Start top left(inside border)
ncurses_addstr("Welcome to NCurses");
ncurses_addstr(" with PHP!");
ncurses_refresh(); // Send buffer to screen
ncurses_end(); // Clean up, and quit
?&gt;

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

<syslogncurses_addch>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page