From bb99924b24fdb2d3256095251294e226ce8f7180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 21 May 2011 20:32:53 +0200 Subject: [PATCH] Curses support across platforms! --- CMake/Modules/FindCurses.cmake | 190 +--- CMakeLists.txt | 41 + library/CMakeLists.txt | 1 + library/include/dfhack/extra/termutil.h | 2 +- pdcurses/curses.h | 1384 +++++++++++++++++++++++ pdcurses/panel.h | 58 + pdcurses/pdcurses.dll | Bin 0 -> 118784 bytes pdcurses/pdcurses.lib | Bin 0 -> 82782 bytes tools/playground/CMakeLists.txt | 4 + tools/supported/CMakeLists.txt | 32 +- tools/supported/veinlook.cpp | 5 +- 11 files changed, 1511 insertions(+), 206 deletions(-) create mode 100644 pdcurses/curses.h create mode 100644 pdcurses/panel.h create mode 100644 pdcurses/pdcurses.dll create mode 100644 pdcurses/pdcurses.lib diff --git a/CMake/Modules/FindCurses.cmake b/CMake/Modules/FindCurses.cmake index 468eff8e2..44e8ec3e3 100644 --- a/CMake/Modules/FindCurses.cmake +++ b/CMake/Modules/FindCurses.cmake @@ -1,177 +1,23 @@ -# - Find the curses include file and library -# -# CURSES_FOUND - system has Curses -# CURSES_INCLUDE_DIR - the Curses include directory -# CURSES_LIBRARIES - The libraries needed to use Curses -# CURSES_HAVE_CURSES_H - true if curses.h is available -# CURSES_HAVE_NCURSES_H - true if ncurses.h is available -# CURSES_HAVE_NCURSES_NCURSES_H - true if ncurses/ncurses.h is available -# CURSES_HAVE_NCURSES_CURSES_H - true if ncurses/curses.h is available -# CURSES_LIBRARY - set for backwards compatibility with 2.4 CMake -# -# Set CURSES_NEED_NCURSES to TRUE before the FIND_PACKAGE() command if NCurses -# functionality is required. +IF(Curses_FOUND) + SET(Curses_FIND_QUIETLY TRUE) +ENDIF() -# Set CURSES_NEED_WIDE to TRUE before the FIND_PACKAGE() command if unicode -# functionality is required +FIND_PATH(Curses_INCLUDE_PATH + NAMES ncurses.h curses.h + PATH_SUFFIXES ncurses + PATHS /usr/include /usr/local/include /usr/pkg/include +) -SET(CURSES_LIBRARY_NAME "curses") -SET(NCURSES_LIBRARY_NAME "ncurses") -IF(CURSES_NEED_WIDE) - SET(CURSES_LIBRARY_NAME "cursesw") - SET(NCURSES_LIBRARY_NAME "ncursesw") -ENDIF(CURSES_NEED_WIDE) +FIND_LIBRARY(Curses_LIBRARY + NAMES ncursesw + PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib +) -FIND_LIBRARY(CURSES_CURSES_LIBRARY "${CURSES_LIBRARY_NAME}") -#MESSAGE(STATUS "CURSES! " ${CURSES_CURSES_LIBRARY}) - -FIND_LIBRARY(CURSES_NCURSES_LIBRARY "${NCURSES_LIBRARY_NAME}") -#MESSAGE(STATUS "NCURSES! " ${CURSES_NCURSES_LIBRARY}) - -SET(CURSES_USE_NCURSES FALSE) - -IF(CURSES_NCURSES_LIBRARY AND NOT CURSES_CURSES_LIBRARY) - SET(CURSES_USE_NCURSES TRUE) -ENDIF(CURSES_NCURSES_LIBRARY AND NOT CURSES_CURSES_LIBRARY) - - -# Not sure the logic is correct here. -# If NCurses is required, use the function wsyncup() to check if the library -# has NCurses functionality (at least this is where it breaks on NetBSD). -# If wsyncup is in curses, use this one. -# If not, try to find ncurses and check if this has the symbol. -# Once the ncurses library is found, search the ncurses.h header first, but -# some web pages also say that even with ncurses there is not always a ncurses.h: -# http://osdir.com/ml/gnome.apps.mc.devel/2002-06/msg00029.html -# So at first try ncurses.h, if not found, try to find curses.h under the same -# prefix as the library was found, if still not found, try curses.h with the -# default search paths. -IF(CURSES_CURSES_LIBRARY AND CURSES_NEED_NCURSES) - INCLUDE(CheckLibraryExists) - CHECK_LIBRARY_EXISTS("${CURSES_CURSES_LIBRARY}" - wsyncup "" CURSES_CURSES_HAS_WSYNCUP) - - IF(CURSES_NCURSES_LIBRARY AND NOT CURSES_CURSES_HAS_WSYNCUP) - CHECK_LIBRARY_EXISTS("${CURSES_NCURSES_LIBRARY}" - wsyncup "" CURSES_NCURSES_HAS_WSYNCUP) - IF( CURSES_NCURSES_HAS_WSYNCUP) - SET(CURSES_USE_NCURSES TRUE) - ENDIF( CURSES_NCURSES_HAS_WSYNCUP) - ENDIF(CURSES_NCURSES_LIBRARY AND NOT CURSES_CURSES_HAS_WSYNCUP) -ENDIF(CURSES_CURSES_LIBRARY AND CURSES_NEED_NCURSES) - - -IF(NOT CURSES_USE_NCURSES) - FIND_FILE(CURSES_HAVE_CURSES_H curses.h ) - FIND_FILE(CURSES_HAVE_CURSESW_H cursesw.h ) - FIND_PATH(CURSES_CURSES_H_PATH curses.h ) - FIND_PATH(CURSES_CURSESW_H_PATH cursesw.h ) - GET_FILENAME_COMPONENT(_cursesLibDir "${CURSES_CURSES_LIBRARY}" PATH) - GET_FILENAME_COMPONENT(_cursesParentDir "${_cursesLibDir}" PATH) - - # for compatibility with older FindCurses.cmake this has to be in the cache - # FORCE must not be used since this would break builds which preload a cache wqith these variables set - SET(CURSES_INCLUDE_PATH "${CURSES_CURSES_H_PATH} ${CURSES_CURSESW_H_PATH}" - CACHE FILEPATH "The curses include path") - SET(CURSES_LIBRARY "${CURSES_CURSES_LIBRARY}" - CACHE FILEPATH "The curses library") -ELSE(NOT CURSES_USE_NCURSES) -# we need to find ncurses - GET_FILENAME_COMPONENT(_cursesLibDir "${CURSES_NCURSES_LIBRARY}" PATH) - GET_FILENAME_COMPONENT(_cursesParentDir "${_cursesLibDir}" PATH) - - FIND_FILE(CURSES_HAVE_NCURSES_H ncurses.h) - FIND_FILE(CURSES_HAVE_NCURSES_NCURSES_H ncurses/ncurses.h) - FIND_FILE(CURSES_HAVE_NCURSES_CURSES_H ncurses/curses.h) - FIND_FILE(CURSES_HAVE_CURSES_H curses.h - HINTS "${_cursesParentDir}/include") - - FIND_FILE(CURSES_HAVE_NCURSESW_H ncursesw.h) - FIND_FILE(CURSES_HAVE_NCURSESW_NCURSES_H ncursesw/ncurses.h) - FIND_FILE(CURSES_HAVE_NCURSESW_CURSES_H ncursesw/curses.h) - FIND_FILE(CURSES_HAVE_CURSESW_H cursesw.h - HINTS "${_cursesParentDir}/include") - - FIND_PATH(CURSES_NCURSES_INCLUDE_PATH ncurses.h ncurses/ncurses.h - ncurses/curses.h ncursesw.h ncursesw/ncurses.h ncursesw/curses.h cursesw.h) - FIND_PATH(CURSES_NCURSES_INCLUDE_PATH curses.h - HINTS "${_cursesParentDir}/include") - - # for compatibility with older FindCurses.cmake this has to be in the cache - # FORCE must not be used since this would break builds which preload - # a cache wqith these variables set - # only put ncurses include and library into - # variables if they are found - IF(CURSES_NCURSES_INCLUDE_PATH AND CURSES_NCURSES_LIBRARY) - SET(CURSES_INCLUDE_PATH "${CURSES_NCURSES_INCLUDE_PATH} ${CURSES_NCURSESW_INCLUDE_PATH}" - CACHE FILEPATH "The curses include path") - SET(CURSES_LIBRARY "${CURSES_NCURSES_LIBRARY}" - CACHE FILEPATH "The curses library") - ENDIF(CURSES_NCURSES_INCLUDE_PATH AND CURSES_NCURSES_LIBRARY) - -ENDIF(NOT CURSES_USE_NCURSES) - - - -FIND_LIBRARY(CURSES_EXTRA_LIBRARY cur_colr HINTS "${_cursesLibDir}") -FIND_LIBRARY(CURSES_EXTRA_LIBRARY cur_colr ) - -SET(CURSES_FORM_LIBRARY_NAME "form") -IF(CURSES_NEED_WIDE) - SET(CURSES_FORM_LIBRARY_NAME "formw") -ENDIF(CURSES_NEED_WIDE) - -FIND_LIBRARY(CURSES_CURSES_LIBRARY "${CURSES_LIBRARY_NAME}") -FIND_LIBRARY(CURSES_FORM_LIBRARY "${CURSES_FORM_LIBRARY_NAME}" HINTS "${_cursesLibDir}") -FIND_LIBRARY(CURSES_FORM_LIBRARY "${CURSES_FORM_LIBRARY_NAME}" ) - -# for compatibility with older FindCurses.cmake this has to be in the cache -# FORCE must not be used since this would break builds which preload a cache -# qith these variables set -SET(FORM_LIBRARY "${CURSES_FORM_LIBRARY}" - CACHE FILEPATH "The curses form library") - -# Need to provide the *_LIBRARIES -SET(CURSES_LIBRARIES ${CURSES_LIBRARY}) - -IF(CURSES_EXTRA_LIBRARY) - SET(CURSES_LIBRARIES ${CURSES_LIBRARIES} ${CURSES_EXTRA_LIBRARY}) -ENDIF(CURSES_EXTRA_LIBRARY) - -IF(CURSES_FORM_LIBRARY) - SET(CURSES_LIBRARIES ${CURSES_LIBRARIES} ${CURSES_FORM_LIBRARY}) -ENDIF(CURSES_FORM_LIBRARY) - -# Proper name is *_INCLUDE_DIR -SET(CURSES_INCLUDE_DIR ${CURSES_INCLUDE_PATH}) - -# handle the QUIETLY and REQUIRED arguments and set CURSES_FOUND to TRUE if -# all listed variables are TRUE -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(Curses DEFAULT_MSG - CURSES_LIBRARY CURSES_INCLUDE_PATH) +IF (Curses_INCLUDE_PATH AND Curses_LIBRARY) + SET(Curses_FOUND TRUE) +ENDIF() MARK_AS_ADVANCED( - CURSES_INCLUDE_PATH - CURSES_LIBRARY - CURSES_CURSES_INCLUDE_PATH - CURSES_CURSES_LIBRARY - CURSES_NCURSES_INCLUDE_PATH - CURSES_NCURSES_LIBRARY - CURSES_EXTRA_LIBRARY - FORM_LIBRARY - CURSES_FORM_LIBRARY - CURSES_LIBRARIES - CURSES_INCLUDE_DIR - CURSES_CURSES_HAS_WSYNCUP - CURSES_NCURSES_HAS_WSYNCUP - CURSES_HAVE_CURSESW_H - CURSES_HAVE_CURSES_H - CURSES_HAVE_NCURSESW_CURSES_H - CURSES_HAVE_NCURSESW_H - CURSES_HAVE_NCURSESW_NCURSES_H - CURSES_HAVE_NCURSES_CURSES_H - CURSES_HAVE_NCURSES_H - CURSES_HAVE_NCURSES_NCURSES_H - ) - + Curses_INCLUDE_PATH + Curses_LIBRARY +) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b8e7ab2e..d676741d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,7 @@ IF(WIN32) ELSE() set (DFHACK_INST_DEFAULT "linux") ENDIF() + SET( DFHACK_INSTALL ${DFHACK_INST_DEFAULT} CACHE STRING "Choose the install type: 'portable' for a portable zip or tar.gz package (windows default) @@ -150,6 +151,26 @@ include_directories (${dfhack_SOURCE_DIR}/library/shm/) include_directories (${dfhack_SOURCE_DIR}/library/depends/argstream/) include_directories (${dfhack_SOURCE_DIR}/library/depends/xgetopt/) +# handle curses library bull**** on multiple platforms. +IF(UNIX) + find_package(Curses QUIET) + if(Curses_FOUND) + add_library(curses SHARED IMPORTED) + set_property(TARGET curses PROPERTY IMPORTED_LOCATION ${Curses_LIBRARY}) + include_directories (${Curses_INCLUDE_PATH}) + endif() +ELSE() + add_library(curses SHARED IMPORTED) + set_property(TARGET curses PROPERTY IMPORTED_LOCATION ${dfhack_SOURCE_DIR}/pdcurses/pdcurses.dll) + set_property(TARGET curses PROPERTY IMPORTED_IMPLIB ${dfhack_SOURCE_DIR}/pdcurses/pdcurses.lib) + include_directories (${dfhack_SOURCE_DIR}/pdcurses) + add_custom_target( curses-copy + COMMAND "${CMAKE_COMMAND}" -E copy "${dfhack_SOURCE_DIR}/pdcurses/pdcurses.dll" ${dfhack_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/ + DEPENDS "${dfhack_SOURCE_DIR}/pdcurses/pdcurses.dll") + SET(Curses_FOUND TRUE) + INSTALL(FILES "${dfhack_SOURCE_DIR}/pdcurses/pdcurses.dll" DESTINATION ${DFHACK_BINARY_DESTINATION}) +ENDIF() + # macro to save on typing in the tool subdirs # builds a tool, links it to the dfhack lib and makes sure the dependency # LOCAL_DEPNAME is built first, in case there is one @@ -164,6 +185,26 @@ MACRO(DFHACK_TOOL TOOL_NAME TOOL_SOURCES) RUNTIME DESTINATION ${DFHACK_BINARY_DESTINATION}) ENDMACRO() +# same as above builds a curses tool instead of plain terminal one. +MACRO(DFHACK_CURSES_TOOL TOOL_NAME TOOL_SOURCES) + IF(Curses_FOUND) + ADD_EXECUTABLE(${TOOL_NAME} ${TOOL_SOURCES}) + TARGET_LINK_LIBRARIES(${TOOL_NAME} dfhack curses) + if(DEFINED LOCAL_DEPNAME) + ADD_DEPENDENCIES(${TOOL_NAME} ${LOCAL_DEPNAME}) + endif() + if(WIN32) + ADD_DEPENDENCIES(${TOOL_NAME} curses-copy) + ENDIF() + install(TARGETS + ${TOOL_NAME} + RUNTIME DESTINATION ${DFHACK_BINARY_DESTINATION}) + ELSE() + MESSAGE(STATUS "Wide-character ncurses library not found - " ${TOOL_NAME} "can't be built") + ENDIF() +ENDMACRO() + + IF(BUILD_DFHACK_LIBRARY) add_subdirectory (library) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index de8e1dae4..740c89dc0 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -38,6 +38,7 @@ include/dfhack/DFVector.h include/dfhack/VersionInfoFactory.h include/dfhack/VersionInfo.h include/dfhack/extra/MapExtras.h +include/dfhack/extra/termutil.h include/dfhack/modules/Buildings.h include/dfhack/modules/Constructions.h include/dfhack/modules/Creatures.h diff --git a/library/include/dfhack/extra/termutil.h b/library/include/dfhack/extra/termutil.h index 2055152f1..7a54be6ab 100644 --- a/library/include/dfhack/extra/termutil.h +++ b/library/include/dfhack/extra/termutil.h @@ -2,7 +2,7 @@ #define TERMUTIL_H #ifdef LINUX_BUILD -// FIXME: is this ever false? +// FIXME: is this ever true? bool TemporaryTerminal () { return false; diff --git a/pdcurses/curses.h b/pdcurses/curses.h new file mode 100644 index 000000000..0d4e92988 --- /dev/null +++ b/pdcurses/curses.h @@ -0,0 +1,1384 @@ +#ifndef PDC_DLL_BUILD +# define PDC_DLL_BUILD +#endif +#ifndef PDC_WIDE +# define PDC_WIDE +#endif + +/* Public Domain Curses */ + +/* $Id: curses.h,v 1.295 2008/07/15 17:13:25 wmcbrine Exp $ */ + +/*----------------------------------------------------------------------* + * PDCurses * + *----------------------------------------------------------------------*/ + +#ifndef __PDCURSES__ +#define __PDCURSES__ 1 + +/*man-start************************************************************** + +PDCurses definitions list: (Only define those needed) + + XCURSES True if compiling for X11. + PDC_RGB True if you want to use RGB color definitions + (Red = 1, Green = 2, Blue = 4) instead of BGR. + PDC_WIDE True if building wide-character support. + PDC_DLL_BUILD True if building a Win32 DLL. + NCURSES_MOUSE_VERSION Use the ncurses mouse API instead + of PDCurses' traditional mouse API. + +PDCurses portable platform definitions list: + + PDC_BUILD Defines API build version. + PDCURSES Enables access to PDCurses-only routines. + XOPEN Always true. + SYSVcurses True if you are compiling for SYSV portability. + BSDcurses True if you are compiling for BSD portability. + +**man-end****************************************************************/ + +#define PDC_BUILD 3401 +#define PDCURSES 1 /* PDCurses-only routines */ +#define XOPEN 1 /* X/Open Curses routines */ +#define SYSVcurses 1 /* System V Curses routines */ +#define BSDcurses 1 /* BSD Curses routines */ +#define CHTYPE_LONG 1 /* size of chtype; long */ + +/*----------------------------------------------------------------------*/ + +#include +#include +#include /* Required by X/Open usage below */ + +#ifdef PDC_WIDE +# include +#endif + +#if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) +extern "C" +{ +# define bool _bool +#endif + +/*---------------------------------------------------------------------- + * + * PDCurses Manifest Constants + * + */ + +#ifndef FALSE +# define FALSE 0 +#endif +#ifndef TRUE +# define TRUE 1 +#endif +#ifndef NULL +# define NULL (void *)0 +#endif +#ifndef ERR +# define ERR (-1) +#endif +#ifndef OK +# define OK 0 +#endif + +/*---------------------------------------------------------------------- + * + * PDCurses Type Declarations + * + */ + +typedef unsigned char bool; /* PDCurses Boolean type */ + +#ifdef CHTYPE_LONG +# if _LP64 +typedef unsigned int chtype; +# else +typedef unsigned long chtype; /* 16-bit attr + 16-bit char */ +# endif +#else +typedef unsigned short chtype; /* 8-bit attr + 8-bit char */ +#endif + +#ifdef PDC_WIDE +typedef chtype cchar_t; +#endif + +typedef chtype attr_t; + +/*---------------------------------------------------------------------- + * + * PDCurses Mouse Interface -- SYSVR4, with extensions + * + */ + +typedef struct +{ + int x; /* absolute column, 0 based, measured in characters */ + int y; /* absolute row, 0 based, measured in characters */ + short button[3]; /* state of each button */ + int changes; /* flags indicating what has changed with the mouse */ +} MOUSE_STATUS; + +#define BUTTON_RELEASED 0x0000 +#define BUTTON_PRESSED 0x0001 +#define BUTTON_CLICKED 0x0002 +#define BUTTON_DOUBLE_CLICKED 0x0003 +#define BUTTON_TRIPLE_CLICKED 0x0004 +#define BUTTON_MOVED 0x0005 /* PDCurses */ +#define WHEEL_SCROLLED 0x0006 /* PDCurses */ +#define BUTTON_ACTION_MASK 0x0007 /* PDCurses */ + +#define PDC_BUTTON_SHIFT 0x0008 /* PDCurses */ +#define PDC_BUTTON_CONTROL 0x0010 /* PDCurses */ +#define PDC_BUTTON_ALT 0x0020 /* PDCurses */ +#define BUTTON_MODIFIER_MASK 0x0038 /* PDCurses */ + +#define MOUSE_X_POS (Mouse_status.x) +#define MOUSE_Y_POS (Mouse_status.y) + +/* + * Bits associated with the .changes field: + * 3 2 1 0 + * 210987654321098765432109876543210 + * 1 <- button 1 has changed + * 10 <- button 2 has changed + * 100 <- button 3 has changed + * 1000 <- mouse has moved + * 10000 <- mouse position report + * 100000 <- mouse wheel up + * 1000000 <- mouse wheel down + */ + +#define PDC_MOUSE_MOVED 0x0008 +#define PDC_MOUSE_POSITION 0x0010 +#define PDC_MOUSE_WHEEL_UP 0x0020 +#define PDC_MOUSE_WHEEL_DOWN 0x0040 + +#define A_BUTTON_CHANGED (Mouse_status.changes & 7) +#define MOUSE_MOVED (Mouse_status.changes & PDC_MOUSE_MOVED) +#define MOUSE_POS_REPORT (Mouse_status.changes & PDC_MOUSE_POSITION) +#define BUTTON_CHANGED(x) (Mouse_status.changes & (1 << ((x) - 1))) +#define BUTTON_STATUS(x) (Mouse_status.button[(x) - 1]) +#define MOUSE_WHEEL_UP (Mouse_status.changes & PDC_MOUSE_WHEEL_UP) +#define MOUSE_WHEEL_DOWN (Mouse_status.changes & PDC_MOUSE_WHEEL_DOWN) + +/* mouse bit-masks */ + +#define BUTTON1_RELEASED 0x00000001L +#define BUTTON1_PRESSED 0x00000002L +#define BUTTON1_CLICKED 0x00000004L +#define BUTTON1_DOUBLE_CLICKED 0x00000008L +#define BUTTON1_TRIPLE_CLICKED 0x00000010L +#define BUTTON1_MOVED 0x00000010L /* PDCurses */ + +#define BUTTON2_RELEASED 0x00000020L +#define BUTTON2_PRESSED 0x00000040L +#define BUTTON2_CLICKED 0x00000080L +#define BUTTON2_DOUBLE_CLICKED 0x00000100L +#define BUTTON2_TRIPLE_CLICKED 0x00000200L +#define BUTTON2_MOVED 0x00000200L /* PDCurses */ + +#define BUTTON3_RELEASED 0x00000400L +#define BUTTON3_PRESSED 0x00000800L +#define BUTTON3_CLICKED 0x00001000L +#define BUTTON3_DOUBLE_CLICKED 0x00002000L +#define BUTTON3_TRIPLE_CLICKED 0x00004000L +#define BUTTON3_MOVED 0x00004000L /* PDCurses */ + +/* For the ncurses-compatible functions only, BUTTON4_PRESSED and + BUTTON5_PRESSED are returned for mouse scroll wheel up and down; + otherwise PDCurses doesn't support buttons 4 and 5 */ + +#define BUTTON4_RELEASED 0x00008000L +#define BUTTON4_PRESSED 0x00010000L +#define BUTTON4_CLICKED 0x00020000L +#define BUTTON4_DOUBLE_CLICKED 0x00040000L +#define BUTTON4_TRIPLE_CLICKED 0x00080000L + +#define BUTTON5_RELEASED 0x00100000L +#define BUTTON5_PRESSED 0x00200000L +#define BUTTON5_CLICKED 0x00400000L +#define BUTTON5_DOUBLE_CLICKED 0x00800000L +#define BUTTON5_TRIPLE_CLICKED 0x01000000L + +#define MOUSE_WHEEL_SCROLL 0x02000000L /* PDCurses */ +#define BUTTON_MODIFIER_SHIFT 0x04000000L /* PDCurses */ +#define BUTTON_MODIFIER_CONTROL 0x08000000L /* PDCurses */ +#define BUTTON_MODIFIER_ALT 0x10000000L /* PDCurses */ + +#define ALL_MOUSE_EVENTS 0x1fffffffL +#define REPORT_MOUSE_POSITION 0x20000000L + +/* ncurses mouse interface */ + +typedef unsigned long mmask_t; + +typedef struct +{ + short id; /* unused, always 0 */ + int x, y, z; /* x, y same as MOUSE_STATUS; z unused */ + mmask_t bstate; /* equivalent to changes + button[], but + in the same format as used for mousemask() */ +} MEVENT; + +#ifdef NCURSES_MOUSE_VERSION +# define BUTTON_SHIFT BUTTON_MODIFIER_SHIFT +# define BUTTON_CONTROL BUTTON_MODIFIER_CONTROL +# define BUTTON_CTRL BUTTON_MODIFIER_CONTROL +# define BUTTON_ALT BUTTON_MODIFIER_ALT +#else +# define BUTTON_SHIFT PDC_BUTTON_SHIFT +# define BUTTON_CONTROL PDC_BUTTON_CONTROL +# define BUTTON_ALT PDC_BUTTON_ALT +#endif + +/*---------------------------------------------------------------------- + * + * PDCurses Structure Definitions + * + */ + +typedef struct _win /* definition of a window */ +{ + int _cury; /* current pseudo-cursor */ + int _curx; + int _maxy; /* max window coordinates */ + int _maxx; + int _begy; /* origin on screen */ + int _begx; + int _flags; /* window properties */ + chtype _attrs; /* standard attributes and colors */ + chtype _bkgd; /* background, normally blank */ + bool _clear; /* causes clear at next refresh */ + bool _leaveit; /* leaves cursor where it is */ + bool _scroll; /* allows window scrolling */ + bool _nodelay; /* input character wait flag */ + bool _immed; /* immediate update flag */ + bool _sync; /* synchronise window ancestors */ + bool _use_keypad; /* flags keypad key mode active */ + chtype **_y; /* pointer to line pointer array */ + int *_firstch; /* first changed character in line */ + int *_lastch; /* last changed character in line */ + int _tmarg; /* top of scrolling region */ + int _bmarg; /* bottom of scrolling region */ + int _delayms; /* milliseconds of delay for getch() */ + int _parx, _pary; /* coords relative to parent (0,0) */ + struct _win *_parent; /* subwin's pointer to parent win */ +} WINDOW; + +/* Avoid using the SCREEN struct directly -- use the corresponding + functions if possible. This struct may eventually be made private. */ + +typedef struct +{ + bool alive; /* if initscr() called, and not endwin() */ + bool autocr; /* if cr -> lf */ + bool cbreak; /* if terminal unbuffered */ + bool echo; /* if terminal echo */ + bool raw_inp; /* raw input mode (v. cooked input) */ + bool raw_out; /* raw output mode (7 v. 8 bits) */ + bool audible; /* FALSE if the bell is visual */ + bool mono; /* TRUE if current screen is mono */ + bool resized; /* TRUE if TERM has been resized */ + bool orig_attr; /* TRUE if we have the original colors */ + short orig_fore; /* original screen foreground color */ + short orig_back; /* original screen foreground color */ + int cursrow; /* position of physical cursor */ + int curscol; /* position of physical cursor */ + int visibility; /* visibility of cursor */ + int orig_cursor; /* original cursor size */ + int lines; /* new value for LINES */ + int cols; /* new value for COLS */ + unsigned long _trap_mbe; /* trap these mouse button events */ + unsigned long _map_mbe_to_key; /* map mouse buttons to slk */ + int mouse_wait; /* time to wait (in ms) for a + button release after a press, in + order to count it as a click */ + int slklines; /* lines in use by slk_init() */ + WINDOW *slk_winptr; /* window for slk */ + int linesrippedoff; /* lines ripped off via ripoffline() */ + int linesrippedoffontop; /* lines ripped off on + top via ripoffline() */ + int delaytenths; /* 1/10ths second to wait block + getch() for */ + bool _preserve; /* TRUE if screen background + to be preserved */ + int _restore; /* specifies if screen background + to be restored, and how */ + bool save_key_modifiers; /* TRUE if each key modifiers saved + with each key press */ + bool return_key_modifiers; /* TRUE if modifier keys are + returned as "real" keys */ + bool key_code; /* TRUE if last key is a special key; + used internally by get_wch() */ +#ifdef XCURSES + int XcurscrSize; /* size of Xcurscr shared memory block */ + bool sb_on; + int sb_viewport_y; + int sb_viewport_x; + int sb_total_y; + int sb_total_x; + int sb_cur_y; + int sb_cur_x; +#endif + short line_color; /* color of line attributes - default -1 */ +} SCREEN; + +/*---------------------------------------------------------------------- + * + * PDCurses External Variables + * + */ + +#ifdef PDC_DLL_BUILD +# ifdef CURSES_LIBRARY +# define PDCEX __declspec(dllexport) extern +# else +# define PDCEX __declspec(dllimport) +# endif +#else +# define PDCEX extern +#endif + +PDCEX int LINES; /* terminal height */ +PDCEX int COLS; /* terminal width */ +PDCEX WINDOW *stdscr; /* the default screen window */ +PDCEX WINDOW *curscr; /* the current screen image */ +PDCEX SCREEN *SP; /* curses variables */ +PDCEX MOUSE_STATUS Mouse_status; +PDCEX int COLORS; +PDCEX int COLOR_PAIRS; +PDCEX int TABSIZE; +PDCEX chtype acs_map[]; /* alternate character set map */ +PDCEX char ttytype[]; /* terminal name/description */ + +/*man-start************************************************************** + +PDCurses Text Attributes +======================== + +Originally, PDCurses used a short (16 bits) for its chtype. To include +color, a number of things had to be sacrificed from the strict Unix and +System V support. The main problem was fitting all character attributes +and color into an unsigned char (all 8 bits!). + +Today, PDCurses by default uses a long (32 bits) for its chtype, as in +System V. The short chtype is still available, by undefining CHTYPE_LONG +and rebuilding the library. + +The following is the structure of a win->_attrs chtype: + +short form: + +------------------------------------------------- +|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| +------------------------------------------------- + color number | attrs | character eg 'a' + +The available non-color attributes are bold, reverse and blink. Others +have no effect. The high order char is an index into an array of +physical colors (defined in color.c) -- 32 foreground/background color +pairs (5 bits) plus 3 bits for other attributes. + +long form: + +---------------------------------------------------------------------------- +|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|..| 3| 2| 1| 0| +---------------------------------------------------------------------------- + color number | modifiers | character eg 'a' + +The available non-color attributes are bold, underline, invisible, +right-line, left-line, protect, reverse and blink. 256 color pairs (8 +bits), 8 bits for other attributes, and 16 bits for character data. + +**man-end****************************************************************/ + +/*** Video attribute macros ***/ + +#define A_NORMAL (chtype)0 + +#ifdef CHTYPE_LONG +# define A_ALTCHARSET (chtype)0x00010000 +# define A_RIGHTLINE (chtype)0x00020000 +# define A_LEFTLINE (chtype)0x00040000 +# define A_INVIS (chtype)0x00080000 +# define A_UNDERLINE (chtype)0x00100000 +# define A_REVERSE (chtype)0x00200000 +# define A_BLINK (chtype)0x00400000 +# define A_BOLD (chtype)0x00800000 + +# define A_ATTRIBUTES (chtype)0xffff0000 +# define A_CHARTEXT (chtype)0x0000ffff +# define A_COLOR (chtype)0xff000000 + +# define A_ITALIC A_INVIS +# define A_PROTECT (A_UNDERLINE | A_LEFTLINE | A_RIGHTLINE) + +# define PDC_ATTR_SHIFT 19 +# define PDC_COLOR_SHIFT 24 +#else +# define A_BOLD (chtype)0x0100 /* X/Open */ +# define A_REVERSE (chtype)0x0200 /* X/Open */ +# define A_BLINK (chtype)0x0400 /* X/Open */ + +# define A_ATTRIBUTES (chtype)0xff00 /* X/Open */ +# define A_CHARTEXT (chtype)0x00ff /* X/Open */ +# define A_COLOR (chtype)0xf800 /* System V */ + +# define A_ALTCHARSET A_NORMAL /* X/Open */ +# define A_PROTECT A_NORMAL /* X/Open */ +# define A_UNDERLINE A_NORMAL /* X/Open */ + +# define A_LEFTLINE A_NORMAL +# define A_RIGHTLINE A_NORMAL +# define A_ITALIC A_NORMAL +# define A_INVIS A_NORMAL + +# define PDC_ATTR_SHIFT 8 +# define PDC_COLOR_SHIFT 11 +#endif + +#define A_STANDOUT (A_REVERSE | A_BOLD) /* X/Open */ +#define A_DIM A_NORMAL + +#define CHR_MSK A_CHARTEXT /* Obsolete */ +#define ATR_MSK A_ATTRIBUTES /* Obsolete */ +#define ATR_NRM A_NORMAL /* Obsolete */ + +/* For use with attr_t -- X/Open says, "these shall be distinct", so + this is a non-conforming implementation. */ + +#define WA_ALTCHARSET A_ALTCHARSET +#define WA_BLINK A_BLINK +#define WA_BOLD A_BOLD +#define WA_DIM A_DIM +#define WA_INVIS A_INVIS +#define WA_LEFT A_LEFTLINE +#define WA_PROTECT A_PROTECT +#define WA_REVERSE A_REVERSE +#define WA_RIGHT A_RIGHTLINE +#define WA_STANDOUT A_STANDOUT +#define WA_UNDERLINE A_UNDERLINE + +#define WA_HORIZONTAL A_NORMAL +#define WA_LOW A_NORMAL +#define WA_TOP A_NORMAL +#define WA_VERTICAL A_NORMAL + +/*** Alternate character set macros ***/ + +/* 'w' = 32-bit chtype; acs_map[] index | A_ALTCHARSET + 'n' = 16-bit chtype; it gets the fallback set because no bit is + available for A_ALTCHARSET */ + +#ifdef CHTYPE_LONG +# define ACS_PICK(w, n) ((chtype)w | A_ALTCHARSET) +#else +# define ACS_PICK(w, n) ((chtype)n) +#endif + +/* VT100-compatible symbols -- box chars */ + +#define ACS_ULCORNER ACS_PICK('l', '+') +#define ACS_LLCORNER ACS_PICK('m', '+') +#define ACS_URCORNER ACS_PICK('k', '+') +#define ACS_LRCORNER ACS_PICK('j', '+') +#define ACS_RTEE ACS_PICK('u', '+') +#define ACS_LTEE ACS_PICK('t', '+') +#define ACS_BTEE ACS_PICK('v', '+') +#define ACS_TTEE ACS_PICK('w', '+') +#define ACS_HLINE ACS_PICK('q', '-') +#define ACS_VLINE ACS_PICK('x', '|') +#define ACS_PLUS ACS_PICK('n', '+') + +/* VT100-compatible symbols -- other */ + +#define ACS_S1 ACS_PICK('o', '-') +#define ACS_S9 ACS_PICK('s', '_') +#define ACS_DIAMOND ACS_PICK('`', '+') +#define ACS_CKBOARD ACS_PICK('a', ':') +#define ACS_DEGREE ACS_PICK('f', '\'') +#define ACS_PLMINUS ACS_PICK('g', '#') +#define ACS_BULLET ACS_PICK('~', 'o') + +/* Teletype 5410v1 symbols -- these are defined in SysV curses, but + are not well-supported by most terminals. Stick to VT100 characters + for optimum portability. */ + +#define ACS_LARROW ACS_PICK(',', '<') +#define ACS_RARROW ACS_PICK('+', '>') +#define ACS_DARROW ACS_PICK('.', 'v') +#define ACS_UARROW ACS_PICK('-', '^') +#define ACS_BOARD ACS_PICK('h', '#') +#define ACS_LANTERN ACS_PICK('i', '*') +#define ACS_BLOCK ACS_PICK('0', '#') + +/* That goes double for these -- undocumented SysV symbols. Don't use + them. */ + +#define ACS_S3 ACS_PICK('p', '-') +#define ACS_S7 ACS_PICK('r', '-') +#define ACS_LEQUAL ACS_PICK('y', '<') +#define ACS_GEQUAL ACS_PICK('z', '>') +#define ACS_PI ACS_PICK('{', 'n') +#define ACS_NEQUAL ACS_PICK('|', '+') +#define ACS_STERLING ACS_PICK('}', 'L') + +/* Box char aliases */ + +#define ACS_BSSB ACS_ULCORNER +#define ACS_SSBB ACS_LLCORNER +#define ACS_BBSS ACS_URCORNER +#define ACS_SBBS ACS_LRCORNER +#define ACS_SBSS ACS_RTEE +#define ACS_SSSB ACS_LTEE +#define ACS_SSBS ACS_BTEE +#define ACS_BSSS ACS_TTEE +#define ACS_BSBS ACS_HLINE +#define ACS_SBSB ACS_VLINE +#define ACS_SSSS ACS_PLUS + +/* cchar_t aliases */ + +#ifdef PDC_WIDE +# define WACS_ULCORNER (&(acs_map['l'])) +# define WACS_LLCORNER (&(acs_map['m'])) +# define WACS_URCORNER (&(acs_map['k'])) +# define WACS_LRCORNER (&(acs_map['j'])) +# define WACS_RTEE (&(acs_map['u'])) +# define WACS_LTEE (&(acs_map['t'])) +# define WACS_BTEE (&(acs_map['v'])) +# define WACS_TTEE (&(acs_map['w'])) +# define WACS_HLINE (&(acs_map['q'])) +# define WACS_VLINE (&(acs_map['x'])) +# define WACS_PLUS (&(acs_map['n'])) + +# define WACS_S1 (&(acs_map['o'])) +# define WACS_S9 (&(acs_map['s'])) +# define WACS_DIAMOND (&(acs_map['`'])) +# define WACS_CKBOARD (&(acs_map['a'])) +# define WACS_DEGREE (&(acs_map['f'])) +# define WACS_PLMINUS (&(acs_map['g'])) +# define WACS_BULLET (&(acs_map['~'])) + +# define WACS_LARROW (&(acs_map[','])) +# define WACS_RARROW (&(acs_map['+'])) +# define WACS_DARROW (&(acs_map['.'])) +# define WACS_UARROW (&(acs_map['-'])) +# define WACS_BOARD (&(acs_map['h'])) +# define WACS_LANTERN (&(acs_map['i'])) +# define WACS_BLOCK (&(acs_map['0'])) + +# define WACS_S3 (&(acs_map['p'])) +# define WACS_S7 (&(acs_map['r'])) +# define WACS_LEQUAL (&(acs_map['y'])) +# define WACS_GEQUAL (&(acs_map['z'])) +# define WACS_PI (&(acs_map['{'])) +# define WACS_NEQUAL (&(acs_map['|'])) +# define WACS_STERLING (&(acs_map['}'])) + +# define WACS_BSSB WACS_ULCORNER +# define WACS_SSBB WACS_LLCORNER +# define WACS_BBSS WACS_URCORNER +# define WACS_SBBS WACS_LRCORNER +# define WACS_SBSS WACS_RTEE +# define WACS_SSSB WACS_LTEE +# define WACS_SSBS WACS_BTEE +# define WACS_BSSS WACS_TTEE +# define WACS_BSBS WACS_HLINE +# define WACS_SBSB WACS_VLINE +# define WACS_SSSS WACS_PLUS +#endif + +/*** Color macros ***/ + +#define COLOR_BLACK 0 + +#ifdef PDC_RGB /* RGB */ +# define COLOR_RED 1 +# define COLOR_GREEN 2 +# define COLOR_BLUE 4 +#else /* BGR */ +# define COLOR_BLUE 1 +# define COLOR_GREEN 2 +# define COLOR_RED 4 +#endif + +#define COLOR_CYAN (COLOR_BLUE | COLOR_GREEN) +#define COLOR_MAGENTA (COLOR_RED | COLOR_BLUE) +#define COLOR_YELLOW (COLOR_RED | COLOR_GREEN) + +#define COLOR_WHITE 7 + +/*---------------------------------------------------------------------- + * + * Function and Keypad Key Definitions. + * Many are just for compatibility. + * + */ + +#define KEY_CODE_YES 0x100 /* If get_wch() gives a key code */ + +#define KEY_BREAK 0x101 /* Not on PC KBD */ +#define KEY_DOWN 0x102 /* Down arrow key */ +#define KEY_UP 0x103 /* Up arrow key */ +#define KEY_LEFT 0x104 /* Left arrow key */ +#define KEY_RIGHT 0x105 /* Right arrow key */ +#define KEY_HOME 0x106 /* home key */ +#define KEY_BACKSPACE 0x107 /* not on pc */ +#define KEY_F0 0x108 /* function keys; 64 reserved */ + +#define KEY_DL 0x148 /* delete line */ +#define KEY_IL 0x149 /* insert line */ +#define KEY_DC 0x14a /* delete character */ +#define KEY_IC 0x14b /* insert char or enter ins mode */ +#define KEY_EIC 0x14c /* exit insert char mode */ +#define KEY_CLEAR 0x14d /* clear screen */ +#define KEY_EOS 0x14e /* clear to end of screen */ +#define KEY_EOL 0x14f /* clear to end of line */ +#define KEY_SF 0x150 /* scroll 1 line forward */ +#define KEY_SR 0x151 /* scroll 1 line back (reverse) */ +#define KEY_NPAGE 0x152 /* next page */ +#define KEY_PPAGE 0x153 /* previous page */ +#define KEY_STAB 0x154 /* set tab */ +#define KEY_CTAB 0x155 /* clear tab */ +#define KEY_CATAB 0x156 /* clear all tabs */ +#define KEY_ENTER 0x157 /* enter or send (unreliable) */ +#define KEY_SRESET 0x158 /* soft/reset (partial/unreliable) */ +#define KEY_RESET 0x159 /* reset/hard reset (unreliable) */ +#define KEY_PRINT 0x15a /* print/copy */ +#define KEY_LL 0x15b /* home down/bottom (lower left) */ +#define KEY_ABORT 0x15c /* abort/terminate key (any) */ +#define KEY_SHELP 0x15d /* short help */ +#define KEY_LHELP 0x15e /* long help */ +#define KEY_BTAB 0x15f /* Back tab key */ +#define KEY_BEG 0x160 /* beg(inning) key */ +#define KEY_CANCEL 0x161 /* cancel key */ +#define KEY_CLOSE 0x162 /* close key */ +#define KEY_COMMAND 0x163 /* cmd (command) key */ +#define KEY_COPY 0x164 /* copy key */ +#define KEY_CREATE 0x165 /* create key */ +#define KEY_END 0x166 /* end key */ +#define KEY_EXIT 0x167 /* exit key */ +#define KEY_FIND 0x168 /* find key */ +#define KEY_HELP 0x169 /* help key */ +#define KEY_MARK 0x16a /* mark key */ +#define KEY_MESSAGE 0x16b /* message key */ +#define KEY_MOVE 0x16c /* move key */ +#define KEY_NEXT 0x16d /* next object key */ +#define KEY_OPEN 0x16e /* open key */ +#define KEY_OPTIONS 0x16f /* options key */ +#define KEY_PREVIOUS 0x170 /* previous object key */ +#define KEY_REDO 0x171 /* redo key */ +#define KEY_REFERENCE 0x172 /* ref(erence) key */ +#define KEY_REFRESH 0x173 /* refresh key */ +#define KEY_REPLACE 0x174 /* replace key */ +#define KEY_RESTART 0x175 /* restart key */ +#define KEY_RESUME 0x176 /* resume key */ +#define KEY_SAVE 0x177 /* save key */ +#define KEY_SBEG 0x178 /* shifted beginning key */ +#define KEY_SCANCEL 0x179 /* shifted cancel key */ +#define KEY_SCOMMAND 0x17a /* shifted command key */ +#define KEY_SCOPY 0x17b /* shifted copy key */ +#define KEY_SCREATE 0x17c /* shifted create key */ +#define KEY_SDC 0x17d /* shifted delete char key */ +#define KEY_SDL 0x17e /* shifted delete line key */ +#define KEY_SELECT 0x17f /* select key */ +#define KEY_SEND 0x180 /* shifted end key */ +#define KEY_SEOL 0x181 /* shifted clear line key */ +#define KEY_SEXIT 0x182 /* shifted exit key */ +#define KEY_SFIND 0x183 /* shifted find key */ +#define KEY_SHOME 0x184 /* shifted home key */ +#define KEY_SIC 0x185 /* shifted input key */ + +#define KEY_SLEFT 0x187 /* shifted left arrow key */ +#define KEY_SMESSAGE 0x188 /* shifted message key */ +#define KEY_SMOVE 0x189 /* shifted move key */ +#define KEY_SNEXT 0x18a /* shifted next key */ +#define KEY_SOPTIONS 0x18b /* shifted options key */ +#define KEY_SPREVIOUS 0x18c /* shifted prev key */ +#define KEY_SPRINT 0x18d /* shifted print key */ +#define KEY_SREDO 0x18e /* shifted redo key */ +#define KEY_SREPLACE 0x18f /* shifted replace key */ +#define KEY_SRIGHT 0x190 /* shifted right arrow */ +#define KEY_SRSUME 0x191 /* shifted resume key */ +#define KEY_SSAVE 0x192 /* shifted save key */ +#define KEY_SSUSPEND 0x193 /* shifted suspend key */ +#define KEY_SUNDO 0x194 /* shifted undo key */ +#define KEY_SUSPEND 0x195 /* suspend key */ +#define KEY_UNDO 0x196 /* undo key */ + +/* PDCurses-specific key definitions -- PC only */ + +#define ALT_0 0x197 +#define ALT_1 0x198 +#define ALT_2 0x199 +#define ALT_3 0x19a +#define ALT_4 0x19b +#define ALT_5 0x19c +#define ALT_6 0x19d +#define ALT_7 0x19e +#define ALT_8 0x19f +#define ALT_9 0x1a0 +#define ALT_A 0x1a1 +#define ALT_B 0x1a2 +#define ALT_C 0x1a3 +#define ALT_D 0x1a4 +#define ALT_E 0x1a5 +#define ALT_F 0x1a6 +#define ALT_G 0x1a7 +#define ALT_H 0x1a8 +#define ALT_I 0x1a9 +#define ALT_J 0x1aa +#define ALT_K 0x1ab +#define ALT_L 0x1ac +#define ALT_M 0x1ad +#define ALT_N 0x1ae +#define ALT_O 0x1af +#define ALT_P 0x1b0 +#define ALT_Q 0x1b1 +#define ALT_R 0x1b2 +#define ALT_S 0x1b3 +#define ALT_T 0x1b4 +#define ALT_U 0x1b5 +#define ALT_V 0x1b6 +#define ALT_W 0x1b7 +#define ALT_X 0x1b8 +#define ALT_Y 0x1b9 +#define ALT_Z 0x1ba + +#define CTL_LEFT 0x1bb /* Control-Left-Arrow */ +#define CTL_RIGHT 0x1bc +#define CTL_PGUP 0x1bd +#define CTL_PGDN 0x1be +#define CTL_HOME 0x1bf +#define CTL_END 0x1c0 + +#define KEY_A1 0x1c1 /* upper left on Virtual keypad */ +#define KEY_A2 0x1c2 /* upper middle on Virt. keypad */ +#define KEY_A3 0x1c3 /* upper right on Vir. keypad */ +#define KEY_B1 0x1c4 /* middle left on Virt. keypad */ +#define KEY_B2 0x1c5 /* center on Virt. keypad */ +#define KEY_B3 0x1c6 /* middle right on Vir. keypad */ +#define KEY_C1 0x1c7 /* lower left on Virt. keypad */ +#define KEY_C2 0x1c8 /* lower middle on Virt. keypad */ +#define KEY_C3 0x1c9 /* lower right on Vir. keypad */ + +#define PADSLASH 0x1ca /* slash on keypad */ +#define PADENTER 0x1cb /* enter on keypad */ +#define CTL_PADENTER 0x1cc /* ctl-enter on keypad */ +#define ALT_PADENTER 0x1cd /* alt-enter on keypad */ +#define PADSTOP 0x1ce /* stop on keypad */ +#define PADSTAR 0x1cf /* star on keypad */ +#define PADMINUS 0x1d0 /* minus on keypad */ +#define PADPLUS 0x1d1 /* plus on keypad */ +#define CTL_PADSTOP 0x1d2 /* ctl-stop on keypad */ +#define CTL_PADCENTER 0x1d3 /* ctl-enter on keypad */ +#define CTL_PADPLUS 0x1d4 /* ctl-plus on keypad */ +#define CTL_PADMINUS 0x1d5 /* ctl-minus on keypad */ +#define CTL_PADSLASH 0x1d6 /* ctl-slash on keypad */ +#define CTL_PADSTAR 0x1d7 /* ctl-star on keypad */ +#define ALT_PADPLUS 0x1d8 /* alt-plus on keypad */ +#define ALT_PADMINUS 0x1d9 /* alt-minus on keypad */ +#define ALT_PADSLASH 0x1da /* alt-slash on keypad */ +#define ALT_PADSTAR 0x1db /* alt-star on keypad */ +#define ALT_PADSTOP 0x1dc /* alt-stop on keypad */ +#define CTL_INS 0x1dd /* ctl-insert */ +#define ALT_DEL 0x1de /* alt-delete */ +#define ALT_INS 0x1df /* alt-insert */ +#define CTL_UP 0x1e0 /* ctl-up arrow */ +#define CTL_DOWN 0x1e1 /* ctl-down arrow */ +#define CTL_TAB 0x1e2 /* ctl-tab */ +#define ALT_TAB 0x1e3 +#define ALT_MINUS 0x1e4 +#define ALT_EQUAL 0x1e5 +#define ALT_HOME 0x1e6 +#define ALT_PGUP 0x1e7 +#define ALT_PGDN 0x1e8 +#define ALT_END 0x1e9 +#define ALT_UP 0x1ea /* alt-up arrow */ +#define ALT_DOWN 0x1eb /* alt-down arrow */ +#define ALT_RIGHT 0x1ec /* alt-right arrow */ +#define ALT_LEFT 0x1ed /* alt-left arrow */ +#define ALT_ENTER 0x1ee /* alt-enter */ +#define ALT_ESC 0x1ef /* alt-escape */ +#define ALT_BQUOTE 0x1f0 /* alt-back quote */ +#define ALT_LBRACKET 0x1f1 /* alt-left bracket */ +#define ALT_RBRACKET 0x1f2 /* alt-right bracket */ +#define ALT_SEMICOLON 0x1f3 /* alt-semi-colon */ +#define ALT_FQUOTE 0x1f4 /* alt-forward quote */ +#define ALT_COMMA 0x1f5 /* alt-comma */ +#define ALT_STOP 0x1f6 /* alt-stop */ +#define ALT_FSLASH 0x1f7 /* alt-forward slash */ +#define ALT_BKSP 0x1f8 /* alt-backspace */ +#define CTL_BKSP 0x1f9 /* ctl-backspace */ +#define PAD0 0x1fa /* keypad 0 */ + +#define CTL_PAD0 0x1fb /* ctl-keypad 0 */ +#define CTL_PAD1 0x1fc +#define CTL_PAD2 0x1fd +#define CTL_PAD3 0x1fe +#define CTL_PAD4 0x1ff +#define CTL_PAD5 0x200 +#define CTL_PAD6 0x201 +#define CTL_PAD7 0x202 +#define CTL_PAD8 0x203 +#define CTL_PAD9 0x204 + +#define ALT_PAD0 0x205 /* alt-keypad 0 */ +#define ALT_PAD1 0x206 +#define ALT_PAD2 0x207 +#define ALT_PAD3 0x208 +#define ALT_PAD4 0x209 +#define ALT_PAD5 0x20a +#define ALT_PAD6 0x20b +#define ALT_PAD7 0x20c +#define ALT_PAD8 0x20d +#define ALT_PAD9 0x20e + +#define CTL_DEL 0x20f /* clt-delete */ +#define ALT_BSLASH 0x210 /* alt-back slash */ +#define CTL_ENTER 0x211 /* ctl-enter */ + +#define SHF_PADENTER 0x212 /* shift-enter on keypad */ +#define SHF_PADSLASH 0x213 /* shift-slash on keypad */ +#define SHF_PADSTAR 0x214 /* shift-star on keypad */ +#define SHF_PADPLUS 0x215 /* shift-plus on keypad */ +#define SHF_PADMINUS 0x216 /* shift-minus on keypad */ +#define SHF_UP 0x217 /* shift-up on keypad */ +#define SHF_DOWN 0x218 /* shift-down on keypad */ +#define SHF_IC 0x219 /* shift-insert on keypad */ +#define SHF_DC 0x21a /* shift-delete on keypad */ + +#define KEY_MOUSE 0x21b /* "mouse" key */ +#define KEY_SHIFT_L 0x21c /* Left-shift */ +#define KEY_SHIFT_R 0x21d /* Right-shift */ +#define KEY_CONTROL_L 0x21e /* Left-control */ +#define KEY_CONTROL_R 0x21f /* Right-control */ +#define KEY_ALT_L 0x220 /* Left-alt */ +#define KEY_ALT_R 0x221 /* Right-alt */ +#define KEY_RESIZE 0x222 /* Window resize */ +#define KEY_SUP 0x223 /* Shifted up arrow */ +#define KEY_SDOWN 0x224 /* Shifted down arrow */ + +#define KEY_MIN KEY_BREAK /* Minimum curses key value */ +#define KEY_MAX KEY_SDOWN /* Maximum curses key */ + +#define KEY_F(n) (KEY_F0 + (n)) + +/*---------------------------------------------------------------------- + * + * PDCurses Function Declarations + * + */ + +/* Standard */ + +int addch(const chtype); +int addchnstr(const chtype *, int); +int addchstr(const chtype *); +int addnstr(const char *, int); +int addstr(const char *); +int attroff(chtype); +int attron(chtype); +int attrset(chtype); +int attr_get(attr_t *, short *, void *); +int attr_off(attr_t, void *); +int attr_on(attr_t, void *); +int attr_set(attr_t, short, void *); +int baudrate(void); +int beep(void); +int bkgd(chtype); +void bkgdset(chtype); +int border(chtype, chtype, chtype, chtype, chtype, chtype, chtype, chtype); +int box(WINDOW *, chtype, chtype); +bool can_change_color(void); +int cbreak(void); +int chgat(int, attr_t, short, const void *); +int clearok(WINDOW *, bool); +int clear(void); +int clrtobot(void); +int clrtoeol(void); +int color_content(short, short *, short *, short *); +int color_set(short, void *); +int copywin(const WINDOW *, WINDOW *, int, int, int, int, int, int, int); +int curs_set(int); +int def_prog_mode(void); +int def_shell_mode(void); +int delay_output(int); +int delch(void); +int deleteln(void); +void delscreen(SCREEN *); +int delwin(WINDOW *); +WINDOW *derwin(WINDOW *, int, int, int, int); +int doupdate(void); +WINDOW *dupwin(WINDOW *); +int echochar(const chtype); +int echo(void); +int endwin(void); +char erasechar(void); +int erase(void); +void filter(void); +int flash(void); +int flushinp(void); +chtype getbkgd(WINDOW *); +int getnstr(char *, int); +int getstr(char *); +WINDOW *getwin(FILE *); +int halfdelay(int); +bool has_colors(void); +bool has_ic(void); +bool has_il(void); +int hline(chtype, int); +void idcok(WINDOW *, bool); +int idlok(WINDOW *, bool); +void immedok(WINDOW *, bool); +int inchnstr(chtype *, int); +int inchstr(chtype *); +chtype inch(void); +int init_color(short, short, short, short); +int init_pair(short, short, short); +WINDOW *initscr(void); +int innstr(char *, int); +int insch(chtype); +int insdelln(int); +int insertln(void); +int insnstr(const char *, int); +int insstr(const char *); +int instr(char *); +int intrflush(WINDOW *, bool); +bool isendwin(void); +bool is_linetouched(WINDOW *, int); +bool is_wintouched(WINDOW *); +char *keyname(int); +int keypad(WINDOW *, bool); +char killchar(void); +int leaveok(WINDOW *, bool); +char *longname(void); +int meta(WINDOW *, bool); +int move(int, int); +int mvaddch(int, int, const chtype); +int mvaddchnstr(int, int, const chtype *, int); +int mvaddchstr(int, int, const chtype *); +int mvaddnstr(int, int, const char *, int); +int mvaddstr(int, int, const char *); +int mvchgat(int, int, int, attr_t, short, const void *); +int mvcur(int, int, int, int); +int mvdelch(int, int); +int mvderwin(WINDOW *, int, int); +int mvgetch(int, int); +int mvgetnstr(int, int, char *, int); +int mvgetstr(int, int, char *); +int mvhline(int, int, chtype, int); +chtype mvinch(int, int); +int mvinchnstr(int, int, chtype *, int); +int mvinchstr(int, int, chtype *); +int mvinnstr(int, int, char *, int); +int mvinsch(int, int, chtype); +int mvinsnstr(int, int, const char *, int); +int mvinsstr(int, int, const char *); +int mvinstr(int, int, char *); +int mvprintw(int, int, const char *, ...); +int mvscanw(int, int, const char *, ...); +int mvvline(int, int, chtype, int); +int mvwaddchnstr(WINDOW *, int, int, const chtype *, int); +int mvwaddchstr(WINDOW *, int, int, const chtype *); +int mvwaddch(WINDOW *, int, int, const chtype); +int mvwaddnstr(WINDOW *, int, int, const char *, int); +int mvwaddstr(WINDOW *, int, int, const char *); +int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *); +int mvwdelch(WINDOW *, int, int); +int mvwgetch(WINDOW *, int, int); +int mvwgetnstr(WINDOW *, int, int, char *, int); +int mvwgetstr(WINDOW *, int, int, char *); +int mvwhline(WINDOW *, int, int, chtype, int); +int mvwinchnstr(WINDOW *, int, int, chtype *, int); +int mvwinchstr(WINDOW *, int, int, chtype *); +chtype mvwinch(WINDOW *, int, int); +int mvwinnstr(WINDOW *, int, int, char *, int); +int mvwinsch(WINDOW *, int, int, chtype); +int mvwinsnstr(WINDOW *, int, int, const char *, int); +int mvwinsstr(WINDOW *, int, int, const char *); +int mvwinstr(WINDOW *, int, int, char *); +int mvwin(WINDOW *, int, int); +int mvwprintw(WINDOW *, int, int, const char *, ...); +int mvwscanw(WINDOW *, int, int, const char *, ...); +int mvwvline(WINDOW *, int, int, chtype, int); +int napms(int); +WINDOW *newpad(int, int); +SCREEN *newterm(const char *, FILE *, FILE *); +WINDOW *newwin(int, int, int, int); +int nl(void); +int nocbreak(void); +int nodelay(WINDOW *, bool); +int noecho(void); +int nonl(void); +void noqiflush(void); +int noraw(void); +int notimeout(WINDOW *, bool); +int overlay(const WINDOW *, WINDOW *); +int overwrite(const WINDOW *, WINDOW *); +int pair_content(short, short *, short *); +int pechochar(WINDOW *, chtype); +int pnoutrefresh(WINDOW *, int, int, int, int, int, int); +int prefresh(WINDOW *, int, int, int, int, int, int); +int printw(const char *, ...); +int putwin(WINDOW *, FILE *); +void qiflush(void); +int raw(void); +int redrawwin(WINDOW *); +int refresh(void); +int reset_prog_mode(void); +int reset_shell_mode(void); +int resetty(void); +int ripoffline(int, int (*)(WINDOW *, int)); +int savetty(void); +int scanw(const char *, ...); +int scr_dump(const char *); +int scr_init(const char *); +int scr_restore(const char *); +int scr_set(const char *); +int scrl(int); +int scroll(WINDOW *); +int scrollok(WINDOW *, bool); +SCREEN *set_term(SCREEN *); +int setscrreg(int, int); +int slk_attroff(const chtype); +int slk_attr_off(const attr_t, void *); +int slk_attron(const chtype); +int slk_attr_on(const attr_t, void *); +int slk_attrset(const chtype); +int slk_attr_set(const attr_t, short, void *); +int slk_clear(void); +int slk_color(short); +int slk_init(int); +char *slk_label(int); +int slk_noutrefresh(void); +int slk_refresh(void); +int slk_restore(void); +int slk_set(int, const char *, int); +int slk_touch(void); +int standend(void); +int standout(void); +int start_color(void); +WINDOW *subpad(WINDOW *, int, int, int, int); +WINDOW *subwin(WINDOW *, int, int, int, int); +int syncok(WINDOW *, bool); +chtype termattrs(void); +attr_t term_attrs(void); +char *termname(void); +void timeout(int); +int touchline(WINDOW *, int, int); +int touchwin(WINDOW *); +int typeahead(int); +int untouchwin(WINDOW *); +void use_env(bool); +int vidattr(chtype); +int vid_attr(attr_t, short, void *); +int vidputs(chtype, int (*)(int)); +int vid_puts(attr_t, short, void *, int (*)(int)); +int vline(chtype, int); +int vw_printw(WINDOW *, const char *, va_list); +int vwprintw(WINDOW *, const char *, va_list); +int vw_scanw(WINDOW *, const char *, va_list); +int vwscanw(WINDOW *, const char *, va_list); +int waddchnstr(WINDOW *, const chtype *, int); +int waddchstr(WINDOW *, const chtype *); +int waddch(WINDOW *, const chtype); +int waddnstr(WINDOW *, const char *, int); +int waddstr(WINDOW *, const char *); +int wattroff(WINDOW *, chtype); +int wattron(WINDOW *, chtype); +int wattrset(WINDOW *, chtype); +int wattr_get(WINDOW *, attr_t *, short *, void *); +int wattr_off(WINDOW *, attr_t, void *); +int wattr_on(WINDOW *, attr_t, void *); +int wattr_set(WINDOW *, attr_t, short, void *); +void wbkgdset(WINDOW *, chtype); +int wbkgd(WINDOW *, chtype); +int wborder(WINDOW *, chtype, chtype, chtype, chtype, + chtype, chtype, chtype, chtype); +int wchgat(WINDOW *, int, attr_t, short, const void *); +int wclear(WINDOW *); +int wclrtobot(WINDOW *); +int wclrtoeol(WINDOW *); +int wcolor_set(WINDOW *, short, void *); +void wcursyncup(WINDOW *); +int wdelch(WINDOW *); +int wdeleteln(WINDOW *); +int wechochar(WINDOW *, const chtype); +int werase(WINDOW *); +int wgetch(WINDOW *); +int wgetnstr(WINDOW *, char *, int); +int wgetstr(WINDOW *, char *); +int whline(WINDOW *, chtype, int); +int winchnstr(WINDOW *, chtype *, int); +int winchstr(WINDOW *, chtype *); +chtype winch(WINDOW *); +int winnstr(WINDOW *, char *, int); +int winsch(WINDOW *, chtype); +int winsdelln(WINDOW *, int); +int winsertln(WINDOW *); +int winsnstr(WINDOW *, const char *, int); +int winsstr(WINDOW *, const char *); +int winstr(WINDOW *, char *); +int wmove(WINDOW *, int, int); +int wnoutrefresh(WINDOW *); +int wprintw(WINDOW *, const char *, ...); +int wredrawln(WINDOW *, int, int); +int wrefresh(WINDOW *); +int wscanw(WINDOW *, const char *, ...); +int wscrl(WINDOW *, int); +int wsetscrreg(WINDOW *, int, int); +int wstandend(WINDOW *); +int wstandout(WINDOW *); +void wsyncdown(WINDOW *); +void wsyncup(WINDOW *); +void wtimeout(WINDOW *, int); +int wtouchln(WINDOW *, int, int, int); +int wvline(WINDOW *, chtype, int); + +/* Wide-character functions */ + +#ifdef PDC_WIDE +int addnwstr(const wchar_t *, int); +int addwstr(const wchar_t *); +int add_wch(const cchar_t *); +int add_wchnstr(const cchar_t *, int); +int add_wchstr(const cchar_t *); +int border_set(const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *); +int box_set(WINDOW *, const cchar_t *, const cchar_t *); +int echo_wchar(const cchar_t *); +int erasewchar(wchar_t *); +int getbkgrnd(cchar_t *); +int getcchar(const cchar_t *, wchar_t *, attr_t *, short *, void *); +int getn_wstr(wint_t *, int); +int get_wch(wint_t *); +int get_wstr(wint_t *); +int hline_set(const cchar_t *, int); +int innwstr(wchar_t *, int); +int ins_nwstr(const wchar_t *, int); +int ins_wch(const cchar_t *); +int ins_wstr(const wchar_t *); +int inwstr(wchar_t *); +int in_wch(cchar_t *); +int in_wchnstr(cchar_t *, int); +int in_wchstr(cchar_t *); +char *key_name(wchar_t); +int killwchar(wchar_t *); +int mvaddnwstr(int, int, const wchar_t *, int); +int mvaddwstr(int, int, const wchar_t *); +int mvadd_wch(int, int, const cchar_t *); +int mvadd_wchnstr(int, int, const cchar_t *, int); +int mvadd_wchstr(int, int, const cchar_t *); +int mvgetn_wstr(int, int, wint_t *, int); +int mvget_wch(int, int, wint_t *); +int mvget_wstr(int, int, wint_t *); +int mvhline_set(int, int, const cchar_t *, int); +int mvinnwstr(int, int, wchar_t *, int); +int mvins_nwstr(int, int, const wchar_t *, int); +int mvins_wch(int, int, const cchar_t *); +int mvins_wstr(int, int, const wchar_t *); +int mvinwstr(int, int, wchar_t *); +int mvin_wch(int, int, cchar_t *); +int mvin_wchnstr(int, int, cchar_t *, int); +int mvin_wchstr(int, int, cchar_t *); +int mvvline_set(int, int, const cchar_t *, int); +int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int); +int mvwaddwstr(WINDOW *, int, int, const wchar_t *); +int mvwadd_wch(WINDOW *, int, int, const cchar_t *); +int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int); +int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *); +int mvwgetn_wstr(WINDOW *, int, int, wint_t *, int); +int mvwget_wch(WINDOW *, int, int, wint_t *); +int mvwget_wstr(WINDOW *, int, int, wint_t *); +int mvwhline_set(WINDOW *, int, int, const cchar_t *, int); +int mvwinnwstr(WINDOW *, int, int, wchar_t *, int); +int mvwins_nwstr(WINDOW *, int, int, const wchar_t *, int); +int mvwins_wch(WINDOW *, int, int, const cchar_t *); +int mvwins_wstr(WINDOW *, int, int, const wchar_t *); +int mvwin_wch(WINDOW *, int, int, cchar_t *); +int mvwin_wchnstr(WINDOW *, int, int, cchar_t *, int); +int mvwin_wchstr(WINDOW *, int, int, cchar_t *); +int mvwinwstr(WINDOW *, int, int, wchar_t *); +int mvwvline_set(WINDOW *, int, int, const cchar_t *, int); +int pecho_wchar(WINDOW *, const cchar_t*); +int setcchar(cchar_t*, const wchar_t*, const attr_t, short, const void*); +int slk_wset(int, const wchar_t *, int); +int unget_wch(const wchar_t); +int vline_set(const cchar_t *, int); +int waddnwstr(WINDOW *, const wchar_t *, int); +int waddwstr(WINDOW *, const wchar_t *); +int wadd_wch(WINDOW *, const cchar_t *); +int wadd_wchnstr(WINDOW *, const cchar_t *, int); +int wadd_wchstr(WINDOW *, const cchar_t *); +int wbkgrnd(WINDOW *, const cchar_t *); +void wbkgrndset(WINDOW *, const cchar_t *); +int wborder_set(WINDOW *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *); +int wecho_wchar(WINDOW *, const cchar_t *); +int wgetbkgrnd(WINDOW *, cchar_t *); +int wgetn_wstr(WINDOW *, wint_t *, int); +int wget_wch(WINDOW *, wint_t *); +int wget_wstr(WINDOW *, wint_t *); +int whline_set(WINDOW *, const cchar_t *, int); +int winnwstr(WINDOW *, wchar_t *, int); +int wins_nwstr(WINDOW *, const wchar_t *, int); +int wins_wch(WINDOW *, const cchar_t *); +int wins_wstr(WINDOW *, const wchar_t *); +int winwstr(WINDOW *, wchar_t *); +int win_wch(WINDOW *, cchar_t *); +int win_wchnstr(WINDOW *, cchar_t *, int); +int win_wchstr(WINDOW *, cchar_t *); +wchar_t *wunctrl(cchar_t *); +int wvline_set(WINDOW *, const cchar_t *, int); +#endif + +/* Quasi-standard */ + +chtype getattrs(WINDOW *); +int getbegx(WINDOW *); +int getbegy(WINDOW *); +int getmaxx(WINDOW *); +int getmaxy(WINDOW *); +int getparx(WINDOW *); +int getpary(WINDOW *); +int getcurx(WINDOW *); +int getcury(WINDOW *); +void traceoff(void); +void traceon(void); +char *unctrl(chtype); + +int crmode(void); +int nocrmode(void); +int draino(int); +int resetterm(void); +int fixterm(void); +int saveterm(void); +int setsyx(int, int); + +int mouse_set(unsigned long); +int mouse_on(unsigned long); +int mouse_off(unsigned long); +int request_mouse_pos(void); +int map_button(unsigned long); +void wmouse_position(WINDOW *, int *, int *); +unsigned long getmouse(void); +unsigned long getbmap(void); + +/* ncurses */ + +int assume_default_colors(int, int); +const char *curses_version(void); +bool has_key(int); +int use_default_colors(void); +int wresize(WINDOW *, int, int); + +int mouseinterval(int); +mmask_t mousemask(mmask_t, mmask_t *); +bool mouse_trafo(int *, int *, bool); +int nc_getmouse(MEVENT *); +int ungetmouse(MEVENT *); +bool wenclose(const WINDOW *, int, int); +bool wmouse_trafo(const WINDOW *, int *, int *, bool); + +/* PDCurses */ + +int addrawch(chtype); +int insrawch(chtype); +bool is_termresized(void); +int mvaddrawch(int, int, chtype); +int mvdeleteln(int, int); +int mvinsertln(int, int); +int mvinsrawch(int, int, chtype); +int mvwaddrawch(WINDOW *, int, int, chtype); +int mvwdeleteln(WINDOW *, int, int); +int mvwinsertln(WINDOW *, int, int); +int mvwinsrawch(WINDOW *, int, int, chtype); +int raw_output(bool); +int resize_term(int, int); +WINDOW *resize_window(WINDOW *, int, int); +int waddrawch(WINDOW *, chtype); +int winsrawch(WINDOW *, chtype); +char wordchar(void); + +#ifdef PDC_WIDE +wchar_t *slk_wlabel(int); +#endif + +void PDC_debug(const char *, ...); +int PDC_ungetch(int); +int PDC_set_blink(bool); +int PDC_set_line_color(short); +void PDC_set_title(const char *); + +int PDC_clearclipboard(void); +int PDC_freeclipboard(char *); +int PDC_getclipboard(char **, long *); +int PDC_setclipboard(const char *, long); + +unsigned long PDC_get_input_fd(void); +unsigned long PDC_get_key_modifiers(void); +int PDC_return_key_modifiers(bool); +int PDC_save_key_modifiers(bool); + +#ifdef XCURSES +WINDOW *Xinitscr(int, char **); +void XCursesExit(void); +int sb_init(void); +int sb_set_horz(int, int, int); +int sb_set_vert(int, int, int); +int sb_get_horz(int *, int *, int *); +int sb_get_vert(int *, int *, int *); +int sb_refresh(void); +#endif + +/*** Functions defined as macros ***/ + +/* getch() and ungetch() conflict with some DOS libraries */ + +#define getch() wgetch(stdscr) +#define ungetch(ch) PDC_ungetch(ch) + +#define COLOR_PAIR(n) (((chtype)(n) << PDC_COLOR_SHIFT) & A_COLOR) +#define PAIR_NUMBER(n) (((n) & A_COLOR) >> PDC_COLOR_SHIFT) + +/* These will _only_ work as macros */ + +#define getbegyx(w, y, x) (y = getbegy(w), x = getbegx(w)) +#define getmaxyx(w, y, x) (y = getmaxy(w), x = getmaxx(w)) +#define getparyx(w, y, x) (y = getpary(w), x = getparx(w)) +#define getyx(w, y, x) (y = getcury(w), x = getcurx(w)) + +#define getsyx(y, x) { if (curscr->_leaveit) (y)=(x)=-1; \ + else getyx(curscr,(y),(x)); } + +#ifdef NCURSES_MOUSE_VERSION +# define getmouse(x) nc_getmouse(x) +#endif + +/* return codes from PDC_getclipboard() and PDC_setclipboard() calls */ + +#define PDC_CLIP_SUCCESS 0 +#define PDC_CLIP_ACCESS_ERROR 1 +#define PDC_CLIP_EMPTY 2 +#define PDC_CLIP_MEMORY_ERROR 3 + +/* PDCurses key modifier masks */ + +#define PDC_KEY_MODIFIER_SHIFT 1 +#define PDC_KEY_MODIFIER_CONTROL 2 +#define PDC_KEY_MODIFIER_ALT 4 +#define PDC_KEY_MODIFIER_NUMLOCK 8 + +#if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) +# undef bool +} +#endif + +#endif /* __PDCURSES__ */ diff --git a/pdcurses/panel.h b/pdcurses/panel.h new file mode 100644 index 000000000..1d7cacef9 --- /dev/null +++ b/pdcurses/panel.h @@ -0,0 +1,58 @@ +/* Public Domain Curses */ + +/* $Id: panel.h,v 1.19 2008/07/13 16:08:16 wmcbrine Exp $ */ + +/*----------------------------------------------------------------------* + * Panels for PDCurses * + *----------------------------------------------------------------------*/ + +#ifndef __PDCURSES_PANEL_H__ +#define __PDCURSES_PANEL_H__ 1 + +#include + +#if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) +extern "C" +{ +#endif + +typedef struct panelobs +{ + struct panelobs *above; + struct panel *pan; +} PANELOBS; + +typedef struct panel +{ + WINDOW *win; + int wstarty; + int wendy; + int wstartx; + int wendx; + struct panel *below; + struct panel *above; + const void *user; + struct panelobs *obscure; +} PANEL; + +int bottom_panel(PANEL *pan); +int del_panel(PANEL *pan); +int hide_panel(PANEL *pan); +int move_panel(PANEL *pan, int starty, int startx); +PANEL *new_panel(WINDOW *win); +PANEL *panel_above(const PANEL *pan); +PANEL *panel_below(const PANEL *pan); +int panel_hidden(const PANEL *pan); +const void *panel_userptr(const PANEL *pan); +WINDOW *panel_window(const PANEL *pan); +int replace_panel(PANEL *pan, WINDOW *win); +int set_panel_userptr(PANEL *pan, const void *uptr); +int show_panel(PANEL *pan); +int top_panel(PANEL *pan); +void update_panels(void); + +#if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) +} +#endif + +#endif /* __PDCURSES_PANEL_H__ */ diff --git a/pdcurses/pdcurses.dll b/pdcurses/pdcurses.dll new file mode 100644 index 0000000000000000000000000000000000000000..550c7a250067b1e761fd746ec620e6f6d25ae85f GIT binary patch literal 118784 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%0AYs)faxIDV9zL5h?t{K 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

6aQg!T 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 Cix@!w literal 0 HcmV?d00001 diff --git a/tools/playground/CMakeLists.txt b/tools/playground/CMakeLists.txt index 06006bc96..0cc625118 100644 --- a/tools/playground/CMakeLists.txt +++ b/tools/playground/CMakeLists.txt @@ -28,6 +28,10 @@ DFHACK_TOOL(dfmoodump moodump.cpp) # Author: mizipzor DFHACK_TOOL(dfdigger digger.cpp) +# dfstatus - watches DF and prints stuff in a window +DFHACK_CURSES_TOOL(dfstatus dfstatus.cpp) +find_package(Curses QUIET) + # digger2 - designate for digging from a text file # Author: rOut DFHACK_TOOL(dfdigger2 digger2.cpp) diff --git a/tools/supported/CMakeLists.txt b/tools/supported/CMakeLists.txt index 3f8f5299b..300a70202 100644 --- a/tools/supported/CMakeLists.txt +++ b/tools/supported/CMakeLists.txt @@ -116,33 +116,5 @@ ENDIF() # tile types. tile shape, material, and special information manipulation tool DFHACK_TOOL(dftiletypes tiletypes.cpp) -# veinlook - look at the map... sort of -IF(UNIX) - SET(VEINLOOK_BUILT "NO") - SET(CURSES_NEED_WIDE "YES") - SET(CURSES_NEED_NCURSES "NO") - find_package(Curses QUIET) - IF(CURSES_FOUND) - if(CURSES_HAVE_NCURSESW_NCURSES_H) - SET(NCURSES_H "ncursesw/ncurses.h") - elseif(CURSES_HAVE_NCURSESW_CURSES_H) - SET(NCURSES_H "ncursesw/curses.h") - elseif(CURSES_HAVE_NCURSESW_H) - SET(NCURSES_H "ncursesw.h") - elseif(CURSES_HAVE_CURSESW_H) - SET(NCURSES_H "cursesw.h") - endif(CURSES_HAVE_NCURSESW_NCURSES_H) - IF(NCURSES_H) - ADD_EXECUTABLE(dfveinlook veinlook.cpp) - set_property( TARGET dfveinlook PROPERTY COMPILE_DEFINITIONS NCURSES_H=${NCURSES_H} ) - INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR}) - TARGET_LINK_LIBRARIES(dfveinlook dfhack ${CURSES_LIBRARIES}) - install(TARGETS - dfveinlook - RUNTIME DESTINATION ${DFHACK_BINARY_DESTINATION} - ) - ENDIF(NCURSES_H) - ELSE(CURSES_FOUND) - MESSAGE(STATUS "Wide-character ncurses library not found - veinlook can't be built") - ENDIF(CURSES_FOUND) -ENDIF(UNIX) \ No newline at end of file +# veinlook - look at the map... sort of, kind of +DFHACK_CURSES_TOOL(dfveinlook veinlook.cpp) diff --git a/tools/supported/veinlook.cpp b/tools/supported/veinlook.cpp index 438f8cad1..83f595f2b 100644 --- a/tools/supported/veinlook.cpp +++ b/tools/supported/veinlook.cpp @@ -10,8 +10,7 @@ using namespace std; #include // the header name comes from the build system. -#define INCLUDE_NAME() -#include INCLUDE_NAME() +#include #include #include #include @@ -807,7 +806,7 @@ int main(int argc, char *argv[]) Maps->ReadTemperatures(cursorX+i,cursorY+j,cursorZ,&b_temp1, &b_temp2 ); if(dotwiddle) { - bitset<32> bs = Block->designation[0][0].whole; + bitset<32> bs ((int)Block->designation[0][0].whole); bs.flip(twiddle); Block->designation[0][0].whole = bs.to_ulong(); Maps->WriteDesignations(cursorX+i,cursorY+j,cursorZ, &(Block->designation));