/** * @brief Initialize the newt library * @return int - 0 for success, else < 0 */ int newtInit(void) { char * MonoValue, * MonoEnv = "NEWT_MONO"; const char *lang; int ret; if ((lang = getenv("LC_ALL")) == NULL) if ((lang = getenv("LC_CTYPE")) == NULL) if ((lang = getenv("LANG")) == NULL) lang = ""; /* slang doesn't support multibyte encodings except UTF-8, avoid character corruption by redrawing the screen */ if (strstr (lang, ".euc") != NULL) trashScreen = 1; (void) strlen(ident); SLutf8_enable(-1); SLtt_get_terminfo(); SLtt_get_screen_size(); MonoValue = getenv(MonoEnv); if ( MonoValue != NULL ) SLtt_Use_Ansi_Colors = 0; if ((ret = SLsmg_init_smg()) < 0) return ret; if ((ret = SLang_init_tty(0, 0, 0)) < 0) return ret; initColors(); newtCursorOff(); initKeymap(); SLsignal_intr(SIGWINCH, handleSigwinch); SLang_getkey_intr_hook = getkeyInterruptHook; return 0; }
int newtInit(void) { char * MonoValue, * MonoEnv = "NEWT_MONO", * lang; lang = getenv ("LANG"); if (lang && !strcasecmp (lang, "ja_JP.eucJP")) trashScreen = 1; /* use the version variable just to be sure it gets included */ strlen(version); SLtt_get_terminfo(); SLtt_get_screen_size(); MonoValue = getenv(MonoEnv); if ( MonoValue == NULL ) { SLtt_Use_Ansi_Colors = 1; } else { SLtt_Use_Ansi_Colors = 0; } SLsmg_init_smg(); SLang_init_tty(0, 0, 0); newtSetColors(newtDefaultColorPalette); newtCursorOff(); /*initKeymap();*/ /*memset(&sa, 0, sizeof(sa)); sa.sa_handler = handleSigwinch; sigaction(SIGWINCH, &sa, NULL);*/ SLsignal_intr(SIGWINCH, handleSigwinch); SLang_getkey_intr_hook = getkeyInterruptHook; return 0; }
static struct eventResult listboxEvent(newtComponent co, struct event ev) { struct eventResult er; struct listbox * li = co->data; struct items *item; int i; er.result = ER_IGNORED; if(ev.when == EV_EARLY || ev.when == EV_LATE) { return er; } switch(ev.event) { case EV_KEYPRESS: if (!li->isActive) break; switch(ev.u.key) { case ' ': if(!(li->flags & NEWT_FLAG_MULTIPLE)) break; newtListboxSelectItem(co, newtListboxGetCurrent(co), NEWT_FLAGS_TOGGLE); er.result = ER_SWALLOWED; /* We don't break here, because it is cool to be able to hold space to select a bunch of items in a list at once */ case NEWT_KEY_DOWN: if(li->numItems <= 0) break; if(li->currItem < li->numItems - 1) { li->currItem++; if(li->currItem > (li->startShowItem + li->curHeight - 1)) { li->startShowItem = li->currItem - li->curHeight + 1; if(li->startShowItem + li->curHeight > li->numItems) li->startShowItem = li->numItems - li->curHeight; } if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; case NEWT_KEY_ENTER: if(li->numItems <= 0) break; if(li->flags & NEWT_FLAG_RETURNEXIT) er.result = ER_EXITFORM; break; case NEWT_KEY_UP: if(li->numItems <= 0) break; if(li->currItem > 0) { li->currItem--; if(li->currItem < li->startShowItem) li->startShowItem = li->currItem; if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; case NEWT_KEY_PGUP: if(li->numItems <= 0) break; li->startShowItem -= li->curHeight - 1; if(li->startShowItem < 0) li->startShowItem = 0; li->currItem -= li->curHeight - 1; if(li->currItem < 0) li->currItem = 0; newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; break; case NEWT_KEY_PGDN: if(li->numItems <= 0) break; li->startShowItem += li->curHeight; if(li->startShowItem > (li->numItems - li->curHeight)) { li->startShowItem = li->numItems - li->curHeight; } li->currItem += li->curHeight; if(li->currItem >= li->numItems) { li->currItem = li->numItems - 1; } newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; break; case NEWT_KEY_HOME: if(li->numItems <= 0) break; newtListboxSetCurrent(co, 0); er.result = ER_SWALLOWED; break; case NEWT_KEY_END: if(li->numItems <= 0) break; li->startShowItem = li->numItems - li->curHeight; if(li->startShowItem < 0) li->startShowItem = 0; li->currItem = li->numItems - 1; newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; break; default: if (li->numItems <= 0) break; if (ev.u.key < NEWT_KEY_EXTRA_BASE && isalpha(ev.u.key)) { for(i = 0, item = li->boxItems; item != NULL && i < li->currItem; i++, item = item->next); if (item && item->text && (toupper(*item->text) == toupper(ev.u.key))) { item = item->next; i++; } else { item = li->boxItems; i = 0; } while (item && item->text && toupper(*item->text) != toupper(ev.u.key)) { item = item->next; i++; } if (item) { li->currItem = i; if(li->currItem < li->startShowItem || li->currItem > li->startShowItem) li->startShowItem = li->currItem > li->numItems - li->curHeight ? li->startShowItem = li->numItems - li->curHeight : li->currItem; if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; } } } break; case EV_FOCUS: li->isActive = 1; listboxDraw(co); if(li->flags & NEWT_FLAG_SHOWCURSOR) newtCursorOn(); er.result = ER_SWALLOWED; break; case EV_UNFOCUS: li->isActive = 0; listboxDraw(co); if(li->flags & NEWT_FLAG_SHOWCURSOR) newtCursorOff(); er.result = ER_SWALLOWED; break; case EV_MOUSE: /* if this mouse click was within the listbox, make the current item the item clicked on. */ /* Up scroll arrow */ if (li->sb && ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 && ev.u.mouse.y == co->top + li->bdyAdjust) { if(li->numItems <= 0) break; if(li->currItem > 0) { li->currItem--; if(li->currItem < li->startShowItem) li->startShowItem = li->currItem; if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; } /* Down scroll arrow */ if (li->sb && ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 && ev.u.mouse.y == co->top + co->height - li->bdyAdjust - 1) { if(li->numItems <= 0) break; if(li->currItem < li->numItems - 1) { li->currItem++; if(li->currItem > (li->startShowItem + li->curHeight - 1)) { li->startShowItem = li->currItem - li->curHeight + 1; if(li->startShowItem + li->curHeight > li->numItems) li->startShowItem = li->numItems - li->curHeight; } if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; } if ((ev.u.mouse.y >= co->top + li->bdyAdjust) && (ev.u.mouse.y <= co->top + co->height - (li->bdyAdjust * 2)) && (ev.u.mouse.x >= co->left + li->bdxAdjust) && (ev.u.mouse.x <= co->left + co->width + (li->bdxAdjust * 2))) { li->currItem = li->startShowItem + (ev.u.mouse.y - li->bdyAdjust - co->top); newtListboxRealSetCurrent(co); listboxDraw(co); if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; } } return er; }