PDCurses - a curses library for environments that don't fit the termcap/terminfo model.


Welcome to PDCurses!

PDCurses is an implementation of X/Open curses for multiple platforms. The latest version can be found at:


For changes, see the History file. The main documentation is now in the docs directory.

Legal Stuff

The core package is in the public domain, but small portions of PDCurses are subject to copyright under various licenses. Each directory contains a README.md file, with a section titled "Distribution Status" which describes the status of the files in that directory.

If you use PDCurses in an application, an acknowledgement would be appreciated, but is not mandatory. If you make corrections or enhancements to PDCurses, please forward them to the current maintainer for the benefit of other users.

This software is provided AS IS with NO WARRANTY whatsoever.


PDCurses has been ported to DOS, OS/2, Windows, X11 and SDL. A directory containing the port-specific source files exists for each of these platforms.

Build instructions are in the README.md file for each platform:

Distribution Status

All files in this directory (not including subdirectories) are released to the public domain.


William McBrine [email protected]

  • Win32a changes submitted

    Win32a changes submitted

    With this, "mainstream" PDCurses should be updated to include the new Win32a flavor. Other flavors are not greatly affected, except as described at http://projectpluto.com/win32a.htm#2015may31 and in the commit comments. So I think this will be straightforward, even though it's a fair bit of code.

    opened by Bill-Gray 24
  • Implement menu and forms library

    Implement menu and forms library


    This is perhaps an optional feature, but I was going to ask if we could get a port of these over, to increase compatibility with the NCURSES implementations.

    https://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/menus.html https://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/forms.html

    opened by guilt 18
  • getch - timeout resolution with undocumented artificial min

    getch - timeout resolution with undocumented artificial min

    https://github.com/wmcbrine/PDCurses/blob/master/pdcurses/getch.c#L181 has:

                /* Can't really do millisecond intervals, so delay in
                   1/20ths of a second (50ms) */

    But I see no reason for this "cannot". Is this some ancient issue (the code was last changed 14 years ago https://github.com/wmcbrine/PDCurses/commit/9645721eae492234c7ffa44ffc9325254c9052a7 providing a finer resolution from 10th to 20th of a second)?

    The current version would be at least a documentation issue as https://github.com/wmcbrine/PDCurses/blob/master/man/MANUAL.md#L1358 doesn't say that there's a jump from 0 to 50 and all that's in between means 50.

    To test I've run a check:

    • loop over var increasing timeout from 0ms up to 999
    • get system time, call timeout, getch, get system time, calculate diff, show loop counter and timediff

    result with ncurses on Win32: 0-999, nearly always matching timeout->calculated PDCurses: 0,~50 until 50, then increasing as expected.

    Suggestion: either drop the artificial lower limit completely or set it down from 50ms to 5ms and document it.

    opened by GitMensch 13
  • Resize problem

    Resize problem

    #include <pdcurses/curses.h>
     void initWin(void) {
         keypad(stdscr, TRUE);
         if (has_colors())
     int main(int argc, char const *argv[])
      int ch;
      int y, x;
      while ((ch = getch()) != 'q'){
    	   if (is_termresized())
    		   resize_term(0, 0);
    	   getmaxyx(stdscr, y, x);
    	   mvprintw(y / 2, x / 2 -20, "size: height:%d, width:%d\n", y, x);
        return 0;

    In above code, I run it and press some key, then I get the size (30, 120).After that I maximize the windows, I get the maximal size. Then I click to make window go back to normal size, I get (30, 117). By repeating this process(max then normal), maximal size is always the same, but width of normal size will decrease by 3 each time, i.e. (30, 114), (30,111) ....Then window become smaller and smaller. Is it a bug?
    In my test, linux ncurses (not pdcurses) work so well that you need not to resize it manually because getmaxyx will get changed size.
    I build latest library in Win10 by mingw64

    opened by BruceChen2017 10
  • background color issue when resizing a pad

    background color issue when resizing a pad

    wresize-ing a pad immediately after wbkgd/setting a background-color to it, creates the issue demonstrated above in the image:

    pdcursesbug gif

    I've tried looking into the bkgd.c and window.c but i had no luck... (this issue is not present with ncurses)

    I use unicurses with the latest 3.9 version of PDCurses

    from unicurses import * # python3.9 -m pip install uni-curses 
    def main():
        stdscr = initscr()
        keypad(stdscr, True)
        init_pair(1, COLOR_RED  , COLOR_WHITE)
        pROWS = 40
        pCOLS = 50
        pad1 = newpad(pROWS,pCOLS)
        wbkgd(pad1, COLOR_PAIR(1))
        pad1_position = 0
        for i in range(pROWS -2):
            mvwaddstr(pad1,i+1,2, str(i+1) + ': This is a TEST LINE')        
        prefresh(pad1,pad1_position, 0, 5, 5, 15, pCOLS-2)
        ch = -1
        while ( (ch != CCHAR('q')) and (ch != CCHAR('Q')) ):
            ch = getch()
            if  ch == KEY_DOWN: # MOVING DOWN
                pad1_position += 1
                prefresh(pad1,pad1_position, 0, 5, 5, 15, pCOLS-2)
            elif ch == KEY_UP: # MOVING UP
                pad1_position -= 1
                prefresh(pad1,pad1_position, 0, 5, 5, 15, pCOLS-2)
                pROWS += 1
                pad1_position += 1
                y,x = getmaxyx(pad1) # proof that pad changes size.
                mvwaddstr(pad1,pROWS-2,2, str(pROWS-2) + ': This is a  NEW LINE | mY=' + str(y) + ', mX=' + str(x)) 
                prefresh(pad1,pad1_position, 0, 5, 5, 15, pCOLS-2)
                #wbkgd(pad1, COLOR_PAIR(1)) # <-- this won't fix anything even if it is before prefresh
    if __name__ == "__main__":
    opened by GiorgosXou 9
  • Windows console size freezes after repeated resizing.

    Windows console size freezes after repeated resizing.


    I experienced Windows 10 console size freezes with my own application (wcd). It can be reproduced with the rain demo program. Sometimes the application freezes also.

    Take the rain demo program, compiled for Windows console. I used mingw-w64 64 bit. Start it in a Windows 10 console. Grab with the mouse an edge of the console and keep resizing. After a while the console freezes and can't be resized any more. Sometimes the rain application continues to run (in a fixed size console) and sometimes the rain application freezes also. When you are able to exit the rain program after a console freeze, the console size stays frozen. When the rain application also freezes, the only way out is to terminate the console.

    best regards,

    Erwin Waterlander

    opened by waterlan 8
  • Fixes for wincon/pdcdisp.c

    Fixes for wincon/pdcdisp.c

    • fix gcc warning about missing initialization
    • fix compilation of pdcdisp.c with old wincon.h (found in older MinGW environments) by defining the new values in pdcwin.h
    opened by GitMensch 8
  • Enable automated testing with Travis CI

    Enable automated testing with Travis CI

    Here is how automated Travis build look like: https://travis-ci.org/techtonik/PDCurses/builds

    If merged, it will allow anyone to test Linux builds online in their PDCurses clone.

    opened by techtonik 8
  • SDL renderers: use shaded font rendering

    SDL renderers: use shaded font rendering

    Shaded font rendering improves the legibility of the text.

    Result with TTF_RenderUNICODE_Solid with SDL2 on macOS 10.12.6:


    Result with TTF_RenderText_Shaded with SDL2 on macOS 10.12.6:


    opened by jaydg 6
  • Make KEY_SIZE and is_termresize work in win32

    Make KEY_SIZE and is_termresize work in win32

    I know that this will need some refactoring, happy to do the work if you point me in the right direction. This does work. I imagine it maybe should be optional to enable this feature? If so, how would be the best way to set that option? Adding resizeX and resizeY to the SCREEN struct seems kludgy as well, is there a better way to store the new console size after a resize event?

    opened by jackmott 6
  • make it compatible with C99 stdbool

    make it compatible with C99 stdbool

    Hello. I am unable to compile my ncurses programs against pdcurses, because the definitions of stdbool.h conflict with the library.

    Simply I looked how ncurses handled the same problem and I implemented a similar thing with pdcurses. This patch enables use by default of the standard booleans when included from either C and C++. If one's compilation environment does not provide stdbool, the original behavior may be restored by setting PDC_STDBOOL=0 in the preprocessor.

    opened by jpcima 6
  • 'GetVersion' was declared deprecated.

    'GetVersion' was declared deprecated.

    When compiling PDCurses for windows, it showed the error 'GetVersion' was declared deprecated in the file pdcsrn.c, line 402. Is there any way to get this to work?

    opened by Loch9 3
  • Segfault when highlighting/selecting cols/rows near the bottom in fullscreen SDL

    Segfault when highlighting/selecting cols/rows near the bottom in fullscreen SDL

    In trying to get PDCurses full-screen, i noticed this little error where the program would give off a segmentation fault core dump when i tried to select/highlight near the bottom with my mouse. According to gdb the error comes from _highlight() in getch.c, and i suspect it's this bit going out of bounds curscr->_y[j][i] ^= A_REVERSE; Probably has something to do with the way SDL handles resize_term aka PDC_resize_screen. Happens in both versions of SDL, tested on Linux Ubuntu 20.04 quick way i tested it was by rightclicking the rain demo's title bar and selecting fullscreen on XFCE4, then trying to mouse-cursor-select down to the bottom-right.

    opened by toomykins 1
  • PDCurses' endwin implementation is not signal-safe

    PDCurses' endwin implementation is not signal-safe

    When an application is in curses mode either the application or curses should take care to "reset" the screen when it exits.

    One of the things that a curses application may does is to register an error handler (commonly a signal handler) which calles endwin(). It should not call delwin() as the necessary free() calls in there are problematic and "the application is going to exit afterwards in any case". Also: if the OS (or application) creates a coredump afterwards delwin() is likely to clean some traces which may be useful to debug some issues, and also for a signal handler "faster is better".

    This often works fine - but the chances with PDCurses (@Bill-Gray also applies to PDCursesMod) are less good.

    One of the reasons is the use of PDC_LOG macro which itself calls some unsafe functions, for many ports one of the reasons is also the check of PDC_RESTORE_SCREEN in PDC_scr_close() as this uses getenv() which should not be used in a signal handler, see the manpage for signal-safety.

    Note: this is not a theoretic issue - I've recently debugged a bunch of memory issues in an application and if its signal handler is called because of memory issues in free or malloc, then the call to endwin() in there currently is not unlikely to create a lock issue or re-raises a SIGSEGV (or in case of glibc checks a SIGABRT) so the rest of the signal handler is not executed. This potentially prevents generation of coredumps, too :-(

    My suggestions:

    • only read PDC_RESTORE_SCREEN in initscr() and place the result in a static var, possibly add a function to toggle it later in the application (or implicit re-read it at other places like refresh() or getch())
    • drop the actual logging from endwin() and called functions, or only do the logging depending on static variables (see suggestion for PDC_RESTORE_SCREEN)
    • declare signal-safety for PDCurses' endwin() (and drop an implementation use about the functions to (not) use in PDC_scr_close()

    Related (but does not need to be adjusted together) #133.

    opened by GitMensch 6
  • registration of signal handlers on all ports

    registration of signal handlers on all ports

    see https://invisible-island.net/ncurses/man/curs_initscr.3x.html#h3-Signal-Handlers and https://stackoverflow.com/a/44085449/5027456

    According to the search function this is only done on few ports (wincon possibly uses a different approach), and it seems that it may not be only done if the signal is currently SIG_DFL (@Bill-Gray this also applies to PDCursesMod).

    Could the behavior be adjusted to be identical (or at least similar) in all ports? Can you please update the docs to let the users know what to expect?

    opened by GitMensch 1
  • BUTTON1_DOUBLE_CLICKED is being returned while mouseinterval(0)

    BUTTON1_DOUBLE_CLICKED is being returned while mouseinterval(0)

    while BUTTON1_CLICKED and BUTTON1_TRIPLE_CLICKED events are being ignored\replaced with _PRESSED\_RELEASED events when mouseinterval(0) (as they should), for some reason BUTTON1_DOUBLE_CLICKED event is being returned instead of _PRESSED\_RELEASED.

    opened by GiorgosXou 4
  • 3.9(Sep 4, 2019)

    768 colors, single-process X11, copy-and-paste for all, and more.

    New features

    • Single-process, single-thread version of the X11 port. Much, much faster than the two-process version. Needs more testing. This version omits translations.

    • A common copy-and-paste system for all platforms, based on the PDC_*clipboard() functions. (This is the first time copy-and-paste is available for the SDL ports, and it replaces the old X11-specific C&P.) Press and hold button 1 while selecting; paste with button 2. Add Shift if mouse events are activated in curses. You can also paste via Shift-Ctrl-V, and copy with Shift-Ctrl-C (although selecting already sets the buffer). Note that paste is implemented via ungetch(), and is currently limited to 256 characters at a time. (You can get more via PDC_getclipboard().) With some ports (e.g. Wincon), the existing terminal C&P mechanism may override PDCurses'. DOS and SDL1 can only C&P within the same app.

    • A new maximum of 768 colors, for Wincon, SDL and X11. COLOR_PAIRS is still limited to 256. The idea is that each pair can have a unique foreground and background, without having to redefine any of the first 256 (predefined) colors. Colors 256-767 have no initial definitions, and are intended to be set via init_color(). An example has been added to testcurs (loosely based on part of newtest, by Bill Gray).

    • Wincon now allows redefinition of all 768 colors, and allows it even under ConEmu.

    • True italics for ConEmu. (It seems it should also support true bold, but I couldn't make that work.)

    • Added new functions from ncurses and/or NetBSD: has_mouse(), is_keypad(), is_leaveok(), is_pad(), set_tabsize(), touchoverlap(), underscore(), underend(), wunderscore(), and wunderend(). See the man pages for descriptions. Partly due to Karthik Kumar Viswanathan, and suggestions of Simon Sobisch.

    Bug fixes and such

    • Check for standard C++ (>= 98), where native bool should exist, and use that; otherwise (pre-/non-standard C++) fall back to the old behavior. Satisfies clang, hopefully doesn't mess anything else up.

    • Recent versions of clang throw an error over "-install_name".

    • Most curses functions assumed a valid SP (i.e. that initscr() had already been called). Now, instead, they return ERR or other appropriate values. Suggestion of S.S.

    • Deprecated PDC_save_key_modifiers() -- there's no benefit to NOT saving them.

    • Hold back screen updates due to palette changes until paused; always do this update now (previously only in X11 and SDL, seems necessary in Windows 10 1903).

    • SDL2 windows were freezing on moving to another screen (reported by Mark Hessling). Still issues with moving between screens of different scaling.

    • Find the X libraries in some additional locations. After M.H.

    • Converted default X11 icons to XPM, fixing their non-display in Ubuntu.

    • Made XIM standard, removed "classic" X11 compose system.

    • Made wide-character build the default for X11 (--disable-widec for narrow).

    • Smoother resizing in X11, when not in scrollbar mode.

    • Dropped X11 options "borderWidth" (broken since at least 2.7) and "cursorColor" (now set automatically for contrast).

    • Correctly restore Insert mode and QuickEdit mode in Wincon's PDC_reset_shell_mode(). Patch by "vyv03354".

    • Add a WINDRES variable to wincon/Makefile for the sake of cross- compilers. Patch by Marc-Andre Lureau.

    • Suppress cursor movement during color tests in testcurs.

    • Added UTF-8-demo.txt for tuidemo to browse (by default, only in forced UTF-8 mode). File by Markus Kuhn.

    • Moved the doc files from "man" to "docs" -- the docs/man thing was too confusing. Streamlined the web page into two files.

    • Rewrote the "Portability" sections of the man pages to reflect current ncurses and NetBSD. The old charts weren't very accurate.

    • Document resolution of timeout() and napms(). Suggested by S.S.

    • Rewrote manext (again) in Awk.

    • Changed most dates to ISO format.

    See the git log for more details.

    Source code(tar.gz)
    Source code(zip)
  • 3.8(Feb 2, 2019)

    It's that time again.

    New features

    • PDC_VERSION structure and PDC_get_version() function, to provide run- time information on version and compile options, in case they don't match the header; along with new compile-time defines PDC_VER_MAJOR, PDC_VER_MINOR and PDC_VERDOT. Suggested by Simon Sobisch, designed partly after Bill Gray and partly after SDL_VERSION.

    • Extensive documentation revisions, now covering many previously undocumented functions.

    • Allow building the DLL with MinGW for SDL. (This also changes the non-DLL library name from libpdcurses.a to pdcurses.a.)

    • Consolidated Watcom makefiles for DOS, after Tee-Kiah Chia; added MODEL option to Makefile.bcc for consistency.

    • Added another ncurses_test, "lrtest"; updated for ncurses 6.1.

    Bug fixes and such

    • T.H.'s update rect clipper (a resize fix for SDL2) broke sdltest, because it didn't take the offsets into account for a non-owned window.

    • The version number is now hardwired only in curses.h and configure.ac.

    • Revised pdcurses.rc to correctly show all fields when checking the properties on a DLL; use it with MinGW as well as MSVC.

    • Allow building both 32- and 64-bit SDL2 versions in MinGW without editing the Makefile, by using the proper dev package.

    • Build SDL2 demos in "Windows" mode (i.e. no controlling terminal) with MSVC, as with MinGW.

    • Build sdltest.exe with MSVC.

    • Changed sample pathname in tuidemo to always use slashes -- the backslashes failed in, e.g., SDL under Linux or macOS. Patch by B.G.

    • Warning fix for Borland OS/2.

    • Minor file reorganization / renaming.

    • mmask_t is now used in both the classic and ncurses mouse interfaces, and is defined in such a way as to keep it at 32 bits.

    • Dropped map_button() and getbmap().

    • Dropped the ability to build BBS-ready archives from the Makefiles.

    • Made manext.py compatible with Python 3.x.

    See the git log for more details.

    Source code(tar.gz)
    Source code(zip)
  • 3.7(Jan 1, 2019)

    New features

    • Avoid conflict with ncurses by having apps define PDC_NCMOUSE before including curses.h to invoke the ncurses-style mouse interface, instead of NCURSES_MOUSE_VERSION. (The old way will also still work.) After Simon Sobisch (see PR #33).

    • In SDL, the box-drawing and block ACS characters are now rendered in a font-independent way, to ensure their correct alignment across cells. Underlining is now handled in a similar way.

    • TTF fonts in SDL are now rendered in Blended mode instead of Solid. Partly after Joachim de Groot.

    • New default fonts and font sizes for SDL/TTF.

    • SDL2 now builds under MSVC. Partly due to Alexandru Afrasinei.

    • Documentation re-org -- more Markdown internal links; moved to man/ dir (the doc/ dir name was too similar to docs/, which is needed for GitHub Pages hosting); concatenated man page document now made permanent, under the name MANUAL.md; new man build utils; merged sdl.md and x11.md into their respective READMEs; changed some redundant and unclear comments.

    • Directory re-org -- in addition to the above, created common/, to unclutter the root, and eliminate a few more redundant files from platform directories. (We already had "pdcurses", but that's for the portable core; "common" is for files that are more platform-specific, though shared by more than one platform.)

    • Broke out the redundant ACS tables and moved them to common/.

    • PDcurses' "bool" type is now based on stdbool.h, when available. There should be no conflicts when including stdbool.h either before or after curses.h.

    • The demos are no longer built by default, since they add a lot of time to the build, and often aren't wanted. But you can still build them via "make demos" (tweak as needed).

    • Makefile tweaks for cross-compiling by Simon Sobisch.

    Bug fixes and such

    • Improved Windows console resizing, when reducing the vertical size. After Ulf Magnusson. (See GitHub issue #26.)

    • Bring back ifdef'd CONSOLE_SCREEN_BUFFER_INFOEX, for the benefit of older compile environments. (Not automatic -- must specify INFOEX=N on the command line.) After Simon Sobisch.

    • Replaced COMMON_LVB_* with numbers to appease some old compilers. After Simon Sobisch.

    • KEY_RESIZE should be key_code = TRUE. Reported by Ulf Magnusson.

    • SDL2 resize fixes to prevent crashes, by Tim Hentenarr.

    • SDL2 fixes for handling of SDL_TEXTINPUT, keys with modifiers, and modifier keystrokes, by Tim Hentenarr.

    • Fixed cursor rendering in SDL/TTF.

    • SDL1 support is now dropped for Windows and macOS, and deprecated for Linux. Use SDL2. The SDL1 port is likely to be dropped in the future.

    • The setsyx() function is now void, after ncurses, and simplified.

    • Warning fixes by Patrick Georgi and Stefan Reinauer.

    • X11 used SP->resized in a non-boolean way, so it's now a short.

    • Under some conditions (see issue #47), the X11 port could "free" colors that it hadn't allocated. Reported by rin-kinokocan.

    • New scroller for ozdemo -- no memory allocation, less copying -- to resolve issue #46.

    • Various minor Makefile tweaks.

    • Eliminated term.h and terminfo.c, and moved mvcur() to move.c. These stub functions, done on request (with others then requesting that I take them away -- can't win), were a misguided attempt to facilitate using PDCurses with certain non-C languages -- which, apparently, they didn't end up actually doing. They're also, regrettably, specified as part of the X/Open curses standard, even though they in effect describe an entirely different interface layer (one on which traditional curses, but not PDCurses, is built).

    • Dropped support for short (16-bit) chtypes.

    • Finally removed deprec.c, as it promised.

    • Dropped the XOPEN, SYSVcurses and BSDcurses defines from curses.h, as well as NULL (which is defined in stdio.h, included). TRUE, FALSE, ERR and OK are now defined unconditionally.

    • Moved pdcurses.org hosting to GitHub -- as a result, the site is now part of the repo, in the docs/ directory. (Also, it has SSL again.)

    See the git log for more details.

    Source code(tar.gz)
    Source code(zip)
  • 3.6(Apr 11, 2018)

    Tidying up some loose ends from 3.5, and trying to bring all platforms up to the same level, as much as possible.

    New features

    • 256 colors for the Windows console -- under Windows 10 or ConEmu, only. This version doesn't allow init_color() or color_content() for colors 16-255, just uses Windows' predefined palette (which matches xterm-256color, like the default colors in X11 and SDL).

    • Real blinking for the Windows console (all), and for OS/2 -- done in software, like the Windows version -- replacing the erraticly working Vio-based version (which didn't work at all in my OS/2 4.5 VM). OS/2 now always has 16 colors, and bright backgrounds can combine with blinking.

    • In DOS, OS/2 and Windows, attribute behavior now more closely matches that of the more "advanced" ports (X11 and SDL) -- see the Attribute test in testcurs.

    • All of the A_* and WA_* attributes from X/Open are now defined in curses.h, although some are no-ops, pending the availablity of more attribute bits. A_INVIS is now a no-op on all platforms, instead of overloading A_ITALIC, and so is A_PROTECT. A_LEFT and A_RIGHT are now synonyms for PDCurses' old *LINE attributes.

    Bug fixes and such

    • For the X11 port, "make install" and the dynamic library build were broken, since the configure move. Fixes partly after Mark Hessling.

    • Renamed "win32" to the more accurate/descriptive "wincon" (i.e. WINdows CONsole). Makefiles for all platforms renamed to remove the redundant platform names, and to allow better sorting.

    • In SDL2, apps that didn't explicitly handle resizing locked up. Now, they can continue running, at their old size. (To Do: xmas is still a basket case.)

    • Added "/MACHINE:$(PLATFORM)" to wincon/Makefile.vc -- Thomas Dickey says this is needed to build 64-bit with Visual Studio Express 2012. With 2017, it suppresses a warning.

    • Suppressed "Possibly incorrect assignment" warnings with BCC, which also results in more readable code.

    • Cleaned up obsolete comments, dead code, unneeded includes, typos, and outdated documentation.

    • Dropped support for EMXVIDEO.

    • Dropped color remapping for OS/2 (broken).

    • Dropped X11 DLL support for Cygwin (broken).

    • Rearranged extended color display in testcurs.

    • In ptest, handle resizing, and check for screens too small to run in.

    • Allow KEY_* codes (including KEY_RESIZE) to exit firework, as other keys do.

    • Slightly faster Windows compilation (most noticeable in Watcom).

    See the git log for more details.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_3_5(Apr 11, 2018)

    So, it's been a while, eh?

    This release is an attempt to bring PDCurses mostly up to date, without breaking too many things in the process.

    New features

    • SDL2 port, and TTF and Unicode support for both SDL1 and SDL2. Credit for these goes mostly to Laura Michaels and Robin Gustafsson.

    • 256 colors for SDL and X11, by Bill Gray. Colors 16-255 are set up to match xterm colors, but can be redefined, as with 0-15.

    • Bold and italic font options for SDL and X11. A_BOLD's behavior is controlled by the new function PDC_set_bold() -- TRUE to select bold font, FALSE to choose high foregound intensity (as before). Italic fonts are selected by A_ITALIC (always on). X11 originally from Mark Hessling.

    • Real blinking in SDL and X11, controlled by PDC_set_blink(). Largely due to Kevin Lamonte and Bill Gray.

    • Support for A_UNDERLINE, A_LEFTLINE and A_RIGHTLINE in the Windows console. This requires a recent version of Windows (10, maybe 8?) to work with the standard console, but underlining also works with ConEmu, at least as far back as XP.

    • User resizing (i.e. grab window edges or maximize button) for Windows console -- needs recent Windows or ConEmu.

    • New-style color-changing code for the Windows console (using the new offical API instead of undocumented functions), supporting redefinition of colors 0-15 via init_color(). Works at least as far back as Windows XP SP3. Patch by "Didrole".

    • The Windows console port now creates a separate console buffer by default, making for a cleaner and more complete restoration of the original buffer. The old behavior can be used by setting "PDC_RESTORE_SCREEN=0". Patch by Jason Hood.

    • Left/right scroll wheel support for Windows console, SDL and X11. X11 by Mark Hessling.

    • testcurs now includes an additional test to show various attributes, and a display of the extended colors, where applicable.

    Bug fixes and such

    • termattrs() now returns something vaguely resembling the actual capabilities of the specific "terminal". Specifically, A_BOLD and A_BLINK reflect the availability of true bold fonts, and real blinking; when not set in termattrs(), the attributes still work, but control foreground and background intensity, as before. *LINE are also meaningful, and even A_COLOR is set (or not).

    • pad size check in pnoutrefresh() was broken since 3.0. Reported by Peter Hull.

    • In newpad(), begx and begy should be set to zero, otherwise creating a subpad of the same width or height fails due to the check in subpad(). Patch by Raphael Assenat.

    • More straightforward math for subpad(), plus another off-by-one error. Reported by Werner Wenzel, John Hartmann et al.

    • New subwindows/subpads/resized windows should copy _delayms. Patch by "xaizek".

    • Potentially invalid saved cursor position in resize_window() -- another off-by-one _maxx/_maxy error. Patch after "Luke-Jr".

    • copywin() needs to disallow corner values equal to _maxx or _maxy, not just less than. Reported by "Aleksandr".

    • Misaligned soft-label keys in 4-4-4 mode. Reported by Werner Wenzel.

    • Missing prototypes for bkgrnd() and bkgrndset().

    • Missing WA_NORMAL and WA_ATTRIBUTES from the X/Open spec.

    • keyname() and termname() now return static buffers, as documented.

    • In the X11 port, due to (post-PDCurses-3.4) changes in Xt, XtAppMainLoop() always hung. Fixed by re-implementing it within PDCurses, basically.

    • Fix blinking X11 cursor for clients that call move() more frequently than cursorBlinkRate -- patch by Kevin Lamonte.

    • Improved cursor rendering for X11, by John P. Hartmann.

    • ALT key combos sometimes not reported in X11, per Mark Hessling et al.

    • Support for XK_ISO_Left_Tab in X11, by John P. Hartmann.

    • Support for "Super" keys in X11, by Bill Gray.

    • Make xcurses-config include -DPDC_WIDE when appropriate, per M.H.

    • The configure script and accompanying files, which were always specific only to the X11 port (causing considerable confusion), have been moved to the x11 directory.

    • In SDL, SP->key_code wasn't being set for KEY_MOUSE events. Reported by Bill Gray.

    • SDL events need to keep pumping through non-input delays. (Really messed up on current macOS before this change.)

    • SDL2 is outperforming SDL1 by about 10x on the platforms I've tried that support both, so I've removed Makefile.mng from the SDL1 port.

    • Updated for the most current compilers, wherever possible; various warning suppressions. All included makefiles were tested with their respective compilers, shortly before release (including the POSIX stuff on macOS with clang, and on Ubuntu Linux with gcc). The oldest compiler I tested with was Turbo C++ 3.0, from 1992; the latest, several compilers from 2017.

    • Dropped support for LCC-Win32 -- the official site is shut down.

    • Dropped support for Digital Mars -- not updated since 2014, limited makefile, library missing some needed Windows APIs.

    • Dropped MS C for DOS, and Cset/2 for OS/2.

    • Dropped support for building DLLs with EMX.

    • Minor code and makefile reorganization; mingwin32.mak merged into gccwin32.mak (i.e. you can use it with both compilers). Some contributions by Bill Gray and Simon Sobisch.

    • Watcom makefile paths and option markers changed to Unix-friendly style, after Tee-Kiah Chia.

    • The *.def files are no longer needed, replaced by more PDCEX declarations in the include files. After Bill Gray and Simon Sobisch.

    • When building with DEBUG=Y, no longer strip the executables. After Simon Sobisch.

    • Hold debug file ("trace") open after traceon(), for greater performance. Set PDC_TRACE_FLUSH to make it fflush() after each write (slower but safer in case of a crash). Patch by Ellie Timoney.

    • Since 3.2, the panel library was simply a copy of the main library. This kludge is now dropped. (panel.h remains separate from curses.h.)

    • Removed PDCurses.spec, and the RPM-building makefile option. I think this is better left to the various package/distro maintainers.

    • Various formatting corrections (e.g., trailing spaces stripped), and variables renamed to avoid clashes. Some contributed by Stefan Reinauer and Bill Gray.

    • Various documentation corrections and updates. All documentation "converted" to Markdown format (involving few actual changes -- mainly the file extension), for better rendering on GitHub, SourceForge, etc. Some contributed by Anatoly Techtonik.

    • The "Win32" label is deprecated by Microsoft, and accordingly I've replaced references in the documentation, although not yet changed the filenames. The Windows console code can just as well be built for 64-bit (and always could be, AFAIK, although there are minor tweaks to support it in this version).

    • The ncurses_tests can now be built under SDL as well as X11. Also, all our tests (still/again) build under recent ncurses.

    • Put testcurs' "Output test" into real blink mode, if possible; and if COLORS >= 16, use colors 0-15 directly in the color test, instead of or'ing with A_BOLD to get the high-intensity colors.

    • Renamed the (by now rather old) "newdemo" to "ozdemo".

    • Moved from CVS to git; source is now on GitHub as well as SourceForge; central site is now pdcurses.org.

    See the git log for more details.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_3_4(Apr 11, 2018)

    Nothing much new this time, but I've been sitting on some bug fixes for almost a year, so it's overdue. Apart from bugs, the main changes are in the documentation.

    New features:

    • setsyx() is now a function rather than a macro.

    Bug fixes and such:

    • In x11, the xc_atrtab table size was under-calculated by half, resulting in crashes at (oddly) certain line counts. (It should've crashed a lot more.) Reported by Mark Hessling.

    • Test for moved cursor was omitting the window origin offset. Reported by Carey Evans.

    • Is DOS and OS/2, the value for max items in key_table was still wrong. Reported by C.E.

    • Changed isendwin() so it won't crash after delscreen().

    • Ensure zero-termination in PDC_mbstowcs() and PDC_wcstombs().

    • Disable QuickEdit Mode when enabling mouse input for the Win32 console; reported by "Zalapkrakna".

    • Fix for building under Innotek C (I hope). Report by Elbert Pol, fix courtesy of Paul Smedley.

    • Unified exports list with no duplicates -- pdcurses.def is now built from components at compile time.

    • Don't install curspriv.h, and don't include it with binary distributions.

    • Building DLLs with LCC is no longer supported, due to the primitive nature of its make.exe.

    • Export the terminfo stub functions from the DLLs, too.

    • Added support for Apple's ".dylib" in configure. Suggested by Marc Vaillant (who says it's needed with OS 10.5.)

    • In sdl1/Makefile.mng, ensure that CC is set.

    • In the gcc makefiles, "$?" didn't really have the desired effect -- all the dependencies showed up on the command line, including curses.h, and pdcurses.a twice. And apparently, this can mess up some old version (?) of MinGW. So, revert to spelling out "tuidemo.o tui.o". Reported by "Howard L."

    • Extensive documentation revision and reorganizing. More to do here. For example, I moved the build instructions from INSTALL (which never really described installation) to the platform-specific READMEs.

    • New indentation standard: four spaces, no tabs.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_3_3(Apr 11, 2018)

    This release adds an SDL backend, refines the demos, and is faster in some cases.

    New features:

    • SDL port. See INSTALL, doc/sdl.txt and sdl1/* for details.

    • Double-buffering -- minimize screen writes by checking, in doupdate() and wnoutrefresh(), whether the changes to curscr are really changes. In most cases, this makes no difference (writes were already limited to areas marked as changed), but it can greatly reduce the overhead from touchwin(). It also helps if you have small, separated updates on the same line.

    • The PDC_RGB colors can now be used, or not, with any platform (as long as the same options are used when compiling both the library and apps). This may help if you have apps that are hardwired to assume certain definitions.

    • Restored the use_default_colors() stuff from the ncurses versions of the rain and worm demos, to make them "transparent" (this is useful now, with the SDL port); added transparency to newdemo.

    • Added setlocale() to tuidemo, to make it easier to browse files with non-ASCII characters.

    • Sped up firework demo by replacing unneeded clear() and init_pair() calls.

    • Allow exit from ptest demo by typing 'q'.

    • New functions for implementors: PDC_pair_content() and PDC_init_pair() (the old pdc_atrtab stuff was arguably the last remnant of code in the pdcurses directory that was based on platform details).

    Bug fixes and such:

    • Implicit wrefresh() needs to be called from wgetch() when the window's cursor position is changed, even if there are no other changes.

    • Set SP->audible on a per-platform basis, as was documented in IMPLEMNT, but not actually being done.

    • Minor tweaks for efficiency and readability, notably with wscrl().

    • tuidemo didn't work correctly on monochrome screens when A_COLOR was defined -- the color pair numbers appeared as the corresponding character; also, the input box was (I now realize) broken with ncurses since our 2.7, and broke more subtly with PDCurses' new implicit refresh handling; also, the path to the default file for the Browse function was a bit off.

    • Assume in the demos that curs_set() is always available -- there's no good test for this, and the existing tests were bogus.

    • Made the command-line parameter for ptest work. (If given an argument, it delays that number of milliseconds between changes, instead of waiting for a key, and automatically loops five times.)

    • Building the Win32 DLL with MinGW or Cygwin wouldn't work from outside the platform directory.

    • Building the X11 port with Cygwin required manually editing the Makefile after configuring; no longer. Reported by Warren W. Gay.

    • Minor tightening of configure and makefiles.

    • Bogus references to "ACS_BLCORNER" in the border man page. Reported by "Walrii".

    • slk_wlabel() was not documented.

    • Spelling cleanup.

    • Changed RCSIDs to not end with a semicolon -- avoids warnings when compiling with the -pedantic option.

    • Merged latin-1.txt into x11.txt.

    • Updated config.guess and config.sub to more recent versions.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_3_2(Apr 11, 2018)

    This release mainly covers changes to the build process, along with a few structural changes.

    New features:

    • The panel library has been folded into the main library. What this means is that you no longer need to specify "-lpanel" or equivalent when linking programs that use panel functionality with PDCurses; however, panel.lib/.a is still provided (as a copy of pdcurses.lib/.a) so that you can, optionally, build your projects with no changes. It also means that panel functionality is available with the DLL or shared library. Note that panel.h remains separate from curses.h.

    • Setting the PDCURSES_SRCDIR environment variable is no longer required before building, unless you want to build in a location other than the platform directory. (See INSTALL.)

    • MinGW and Cygwin makefiles support building DLLs, via the "DLL=Y" option. Partly due to Timofei Shatrov.

    • Support for the Digital Mars compiler.

    • Watcom makefiles now use the "loaddll" feature.

    Bug fixes and such:

    • Eliminated the platform defines (DOS, WIN32, OS2, XCURSES) from curses.h, except for X11-specific SCREEN elements and functions. Dynamically-linked X11 apps built against an old version will have their red and blue swapped until rebuilt. (You can define PDC_RGB to build the library with the old color scheme, but it would also have to be defined when building any new app.) Any app that depends on PDCurses to determine the platform it's building on will have to make other arrangements.

    • Documentation cleanup -- added more details; removed some content that didn't apply to PDCurses; moved the doc-building tool to the doc directory; changed *.man to *.txt.

    • The EMX makefile now accepts "DLL=Y", builds pdcurses.dll instead of curses.dll, builds either the static library or the DLL (not both at once), and links all the demos with the DLL when building it.

    • In Win32, read the registry only when needed: when init_color() or color_content() is called, instead of at startup.

    • A few additional consts in declarations.

    • The Win32 compilers that build DLLs now use common .def files.

    • panel.h functions sorted by name, as with other .h files; curses.h is no longer included by repeated inclusions of panel.h or term.h.

    • Simplified Borland makefiles.

    • Makefile.aix.in depended on a file, xcurses.exp, that was never there. This problem was fixed as part of the change to common .def files; however, I still haven't been able to test building on AIX.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_3_1(Apr 11, 2018)

    Primarily clipboard-related fixes, and special UTF-8 support.

    New features:

    • "Force UTF-8" mode, a compile-time option to force the use of UTF-8 for multibyte strings, instead of the system locale. (Mainly for Windows, where UTF-8 doesn't work well in the console.) See INSTALL.

    • Multibyte string support in PDC_*clipboard() functions, and in Win32's PDC_set_title().

    • Added the global string "ttytype", per other curses implementations, for compatibility with old BSD curses.

    • Real functions for the "quasi-standard aliases" -- crmode(), nocrmode(), draino(), resetterm(), fixterm() and saveterm(). (Corresponding macros removed.)

    Bug fixes and such:

    • In Win32, under NT-family OSes, the scrollback buffer would be restored by endwin(), but would not be turned off again when resuming curses after an endwin(). The result was an odd, partly-scrolled-up display. Now, the buffer is toggled by PDC_reset_prog_mode() and PDC_reset_shell_mode(), so it's properly turned off when returning from an endwin().

    • In 3.0, selection in X11 didn't work. (Well, the selecting worked, but the pasting elsewhere didn't.) This was due to the attempted fix "don't return selection start as a press event," so that's been reverted for now.

    • PDC_setclipboard() was locking up in X11. Reported by Mark Hessling.

    • Missing underscore in the declaration of XC_say() prevented compilation with PDCDEBUG defined. Reported by M.H.

    • Off-by-one error in copywin() -- the maximum coordinates for the destination window should be inclusive. Reported by Tiago Dionizio.

    • Start in echo mode, per X/Open. Reported by T.D.

    • Strip leading and trailing spaces from slk labels, per a literal reading of X/Open. Suggested by Alexey Miheev (about ncurses, but it also applies here).

    • The #endif for PDCURSES needs to come after the closing of the extern "C". This has been broken since June 2005. Fortunately (?), it only shows up if the file is included multiple times, and then only in C++. Reported on the DOSBox forums.

    • Use CF_OEMTEXT instead of CF_TEXT in the narrow versions of the clipboard functions in Win32, to match the console.

    • Changed the format of the string returned from longname().

    • In the clipboard test in the testcurs demo, use a single mvprintw() to display the return from PDC_getclipboard(), instead of a loop of addch(), which was incompatible with multibyte strings.

    • Moved has_key() into the keyname module, and documented it.

    • Moved RIPPEDOFFLINE to curspriv.h.

    • Typos in IMPLEMNT.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_3_0(Apr 11, 2018)

    The focuses for this release are X/Open conformance, i18n, better color support, cleaner code, and more consistency across platforms.

    This is only a brief summary of the changes. For more details, consult the CVS log.

    New features:

    • An almost complete implementation of X/Open curses, including the wide-character and attr_t functions (but excluding terminfo). The wide-character functions work only in Win32 and X11, for now, and require building the library with the appropriate options (see INSTALL). Note that this is a simplistic implementation, with exactly one wchar_t per cchar_t; the only characters it handles properly are those that are one column wide.

    • Support for X Input Methods in the X11 port (see INSTALL). When built this way, the internal compose key support is disabled in favor of XIM's, which is a lot more complete, although you lose the box cursor.

    • Multibyte character support in the non-wide string handling functions, per X/Open. This only works when the library is built with wide- character support enabled.

    • Mouse support for DOS and OS/2. The DOS version includes untested support for scroll wheels, via the "CuteMouse" driver.

    • An ncurses-compatible mouse interface, which can work in parallel with the traditional PDCurses mouse interface. See the man page (or mouse.c) for details.

    • DOS and OS/2 can now return modifiers as keys, as in Win32 and X11.

    • COLORS, which had been fixed at 8, is now either 8 or 16, depending on the terminal -- usually 16. When it's 8, blinking mode is enabled (controlled as before by the A_BLINK attribute); when it's 16, bright background colors are used instead. On platforms where it can be changed, the mode is toggled by the new function PDC_set_blink(). PDCurses tries to set PDC_set_blink(FALSE) at startup. (In Win32, it's always set to FALSE; in DOS, with other than an EGA or VGA card, it can't be.) Also, COLORS is now set to 0 until start_color() is called.

    • Corresponding to the change in COLORS, COLOR_PAIRS is now 256.

    • Working init_color() and color_content(). The OS/2 version of init_color() works only in a full-screen session; the Win32 version works only in windowed mode, and only in NT-family OSes; the DOS version works only with VGA adapters (real or simulated). The Win32 version is based mostly on James Brown's setconsoleinfo.c (www.catch22.net).

    • use_default_colors(), assume_default_colors(), and curses_version(), after ncurses.

    • Added global int TABSIZE, after ncurses and Solaris curses; removed window-specific _tabsize.

    • Logical extension to the wide-character slk_ funcs: slk_wlabel(), for retrieving the label as a wide-character string.

    • A non-macro implementation of ncurses' wresize().

    • Working putwin(), getwin(), scr_dump() and scr_restore().

    • A working acs_map[]. Characters from the ACS are now stored in window structures as a regular character plus the A_ALTCHARSET attribute, and rendered to the ACS only when displayed. (This allows, for example, the correct display on one platform of windows saved from another.)

    • In X11, allow selection and paste of UTF8_STRING.

    • The testcurs demo now includes a color chart and init_color() test, a wide character input test, a display of wide ACS characters with sample Unicode text, a specific test of flash(), more info in the resize test, and attempts to change the width as well as the height.

    • Command-line option for MSVC to build DLLs (see INSTALL). Also, the naming distinction for DLLs ("curses" vs. "pdcurses") is abandoned, and either the static lib or DLL is built, not both at once (except for X11).

    • For backwards compatibility, a special module just for deprecated functions -- currently PDC_check_bios_key(), PDC_get_bios_key(), PDC_get_ctrl_break() and PDC_set_ctrl_break(). These shouldn't be used in applications, but currently are... in fact, all the "private" functions (in curspriv.h) are subject to change and should be avoided.

    • A new document, IMPLEMNT, describing PDCurses' internal functions for those wishing to port it to new platforms.

    • Mark Hessling has released the X11 port to the public domain. (However, x11/ScrollBox* retain their separate copyright and MIT-like license.)

    Bug fixes and such:

    • Most of the macros have been removed (along with the NOMACROS ifdef). The only remaining ones are those which have to be macros to work, and those that are required by X/Open to be macros. There were numerous problems with the macros, and no apparent reason to keep them, except tradition -- although it was PCcurses 1.x that first omitted them.

    • Clean separation of platform-specific code from the rest. Outside of the platform directories, there remain only a few ifdefs in curses.h and curspriv.h.

    • General reorganization and simplification.

    • Documentation revisions.

    • When expanding control characters in addch() or insch(), retain the attributes from the chtype.

    • Preserve the A_ALTCHARSET attribute in addch() and insch().

    • Per X/Open, beep() should always return OK.

    • On platforms with a controlling terminal (i.e., not X11), curs_set(1) now sets the cursor to the shape it had at the time of initscr(), rather than always making it small. (Exception for DOS: If the video mode has been changed by PDC_resize_screen(), curs_set(1) reverts to line 6/7.) The shape is taken from SP->orig_cursor (the meaning of which is platform-specific).

    • Stop updating the cursor position when the cursor is invisible (this gives a huge performance boost in Win 9x); update the cursor position from curs_set() if changing from invisible to visible.

    • Some tweaking of the behavior of def_prog_mode(), def_shell_mode(), savetty(), reset_prog_mode(), reset_shell_mode() and resetty()... still not quite right.

    • flash() was not implemented for Win32 or X. A portable implementation is now used for all platforms. Note that it's much slower than the old (DOS and OS/2) version, but this is only apparent on an extremely slow machine, such as an XT.

    • In getstr(), backspacing on high-bit characters caused a double backspace.

    • hline() and vline() used an incorrect (off by one) interpretation of _maxx and _maxy. If values of n greater than the max were specified, these functions could access unallocated memory.

    • innstr() is supposed to return the number of characters read, not just OK or ERR. Reported by Mike Aubury.

    • A proper implementation of insch() -- the PDC_chadd()-based version wasn't handling the control characters correctly.

    • Return ASCII and control key names from keyname() (problem revealed by ncurses' movewindow test); also, per X/Open, return "UNKNOWN KEY" when appropriate, rather than "NO KEY NAME".

    • Turn off the cursor from leaveok(TRUE), even in X11; leaveok(FALSE) now calls curs_set(1), regardless of the previous state of the cursor.

    • In the slk area, BUTTON_CLICKED events now translate to function keys, along with the previously recognized BUTTON_PRESSED events. Of course, it should really be checking the events specified by map_button(), which still doesn't work.

    • napms(0) now returns immediately.

    • A unified napms() implementation for DOS -- no longer throttles the CPU when built with any compiler.

    • Allow backspace editing of the nocbreak() buffer.

    • pair_content(0, ...) is valid.

    • There was no check to ensure that the pnoutrefresh() window fit within the screen. It now returns an ERR if it doesn't.

    • In X11, resize_term() must be called with parameters (0, 0), and only when SP->resized is set, else it returns ERR.

    • Copy _bkgd in resize_window(). Patch found on Frederic L. W. Meunier's web site.

    • slk_clear() now removes the buttons completely, as in ncurses.

    • Use the current foreground color for the line attributes (underline, left, right), unless PDC_set_line_color() is explicitly called. After setting the line color, you can reset it to this mode via "PDC_set_line_color(-1)".

    • Removed non-macro implementations of COLOR_PAIR() and PAIR_NUMBER().

    • Dispensed with PDC_chadd() and PDC_chins() -- waddch() and winsch() are now (again) the core functions.

    • Dropped or made static many obsolete, unused, and/or broken functions, including PDC_chg_attrs(), PDC_cursor_on() and _off(), PDC_fix_cursor(), PDC_get_attribute(), PDC_get_cur_col() and _row(), PDC_set_80x25(), PDC_set_cursor_mode(), PDC_set_rows(), PDC_wunderline(), PDC_wleftline(), PDC_wrightline(), XCursesModifierPress() and XCurses_refresh_scrollbar().

    • Obsolete/unused defines: _BCHAR, _GOCHAR, _STOPCHAR, _PRINTCHAR _ENDLINE, _FULLWIN and _SCROLLWIN.

    • Obsolete/unused elements of the WINDOW struct: _pmax*, _lastp*, _lasts*.

    • Obsolete/unused elements of the SCREEN struct: orgcbr, visible_cursor, sizeable, shell, blank, cursor, orig_emulation, font, orig_font, tahead, adapter, scrnmode, kbdinfo, direct_video, video_page, video_seg, video_ofs, bogus_adapter. (Some of these persist outside the SCREEN struct, in the platform directories.) Added mouse_wait and key_code.

    • Removed all the EMALLOC stuff. Straight malloc calls were used elsewhere; it was undocumented outside of comments in curspriv.h; and there are better ways to use a substitute malloc().

    • Single mouse clicks are now reportable on all platforms (not just double-clicks). And in general, mouse event reporting is more consistent across platforms.

    • The mouse cursor no longer appears in full-screen mode in Win32 unless a nonzero mouse event mask is used.

    • ALT-keypad input now works in Win32.

    • In Win32, SetConsoleMode(ENABLE_WINDOW_INPUT) is not useful, and appears to be the source of a four-year-old bug report (hanging in THE) by Phil Smith.

    • Removed the PDC_THREAD_BUILD stuff, which has never worked. For the record: PDCurses is not thread-safe. Neither is ncurses; and the X/Open curses spec explicitly makes it a non-requirement.

    • With the internal compose key system in the X11 port, modifier keys were breaking out of the compose state, making it impossible to type accented capitals, etc. Also, Multi_key is now the default compose key, instead of leaving it undefined by default; and a few more combos are supported.

    • In X11, the first reported mouse event after startup always read as a double-click at position 0, 0. (This bug was introduced in 2.8.)

    • In X11, don't return selection start as a press event. (Shift-click on button 1 is still returned.)

    • In X11, properly handle pasting of high-bit chars. (It was doing an unwanted sign extension.)

    • In X11, BUTTON_MOVED was never returned, although PDC_MOUSE_MOVED was set.

    • The fix in 2.8 for the scroll wheel in X11 wasn't very good -- it did report the events as scroll wheel events, but it doubled them. Here's a proper fix.

    • Changed mouse handling in X11: Simpler translation table, with XCursesPasteSelection() called from XCursesButton() instead of the translation table; require shift with button 1 or 2 for select or paste when mouse events are being reported (as with ncurses), allowing passthrough of simple button 2 events. This fixes the previously unreliable button 2 behavior.

    • Modifier keys are now returned on key up in X11, as in Win32. And in general, modifier key reporting is more consistent across platforms.

    • Modifiers are not returned as keys when a mouse click has occurred since the key press.

    • In BIOS mode (in DOS), count successive identical output bytes, and make only one BIOS call for all of them. This dramatically improves performance.

    • The cursor position was not always updated correctly in BIOS mode.

    • In testcurs, the way the ACS test was written, it would really only work with a) PDCurses (with any compiler), or b) gcc (with any curses). Here's a more portable implementation.

    • Better reporting of mouse events in testcurs.

    • Blank out buffer and num before the scanw() test in testcurs, in case the user just hits enter or etc.; clear the screen after resizing.

    • Allow tuidemo to use the last line.

    • Separate left/right modifier keys are now reported properly in Win32. (Everything was being reported as _R.)

    • Attempts to redirect input in Win32 now cause program exit and an error message, instead of hanging.

    • Dropped support for the Microway NDP compiler.

    • Some modules renamed, rearranged.

    • Fixes for errors and warnings when building with Visual C++ 2005.

    • In MSVC, the panel library didn't work with the DLL.

    • Complete export lists for DLLs.

    • Simplified makefiles; moved common elements to .mif files; better optimization; strip demos when possible.

    • Changed makefile targets of "pdcurses.a/lib" and "panel.a/lib" to $(LIBCURSES) and $(LIBPANEL). Suggestion of Doug Kaufman.

    • Changed "install" target in the makefile to a double-colon rule, to get around a conflict with INSTALL on non-case-sensitive filesystems, such as Mac OS X's HFS+. Reported by Douglas Godfrey et al.

    • Make PDCurses.man dependent on manext. Suggestion of Tiziano Mueller.

    • Set up configure.ac so autoheader works; removed some obsolescent macros. Partly the suggestion of T.M.

    • The X11 port now builds in the x11 directory (including the demos), as with other ports.

    • The X11 port should now build on more 64-bit systems. Partly due to M.H.

    • The default window title and icons for the X11 port are now "PDCurses" instead of "XCurses".

    • Internal functions and variables made static where possible.

    • Adopted a somewhat more consistent naming style: Internal functions with external linkage, and only those, have the prefix "PDC_"; external variables that aren't part of the API use "pdc_"; static functions use ""; and "XC" and "xc_" prefixes are used for functions and variables, respectively, that are shared between both processes in the X11 port. Also eliminated camel casing, where possible.

    • Changed the encoding for non-ASCII characters in comments and documentation from Latin-1 to UTF-8.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_2_8(Apr 11, 2018)

    As with the previous version, you should assume that apps linked against older dynamic versions of the library won't work with this one until recompiled.

    New features:

    • Simpler, faster.

    • Declarations for all supported, standard functions, per the X/Open Curses 4.2 spec, with the notable exception of getch() and ungetch(). You can disable the use of the macro versions by defining NOMACROS before including curses.h (see xmas.c for an example). NOMACROS yields smaller but theoretically slower executables.

    • New functions: vwprintw(), vwscanw(), vw_printw() and vw_scanw(). This completes the list of X/Open 4.2 functions, except for those concerned with attr_t and wide characters. Some (especially the terminfo/termcap functions) aren't yet fully fleshed out, though.

    • Non-macro implementations for COLOR_PAIR(), PAIR_NUMBER(), getbkgd(), mvgetnstr(), mvwgetnstr(), mvhline(), mvvline(), mvwhline(), and mvwvline(). (The macros are still available, too.)

    • newterm() works now, in a limited way -- the parameters are ignored, and only the first invocation will work (i.e., only one SCREEN can be used).

    • start_color() works now -- which is to say, if you don't call it, you'll only get monochrome output. Also, without calling it, the terminal's default colors will be used, where supported (currently only in Win32). This is equivalent to the PDC_ORIGINAL_COLORS behavior introduced in 2.7, except that only the default colors will be used. (PDC_ORIGINAL_COLORS is still available, if you want to combine the use of specific colors and the default colors.)

    • New logic for termname() and longname(): termname() always returns "pdcurses"; longname() returns "PDCurses for [platform] [adapter] [COLOR/MONO]-YxX" (adapter is only defined for DOS and OS/2). This is the first time these functions return anything in Win32.

    • New installation method for XCurses: the header files are placed in a subdirectory "xcurses" within the include directory, rather than being renamed. (But the renamed xcurses.h and xpanel.h are also installed, for backwards compatibility.) curspriv.h and term.h are now available, and existing curses-based code need no longer be edited to use XCurses' curses.h. And with no more need for explicit XCursesExit() calls (see below), your code need not be changed at all to move from another curses implementation to XCurses. It can be as simple as "gcc -I/usr/local/include/xcurses -lXCurses -oprogname progname.c".

    • Combined readme.* into this HISTORY file, and incorporated the old 1.x (PCcurses) history.

    • New functionality for the testcurs demo: ACS character display; menu support for PgUp, PgDn, Home and End; centered menu; and it can now be resized in X.

    • Added modified versions of the rain and worm demos from ncurses.

    Bug fixes and such:

    • Big cleanup of dead and redundant code, including unneeded defines, ifdefs, and structure elements.

    • flushinp() was not implemented for Win32.

    • resetty() was not restoring LINES and COLS.

    • nonl() made '\n' print a line feed without carriage return. This was incorrect.

    • Removed bogus implementation of intrflush().

    • The line-breakout optimization system, disabled by default in 2.7, is removed in 2.8. It simply didn't work, and never has. (The typeahead() function remains, for compatibility, but does nothing.)

    • The declarations for the printw() and scanw() function families were erroneously ifdef'd.

    • Safer printw() calls on platforms that support vsnprintf().

    • Use the native vsscanf() in DJGPP, MinGW and Cygwin.

    • ACS_BLOCK now works in X.

    • Explicit calls to XCursesExit() are no longer needed.

    • XCURSES is now defined automatically if not DOS, OS2 or WIN32.

    • The default icon for XCurses wasn't working (had to remove the focus hint code to fix this). Also, the default title is now "XCurses" instead of "main".

    • Incorrect dimensions (undercounting by two in each direction) were shown while resizing in X.

    • Scroll wheel events were not always correctly reported in X.

    • 32 bits are enough for the "long" chtype, but 64 bits were used on a 64-bit system, wasting memory. Now conditioned on _LP64. This could be faster, too.

    • The short, 16-bit chtype now works with XCurses.

    • Corrected return value for is_linetouched(), is_wintouched(), can_change_color() and isendwin() (bool instead of int).

    • timeout(), wtimeout(), idcok() and immedok() return void.

    • pair_content() takes a short.

    • Replaced incorrect usages of attr_t with chtype. attr_t is still typedef'd, for backwards compatibility. (It's supposed to be used for the WA_*-style functions, which PDCurses doesn't yet support.)

    • Added const where required by the spec, and in other appropriate places.

    • Removed PDC_usleep(). napms() is now the core delay routine.

    • Fixed poll() support in napms().

    • Various changes to the internal PDC_* functions -- don't depend on these, and don't use them unless you absolutely have to.

    • Some routines accessed window structures in their variable declarations, before checking for a NULL window pointer.

    • Dropped support for the undocumented PDC_FULL_DISPLAY, wtitle(), and PDC_print().

    • Cleaned up remaining warnings.

    • Reduced unnecessary #include directives -- speeds up compilation.

    • Fix for demos build in Borland/DOS -- the makefile in 2.7 didn't specify the memory model. Reported by Erwin Waterlander.

    • Simplified the makefiles; e.g., some now build each demo in a single step, and Watcom no longer uses demos.lnk. Also, the demo exes are now stripped when possible; maximum compression used for archives built by the makefiles; xcurses-config removed as part of "make distclean"; and I tweaked optimization for some platforms.

    • Reverted to /usr/local/ as default installation directory for XCurses.

    • Upgraded to autoconf 2.59... instantly doubling the size of the configure script. Ah well. Otherwise, simplified the build system.

    • Dropped support for pre-ANSI compilers. (It hasn't worked since at least version 2.4, anyway.)

    • Revised and, I hope, clarified the boilerplate and other comments.

    • Simplified logging and RCS ids; added RCS ids where missing.

    • Consistent formatting for all code, approximately equivalent to "indent -kr -i8 -bl -bli0", with adjustments for 80 columns.

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_2_7(Apr 11, 2018)


    Hello all. As of a few weeks ago, I'm the new maintainer for PDCurses. Here's a brief summary of changes in this release. (More details are available in the CVS log and trackers on SourceForge.)


    • Functions: delscreen(), getattrs(), has_key(), slk_color(), wcolor_set(), wtimeout().

    • Macros: color_set(), mvhline(), mvvline(), mvwgetnstr(), mvwhline(), mvwvline(), timeout(), wresize().

    • Stub implementations of terminfo functions (including a term.h).

    • More stubs for compatibility: filter(), getwin(), putwin(), noqiflush(), qiflush(), scr_dump(), scr_init(), scr_restore(), scr_set(), use_env(), vidattr(), vidputs().

    • The terminal's default colors are used as curses' default colors when the environment variable "PDC_ORIGINAL_COLORS" is set to any value (Win32 only at the moment).

    • Simplified build system.

    • Replaced PDC_STATIC_BUILD with its opposite, PDC_DLL_BUILD (see .mak files for more info).

    • Minimal implementation of color_content() -- no longer a stub.

    • Added the remaining ACS defines (ACS_S3, ACS_BBSS, etc.) for DOS/OS2/Win; "enhanced" versions of existing ACS characters used.

    • Support for scroll wheels.

    • Support for Pacific C.


    • Builds correctly (including demos) on all tested platforms (see below); nearly all compiler warnings have been cleaned up; the ptest demo is built on all platforms; "clean" targets are improved.

    • The ability to build ncurses_tests has been restored (see demos dir).

    • Line-breakout optimization now defaults to off (equivalent to "typeahead(-1)"), so output is not interrupted by keystrokes (it's supposed to resume on the next refresh(), which wasn't working).

    • Implicit wrefresh() in wgetch() was not being invoked in nodelay mode.

    • subpad() was erroneously offsetting from the origin coordinates of the parent pad (which are always -1,-1).

    • In wborder(), whline(), and wvline(), the current (wattrset) attribute was being used, but not the current background (wbkgd).

    • Allow Russian 'r' character ASCII 0xe0 to be returned.

    • termattrs() now also returns A_UNDERLINE, A_REVERSE.

    • In Win32, with large scrollback buffers set, there was an unwanted "scrollup" effect on startup.

    • Revamped keyboard handling for Win32.

    • New screen resize method for Win32.

    • napms(), delay_output(), etc. now work with Cygwin.

    • curs_set(0) wasn't working in Win32 in full-screen (ALT-ENTER) mode -- the cursor stayed on.

    • The A_REVERSE attribute was broken in XCurses.

    • On 64-bit systems, XCurses was ignoring every other keystroke.

    • Added focus hints for XCurses.

    • Demos (except for tuidemo) once again have their proper titles in XCurses (using Xinitscr() instead of the obsolete XCursesProgramName).

    • The 16-bit chtype is a working option again (by removing #define CHTYPE_LONG from curses.h), except in XCurses. It's not recommended; but if your needs are limited, it still works.

    • Reset screen size in resetty() under DOS, as in Win32 and OS/2.

    • Changes for cursor size under DOS.

    • Automatic setting of BIOS mode for CGA under DOS now works.

    • The cursor is now always updated in PDC_gotoxy(); this fixes the problem of missing characters in BIOS mode.

    • Macros nocbreak(), cbreak(), nocrmode(), crmode(), nodelay(), nl() and nonl() now return OK.

    • ERR and OK are now defined as -1 and 0, respectively, for compatibility with other curses implementations -- note that this change is not binary compatible; you'll have to rebuild programs that use shared/dynamic libraries.

    • Added "const" to prototypes where appropriate.

    • Miscellaneous code cleanup.


    • Walter Briscoe
    • Jean-Pierre Demailly
    • Ruslan Fedyarov
    • Warren Gay
    • Florian Grosse-Coosmann
    • Vladimir Kokovic
    • Matt Maloy
    • K.H. Man
    • Michael Ryazanov
    • Ron Thibodeau
    • Alexandr Zamaraev

    and of course, MARK HESSLING, for his over 13 years of service as the maintainer of PDCurses. Plus, thanks to all who've reported bugs or requested features. Apologies to anyone I've forgotten.

    I've tested this version on Turbo C++ 3.0 and Borland C++ 3.1 for DOS; DJGPP 2.X; Open Watcom 1.3 for DOS (16 and 32-bit), Windows and OS/2; EMX 0.9d and the "newgcc" version of EMX; Borland C++ 5.5 for Windows; recent versions of MinGW, Cygwin, LCC-Win32 and Microsoft Visual C++; and gcc under several flavors of Linux, Mac OS X, *BSD and Solaris.

    -- William McBrine

    Source code(tar.gz)
    Source code(zip)
  • PDCurses_2_6(Apr 11, 2018)


    This release of PDCurses includes the following changes:


    • Allow accented characters on Win32 platform when run on non-English keyboards.

    • Allow "special" characters like Ctrl-S, Ctrl-Q under OS/2 to be returned.

    • Some bugs with halfdelay() fixed by William McBrine.

    • pechochar() should now work correctly.

    • redrawwin() macro in curses.h was incorrect - fixed by Alberto Ornaghi

    • Don't include "special" characters like KEY_SHIFT_L to be returned in getnstr() family. Bug 542913

    • Entering TAB in wgetnstr() no longer exceeds requested buffer size. Bug 489233

    • Fixed bug 550066, scrollok() and pads. Also beep() called when buffer exceeded. Bug 562041.

    • Reverse video of X11 selection reinstated. Pablo Garcia Abio??

    • Right Alt modifier now works like left Alt modifier under Win32

    • Add support for all libXaw replacement libraries with Scrollbar bug. Note that for this to work, you still have to change the libXaw replacement libraries to fix the bug :-(

    • Don't trap signals in XCurses if calling application has ignored them. Change by Frank Heckenbach.

    • Bug reports from Warren W. Gay:

      • Fix termattrs() to return A_REVERSE and A_BLINK on all platforms.
      • Fix definition of getsyx() and setsyx() to be consistent with ncurses. Bug 624424.
      • Fix definition of echo() and noecho(). Bug 625001.
      • Fix definition of keypad() and leaveok(). Bug 632653.
      • Missing panel_hidden() prototype. Bug 649320.
    • Fixed bug with calling def_prog_mode(), resize_term(), reset_prog_mode(); the resize details were being lost.


    • Clipboard support now available on DOS platform, but handled internally to the currently running process.

    • New X11 resource: textCursor, allows the text cursor to be specified as a vertical bar, or the standard horizontal bar. Thanks to Frank Heckenbach for the suggestion.


    • lcc-win32 now works correctly
    Source code(tar.gz)
    Source code(zip)
  • PDCurses_2_5(Apr 11, 2018)


    This release of PDCurses includes the following changes:

    • Set BASE address for Win32 DLL

    • Add KEY_SUP and KEY_SDOWN.

    • Add PDC_set_line_color()

    • Add blink support as bold background

    • Add bold colors

    • Add getbkgd() macro

    • Add new PDC functions for adding underline, overline, leftline and rightline

    • Add support for shifted keypad keys.

    • Allow more keypad keys to work under Win32

    • Change Win32 and OS/2 DLL name to curses.dll

    • Change example resources to allow overriding from the command line

    • Changes for building cleanly on OS/2

    • Changes to handle building XCurses under AIX

    • Check if prefresh() and pnoutrefresh() parameters are valid.

    • Ensure build/install works from any directory

    • Handle platforms where X11 headers do not typedef XPointer.

    • Mention that Flexos is likely out-of-date.

    • Pass delaytenths to XCurses_rawgetch()

    • Remove boldFont

    • Updates for cursor blinking and italic.


    • Fix bug with getting Win32 clipboard contents. Added new PDC_freeclipboard() function.

    • Fix bug with halfdelay()

    • Fix bug with mouse interrupting programs that are not trapping mouse events under Win32.

    • Fix return value from curs_set()

    • Reverse the left and right pointing bars in ALT_CHARSET


    • Add QNX-RTP port
    Source code(tar.gz)
    Source code(zip)
  • PDCurses_2_4(Apr 11, 2018)


    This release of PDCurses includes the following changes:

    • full support of X11 selection handling

    • removed the need for the cursos2.h file

    • enabled the "shifted" key on the numeric keypad

    • added native clipboard support for X11, Win32 and OS/2

    • added extra functions for obtaining internal PDCurses status

    • added clipboard and key modifier tests in testcurs.c

    • fixes for panel library

    • key modifiers pressed by themselves are now returned as keys: KEY_SHIFT_L KEY_SHIFT_R KEY_CONTROL_L KEY_CONTROL_R KEY_ALT_L KEY_ALT_R This works on Win32 and X11 ports only

    • Added X11 shared library support

    • Added extra slk formats supported by ncurses

    • Fixed bug with resizing the terminal when slk were on.

    • Changed behavior of slk_attrset(), slk_attron() slk_attroff() functions to work more like ncurses.


    • some minor bug and portability fixes were included in this release


    • PDC_getclipboard() and PDC_setclipboard() for accessing the native clipboard (X11, Win32 and OS/2)

    • PDC_set_title() for setting the title of the window (X11 and Win32 only)

    • PDC_get_input_fd() for getting the file handle of the PDCurses input

    • PDC_get_key_modifiers() for getting the keyboard modifier settings at the time of the last (w)getch()

    • Xinitscr() (only for X11 port) which allows standard X11 switches to be passed to the application


    • MingW32 GNU compiler under Win95/NT

    • Cygnus Win32 GNU compiler under Win95/NT

    • Borland C++ for OS/2 1.0+

    • lcc-win32 compiler under Win95/NT

    ACKNOWLEDGEMENTS: (for this release)

    • Georg Fuchs for various changes.
    • Juan David Palomar for pointing out getnstr() was not implemented.
    • William McBrine for fix to allow black/black as valid color pair.
    • Peter Preus for pointing out the missing bccos2.mak file.
    • Laura Michaels for a couple of bug fixes and changes required to support Mingw32 compiler.
    • Frank Heckenbach for PDC_get_input_fd() and some portability fixes and the fixes for panel library.
    • Matthias Burian for the lcc-win32 compiler support.
    Source code(tar.gz)
    Source code(zip)
William McBrine
William McBrine
A simple header-only C++ argument parser library. Supposed to be flexible and powerful, and attempts to be compatible with the functionality of the Python standard argparse library (though not necessarily the API).

args Note that this library is essentially in maintenance mode. I haven't had the time to work on it or give it the love that it deserves. I'm not add

Taylor C. Richberger 896 Aug 31, 2021
A library for interactive command line interfaces in modern C++

cli A cross-platform header only C++14 library for interactive command line interfaces (Cisco style) Features Header only Cross-platform (linux and wi

Daniele Pallastrelli 888 Dec 31, 2022
Library for writing text-based user interfaces

IMPORTANT This library is no longer maintained. It's pretty small if you have a big project that relies on it, just maintain it yourself. Or look for

null 1.9k Dec 22, 2022
Small header only C++ library for writing multiplatform terminal applications

Terminal Terminal is small header only library for writing terminal applications. It works on Linux, macOS and Windows (in the native cmd.exe console)

Jupyter Xeus 274 Jan 2, 2023
A single header C++ library for parsing command line arguments and options with minimal amount of code

Quick Arg Parser Tired of unwieldy tools like getopt or argp? Quick Arg Parser is a single header C++ library for parsing command line arguments

null 47 Dec 21, 2022
A command parsing library

LampOpt操作文档 概述 LampOpt是一个基于C++的控制台命令解析库,优点是体型小、适应全平台、方便易用。 引用 可选择在IDE中直接在引用目录中添加odt.h,或直接与需编译文件放在同一目录下,并引用: #include "odt.h" 使用 odt.h头文件内定义了一个名为LampOp

东灯 1 Aug 21, 2022
null 77 Dec 27, 2022
A C, C++ and Rust library to draw graphics with pixels in the terminal

A library to draw graphics with pixels in the terminal Who needs a GUI when you have a terminal ? Building To generate libpluto.a, run: $ make To ins

null 69 Nov 7, 2022
A (relatively) small node library to clone and pull git repositories in a standalone manner thanks to libgit2, powered by WebAssembly and Emscripten

simple-git-wasm A (relatively) small node library to clone and pull git repositories in a standalone manner thanks to libgit2, powered by WebAssembly

Powercord 21 Oct 16, 2022
A single-class C++ library for reading animated GIF files

EasyGifReader EasyGifReader is a single-class C++ library that aims to simplify reading an animated GIF file. It is built on top of and depends on gif

Viktor Chlumský 9 Nov 17, 2022
Library for creating terminal applications with text-based widgets

Library for creating terminal applications with text-based widgets FINAL CUT is a C++ class library and widget toolkit with full mouse support for cre

Markus Gans 724 Dec 30, 2022
C++ Library for pulling system and hardware information, without hitting the command line.

infoware C++ Library for pulling system and hardware information, without hitting the command line. Requirements No non-built-in ones by default. Some

The Phantom Derpstorm 323 Dec 23, 2022
Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.

What is it? Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers. The Java version is

Google 14.5k Dec 30, 2022
Cut down and minimalistic C++ string formatting library

nanofmt https://github.com/potatoengine/nanofmt License Copyright (c) Sean Middleditch and contributors nanofmt is released under the MIT license. nan

Sean Middleditch 12 Nov 7, 2022
The gflags package contains a C++ library that implements commandline flags processing.

The gflags package contains a C++ library that implements commandline flags processing. It includes built-in support for standard types such as string and the ability to define flags in the source file in which they are used. Online documentation available at:

gflags 2.5k Jan 4, 2023
This is a simple CLI interface helper library for C.

LIBCCLI This is a very simple shell like interface for CLI activities. More will be added to this, but for now, this is the basic idea:

Steven Rostedt 40 Sep 24, 2022
udmp-parser: A Windows user minidump C++ parser library.

udmp-parser: A Windows user minidump C++ parser library. This is a cross-platform (Windows / Linux / OSX / x86 / x64) C++ library that parses Windows

Axel Souchet 95 Dec 13, 2022
✔️The smallest header-only GUI library(4 KLOC) for all platforms

Welcome to GUI-lite The smallest header-only GUI library (4 KLOC) for all platforms. 中文 Lightweight ✂️ Small: 4,000+ lines of C++ code, zero dependenc

null 6.6k Jan 8, 2023
Dark Sky DOS Game (curses port)

Dark Sky This is a port of the original Dark Sky by Ben "Bent"

Jamie 2 Apr 6, 2022