curses 1.3.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.github/workflows/macos.yml +19 -0
 - data/.github/workflows/ubuntu.yml +26 -0
 - data/.github/workflows/windows.yml +25 -0
 - data/History.md +34 -0
 - data/README.md +14 -46
 - data/Rakefile +0 -86
 - data/curses.gemspec +2 -3
 - data/ext/curses/curses.c +70 -58
 - data/ext/curses/extconf.rb +134 -21
 - data/lib/curses.rb +5 -12
 - data/sample/addch.rb +16 -0
 - data/sample/attr_demo.rb +32 -0
 - data/sample/colors.rb +26 -0
 - data/sample/menu.rb +3 -3
 - data/sample/mouse_move.rb +75 -0
 - data/vendor/PDCurses/.gitignore +47 -0
 - data/vendor/PDCurses/.travis.yml +49 -0
 - data/vendor/PDCurses/CMakeLists.txt +68 -0
 - data/vendor/PDCurses/HISTORY.md +2036 -0
 - data/vendor/PDCurses/IMPLEMNT.md +327 -0
 - data/vendor/PDCurses/README.md +77 -0
 - data/vendor/PDCurses/acs_defs.h +265 -0
 - data/vendor/PDCurses/appveyor.yml +218 -0
 - data/vendor/PDCurses/cmake/README.md +71 -0
 - data/vendor/PDCurses/cmake/build_dependencies.cmake +178 -0
 - data/vendor/PDCurses/cmake/build_options.cmake +25 -0
 - data/vendor/PDCurses/cmake/dll_version.cmake +26 -0
 - data/vendor/PDCurses/cmake/gen_config_header.cmake +43 -0
 - data/vendor/PDCurses/cmake/get_version.cmake +17 -0
 - data/vendor/PDCurses/cmake/make_uninstall.cmake +19 -0
 - data/vendor/PDCurses/cmake/project_common.cmake +121 -0
 - data/vendor/PDCurses/cmake/resource.in.cmake +52 -0
 - data/vendor/PDCurses/cmake/sdl2_ttf/CMakeLists.txt +83 -0
 - data/vendor/PDCurses/cmake/target_arch.cmake +36 -0
 - data/vendor/PDCurses/cmake/version.in.cmake +73 -0
 - data/vendor/PDCurses/cmake/watcom_open_dos16_toolchain.cmake +96 -0
 - data/vendor/PDCurses/cmake/watcom_open_dos32_toolchain.cmake +106 -0
 - data/vendor/PDCurses/cmake/watcom_open_os2v2_toolchain.cmake +105 -0
 - data/vendor/PDCurses/curses.h +1846 -0
 - data/vendor/PDCurses/curspriv.h +134 -0
 - data/vendor/PDCurses/demos/README.md +25 -0
 - data/vendor/PDCurses/demos/firework.c +144 -0
 - data/vendor/PDCurses/demos/newtest.c +581 -0
 - data/vendor/PDCurses/demos/ozdemo.c +447 -0
 - data/vendor/PDCurses/demos/ptest.c +283 -0
 - data/vendor/PDCurses/demos/rain.c +157 -0
 - data/vendor/PDCurses/demos/testcurs.c +1607 -0
 - data/vendor/PDCurses/demos/tui.c +1048 -0
 - data/vendor/PDCurses/demos/tui.h +65 -0
 - data/vendor/PDCurses/demos/tuidemo.c +233 -0
 - data/vendor/PDCurses/demos/version.c +61 -0
 - data/vendor/PDCurses/demos/worm.c +432 -0
 - data/vendor/PDCurses/demos/xmas.c +955 -0
 - data/vendor/PDCurses/dos/CMakeLists.txt +47 -0
 - data/vendor/PDCurses/dos/Makefile.bcc +83 -0
 - data/vendor/PDCurses/dos/Makefile.dmc +257 -0
 - data/vendor/PDCurses/dos/Makefile.msc +113 -0
 - data/vendor/PDCurses/dos/Makefile.wcc +107 -0
 - data/vendor/PDCurses/dos/README.md +51 -0
 - data/vendor/PDCurses/dos/bccdos.lrf +9 -0
 - data/vendor/PDCurses/dos/mscdos.lrf +50 -0
 - data/vendor/PDCurses/dos/pdcclip.c +132 -0
 - data/vendor/PDCurses/dos/pdcdisp.c +135 -0
 - data/vendor/PDCurses/dos/pdcdos.h +194 -0
 - data/vendor/PDCurses/dos/pdcgetsc.c +98 -0
 - data/vendor/PDCurses/dos/pdckbd.c +513 -0
 - data/vendor/PDCurses/dos/pdcscrn.c +785 -0
 - data/vendor/PDCurses/dos/pdcsetsc.c +101 -0
 - data/vendor/PDCurses/dos/pdcutil.c +212 -0
 - data/vendor/PDCurses/libobjs.mif +26 -0
 - data/vendor/PDCurses/makedist.mif +20 -0
 - data/vendor/PDCurses/man/README.md +21 -0
 - data/vendor/PDCurses/man/intro.md +361 -0
 - data/vendor/PDCurses/man/manext.c +119 -0
 - data/vendor/PDCurses/man/sdl.md +152 -0
 - data/vendor/PDCurses/man/sdl2.md +58 -0
 - data/vendor/PDCurses/man/x11.md +407 -0
 - data/vendor/PDCurses/ncurses/CMakeLists.txt +66 -0
 - data/vendor/PDCurses/ncurses/README.md +26 -0
 - data/vendor/PDCurses/ncurses/makefile +29 -0
 - data/vendor/PDCurses/os2/CMakeLists.txt +41 -0
 - data/vendor/PDCurses/os2/Makefile.bcc +90 -0
 - data/vendor/PDCurses/os2/Makefile.wcc +43 -0
 - data/vendor/PDCurses/os2/README.md +43 -0
 - data/vendor/PDCurses/os2/iccos2.lrf +50 -0
 - data/vendor/PDCurses/os2/iccos2.mak +256 -0
 - data/vendor/PDCurses/os2/pdcclip.c +188 -0
 - data/vendor/PDCurses/os2/pdcdisp.c +93 -0
 - data/vendor/PDCurses/os2/pdcgetsc.c +89 -0
 - data/vendor/PDCurses/os2/pdckbd.c +521 -0
 - data/vendor/PDCurses/os2/pdcos2.h +55 -0
 - data/vendor/PDCurses/os2/pdcscrn.c +449 -0
 - data/vendor/PDCurses/os2/pdcsetsc.c +112 -0
 - data/vendor/PDCurses/os2/pdcutil.c +52 -0
 - data/vendor/PDCurses/panel.h +56 -0
 - data/vendor/PDCurses/pdcurses/README.md +25 -0
 - data/vendor/PDCurses/pdcurses/addch.c +693 -0
 - data/vendor/PDCurses/pdcurses/addchstr.c +245 -0
 - data/vendor/PDCurses/pdcurses/addstr.c +240 -0
 - data/vendor/PDCurses/pdcurses/attr.c +359 -0
 - data/vendor/PDCurses/pdcurses/beep.c +68 -0
 - data/vendor/PDCurses/pdcurses/bkgd.c +223 -0
 - data/vendor/PDCurses/pdcurses/border.c +411 -0
 - data/vendor/PDCurses/pdcurses/clear.c +159 -0
 - data/vendor/PDCurses/pdcurses/color.c +298 -0
 - data/vendor/PDCurses/pdcurses/debug.c +109 -0
 - data/vendor/PDCurses/pdcurses/delch.c +96 -0
 - data/vendor/PDCurses/pdcurses/deleteln.c +211 -0
 - data/vendor/PDCurses/pdcurses/deprec.c +27 -0
 - data/vendor/PDCurses/pdcurses/getch.c +417 -0
 - data/vendor/PDCurses/pdcurses/getstr.c +474 -0
 - data/vendor/PDCurses/pdcurses/getyx.c +139 -0
 - data/vendor/PDCurses/pdcurses/inch.c +127 -0
 - data/vendor/PDCurses/pdcurses/inchstr.c +214 -0
 - data/vendor/PDCurses/pdcurses/initscr.c +367 -0
 - data/vendor/PDCurses/pdcurses/inopts.c +324 -0
 - data/vendor/PDCurses/pdcurses/insch.c +271 -0
 - data/vendor/PDCurses/pdcurses/insstr.c +264 -0
 - data/vendor/PDCurses/pdcurses/instr.c +246 -0
 - data/vendor/PDCurses/pdcurses/kernel.c +259 -0
 - data/vendor/PDCurses/pdcurses/keyname.c +157 -0
 - data/vendor/PDCurses/pdcurses/mouse.c +438 -0
 - data/vendor/PDCurses/pdcurses/move.c +57 -0
 - data/vendor/PDCurses/pdcurses/outopts.c +159 -0
 - data/vendor/PDCurses/pdcurses/overlay.c +214 -0
 - data/vendor/PDCurses/pdcurses/pad.c +260 -0
 - data/vendor/PDCurses/pdcurses/panel.c +633 -0
 - data/vendor/PDCurses/pdcurses/printw.c +126 -0
 - data/vendor/PDCurses/pdcurses/refresh.c +279 -0
 - data/vendor/PDCurses/pdcurses/scanw.c +578 -0
 - data/vendor/PDCurses/pdcurses/scr_dump.c +213 -0
 - data/vendor/PDCurses/pdcurses/scroll.c +101 -0
 - data/vendor/PDCurses/pdcurses/slk.c +591 -0
 - data/vendor/PDCurses/pdcurses/termattr.c +182 -0
 - data/vendor/PDCurses/pdcurses/terminfo.c +217 -0
 - data/vendor/PDCurses/pdcurses/touch.c +163 -0
 - data/vendor/PDCurses/pdcurses/util.c +312 -0
 - data/vendor/PDCurses/pdcurses/window.c +569 -0
 - data/vendor/PDCurses/sdl1/Makefile.mng +110 -0
 - data/vendor/PDCurses/sdl1/README.md +31 -0
 - data/vendor/PDCurses/sdl1/deffont.h +385 -0
 - data/vendor/PDCurses/sdl1/deficon.h +23 -0
 - data/vendor/PDCurses/sdl1/pdcclip.c +131 -0
 - data/vendor/PDCurses/sdl1/pdcdisp.c +373 -0
 - data/vendor/PDCurses/sdl1/pdcgetsc.c +30 -0
 - data/vendor/PDCurses/sdl1/pdckbd.c +405 -0
 - data/vendor/PDCurses/sdl1/pdcscrn.c +414 -0
 - data/vendor/PDCurses/sdl1/pdcsdl.h +31 -0
 - data/vendor/PDCurses/sdl1/pdcsetsc.c +64 -0
 - data/vendor/PDCurses/sdl1/pdcutil.c +40 -0
 - data/vendor/PDCurses/sdl1/sdltest.c +79 -0
 - data/vendor/PDCurses/sdl2/CMakeLists.txt +76 -0
 - data/vendor/PDCurses/sdl2/Makefile.vc +164 -0
 - data/vendor/PDCurses/sdl2/README.md +34 -0
 - data/vendor/PDCurses/sdl2/deffont.h +385 -0
 - data/vendor/PDCurses/sdl2/deficon.h +23 -0
 - data/vendor/PDCurses/sdl2/pdcclip.c +93 -0
 - data/vendor/PDCurses/sdl2/pdcdisp.c +534 -0
 - data/vendor/PDCurses/sdl2/pdcgetsc.c +30 -0
 - data/vendor/PDCurses/sdl2/pdckbd.c +480 -0
 - data/vendor/PDCurses/sdl2/pdcscrn.c +443 -0
 - data/vendor/PDCurses/sdl2/pdcsdl.h +33 -0
 - data/vendor/PDCurses/sdl2/pdcsetsc.c +67 -0
 - data/vendor/PDCurses/sdl2/pdcutil.c +39 -0
 - data/vendor/PDCurses/sdl2/sdltest.c +81 -0
 - data/vendor/PDCurses/term.h +48 -0
 - data/vendor/PDCurses/version.mif +7 -0
 - data/vendor/PDCurses/vt/CMakeLists.txt +28 -0
 - data/vendor/PDCurses/vt/Makefile.bcc +111 -0
 - data/vendor/PDCurses/vt/Makefile.dmc +258 -0
 - data/vendor/PDCurses/vt/Makefile.vc +144 -0
 - data/vendor/PDCurses/vt/Makefile.wcc +107 -0
 - data/vendor/PDCurses/vt/README.md +64 -0
 - data/vendor/PDCurses/vt/pdcclip.c +20 -0
 - data/vendor/PDCurses/vt/pdcdisp.c +284 -0
 - data/vendor/PDCurses/vt/pdcgetsc.c +27 -0
 - data/vendor/PDCurses/vt/pdckbd.c +394 -0
 - data/vendor/PDCurses/vt/pdcscrn.c +434 -0
 - data/vendor/PDCurses/vt/pdcsetsc.c +45 -0
 - data/vendor/PDCurses/vt/pdcutil.c +43 -0
 - data/vendor/PDCurses/vt/pdcvt.h +16 -0
 - data/vendor/PDCurses/watcom.mif +68 -0
 - data/vendor/PDCurses/wincon/CMakeLists.txt +27 -0
 - data/vendor/PDCurses/wincon/Makefile.bcc +88 -0
 - data/vendor/PDCurses/wincon/Makefile.dmc +256 -0
 - data/vendor/PDCurses/wincon/Makefile.lcc +273 -0
 - data/vendor/PDCurses/wincon/Makefile.mng +176 -0
 - data/vendor/PDCurses/wincon/Makefile.vc +144 -0
 - data/vendor/PDCurses/wincon/Makefile.wcc +51 -0
 - data/vendor/PDCurses/wincon/README.md +85 -0
 - data/vendor/PDCurses/wincon/pdcclip.c +174 -0
 - data/vendor/PDCurses/wincon/pdcdisp.c +143 -0
 - data/vendor/PDCurses/wincon/pdcgetsc.c +55 -0
 - data/vendor/PDCurses/wincon/pdckbd.c +786 -0
 - data/vendor/PDCurses/wincon/pdcscrn.c +717 -0
 - data/vendor/PDCurses/wincon/pdcsetsc.c +91 -0
 - data/vendor/PDCurses/wincon/pdcurses.ico +0 -0
 - data/vendor/PDCurses/wincon/pdcurses.rc +28 -0
 - data/vendor/PDCurses/wincon/pdcutil.c +41 -0
 - data/vendor/PDCurses/wincon/pdcwin.h +31 -0
 - data/vendor/PDCurses/wingui/CMakeLists.txt +27 -0
 - data/vendor/PDCurses/wingui/Makefile.bcc +85 -0
 - data/vendor/PDCurses/wingui/Makefile.dmc +259 -0
 - data/vendor/PDCurses/wingui/Makefile.lcc +273 -0
 - data/vendor/PDCurses/wingui/Makefile.mng +171 -0
 - data/vendor/PDCurses/wingui/Makefile.vc +144 -0
 - data/vendor/PDCurses/wingui/Makefile.wcc +51 -0
 - data/vendor/PDCurses/wingui/README.md +93 -0
 - data/vendor/PDCurses/wingui/pdcclip.c +174 -0
 - data/vendor/PDCurses/wingui/pdcdisp.c +718 -0
 - data/vendor/PDCurses/wingui/pdcgetsc.c +30 -0
 - data/vendor/PDCurses/wingui/pdckbd.c +143 -0
 - data/vendor/PDCurses/wingui/pdcscrn.c +2797 -0
 - data/vendor/PDCurses/wingui/pdcsetsc.c +89 -0
 - data/vendor/PDCurses/wingui/pdcurses.ico +0 -0
 - data/vendor/PDCurses/wingui/pdcurses.rc +28 -0
 - data/vendor/PDCurses/wingui/pdcutil.c +61 -0
 - data/vendor/PDCurses/wingui/pdcwin.h +122 -0
 - data/vendor/PDCurses/x11/Makefile.in +754 -0
 - data/vendor/PDCurses/x11/PDCurses.spec +82 -0
 - data/vendor/PDCurses/x11/README.md +62 -0
 - data/vendor/PDCurses/x11/ScrollBox.c +319 -0
 - data/vendor/PDCurses/x11/ScrollBox.h +51 -0
 - data/vendor/PDCurses/x11/ScrollBoxP.h +70 -0
 - data/vendor/PDCurses/x11/aclocal.m4 +994 -0
 - data/vendor/PDCurses/x11/big_icon.xbm +46 -0
 - data/vendor/PDCurses/x11/compose.h +201 -0
 - data/vendor/PDCurses/x11/config.guess +1500 -0
 - data/vendor/PDCurses/x11/config.h.in +100 -0
 - data/vendor/PDCurses/x11/config.sub +1616 -0
 - data/vendor/PDCurses/x11/configure +6700 -0
 - data/vendor/PDCurses/x11/configure.ac +295 -0
 - data/vendor/PDCurses/x11/debian/changelog +6 -0
 - data/vendor/PDCurses/x11/debian/compat +1 -0
 - data/vendor/PDCurses/x11/debian/control +11 -0
 - data/vendor/PDCurses/x11/debian/copyright +27 -0
 - data/vendor/PDCurses/x11/debian/rules +98 -0
 - data/vendor/PDCurses/x11/install-sh +253 -0
 - data/vendor/PDCurses/x11/little_icon.xbm +14 -0
 - data/vendor/PDCurses/x11/ncurses_cfg.h +45 -0
 - data/vendor/PDCurses/x11/pdcclip.c +173 -0
 - data/vendor/PDCurses/x11/pdcdisp.c +85 -0
 - data/vendor/PDCurses/x11/pdcgetsc.c +28 -0
 - data/vendor/PDCurses/x11/pdckbd.c +104 -0
 - data/vendor/PDCurses/x11/pdcscrn.c +258 -0
 - data/vendor/PDCurses/x11/pdcsetsc.c +95 -0
 - data/vendor/PDCurses/x11/pdcutil.c +52 -0
 - data/vendor/PDCurses/x11/pdcx11.c +316 -0
 - data/vendor/PDCurses/x11/pdcx11.h +191 -0
 - data/vendor/PDCurses/x11/sb.c +155 -0
 - data/vendor/PDCurses/x11/x11.c +3686 -0
 - data/vendor/PDCurses/x11/xcurses-config.in +81 -0
 - metadata +258 -24
 - data/.travis.yml +0 -16
 - data/appveyor.yml +0 -16
 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /* Public Domain Curses */
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            #include <curspriv.h>
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            int PDC_get_cursor_mode(void)
         
     | 
| 
      
 6 
     | 
    
         
            +
            {
         
     | 
| 
      
 7 
     | 
    
         
            +
                PDC_LOG(("PDC_get_cursor_mode() - called\n"));
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                return SP->visibility;
         
     | 
| 
      
 10 
     | 
    
         
            +
            }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            int PDC_get_columns(void)
         
     | 
| 
      
 14 
     | 
    
         
            +
            {
         
     | 
| 
      
 15 
     | 
    
         
            +
                extern int PDC_cols;
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                PDC_LOG(("PDC_get_columns() - called\n"));
         
     | 
| 
      
 18 
     | 
    
         
            +
                return( PDC_cols);
         
     | 
| 
      
 19 
     | 
    
         
            +
            }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            int PDC_get_rows(void)
         
     | 
| 
      
 22 
     | 
    
         
            +
            {
         
     | 
| 
      
 23 
     | 
    
         
            +
                extern int PDC_rows;
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                PDC_LOG(("PDC_get_rows() - called\n"));
         
     | 
| 
      
 26 
     | 
    
         
            +
                return( PDC_rows);
         
     | 
| 
      
 27 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,394 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include <stdio.h>
         
     | 
| 
      
 2 
     | 
    
         
            +
            #include <string.h>
         
     | 
| 
      
 3 
     | 
    
         
            +
            #include <assert.h>
         
     | 
| 
      
 4 
     | 
    
         
            +
            #if defined( _WIN32) || defined( DOS)
         
     | 
| 
      
 5 
     | 
    
         
            +
               #include <conio.h>
         
     | 
| 
      
 6 
     | 
    
         
            +
               #define USE_CONIO
         
     | 
| 
      
 7 
     | 
    
         
            +
            #else
         
     | 
| 
      
 8 
     | 
    
         
            +
               #include <sys/select.h>
         
     | 
| 
      
 9 
     | 
    
         
            +
               #include <unistd.h>
         
     | 
| 
      
 10 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 11 
     | 
    
         
            +
            #include "curspriv.h"
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            #if defined( __BORLANDC__) || defined( DOS)
         
     | 
| 
      
 14 
     | 
    
         
            +
               #define WINDOWS_VERSION_OF_KBHIT kbhit
         
     | 
| 
      
 15 
     | 
    
         
            +
            #else
         
     | 
| 
      
 16 
     | 
    
         
            +
               #define WINDOWS_VERSION_OF_KBHIT _kbhit
         
     | 
| 
      
 17 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            /* Modified from the accepted answer at
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            https://stackoverflow.com/questions/33025599/move-the-cursor-in-a-c-program
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            _kbhit( ) returns -1 if no key has been hit,  and the keycode if one
         
     | 
| 
      
 24 
     | 
    
         
            +
            has been hit.  You can just loop on it until the return value is >= 0.
         
     | 
| 
      
 25 
     | 
    
         
            +
            Hitting a function or arrow or similar key will cause 27 (escape) to
         
     | 
| 
      
 26 
     | 
    
         
            +
            be returned,  followed by cryptic codes that depend on what terminal
         
     | 
| 
      
 27 
     | 
    
         
            +
            emulation is in place.
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
               Further info on VT100/ANSI control sequences is at
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            https://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html
         
     | 
| 
      
 32 
     | 
    
         
            +
            */
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            extern bool PDC_resize_occurred;
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            static bool check_key( int *c)
         
     | 
| 
      
 37 
     | 
    
         
            +
            {
         
     | 
| 
      
 38 
     | 
    
         
            +
                bool rval;
         
     | 
| 
      
 39 
     | 
    
         
            +
            #ifndef USE_CONIO
         
     | 
| 
      
 40 
     | 
    
         
            +
                const int STDIN = 0;
         
     | 
| 
      
 41 
     | 
    
         
            +
                struct timeval timeout;
         
     | 
| 
      
 42 
     | 
    
         
            +
                fd_set rdset;
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                if( PDC_resize_occurred)
         
     | 
| 
      
 45 
     | 
    
         
            +
                   return( TRUE);
         
     | 
| 
      
 46 
     | 
    
         
            +
                FD_ZERO( &rdset);
         
     | 
| 
      
 47 
     | 
    
         
            +
                FD_SET( STDIN, &rdset);
         
     | 
| 
      
 48 
     | 
    
         
            +
                timeout.tv_sec = 0;
         
     | 
| 
      
 49 
     | 
    
         
            +
                timeout.tv_usec = 0;
         
     | 
| 
      
 50 
     | 
    
         
            +
                if( select( STDIN + 1, &rdset, NULL, NULL, &timeout) > 0)
         
     | 
| 
      
 51 
     | 
    
         
            +
                   {
         
     | 
| 
      
 52 
     | 
    
         
            +
                   rval = TRUE;
         
     | 
| 
      
 53 
     | 
    
         
            +
                   if( c)
         
     | 
| 
      
 54 
     | 
    
         
            +
                      *c = getchar( );
         
     | 
| 
      
 55 
     | 
    
         
            +
                   }
         
     | 
| 
      
 56 
     | 
    
         
            +
                else
         
     | 
| 
      
 57 
     | 
    
         
            +
                   rval = FALSE;
         
     | 
| 
      
 58 
     | 
    
         
            +
            #else
         
     | 
| 
      
 59 
     | 
    
         
            +
                if( WINDOWS_VERSION_OF_KBHIT( ))
         
     | 
| 
      
 60 
     | 
    
         
            +
                   {
         
     | 
| 
      
 61 
     | 
    
         
            +
                   rval = TRUE;
         
     | 
| 
      
 62 
     | 
    
         
            +
                   if( c)
         
     | 
| 
      
 63 
     | 
    
         
            +
                      *c = _getch( );
         
     | 
| 
      
 64 
     | 
    
         
            +
                   }
         
     | 
| 
      
 65 
     | 
    
         
            +
                else
         
     | 
| 
      
 66 
     | 
    
         
            +
                   rval = FALSE;
         
     | 
| 
      
 67 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 68 
     | 
    
         
            +
                return( rval);
         
     | 
| 
      
 69 
     | 
    
         
            +
            }
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            bool PDC_check_key( void)
         
     | 
| 
      
 72 
     | 
    
         
            +
            {
         
     | 
| 
      
 73 
     | 
    
         
            +
               return( check_key( NULL));
         
     | 
| 
      
 74 
     | 
    
         
            +
            }
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            void PDC_flushinp( void)
         
     | 
| 
      
 77 
     | 
    
         
            +
            {
         
     | 
| 
      
 78 
     | 
    
         
            +
               int thrown_away_char;
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
               while( check_key( &thrown_away_char))
         
     | 
| 
      
 81 
     | 
    
         
            +
                  ;
         
     | 
| 
      
 82 
     | 
    
         
            +
            }
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            #ifdef USE_CONIO
         
     | 
| 
      
 85 
     | 
    
         
            +
            static int xlate_vt_codes_for_dos( const int key1, const int key2)
         
     | 
| 
      
 86 
     | 
    
         
            +
            {
         
     | 
| 
      
 87 
     | 
    
         
            +
               static const int tbl[] =   {
         
     | 
| 
      
 88 
     | 
    
         
            +
                  KEY_UP,      72,
         
     | 
| 
      
 89 
     | 
    
         
            +
                  KEY_DOWN,    80,
         
     | 
| 
      
 90 
     | 
    
         
            +
                  KEY_LEFT,    75,
         
     | 
| 
      
 91 
     | 
    
         
            +
                  KEY_RIGHT,   77,
         
     | 
| 
      
 92 
     | 
    
         
            +
                  KEY_F(11),  133,
         
     | 
| 
      
 93 
     | 
    
         
            +
                  KEY_F(12),  134,
         
     | 
| 
      
 94 
     | 
    
         
            +
                  KEY_IC,      82,
         
     | 
| 
      
 95 
     | 
    
         
            +
                  KEY_DC,      83,
         
     | 
| 
      
 96 
     | 
    
         
            +
                  KEY_PPAGE,   73,
         
     | 
| 
      
 97 
     | 
    
         
            +
                  KEY_NPAGE,   81,
         
     | 
| 
      
 98 
     | 
    
         
            +
                  KEY_HOME, 2, '[', 'H',
         
     | 
| 
      
 99 
     | 
    
         
            +
                  KEY_END,  2, 'O', 'F',
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
                  KEY_F(1),   59,
         
     | 
| 
      
 102 
     | 
    
         
            +
                  KEY_F(2),   60,
         
     | 
| 
      
 103 
     | 
    
         
            +
                  KEY_F(3),   61,
         
     | 
| 
      
 104 
     | 
    
         
            +
                  KEY_F(4),   62,
         
     | 
| 
      
 105 
     | 
    
         
            +
                  KEY_F(5),   63,
         
     | 
| 
      
 106 
     | 
    
         
            +
                  KEY_F(6),   64,
         
     | 
| 
      
 107 
     | 
    
         
            +
                  KEY_F(7),   65,
         
     | 
| 
      
 108 
     | 
    
         
            +
                  KEY_F(8),   66,
         
     | 
| 
      
 109 
     | 
    
         
            +
                  KEY_F(9),   67,
         
     | 
| 
      
 110 
     | 
    
         
            +
                  KEY_F(10),   68,
         
     | 
| 
      
 111 
     | 
    
         
            +
                  0, 0 };
         
     | 
| 
      
 112 
     | 
    
         
            +
               int i, rval = 0;
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
               for( i = 0; tbl[i] && !rval; i += 2)
         
     | 
| 
      
 115 
     | 
    
         
            +
                  if( key2 == tbl[i + 1])
         
     | 
| 
      
 116 
     | 
    
         
            +
                     rval = tbl[i];
         
     | 
| 
      
 117 
     | 
    
         
            +
               return( rval);
         
     | 
| 
      
 118 
     | 
    
         
            +
            }
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 121 
     | 
    
         
            +
            /* Mouse events include six bytes.  First three are
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
            ESC [ M
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
               Next byte is 96 for mouse wheel up,  97 for down,  or (for more
         
     | 
| 
      
 126 
     | 
    
         
            +
            "traditional" mouse events) 32 plus :
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
               0 for button 1
         
     | 
| 
      
 129 
     | 
    
         
            +
               1 for button 2
         
     | 
| 
      
 130 
     | 
    
         
            +
               2 for button 3
         
     | 
| 
      
 131 
     | 
    
         
            +
               3 for release
         
     | 
| 
      
 132 
     | 
    
         
            +
               4 if Shift is pressed
         
     | 
| 
      
 133 
     | 
    
         
            +
               8 if Alt (Meta) is pressed
         
     | 
| 
      
 134 
     | 
    
         
            +
               16 if Ctrl is pressed
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
               Note that 'release' doesn't tell you _which_ is released.  If only
         
     | 
| 
      
 137 
     | 
    
         
            +
            one has been pressed (the usual case),  it's presumably the one you
         
     | 
| 
      
 138 
     | 
    
         
            +
            released.  If two or more buttons are pressed simultaneously,  the
         
     | 
| 
      
 139 
     | 
    
         
            +
            "releases" are reported in the numerical order of the buttons,  not
         
     | 
| 
      
 140 
     | 
    
         
            +
            the order in which they're actually released (which we don't know).
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
               My tilt mouse reports 'tilt left' as a left button (1) and 'tilt right'
         
     | 
| 
      
 143 
     | 
    
         
            +
            as a middle button press.  Wheel events get shift,  alt,  ctrl added in
         
     | 
| 
      
 144 
     | 
    
         
            +
            (but that doesn't seem to be getting through in PDCurses... to be fixed).
         
     | 
| 
      
 145 
     | 
    
         
            +
            Button events only get Ctrl (though I think you might get the other events
         
     | 
| 
      
 146 
     | 
    
         
            +
            on some terminals).
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
               "Correct" mouse handling will require that we detect a button-down,
         
     | 
| 
      
 149 
     | 
    
         
            +
            then hold off for SP->mouse_wait to see if we get a release event.  */
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
            static int xlate_vt_codes( const int *c, const int count)
         
     | 
| 
      
 152 
     | 
    
         
            +
            {
         
     | 
| 
      
 153 
     | 
    
         
            +
               static const int tbl[] =  {
         
     | 
| 
      
 154 
     | 
    
         
            +
                           KEY_UP,   2, '[', 'A',
         
     | 
| 
      
 155 
     | 
    
         
            +
                           KEY_DOWN, 2, '[', 'B',
         
     | 
| 
      
 156 
     | 
    
         
            +
                           KEY_LEFT, 2, '[', 'D',
         
     | 
| 
      
 157 
     | 
    
         
            +
                           KEY_RIGHT,2, '[', 'C',
         
     | 
| 
      
 158 
     | 
    
         
            +
                           KEY_HOME, 2, 'O', 'H',
         
     | 
| 
      
 159 
     | 
    
         
            +
                           KEY_HOME, 2, '[', 'H',
         
     | 
| 
      
 160 
     | 
    
         
            +
                           KEY_END,  2, 'O', 'F',
         
     | 
| 
      
 161 
     | 
    
         
            +
                           KEY_END,  2, '[', 'F',
         
     | 
| 
      
 162 
     | 
    
         
            +
                           KEY_B2,   2, '[', 'E',
         
     | 
| 
      
 163 
     | 
    
         
            +
                           KEY_IC,   3, '[', '2', '~',
         
     | 
| 
      
 164 
     | 
    
         
            +
                           KEY_DC,   3, '[', '3', '~',
         
     | 
| 
      
 165 
     | 
    
         
            +
                           KEY_PPAGE, 3, '[', '5', '~',
         
     | 
| 
      
 166 
     | 
    
         
            +
                           KEY_NPAGE, 3, '[', '6', '~',
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                           CTL_LEFT,  5, '[', '1', ';', '5', 'D',
         
     | 
| 
      
 169 
     | 
    
         
            +
                           CTL_RIGHT, 5, '[', '1', ';', '5', 'C',
         
     | 
| 
      
 170 
     | 
    
         
            +
                           CTL_UP,    5, '[', '1', ';', '5', 'A',
         
     | 
| 
      
 171 
     | 
    
         
            +
                           CTL_DOWN,  5, '[', '1', ';', '5', 'B',
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
                           ALT_PGUP, 5, '[', '5', ';', '3', '~',
         
     | 
| 
      
 174 
     | 
    
         
            +
                           ALT_PGDN, 5, '[', '6', ';', '3', '~',
         
     | 
| 
      
 175 
     | 
    
         
            +
             
     | 
| 
      
 176 
     | 
    
         
            +
                           KEY_F(1), 3, '[', '[', 'A',      /* Linux console */
         
     | 
| 
      
 177 
     | 
    
         
            +
                           KEY_F(2), 3, '[', '[', 'B',
         
     | 
| 
      
 178 
     | 
    
         
            +
                           KEY_F(3), 3, '[', '[', 'C',
         
     | 
| 
      
 179 
     | 
    
         
            +
                           KEY_F(4), 3, '[', '[', 'D',
         
     | 
| 
      
 180 
     | 
    
         
            +
                           KEY_F(5), 3, '[', '[', 'E',
         
     | 
| 
      
 181 
     | 
    
         
            +
                           KEY_END,  3, '[', '4', '~',
         
     | 
| 
      
 182 
     | 
    
         
            +
                           KEY_HOME, 3, '[', '1', '~',
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
                           KEY_F(1), 2, 'O', 'P',
         
     | 
| 
      
 185 
     | 
    
         
            +
                           KEY_F(1), 4, '[', '1', '1', '~',
         
     | 
| 
      
 186 
     | 
    
         
            +
                           KEY_F(2), 2, 'O', 'Q',
         
     | 
| 
      
 187 
     | 
    
         
            +
                           KEY_F(2), 4, '[', '1', '2', '~',
         
     | 
| 
      
 188 
     | 
    
         
            +
                           KEY_F(3), 2, 'O', 'R',
         
     | 
| 
      
 189 
     | 
    
         
            +
                           KEY_F(3), 4, '[', '1', '3', '~',
         
     | 
| 
      
 190 
     | 
    
         
            +
                           KEY_F(4), 2, 'O', 'S',
         
     | 
| 
      
 191 
     | 
    
         
            +
                           KEY_F(4), 4, '[', '1', '4', '~',
         
     | 
| 
      
 192 
     | 
    
         
            +
                           KEY_F(5), 4, '[', '1', '5', '~',
         
     | 
| 
      
 193 
     | 
    
         
            +
                           KEY_F(6), 4, '[', '1', '7', '~',
         
     | 
| 
      
 194 
     | 
    
         
            +
                           KEY_F(7), 4, '[', '1', '8', '~',
         
     | 
| 
      
 195 
     | 
    
         
            +
                           KEY_F(8), 4, '[', '1', '9', '~',
         
     | 
| 
      
 196 
     | 
    
         
            +
                           KEY_F(9), 4, '[', '2', '0', '~',
         
     | 
| 
      
 197 
     | 
    
         
            +
                           KEY_F(10), 4, '[', '2', '1', '~',
         
     | 
| 
      
 198 
     | 
    
         
            +
                           KEY_F(11), 4, '[', '2', '3', '~',
         
     | 
| 
      
 199 
     | 
    
         
            +
                           KEY_F(12), 4, '[', '2', '4', '~',
         
     | 
| 
      
 200 
     | 
    
         
            +
                           KEY_F(13), 5, '[', '1', ';', '2', 'P',      /* shift-f1 */
         
     | 
| 
      
 201 
     | 
    
         
            +
                           KEY_F(14), 5, '[', '1', ';', '2', 'Q',
         
     | 
| 
      
 202 
     | 
    
         
            +
                           KEY_F(15), 5, '[', '1', ';', '2', 'R',
         
     | 
| 
      
 203 
     | 
    
         
            +
                           KEY_F(16), 5, '[', '1', ';', '2', 'S',
         
     | 
| 
      
 204 
     | 
    
         
            +
                           KEY_F(17), 6, '[', '1', '5', ';', '2', '~',  /* shift-f5 */
         
     | 
| 
      
 205 
     | 
    
         
            +
                           KEY_F(18), 6, '[', '1', '7', ';', '2', '~',
         
     | 
| 
      
 206 
     | 
    
         
            +
                           KEY_F(19), 6, '[', '1', '8', ';', '2', '~',
         
     | 
| 
      
 207 
     | 
    
         
            +
                           KEY_F(20), 6, '[', '1', '9', ';', '2', '~',
         
     | 
| 
      
 208 
     | 
    
         
            +
                           KEY_F(21), 6, '[', '2', '0', ';', '2', '~',
         
     | 
| 
      
 209 
     | 
    
         
            +
                           KEY_F(22), 6, '[', '2', '1', ';', '2', '~',
         
     | 
| 
      
 210 
     | 
    
         
            +
                           KEY_F(23), 6, '[', '2', '3', ';', '2', '~',  /* shift-f11 */
         
     | 
| 
      
 211 
     | 
    
         
            +
                           KEY_F(24), 6, '[', '2', '4', ';', '2', '~',
         
     | 
| 
      
 212 
     | 
    
         
            +
                           27, 0,
         
     | 
| 
      
 213 
     | 
    
         
            +
                           0 };
         
     | 
| 
      
 214 
     | 
    
         
            +
               int i, rval = -1;
         
     | 
| 
      
 215 
     | 
    
         
            +
               const int *tptr;
         
     | 
| 
      
 216 
     | 
    
         
            +
             
     | 
| 
      
 217 
     | 
    
         
            +
               if( count == 1)
         
     | 
| 
      
 218 
     | 
    
         
            +
                  {
         
     | 
| 
      
 219 
     | 
    
         
            +
                  if( c[0] >= 'a' && c[0] <= 'z')
         
     | 
| 
      
 220 
     | 
    
         
            +
                     rval = ALT_A + c[0] - 'a';
         
     | 
| 
      
 221 
     | 
    
         
            +
                  if( c[0] >= '0' && c[0] <= '9')
         
     | 
| 
      
 222 
     | 
    
         
            +
                     rval = ALT_0 + c[0] - '0';
         
     | 
| 
      
 223 
     | 
    
         
            +
                  }
         
     | 
| 
      
 224 
     | 
    
         
            +
               else if( count == 5 && c[0] == '[' && c[1] == 'M')
         
     | 
| 
      
 225 
     | 
    
         
            +
                  rval = KEY_MOUSE;
         
     | 
| 
      
 226 
     | 
    
         
            +
               for( tptr = tbl; rval == -1 && *tptr; tptr += 2 + tptr[1])
         
     | 
| 
      
 227 
     | 
    
         
            +
                  if( count == tptr[1])
         
     | 
| 
      
 228 
     | 
    
         
            +
                     {
         
     | 
| 
      
 229 
     | 
    
         
            +
                     i = 0;
         
     | 
| 
      
 230 
     | 
    
         
            +
                     while( tptr[i + 2] == c[i] && i < count)
         
     | 
| 
      
 231 
     | 
    
         
            +
                        i++;
         
     | 
| 
      
 232 
     | 
    
         
            +
                     if( i == count)
         
     | 
| 
      
 233 
     | 
    
         
            +
                        rval = tptr[0];
         
     | 
| 
      
 234 
     | 
    
         
            +
                     }
         
     | 
| 
      
 235 
     | 
    
         
            +
               return( rval);
         
     | 
| 
      
 236 
     | 
    
         
            +
            }
         
     | 
| 
      
 237 
     | 
    
         
            +
             
     | 
| 
      
 238 
     | 
    
         
            +
            int PDC_get_key( void)
         
     | 
| 
      
 239 
     | 
    
         
            +
            {
         
     | 
| 
      
 240 
     | 
    
         
            +
               int rval = -1;
         
     | 
| 
      
 241 
     | 
    
         
            +
             
     | 
| 
      
 242 
     | 
    
         
            +
               if( PDC_resize_occurred)
         
     | 
| 
      
 243 
     | 
    
         
            +
                  {
         
     | 
| 
      
 244 
     | 
    
         
            +
                  PDC_resize_occurred = FALSE;
         
     | 
| 
      
 245 
     | 
    
         
            +
                  return( KEY_RESIZE);
         
     | 
| 
      
 246 
     | 
    
         
            +
                  }
         
     | 
| 
      
 247 
     | 
    
         
            +
               if( check_key( &rval))
         
     | 
| 
      
 248 
     | 
    
         
            +
                  {
         
     | 
| 
      
 249 
     | 
    
         
            +
                  int c[13];
         
     | 
| 
      
 250 
     | 
    
         
            +
             
     | 
| 
      
 251 
     | 
    
         
            +
            #ifdef USE_CONIO
         
     | 
| 
      
 252 
     | 
    
         
            +
                  SP->key_code = (rval == 0 || rval == 224);
         
     | 
| 
      
 253 
     | 
    
         
            +
                  if( SP->key_code)
         
     | 
| 
      
 254 
     | 
    
         
            +
                     {
         
     | 
| 
      
 255 
     | 
    
         
            +
                     int key2;
         
     | 
| 
      
 256 
     | 
    
         
            +
             
     | 
| 
      
 257 
     | 
    
         
            +
                     while( !check_key( &key2))
         
     | 
| 
      
 258 
     | 
    
         
            +
                        ;
         
     | 
| 
      
 259 
     | 
    
         
            +
                     rval = xlate_vt_codes_for_dos( rval, key2);
         
     | 
| 
      
 260 
     | 
    
         
            +
                     return( rval);
         
     | 
| 
      
 261 
     | 
    
         
            +
                     }
         
     | 
| 
      
 262 
     | 
    
         
            +
             
     | 
| 
      
 263 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 264 
     | 
    
         
            +
                  SP->key_code = (rval == 27);
         
     | 
| 
      
 265 
     | 
    
         
            +
                  if( rval == 27)
         
     | 
| 
      
 266 
     | 
    
         
            +
                     {
         
     | 
| 
      
 267 
     | 
    
         
            +
                     int count = 0;
         
     | 
| 
      
 268 
     | 
    
         
            +
             
     | 
| 
      
 269 
     | 
    
         
            +
                     while( count < 6 && check_key( &c[count])
         
     | 
| 
      
 270 
     | 
    
         
            +
                              && (rval = xlate_vt_codes( c, count + 1)) == -1)
         
     | 
| 
      
 271 
     | 
    
         
            +
                        count++;
         
     | 
| 
      
 272 
     | 
    
         
            +
                     if( rval == KEY_MOUSE)
         
     | 
| 
      
 273 
     | 
    
         
            +
                        {
         
     | 
| 
      
 274 
     | 
    
         
            +
                        int idx = (c[2] & 3), flags = 0, i;
         
     | 
| 
      
 275 
     | 
    
         
            +
                        const bool release = (idx == 3);
         
     | 
| 
      
 276 
     | 
    
         
            +
                        static int held = 0;
         
     | 
| 
      
 277 
     | 
    
         
            +
             
     | 
| 
      
 278 
     | 
    
         
            +
                        if( c[2] & 4)
         
     | 
| 
      
 279 
     | 
    
         
            +
                           flags |= PDC_BUTTON_SHIFT;
         
     | 
| 
      
 280 
     | 
    
         
            +
                        if( c[2] & 8)
         
     | 
| 
      
 281 
     | 
    
         
            +
                           flags |= PDC_BUTTON_ALT;
         
     | 
| 
      
 282 
     | 
    
         
            +
                        if( c[2] & 16)
         
     | 
| 
      
 283 
     | 
    
         
            +
                           flags |= PDC_BUTTON_CONTROL;
         
     | 
| 
      
 284 
     | 
    
         
            +
                        if( (c[2] & 0x60) == 0x40)    /* mouse move */
         
     | 
| 
      
 285 
     | 
    
         
            +
                           {
         
     | 
| 
      
 286 
     | 
    
         
            +
                           int report_event = 0;
         
     | 
| 
      
 287 
     | 
    
         
            +
             
     | 
| 
      
 288 
     | 
    
         
            +
                           if( idx == 0 && (SP->_trap_mbe & BUTTON1_MOVED))
         
     | 
| 
      
 289 
     | 
    
         
            +
                              report_event |= 1;
         
     | 
| 
      
 290 
     | 
    
         
            +
                           if( idx == 1 && (SP->_trap_mbe & BUTTON2_MOVED))
         
     | 
| 
      
 291 
     | 
    
         
            +
                              report_event |= 2;
         
     | 
| 
      
 292 
     | 
    
         
            +
                           if( idx == 2 && (SP->_trap_mbe & BUTTON3_MOVED))
         
     | 
| 
      
 293 
     | 
    
         
            +
                              report_event |= 4;
         
     | 
| 
      
 294 
     | 
    
         
            +
                           if( report_event)
         
     | 
| 
      
 295 
     | 
    
         
            +
                              report_event |= PDC_MOUSE_MOVED;
         
     | 
| 
      
 296 
     | 
    
         
            +
                           else if( SP->_trap_mbe & REPORT_MOUSE_POSITION)
         
     | 
| 
      
 297 
     | 
    
         
            +
                              report_event = PDC_MOUSE_POSITION;
         
     | 
| 
      
 298 
     | 
    
         
            +
                           pdc_mouse_status.changes = report_event;
         
     | 
| 
      
 299 
     | 
    
         
            +
                           for( i = 0; i < 3; i++)
         
     | 
| 
      
 300 
     | 
    
         
            +
                              pdc_mouse_status.button[i] = (i == idx ? BUTTON_MOVED : 0);
         
     | 
| 
      
 301 
     | 
    
         
            +
                           idx = 3;
         
     | 
| 
      
 302 
     | 
    
         
            +
                           }
         
     | 
| 
      
 303 
     | 
    
         
            +
                        else if( idx == 3)         /* it's a release */
         
     | 
| 
      
 304 
     | 
    
         
            +
                           {
         
     | 
| 
      
 305 
     | 
    
         
            +
                           idx = 0;
         
     | 
| 
      
 306 
     | 
    
         
            +
                           while( idx < 3 && !((held >> idx) & 1))
         
     | 
| 
      
 307 
     | 
    
         
            +
                              idx++;
         
     | 
| 
      
 308 
     | 
    
         
            +
                           held ^= (1 << idx);
         
     | 
| 
      
 309 
     | 
    
         
            +
                           }
         
     | 
| 
      
 310 
     | 
    
         
            +
                        if( idx < 3)
         
     | 
| 
      
 311 
     | 
    
         
            +
                           {
         
     | 
| 
      
 312 
     | 
    
         
            +
                           memset(&pdc_mouse_status, 0, sizeof(MOUSE_STATUS));
         
     | 
| 
      
 313 
     | 
    
         
            +
                           pdc_mouse_status.button[idx] =
         
     | 
| 
      
 314 
     | 
    
         
            +
                                          (release ? BUTTON_RELEASED : BUTTON_PRESSED);
         
     | 
| 
      
 315 
     | 
    
         
            +
                           if( (c[2] & 0x60) == 0x60)    /* actually mouse wheel event */
         
     | 
| 
      
 316 
     | 
    
         
            +
                              pdc_mouse_status.changes =
         
     | 
| 
      
 317 
     | 
    
         
            +
                                    (idx ? PDC_MOUSE_WHEEL_DOWN : PDC_MOUSE_WHEEL_UP);
         
     | 
| 
      
 318 
     | 
    
         
            +
                           else     /* "normal" mouse button */
         
     | 
| 
      
 319 
     | 
    
         
            +
                              pdc_mouse_status.changes = (1 << idx);
         
     | 
| 
      
 320 
     | 
    
         
            +
                           if( !release && !(c[2] & 64))   /* wait for a possible release */
         
     | 
| 
      
 321 
     | 
    
         
            +
                              {
         
     | 
| 
      
 322 
     | 
    
         
            +
                              int n_events = 0;
         
     | 
| 
      
 323 
     | 
    
         
            +
             
     | 
| 
      
 324 
     | 
    
         
            +
                              while( n_events < 5)
         
     | 
| 
      
 325 
     | 
    
         
            +
                                 {
         
     | 
| 
      
 326 
     | 
    
         
            +
                                 PDC_napms( SP->mouse_wait);
         
     | 
| 
      
 327 
     | 
    
         
            +
                                 if( check_key( c))
         
     | 
| 
      
 328 
     | 
    
         
            +
                                    {
         
     | 
| 
      
 329 
     | 
    
         
            +
                                    count = 0;
         
     | 
| 
      
 330 
     | 
    
         
            +
                                    while( count < 5 && check_key( &c[count]))
         
     | 
| 
      
 331 
     | 
    
         
            +
                                       count++;
         
     | 
| 
      
 332 
     | 
    
         
            +
                                    n_events++;
         
     | 
| 
      
 333 
     | 
    
         
            +
                                    }
         
     | 
| 
      
 334 
     | 
    
         
            +
                                 else
         
     | 
| 
      
 335 
     | 
    
         
            +
                                    break;
         
     | 
| 
      
 336 
     | 
    
         
            +
                                 }
         
     | 
| 
      
 337 
     | 
    
         
            +
                              if( !n_events)   /* just a click,  no release(s) */
         
     | 
| 
      
 338 
     | 
    
         
            +
                                 held ^= (1 << idx);
         
     | 
| 
      
 339 
     | 
    
         
            +
                              else if( n_events == 1)
         
     | 
| 
      
 340 
     | 
    
         
            +
                                  pdc_mouse_status.button[idx] = BUTTON_CLICKED;
         
     | 
| 
      
 341 
     | 
    
         
            +
                              else if( n_events <= 3)
         
     | 
| 
      
 342 
     | 
    
         
            +
                                  pdc_mouse_status.button[idx] = BUTTON_DOUBLE_CLICKED;
         
     | 
| 
      
 343 
     | 
    
         
            +
                              else if( n_events <= 5)
         
     | 
| 
      
 344 
     | 
    
         
            +
                                  pdc_mouse_status.button[idx] = BUTTON_TRIPLE_CLICKED;
         
     | 
| 
      
 345 
     | 
    
         
            +
                              }
         
     | 
| 
      
 346 
     | 
    
         
            +
                           }
         
     | 
| 
      
 347 
     | 
    
         
            +
                        for( i = 0; i < 3; i++)
         
     | 
| 
      
 348 
     | 
    
         
            +
                           pdc_mouse_status.button[i] |= flags;
         
     | 
| 
      
 349 
     | 
    
         
            +
                        pdc_mouse_status.x = (unsigned char)( c[3] - ' ' - 1);
         
     | 
| 
      
 350 
     | 
    
         
            +
                        pdc_mouse_status.y = (unsigned char)( c[4] - ' ' - 1);
         
     | 
| 
      
 351 
     | 
    
         
            +
                        }
         
     | 
| 
      
 352 
     | 
    
         
            +
                     }
         
     | 
| 
      
 353 
     | 
    
         
            +
                  else if( (rval & 0xc0) == 0xc0)      /* start of UTF-8 */
         
     | 
| 
      
 354 
     | 
    
         
            +
                     {
         
     | 
| 
      
 355 
     | 
    
         
            +
                     check_key( &c[0]);
         
     | 
| 
      
 356 
     | 
    
         
            +
                     assert( (c[0] & 0xc0) == 0x80);
         
     | 
| 
      
 357 
     | 
    
         
            +
                     c[0] &= 0x3f;
         
     | 
| 
      
 358 
     | 
    
         
            +
                     if( !(rval & 0x20))      /* two-byte : U+0080 to U+07ff */
         
     | 
| 
      
 359 
     | 
    
         
            +
                        rval = c[0] | ((rval & 0x1f) << 6);
         
     | 
| 
      
 360 
     | 
    
         
            +
                     else if( !(rval & 0x10))   /* three-byte : U+0800 - U+ffff */
         
     | 
| 
      
 361 
     | 
    
         
            +
                        {
         
     | 
| 
      
 362 
     | 
    
         
            +
                        check_key( &c[1]);
         
     | 
| 
      
 363 
     | 
    
         
            +
                        assert( (c[1] & 0xc0) == 0x80);
         
     | 
| 
      
 364 
     | 
    
         
            +
                        c[1] &= 0x3f;
         
     | 
| 
      
 365 
     | 
    
         
            +
                        rval = (c[1] | (c[0] << 6) | ((rval & 0xf) << 12));
         
     | 
| 
      
 366 
     | 
    
         
            +
                        }
         
     | 
| 
      
 367 
     | 
    
         
            +
                        /* Else... four-byte SMP char */
         
     | 
| 
      
 368 
     | 
    
         
            +
                     }
         
     | 
| 
      
 369 
     | 
    
         
            +
                  else if( rval == 127)
         
     | 
| 
      
 370 
     | 
    
         
            +
                     rval = 8;
         
     | 
| 
      
 371 
     | 
    
         
            +
                  }
         
     | 
| 
      
 372 
     | 
    
         
            +
               return( rval);
         
     | 
| 
      
 373 
     | 
    
         
            +
            }
         
     | 
| 
      
 374 
     | 
    
         
            +
             
     | 
| 
      
 375 
     | 
    
         
            +
            int PDC_modifiers_set( void)
         
     | 
| 
      
 376 
     | 
    
         
            +
            {
         
     | 
| 
      
 377 
     | 
    
         
            +
               return( OK);
         
     | 
| 
      
 378 
     | 
    
         
            +
            }
         
     | 
| 
      
 379 
     | 
    
         
            +
             
     | 
| 
      
 380 
     | 
    
         
            +
            int PDC_mouse_set( void)
         
     | 
| 
      
 381 
     | 
    
         
            +
            {
         
     | 
| 
      
 382 
     | 
    
         
            +
               return(  OK);
         
     | 
| 
      
 383 
     | 
    
         
            +
            }
         
     | 
| 
      
 384 
     | 
    
         
            +
             
     | 
| 
      
 385 
     | 
    
         
            +
            void PDC_set_keyboard_binary( bool on)
         
     | 
| 
      
 386 
     | 
    
         
            +
            {
         
     | 
| 
      
 387 
     | 
    
         
            +
               return;
         
     | 
| 
      
 388 
     | 
    
         
            +
            }
         
     | 
| 
      
 389 
     | 
    
         
            +
             
     | 
| 
      
 390 
     | 
    
         
            +
            unsigned long PDC_get_input_fd( void)
         
     | 
| 
      
 391 
     | 
    
         
            +
            {
         
     | 
| 
      
 392 
     | 
    
         
            +
               return( 0);
         
     | 
| 
      
 393 
     | 
    
         
            +
            }
         
     | 
| 
      
 394 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,434 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include <stdio.h>
         
     | 
| 
      
 2 
     | 
    
         
            +
            #include <stdlib.h>
         
     | 
| 
      
 3 
     | 
    
         
            +
            #include <signal.h>
         
     | 
| 
      
 4 
     | 
    
         
            +
            #include <string.h>
         
     | 
| 
      
 5 
     | 
    
         
            +
            #if !defined( _WIN32) && !defined( DOS)
         
     | 
| 
      
 6 
     | 
    
         
            +
            #define USE_TERMIOS
         
     | 
| 
      
 7 
     | 
    
         
            +
            #include <unistd.h>
         
     | 
| 
      
 8 
     | 
    
         
            +
            #include <termios.h>
         
     | 
| 
      
 9 
     | 
    
         
            +
            #include <sys/ioctl.h>
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            static struct termios orig_term;
         
     | 
| 
      
 12 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 13 
     | 
    
         
            +
            #include <assert.h>
         
     | 
| 
      
 14 
     | 
    
         
            +
            #include "curspriv.h"
         
     | 
| 
      
 15 
     | 
    
         
            +
            #include "pdcvt.h"
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            #ifdef DOS
         
     | 
| 
      
 18 
     | 
    
         
            +
            bool PDC_is_ansi = TRUE;
         
     | 
| 
      
 19 
     | 
    
         
            +
            #else
         
     | 
| 
      
 20 
     | 
    
         
            +
            bool PDC_is_ansi = FALSE;
         
     | 
| 
      
 21 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            #ifdef _WIN32
         
     | 
| 
      
 24 
     | 
    
         
            +
            #include <windows.h>
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
         
     | 
| 
      
 27 
     | 
    
         
            +
            #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
         
     | 
| 
      
 28 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 29 
     | 
    
         
            +
            #ifndef ENABLE_VIRTUAL_TERMINAL_INPUT
         
     | 
| 
      
 30 
     | 
    
         
            +
            #define ENABLE_VIRTUAL_TERMINAL_INPUT      0x0200
         
     | 
| 
      
 31 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 32 
     | 
    
         
            +
            #ifndef DISABLE_NEWLINE_AUTO_RETURN
         
     | 
| 
      
 33 
     | 
    
         
            +
            #define DISABLE_NEWLINE_AUTO_RETURN        0x0008
         
     | 
| 
      
 34 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            /* In DOS/Windows,  we have two possible modes of operation.  If we can
         
     | 
| 
      
 37 
     | 
    
         
            +
            successfully use SetConsoleMode to ENABLE_VIRTUAL_TERMINAL_INPUT,
         
     | 
| 
      
 38 
     | 
    
         
            +
            we have access to most of what we'd use on xterm.  If not,  we can only
         
     | 
| 
      
 39 
     | 
    
         
            +
            use what ANSI.SYS or ANSI.COM (or their NANSI or NNANSI variants) support.
         
     | 
| 
      
 40 
     | 
    
         
            +
            We'll get sixteen colors,  no mouse events,  no resizable windows,  etc.
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
               So we check the return value from SetConsoleMode and set PDC_is_ansi
         
     | 
| 
      
 43 
     | 
    
         
            +
            accordingly.  (In DOS,  PDC_is_ansi is always true -- there's no xterm-like
         
     | 
| 
      
 44 
     | 
    
         
            +
            support there.  On non-MS platforms,  PDC_is_ansi is always false...
         
     | 
| 
      
 45 
     | 
    
         
            +
            though that should be revisited for the Linux console,  and probably
         
     | 
| 
      
 46 
     | 
    
         
            +
            elsewhere.)  */
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            static int set_win10_for_vt_codes( const bool setting_mode)
         
     | 
| 
      
 49 
     | 
    
         
            +
            {
         
     | 
| 
      
 50 
     | 
    
         
            +
                const HANDLE hIn = GetStdHandle( STD_INPUT_HANDLE);
         
     | 
| 
      
 51 
     | 
    
         
            +
                HANDLE hOut;
         
     | 
| 
      
 52 
     | 
    
         
            +
                DWORD dwMode = 0;
         
     | 
| 
      
 53 
     | 
    
         
            +
                static DWORD old_input_mode;
         
     | 
| 
      
 54 
     | 
    
         
            +
                const DWORD out_mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING
         
     | 
| 
      
 55 
     | 
    
         
            +
                                           | DISABLE_NEWLINE_AUTO_RETURN;
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                if( hIn == INVALID_HANDLE_VALUE)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    return GetLastError( );
         
     | 
| 
      
 59 
     | 
    
         
            +
                PDC_is_ansi = TRUE;
         
     | 
| 
      
 60 
     | 
    
         
            +
                if( setting_mode)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    {
         
     | 
| 
      
 62 
     | 
    
         
            +
                    GetConsoleMode( hIn, &old_input_mode);
         
     | 
| 
      
 63 
     | 
    
         
            +
                    dwMode = ENABLE_VIRTUAL_TERMINAL_INPUT;
         
     | 
| 
      
 64 
     | 
    
         
            +
                    }
         
     | 
| 
      
 65 
     | 
    
         
            +
                else       /* restoring initial mode */
         
     | 
| 
      
 66 
     | 
    
         
            +
                    dwMode = old_input_mode;
         
     | 
| 
      
 67 
     | 
    
         
            +
                if( !SetConsoleMode( hIn, dwMode))
         
     | 
| 
      
 68 
     | 
    
         
            +
                    return GetLastError( );
         
     | 
| 
      
 69 
     | 
    
         
            +
                    /* Set output mode to handle virtual terminal sequences */
         
     | 
| 
      
 70 
     | 
    
         
            +
                hOut = GetStdHandle( STD_OUTPUT_HANDLE);
         
     | 
| 
      
 71 
     | 
    
         
            +
                if( hOut == INVALID_HANDLE_VALUE)
         
     | 
| 
      
 72 
     | 
    
         
            +
                    return GetLastError( );
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                if( !GetConsoleMode( hOut, &dwMode))
         
     | 
| 
      
 75 
     | 
    
         
            +
                    return GetLastError( );
         
     | 
| 
      
 76 
     | 
    
         
            +
                if( setting_mode)
         
     | 
| 
      
 77 
     | 
    
         
            +
                    dwMode |= out_mask;
         
     | 
| 
      
 78 
     | 
    
         
            +
                else                    /* clearing VT mode,  not setting it */
         
     | 
| 
      
 79 
     | 
    
         
            +
                    dwMode &= ~out_mask;
         
     | 
| 
      
 80 
     | 
    
         
            +
                if( !SetConsoleMode( hOut, dwMode))
         
     | 
| 
      
 81 
     | 
    
         
            +
                    return GetLastError( );
         
     | 
| 
      
 82 
     | 
    
         
            +
                          /* If we've gotten this far,  the terminal has been  */
         
     | 
| 
      
 83 
     | 
    
         
            +
                          /* set up to process xterm-like sequences : */
         
     | 
| 
      
 84 
     | 
    
         
            +
                PDC_is_ansi = FALSE;
         
     | 
| 
      
 85 
     | 
    
         
            +
                return( 0);
         
     | 
| 
      
 86 
     | 
    
         
            +
            }
         
     | 
| 
      
 87 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
            int PDC_rows = -1, PDC_cols = -1;
         
     | 
| 
      
 90 
     | 
    
         
            +
            bool PDC_resize_occurred = FALSE;
         
     | 
| 
      
 91 
     | 
    
         
            +
            const int STDIN = 0;
         
     | 
| 
      
 92 
     | 
    
         
            +
            chtype PDC_capabilities = 0;
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
            /* COLOR_PAIR to attribute encoding table. */
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
            static short *color_pair_indices = (short *)NULL;
         
     | 
| 
      
 97 
     | 
    
         
            +
            PACKED_RGB *pdc_rgbs = (PACKED_RGB *)NULL;
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            unsigned long pdc_key_modifiers = 0L;
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
            void PDC_reset_prog_mode( void)
         
     | 
| 
      
 102 
     | 
    
         
            +
            {
         
     | 
| 
      
 103 
     | 
    
         
            +
            }
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
            void PDC_reset_shell_mode( void)
         
     | 
| 
      
 106 
     | 
    
         
            +
            {
         
     | 
| 
      
 107 
     | 
    
         
            +
            }
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            static int initial_PDC_rows, initial_PDC_cols;
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            int PDC_resize_screen(int nlines, int ncols)
         
     | 
| 
      
 112 
     | 
    
         
            +
            {
         
     | 
| 
      
 113 
     | 
    
         
            +
               if( PDC_rows == -1)     /* initscr( ) hasn't been called;  we're just */
         
     | 
| 
      
 114 
     | 
    
         
            +
                  {                    /* setting desired size at startup */
         
     | 
| 
      
 115 
     | 
    
         
            +
                  initial_PDC_rows = nlines;
         
     | 
| 
      
 116 
     | 
    
         
            +
                  initial_PDC_cols = ncols;
         
     | 
| 
      
 117 
     | 
    
         
            +
                  }
         
     | 
| 
      
 118 
     | 
    
         
            +
               else if( nlines > 1 && ncols > 1 && !PDC_is_ansi)
         
     | 
| 
      
 119 
     | 
    
         
            +
                  {
         
     | 
| 
      
 120 
     | 
    
         
            +
                  printf( "\033[8;%d;%dt", nlines, ncols);
         
     | 
| 
      
 121 
     | 
    
         
            +
                  PDC_rows = nlines;
         
     | 
| 
      
 122 
     | 
    
         
            +
                  PDC_cols = ncols;
         
     | 
| 
      
 123 
     | 
    
         
            +
                  }
         
     | 
| 
      
 124 
     | 
    
         
            +
               return( 0);
         
     | 
| 
      
 125 
     | 
    
         
            +
            }
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
            void PDC_restore_screen_mode(int i)
         
     | 
| 
      
 128 
     | 
    
         
            +
            {
         
     | 
| 
      
 129 
     | 
    
         
            +
            }
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
            void PDC_save_screen_mode(int i)
         
     | 
| 
      
 132 
     | 
    
         
            +
            {
         
     | 
| 
      
 133 
     | 
    
         
            +
            }
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
            void PDC_scr_close( void)
         
     | 
| 
      
 136 
     | 
    
         
            +
            {
         
     | 
| 
      
 137 
     | 
    
         
            +
               printf( "\0338");         /* restore cursor & attribs (VT100) */
         
     | 
| 
      
 138 
     | 
    
         
            +
               printf( "\033[m");         /* set default screen attributes */
         
     | 
| 
      
 139 
     | 
    
         
            +
               printf( "\033[?47l");      /* restore screen */
         
     | 
| 
      
 140 
     | 
    
         
            +
               PDC_gotoyx( PDC_cols - 1, 0);
         
     | 
| 
      
 141 
     | 
    
         
            +
               printf( "\033[?1000l");        /* turn off mouse events */
         
     | 
| 
      
 142 
     | 
    
         
            +
            #ifdef _WIN32
         
     | 
| 
      
 143 
     | 
    
         
            +
               set_win10_for_vt_codes( FALSE);
         
     | 
| 
      
 144 
     | 
    
         
            +
            #else
         
     | 
| 
      
 145 
     | 
    
         
            +
               #if !defined( DOS)
         
     | 
| 
      
 146 
     | 
    
         
            +
                  tcsetattr( STDIN, TCSANOW, &orig_term);
         
     | 
| 
      
 147 
     | 
    
         
            +
               #endif
         
     | 
| 
      
 148 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 149 
     | 
    
         
            +
               return;
         
     | 
| 
      
 150 
     | 
    
         
            +
            }
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
            void PDC_scr_free( void)
         
     | 
| 
      
 153 
     | 
    
         
            +
            {
         
     | 
| 
      
 154 
     | 
    
         
            +
                if (SP)
         
     | 
| 
      
 155 
     | 
    
         
            +
                    free(SP);
         
     | 
| 
      
 156 
     | 
    
         
            +
                SP = (SCREEN *)NULL;
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                if (color_pair_indices)
         
     | 
| 
      
 159 
     | 
    
         
            +
                    free(color_pair_indices);
         
     | 
| 
      
 160 
     | 
    
         
            +
                color_pair_indices = (short *)NULL;
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
                if (pdc_rgbs)
         
     | 
| 
      
 163 
     | 
    
         
            +
                    free(pdc_rgbs);
         
     | 
| 
      
 164 
     | 
    
         
            +
                pdc_rgbs = (PACKED_RGB *)NULL;
         
     | 
| 
      
 165 
     | 
    
         
            +
            }
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
            #ifdef USE_TERMIOS
         
     | 
| 
      
 168 
     | 
    
         
            +
            static void sigwinchHandler( int sig)
         
     | 
| 
      
 169 
     | 
    
         
            +
            {
         
     | 
| 
      
 170 
     | 
    
         
            +
               struct winsize ws;
         
     | 
| 
      
 171 
     | 
    
         
            +
             
     | 
| 
      
 172 
     | 
    
         
            +
               if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) != -1)
         
     | 
| 
      
 173 
     | 
    
         
            +
                  if( PDC_rows != ws.ws_row || PDC_cols != ws.ws_col)
         
     | 
| 
      
 174 
     | 
    
         
            +
                     {
         
     | 
| 
      
 175 
     | 
    
         
            +
                     PDC_rows = ws.ws_row;
         
     | 
| 
      
 176 
     | 
    
         
            +
                     PDC_cols = ws.ws_col;
         
     | 
| 
      
 177 
     | 
    
         
            +
                     PDC_resize_occurred = TRUE;
         
     | 
| 
      
 178 
     | 
    
         
            +
                     }
         
     | 
| 
      
 179 
     | 
    
         
            +
            }
         
     | 
| 
      
 180 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
            #define MAX_LINES 1000
         
     | 
| 
      
 183 
     | 
    
         
            +
            #define MAX_COLUMNS 1000
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
            int PDC_scr_open(int argc, char **argv)
         
     | 
| 
      
 186 
     | 
    
         
            +
            {
         
     | 
| 
      
 187 
     | 
    
         
            +
                int i, r, g, b, n_colors;
         
     | 
| 
      
 188 
     | 
    
         
            +
                char *capabilities = getenv( "PDC_VT");
         
     | 
| 
      
 189 
     | 
    
         
            +
                const char *colorterm = getenv( "COLORTERM");
         
     | 
| 
      
 190 
     | 
    
         
            +
            #ifdef USE_TERMIOS
         
     | 
| 
      
 191 
     | 
    
         
            +
                struct sigaction sa;
         
     | 
| 
      
 192 
     | 
    
         
            +
                struct termios term;
         
     | 
| 
      
 193 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 194 
     | 
    
         
            +
            #ifdef _WIN32
         
     | 
| 
      
 195 
     | 
    
         
            +
                set_win10_for_vt_codes( TRUE);
         
     | 
| 
      
 196 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
                PDC_LOG(("PDC_scr_open called\n"));
         
     | 
| 
      
 199 
     | 
    
         
            +
                if( colorterm && !strcmp( colorterm, "truecolor"))
         
     | 
| 
      
 200 
     | 
    
         
            +
                   PDC_capabilities |= A_RGB_COLOR;
         
     | 
| 
      
 201 
     | 
    
         
            +
                if( capabilities)      /* these should really come from terminfo! */
         
     | 
| 
      
 202 
     | 
    
         
            +
                   {
         
     | 
| 
      
 203 
     | 
    
         
            +
                   if( strstr( capabilities, "RGB"))
         
     | 
| 
      
 204 
     | 
    
         
            +
                      PDC_capabilities |= A_RGB_COLOR;
         
     | 
| 
      
 205 
     | 
    
         
            +
                   if( strstr( capabilities, "UND"))
         
     | 
| 
      
 206 
     | 
    
         
            +
                      PDC_capabilities |= A_UNDERLINE;
         
     | 
| 
      
 207 
     | 
    
         
            +
                   if( strstr( capabilities, "BLI"))
         
     | 
| 
      
 208 
     | 
    
         
            +
                      PDC_capabilities |= A_BLINK;
         
     | 
| 
      
 209 
     | 
    
         
            +
                   if( strstr( capabilities, "DIM"))
         
     | 
| 
      
 210 
     | 
    
         
            +
                      PDC_capabilities |= A_DIM;
         
     | 
| 
      
 211 
     | 
    
         
            +
                   if( strstr( capabilities, "STA"))
         
     | 
| 
      
 212 
     | 
    
         
            +
                      PDC_capabilities |= A_STANDOUT;
         
     | 
| 
      
 213 
     | 
    
         
            +
                   }
         
     | 
| 
      
 214 
     | 
    
         
            +
                SP = calloc(1, sizeof(SCREEN));
         
     | 
| 
      
 215 
     | 
    
         
            +
                color_pair_indices = (short *)calloc( PDC_COLOR_PAIRS * 2, sizeof( short));
         
     | 
| 
      
 216 
     | 
    
         
            +
                n_colors = (PDC_is_ansi ? 16 : 256);
         
     | 
| 
      
 217 
     | 
    
         
            +
                pdc_rgbs = (PACKED_RGB *)calloc( n_colors, sizeof( PACKED_RGB));
         
     | 
| 
      
 218 
     | 
    
         
            +
                assert( SP && color_pair_indices && pdc_rgbs);
         
     | 
| 
      
 219 
     | 
    
         
            +
                if (!SP || !color_pair_indices || !pdc_rgbs)
         
     | 
| 
      
 220 
     | 
    
         
            +
                    return ERR;
         
     | 
| 
      
 221 
     | 
    
         
            +
             
     | 
| 
      
 222 
     | 
    
         
            +
                COLORS = n_colors;  /* should give this a try and see if it works! */
         
     | 
| 
      
 223 
     | 
    
         
            +
                for( i = 0; i < 16 && i < n_colors; i++)
         
     | 
| 
      
 224 
     | 
    
         
            +
                {
         
     | 
| 
      
 225 
     | 
    
         
            +
                    const int intensity = ((i & 8) ? 0xff : 0xc0);
         
     | 
| 
      
 226 
     | 
    
         
            +
             
     | 
| 
      
 227 
     | 
    
         
            +
                    pdc_rgbs[i] = PACK_RGB( ((i & COLOR_RED) ? intensity : 0),
         
     | 
| 
      
 228 
     | 
    
         
            +
                                       ((i & COLOR_GREEN) ? intensity : 0),
         
     | 
| 
      
 229 
     | 
    
         
            +
                                       ((i & COLOR_BLUE) ? intensity : 0));
         
     | 
| 
      
 230 
     | 
    
         
            +
                }
         
     | 
| 
      
 231 
     | 
    
         
            +
                       /* 256-color xterm extended palette:  216 colors in a
         
     | 
| 
      
 232 
     | 
    
         
            +
                        6x6x6 color cube,  plus 24 (not 50) shades of gray */
         
     | 
| 
      
 233 
     | 
    
         
            +
                for( r = 0; r < 6; r++)
         
     | 
| 
      
 234 
     | 
    
         
            +
                    for( g = 0; g < 6; g++)
         
     | 
| 
      
 235 
     | 
    
         
            +
                        for( b = 0; b < 6; b++)
         
     | 
| 
      
 236 
     | 
    
         
            +
                            if( i < n_colors)
         
     | 
| 
      
 237 
     | 
    
         
            +
                                pdc_rgbs[i++] = PACK_RGB( r ? r * 40 + 55 : 0,
         
     | 
| 
      
 238 
     | 
    
         
            +
                                               g ? g * 40 + 55 : 0,
         
     | 
| 
      
 239 
     | 
    
         
            +
                                               b ? b * 40 + 55 : 0);
         
     | 
| 
      
 240 
     | 
    
         
            +
                for( i = 0; i < 24; i++)
         
     | 
| 
      
 241 
     | 
    
         
            +
                    if( i + 232 < n_colors)
         
     | 
| 
      
 242 
     | 
    
         
            +
                        pdc_rgbs[i + 232] = PACK_RGB( i * 10 + 8, i * 10 + 8, i * 10 + 8);
         
     | 
| 
      
 243 
     | 
    
         
            +
                setbuf( stdin, NULL);
         
     | 
| 
      
 244 
     | 
    
         
            +
                setbuf( stdout, NULL);
         
     | 
| 
      
 245 
     | 
    
         
            +
            #ifdef USE_TERMIOS
         
     | 
| 
      
 246 
     | 
    
         
            +
                sigemptyset(&sa.sa_mask);
         
     | 
| 
      
 247 
     | 
    
         
            +
                sa.sa_flags = 0;
         
     | 
| 
      
 248 
     | 
    
         
            +
                sa.sa_handler = sigwinchHandler;
         
     | 
| 
      
 249 
     | 
    
         
            +
                if (sigaction(SIGWINCH, &sa, NULL) == -1)
         
     | 
| 
      
 250 
     | 
    
         
            +
                {
         
     | 
| 
      
 251 
     | 
    
         
            +
                    fprintf( stderr, "Sigaction failed\n");
         
     | 
| 
      
 252 
     | 
    
         
            +
                    return( -1);
         
     | 
| 
      
 253 
     | 
    
         
            +
                }
         
     | 
| 
      
 254 
     | 
    
         
            +
                sigwinchHandler( 0);
         
     | 
| 
      
 255 
     | 
    
         
            +
            #else
         
     | 
| 
      
 256 
     | 
    
         
            +
                {
         
     | 
| 
      
 257 
     | 
    
         
            +
                    const char *env = getenv("PDC_LINES");
         
     | 
| 
      
 258 
     | 
    
         
            +
             
     | 
| 
      
 259 
     | 
    
         
            +
                    PDC_rows = (env ? atoi( env) : 25);
         
     | 
| 
      
 260 
     | 
    
         
            +
                    env = getenv( "PDC_COLS");
         
     | 
| 
      
 261 
     | 
    
         
            +
                    PDC_cols = (env ? atoi( env) : 80);
         
     | 
| 
      
 262 
     | 
    
         
            +
                }
         
     | 
| 
      
 263 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 264 
     | 
    
         
            +
                SP->mouse_wait = PDC_CLICK_PERIOD;
         
     | 
| 
      
 265 
     | 
    
         
            +
                SP->visibility = 0;                /* no cursor,  by default */
         
     | 
| 
      
 266 
     | 
    
         
            +
                SP->curscol = SP->cursrow = 0;
         
     | 
| 
      
 267 
     | 
    
         
            +
                SP->audible = TRUE;
         
     | 
| 
      
 268 
     | 
    
         
            +
                SP->mono = FALSE;
         
     | 
| 
      
 269 
     | 
    
         
            +
             
     | 
| 
      
 270 
     | 
    
         
            +
                while( PDC_get_rows( ) < 1 && PDC_get_columns( ) < 1)
         
     | 
| 
      
 271 
     | 
    
         
            +
                  ;     /* wait for screen to be drawn and size determined */
         
     | 
| 
      
 272 
     | 
    
         
            +
                if( initial_PDC_rows > 1 && initial_PDC_cols > 1)
         
     | 
| 
      
 273 
     | 
    
         
            +
                {
         
     | 
| 
      
 274 
     | 
    
         
            +
                    PDC_resize_screen( initial_PDC_rows, initial_PDC_cols);
         
     | 
| 
      
 275 
     | 
    
         
            +
                    while( PDC_get_rows( ) != initial_PDC_rows
         
     | 
| 
      
 276 
     | 
    
         
            +
                        && PDC_get_columns( ) != initial_PDC_rows)
         
     | 
| 
      
 277 
     | 
    
         
            +
                       ;
         
     | 
| 
      
 278 
     | 
    
         
            +
                }
         
     | 
| 
      
 279 
     | 
    
         
            +
             
     | 
| 
      
 280 
     | 
    
         
            +
                SP->lines = PDC_get_rows();
         
     | 
| 
      
 281 
     | 
    
         
            +
                SP->cols = PDC_get_columns();
         
     | 
| 
      
 282 
     | 
    
         
            +
             
     | 
| 
      
 283 
     | 
    
         
            +
                if (SP->lines < 2 || SP->lines > MAX_LINES
         
     | 
| 
      
 284 
     | 
    
         
            +
                   || SP->cols < 2 || SP->cols > MAX_COLUMNS)
         
     | 
| 
      
 285 
     | 
    
         
            +
                {
         
     | 
| 
      
 286 
     | 
    
         
            +
                    fprintf(stderr, "LINES value must be >= 2 and <= %d: got %d\n",
         
     | 
| 
      
 287 
     | 
    
         
            +
                            MAX_LINES, SP->lines);
         
     | 
| 
      
 288 
     | 
    
         
            +
                    fprintf(stderr, "COLS value must be >= 2 and <= %d: got %d\n",
         
     | 
| 
      
 289 
     | 
    
         
            +
                            MAX_COLUMNS, SP->cols);
         
     | 
| 
      
 290 
     | 
    
         
            +
             
     | 
| 
      
 291 
     | 
    
         
            +
                    return ERR;
         
     | 
| 
      
 292 
     | 
    
         
            +
                }
         
     | 
| 
      
 293 
     | 
    
         
            +
             
     | 
| 
      
 294 
     | 
    
         
            +
            #ifdef USE_TERMIOS
         
     | 
| 
      
 295 
     | 
    
         
            +
                tcgetattr( STDIN, &orig_term);
         
     | 
| 
      
 296 
     | 
    
         
            +
                memcpy( &term, &orig_term, sizeof( term));
         
     | 
| 
      
 297 
     | 
    
         
            +
                term.c_lflag &= ~(ICANON | ECHO);
         
     | 
| 
      
 298 
     | 
    
         
            +
                tcsetattr( STDIN, TCSANOW, &term);
         
     | 
| 
      
 299 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 300 
     | 
    
         
            +
                printf( "\033[?47h");      /* Save screen */
         
     | 
| 
      
 301 
     | 
    
         
            +
                if( !PDC_is_ansi)
         
     | 
| 
      
 302 
     | 
    
         
            +
                    printf( "\033[?1000h");  /* enable mouse events,  at least on xterm */
         
     | 
| 
      
 303 
     | 
    
         
            +
                           /* NOTE: could send 1003h to get mouse motion events as well */
         
     | 
| 
      
 304 
     | 
    
         
            +
                printf( "\0337");         /* save cursor & attribs (VT100) */
         
     | 
| 
      
 305 
     | 
    
         
            +
                PDC_resize_occurred = FALSE;
         
     | 
| 
      
 306 
     | 
    
         
            +
                PDC_LOG(("PDC_scr_open exit\n"));
         
     | 
| 
      
 307 
     | 
    
         
            +
            /*  PDC_reset_prog_mode();   doesn't do anything anyway */
         
     | 
| 
      
 308 
     | 
    
         
            +
                return( 0);
         
     | 
| 
      
 309 
     | 
    
         
            +
            }
         
     | 
| 
      
 310 
     | 
    
         
            +
             
     | 
| 
      
 311 
     | 
    
         
            +
            int PDC_set_function_key( const unsigned function, const int new_key)
         
     | 
| 
      
 312 
     | 
    
         
            +
            {
         
     | 
| 
      
 313 
     | 
    
         
            +
               return( 0);
         
     | 
| 
      
 314 
     | 
    
         
            +
            }
         
     | 
| 
      
 315 
     | 
    
         
            +
             
     | 
| 
      
 316 
     | 
    
         
            +
            void PDC_set_resize_limits( const int new_min_lines,
         
     | 
| 
      
 317 
     | 
    
         
            +
                                        const int new_max_lines,
         
     | 
| 
      
 318 
     | 
    
         
            +
                                        const int new_min_cols,
         
     | 
| 
      
 319 
     | 
    
         
            +
                                        const int new_max_cols)
         
     | 
| 
      
 320 
     | 
    
         
            +
            {
         
     | 
| 
      
 321 
     | 
    
         
            +
               return;
         
     | 
| 
      
 322 
     | 
    
         
            +
            }
         
     | 
| 
      
 323 
     | 
    
         
            +
             
     | 
| 
      
 324 
     | 
    
         
            +
            /* PDC_init_color(), PDC_init_pair(),  and PDC_set_blink() all share a common
         
     | 
| 
      
 325 
     | 
    
         
            +
            issue : after adjusting the display characteristic in question,  all relevant
         
     | 
| 
      
 326 
     | 
    
         
            +
            text should be redrawn.  Call PDC_init_pair( 3, ...),  and all text using
         
     | 
| 
      
 327 
     | 
    
         
            +
            color pair 3 should be redrawn;  call PDC_init_color( 5, ...) and all text
         
     | 
| 
      
 328 
     | 
    
         
            +
            using color index 5 for either foreground or background should be redrawn;
         
     | 
| 
      
 329 
     | 
    
         
            +
            turn "real blinking" on/off,  and all blinking text should be redrawn.
         
     | 
| 
      
 330 
     | 
    
         
            +
            (On platforms where blinking text is controlled by a timer and redrawn every
         
     | 
| 
      
 331 
     | 
    
         
            +
            half second or so,  such as X11,  SDLx,  and Win32a,  this function can be
         
     | 
| 
      
 332 
     | 
    
         
            +
            used for that purpose as well.)
         
     | 
| 
      
 333 
     | 
    
         
            +
             
     | 
| 
      
 334 
     | 
    
         
            +
               PDC_show_changes( ) will look for relevant chains of text and redraw them.
         
     | 
| 
      
 335 
     | 
    
         
            +
            For speed/simplicity,  the code looks for the first and last character in
         
     | 
| 
      
 336 
     | 
    
         
            +
            each line that would be affected, then draws those in between.  Often --
         
     | 
| 
      
 337 
     | 
    
         
            +
            perhaps usually -- this will be zero characters, i.e., no text on that
         
     | 
| 
      
 338 
     | 
    
         
            +
            particular line happens to have an attribute requiring redrawing. */
         
     | 
| 
      
 339 
     | 
    
         
            +
             
     | 
| 
      
 340 
     | 
    
         
            +
            static short get_pair( const chtype ch)
         
     | 
| 
      
 341 
     | 
    
         
            +
             
     | 
| 
      
 342 
     | 
    
         
            +
            {
         
     | 
| 
      
 343 
     | 
    
         
            +
               return( (short)( (ch & A_COLOR) >> PDC_COLOR_SHIFT) & (COLOR_PAIRS - 1));
         
     | 
| 
      
 344 
     | 
    
         
            +
            }
         
     | 
| 
      
 345 
     | 
    
         
            +
             
     | 
| 
      
 346 
     | 
    
         
            +
            static int color_used_for_this_char( const chtype c, const int idx)
         
     | 
| 
      
 347 
     | 
    
         
            +
            {
         
     | 
| 
      
 348 
     | 
    
         
            +
                const int color = get_pair( c);
         
     | 
| 
      
 349 
     | 
    
         
            +
                const int rval = (color_pair_indices[color] == idx ||
         
     | 
| 
      
 350 
     | 
    
         
            +
                                 color_pair_indices[color + PDC_COLOR_PAIRS] == idx);
         
     | 
| 
      
 351 
     | 
    
         
            +
             
     | 
| 
      
 352 
     | 
    
         
            +
                return( rval);
         
     | 
| 
      
 353 
     | 
    
         
            +
            }
         
     | 
| 
      
 354 
     | 
    
         
            +
             
     | 
| 
      
 355 
     | 
    
         
            +
            void PDC_show_changes( const short pair, const short idx, const chtype attr)
         
     | 
| 
      
 356 
     | 
    
         
            +
            {
         
     | 
| 
      
 357 
     | 
    
         
            +
                if( curscr && curscr->_y)
         
     | 
| 
      
 358 
     | 
    
         
            +
                {
         
     | 
| 
      
 359 
     | 
    
         
            +
                    int i;
         
     | 
| 
      
 360 
     | 
    
         
            +
             
     | 
| 
      
 361 
     | 
    
         
            +
                    for( i = 0; i < SP->lines - 1; i++)
         
     | 
| 
      
 362 
     | 
    
         
            +
                        if( curscr->_y[i])
         
     | 
| 
      
 363 
     | 
    
         
            +
                        {
         
     | 
| 
      
 364 
     | 
    
         
            +
                            int j = 0, n_chars;
         
     | 
| 
      
 365 
     | 
    
         
            +
                            chtype *line = curscr->_y[i];
         
     | 
| 
      
 366 
     | 
    
         
            +
             
     | 
| 
      
 367 
     | 
    
         
            +
                     /* skip over starting text that isn't changed : */
         
     | 
| 
      
 368 
     | 
    
         
            +
                            while( j < SP->cols && get_pair( *line) != pair
         
     | 
| 
      
 369 
     | 
    
         
            +
                                   && !color_used_for_this_char( *line, idx)
         
     | 
| 
      
 370 
     | 
    
         
            +
                                   && !(attr & *line))
         
     | 
| 
      
 371 
     | 
    
         
            +
                            {
         
     | 
| 
      
 372 
     | 
    
         
            +
                                j++;
         
     | 
| 
      
 373 
     | 
    
         
            +
                                line++;
         
     | 
| 
      
 374 
     | 
    
         
            +
                            }
         
     | 
| 
      
 375 
     | 
    
         
            +
                            n_chars = SP->cols - j;
         
     | 
| 
      
 376 
     | 
    
         
            +
                    /* then skip over text at the end that's not the right color: */
         
     | 
| 
      
 377 
     | 
    
         
            +
                            while( n_chars && get_pair( line[n_chars - 1]) != pair
         
     | 
| 
      
 378 
     | 
    
         
            +
                                   && !color_used_for_this_char( line[n_chars - 1], idx)
         
     | 
| 
      
 379 
     | 
    
         
            +
                                   && !(attr & line[n_chars - 1]))
         
     | 
| 
      
 380 
     | 
    
         
            +
                                n_chars--;
         
     | 
| 
      
 381 
     | 
    
         
            +
                            assert( n_chars >= 0);
         
     | 
| 
      
 382 
     | 
    
         
            +
                            if( n_chars)
         
     | 
| 
      
 383 
     | 
    
         
            +
                                PDC_transform_line( i, j, n_chars, line);
         
     | 
| 
      
 384 
     | 
    
         
            +
                        }
         
     | 
| 
      
 385 
     | 
    
         
            +
                }
         
     | 
| 
      
 386 
     | 
    
         
            +
            }
         
     | 
| 
      
 387 
     | 
    
         
            +
             
     | 
| 
      
 388 
     | 
    
         
            +
            void PDC_init_pair( short pair, short fg, short bg)
         
     | 
| 
      
 389 
     | 
    
         
            +
            {
         
     | 
| 
      
 390 
     | 
    
         
            +
                if( color_pair_indices[pair] != fg ||
         
     | 
| 
      
 391 
     | 
    
         
            +
                    color_pair_indices[pair + PDC_COLOR_PAIRS] != bg)
         
     | 
| 
      
 392 
     | 
    
         
            +
                {
         
     | 
| 
      
 393 
     | 
    
         
            +
                    color_pair_indices[pair] = fg;
         
     | 
| 
      
 394 
     | 
    
         
            +
                    color_pair_indices[pair + PDC_COLOR_PAIRS] = bg;
         
     | 
| 
      
 395 
     | 
    
         
            +
                    PDC_show_changes( pair, -1, 0);
         
     | 
| 
      
 396 
     | 
    
         
            +
                }
         
     | 
| 
      
 397 
     | 
    
         
            +
            }
         
     | 
| 
      
 398 
     | 
    
         
            +
             
     | 
| 
      
 399 
     | 
    
         
            +
            int PDC_pair_content( short pair, short *fg, short *bg)
         
     | 
| 
      
 400 
     | 
    
         
            +
            {
         
     | 
| 
      
 401 
     | 
    
         
            +
                *fg = color_pair_indices[pair];
         
     | 
| 
      
 402 
     | 
    
         
            +
                *bg = color_pair_indices[pair + PDC_COLOR_PAIRS];
         
     | 
| 
      
 403 
     | 
    
         
            +
                return OK;
         
     | 
| 
      
 404 
     | 
    
         
            +
            }
         
     | 
| 
      
 405 
     | 
    
         
            +
             
     | 
| 
      
 406 
     | 
    
         
            +
            bool PDC_can_change_color(void)
         
     | 
| 
      
 407 
     | 
    
         
            +
            {
         
     | 
| 
      
 408 
     | 
    
         
            +
                return TRUE;
         
     | 
| 
      
 409 
     | 
    
         
            +
            }
         
     | 
| 
      
 410 
     | 
    
         
            +
             
     | 
| 
      
 411 
     | 
    
         
            +
            int PDC_color_content( short color, short *red, short *green, short *blue)
         
     | 
| 
      
 412 
     | 
    
         
            +
            {
         
     | 
| 
      
 413 
     | 
    
         
            +
                PACKED_RGB col = pdc_rgbs[color];
         
     | 
| 
      
 414 
     | 
    
         
            +
             
     | 
| 
      
 415 
     | 
    
         
            +
                *red = DIVROUND( Get_RValue(col) * 1000, 255);
         
     | 
| 
      
 416 
     | 
    
         
            +
                *green = DIVROUND( Get_GValue(col) * 1000, 255);
         
     | 
| 
      
 417 
     | 
    
         
            +
                *blue = DIVROUND( Get_BValue(col) * 1000, 255);
         
     | 
| 
      
 418 
     | 
    
         
            +
             
     | 
| 
      
 419 
     | 
    
         
            +
                return OK;
         
     | 
| 
      
 420 
     | 
    
         
            +
            }
         
     | 
| 
      
 421 
     | 
    
         
            +
             
     | 
| 
      
 422 
     | 
    
         
            +
            int PDC_init_color( short color, short red, short green, short blue)
         
     | 
| 
      
 423 
     | 
    
         
            +
            {
         
     | 
| 
      
 424 
     | 
    
         
            +
                const PACKED_RGB new_rgb = PACK_RGB(DIVROUND(red * 255, 1000),
         
     | 
| 
      
 425 
     | 
    
         
            +
                                             DIVROUND(green * 255, 1000),
         
     | 
| 
      
 426 
     | 
    
         
            +
                                             DIVROUND(blue * 255, 1000));
         
     | 
| 
      
 427 
     | 
    
         
            +
             
     | 
| 
      
 428 
     | 
    
         
            +
                if( pdc_rgbs[color] != new_rgb)
         
     | 
| 
      
 429 
     | 
    
         
            +
                {
         
     | 
| 
      
 430 
     | 
    
         
            +
                    pdc_rgbs[color] = new_rgb;
         
     | 
| 
      
 431 
     | 
    
         
            +
                    PDC_show_changes( -1, color, 0);
         
     | 
| 
      
 432 
     | 
    
         
            +
                }
         
     | 
| 
      
 433 
     | 
    
         
            +
                return OK;
         
     | 
| 
      
 434 
     | 
    
         
            +
            }
         
     |