panel(3X)
π panel(3X) β the manual page, bestie edition π
okay so this is the panel page from the library-calls corner of the manual, and it's literally the blueprint for making windows stack on top of each other like the world's cutest pile of stickers π«Ά
πΈ NAME πΈ
panel β manage overlapping curses windows. that's it, that's the whole job, and she does it flawlessly β¨
π SYNOPSIS π
#include <panel.h>
PANEL *new_panel(WINDOW *win);
int bottom_panel(PANEL *pan);
int top_panel(PANEL *pan);
int show_panel(PANEL *pan);
void update_panels(void);
int hide_panel(PANEL *pan);
WINDOW *panel_window(const PANEL *pan);
int replace_panel(PANEL *pan, WINDOW *window);
int move_panel(PANEL *pan, int starty, int startx);
int panel_hidden(const PANEL *pan);
PANEL *panel_above(const PANEL *pan);
PANEL *panel_below(const PANEL *pan);
int set_panel_userptr(PANEL *pan, const void *ptr);
const void *panel_userptr(const PANEL *pan);
int del_panel(PANEL *pan);
/* ncurses extensions */
PANEL *ground_panel(SCREEN *sp);
PANEL *ceiling_panel(SCREEN *sp);
π¦ DESCRIPTION π¦
So here's the tea: panels are just curses(3X) windows but with depth added on top. Like, a window but she has layers π
The panel functions let you stack windows, and they make sure that the right portions of each window β and of the curses stdscr window β get hidden or shown whenever panels are added, moved, modified, or removed. The set of currently visible panels? That's the stack of panels. And stdscr sits underneath every single panel, not considered part of the stack at all. she's the foundation, not the friend group β¨
Every panel has a window associated with it, and these routines let you create, move, hide, and show panels. You can also relocate a panel to literally any position you want in the stack. main character energy, your choice π
Also important: panel routines are a functional layer added to curses. They only make high-level curses calls, and they work anywhere curses works. no cap.
β¨ FUNCTIONS β¨
π bottom_panel
bottom_panel(pan) puts the panel pan at the bottom of all panels. like, she's the base layer now, sorry bestie π
π ceiling_panel
ceiling_panel(sp) acts like panel_below(NULL) for the given SCREEN sp.
π§ del_panel
del_panel(pan) removes the given panel pan from the stack and deallocates the PANEL structure β but not its associated window. the panel's gone, the window lives on π
β ground_panel
ground_panel(sp) acts like panel_above(NULL) for the given SCREEN sp.
πΈ hide_panel
hide_panel(pan) removes the given panel pan from the panel stack, which means it's hidden from view. The PANEL structure isn't lost though β it's merely removed from the stack. so she's not gone gone, she's just not on stage rn π
π¦ move_panel
move_panel(pan, starty, startx) moves the given panel pan's window so its upper-left corner lands at starty, startx. It does not change the panel's position in the stack. And listen β use this function, not mvwin(3X), to move a panel window. fr fr, do not skip that part.
π new_panel
new_panel(win) allocates a PANEL structure, associates it with win, places the panel on top of the stack (so it displays above any other panel), and returns a pointer to the new panel. new panel just dropped β¨
π panel_above
panel_above(pan) returns a pointer to the panel above pan. And if the panel argument is (PANEL *)0, it returns a pointer to the bottom panel in the stack.
π«Ά panel_below
panel_below(pan) returns a pointer to the panel just below pan. And if the panel argument is (PANEL *)0, it returns a pointer to the top panel in the stack.
π panel_hidden
panel_hidden(pan) returns FALSE if the panel pan is in the panel stack, and TRUE if it isn't. And if the panel is a null pointer? It returns ERR. rude but fair.
π panel_userptr
panel_userptr(pan) returns the user pointer for a given panel pan.
π panel_window
panel_window(pan) returns a pointer to the window of the given panel pan.
π replace_panel
replace_panel(pan, window) replaces the current window of panel pan with window. Super useful if, say, you wanna resize a panel. In ncurses, you can call replace_panel to resize a panel using a window that's been resized with wresize(3X). It does not change the panel's position in the stack.
π set_panel_userptr
set_panel_userptr(pan, ptr) sets the panel's user pointer.
π show_panel
show_panel(pan) makes a hidden panel visible by placing it on top of the panels in the panel stack. Peep βPORTABILITYβ below, bestie π
π₯ top_panel
top_panel(pan) puts the given visible panel pan on top of all panels in the stack. Also peep βPORTABILITYβ below π
β¨ update_panels
update_panels() refreshes the virtual screen so it reflects the relations between the panels in the stack β but it does not call doupdate(3X) to refresh the physical screen. Use this function, not wrefresh(3X) or wnoutrefresh(3X).
update_panels may be called more than once before a call to doupdate, but doupdate is the function responsible for updating the physical screen. she's the one who actually hits publish π²
π― RETURN VALUE π―
Every routine that returns a pointer returns NULL if an error happens. Every routine that returns an int value returns OK if it executes successfully and ERR if not. slay when it works, π when it doesn't.
Except as noted, the pan and window parameters must be non-null. If either one is null, an error is returned.
And the move_panel function uses mvwin(3X), and returns ERR if mvwin returns ERR. chain reaction, iykyk.
π NOTES π
The header file panel.h itself includes the header file curses.h. convenient queen π
π PORTABILITY π
Reasonable care has been taken to make sure this is compatible with the native panel facility introduced in System V. Inspection of the SVr4 manual pages suggests the programming interface never changed. The PANEL data structures, though? Merely similar. So the programmer is cautioned not to directly use PANEL fields. hands off the internals, bestie π
Also: the functions show_panel and top_panel are identical in this implementation, and work equally well with displayed or hidden panels. But in the System V implementation, show_panel is meant for making a hidden panel visible (at the top of the stack), and top_panel is meant for making an already-visible panel move to the top of the stack. So you are cautioned to use the correct function to ensure compatibility with System V panel libraries. pick the right one, no shortcuts π
π HISTORY π
A panel facility was documented in SVr4.2's Character User Interface Programming document.
It is not part of X/Open Curses.
A few implementations exist:
- Systems based on SVr4 source code, such as Solaris, provide this library.
ncurses(since version 0.6 in 1993) and PDCurses (since version 2.2 in 1995) provide a panel library whose common ancestor is a public domain implementation by Warren Tucker published inu386mon2.20 (1990).- According to Tucker, the System V panel library was first released in SVr3.2 (1988), and his implementation helped with a port to SVr3.1 (1987).
- Several developers have improved each of these; they are no longer the same as Tucker's implementation.
- NetBSD 8 (2018) has a panel library begun by Valery Ushakov in 2015, based on the System V documentation.
π AUTHORS π
Warren Tucker <wht@n4hgf.mt-park.ga.us> originally wrote this implementation, primarily to assist in porting u386mon to systems without a native panel library. absolute legend behavior.
Zeyd ben-Halim repackaged it for ncurses.
Juergen Pfeifer and Thomas E. Dickey revised and improved the library. the glow-up was real β¨
π SEE ALSO π
curses(3X), curs_variables(3X)
and that's the whole page, bestie π«Ά this was ncurses 6.6, dated 2024-12-28, and yes she ate π
β¨
π¦ where this page comes from
- alpine 3.24: ncurses-doc 6.6_p20260516-r0 Β· X11
- arch rolling: ncurses 6.6-2 Β· MIT-open-group
- fedora 44: ncurses-devel 6.6-1.fc44 Β· MIT-open-group
- fedora 44: ncurses-devel 6.6-1.fc44 Β· MIT-open-group
- Copyright 2018-2023,2024 Thomas E. Dickey
- Copyright 1998-2016,2017 Free Software Foundation, Inc
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms