panel(3NCURSES)
β¨ panel β the bestie who manages your overlapping curses windows β¨
okay so this is panel(3NCURSES), a library call situation, and honestly? it's giving stacked windows, main character energy, and I'm obsessed. π
π NAME π
panel β manage overlapping curses windows. that's it, that's the whole vibe. stacking windows, making them behave, no cap. π¦
πΈ 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 basically, panels are ncurses(3NCURSES) windows but with depth added on top. literally. that's the whole plot twist. β¨
the panel functions let you use stacked windows and they make sure the right bits of each window β plus the curses stdscr window β get hidden or shown whenever panels get added, moved, modified, or removed. the set of currently visible panels? that's the stack of panels. and stdscr? it sits beneath all panels and is not considered part of the stack. sorry stdscr, you're the foundation, not the friend group. π
every panel has a window associated with it. the panel routines let you create, move, hide, and show panels. you can also relocate a panel to any position in the stack you want. slay. π
and here's the cute part: panel routines are a functional layer added to curses, they only make high-level curses calls, and they work anywhere curses does. portable queen behavior fr fr. π«Ά
π₯ FUNCTIONS π₯
π bottom_panel
bottom_panel(pan) puts panel pan at the bottom of all panels. like, it's the floor now. the basement dweller. respect it. π
π ceiling_panel
ceiling_panel(sp) acts like panel_below(NULL) for the given SCREEN sp. yes, it's an ncurses extension, yes it's iconic. β¨
π del_panel
del_panel(pan) removes the given panel pan from the stack and deallocates the PANEL structure β but not its associated window. the window lives on, it's just panel-less now. π
π ground_panel
ground_panel(sp) acts like panel_above(NULL) for the given SCREEN sp. another ncurses extension, another slay. π
π hide_panel
hide_panel(pan) removes the given panel pan from the panel stack, which means it gets hidden from view. and no, the PANEL structure isn't lost β it's merely removed from the stack. it's on a lil break, not deleted. π
π 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, so don't get confused bestie. β οΈ and listen β use this function, not mvwin(3NCURSES), to move a panel window. for real. that's the rule. π
π new_panel
new_panel(win) allocates a PANEL structure, associates it with win, puts the panel on the top of the stack (so it gets displayed above every other panel, main character behavior), and returns a pointer to the new panel. π¦
π 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. cute lil NULL trick, iykyk. β¨
π 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. mirror image, love that for us. π
π panel_hidden
panel_hidden(pan) returns FALSE if the panel pan is in the panel stack, and TRUE if it is not. and if the panel is a null pointer, it returns ERR. so null gets an ERR, not a bool. noted. π
π 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. that's the whole thing. πΈ
π 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 got resized with wresize(3NCURSES). and nope, it does not change the position of the panel in the stack. π
π set_panel_userptr
set_panel_userptr(pan, ptr) sets the panel's user pointer. short, sweet, iconic. β
π show_panel
show_panel(pan) makes a hidden panel visible by placing it on top of the panels in the panel stack. peek the PORTABILITY section below tho, there's lore. π
π top_panel
top_panel(pan) puts the given visible panel pan on top of all panels in the stack. also has PORTABILITY lore. go look. π₯
π update_panels
update_panels() refreshes the virtual screen to reflect the relations between the panels in the stack β but it does not call doupdate(3NCURSES) to refresh the physical screen. so use this function, not wrefresh(3NCURSES) or wnoutrefresh(3NCURSES). important bestie. β οΈ
update_panels may be called more than once before a call to doupdate, but doupdate is the function responsible for updating the physical screen. so like, doupdate is the one who actually posts. π±
π 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 it doesn't. simple as. β¨
except as noted, the pan and window parameters must be non-null. if either is null, an error is returned. no nulls allowed, they didn't RSVP. π«
the move_panel function uses mvwin(3NCURSES), and returns ERR if mvwin returns ERR. chain reaction, fr fr. π
π NOTES π
the header file panel.h itself includes the header file curses.h. it comes pre-loaded with friendship. π«Ά
π PORTABILITY π
reasonable care has been taken to ensure compatibility 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 are merely similar though. β οΈ so the programmer is cautioned not to directly use PANEL fields. do not touch the internals bestie, i'm begging. π
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 intended for making a hidden panel visible (at the top of the stack) and top_panel is intended 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, it matters. π
π§ HISTORY π§
a panel facility was documented in SVr4.2's Character User Interface Programming document.
it is not part of X/Open Curses. nope. π«
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. king behavior. π
Zeyd ben-Halim repackaged it for ncurses.
Juergen Pfeifer and Thomas E. Dickey revised and improved the library. π«Ά
π¦ SEE ALSO π¦
ncurses(3NCURSES), curses_variables(3NCURSES)
and that's the whole page bestie!! this one shipped with ncurses 6.6 dated 2024-12-28 β go forth and stack those windows, you absolute icon πβ¨π
π¦ where this page comes from
- ubuntu resolute: ncurses-doc 6.6+20251231-1 Β· MIT/X11
- ubuntu stonking: ncurses-doc 6.6+20260608-2 Β· MIT/X11
- 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