X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_slk.c;h=84f17ae03705d6af7dd575f296f79f4a095ad6b2;hp=a1dea62660ebd75ba2ea9cd87cf5363da3505821;hb=0de8912c1c0746eb37b733e9e6fdf852aab9506a;hpb=dfaa1a3001fd447819f5edc2e523acc1a04f1440;ds=sidebyside diff --git a/ncurses/base/lib_slk.c b/ncurses/base/lib_slk.c index a1dea626..84f17ae0 100644 --- a/ncurses/base/lib_slk.c +++ b/ncurses/base/lib_slk.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -47,7 +47,19 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_slk.c,v 1.40 2009/07/19 00:34:07 tom Exp $") +MODULE_ID("$Id: lib_slk.c,v 1.48 2011/03/05 21:21:52 tom Exp $") + +#ifdef USE_TERM_DRIVER +#define NumLabels InfoOf(SP_PARM).numlabels +#define NoColorVideo InfoOf(SP_PARM).nocolorvideo +#define LabelWidth InfoOf(SP_PARM).labelwidth +#define LabelHeight InfoOf(SP_PARM).labelheight +#else +#define NumLabels num_labels +#define NoColorVideo no_color_video +#define LabelWidth label_width +#define LabelHeight label_height +#endif /* * Free any memory related to soft labels, return an error. @@ -67,7 +79,7 @@ NCURSES_EXPORT(int) _nc_format_slks(NCURSES_SP_DCLx int cols) { int gap, i, x; - unsigned max_length; + int max_length; if (!SP_PARM || !SP_PARM->_slk) return ERR; @@ -86,7 +98,7 @@ _nc_format_slks(NCURSES_SP_DCLx int cols) } } else { if (SP_PARM->slk_format == 2) { /* 4-4 */ - gap = cols - (SP_PARM->_slk->maxlab * max_length) - 6; + gap = cols - (int) (SP_PARM->_slk->maxlab * max_length) - 6; if (gap < 1) gap = 1; @@ -107,8 +119,9 @@ _nc_format_slks(NCURSES_SP_DCLx int cols) x += max_length; x += (i == 2 || i == 4) ? gap : 1; } - } else - returnCode(slk_failed(NCURSES_SP_ARG)); + } else { + return slk_failed(NCURSES_SP_ARG); + } } } SP_PARM->_slk->dirty = TRUE; @@ -125,9 +138,8 @@ _nc_slk_initialize(WINDOW *stwin, int cols) { int i; int res = OK; - unsigned max_length; + size_t max_length; SCREEN *sp; - TERMINAL *term; int numlab; T((T_CALLED("_nc_slk_initialize()"))); @@ -138,18 +150,15 @@ _nc_slk_initialize(WINDOW *stwin, int cols) if (0 == sp) returnCode(ERR); - term = TerminalOf(SP_PARM); - assert(term); + assert(TerminalOf(SP_PARM)); - numlab = InfoOf(SP_PARM).numlabels; + numlab = NumLabels; if (SP_PARM->_slk) { /* we did this already, so simply return */ returnCode(OK); } else if ((SP_PARM->_slk = typeCalloc(SLK, 1)) == 0) returnCode(ERR); - SP_PARM->_slk->hidden = TRUE; - SP_PARM->_slk->ent = NULL; if (!SP_PARM->slk_format) SP_PARM->slk_format = _nc_globals.slk_format; @@ -158,29 +167,29 @@ _nc_slk_initialize(WINDOW *stwin, int cols) * with colors. In that case, we're still guaranteed that "reverse" would * work. */ - if ((InfoOf(SP_PARM).nocolorvideo & 1) == 0) + if ((NoColorVideo & 1) == 0) SetAttr(SP_PARM->_slk->attr, A_STANDOUT); else SetAttr(SP_PARM->_slk->attr, A_REVERSE); - SP_PARM->_slk->maxlab = ((numlab > 0) - ? numlab - : MAX_SKEY(SP_PARM->slk_format)); - SP_PARM->_slk->maxlen = ((numlab > 0) - ? InfoOf(SP_PARM).labelwidth * InfoOf(SP_PARM).labelheight - : MAX_SKEY_LEN(SP_PARM->slk_format)); - SP_PARM->_slk->labcnt = ((SP_PARM->_slk->maxlab < MAX_SKEY(SP_PARM->slk_format)) - ? MAX_SKEY(SP_PARM->slk_format) - : SP_PARM->_slk->maxlab); + SP_PARM->_slk->maxlab = (short) ((numlab > 0) + ? numlab + : MAX_SKEY(SP_PARM->slk_format)); + SP_PARM->_slk->maxlen = (short) ((numlab > 0) + ? LabelWidth * LabelHeight + : MAX_SKEY_LEN(SP_PARM->slk_format)); + SP_PARM->_slk->labcnt = (short) ((SP_PARM->_slk->maxlab < MAX_SKEY(SP_PARM->slk_format)) + ? MAX_SKEY(SP_PARM->slk_format) + : SP_PARM->_slk->maxlab); if (SP_PARM->_slk->maxlen <= 0 || SP_PARM->_slk->labcnt <= 0 || (SP_PARM->_slk->ent = typeCalloc(slk_ent, - (unsigned) SP_PARM->_slk->labcnt)) + (size_t) SP_PARM->_slk->labcnt)) == NULL) returnCode(slk_failed(NCURSES_SP_ARG)); - max_length = SP_PARM->_slk->maxlen; + max_length = (size_t) SP_PARM->_slk->maxlen; for (i = 0; i < SP_PARM->_slk->labcnt; i++) { size_t used = max_length + 1; @@ -192,9 +201,12 @@ _nc_slk_initialize(WINDOW *stwin, int cols) SP_PARM->_slk->ent[i].form_text = (char *) _nc_doalloc(0, used); if (SP_PARM->_slk->ent[i].form_text == 0) returnCode(slk_failed(NCURSES_SP_ARG)); - memset(SP_PARM->_slk->ent[i].form_text, 0, used); - memset(SP_PARM->_slk->ent[i].form_text, ' ', max_length); + if (used > 1) { + memset(SP_PARM->_slk->ent[i].form_text, ' ', used - 1); + } + SP_PARM->_slk->ent[i].form_text[used - 1] = '\0'; + SP_PARM->_slk->ent[i].visible = (char) (i < SP_PARM->_slk->maxlab); } @@ -218,7 +230,7 @@ _nc_slk_initialize(WINDOW *stwin, int cols) NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_restore) (NCURSES_SP_DCL0) { - T((T_CALLED("slk_restore(%p)"), SP_PARM)); + T((T_CALLED("slk_restore(%p)"), (void *) SP_PARM)); if (0 == SP_PARM) returnCode(ERR);