panel(3NCURSES)

πŸ“¦
version 6.6+20260608 Β· 4 versions
, in ubuntu resolute, ubuntu stonking

✨ 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 in u386mon 2.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