---
name: "curs_threads"
section: "3ncurses"
platform: "linux"
package: "ncurses-doc"
version: "6.4-4"
release: "Debian 12 (Bookworm)"
platforms: ["linux"]
url: "https://new.carta.tech/threads/3ncurses"
---

# curs\_threads(3ncurses)

curses thread support

Part of [threads(3ncurses)](/threads/3ncurses.md).

## NAME

**curs\_threads** - **curses** thread support

## SYNOPSIS

**#include \<curses.h\>**

**typedef int (\*NCURSES\_WINDOW\_CB)(WINDOW \*, void \*);**\
 **typedef int (\*NCURSES\_SCREEN\_CB)(SCREEN \*, void \*);**

**int get\_escdelay(void);**\
 **int set\_escdelay(int** *ms***);**\
 **int set\_tabsize(int** *cols***);**

**int use\_screen(SCREEN \****scr***, NCURSES\_SCREEN\_CB** *func***, void \****data***);**\
 **int use\_window(WINDOW \****win***, NCURSES\_WINDOW\_CB** *func***, void \****data***);**\

## DESCRIPTION

This implementation can be configured to provide rudimentary support for multi-threaded applications. This makes a different set of libraries, e.g., **libncursest** since the binary interfaces are different.

Rather than modify the interfaces to pass a thread specifier to each function, it adds a few functions which can be used in any configuration which hide the mutex's needed to prevent concurrent use of the global variables when configured for threading.

In addition to forcing access to members of the **WINDOW** structure to be via functions (see **opaque**(3NCURSES)), it makes functions of the common global variables, e.g., COLORS, COLOR\_PAIRS, COLS, ESCDELAY, LINES, TABSIZE curscr, newscr and ttytype. Those variables are maintained as read-only values, stored in the **SCREEN** structure.

Even this is not enough to make a thread-safe application using curses. A multi-threaded application would be expected to have threads updating separate windows (within the same device), or updating on separate screens (on different devices). Also, a few of the global variables are considered writable by some applications. The functions described here address these special situations.

The ESCDELAY and TABSIZE global variables are modified by some applications. To modify them in any configuration, use the **set\_escdelay** or **set\_tabsize** functions. Other global variables are not modifiable.

The **get\_escdelay** function returns the value for ESCDELAY.

The **use\_window** and **use\_screen** functions provide coarse granularity mutexes for their respective **WINDOW** and **SCREEN** parameters, and call a user-supplied function, passing it a *data* parameter, and returning the value from the user-supplied function to the application.

### USAGE

All of the ncurses library functions assume that the locale is not altered during operation. In addition, they use data which is maintained within a hierarchy of scopes.

- •

  global data, e.g., used in the low-level terminfo or termcap interfaces.

- •

  terminal data, e.g., associated with a call to **set\_curterm**. The terminal data are initialized when screens are created.

- •

  screen data, e.g., associated with a call to **newterm** or **initscr**.

- •

  window data, e.g., associated with a call to **newwin** or **subwin**. Windows are associated with screens. Pads are not necessarily associated with a particular screen.

-

  Most curses applications operate on one or more windows within a single screen.

- •

  reentrant, i.e., it uses only the data passed as parameters.

This table lists the scope of data used for each symbol in the ncurses library when it is configured to support threading:

| | |
| --- | --- |
| Symbol | Scope |
| BC | global |
| COLORS | screen (readonly) |
| COLOR\_PAIR | reentrant |
| COLOR\_PAIRS | screen (readonly) |
| COLS | screen (readonly) |
| ESCDELAY | screen (readonly, see **set\_escdelay**) |
| LINES | screen (readonly) |
| PAIR\_NUMBER | reentrant |
| PC | global |
| SP | global |
| TABSIZE | screen (readonly) |
| UP | global |
| acs\_map | screen (readonly) |
| add\_wch | window (stdscr) |
| add\_wchnstr | window (stdscr) |
| add\_wchstr | window (stdscr) |
| addch | window (stdscr) |
| addchnstr | window (stdscr) |
| addchstr | window (stdscr) |
| addnstr | window (stdscr) |
| addnwstr | window (stdscr) |
| addstr | window (stdscr) |
| addwstr | window (stdscr) |
| assume\_default\_colors | screen |
| attr\_get | window (stdscr) |
| attr\_off | window (stdscr) |
| attr\_on | window (stdscr) |
| attr\_set | window (stdscr) |
| attroff | window (stdscr) |
| attron | window (stdscr) |
| attrset | window (stdscr) |
| baudrate | screen |
| beep | screen |
| bkgd | window (stdscr) |
| bkgdset | window (stdscr) |
| bkgrnd | window (stdscr) |
| bkgrndset | window (stdscr) |
| boolcodes | global (readonly) |
| boolfnames | global (readonly) |
| boolnames | global (readonly) |
| border | window (stdscr) |
| border\_set | window (stdscr) |
| box | window (stdscr) |
| box\_set | window (stdscr) |
| can\_change\_color | terminal |
| cbreak | screen |
| chgat | window (stdscr) |
| clear | window (stdscr) |
| clearok | window |
| clrtobot | window (stdscr) |
| clrtoeol | window (stdscr) |
| color\_content | screen |
| color\_set | window (stdscr) |
| copywin | window locks(source, target) |
| cur\_term | terminal |
| curs\_set | screen |
| curscr | screen (readonly) |
| curses\_version | global (readonly) |
| def\_prog\_mode | terminal |
| def\_shell\_mode | terminal |
| define\_key | screen |
| del\_curterm | screen |
| delay\_output | screen |
| delch | window (stdscr) |
| deleteln | window (stdscr) |
| delscreen | global locks(screenlist, screen) |
| delwin | global locks(windowlist) |
| derwin | screen |
| doupdate | screen |
| dupwin | screen locks(window) |
| echo | screen |
| echo\_wchar | window (stdscr) |
| echochar | window (stdscr) |
| endwin | screen |
| erase | window (stdscr) |
| erasechar | window (stdscr) |
| erasewchar | window (stdscr) |
| filter | global |
| flash | terminal |
| flushinp | screen |
| get\_wch | screen (input-operation) |
| get\_wstr | screen (input-operation) |
| getattrs | window |
| getbegx | window |
| getbegy | window |
| getbkgd | window |
| getbkgrnd | window |
| getcchar | reentrant |
| getch | screen (input-operation) |
| getcurx | window |
| getcury | window |
| getmaxx | window |
| getmaxy | window |
| getmouse | screen (input-operation) |
| getn\_wstr | screen (input-operation) |
| getnstr | screen (input-operation) |
| getparx | window |
| getpary | window |
| getstr | screen (input-operation) |
| getwin | screen (input-operation) |
| halfdelay | screen |
| has\_colors | terminal |
| has\_ic | terminal |
| has\_il | terminal |
| has\_key | screen |
| hline | window (stdscr) |
| hline\_set | window (stdscr) |
| idcok | window |
| idlok | window |
| immedok | window |
| in\_wch | window (stdscr) |
| in\_wchnstr | window (stdscr) |
| in\_wchstr | window (stdscr) |
| inch | window (stdscr) |
| inchnstr | window (stdscr) |
| inchstr | window (stdscr) |
| init\_color | screen |
| init\_pair | screen |
| initscr | global locks(screenlist) |
| innstr | window (stdscr) |
| innwstr | window (stdscr) |
| ins\_nwstr | window (stdscr) |
| ins\_wch | window (stdscr) |
| ins\_wstr | window (stdscr) |
| insch | window (stdscr) |
| insdelln | window (stdscr) |
| insertln | window (stdscr) |
| insnstr | window (stdscr) |
| insstr | window (stdscr) |
| instr | window (stdscr) |
| intrflush | terminal |
| inwstr | window (stdscr) |
| is\_cleared | window |
| is\_idcok | window |
| is\_idlok | window |
| is\_immedok | window |
| is\_keypad | window |
| is\_leaveok | window |
| is\_linetouched | window |
| is\_nodelay | window |
| is\_notimeout | window |
| is\_scrollok | window |
| is\_syncok | window |
| is\_term\_resized | terminal |
| is\_wintouched | window |
| isendwin | screen |
| key\_defined | screen |
| key\_name | global (static data) |
| keybound | screen |
| keyname | global (static data) |
| keyok | screen |
| keypad | window |
| killchar | terminal |
| killwchar | terminal |
| leaveok | window |
| longname | screen |
| mcprint | terminal |
| meta | screen |
| mouse\_trafo | window (stdscr) |
| mouseinterval | screen |
| mousemask | screen |
| move | window (stdscr) |
| mvadd\_wch | window (stdscr) |
| mvadd\_wchnstr | window (stdscr) |
| mvadd\_wchstr | window (stdscr) |
| mvaddch | window (stdscr) |
| mvaddchnstr | window (stdscr) |
| mvaddchstr | window (stdscr) |
| mvaddnstr | window (stdscr) |
| mvaddnwstr | window (stdscr) |
| mvaddstr | window (stdscr) |
| mvaddwstr | window (stdscr) |
| mvchgat | window (stdscr) |
| mvcur | screen |
| mvdelch | window (stdscr) |
| mvderwin | window (stdscr) |
| mvget\_wch | screen (input-operation) |
| mvget\_wstr | screen (input-operation) |
| mvgetch | screen (input-operation) |
| mvgetn\_wstr | screen (input-operation) |
| mvgetnstr | screen (input-operation) |
| mvgetstr | screen (input-operation) |
| mvhline | window (stdscr) |
| mvhline\_set | window (stdscr) |
| mvin\_wch | window (stdscr) |
| mvin\_wchnstr | window (stdscr) |
| mvin\_wchstr | window (stdscr) |
| mvinch | window (stdscr) |
| mvinchnstr | window (stdscr) |
| mvinchstr | window (stdscr) |
| mvinnstr | window (stdscr) |
| mvinnwstr | window (stdscr) |
| mvins\_nwstr | window (stdscr) |
| mvins\_wch | window (stdscr) |
| mvins\_wstr | window (stdscr) |
| mvinsch | window (stdscr) |
| mvinsnstr | window (stdscr) |
| mvinsstr | window (stdscr) |
| mvinstr | window (stdscr) |
| mvinwstr | window (stdscr) |
| mvprintw | window (stdscr) |
| mvscanw | screen |
| mvvline | window (stdscr) |
| mvvline\_set | window (stdscr) |
| mvwadd\_wch | window |
| mvwadd\_wchnstr | window |
| mvwadd\_wchstr | window |
| mvwaddch | window |
| mvwaddchnstr | window |
| mvwaddchstr | window |
| mvwaddnstr | window |
| mvwaddnwstr | window |
| mvwaddstr | window |
| mvwaddwstr | window |
| mvwchgat | window |
| mvwdelch | window |
| mvwget\_wch | screen (input-operation) |
| mvwget\_wstr | screen (input-operation) |
| mvwgetch | screen (input-operation) |
| mvwgetn\_wstr | screen (input-operation) |
| mvwgetnstr | screen (input-operation) |
| mvwgetstr | screen (input-operation) |
| mvwhline | window |
| mvwhline\_set | window |
| mvwin | window |
| mvwin\_wch | window |
| mvwin\_wchnstr | window |
| mvwin\_wchstr | window |
| mvwinch | window |
| mvwinchnstr | window |
| mvwinchstr | window |
| mvwinnstr | window |
| mvwinnwstr | window |
| mvwins\_nwstr | window |
| mvwins\_wch | window |
| mvwins\_wstr | window |
| mvwinsch | window |
| mvwinsnstr | window |
| mvwinsstr | window |
| mvwinstr | window |
| mvwinwstr | window |
| mvwprintw | window |
| mvwscanw | screen |
| mvwvline | window |
| mvwvline\_set | window |
| napms | reentrant |
| newpad | global locks(windowlist) |
| newscr | screen (readonly) |
| newterm | global locks(screenlist) |
| newwin | global locks(windowlist) |
| nl | screen |
| nocbreak | screen |
| nodelay | window |
| noecho | screen |
| nofilter | global |
| nonl | screen |
| noqiflush | terminal |
| noraw | screen |
| notimeout | window |
| numcodes | global (readonly) |
| numfnames | global (readonly) |
| numnames | global (readonly) |
| ospeed | global |
| overlay | window locks(source, target) |
| overwrite | window locks(source, target) |
| pair\_content | screen |
| pecho\_wchar | screen |
| pechochar | screen |
| pnoutrefresh | screen |
| prefresh | screen |
| printw | window |
| putp | global |
| putwin | window |
| qiflush | terminal |
| raw | screen |
| redrawwin | window |
| refresh | screen |
| reset\_prog\_mode | screen |
| reset\_shell\_mode | screen |
| resetty | terminal |
| resize\_term | screen locks(windowlist) |
| resizeterm | screen |
| restartterm | screen |
| ripoffline | global (static data) |
| savetty | terminal |
| scanw | screen |
| scr\_dump | screen |
| scr\_init | screen |
| scr\_restore | screen |
| scr\_set | screen |
| scrl | window (stdscr) |
| scroll | window |
| scrollok | window |
| set\_curterm | screen |
| set\_escdelay | screen |
| set\_tabsize | screen |
| set\_term | global locks(screenlist, screen) |
| setcchar | reentrant |
| setscrreg | window (stdscr) |
| setupterm | global |
| slk\_attr | screen |
| slk\_attr\_off | screen |
| slk\_attr\_on | screen |
| slk\_attr\_set | screen |
| slk\_attroff | screen |
| slk\_attron | screen |
| slk\_attrset | screen |
| slk\_clear | screen |
| slk\_color | screen |
| slk\_init | screen |
| slk\_label | screen |
| slk\_noutrefresh | screen |
| slk\_refresh | screen |
| slk\_restore | screen |
| slk\_set | screen |
| slk\_touch | screen |
| slk\_wset | screen |
| standend | window |
| standout | window |
| start\_color | screen |
| stdscr | screen (readonly) |
| strcodes | global (readonly) |
| strfnames | global (readonly) |
| strnames | global (readonly) |
| subpad | window |
| subwin | window |
| syncok | window |
| term\_attrs | screen |
| termattrs | screen |
| termname | terminal |
| tgetent | global |
| tgetflag | global |
| tgetnum | global |
| tgetstr | global |
| tgoto | global |
| tigetflag | terminal |
| tigetnum | terminal |
| tigetstr | terminal |
| timeout | window (stdscr) |
| touchline | window |
| touchwin | window |
| tparm | global (static data) |
| tputs | screen |
| trace | global (static data) |
| ttytype | screen (readonly) |
| typeahead | screen |
| unctrl | screen |
| unget\_wch | screen (input-operation) |
| ungetch | screen (input-operation) |
| ungetmouse | screen (input-operation) |
| untouchwin | window |
| use\_default\_colors | screen |
| use\_env | global (static data) |
| use\_extended\_names | global (static data) |
| use\_legacy\_coding | screen |
| use\_screen | global locks(screenlist, screen) |
| use\_window | global locks(windowlist, window) |
| vid\_attr | screen |
| vid\_puts | screen |
| vidattr | screen |
| vidputs | screen |
| vline | window (stdscr) |
| vline\_set | window (stdscr) |
| vw\_printw | window |
| vw\_scanw | screen |
| vwprintw | window |
| vwscanw | screen |
| wadd\_wch | window |
| wadd\_wchnstr | window |
| wadd\_wchstr | window |
| waddch | window |
| waddchnstr | window |
| waddchstr | window |
| waddnstr | window |
| waddnwstr | window |
| waddstr | window |
| waddwstr | window |
| wattr\_get | window |
| wattr\_off | window |
| wattr\_on | window |
| wattr\_set | window |
| wattroff | window |
| wattron | window |
| wattrset | window |
| wbkgd | window |
| wbkgdset | window |
| wbkgrnd | window |
| wbkgrndset | window |
| wborder | window |
| wborder\_set | window |
| wchgat | window |
| wclear | window |
| wclrtobot | window |
| wclrtoeol | window |
| wcolor\_set | window |
| wcursyncup | screen (affects window plus parents) |
| wdelch | window |
| wdeleteln | window |
| wecho\_wchar | window |
| wechochar | window |
| wenclose | window |
| werase | window |
| wget\_wch | screen (input-operation) |
| wget\_wstr | screen (input-operation) |
| wgetbkgrnd | window |
| wgetch | screen (input-operation) |
| wgetdelay | window |
| wgetn\_wstr | screen (input-operation) |
| wgetnstr | screen (input-operation) |
| wgetparent | window |
| wgetscrreg | window |
| wgetstr | screen (input-operation) |
| whline | window |
| whline\_set | window |
| win\_wch | window |
| win\_wchnstr | window |
| win\_wchstr | window |
| winch | window |
| winchnstr | window |
| winchstr | window |
| winnstr | window |
| winnwstr | window |
| wins\_nwstr | window |
| wins\_wch | window |
| wins\_wstr | window |
| winsch | window |
| winsdelln | window |
| winsertln | window |
| winsnstr | window |
| winsstr | window |
| winstr | window |
| winwstr | window |
| wmouse\_trafo | window |
| wmove | window |
| wnoutrefresh | screen |
| wprintw | window |
| wredrawln | window |
| wrefresh | screen |
| wresize | window locks(windowlist) |
| wscanw | screen |
| wscrl | window |
| wsetscrreg | window |
| wstandend | window |
| wstandout | window |
| wsyncdown | screen (affects window plus parents) |
| wsyncup | screen (affects window plus parents) |
| wtimeout | window |
| wtouchln | window |
| wunctrl | global (static data) |
| wvline | window |
| wvline\_set | window |

## RETURN VALUE

These functions all return **TRUE** or **FALSE**, except as noted.

## NOTES

Both a macro and a function are provided for each name.

## PORTABILITY

These routines are specific to ncurses. They were not supported on Version 7, BSD or System V implementations. It is recommended that any code depending on ncurses extensions be conditioned using NCURSES\_VERSION.

## SEE ALSO

**ncurses**(3NCURSES), **opaque**(3NCURSES), **curses\_variables**(3NCURSES).
