Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=fwsetup-ng.git;a=commitdiff;h=3664b34992f1ad11b689cabd56f6159675fda292
commit 3664b34992f1ad11b689cabd56f6159675fda292 Author: James Buren <[email protected]> Date: Sat Aug 11 11:45:55 2012 -0500 add get_text_size() function. it measures screen dimensions needed to properly display the text block on the terminal. diff --git a/fwsetup.h b/fwsetup.h index 4e77bb6..e91924e 100644 --- a/fwsetup.h +++ b/fwsetup.h @@ -27,6 +27,8 @@ struct database int window_x; int window_y; }; + +extern bool get_text_size(const char *text,int *width,int *height); #else #error "No known user interface is defined." #endif diff --git a/utility.c b/utility.c index 42b0149..b236ec7 100644 --- a/utility.c +++ b/utility.c @@ -13,4 +13,73 @@ extern void eprintf(const char *s,...) va_end(args); } +#ifdef NEWT +extern bool get_text_size(const char *text,int *width,int *height) +{ + assert(text != 0); + assert(width != 0); + assert(height != 0); + + wchar_t wc = 0; + size_t n = 0; + size_t len = strlen(text); + mbstate_t mbs; + int cw = 0; + int w = 0; + int h = 0; + int i = 0; + + memzero(&mbs,sizeof(mbstate_t)); + + while(true) + { + n = mbrtowc(&wc,text,len,&mbs); + + if(n == (size_t) -1 || n == (size_t) -2) + return false; + + if(n == 0) + break; + + switch(wc) + { + case L'\n': + if(cw > w) + w = cw; + cw = 0; + ++h; + break; + + case L'\t': + cw += 8; + break; + + default: + i = wcwidth(wc); + if(i > 0) + cw += i; + break; + } + + text += n; + + len -= n; + } + + if(w == 0 && cw > 0) + w = cw; + else if(w == 0) + w = 1; + + if(h == 0) + h = 1; + + *width = w; + + *height = h; + + return true; +} +#endif + // -%- strip: yes; add-newline: yes; use-tabs: no; indent-width: 2; tab-width: 2; -%- _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
