plucky (3) notcurses_plane.3.gz

Provided by: libnotcurses-core-dev_3.0.7+dfsg.1-1ubuntu8_amd64 bug

NAME

       notcurses_plane - operations on ncplanes

SYNOPSIS

       #include <notcurses/notcurses.h>

              #define NCPLANE_OPTION_HORALIGNED   0x0001ull
              #define NCPLANE_OPTION_VERALIGNED   0x0002ull
              #define NCPLANE_OPTION_MARGINALIZED 0x0004ull
              #define NCPLANE_OPTION_FIXED        0x0008ull
              #define NCPLANE_OPTION_AUTOGROW     0x0010ull
              #define NCPLANE_OPTION_VSCROLL      0x0020ull

              typedef struct ncplane_options {
                int y;            // vertical placement relative to parent plane
                int x;            // horizontal placement relative to parent plane
                int rows;         // number of rows, must be positive
                int cols;         // number of columns, must be positive
                void* userptr;    // user curry, may be NULL
                const char* name; // name (used only for debugging), may be NULL
                int (*resizecb)(struct ncplane*); // called on parent resize
                uint64_t flags;   // closure over NCPLANE_OPTION_*
                unsigned margin_b, margin_r; // bottom and right margins
              } ncplane_options;

              #define NCSTYLE_MASK      0xffffu
              #define NCSTYLE_ITALIC    0x0010u
              #define NCSTYLE_UNDERLINE 0x0008u
              #define NCSTYLE_UNDERCURL 0x0004u
              #define NCSTYLE_BOLD      0x0002u
              #define NCSTYLE_STRUCK    0x0001u
              #define NCSTYLE_NONE      0

       struct ncplane* ncplane_create(struct ncplane* n, const ncplane_options* nopts);

       struct ncplane* ncpile_create(struct notcurses* n, const ncplane_options* nopts);

       struct ncplane* ncplane_reparent(struct ncplane* n, struct ncplane* newparent);

       struct ncplane* ncplane_reparent_family(struct ncplane* n, struct ncplane* newparent);

       int ncplane_descendant_p(const struct ncplane* n, const struct ncplane* ancestor);

       int ncplane_resize_realign(struct ncplane* n);

       int ncplane_resize_maximize(struct ncplane* n);

       int ncplane_resize_marginalized(struct ncplane* n);

       int ncplane_resize_placewithin(struct ncplane* n);

       void ncplane_set_resizecb(struct ncplane* n, int(resizecb)(struct ncplane));

       int (ncplane_resizecb(const struct ncplane n**))(struct ncplane*);**

       struct ncplane* ncplane_dup(struct ncplane* n, void* opaque);

       int  ncplane_resize(struct  ncplane*  n,  int keepy, int keepx, int keepleny, int keeplenx, int yoff, int
       xoff, int ylen, int xlen);

       int ncplane_move_yx(struct ncplane* n, int y, int x);

       int ncplane_move_rel(struct ncplane* n, int y, int x);

       void ncplane_yx(const struct ncplane* n, int* restrict y, int* restrict x);

       int ncplane_y(const struct ncplane* n);

       int ncplane_x(const struct ncplane* n);

       void ncplane_abs_yx(const struct ncplane* n, int* y, int* x);

       int ncplane_abs_y(const struct ncplane* n);

       int ncplane_abs_x(const struct ncplane* n);

       struct ncplane* ncplane_parent(struct ncplane* n);

       const struct ncplane* ncplane_parent_const(const struct ncplane* n);

       int ncplane_set_base_cell(struct ncplane* ncp, const nccell* c);

       int ncplane_set_base(struct ncplane* ncp, const char* egc, uint16_t stylemask, uint64_t channels);

       int ncplane_base(struct ncplane* ncp, nccell* c);

       static inline void ncplane_move_top(struct ncplane* n);

       static inline void ncplane_move_bottom(struct ncplane* n);

       void ncplane_move_family_top(struct ncplane* n);

       void ncplane_move_family_bottom(struct ncplane* n);

       int ncplane_move_above(struct ncplane* restrict n, struct ncplane* restrict targ);

       int ncplane_move_below(struct ncplane* restrict n, struct ncplane* restrict targ);

       int ncplane_move_family_above(struct ncplane* restrict n, struct ncplane* restrict targ);

       int ncplane_move_family_below(struct ncplane* restrict n, struct ncplane* restrict targ);

       struct ncplane* ncplane_below(struct ncplane* n);

       struct ncplane* ncplane_above(struct ncplane* n);

       char* ncplane_at_cursor(struct ncplane* n, uint16_t* stylemask, uint64_t* channels);

       int ncplane_at_cursor_cell(struct ncplane* n, nccell* c);

       char* ncplane_at_yx(const struct ncplane* n, int y, int x, uint16_t* stylemask, uint64_t* channels);

       int ncplane_at_yx_cell(struct ncplane* n, int y, int x, nccell* c);

       uint32_t* ncplane_as_rgba(const struct ncplane* nc,  ncblitter_e  blit,  unsigned  begy,  unsigned  begx,
       unsigned leny, unsigned lenx, unsigned* pxdimy, unsigned* pxdimx);

       char* ncplane_contents(const struct ncplane* nc, int begy, int begx, unsigned leny, unsigned lenx);

       void* ncplane_set_userptr(struct ncplane* n, void* opaque);

       void* ncplane_userptr(struct ncplane* n);

       void ncplane_dim_yx(const struct ncplane* n, unsigned* restrict rows, unsigned* restrict cols);

       static inline unsigned ncplane_dim_y(const struct ncplane* n);

       static inline unsigned ncplane_dim_x(const struct ncplane* n);

       void ncplane_cursor_yx(const struct ncplane* n, unsigned* restrict y, unsigned* restrict x);

       unsigned ncplane_cursor_y(const struct ncplane* n);

       unsigned ncplane_cursor_x(const struct ncplane* n);

       void  ncplane_translate(const  struct  ncplane*  src,  const  struct  ncplane* dst, int* restrict y, int*
       restrict x);

       bool ncplane_translate_abs(const struct ncplane* n, int* restrict y, int* restrict x);

       uint64_t ncplane_channels(const struct ncplane* n);

       void ncplane_set_channels(struct ncplane* nc, uint64_t channels);

       static inline unsigned ncplane_bchannel(struct ncplane* nc);

       static inline unsigned ncplane_fchannel(struct ncplane* nc);

       uint64_t ncplane_set_bchannel(struct ncplane* nc, uint32_t channel);

       uint64_t ncplane_set_fchannel(struct ncplane* nc, uint32_t channel);

       static inline unsigned ncplane_fg_rgb(struct ncplane* nc);

       static inline unsigned ncplane_bg_rgb(struct ncplane* nc);

       int ncplane_set_fg_rgb(struct ncplane* n, uint32_t channel);

       int ncplane_set_bg_rgb(struct ncplane* n, uint32_t channel);

       static inline unsigned ncplane_fg_alpha(struct ncplane* nc);

       static inline unsigned ncplane_bg_alpha(struct ncplane* nc);

       int ncplane_set_fg_alpha(struct ncplane* n, unsigned alpha);

       int ncplane_set_bg_alpha(struct ncplane* n, unsigned alpha);

       static inline unsigned ncplane_fg_rgb8(struct ncplane* n, unsigned* r, unsigned* g, unsigned* b);

       static inline unsigned ncplane_bg_rgb8(struct ncplane* n, unsigned* r, unsigned* g, unsigned* b);

       int ncplane_set_fg_rgb8(struct ncplane* n, unsigned r, unsigned g, unsigned b);

       int ncplane_set_bg_rgb8(struct ncplane* n, unsigned r, unsigned g, unsigned b);

       void ncplane_set_fg_rgb8_clipped(struct ncplane* n, int r, int g, int b);

       void ncplane_set_bg_rgb8_clipped(struct ncplane* n, int r, int g, int b);

       void ncplane_set_fg_default(struct ncplane* n);

       void ncplane_set_bg_default(struct ncplane* n);

       int ncplane_set_fg_palindex(struct ncplane* n, unsigned idx);

       int ncplane_set_bg_palindex(struct ncplane* n, unsigned idx);

       uint16_t ncplane_styles(const struct ncplane* n);

       void ncplane_set_styles(struct ncplane* n, unsigned stylebits);

       void ncplane_on_styles(struct ncplane* n, unsigned stylebits);

       void ncplane_off_styles(struct ncplane* n, unsigned stylebits);

       void ncplane_greyscale(struct ncplane* n);

       int ncplane_blit_bgrx(struct ncplane* nc, int placey, int  placex,  int  linesize,  ncblitter_e  blitter,
       const unsigned char* data, int begy, int begx, int leny, int lenx);

       int  ncplane_blit_rgba(struct  ncplane*  nc,  int  placey, int placex, int linesize, ncblitter_e blitter,
       const unsigned char* data, int begy, int begx, int leny, int lenx);

       int ncplane_destroy(struct ncplane* ncp);

       void notcurses_drop_planes(struct notcurses* nc);

       int ncplane_mergedown(struct ncplane* src, struct ncplane* dst, int begsrcy, int begsrcx, unsigned  leny,
       unsigned lenx, int dsty, int dstx);

       int ncplane_mergedown_simple(struct ncplane* restrict src, struct ncplane* restrict dst);

       void ncplane_erase(struct ncplane* n);

       int ncplane_erase_region(struct ncplane* n, int ystart, int xstart, int ylen, int xlen);

       bool ncplane_set_scrolling(struct ncplane* n, unsigned scrollp);

       bool ncplane_scrolling_p(const struct ncplane* n);

       bool ncplane_set_autogrow(struct ncplane* n, unsigned growp);

       bool ncplane_autogrow_p(const struct ncplane* n);

       int ncplane_scrollup(struct ncplane* n, int r);

       int ncplane_scrollup_child(struct ncplane* n, const struct ncplane* child);

       int ncplane_rotate_cw(struct ncplane* n);

       int ncplane_rotate_ccw(struct ncplane* n);

       void  ncplane_pixel_geom(const  struct  notcurses*  n,  unsigned*  restrict  pxy, unsigned* restrict pxx,
       unsigned* restrict celldimy, unsigned* restrict celldimx, unsigned* restrict maxbmapy, unsigned* restrict
       maxbmapx);

       int ncplane_set_name(struct ncplane* n, const char* name);

       char* ncplane_name(const struct ncplane* n);

DESCRIPTION

       Ncplanes  are the fundamental drawing object of notcurses.  All output functions take a struct ncplane as
       an argument.  They can be any size, and placed anywhere.  In addition to its  framebuffer--a  rectilinear
       matrix of nccells (see notcurses_cell(3))--an ncplane is defined by:

       • a base nccell, used for any cell on the plane without a glyph,

       • the egcpool backing its nccells,

       • a current cursor location,

       • a current style, foreground channel, and background channel,

       • its geometry,

       • a configured user pointer,

       • position relative to the standard plane,

       • the plane, if any, to which it is bound,

       • the next plane bound by the plane to which it is bound,

       • the head of the list of its bound planes,

       • its resize methodology,

       • whether a sprixel (see notcurses_visual(3)) is associated,

       • its z-index, and

       • a name (used only for debugging).

       New  planes  can be created with ncplane_create.  If a plane is bound to another, x and y coordinates are
       relative to the plane to which it is bound, and if this latter plane moves, all  its  bound  planes  move
       along  with  it.   When  a  plane  is  destroyed,  all  planes bound to it (directly or transitively) are
       destroyed.

       If the NCPLANE_OPTION_HORALIGNED flag is provided, x is  interpreted  as  an  ncalign_e  rather  than  an
       absolute  position.   If the NCPLANE_OPTION_VERALIGNED flag is provided, y is interpreted as an ncalign_e
       rather than an absolute  postiion.   Either  way,  all  positions  are  relative  to  the  parent  plane.
       ncplane_resize_realign  should  usually  be  used  together  with  these  flags,  so  that  the  plane is
       automatically realigned upon a resize of its parent.

       If  the   NCPLANE_OPTION_MARGINALIZED   flag   is   provided,   neither   NCPLANE_OPTION_HORALIGNED   nor
       NCPLANE_OPTION_VERALIGNED may be provided, and rows and cols must both be 0.  y and x will be interpreted
       as top and left margins.  margin_b and margin_r will be interpreted as bottom  and  right  margins.   The
       plane  will  take  the  maximum space possible subject to its parent planes and these margins.  The plane
       cannot become smaller than 1x1 (the margins are best-effort).  ncplane_resize_marginalized should usually
       be used together with this flag, so that the plane is automatically resized.

       ncplane_reparent  detaches  the  plane  n from any plane to which it is bound, and binds it to newparent.
       Its children are reparented to its previous  parent.   The  standard  plane  cannot  be  reparented.   If
       newparent   is   NULL,   the   plane   becomes   the  root  plane  of  a  new,  unrendered  stack.   When
       ncplane_reparent_family is used, all planes bound to n move along with it during a reparenting operation.
       See Piles below.

       ncplane_destroy   destroys   a   particular   ncplane,   after   which   it   must  not  be  used  again.
       notcurses_drop_planes destroys all ncplanes other than the stdplane.  Any references to such planes  are,
       of  course,  invalidated.   It  is  undefined  to  destroy  a plane concurrently with any other operation
       involving that plane, or any operation involving the z-axis.

       It is an error for two threads to concurrently mutate a single ncplane.  So  long  as  rendering  is  not
       taking  place,  however, multiple threads may safely output to multiple ncplanes.  So long as all threads
       are readers, multiple threads may work with a single ncplane.  A reading function is any which accepts  a
       const struct ncplane.

       A  plane  can  be  moved relative to its parent plane's origin with ncplane_move_yx.  If the plane has no
       parent, the move is relative to the rendering area.  A plane can be moved off-screen entirely,  in  which
       case it will not be visible following rasterization; it can also be partially off-screen.

       A  plane has a virtual cursor; Set its new position with ncplane_cursor_move_yx.  Specifying -1 as one or
       both coordinates will hold that axis constant.  You may move a cursor relatively to its current  position
       with  ncplane_cursor_move_rel.   Unless  coordinates  are specified for a call, action takes place at the
       plane's virtual cursor, which automatically moves along with output.  The current virtual cursor location
       can be acquired with ncplane_cursor_yx.

       ncplane_yx  returns the coordinates of the specified plane's origin, relative to the plane to which it is
       bound.  Either or both of y and x may be NULL.  ncplane_y and ncplane_x allow a single component of  this
       location  to  be  retrieved.   ncplane_abs_yx  returns  the  coordinates  of the specified plane's origin
       relative to its pile.

       ncplane_translate translates coordinates expressed relative to the plane src, and writes the  coordinates
       of  that  cell relative to dst.  The cell need not intersect with dst, though this will yield coordinates
       which are invalid for writing or reading on dst.  If dst is NULL, it is taken to refer  to  the  standard
       plane.   ncplane_translate_abs  takes  coordinates  expressed relative to the standard plane, and returns
       coordinates relative to dst, returning false if the coordinates are invalid for dst.

       ncplane_mergedown writes to dst the frame that would be rendered if only src and dst existed  on  the  z-
       axis,  ad  dst  represented  the entirety of the rendering region.  Only those cells where src intersects
       with dst might see changes.  It is an error to merge a plane onto itself.

       ncplane_erase zeroes out every cell of the plane, dumps the egcpool, and homes the cursor.  The base cell
       is  preserved,  as  are the active attributes.  ncplane_erase_region does the same for a subregion of the
       plane.  For the latter, supply 0 for ylen and/or xlen to erase through that dimension,  starting  at  the
       specified point.  Supply -1 for ystart and/or xstart to use the cursor's current position along that axis
       for a starting point.  Negative ylen and xlen move up and to  the  left  from  the  starting  coordinate;
       positive ylen and xlen move down and to the right from same.  See BUGS below.

       When  a  plane  is  resized  (whether by ncplane_resize, SIGWINCH, or any other mechanism), a depth-first
       recursion is performed on its children.  Each child plane  having  a  non-NULL  resizecb  will  see  that
       callback  invoked following resizing of its parent's plane.  If it returns non-zero, the resizing cascade
       terminates, returning non-zero.  Otherwise, resizing proceeds recursively.

       ncplane_move_top and ncplane_move_bottom extract their argument n from the z-axis, and reinsert it at the
       top  or  bottom,  respectively, of its pile.  These functions are both O(1).  ncplane_move_family_top and
       ncplane_move_family_bottom do the same, and move any bound descendants along with  the  plane.   Ordering
       among  the plane and its descendants will be maintained.  For example, assume a pile with A at the top of
       its z-axis, followed by B, C, D, and E, where E is bound to C.  Calling ncplane_move_family_top on C will
       result  in  the  order  CEABD.   Calling  ncplane_move_family_bottom on C will result in the order ABDCE.
       Calling  ncplane_move_family_top  or   ncplane_move_top   on   E   will   result   in   EABCD.    Calling
       ncplane_move_family_bottom  on E is a no-op.  These two functions are O(N) on the number of planes in the
       pile.

       ncplane_move_above and ncplane_move_below move the argument n above or below, respectively, the  argument
       targ.  Both operate in O(1).

       ncplane_at_yx and ncplane_at_yx_cell retrieve the contents of the plane at the specified coordinate.  The
       content is returned as it  will  be  used  during  rendering,  and  thus  integrates  any  base  cell  as
       appropriate.  If called on the secondary columns of a wide glyph, ncplane_at_yx returns the EGC, and thus
       cannot be used to distinguish  between  primary  and  secondary  columns.   ncplane_at_yx_cell,  however,
       preserves  this  information:  retrieving a secondary column of a wide glyph with ncplane_at_yx_cell will
       fill in  the  nccell  argument  such  that  nccell_extended_gcluster(3)  returns  an  empty  string,  and
       nccell_wide_right_p(3) returns true.

       If  ncplane_at_yx  is  invoked  upon a sprixel plane, the control sequence will be returned for any valid
       coordinates (note that this may be quite large).  This does not apply to ncplane_at_yx_cell,  which  will
       return an error.

       ncplane_set_name  sets  the  plane's  name,  freeing  any  old name.  name may be NULL.  ncplane_set_name
       duplicates the provided name internally.

   Base cells
       Each plane has a base cell, initialized to all zeroes.  When  rendering,  the  cells  of  the  plane  are
       examined  in  turn.  Each cell has three independent rendering elements--its EGC, its foreground channel,
       and its background channel.  Any default channel is replaced with the  corresponding  channel  from  that
       plane's base cell.  ncplane_erase has no effect on the base cell.  Calling ncplane_erase on a plane whose
       base cell is a purple 'A' results (for rendering purposes) in a plane made up entirely of purple 'A's.

       ncplane_set_base_cell uses the nccell c (which must be bound to the ncplane ncp, and must  be  the  first
       nccell  of  a  multicolumn  sequence)  to  set  the  base cell.  ncplane_set_base does the same with egc,
       stylemask, and channels.

   Piles
       A single notcurses context is made up of one or more piles.  A pile is a set of  one  or  more  ncplanes,
       including  the  partial  orderings  made  up  of their binding and z-axis pointers.  A pile has a top and
       bottom ncplane (this might be a single plane), and one or more root planes (planes  which  are  bound  to
       themselves).   Multiple  threads  can  concurrently  operate  on  distinct piles, even changing one while
       rendering another.

       Each plane is part of one and only one pile.  By default, a plane is part of  the  same  pile  containing
       that  plane  to which it is bound.  If ncpile_create is used in the place of ncplane_create, the returned
       plane becomes the root plane, top, and bottom of a new pile.  As a root plane, it is bound to itself.   A
       new  pile  can  also  be  created by reparenting a plane to itself, though if the plane is already a root
       plane, this is a no-op.

       When a plane is moved to a different pile (whether new or preexisting), any planes which were bound to it
       are  rebound to its previous parent.  If the plane was a root plane of some pile, any bound planes become
       root planes.  The new plane is placed immediately atop its new parent on its  new  pile's  z-axis.   When
       ncplane_reparent_family is used, all planes bound to the reparented plane are moved along with it.  Their
       relative z-order is maintained.

       More information is available from notcurses_pile(3).

   Binding
       The planes of a pile make up a directed acyclic forest.  Planes bound to  themselves  make  up  the  root
       planes  of  the  pile.   Every plane is either a root plane, or bound to some other plane in its pile.  A
       plane and its descendants make up a family.  When a plane is moved using ncplane_move_yx, its  family  is
       moved along with it.

   Scrolling
       All  planes,  including  the standard plane, are created with scrolling disabled.  Control scrolling on a
       per-plane basis with ncplane_set_scrolling.  Attempting to print past the end of a line will stop at  the
       plane  boundary,  and  indicate  an  error.   On  a  plane  10  columns  wide and two rows high, printing
       "0123456789" at the origin should succeed, but  printing  "01234567890"  will  by  default  fail  at  the
       eleventh  character.   In  either case, the cursor will be left at location 0x10; it must be moved before
       further printing can take place.  If scrolling is enabled, the first row will be filled with 01234546789,
       the  second row will have 0 written to its first column, and the cursor will end up at 1x1.  Note that it
       is still an error to manually attempt to move the cursor off-plane, or to specify off-plane output.  Box-
       drawing  does  not result in scrolling; attempting to draw a 2x11 box on our 2x10 plane will result in an
       error and no output.  When scrolling is enabled, and output takes place while the cursor is past the  end
       of  the  last  row, the first row is discarded, all other rows are moved up, the last row is cleared, and
       output begins at the beginning of the last row.  This does not take place until output is generated (i.e.
       it is possible to fill a plane when scrolling is enabled).

       Creating   a   plane   with   the  NCPLANE_OPTION_VSCROLL  flag  is  equivalent  to  immediately  calling
       ncplane_set_scrolling on that plane with an argument of true.

       By default, planes bound to a scrolling plane will scroll along with it, if  they  intersect  the  plane.
       This can be disabled by creating them with the NCPLANE_OPTION_FIXED flag.

   Autogrow
       Normally, once output reaches the right boundary of a plane, it is impossible to place more output unless
       the cursor is first moved.  If scrolling is enabled, the cursor will automatically move down and  to  the
       left in this case, but upon reaching the bottom right corner of the plane, it is impossible to place more
       output without a scrolling event.  If autogrow is in play, the plane will automatically  be  enlarged  to
       accommodate  output.  If scrolling is disabled, growth takes place to the right; it otherwise takes place
       at the bottom.  The plane only grows in one dimension.  Autogrow  cannot  be  enabled  for  the  standard
       plane.

       Creating   a   plane   with  the  NCPLANE_OPTION_AUTOGROW  flag  is  equivalent  to  immediately  calling
       ncplane_set_autogrow on that plane with an argument of true.

   Bitmaps
       ncplane_pixel_geom retrieves pixel geometry details.  pxy and pxx return the size of the plane in pixels.
       celldimy  and  celldimx  return  the  size  of  a cell in pixels (these ought be the same across planes).
       maxbmapy and maxbmapx describe the largest bitmap which can be displayed in  the  plane.   Any  parameter
       (save n) may be NULL.

       When  a  plane is blitted to using ncvisual_blit and NCBLIT_PIXEL (see notcurses_visual(3)), it ceases to
       accept cell-based output.  The sprixel will remain associated until a  new  sprixel  is  blitted  to  the
       plane,  the  plane  is  resized,  the  plane  is  erased,  or the plane is destroyed.  The base cell of a
       sprixelated plane has no effect; if the sprixel is not even multiples of the cell geometry,  the  "excess
       plane" is ignored during rendering.

RETURN VALUES

       ncplane_create and ncplane_dup return a new struct ncplane on success, or NULL on failure.

       ncplane_userptr returns the configured user pointer for the ncplane, and cannot fail.

       ncplane_below  returns  the  plane  below the specified ncplane.  If the provided plane is the bottommost
       plane, NULL is returned.  It cannot fail.

       ncplane_set_scrolling returns true if scrolling was previously enabled, and false otherwise.

       ncplane_at_yx and ncplane_at_cursor return a heap-allocated copy of the EGC at the relevant cell, or NULL
       if   the   cell   is   invalid.    The   caller   should   free   this  result.   ncplane_at_yx_cell  and
       ncplane_at_cursor_cell instead load these values into an nccell, which is invalidated if  the  associated
       plane is destroyed.  The caller should release this nccell with nccell_release.

       ncplane_as_rgba returns a heap-allocated array of uint32_t values, each representing a single RGBA pixel,
       or NULL on failure.

       ncplane_erase_region returns -1 if ystart or xstart are less than -1, or outside the plane.

       ncplane_cursor_move_yx returns -1 if the coordinates are beyond the dimensions  of  the  specified  plane
       (except for the special value -1).

       ncplane_cursor_move_rel returns -1 if the coordinates are beyond the dimensions of the specified plane.

       ncplane_name returns a heap-allocated copy of the plane's name, or NULL if it has no name (or on error).

       Functions returning int return 0 on success, and non-zero on error.

       All other functions cannot fail (and return void).

NOTES

BUGS

       ncplane_at_yx  doesn't  yet account for bitmap-based graphics (see notcurses_visual(3)).  Whatever glyph-
       based contents existed on the plane when the bitmap was blitted will continue to be returned.

       When the alternate screen is not used (see notcurses_init(3)), the contents of the  terminal  at  startup
       remain  present until obliterated on a cell-by-cell basis.  ncplane_erase and ncplane_erase_region cannot
       be used to clear the terminal of startup content.  If you want the screen cleared on startup, but do  not
       want to use (or rely on) the alternate screen, use something like:

              ncplane_set_base(notcurses_stdplane(nc), " ", 0, 0);
              notcurses_render(nc);

       or simply:

              notcurses_refresh(nc);

SEE ALSO

       notcurses(3),   notcurses_capabilities(3),   notcurses_cell(3),  notcurses_output(3),  notcurses_pile(3),
       notcurses_stdplane(3), notcurses_visual(3)

AUTHORS

       nick black <nickblack@linux.com>.

                                                     v3.0.7                                   notcurses_plane(3)