mirror of
https://github.com/dankamongmen/notcurses
synced 2025-03-09 17:19:03 -04:00
selector: undo switch to notcurses from ncplane
This commit is contained in:
parent
4eb4c2909f
commit
fec423264f
2
NEWS.md
2
NEWS.md
@ -9,8 +9,6 @@ rearrangements of Notcurses.
|
||||
* `selector_options` has been renamed to `ncselector_options`, and
|
||||
`multiselector_options` has been renamed to `ncmultiselector_options`.
|
||||
This matches the other widget option struct's nomenclature.
|
||||
* `ncselector_create()` and `ncmultiselector_create()` now take a `struct
|
||||
notcurses*` instead of a `struct ncplane`, as they create their own planes.
|
||||
* `ncplane_set_channels()` and `ncplane_set_attr()` have been added to allow
|
||||
`ncplane` attributes to be set directly and in toto.
|
||||
* `NULL` can now be passed as the `FILE*` argument to `notcurses_init()` and
|
||||
|
@ -42,7 +42,7 @@ typedef struct ncmultiselector_options {
|
||||
} ncmultiselector_options;
|
||||
```
|
||||
|
||||
**struct ncmultiselector* ncmultiselector_create(struct notcurses* n, int y, int x, const ncmultiselector_options* opts);**
|
||||
**struct ncmultiselector* ncmultiselector_create(struct ncplane* n, int y, int x, const ncmultiselector_options* opts);**
|
||||
|
||||
**int ncmultiselector_selected(bool* selected, unsigned n);**
|
||||
|
||||
@ -56,6 +56,11 @@ typedef struct ncmultiselector_options {
|
||||
|
||||
# NOTES
|
||||
|
||||
Currently, the **ncplane** **n** provided to **ncmultiselector_create** must
|
||||
not be **NULL**, though the **ncmultiselector** will always get its own plane,
|
||||
and this plane will not (currently) be bound to **n**.
|
||||
|
||||
|
||||
# RETURN VALUES
|
||||
|
||||
# SEE ALSO
|
||||
|
@ -41,7 +41,7 @@ typedef struct ncselector_options {
|
||||
} ncselector_options;
|
||||
```
|
||||
|
||||
**struct ncselector* ncselector_create(struct notcrses* n, int y, int x, const ncselector_options* opts);**
|
||||
**struct ncselector* ncselector_create(struct ncplane* n, int y, int x, const ncselector_options* opts);**
|
||||
|
||||
**int ncselector_additem(struct ncselector* n, const struct ncselector_item* item);**
|
||||
|
||||
@ -63,6 +63,10 @@ typedef struct ncselector_options {
|
||||
|
||||
# NOTES
|
||||
|
||||
Currently, the **ncplane** **n** provided to **ncselector_create** must not be
|
||||
**NULL**, though the **ncselector** will always get its own plane, and this
|
||||
plane will not (currently) be bound to **n**.
|
||||
|
||||
# RETURN VALUES
|
||||
|
||||
# SEE ALSO
|
||||
|
@ -5,7 +5,6 @@
|
||||
|
||||
#include "Root.hh"
|
||||
#include "NCAlign.hh"
|
||||
#include "NotCurses.hh"
|
||||
|
||||
namespace ncpp
|
||||
{
|
||||
@ -17,27 +16,30 @@ namespace ncpp
|
||||
static ncmultiselector_options default_options;
|
||||
|
||||
public:
|
||||
explicit MultiSelector (NotCurses *nc, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (reinterpret_cast<notcurses*>(nc), y, x, opts)
|
||||
explicit MultiSelector (Plane *plane, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (reinterpret_cast<ncplane*>(plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit MultiSelector (NotCurses const* nc, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (const_cast<NotCurses*>(nc), y, x, opts)
|
||||
explicit MultiSelector (Plane const* plane, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (const_cast<Plane*>(plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit MultiSelector (NotCurses &nc, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (reinterpret_cast<notcurses*>(&nc), y, x, opts)
|
||||
explicit MultiSelector (Plane &plane, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (reinterpret_cast<ncplane*>(&plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit MultiSelector (NotCurses const& nc, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (const_cast<NotCurses*>(&nc), y, x, opts)
|
||||
explicit MultiSelector (Plane const& plane, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
: MultiSelector (const_cast<Plane*>(&plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit MultiSelector (notcurses *nc, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
explicit MultiSelector (ncplane *plane, int y, int x, const ncmultiselector_options *opts = nullptr)
|
||||
{
|
||||
multiselector = ncmultiselector_create (nc, y, x, opts == nullptr ? &default_options : opts);
|
||||
if (plane == nullptr)
|
||||
throw invalid_argument ("'plane' must be a valid pointer");
|
||||
|
||||
multiselector = ncmultiselector_create (plane, y, x, opts == nullptr ? &default_options : opts);
|
||||
if (multiselector == nullptr)
|
||||
throw init_error ("notcurses failed to create a new ncmultiselector");
|
||||
throw init_error ("notcurses failed to create a new multiselector");
|
||||
}
|
||||
|
||||
~MultiSelector ()
|
||||
|
@ -5,7 +5,6 @@
|
||||
|
||||
#include "Root.hh"
|
||||
#include "NCAlign.hh"
|
||||
#include "NotCurses.hh"
|
||||
|
||||
namespace ncpp
|
||||
{
|
||||
@ -17,25 +16,28 @@ namespace ncpp
|
||||
static ncselector_options default_options;
|
||||
|
||||
public:
|
||||
explicit Selector (NotCurses *nc, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (reinterpret_cast<notcurses*>(nc), y, x, opts)
|
||||
explicit Selector (Plane *plane, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (reinterpret_cast<ncplane*>(plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit Selector (NotCurses const* nc, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (const_cast<NotCurses*>(nc), y, x, opts)
|
||||
explicit Selector (Plane const* plane, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (const_cast<Plane*>(plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit Selector (NotCurses &nc, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (reinterpret_cast<NotCurses*>(&nc), y, x, opts)
|
||||
explicit Selector (Plane &plane, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (reinterpret_cast<ncplane*>(&plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit Selector (NotCurses const& nc, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (const_cast<NotCurses*>(&nc), y, x, opts)
|
||||
explicit Selector (Plane const& plane, int y, int x, const ncselector_options *opts = nullptr)
|
||||
: Selector (const_cast<Plane*>(&plane), y, x, opts)
|
||||
{}
|
||||
|
||||
explicit Selector (notcurses* nc, int y, int x, const ncselector_options *opts = nullptr)
|
||||
explicit Selector (ncplane *plane, int y, int x, const ncselector_options *opts = nullptr)
|
||||
{
|
||||
selector = ncselector_create (nc, y, x, opts == nullptr ? &default_options : opts);
|
||||
if (plane == nullptr)
|
||||
throw invalid_argument ("'plane' must be a valid pointer");
|
||||
|
||||
selector = ncselector_create (plane, y, x, opts == nullptr ? &default_options : opts);
|
||||
if (selector == nullptr)
|
||||
throw init_error ("notcurses failed to create a new selector");
|
||||
}
|
||||
|
@ -2480,7 +2480,7 @@ typedef struct ncselector_options {
|
||||
uint64_t bgchannels; // background channels, used only in body
|
||||
} ncselector_options;
|
||||
|
||||
API struct ncselector* ncselector_create(struct notcurses* n, int y, int x,
|
||||
API struct ncselector* ncselector_create(struct ncplane* n, int y, int x,
|
||||
const ncselector_options* opts);
|
||||
|
||||
API int ncselector_additem(struct ncselector* n, const struct ncselector_item* item);
|
||||
@ -2554,7 +2554,7 @@ typedef struct ncmultiselector_options {
|
||||
uint64_t bgchannels; // background channels, used only in body
|
||||
} ncmultiselector_options;
|
||||
|
||||
API struct ncmultiselector* ncmultiselector_create(struct notcurses* n, int y, int x,
|
||||
API struct ncmultiselector* ncmultiselector_create(struct ncplane* n, int y, int x,
|
||||
const ncmultiselector_options* opts);
|
||||
|
||||
// Return selected vector. An array of bools must be provided, along with its
|
||||
|
@ -326,7 +326,7 @@ typedef struct ncselector_options {
|
||||
uint64_t boxchannels; // border channels
|
||||
uint64_t bgchannels; // background channels, used only in body
|
||||
} ncselector_options;
|
||||
struct ncselector* ncselector_create(struct notcurses* n, int y, int x, const ncselector_options* opts);
|
||||
struct ncselector* ncselector_create(struct ncplane* n, int y, int x, const ncselector_options* opts);
|
||||
int ncselector_additem(struct ncselector* n, const struct ncselector_item* item);
|
||||
int ncselector_delitem(struct ncselector* n, const char* item);
|
||||
const char* ncselector_selected(const struct ncselector* n);
|
||||
@ -356,7 +356,7 @@ typedef struct ncmultiselector_options {
|
||||
uint64_t boxchannels; // border channels
|
||||
uint64_t bgchannels; // background channels, used only in body
|
||||
} ncmultiselector_options;
|
||||
struct ncmultiselector* ncmultiselector_create(struct notcurses* n, int y, int x, const ncmultiselector_options* opts);
|
||||
struct ncmultiselector* ncmultiselector_create(struct ncplane* n, int y, int x, const ncmultiselector_options* opts);
|
||||
int ncmultiselector_selected(struct ncmultiselector* n, bool* selected, unsigned count);
|
||||
struct ncplane* ncmultiselector_plane(struct ncmultiselector* n);
|
||||
bool ncmultiselector_offer_input(struct ncmultiselector* n, const struct ncinput* nc);
|
||||
@ -484,6 +484,22 @@ struct ncsubproc* ncsubproc_createvp(struct ncplane* n, const ncsubproc_options*
|
||||
struct ncsubproc* ncsubproc_createvpe(struct ncplane* n, const ncsubproc_options* opts, const char* bin, char* const arg[], char* const env[], ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn);
|
||||
struct ncplane* ncsubproc_plane(struct ncsubproc* n);
|
||||
int ncsubproc_destroy(struct ncsubproc* n);
|
||||
typedef struct ncreader_options {
|
||||
uint64_t tchannels; // channels used for input
|
||||
uint64_t echannels; // channels used for empty space
|
||||
uint32_t tattrword; // attributes used for input
|
||||
uint32_t eattrword; // attributes used for empty space
|
||||
char* egc; // egc used for empty space
|
||||
int physrows;
|
||||
int physcols;
|
||||
bool scroll; // allow more than the physical area's worth of input
|
||||
} ncreader_options;
|
||||
struct ncreader* ncreader_create(struct notcurses* nc, int y, int x, const ncreader_options* opts);
|
||||
int ncreader_clear(struct ncreader* n);
|
||||
struct ncplane* ncreader_plane(struct ncreader* n);
|
||||
bool ncreader_offer_input(struct ncreader* n, const struct ncinput* ni);
|
||||
char* ncreader_contents(const struct ncreader* n);
|
||||
void ncreader_destroy(struct ncreader* n, char** contents);
|
||||
""")
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@ -134,6 +134,10 @@ timespec_mul(const struct timespec* ts, unsigned multiplier, struct timespec* pr
|
||||
}
|
||||
/*-------------------------------time helpers----------------------------*/
|
||||
|
||||
/*---------------------------------FPS plot-------------------------------*/
|
||||
int fpsgraph_init(struct notcurses* nc);
|
||||
int fpsgraph_stop(struct notcurses* nc);
|
||||
|
||||
/*----------------------------------HUD----------------------------------*/
|
||||
extern struct ncplane* hud;
|
||||
struct ncplane* hud_create(struct notcurses* nc);
|
||||
|
@ -157,7 +157,7 @@ ncselector_dim_yx(notcurses* nc, const ncselector* n, int* ncdimy, int* ncdimx){
|
||||
return 0;
|
||||
}
|
||||
|
||||
ncselector* ncselector_create(notcurses* nc, int y, int x, const ncselector_options* opts){
|
||||
ncselector* ncselector_create(ncplane* nc, int y, int x, const ncselector_options* opts){
|
||||
if(opts->defidx && opts->defidx >= opts->itemcount){
|
||||
return NULL;
|
||||
}
|
||||
@ -210,10 +210,10 @@ ncselector* ncselector_create(notcurses* nc, int y, int x, const ncselector_opti
|
||||
}
|
||||
}
|
||||
int dimy, dimx;
|
||||
if(ncselector_dim_yx(nc, ns, &dimy, &dimx)){
|
||||
if(ncselector_dim_yx(nc->nc, ns, &dimy, &dimx)){
|
||||
goto freeitems;
|
||||
}
|
||||
if(!(ns->ncp = ncplane_new(nc, dimy, dimx, y, x, NULL))){
|
||||
if(!(ns->ncp = ncplane_new(nc->nc, dimy, dimx, y, x, NULL))){
|
||||
goto freeitems;
|
||||
}
|
||||
cell_init(&ns->background);
|
||||
@ -654,7 +654,7 @@ ncmultiselector_dim_yx(notcurses* nc, const ncmultiselector* n, int* ncdimy, int
|
||||
return 0;
|
||||
}
|
||||
|
||||
ncmultiselector* ncmultiselector_create(notcurses* nc, int y, int x,
|
||||
ncmultiselector* ncmultiselector_create(ncplane* nc, int y, int x,
|
||||
const ncmultiselector_options* opts){
|
||||
ncmultiselector* ns = malloc(sizeof(*ns));
|
||||
ns->title = opts->title ? strdup(opts->title) : NULL;
|
||||
@ -703,10 +703,10 @@ ncmultiselector* ncmultiselector_create(notcurses* nc, int y, int x,
|
||||
}
|
||||
}
|
||||
int dimy, dimx;
|
||||
if(ncmultiselector_dim_yx(nc, ns, &dimy, &dimx)){
|
||||
if(ncmultiselector_dim_yx(nc->nc, ns, &dimy, &dimx)){
|
||||
goto freeitems;
|
||||
}
|
||||
if(!(ns->ncp = ncplane_new(nc, dimy, dimx, y, x, NULL))){
|
||||
if(!(ns->ncp = ncplane_new(nc->nc, dimy, dimx, y, x, NULL))){
|
||||
goto freeitems;
|
||||
}
|
||||
cell_init(&ns->background);
|
||||
|
@ -98,28 +98,28 @@ int main(void){
|
||||
|
||||
ncplane_set_fg(n, 0x40f040);
|
||||
ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, "multiselect widget demo");
|
||||
struct ncmultiselector* ns = ncmultiselector_create(nc, 3, 0, &sopts);
|
||||
struct ncmultiselector* ns = ncmultiselector_create(n, 3, 0, &sopts);
|
||||
run_mselect(nc, ns);
|
||||
|
||||
sopts.title = "short round title";
|
||||
ns = ncmultiselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncmultiselector_create(n, 3, 0, &sopts);
|
||||
run_mselect(nc, ns);
|
||||
|
||||
sopts.title = "short round title";
|
||||
sopts.secondary = "now this secondary is also very, very, very outlandishly long, you see";
|
||||
ns = ncmultiselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncmultiselector_create(n, 3, 0, &sopts);
|
||||
run_mselect(nc, ns);
|
||||
|
||||
sopts.title = "the whole world is watching";
|
||||
sopts.secondary = NULL;
|
||||
sopts.footer = "now this FOOTERFOOTER is also very, very, very outlandishly long, you see";
|
||||
ns = ncmultiselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncmultiselector_create(n, 3, 0, &sopts);
|
||||
run_mselect(nc, ns);
|
||||
|
||||
sopts.title = "chomps";
|
||||
sopts.secondary = NULL;
|
||||
sopts.footer = NULL;
|
||||
ns = ncmultiselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncmultiselector_create(n, 3, 0, &sopts);
|
||||
run_mselect(nc, ns);
|
||||
|
||||
if(notcurses_stop(nc)){
|
||||
|
@ -99,28 +99,28 @@ int main(void){
|
||||
|
||||
ncplane_set_fg(n, 0x40f040);
|
||||
ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, "selector widget demo");
|
||||
struct ncselector* ns = ncselector_create(nc, 3, 0, &sopts);
|
||||
struct ncselector* ns = ncselector_create(n, 3, 0, &sopts);
|
||||
run_selector(nc, ns);
|
||||
|
||||
sopts.title = "short round title";
|
||||
ns = ncselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncselector_create(n, 3, 0, &sopts);
|
||||
run_selector(nc, ns);
|
||||
|
||||
sopts.title = "short round title";
|
||||
sopts.secondary = "now this secondary is also very, very, very outlandishly long, you see";
|
||||
ns = ncselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncselector_create(n, 3, 0, &sopts);
|
||||
run_selector(nc, ns);
|
||||
|
||||
sopts.title = "the whole world is watching";
|
||||
sopts.secondary = NULL;
|
||||
sopts.footer = "now this FOOTERFOOTER is also very, very, very outlandishly long, you see";
|
||||
ns = ncselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncselector_create(n, 3, 0, &sopts);
|
||||
run_selector(nc, ns);
|
||||
|
||||
sopts.title = "chomps";
|
||||
sopts.secondary = NULL;
|
||||
sopts.footer = NULL;
|
||||
ns = ncselector_create(nc, 3, 0, &sopts);
|
||||
ns = ncselector_create(n, 3, 0, &sopts);
|
||||
run_selector(nc, ns);
|
||||
|
||||
if(notcurses_stop(nc)){
|
||||
|
@ -19,7 +19,7 @@ TEST_CASE("Selectors") {
|
||||
|
||||
SUBCASE("EmptySelector") {
|
||||
struct ncselector_options opts{};
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
CHECK(nullptr == ncselector_selected(ncs));
|
||||
@ -35,7 +35,7 @@ TEST_CASE("Selectors") {
|
||||
SUBCASE("TitledSelector") {
|
||||
struct ncselector_options opts{};
|
||||
opts.title = strdup("hey hey whaddya say");
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
struct ncplane* ncsp = ncselector_plane(ncs);
|
||||
@ -50,7 +50,7 @@ TEST_CASE("Selectors") {
|
||||
SUBCASE("SecondarySelector") {
|
||||
struct ncselector_options opts{};
|
||||
opts.secondary = strdup("this is not a title, but it's not *not* a title");
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
struct ncplane* ncsp = ncselector_plane(ncs);
|
||||
@ -65,7 +65,7 @@ TEST_CASE("Selectors") {
|
||||
SUBCASE("FooterSelector") {
|
||||
struct ncselector_options opts{};
|
||||
opts.footer = strdup("i am a lone footer, little old footer");
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
struct ncplane* ncsp = ncselector_plane(ncs);
|
||||
@ -86,7 +86,7 @@ TEST_CASE("Selectors") {
|
||||
struct ncselector_options opts{};
|
||||
opts.items = items;
|
||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
struct ncplane* ncsp = ncselector_plane(ncs);
|
||||
@ -100,7 +100,7 @@ TEST_CASE("Selectors") {
|
||||
|
||||
SUBCASE("EmptySelectorMovement") {
|
||||
struct ncselector_options opts{};
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
auto sel = ncselector_selected(ncs);
|
||||
@ -123,7 +123,7 @@ TEST_CASE("Selectors") {
|
||||
struct ncselector_options opts{};
|
||||
opts.items = items;
|
||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
auto sel = ncselector_selected(ncs);
|
||||
REQUIRE(nullptr != sel);
|
||||
@ -161,7 +161,7 @@ TEST_CASE("Selectors") {
|
||||
opts.maxdisplay = 1;
|
||||
opts.items = items;
|
||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
auto sel = ncselector_selected(ncs);
|
||||
@ -204,7 +204,7 @@ TEST_CASE("Selectors") {
|
||||
opts.maxdisplay = 2;
|
||||
opts.items = items;
|
||||
opts.itemcount = sizeof(items) / sizeof(*items);
|
||||
struct ncselector* ncs = ncselector_create(nc_, 0, 0, &opts);
|
||||
struct ncselector* ncs = ncselector_create(n_, 0, 0, &opts);
|
||||
REQUIRE(nullptr != ncs);
|
||||
CHECK(0 == notcurses_render(nc_));
|
||||
const char* sel = ncselector_selected(ncs);
|
||||
|
Loading…
x
Reference in New Issue
Block a user