|
Ncurses Terminal Screen Control Functionsncurses (new curses) is a free software emulation of curses in System V Rel 4.0 (and above). It uses terminfo format, supports pads, colors, multiple highlights, form characters and function key mapping. Because of the interactive nature of this library, it will be of little use for writing Web applications, but may be useful when writing scripts meant using PHP from the command line.
Warning:
This extension is EXPERIMENTAL. The behaviour of this extension -- including the names of its functions and anything else documented about this extension -- may change without notice in a future release of PHP. Use this extension at your own risk. Ncurses is available for the following platforms:
Note:
This extension has been moved to the » PECL repository and is no longer bundled with PHP as of PHP 6.0.0 You need the ncurses libraries and headerfiles. Download the latest version from the » ftp://ftp.gnu.org/pub/gnu/ncurses/ or from an other GNU-Mirror.
To get these functions to work, you have to compile the CGI or CLI
version of PHP with The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime. Table 195. ncurses color constants
Table 196. ncurses key constants
Table 197. mouse constants
Table of Contents
Code Examples / Notes » ref.ncursesnweeks
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 ?> You'll notice the second addstr simply tacks onto the first. habib valanejad
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 */ } g_a
To determine screen width and height without any external (OS specific) commands, I use: <?php ncurses_init(); $fullscreen = ncurses_newwin ( 0, 0, 0, 0); ncurses_getmaxyx($fullscreen,&$a,&$b); ncurses_end(); echo "Width:$b\nHeight:$a\n"; ?> rainman
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 http://torc.sourceforge.net or http://www.darkwired.org/projects/torc/ 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. joeldegan
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(); } ?> zak
There is a simple ncurses application in the PHP source tree. See http://cvs.php.net/co.php/php-src/ext/ncurses/example1.php?r=1.1
joeldegan
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.
fisher
russian speakers can find a practice php+ncurses faq with some useful samples here http://fisher.phpclub.net/php_ncurses_faq.html kermodebear
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. fisher
new version of PHP ncurses FAQ is here: http://alexeyrybak.com/php_ncurses_faq.html
php
just an other ncurses tetris ... In php with lib_ncurses of course .. http://feraudet.com/phpntetris.php.txt Cyril Feraudet 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
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()); ?> habib valanejad
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. krzysztof dot gorzelak
Here is a small example, how to use STDIN to read keys combinations in console. $stdin = fopen('php://stdin', 'r'); stream_set_timeout($stdin, 1); while (1) { $temp=""; while (1) { if(stream_select($read = array($stdin), $write = NULL, $except = NULL, 0)) $temp .= ord(fgetc($stdin)); else break; } // F1 : $temp == 27914949126 // ALT+F1 : $temp = 2727914949126 // .... usleep("50000"); } alex
Here is a more complex example, I wrote: http://alex.kazik.de/ncurses1.html habib valanejad
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); } } kermodebear
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
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. kermodebear
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 ]; } ?> joeldegan
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 rainman
A simple article I wrote about php-ncurses: https://www.darkwired.org/pub/papers/articles/php-ncurses/ philip
A nice introductory PHP + Ncurses tutorial can be seen here: * http://www.zend.com/zend/tut/tut-degan.php |
Change Language.NET Functions Apache-specific Functions Alternative PHP Cache Advanced PHP debugger Array Functions Aspell functions [deprecated] BBCode Functions BCMath Arbitrary Precision Mathematics Functions PHP bytecode Compiler Bzip2 Compression Functions Calendar Functions CCVS API Functions [deprecated] Class/Object Functions Classkit Functions ClibPDF Functions [deprecated] COM and .Net (Windows) Crack Functions Character Type Functions CURL Cybercash Payment Functions Credit Mutuel CyberMUT functions Cyrus IMAP administration Functions Date and Time Functions DB++ Functions Database (dbm-style) Abstraction Layer Functions dBase Functions DBM Functions [deprecated] dbx Functions Direct IO Functions Directory Functions DOM Functions DOM XML Functions enchant Functions Error Handling and Logging Functions Exif Functions Expect Functions File Alteration Monitor Functions Forms Data Format Functions Fileinfo Functions filePro Functions Filesystem Functions Filter Functions Firebird/InterBase Functions Firebird/Interbase Functions (PDO_FIREBIRD) FriBiDi Functions FrontBase Functions FTP Functions Function Handling Functions GeoIP Functions Gettext Functions GMP Functions gnupg Functions Net_Gopher Haru PDF Functions hash Functions HTTP Hyperwave Functions Hyperwave API Functions i18n Functions IBM Functions (PDO_IBM) IBM DB2 iconv Functions ID3 Functions IIS Administration Functions Image Functions Imagick Image Library IMAP Informix Functions Informix Functions (PDO_INFORMIX) Ingres II Functions IRC Gateway Functions PHP / Java Integration JSON Functions KADM5 LDAP Functions libxml Functions Lotus Notes Functions LZF Functions Mail Functions Mailparse Functions Mathematical Functions MaxDB PHP Extension MCAL Functions Mcrypt Encryption Functions MCVE (Monetra) Payment Functions Memcache Functions Mhash Functions Mimetype Functions Ming functions for Flash Miscellaneous Functions mnoGoSearch Functions Microsoft SQL Server Functions Microsoft SQL Server and Sybase Functions (PDO_DBLIB) Mohawk Software Session Handler Functions mSQL Functions Multibyte String Functions muscat Functions MySQL Functions MySQL Functions (PDO_MYSQL) MySQL Improved Extension Ncurses Terminal Screen Control Functions Network Functions Newt Functions NSAPI-specific Functions Object Aggregation/Composition Functions Object property and method call overloading Oracle Functions ODBC Functions (Unified) ODBC and DB2 Functions (PDO_ODBC) oggvorbis OpenAL Audio Bindings OpenSSL Functions Oracle Functions [deprecated] Oracle Functions (PDO_OCI) Output Control Functions Ovrimos SQL Functions Paradox File Access Parsekit Functions Process Control Functions Regular Expression Functions (Perl-Compatible) PDF Functions PDO Functions Phar archive stream and classes PHP Options&Information POSIX Functions Regular Expression Functions (POSIX Extended) PostgreSQL Functions PostgreSQL Functions (PDO_PGSQL) Printer Functions Program Execution Functions PostScript document creation Pspell Functions qtdom Functions Radius Rar Functions GNU Readline GNU Recode Functions RPM Header Reading Functions runkit Functions SAM - Simple Asynchronous Messaging Satellite CORBA client extension [deprecated] SCA Functions SDO Functions SDO XML Data Access Service Functions SDO Relational Data Access Service Functions Semaphore SESAM Database Functions PostgreSQL Session Save Handler Session Handling Functions Shared Memory Functions SimpleXML functions SNMP Functions SOAP Functions Socket Functions Standard PHP Library (SPL) Functions SQLite Functions SQLite Functions (PDO_SQLITE) Secure Shell2 Functions Statistics Functions Stream Functions String Functions Subversion Functions Shockwave Flash Functions Swish Functions Sybase Functions TCP Wrappers Functions Tidy Functions Tokenizer Functions Unicode Functions URL Functions Variable Handling Functions Verisign Payflow Pro Functions vpopmail Functions W32api Functions WDDX Functions win32ps Functions win32service Functions xattr Functions xdiff Functions XML Parser Functions XML-RPC Functions XMLReader functions XMLWriter Functions XSL functions XSLT Functions YAZ Functions YP/NIS Functions Zip File Functions Zlib Compression Functions |