char32_t is C++, not C -- move to uint32_t

This commit is contained in:
nick black 2021-07-12 18:01:41 -04:00
parent 0d68b62bee
commit 15b9b64cad
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC
17 changed files with 69 additions and 70 deletions

View File

@ -240,12 +240,12 @@ namespace ncpp
return static_cast<CellStyle>(notcurses_supported_styles (nc)); return static_cast<CellStyle>(notcurses_supported_styles (nc));
} }
char32_t getc (const timespec *ts, sigset_t *sigmask = nullptr, ncinput *ni = nullptr) const noexcept uint32_t getc (const timespec *ts, sigset_t *sigmask = nullptr, ncinput *ni = nullptr) const noexcept
{ {
return notcurses_getc (nc, ts, sigmask, ni); return notcurses_getc (nc, ts, sigmask, ni);
} }
char32_t getc (bool blocking = false, ncinput *ni = nullptr) const noexcept uint32_t getc (bool blocking = false, ncinput *ni = nullptr) const noexcept
{ {
if (blocking) if (blocking)
return notcurses_getc_blocking (nc, ni); return notcurses_getc_blocking (nc, ni);
@ -293,7 +293,7 @@ namespace ncpp
return notcurses_stats_alloc (nc); return notcurses_stats_alloc (nc);
} }
static bool ucs32_to_utf8 (const char32_t *ucs32, unsigned ucs32count, unsigned char *resultbuf, size_t buflen) NOEXCEPT_MAYBE static bool ucs32_to_utf8 (const uint32_t *ucs32, unsigned ucs32count, unsigned char *resultbuf, size_t buflen) NOEXCEPT_MAYBE
{ {
return error_guard (notcurses_ucs32_to_utf8 (ucs32, ucs32count, resultbuf, buflen), -1); return error_guard (notcurses_ucs32_to_utf8 (ucs32, ucs32count, resultbuf, buflen), -1);
} }

View File

@ -310,10 +310,10 @@ API int ncdirect_double_box(struct ncdirect* n, uint64_t ul, uint64_t ur,
// of 0 for non-blocking operation, and otherwise a timespec to bound blocking. // of 0 for non-blocking operation, and otherwise a timespec to bound blocking.
// Signals in sigmask (less several we handle internally) will be atomically // Signals in sigmask (less several we handle internally) will be atomically
// masked and unmasked per ppoll(2). '*sigmask' should generally contain all // masked and unmasked per ppoll(2). '*sigmask' should generally contain all
// signals. Returns a single Unicode code point, or (char32_t)-1 on error. // signals. Returns a single Unicode code point, or (uint32_t)-1 on error.
// 'sigmask' may be NULL. Returns 0 on a timeout. If an event is processed, the // 'sigmask' may be NULL. Returns 0 on a timeout. If an event is processed, the
// return value is the 'id' field from that event. 'ni' may be NULL. // return value is the 'id' field from that event. 'ni' may be NULL.
API char32_t ncdirect_getc(struct ncdirect* n, const struct timespec* ts, API uint32_t ncdirect_getc(struct ncdirect* n, const struct timespec* ts,
sigset_t* sigmask, ncinput* ni) sigset_t* sigmask, ncinput* ni)
__attribute__ ((nonnull (1))); __attribute__ ((nonnull (1)));
@ -326,7 +326,7 @@ API int ncdirect_inputready_fd(struct ncdirect* n)
// 'ni' may be NULL if the caller is uninterested in event details. If no event // 'ni' may be NULL if the caller is uninterested in event details. If no event
// is ready, returns 0. // is ready, returns 0.
static inline char32_t static inline uint32_t
ncdirect_getc_nblock(struct ncdirect* n, ncinput* ni){ ncdirect_getc_nblock(struct ncdirect* n, ncinput* ni){
sigset_t sigmask; sigset_t sigmask;
sigfillset(&sigmask); sigfillset(&sigmask);
@ -336,7 +336,7 @@ ncdirect_getc_nblock(struct ncdirect* n, ncinput* ni){
// 'ni' may be NULL if the caller is uninterested in event details. Blocks // 'ni' may be NULL if the caller is uninterested in event details. Blocks
// until an event is processed or a signal is received. // until an event is processed or a signal is received.
static inline char32_t static inline uint32_t
ncdirect_getc_blocking(struct ncdirect* n, ncinput* ni){ ncdirect_getc_blocking(struct ncdirect* n, ncinput* ni){
sigset_t sigmask; sigset_t sigmask;
sigemptyset(&sigmask); sigemptyset(&sigmask);

View File

@ -2,7 +2,6 @@
#define NOTCURSES_NOTCURSES #define NOTCURSES_NOTCURSES
#include <time.h> #include <time.h>
#include <uchar.h>
#include <ctype.h> #include <ctype.h>
#include <wchar.h> #include <wchar.h>
#include <stdio.h> #include <stdio.h>
@ -104,12 +103,12 @@ typedef enum {
// -1 if a non-printable/illegal character is encountered. // -1 if a non-printable/illegal character is encountered.
API int ncstrwidth(const char* mbs); API int ncstrwidth(const char* mbs);
// input functions like notcurses_getc() return ucs32-encoded char32_t. convert // input functions like notcurses_getc() return ucs32-encoded uint32_t. convert
// a series of char32_t to utf8. result must be at least 4 bytes per input // a series of uint32_t to utf8. result must be at least 4 bytes per input
// char32_t (6 bytes per char32_t will future-proof against Unicode expansion). // uint32_t (6 bytes per uint32_t will future-proof against Unicode expansion).
// the number of bytes used is returned, or -1 if passed illegal ucs32, or too // the number of bytes used is returned, or -1 if passed illegal ucs32, or too
// small of a buffer. // small of a buffer.
API int notcurses_ucs32_to_utf8(const char32_t* ucs32, unsigned ucs32count, API int notcurses_ucs32_to_utf8(const uint32_t* ucs32, unsigned ucs32count,
unsigned char* resultbuf, size_t buflen); unsigned char* resultbuf, size_t buflen);
// background cannot be highcontrast, only foreground // background cannot be highcontrast, only foreground
@ -999,23 +998,23 @@ API void notcurses_drop_planes(struct notcurses* nc);
// //
// In the case of a valid read, a 32-bit Unicode codepoint is returned. 0 is // In the case of a valid read, a 32-bit Unicode codepoint is returned. 0 is
// returned to indicate that no input was available, but only by // returned to indicate that no input was available, but only by
// notcurses_getc(). Otherwise (including on EOF) (char32_t)-1 is returned. // notcurses_getc(). Otherwise (including on EOF) (uint32_t)-1 is returned.
// Is this char32_t a Supplementary Private Use Area-B codepoint? // Is this uint32_t a Supplementary Private Use Area-B codepoint?
static inline bool static inline bool
nckey_supppuab_p(char32_t w){ nckey_supppuab_p(uint32_t w){
return w >= 0x100000 && w <= 0x10fffd; return w >= 0x100000 && w <= 0x10fffd;
} }
// Is the event a synthesized mouse event? // Is the event a synthesized mouse event?
static inline bool static inline bool
nckey_mouse_p(char32_t r){ nckey_mouse_p(uint32_t r){
return r >= NCKEY_BUTTON1 && r <= NCKEY_RELEASE; return r >= NCKEY_BUTTON1 && r <= NCKEY_RELEASE;
} }
// An input event. Cell coordinates are currently defined only for mouse events. // An input event. Cell coordinates are currently defined only for mouse events.
typedef struct ncinput { typedef struct ncinput {
char32_t id; // identifier. Unicode codepoint or synthesized NCKEY event uint32_t id; // identifier. Unicode codepoint or synthesized NCKEY event
int y; // y cell coordinate of event, -1 for undefined int y; // y cell coordinate of event, -1 for undefined
int x; // x cell coordinate of event, -1 for undefined int x; // x cell coordinate of event, -1 for undefined
bool alt; // was alt held? bool alt; // was alt held?
@ -1045,10 +1044,10 @@ ncinput_equal_p(const ncinput* n1, const ncinput* n2){
// of 0 for non-blocking operation, and otherwise a timespec to bound blocking. // of 0 for non-blocking operation, and otherwise a timespec to bound blocking.
// Signals in sigmask (less several we handle internally) will be atomically // Signals in sigmask (less several we handle internally) will be atomically
// masked and unmasked per ppoll(2). It should generally contain all signals. // masked and unmasked per ppoll(2). It should generally contain all signals.
// Returns a single Unicode code point, or (char32_t)-1 on error. 'sigmask' may // Returns a single Unicode code point, or (uint32_t)-1 on error. 'sigmask' may
// be NULL. Returns 0 on a timeout. If an event is processed, the return value // be NULL. Returns 0 on a timeout. If an event is processed, the return value
// is the 'id' field from that event. 'ni' may be NULL. // is the 'id' field from that event. 'ni' may be NULL.
API char32_t notcurses_getc(struct notcurses* n, const struct timespec* ts, API uint32_t notcurses_getc(struct notcurses* n, const struct timespec* ts,
const sigset_t* sigmask, ncinput* ni) const sigset_t* sigmask, ncinput* ni)
__attribute__ ((nonnull (1))); __attribute__ ((nonnull (1)));
@ -1061,7 +1060,7 @@ API int notcurses_inputready_fd(struct notcurses* n)
// 'ni' may be NULL if the caller is uninterested in event details. If no event // 'ni' may be NULL if the caller is uninterested in event details. If no event
// is ready, returns 0. // is ready, returns 0.
static inline char32_t static inline uint32_t
notcurses_getc_nblock(struct notcurses* n, ncinput* ni){ notcurses_getc_nblock(struct notcurses* n, ncinput* ni){
sigset_t sigmask; sigset_t sigmask;
sigfillset(&sigmask); sigfillset(&sigmask);
@ -1071,7 +1070,7 @@ notcurses_getc_nblock(struct notcurses* n, ncinput* ni){
// 'ni' may be NULL if the caller is uninterested in event details. Blocks // 'ni' may be NULL if the caller is uninterested in event details. Blocks
// until an event is processed or a signal is received. // until an event is processed or a signal is received.
static inline char32_t static inline uint32_t
notcurses_getc_blocking(struct notcurses* n, ncinput* ni){ notcurses_getc_blocking(struct notcurses* n, ncinput* ni){
sigset_t sigmask; sigset_t sigmask;
sigemptyset(&sigmask); sigemptyset(&sigmask);

View File

@ -62,11 +62,11 @@ void interrupt_and_restart_demos(void);
// demos should not call notcurses_getc() directly, as it's being monitored by // demos should not call notcurses_getc() directly, as it's being monitored by
// the toplevel event listener. instead, call this intermediate API. just // the toplevel event listener. instead, call this intermediate API. just
// replace 'notcurses' with 'demo'. // replace 'notcurses' with 'demo'.
char32_t demo_getc(struct notcurses* nc, const struct timespec* ts, ncinput* ni); uint32_t demo_getc(struct notcurses* nc, const struct timespec* ts, ncinput* ni);
// 'ni' may be NULL if the caller is uninterested in event details. If no event // 'ni' may be NULL if the caller is uninterested in event details. If no event
// is ready, returns 0. // is ready, returns 0.
static inline char32_t static inline uint32_t
demo_getc_nblock(struct notcurses* nc, ncinput* ni){ demo_getc_nblock(struct notcurses* nc, ncinput* ni){
struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 };
return demo_getc(nc, &ts, ni); return demo_getc(nc, &ts, ni);
@ -78,7 +78,7 @@ int demo_input_fd(void);
// 'ni' may be NULL if the caller is uninterested in event details. Blocks // 'ni' may be NULL if the caller is uninterested in event details. Blocks
// until an event is processed or a signal is received. // until an event is processed or a signal is received.
static inline char32_t static inline uint32_t
demo_getc_blocking(struct notcurses* nc, ncinput* ni){ demo_getc_blocking(struct notcurses* nc, ncinput* ni){
return demo_getc(nc, NULL, ni); return demo_getc(nc, NULL, ni);
} }

View File

@ -616,7 +616,7 @@ int demo_render(struct notcurses* nc){
ncplane_off_styles(hud, NCSTYLE_BOLD); ncplane_off_styles(hud, NCSTYLE_BOLD);
} }
ncinput ni; ncinput ni;
char32_t id; uint32_t id;
id = demo_getc_nblock(nc, &ni); id = demo_getc_nblock(nc, &ni);
int ret = notcurses_render(nc); int ret = notcurses_render(nc);
if(ret){ if(ret){

View File

@ -45,7 +45,7 @@ handle_mouse(const ncinput* ni){
// incoming timespec is relative (or even NULL, for blocking), but we need // incoming timespec is relative (or even NULL, for blocking), but we need
// absolute deadline, so convert it up. // absolute deadline, so convert it up.
char32_t demo_getc(struct notcurses* nc, const struct timespec* ts, ncinput* ni){ uint32_t demo_getc(struct notcurses* nc, const struct timespec* ts, ncinput* ni){
struct timespec now; struct timespec now;
clock_gettime(CLOCK_REALTIME, &now); clock_gettime(CLOCK_REALTIME, &now);
uint64_t ns; uint64_t ns;
@ -64,7 +64,7 @@ char32_t demo_getc(struct notcurses* nc, const struct timespec* ts, ncinput* ni)
struct timespec abstime; struct timespec abstime;
ns_to_timespec(ns + timespec_to_ns(&now), &abstime); ns_to_timespec(ns + timespec_to_ns(&now), &abstime);
bool handoff = false; // does the input go back to the user? bool handoff = false; // does the input go back to the user?
char32_t id; uint32_t id;
do{ do{
pthread_mutex_lock(&lock); pthread_mutex_lock(&lock);
while(!queue){ while(!queue){
@ -130,8 +130,8 @@ static void *
ultramegaok_demo(void* vnc){ ultramegaok_demo(void* vnc){
ncinput ni; ncinput ni;
struct notcurses* nc = vnc; struct notcurses* nc = vnc;
char32_t id; uint32_t id;
while((id = notcurses_getc_blocking(nc, &ni)) != (char32_t)-1){ while((id = notcurses_getc_blocking(nc, &ni)) != (uint32_t)-1){
if(id == 0){ if(id == 0){
continue; continue;
} }

View File

@ -147,8 +147,8 @@ reader_post(struct notcurses* nc, struct ncselector* selector, struct ncmultisel
struct timespec rel; struct timespec rel;
ns_to_timespec(targ - cur, &rel); ns_to_timespec(targ - cur, &rel);
ncinput ni; ncinput ni;
char32_t wc = demo_getc(nc, &rel, &ni); uint32_t wc = demo_getc(nc, &rel, &ni);
if(wc == (char32_t)-1){ if(wc == (uint32_t)-1){
return -1; return -1;
}else if(wc){ }else if(wc){
ncmultiselector_offer_input(mselector, &ni); ncmultiselector_offer_input(mselector, &ni);
@ -281,8 +281,8 @@ selector_run(struct notcurses* nc, struct ncplane* p, struct ncselector* selecto
struct ncinput ni; struct ncinput ni;
struct timespec inputtime; struct timespec inputtime;
ns_to_timespec(deadline_ns - timespec_to_ns(&now), &inputtime); ns_to_timespec(deadline_ns - timespec_to_ns(&now), &inputtime);
char32_t wc = demo_getc(nc, &inputtime, &ni); uint32_t wc = demo_getc(nc, &inputtime, &ni);
if(wc == (char32_t)-1){ if(wc == (uint32_t)-1){
return -1; return -1;
}else if(wc){ }else if(wc){
ncselector_offer_input(selector, &ni); ncselector_offer_input(selector, &ni);
@ -355,8 +355,8 @@ mselector_run(struct notcurses* nc, struct ncplane* p, struct ncmultiselector* m
struct ncinput ni; struct ncinput ni;
struct timespec inputtime; struct timespec inputtime;
ns_to_timespec(deadline_ns - timespec_to_ns(&now), &inputtime); ns_to_timespec(deadline_ns - timespec_to_ns(&now), &inputtime);
char32_t wc = demo_getc(nc, &inputtime, &ni); uint32_t wc = demo_getc(nc, &inputtime, &ni);
if(wc == (char32_t)-1){ if(wc == (uint32_t)-1){
return -1; return -1;
}else if(wc){ }else if(wc){
ncmultiselector_offer_input(mselector, &ni); ncmultiselector_offer_input(mselector, &ni);

View File

@ -11,7 +11,7 @@
// not reported in their bare form to the user. For our purposes, these usually // not reported in their bare form to the user. For our purposes, these usually
// indicate a mouse event. // indicate a mouse event.
#define CSIPREFIX "\x1b[" #define CSIPREFIX "\x1b["
static const char32_t NCKEY_CSI = 0x90; // guaranteed not to match anything else static const uint32_t NCKEY_CSI = 0x90; // guaranteed not to match anything else
static sig_atomic_t resize_seen; static sig_atomic_t resize_seen;
@ -102,7 +102,7 @@ unpop_keypress(ncinputlayer* nc, int kpress){
// we assumed escapes can only be composed of 7-bit chars // we assumed escapes can only be composed of 7-bit chars
typedef struct esctrie { typedef struct esctrie {
char32_t special; // composed key terminating here uint32_t special; // composed key terminating here
struct esctrie** trie; // if non-NULL, next level of radix-128 trie struct esctrie** trie; // if non-NULL, next level of radix-128 trie
} esctrie; } esctrie;
@ -134,7 +134,7 @@ input_free_esctrie(esctrie** eptr){
} }
static int static int
ncinputlayer_add_input_escape(ncinputlayer* nc, const char* esc, char32_t special){ ncinputlayer_add_input_escape(ncinputlayer* nc, const char* esc, uint32_t special){
if(esc[0] != NCKEY_ESC || strlen(esc) < 2){ // assume ESC prefix + content if(esc[0] != NCKEY_ESC || strlen(esc) < 2){ // assume ESC prefix + content
logerror("Not an escape: %s (0x%x)\n", esc, special); logerror("Not an escape: %s (0x%x)\n", esc, special);
return -1; return -1;
@ -181,7 +181,7 @@ ncinputlayer_add_input_escape(ncinputlayer* nc, const char* esc, char32_t specia
// mouse and cursor location reports. The former is three parameters starting // mouse and cursor location reports. The former is three parameters starting
// with '<' and ending with 'm' or 'M'; the latter is two ending with 'R'. // with '<' and ending with 'm' or 'M'; the latter is two ending with 'R'.
// Both use 1-biased coordinates, so a 0 can be safely rejected. // Both use 1-biased coordinates, so a 0 can be safely rejected.
static char32_t static uint32_t
handle_csi(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){ handle_csi(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
// stash the first parameter away. it's encoded if the CSI ends up being a // stash the first parameter away. it's encoded if the CSI ends up being a
// mouse event, and otherwise it's the cursor's column (x) coordinate. // mouse event, and otherwise it's the cursor's column (x) coordinate.
@ -193,7 +193,7 @@ handle_csi(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
PARAM3, // reading third param (y coordinate) plus terminator PARAM3, // reading third param (y coordinate) plus terminator
} state = PARAM1; } state = PARAM1;
int param = 0; // numeric translation of param thus far int param = 0; // numeric translation of param thus far
char32_t id = (char32_t)-1; uint32_t id = (uint32_t)-1;
while(nc->inputbuf_occupied){ while(nc->inputbuf_occupied){
int candidate = pop_input_keypress(nc); int candidate = pop_input_keypress(nc);
logdebug("Candidate: %c (%d)\n", candidate, candidate); logdebug("Candidate: %c (%d)\n", candidate, candidate);
@ -285,7 +285,7 @@ handle_csi(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
// FIXME ungetc on failure! walk trie backwards or something // FIXME ungetc on failure! walk trie backwards or something
// FIXME increment the input_error stat // FIXME increment the input_error stat
logerror("Error processing CSI (%d left)\n", nc->inputbuf_occupied); logerror("Error processing CSI (%d left)\n", nc->inputbuf_occupied);
return (char32_t)-1; return (uint32_t)-1;
} }
// add the keypress we just read to our input queue (assuming there is room). // add the keypress we just read to our input queue (assuming there is room).
@ -315,7 +315,7 @@ handle_csi(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
// CSI is most relevant to us here, since mouse and cursor reports arrive that // CSI is most relevant to us here, since mouse and cursor reports arrive that
// way. CSI is properly terminated by 0x40--0x7e. the parameter space covers // way. CSI is properly terminated by 0x40--0x7e. the parameter space covers
// 0x30--0x39 and the delimiter 0x3b (';'). // 0x30--0x39 and the delimiter 0x3b (';').
static char32_t static uint32_t
handle_getc(ncinputlayer* nc, int kpress, ncinput* ni, int leftmargin, int topmargin){ handle_getc(ncinputlayer* nc, int kpress, ncinput* ni, int leftmargin, int topmargin){
if(kpress < 0){ if(kpress < 0){
return -1; return -1;
@ -443,14 +443,14 @@ enqueue_cursor_report(ncinputlayer* nc, const ncinput* ni){
return 0; return 0;
} }
static char32_t static uint32_t
handle_queued_input(ncinputlayer* nc, ncinput* ni, handle_queued_input(ncinputlayer* nc, ncinput* ni,
int leftmargin, int topmargin){ int leftmargin, int topmargin){
ncinput nireal; ncinput nireal;
if(ni == NULL){ if(ni == NULL){
ni = &nireal; ni = &nireal;
} }
char32_t ret; uint32_t ret;
do{ do{
// if there was some error in getc(), we still dole out the existing queue // if there was some error in getc(), we still dole out the existing queue
if(nc->inputbuf_occupied == 0){ if(nc->inputbuf_occupied == 0){
@ -458,7 +458,7 @@ handle_queued_input(ncinputlayer* nc, ncinput* ni,
} }
int r = pop_input_keypress(nc); int r = pop_input_keypress(nc);
ret = handle_getc(nc, r, ni, leftmargin, topmargin); ret = handle_getc(nc, r, ni, leftmargin, topmargin);
if(ret != (char32_t)-1){ if(ret != (uint32_t)-1){
ni->id = ret; ni->id = ret;
} }
if(ret == NCKEY_CURSOR_LOCATION_REPORT){ if(ret == NCKEY_CURSOR_LOCATION_REPORT){
@ -500,7 +500,7 @@ fill_buffer(ncinputlayer* nc){
// user-mode call to actual input i/o, which will get the next character from // user-mode call to actual input i/o, which will get the next character from
// the input buffer. // the input buffer.
static char32_t static uint32_t
handle_input(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){ handle_input(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
fill_buffer(nc); fill_buffer(nc);
// highest priority is resize notifications, since they don't queue // highest priority is resize notifications, since they don't queue
@ -511,12 +511,12 @@ handle_input(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
return handle_queued_input(nc, ni, leftmargin, topmargin); return handle_queued_input(nc, ni, leftmargin, topmargin);
} }
static char32_t static uint32_t
handle_ncinput(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){ handle_ncinput(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
if(ni){ if(ni){
memset(ni, 0, sizeof(*ni)); memset(ni, 0, sizeof(*ni));
} }
char32_t r = handle_input(nc, ni, leftmargin, topmargin); uint32_t r = handle_input(nc, ni, leftmargin, topmargin);
// ctrl (*without* alt) + letter maps to [1..26], and is independent of shift // ctrl (*without* alt) + letter maps to [1..26], and is independent of shift
// FIXME need to distinguish between: // FIXME need to distinguish between:
// - Enter and ^J // - Enter and ^J
@ -543,7 +543,7 @@ handle_ncinput(ncinputlayer* nc, ncinput* ni, int leftmargin, int topmargin){
} }
// helper so we can do counter increment at a single location // helper so we can do counter increment at a single location
static inline char32_t static inline uint32_t
ncinputlayer_prestamp(ncinputlayer* nc, const struct timespec *ts, ncinputlayer_prestamp(ncinputlayer* nc, const struct timespec *ts,
const sigset_t* sigmask, ncinput* ni, int leftmargin, const sigset_t* sigmask, ncinput* ni, int leftmargin,
int topmargin){ int topmargin){
@ -561,11 +561,11 @@ ncinputlayer_prestamp(ncinputlayer* nc, const struct timespec *ts,
} }
// infp has already been set non-blocking // infp has already been set non-blocking
char32_t notcurses_getc(notcurses* nc, const struct timespec *ts, uint32_t notcurses_getc(notcurses* nc, const struct timespec *ts,
const sigset_t* sigmask, ncinput* ni){ const sigset_t* sigmask, ncinput* ni){
char32_t r = ncinputlayer_prestamp(&nc->tcache.input, ts, sigmask, ni, uint32_t r = ncinputlayer_prestamp(&nc->tcache.input, ts, sigmask, ni,
nc->margin_l, nc->margin_t); nc->margin_l, nc->margin_t);
if(r != (char32_t)-1){ if(r != (uint32_t)-1){
uint64_t stamp = nc->tcache.input.input_events++; // need increment even if !ni uint64_t stamp = nc->tcache.input.input_events++; // need increment even if !ni
if(ni){ if(ni){
ni->seqnum = stamp; ni->seqnum = stamp;
@ -574,10 +574,10 @@ char32_t notcurses_getc(notcurses* nc, const struct timespec *ts,
return r; return r;
} }
char32_t ncdirect_getc(ncdirect* nc, const struct timespec *ts, uint32_t ncdirect_getc(ncdirect* nc, const struct timespec *ts,
sigset_t* sigmask, ncinput* ni){ sigset_t* sigmask, ncinput* ni){
char32_t r = ncinputlayer_prestamp(&nc->tcache.input, ts, sigmask, ni, 0, 0); uint32_t r = ncinputlayer_prestamp(&nc->tcache.input, ts, sigmask, ni, 0, 0);
if(r != (char32_t)-1){ if(r != (uint32_t)-1){
uint64_t stamp = nc->tcache.input.input_events++; // need increment even if !ni uint64_t stamp = nc->tcache.input.input_events++; // need increment even if !ni
if(ni){ if(ni){
ni->seqnum = stamp; ni->seqnum = stamp;
@ -591,7 +591,7 @@ static int
prep_special_keys(ncinputlayer* nc){ prep_special_keys(ncinputlayer* nc){
static const struct { static const struct {
const char* tinfo; const char* tinfo;
char32_t key; uint32_t key;
} keys[] = { } keys[] = {
{ .tinfo = "kcub1", .key = NCKEY_LEFT, }, { .tinfo = "kcub1", .key = NCKEY_LEFT, },
{ .tinfo = "kcuf1", .key = NCKEY_RIGHT, }, { .tinfo = "kcuf1", .key = NCKEY_RIGHT, },

View File

@ -5,7 +5,7 @@
// codepoint appears in 'col', and the byte offset as the return value. If not // codepoint appears in 'col', and the byte offset as the return value. If not
// found, -1 is returned, and 'col' is meaningless. // found, -1 is returned, and 'col' is meaningless.
static int static int
mbstr_find_codepoint(const char* s, char32_t cp, int* col){ mbstr_find_codepoint(const char* s, uint32_t cp, int* col){
mbstate_t ps; mbstate_t ps;
memset(&ps, 0, sizeof(ps)); memset(&ps, 0, sizeof(ps));
size_t bytes = 0; size_t bytes = 0;

View File

@ -3000,7 +3000,7 @@ int ncplane_putnstr_yx(struct ncplane* n, int y, int x, size_t s, const char* gc
return ret; return ret;
} }
int notcurses_ucs32_to_utf8(const char32_t* ucs32, unsigned ucs32count, int notcurses_ucs32_to_utf8(const uint32_t* ucs32, unsigned ucs32count,
unsigned char* resultbuf, size_t buflen){ unsigned char* resultbuf, size_t buflen){
if(u32_to_u8(ucs32, ucs32count, resultbuf, &buflen) == NULL){ if(u32_to_u8(ucs32, ucs32count, resultbuf, &buflen) == NULL){
return -1; return -1;

View File

@ -1115,7 +1115,7 @@ notcurses_rasterize_inner(notcurses* nc, ncpile* p, FILE* out, unsigned* asu){
if(rasterize_core(nc, p, out, 1)){ if(rasterize_core(nc, p, out, 1)){
return -1; return -1;
} }
#define MIN_SUMODE_SIZE 4096 // FIXME #define MIN_SUMODE_SIZE BUFSIZ
if(*asu){ if(*asu){
if(nc->rstate.mstrsize >= MIN_SUMODE_SIZE){ if(nc->rstate.mstrsize >= MIN_SUMODE_SIZE){
const char* endasu = get_escape(&nc->tcache, ESCAPE_ESUM); const char* endasu = get_escape(&nc->tcache, ESCAPE_ESUM);

View File

@ -9,8 +9,8 @@ int main(void){
return EXIT_FAILURE; return EXIT_FAILURE;
} }
ncinput ni; ncinput ni;
char32_t i; uint32_t i;
while((i = ncdirect_getc_blocking(n, &ni)) != (char32_t)-1){ while((i = ncdirect_getc_blocking(n, &ni)) != (uint32_t)-1){
unsigned char utf8[5] = {}; unsigned char utf8[5] = {};
notcurses_ucs32_to_utf8(&i, 1, utf8, sizeof(utf8)); notcurses_ucs32_to_utf8(&i, 1, utf8, sizeof(utf8));
printf("Read input: [%c%c%c] %s\n", ni.ctrl ? 'C' : 'c', printf("Read input: [%c%c%c] %s\n", ni.ctrl ? 'C' : 'c',
@ -19,7 +19,7 @@ int main(void){
break; break;
} }
} }
if(ncdirect_stop(n) || i == (char32_t)-1){ if(ncdirect_stop(n) || i == (uint32_t)-1){
fprintf(stderr, "Failure reading input (%s)\n", strerror(errno)); fprintf(stderr, "Failure reading input (%s)\n", strerror(errno));
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -25,10 +25,10 @@ run_menu(struct notcurses* nc, struct ncmenu* ncm){
if(ncplane_set_base(selplane, " ", 0, channels) < 0){ if(ncplane_set_base(selplane, " ", 0, channels) < 0){
goto err; goto err;
} }
char32_t keypress; uint32_t keypress;
ncinput ni; ncinput ni;
notcurses_render(nc); notcurses_render(nc);
while((keypress = notcurses_getc_blocking(nc, &ni)) != (char32_t)-1){ while((keypress = notcurses_getc_blocking(nc, &ni)) != (uint32_t)-1){
if(!ncmenu_offer_input(ncm, &ni)){ if(!ncmenu_offer_input(ncm, &ni)){
if(keypress == 'q'){ if(keypress == 'q'){
ncmenu_destroy(ncm); ncmenu_destroy(ncm);

View File

@ -41,9 +41,9 @@ run_mselect(struct notcurses* nc, struct ncmultiselector* ns){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
notcurses_render(nc); notcurses_render(nc);
char32_t keypress; uint32_t keypress;
ncinput ni; ncinput ni;
while((keypress = notcurses_getc_blocking(nc, &ni)) != (char32_t)-1){ while((keypress = notcurses_getc_blocking(nc, &ni)) != (uint32_t)-1){
if(!ncmultiselector_offer_input(ns, &ni)){ if(!ncmultiselector_offer_input(ns, &ni)){
switch(keypress){ switch(keypress){
case NCKEY_ENTER: ncmultiselector_destroy(ns); return; case NCKEY_ENTER: ncmultiselector_destroy(ns); return;

View File

@ -31,9 +31,9 @@ run_selector(struct notcurses* nc, struct ncselector* ns){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
notcurses_render(nc); notcurses_render(nc);
char32_t keypress; uint32_t keypress;
ncinput ni; ncinput ni;
while((keypress = notcurses_getc_blocking(nc, &ni)) != (char32_t)-1){ while((keypress = notcurses_getc_blocking(nc, &ni)) != (uint32_t)-1){
if(!ncselector_offer_input(ns, &ni)){ if(!ncselector_offer_input(ns, &ni)){
switch(keypress){ switch(keypress){
case NCKEY_ENTER: ncselector_destroy(ns, NULL); return; case NCKEY_ENTER: ncselector_destroy(ns, NULL); return;

View File

@ -96,7 +96,7 @@ int main(int argc, char** argv){
REDRAW(); REDRAW();
t_ = nctabbed_add(nct, NULL, NULL, tabcbfn, "gamma", NULL); t_ = nctabbed_add(nct, NULL, NULL, tabcbfn, "gamma", NULL);
REDRAW(); REDRAW();
char32_t c; uint32_t c;
while((c = notcurses_getc_blocking(nc, NULL)) != 'q'){ while((c = notcurses_getc_blocking(nc, NULL)) != 'q'){
switch(c){ switch(c){
case NCKEY_RIGHT: case NCKEY_RIGHT:

View File

@ -391,7 +391,7 @@ callback(struct ncplane* ncp, void* curry, int dizzy){
static int static int
tree_ui(struct notcurses* nc, struct nctree* tree){ tree_ui(struct notcurses* nc, struct nctree* tree){
ncinput ni; ncinput ni;
while(notcurses_getc_blocking(nc, &ni) != (char32_t)-1){ while(notcurses_getc_blocking(nc, &ni) != (uint32_t)-1){
if(nctree_offer_input(tree, &ni)){ if(nctree_offer_input(tree, &ni)){
if(nctree_redraw(tree)){ if(nctree_redraw(tree)){
return -1; return -1;