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 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. 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