---
name: "curs_border"
section: "3x"
platform: "linux"
package: "ncurses"
version: "6.6-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/curs_border/3x"
---

# curs\_border(3x)

draw borders and lines in a curses window of characters

## NAME

**border**, **wborder**, **box**, **hline**, **whline**, **vline**, **wvline**, **mvhline**, **mvwhline**, **mvvline**, **mvwvline** - draw borders and lines in a *curses* window of characters

## SYNOPSIS

```
#include <curses.h>
```

**int border(chtype** *ls***, chtype** *rs***, chtype** *ts***, chtype** *bs***,**\
       **chtype** *tl***, chtype** *tr***, chtype** *bl***, chtype** *br***);** **int wborder(WINDOW \****win***, chtype** *ls***, chtype** *rs***,**\
       **chtype** *ts***, chtype** *bs***, chtype** *tl***, chtype** *tr***,**\
       **chtype** *bl***, chtype** *br***);**

**int box(WINDOW \****win***, chtype** *verch***, chtype** *horch***);**

**int hline(chtype** *ch***, int** *n***);** **int whline(WINDOW \****win***, chtype** *ch***, int** *n***);** **int mvhline(int** *y***, int** *x***, chtype** *ch***, int** *n***);** **int mvwhline(WINDOW \****win***, int** *y***, int** *x***, chtype** *ch***, int** *n***);**

**int vline(chtype** *ch***, int** *n***);** **int wvline(WINDOW \****win***, chtype** *ch***, int** *n***);** **int mvvline(int** *y***, int** *x***, chtype** *ch***, int** *n***);** **int mvwvline(WINDOW \****win***, int** *y***, int** *x***, chtype** *ch***, int** *n***);**

## DESCRIPTION

**wborder** and **border** draw a box at the edges of the specified window or **stdscr**, respectively. Each *chtype* argument corresponds to a geometric component of the border as follows:

*ls* - left side,\
 *rs* - right side,\
 *ts* - top side,\
 *bs* - bottom side,\
 *tl* - top left-hand corner,\
 *tr* - top right-hand corner,\
 *bl* - bottom left-hand corner, and\
 *br* - bottom right-hand corner.

If any *chtype* argument is **0**, then *curses* uses forms-drawing characters (see **addch**(3X)) in the following correspondence:

**ACS\_VLINE**,\
 **ACS\_VLINE**,\
 **ACS\_HLINE**,\
 **ACS\_HLINE**,\
 **ACS\_ULCORNER**,\
 **ACS\_URCORNER**,\
 **ACS\_LLCORNER**, and\
 **ACS\_LRCORNER**.

**box(***win***,** *verch***,** *horch***)** is shorthand for “**wborder(** *win***,** *verch***,** *verch***,** *horch***,** *horch***,** **0, 0, 0, 0)**”.

**whline** draws a horizontal line of *ch* from left to right, and **wvline** a vertical one from top to bottom, stopping once *n* characters have been drawn or upon reaching the boundary of *win*. These functions do not update the cursor position (beyond any motion directed by their “mv” variants). **ncurses**(3X) describes the variants of these functions.

## RETURN VALUE

These functions return **OK** on success and **ERR** on failure.

In *ncurses*,

- •

  these functions fail if the screen is not initialized; and

- •

  functions taking a *WINDOW* pointer argument fail if *win* is a null pointer.

Functions prefixed with “mv” first perform cursor movement and fail if the position (*y*, *x*) is outside the window boundaries.

## NOTES

Unusually, there is no **wbox** function; **box** behaves as one would expect **wbox** to, accepting a *WINDOW* pointer argument.

**border**, **box**, **hline**, **mvhline**, **mvwhline**, **vline**, **mvvline**, and **mvwvline** may be implemented as macros.

Borders drawn by these functions are *interior* borders.

## PORTABILITY

These functions are described in X/Open Curses Issue 4. It specifies no error conditions for them.

SVr4 documentation says that these functions return *OK* “or a non-negative integer if *immedok()* is set”, referring to the return value from *wrefresh*, which in SVr4 returns a count of characters written to the window if its *immedok* property is set; in *ncurses*, it does not.

BSD *curses* drew boxes with *horch* in *every* character cell of the top and bottom lines of the window, whereas SVr3.1 and later *curses*, because its *box* wrapped *wborder*, used the default corner characters.

## HISTORY

4BSD (1980) introduced *box*, defining it as a function.

SVr3.1 (1987) added *whline* and *wvline* and their variants, as well as *border* and *wborder*, redefining *box* as a macro wrapping the latter.

## SEE ALSO

**curses**(3X), **curs\_outopts**(3X)
