diff -ruN newt-0.52.2-old/checkboxtree.c newt-0.52.2/checkboxtree.c
--- newt-0.52.2-old/checkboxtree.c	2006-06-20 21:58:34.000000000 +0100
+++ newt-0.52.2/checkboxtree.c	2006-06-20 22:08:48.000000000 +0100
@@ -25,6 +25,7 @@
     int sbAdjust;
     int curWidth;
     int userHasSetWidth;
+    int isActive;
     char * seq;
     char * result;
 };
@@ -339,6 +340,7 @@
     co->width = 0;
     co->isMapped = 0;
     ct->curWidth = 0;
+    ct->isActive = 0;
     ct->userHasSetWidth = 0;
     ct->itemlist = NULL;
     ct->firstItem = NULL;
@@ -460,11 +462,7 @@
     
     while (*item && i < co->height) {
 	newtGotorc(co->top + i, co->left);
-	if (*item == *ct->currItem) {
-	    SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);
-	    currRow = co->top + i;
-	} else
-	    SLsmg_set_color(NEWT_COLORSET_LISTBOX);
+	SLsmg_set_color(NEWT_COLORSET_LISTBOX);
 
 	for (j = 0; j < (*item)->depth; j++)
 	    SLsmg_write_string("   ");
@@ -477,7 +475,7 @@
 	} else {
 	    if (ct->flags & NEWT_CHECKBOXTREE_HIDE_BOX) {
 		if ((*item)->selected)
-		    SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);
+		    SLsmg_set_color(NEWT_COLORSET_SELLISTBOX);
 	        SLsmg_write_string("    ");
 	    } else {
 	        char tmp[5];
@@ -486,11 +484,15 @@
 	        SLsmg_write_string(tmp);
 	    }
 	}
+	if (*item == *ct->currItem) {
+		SLsmg_set_color(ct->isActive ?
+			NEWT_COLORSET_ACTSELLISTBOX : NEWT_COLORSET_ACTLISTBOX);
+		currRow = co->top + i;
+	}
 
 	write_nstring_int((*item)->text, co->width - 4 - 
 					   (3 * (*item)->depth), NULL);
 
-	SLsmg_set_color(NEWT_COLORSET_LISTBOX);
 
 	item++;
 	i++;
@@ -687,11 +689,13 @@
 	break;
 
     case EV_FOCUS:
+	ct->isActive = 1;
 	ctDraw(co);
 	er.result = ER_SWALLOWED;
 	break;
 	
     case EV_UNFOCUS:
+	ct->isActive = 0;
 	ctDraw(co);
 	er.result = ER_SWALLOWED;
 	break;
diff -ruN newt-0.52.2-old/entry.c.orig newt-0.52.2/entry.c.orig
--- newt-0.52.2-old/entry.c.orig	2006-06-20 21:58:34.000000000 +0100
+++ newt-0.52.2/entry.c.orig	1970-01-01 01:00:00.000000000 +0100
@@ -1,460 +0,0 @@
-#include "config.h"
-
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-
-#include <ctype.h>
-#include <slang.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-
-#include "newt.h"
-#include "newt_pr.h"
-
-struct entry {
-    int flags;
-    char * buf;
-    const char ** resultPtr;
-    int bufAlloced;
-    int bufUsed;		/* amount of the buffer that's been used */
-    int cursorPosition; 	/* cursor *in the string* on on screen */
-    int firstChar;		/* first character position being shown */
-    newtEntryFilter filter;
-    void * filterData;
-};
-
-static void entryDraw(newtComponent co);
-static void entryDestroy(newtComponent co);
-static struct eventResult entryEvent(newtComponent co,
-			             struct event ev);
-
-static struct eventResult entryHandleKey(newtComponent co, int key);
-
-static struct componentOps entryOps = {
-    entryDraw,
-    entryEvent,
-    entryDestroy,
-    newtDefaultPlaceHandler,
-    newtDefaultMappedHandler,
-} ;
-
-void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd) {
-    struct entry * en = co->data;
-
-    if ((strlen(value) + 1) > (unsigned int)en->bufAlloced) {
-	free(en->buf);
-	en->bufAlloced = strlen(value) + 1;
-	en->buf = malloc(en->bufAlloced);
-	if (en->resultPtr) *en->resultPtr = en->buf;
-    }
-    memset(en->buf, 0, en->bufAlloced);		/* clear the buffer */
-    strcpy(en->buf, value);
-    en->bufUsed = strlen(value);
-    en->firstChar = 0;
-    if (cursorAtEnd)
-	en->cursorPosition = en->bufUsed;
-    else
-	en->cursorPosition = 0;
-
-    entryDraw(co);
-} ;
-
-newtComponent newtEntry(int left, int top, const char * initialValue, int width,
-			const char ** resultPtr, int flags) {
-    newtComponent co;
-    struct entry * en;
-
-    co = malloc(sizeof(*co));
-    en = malloc(sizeof(struct entry));
-    co->data = en;
-
-    co->top = top;
-    co->left = left;
-    co->height = 1;
-    co->width = width;
-    co->isMapped = 0;
-    co->callback = NULL;
-
-    co->ops = &entryOps;
-
-    en->flags = flags;
-    en->cursorPosition = 0;
-    en->firstChar = 0;
-    en->bufUsed = 0;
-    en->bufAlloced = width + 1;
-    en->filter = NULL;
-
-    if (!(en->flags & NEWT_FLAG_DISABLED))
-	co->takesFocus = 1;
-    else
-	co->takesFocus = 0;
-
-    if (initialValue && strlen(initialValue) > (unsigned int)width) {
-	en->bufAlloced = strlen(initialValue) + 1;
-    }
-    en->buf = malloc(en->bufAlloced);
-    en->resultPtr = resultPtr;
-    if (en->resultPtr) *en->resultPtr = en->buf;
-
-    memset(en->buf, 0, en->bufAlloced);
-    if (initialValue) {
-	strcpy(en->buf, initialValue);
-	en->bufUsed = strlen(initialValue);
-	en->cursorPosition = en->bufUsed;
-    } else {
-	*en->buf = '\0';
-	en->bufUsed = 0;
-	en->cursorPosition = 0;
-    }
-
-    return co;
-}
-
-static int visible_width(const char *str, int start, int end)
-{
-    int width = wstrlen(str + start, end-start);
-    int len, w = 0;
-    wchar_t wc;
-
-    len = mbtowc(&wc, str+end, MB_CUR_MAX);
-    if (len == 0)
-       w = 1;
-    else if (len > 0)
-       w = wcwidth(wc);
-    return width + w;
-}
-
-static void scroll(struct entry *en, int width)
-{
-    wchar_t wc;
-    int len, w;
-    int  newwidth = visible_width(en->buf, en->firstChar, en->cursorPosition);
-
-    while (newwidth > width) {
-        len = mbtowc(&wc, en->buf+en->firstChar, MB_CUR_MAX);
-	if (!len) {
-		en->firstChar++;
-		break;
-	}
-	if (len < 0)
-	   break;
-	w = wcwidth(wc);
-	if (w < 0)
-	   break;
-	en->firstChar += len;
-	newwidth -= w;
-    }
-}
-
-static void entryDraw(newtComponent co) {
-    struct entry * en = co->data;
-    int i;
-    char * chptr;
-    int len;
-    char *tmpptr = NULL;
-
-    if (!co->isMapped) return;
-
-    if (en->flags & NEWT_FLAG_DISABLED)
-	SLsmg_set_color(NEWT_COLORSET_DISENTRY);
-    else
-	SLsmg_set_color(NEWT_COLORSET_ENTRY);
-
-    if (en->flags & NEWT_FLAG_HIDDEN) {
-	newtGotorc(co->top, co->left);
-	for (i = 0; i < co->width; i++)
-	    SLsmg_write_char('_');
-	newtGotorc(co->top, co->left);
-
-	return;
-    }
-
-    newtGotorc(co->top, co->left);
-
-    if (en->cursorPosition < en->firstChar) {
-	/* scroll to the left */
-	en->firstChar = en->cursorPosition;
-    } else {
-	/* scroll to the right */
-	scroll(en, co->width);
-    }
-
-    chptr = en->buf + en->firstChar;
-
-    if (en->flags & NEWT_FLAG_PASSWORD) {
-	char *p;
-	tmpptr = alloca(strlen(chptr)+2);
-	strcpy(tmpptr, chptr);
-	for (p = tmpptr; *p; p++)
-	    *p = '*';
-	chptr = tmpptr;
-    }			
-
-    len = wstrlen(chptr, -1);
-
-    if (len <= co->width) {
-	i = len;
-	/* BIDI: do not replaced, because it will not work.
-	 * More work needed */
-	SLsmg_write_string(chptr);
-	while (i < co->width) {
-	    SLsmg_write_char('_');
-	    i++;
-	}
-    } else {
-        /* BIDI: will not work for RTL text */
-	SLsmg_write_nstring(chptr, co->width);
-    }
-
-    if (en->flags & NEWT_FLAG_HIDDEN)
-	newtGotorc(co->top, co->left);
-    else
-	newtGotorc(co->top, co->left + wstrlen(en->buf+en->firstChar, en->cursorPosition - en->firstChar));
-}
-
-void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense) {
-    struct entry * en = co->data;
-    int row, col;
-
-    en->flags = newtSetFlags(en->flags, flags, sense);
-
-    if (!(en->flags & NEWT_FLAG_DISABLED))
-	co->takesFocus = 1;
-    else
-	co->takesFocus = 0;
-
-    newtGetrc(&row, &col);
-    entryDraw(co);
-    newtGotorc(row, col);
-}
-
-static void entryDestroy(newtComponent co) {
-    struct entry * en = co->data;
-
-    free(en->buf);
-    free(en);
-    free(co);
-}
-
-static struct eventResult entryEvent(newtComponent co,
-				     struct event ev) {
-    struct entry * en = co->data;
-    struct eventResult er;
-    int ch;
-
-    if (ev.when == EV_NORMAL) {
-	switch (ev.event) {
-	case EV_FOCUS:
-	    newtCursorOn();
-	    if (en->flags & NEWT_FLAG_HIDDEN)
-		newtGotorc(co->top, co->left);
-	    else
-		newtGotorc(co->top, co->left +
-			   wstrlen(en->buf + en->firstChar, en->cursorPosition - en->firstChar));
-	    er.result = ER_SWALLOWED;
-	    break;
-
-	case EV_UNFOCUS:
-	    newtCursorOff();
-	    newtGotorc(0, 0);
-	    er.result = ER_SWALLOWED;
-	    if (co->callback)
-		co->callback(co, co->callbackData);
-	    break;
-
-	case EV_KEYPRESS:
-	    ch = ev.u.key;
-	    if (en->filter)
-		ch = en->filter(co, en->filterData, ch, en->cursorPosition);
-	    if (ch) er = entryHandleKey(co, ch);
-	    break;
-
-	case EV_MOUSE:
-	    if ((ev.u.mouse.type == MOUSE_BUTTON_DOWN) &&
-		(en->flags ^ NEWT_FLAG_HIDDEN)) {
-		if (strlen(en->buf) >= ev.u.mouse.x - co->left) {
-		    en->cursorPosition = ev.u.mouse.x - co->left;
-		    newtGotorc(co->top,
-			       co->left +(en->cursorPosition - en->firstChar));
-		} else {
-		    en->cursorPosition = strlen(en->buf);
-		    newtGotorc(co->top,
-			       co->left +(en->cursorPosition - en->firstChar));
-		}
-	    }
-	    break;
-	}
-    } else
-	er.result = ER_IGNORED;
-
-    return er;
-}
-
-static int previous_char(const char *buf, int pos)
-{
-    int len = 0;
-    int off = 0;
-    
-    while (off < pos) {
-       len = mblen(buf+off, MB_CUR_MAX);
-       if (len <= 0)
-	  return pos;
-       off+=len;
-    }
-    return off-len;
-}
-
-static int next_char(const char *buf, int pos)
-{
-    int len = mblen(buf + pos, MB_CUR_MAX);
-    if (len < 0)
-       return pos;
-    if (len == 0)
-       return ++pos;
-    return pos+len;
-}
-
-static struct eventResult entryHandleKey(newtComponent co, int key) {
-    struct entry * en = co->data;
-    struct eventResult er;
-    char * chptr, * insPoint;
-
-    er.result = ER_SWALLOWED;
-    switch (key) {
-      case '\r':				/* Return */
-	if (en->flags & NEWT_FLAG_RETURNEXIT) {
-	    er.result = ER_EXITFORM;
-	} else {
-	    er.result = ER_NEXTCOMP;
-	}
-	break;
-
-      case '\001':				/* ^A */
-      case NEWT_KEY_HOME:
-	en->cursorPosition = 0;
-	break;
-
-      case '\005':				/* ^E */
-      case NEWT_KEY_END:
-	en->cursorPosition = en->bufUsed;
-	break;
-
-      case '\013':				/* ^K */
-	en->bufUsed = en->cursorPosition;
-	memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->bufUsed);
-	break;
-
-      case '\025':				/* ^U */
-	en->bufUsed -= en->cursorPosition;
-	memmove(en->buf, en->buf + en->cursorPosition, en->bufUsed);
-	en->cursorPosition = 0;
-	memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->bufUsed);
-	break;
-
-      case '\002':				/* ^B */
-      case NEWT_KEY_LEFT:
-	if (en->cursorPosition)
-	    en->cursorPosition = previous_char(en->buf, en->cursorPosition);
-	break;
-
-      case '\004':
-      case NEWT_KEY_DELETE:
-	chptr = en->buf + en->cursorPosition;
-	if (*chptr) {
-	    int delta = next_char(en->buf, en->cursorPosition)-en->cursorPosition;
-	    if (delta) {
-	       chptr+=delta;
-	       while (*chptr) {
-	          *(chptr - delta) = *chptr;
-		  chptr++;
-	       }
-	       memset(chptr - delta, 0, delta);
-	       en->bufUsed-=delta;
-	    }
-	}
-	break;
-
-      case NEWT_KEY_BKSPC: {
-	int prev = previous_char(en->buf, en->cursorPosition);
-	if (en->cursorPosition != prev) {
-	    /* if this isn't true, there's nothing to erase */
-	    int delta = en->cursorPosition - prev;
-	    chptr = en->buf + en->cursorPosition;
-	    en->bufUsed-=delta;
-	    en->cursorPosition-=delta;
-	    while (*chptr) {
-		*(chptr - delta) = *chptr;
-		chptr++;
-	    }
-	    memset(chptr - delta, 0, delta);
-	}
-	}
-	break;
-
-      case '\006':				/* ^B */
-      case NEWT_KEY_RIGHT:
-	if (en->cursorPosition < en->bufUsed)
-	    en->cursorPosition = next_char(en->buf, en->cursorPosition);
-	break;
-
-      default:
-	if ((key >= 0x20 && key <= 0x7e) || (key >= 0x80 && key <= 0xff)) {
-	    if (!(en->flags & NEWT_FLAG_SCROLL) && wstrlen(en->buf, -1) >= co->width) {
-		/* FIXME this is broken */
-		SLtt_beep();
-		break;
-	    }
-
-	    if ((en->bufUsed + 1) == en->bufAlloced) {
-		en->bufAlloced += 20;
-		en->buf = realloc(en->buf, en->bufAlloced);
-		if (en->resultPtr) *en->resultPtr = en->buf;
-		memset(en->buf + en->bufUsed + 1, 0, 20);
-	    }
-
-	    if (en->cursorPosition == en->bufUsed) {
-		en->bufUsed++;
-	    } else {
-		/* insert the new character */
-
-		/* chptr is the last character in the string */
-		chptr = (en->buf + en->bufUsed) - 1;
-		if ((en->bufUsed + 1) == en->bufAlloced) {
-		    /* this string fills the buffer, so clip it */
-		    chptr--;
-		} else
-		    en->bufUsed++;
-
-		insPoint = en->buf + en->cursorPosition;
-
-		while (chptr >= insPoint) {
-		    *(chptr + 1) = *chptr;
-		    chptr--;
-		}
-
-	    }
-            /* FIXME */
-	    en->buf[en->cursorPosition++] = key;
-	} else {
-	    er.result = ER_IGNORED;
-	}
-    }
-
-    entryDraw(co);
-
-    return er;
-}
-
-char * newtEntryGetValue(newtComponent co) {
-    struct entry * en = co->data;
-
-    return en->buf;
-}
-
-void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data) {
-    struct entry * en = co->data;
-    en->filter = filter;
-    en->filterData = data;
-}
diff -ruN newt-0.52.2-old/listbox.c newt-0.52.2/listbox.c
--- newt-0.52.2-old/listbox.c	2006-06-20 21:58:33.000000000 +0100
+++ newt-0.52.2/listbox.c	2006-06-20 21:59:30.000000000 +0100
@@ -518,7 +518,7 @@
 
 	newtGotorc(co->top + i + li->bdyAdjust, co->left + li->bdxAdjust);
 	if(j + i == li->currItem) {
-	    if(item->isSelected)
+	    if(li->isActive)
 		SLsmg_set_color(NEWT_COLORSET_ACTSELLISTBOX);
 	    else
 		SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);
@@ -529,6 +529,12 @@
 
 	write_nstring_int(item->text, li->curWidth, NULL);
 
+	if (li->flags & NEWT_FLAG_MULTIPLE) {
+	    newtGotorc(co->top + i + li->bdyAdjust, co->left + li->bdxAdjust);
+	    SLsmg_set_color(item->isSelected ?
+		    NEWT_COLORSET_SELLISTBOX : NEWT_COLORSET_LISTBOX);
+	    SLsmg_write_nstring(item->text, 1);
+	}
     }
     newtGotorc(co->top + (li->currItem - li->startShowItem) + li->bdyAdjust,
                co->left + li->bdxAdjust);
diff -ruN newt-0.52.2-old/newt.c.orig newt-0.52.2/newt.c.orig
--- newt-0.52.2-old/newt.c.orig	2006-06-20 21:58:34.000000000 +0100
+++ newt-0.52.2/newt.c.orig	1970-01-01 01:00:00.000000000 +0100
@@ -1,1438 +0,0 @@
-#include "config.h"
-
-#include <slang.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/signal.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <termios.h>
-#include <unistd.h>
-#include <wchar.h>
-
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-
-#include "newt.h"
-#include "newt_pr.h"
-
-#if defined(HAVE_FRIBIDI_FRIBIDI_H) && defined(HAVE_DLFCN_H)
-#include <fribidi/fribidi.h>
-#include <dlfcn.h>
-
-/* No sense in enabling shaping if we don't have BIDI support. */
-typedef struct
-{
-	int is_shaped;
-	wchar_t isolated;
-	wchar_t initial;
-	wchar_t medial;
-	wchar_t final;
-}
-arabic_char_node;
-
-#define ARABIC_BASE	0x621
-#define ARABIC_END	0x64A
-
-static const arabic_char_node arabic_shaping_table[] = {
-/* 0x621 */  { TRUE , 0xFE80, 0x0000, 0x0000, 0x0000},
-/* 0x622 */  { TRUE , 0xFE81, 0x0000, 0x0000, 0xFE82},
-/* 0x623 */  { TRUE , 0xFE83, 0x0000, 0x0000, 0xFE84},
-/* 0x624 */  { TRUE , 0xFE85, 0x0000, 0x0000, 0xFE86},
-/* 0x625 */  { TRUE , 0xFE87, 0x0000, 0x0000, 0xFE88},
-/* 0x626 */  { TRUE , 0xFE89, 0xFE8B, 0xFE8C, 0xFE8A},
-/* 0x627 */  { TRUE , 0xFE8D, 0x0000, 0x0000, 0xFE8E},
-/* 0x628 */  { TRUE , 0xFE8F, 0xFE91, 0xFE92, 0xFE90},
-/* 0x629 */  { TRUE , 0xFE93, 0x0000, 0x0000, 0xFE94},
-/* 0x62A */  { TRUE , 0xFE95, 0xFE97, 0xFE98, 0xFE96},
-/* 0x62B */  { TRUE , 0xFE99, 0xFE9B, 0xFE9C, 0xFE9A},
-/* 0x62C */  { TRUE , 0xFE9D, 0xFE9F, 0xFEA0, 0xFE9E},
-/* 0x62D */  { TRUE , 0xFEA1, 0xFEA3, 0xFEA4, 0xFEA2},
-/* 0x62E */  { TRUE , 0xFEA5, 0xFEA7, 0xFEA8, 0xFEA6},
-/* 0x62F */  { TRUE , 0xFEA9, 0x0000, 0x0000, 0xFEAA},
-/* 0x630 */  { TRUE , 0xFEAB, 0x0000, 0x0000, 0xFEAC},
-/* 0x631 */  { TRUE , 0xFEAD, 0x0000, 0x0000, 0xFEAE},
-/* 0x632 */  { TRUE , 0xFEAF, 0x0000, 0x0000, 0xFEB0},
-/* 0x633 */  { TRUE , 0xFEB1, 0xFEB3, 0xFEB4, 0xFEB2},
-/* 0x634 */  { TRUE , 0xFEB5, 0xFEB7, 0xFEB8, 0xFEB6},
-/* 0x635 */  { TRUE , 0xFEB9, 0xFEBB, 0xFEBC, 0xFEBA},
-/* 0x636 */  { TRUE , 0xFEBD, 0xFEBF, 0xFEC0, 0xFEBE},
-/* 0x637 */  { TRUE , 0xFEC1, 0xFEC3, 0xFEC4, 0xFEC2},
-/* 0x638 */  { TRUE , 0xFEC5, 0xFEC7, 0xFEC8, 0xFEC6},
-/* 0x639 */  { TRUE , 0xFEC9, 0xFECB, 0xFECC, 0xFECA},
-/* 0x63A */  { TRUE , 0xFECD, 0xFECF, 0xFED0, 0xFECE},
-/* 0x63B */  { FALSE, 0x0000, 0x0000, 0x0000, 0x0000},
-/* 0x63C */  { FALSE, 0x0000, 0x0000, 0x0000, 0x0000},
-/* 0x63D */  { FALSE, 0x0000, 0x0000, 0x0000, 0x0000},
-/* 0x63E */  { FALSE, 0x0000, 0x0000, 0x0000, 0x0000},
-/* 0x63F */  { FALSE, 0x0000, 0x0000, 0x0000, 0x0000},
-/* 0x640 */  { TRUE , 0x0640, 0x0640, 0x0640, 0x0640},
-/* 0x641 */  { TRUE , 0xFED1, 0xFED3, 0xFED4, 0xFED2},
-/* 0x642 */  { TRUE , 0xFED5, 0xFED7, 0xFED8, 0xFED6},
-/* 0x643 */  { TRUE , 0xFED9, 0xFEDB, 0xFEDC, 0xFEDA},
-/* 0x644 */  { TRUE , 0xFEDD, 0xFEDF, 0xFEE0, 0xFEDE},
-/* 0x645 */  { TRUE , 0xFEE1, 0xFEE3, 0xFEE4, 0xFEE2},
-/* 0x646 */  { TRUE , 0xFEE5, 0xFEE7, 0xFEE8, 0xFEE6},
-/* 0x647 */  { TRUE , 0xFEE9, 0xFEEB, 0xFEEC, 0xFEEA},
-/* 0x648 */  { TRUE , 0xFEED, 0x0000, 0x0000, 0xFEEE},
-/* 0x649 */  { TRUE , 0xFEEF, 0x0000, 0x0000, 0xFEF0},
-/* 0x64A */  { TRUE , 0xFEF1, 0xFEF3, 0xFEF4, 0xFEF2}
-};
-
-typedef struct {
-	wchar_t c;
-	arabic_char_node ar_node;
-}
-extra_char_node;
-
-#define EXTRA_BASE 0x67E
-#define EXTRA_END 0x6CC
-static const extra_char_node extra_shaping_table[] = {
-    {0x067E, {TRUE, 0xFB56, 0xFB58, 0xFB59, 0xFB57}},
-    {0x0686, {TRUE, 0xFB7A, 0xFB7C, 0xFB7D, 0xFB7B}},
-    {0x0698, {TRUE, 0xFB8A, 0x0000, 0x0000, 0xFB8B}},
-    {0x06A9, {TRUE, 0xFB8E, 0xFB90, 0xFB91, 0xFB8F}},
-    {0x06AF, {TRUE, 0xFB92, 0xFB94, 0xFB95, 0xFB93}},
-    {0x06CC, {TRUE, 0xFBFC, 0xFBFE, 0xFBFF, 0xFBFD}},
-    {0x0000, {FALSE, 0x0000, 0x0000, 0x0000, 0x0000}},
-};
-
-static const arabic_char_node *get_char_node(wchar_t w)
-{
-	if (w >= ARABIC_BASE && w <= ARABIC_END)
-		return &arabic_shaping_table[w - ARABIC_BASE];
-	else if (w >= EXTRA_BASE && w <= EXTRA_END) {
-		const extra_char_node *node = extra_shaping_table;
-		
-		while (node->c) {
-			if (node->c == w)
-				return &node->ar_node;
-			node++;
-		}
-		return NULL;
-	}
-	return NULL;
-}
-
-static int do_shaping(wchar_t *buf, int len) {
-    int i,j;
-
-    wchar_t *newbuf;
-
-    if (len < 1)
-	return 0;
-
-    newbuf = (wchar_t *)malloc(sizeof(wchar_t)*len);
-
-    for (i = 0, j = 0; i < len; i++, j++) {
-	int have_previous = FALSE, have_next = FALSE;
-	const arabic_char_node *node, *node1;
-	int prev, next;
-	
-	if (buf[i] == L'\0')
-	    break;
-
-	/* If it is non-joiner, ignore it */
-	if (buf[i] == 0x200C) {
-	    j--;
-	    continue;
-	}
-	
-	newbuf[j] = buf[i];
-
-	/* If it's not in our range, skip it. */
-	node = get_char_node(buf[i]);
-	if (!node)
-	{
-	    continue;
-	}
-
-	/* The character wasn't included in the unicode shaping table. */
-	if (!node->is_shaped)
-	{
-	    continue;
-	}
-	
-	for (prev = i - 1; prev >= 0; prev--)
-	    if (wcwidth(buf[prev]) || buf[prev] == 0x200C)
-	       break;
-	
-	if (prev >= 0 && (node1 = get_char_node(buf[prev]))
-		&& ( node1->initial || node1->medial))
-	{
-	    have_previous = TRUE;
-	}
-	
-	for (next = i + 1; next < len; next++)
- 	    if (wcwidth(buf[next]) || buf[next] == 0x200C)
-	       break;
-	
-	if (next < len && (node1 = get_char_node(buf[next]))
-	    && (node1->medial || node1->final))
-	{
-	    have_next = TRUE;
-	}
-
-	/*
-	 * FIXME: do not make ligature if there are combining 
-	 * characters between two parts.
-	 */
-	if (buf[i] == 0x644 && have_next && next == i + 1)
-	{
-	    switch (buf[next])
-	    {
-		case 0x622:
-		    newbuf[j] = 0xFEF5 + (have_previous ? 1 : 0);
-		    i++;
-		    continue;
-		case 0x623:
-		    newbuf[j] = 0xFEF7 + (have_previous ? 1 : 0);
-		    i++;
-		    continue;
-		case 0x625:
-		    newbuf[j] = 0xFEF9 + (have_previous ? 1 : 0);
-		    i++;
-		    continue;
-		case 0x627:
-		    newbuf[j] = 0xFEFB + (have_previous ? 1 : 0);
-		    i++;
-		    continue;
-		default:
-		    break;
-	    }
-	}
-
-	/** Medial **/
-	if (have_previous && have_next && node->medial)
-	{
-	    newbuf[j] = node->medial;
-	}
-
-	/** Final **/
-	else if (have_previous && node->final)
-	{
-	    newbuf[j] = node->final;
-	}
-
-	/** Initial **/
-	else if (have_next && node->initial)
-	{
-	    newbuf[j] = node->initial;
-	}
-
-	/** Isolated **/
-	else if (node->isolated)
-	{
-	    newbuf[j] = node->isolated;
-	}
-    }
-    for (i = 0; i < len && i < j; i++) {
-	buf[i] = newbuf[i];
-    }
-    while (i < len) {
-	buf[i++] = L'\0';
-    }
-
-    free(newbuf);
-    return 0;
-}
-
-/* Converts bidi wchar text {in} to visual wchar text which is displayable 
- * in text mode. Uses {base_dir} as default base direction.
- * Returns malloc'ed converted text or NULL in case of error or if {need_out} is
- * not set. Modifies {base_dir} to reflect actual direction.
- */
-static wchar_t* wchar_to_textmod_visual(wchar_t *in,unsigned int len,FriBidiCharType *base_dir, int need_out)
-{
-    FriBidiChar *out = NULL;
-    static void *handle = NULL;
-
-    fribidi_boolean (*func_ptr) (FriBidiChar *, FriBidiStrIndex,
-                                 FriBidiCharType *, FriBidiChar *,
-                                 FriBidiStrIndex *, FriBidiStrIndex *,
-                                 FriBidiLevel *);
-
-    if (!handle)
-	handle = dlopen("/usr/lib/libfribidi.so.0", RTLD_LAZY | RTLD_GLOBAL);
-    if (!handle)
-	handle = dlopen("/lib/libfribidi.so.0", RTLD_LAZY | RTLD_GLOBAL);
-    if (!handle)
-	return NULL;
-
-    func_ptr = dlsym(handle, "fribidi_log2vis");
-    if (!func_ptr) {
-	dlclose(handle);
-	handle = NULL;
-	return NULL;
-    }
-    
-    if (need_out) {
-        out = (FriBidiChar *)malloc(sizeof(FriBidiChar)*(len+1));
-        if(!out)
-        {
-	    dlclose(handle);
-	    handle = NULL;
-            return (wchar_t *) out;
-        }
-
-        do_shaping(in, len);
-	len = wcsnlen(in, len);
-    }
-    (*func_ptr)(in, len, base_dir, out, NULL, NULL, NULL);
-
-    return (wchar_t *) out;
-}
-
-/*
- * Converts text given in {str} from logical order to visual order.
- * Uses {dir} as base direction ('N', 'R', 'L').
- * Returns malloc'ed converted string. Modifies {dir} to reflect actual
- * direction.
- */
-static char *_newt_log2vis(const char *str, char *dir)
-{
-	wchar_t *wcs;
-	char *rstr = NULL;
-	int len = strlen(str);
-	int ret;
-	FriBidiCharType basedir;
-
-	switch (*dir)
-	{
-		case 'R': basedir = FRIBIDI_TYPE_R;
-			  break;
-		case 'L': basedir = FRIBIDI_TYPE_L;
-			  break;
-		default: basedir = FRIBIDI_TYPE_ON;
-			 break;
-	}
-	
-	if (len) {
-		wchar_t *owcs;
-		int newlen;
-		
-		wcs = malloc(sizeof(*wcs) * (len + 1));
-		if (!wcs)
-			return NULL;
-		ret = mbstowcs(wcs, str, len + 1);
-		if (ret < 0) {
-			free(wcs);
-			return NULL;
-		}
-		owcs = wchar_to_textmod_visual(wcs, ret, &basedir, 1);
-		if (FRIBIDI_DIR_TO_LEVEL(basedir))
-			*dir = 'R';
-		else
-			*dir = 'L';
-		
-		free(wcs);
-		if (!owcs)
-			return NULL;
-		
-		newlen = wcstombs(NULL, owcs, 0);
-		if (newlen < 0) {
-			free(owcs);
-			return NULL;
-		}
-		rstr = malloc(newlen + 1);
-		if (!rstr) {
-			free(owcs);
-			return NULL;
-		}
-		ret = wcstombs(rstr, owcs, newlen + 1);
-		free(owcs);
-		if (ret < 0) {
-			free(rstr);
-			return NULL;
-		}
-	}
-	return rstr;
-}
-
-/* Returns base direction of text given in {str}.
- */
-char get_text_direction(const char *str)
-{
-	int len = strlen(str);
-	char dir = 'N';
-	wchar_t *wcs;
-	int ret;
-	
-	FriBidiCharType basedir = FRIBIDI_TYPE_ON;
-	
-	if (len) {
-		wcs = malloc(sizeof(*wcs) * (len + 1));
-		if (!wcs)
-			return dir;
-		ret = mbstowcs(wcs, str, len + 1);
-		if (ret < 0) {
-			free(wcs);
-			return dir;
-		}
-		wchar_to_textmod_visual(wcs, ret, &basedir, 1);
-		free(wcs);
-		if (FRIBIDI_DIR_TO_LEVEL(basedir))
-			dir = 'R';
-		else
-			dir = 'L';
-	}
-	return dir;
-}
-
-/* If width of string {str} is less then {width} adds
- * final spaces to make it {width} position wide.
- * Returns malloc'ed padded string or NULL in case of errors 
- * or if string does not need padding.
- */
-static char *pad_line(const char *str, int width)
-{
-	int len = strlen(str);
-	int w = _newt_wstrlen(str, len);
-
-	if (w < width) {
-		char *newstr = malloc(len + 1 + (width - w));
-		if (!newstr)
-			return NULL;
-		memcpy(newstr, str, len);
-		memset(newstr + len, ' ', width - w);
-		newstr[len+width-w] = '\0';
-		return newstr;
-	}
-	return NULL;
-}
-
-/*
- * Writes string {str}. Uses {dir} as default direction.
- * Returns direction of the string in {dir}.
- */
-void write_string_int(const char *str, char *dir)
-{
-	char dummy;
-	char *tmpstr;
-
-	if (!dir) {
-		dummy = 'N';
-		dir = &dummy;
-	}
-	
-	tmpstr = _newt_log2vis(str, dir);
-	if (tmpstr)
-		str = tmpstr;
-	SLsmg_write_string(str);
-	if (tmpstr)
-		free(tmpstr);
-}
-
-/* Writes at most {n} positions of the string {str}.
- * Adds final (logical) spaces if string width is less than {n}.
- * Uses {dir} as default direction.
- * Returns direction of the string in {dir}
- */
-void write_nstring_int(const char *str, int n, char *dir)
-{
-	char dummy;
-	char *tmpstr, *tmpstr1;
-
-	if (!dir) {
-		dummy = 'N';
-		dir = &dummy;
-	}
-
-	tmpstr1 = pad_line(str, n);
-	if (tmpstr1)
-		str = tmpstr1;
-	tmpstr = _newt_log2vis(str, dir);
-	if (tmpstr) {
-		free(tmpstr1);
-		str = tmpstr;
-	}
-	SLsmg_write_nstring(str, n);
-	if (tmpstr)
-		free(tmpstr);
-	else
-		free(tmpstr1);
-}
-#else
-void write_string_int(const char *str, char *dir)
-{
-	SLsmg_write_string(str);
-}
-
-void write_nstring_int(const char *str, int w, char *dir)
-{
-	SLsmg_write_nstring(str, w);
-}
-
-char get_text_direction(const char *str)
-{
-	return 'L';
-}
-#endif
-
-struct Window {
-    int height, width, top, left;
-    SLsmg_Char_Type * buffer;
-    char * title;
-};
-
-struct keymap {
-    char * str;
-    int code;
-    char * tc;
-};
-
-static struct Window windowStack[20];
-static struct Window * currentWindow = NULL;
-
-static char * helplineStack[20];
-static char ** currentHelpline = NULL;
-
-static int cursorRow, cursorCol;
-static int needResize = 0;
-static int cursorOn = 1;
-static int trashScreen = 0;
-
-static const char * defaultHelpLine =
-"  <Tab>/<Alt-Tab> between elements   |  <Space> selects   |  <F12> next screen"
-;
-
-const struct newtColors newtDefaultColorPalette = {
-	"white", "blue", 			/* root fg, bg */
-	"black", "lightgray",			/* border fg, bg */
-	"black", "lightgray",			/* window fg, bg */
-	"white", "black",			/* shadow fg, bg */
-	"red", "lightgray",			/* title fg, bg */
-	"lightgray", "red",			/* button fg, bg */
-	"red", "lightgray",			/* active button fg, bg */
-	"lightgray", "blue",			/* checkbox fg, bg */
-	"lightgray", "red",			/* active checkbox fg, bg */
-	"lightgray", "blue",			/* entry box fg, bg */
-	"blue", "lightgray",			/* label fg, bg */
-	"black", "lightgray",			/* listbox fg, bg */
-	"lightgray", "blue",			/* active listbox fg, bg */
-	"black", "lightgray",			/* textbox fg, bg */
-	"lightgray", "red",			/* active textbox fg, bg */
-	"white", "blue",			/* help line */
-	"lightgray", "blue",			/* root text */
-	"blue",					/* scale full */
-	"red",					/* scale empty */
-	"blue", "lightgray",			/* disabled entry fg, bg */
-	"black", "lightgray",			/* compact button fg, bg */
-	"lightgray", "red",			/* active & sel listbox */
-	"black", "brown"			/* selected listbox */
-};
-
-static const struct keymap keymap[] = {
-	{ "\033OA", 		NEWT_KEY_UP, 		"ku" },
-	{ "\020", 		NEWT_KEY_UP, 		NULL }, /* emacs ^P */
-	{ "\033OB", 		NEWT_KEY_DOWN, 		"kd" },
-	{ "\016", 		NEWT_KEY_DOWN, 		NULL }, /* emacs ^N */
-	{ "\033OC", 		NEWT_KEY_RIGHT, 	"kr" },
-	{ "\006", 		NEWT_KEY_RIGHT, 	NULL }, /* emacs ^F */
-	{ "\033OD", 		NEWT_KEY_LEFT, 		"kl" },
-	{ "\002", 		NEWT_KEY_LEFT, 		NULL }, /* emacs ^B */
-	{ "\033OH",		NEWT_KEY_HOME, 		"kh" },
-	{ "\033[1~",		NEWT_KEY_HOME, 		NULL },
-	{ "\001",		NEWT_KEY_HOME, 		NULL }, /* emacs ^A */
-	{ "\033Ow",		NEWT_KEY_END, 		"kH" },
-        { "\033[4~",		NEWT_KEY_END, 		"@7" },
-        { "\005",		NEWT_KEY_END, 		NULL }, /* emacs ^E */
-
-	{ "\033[3~",		NEWT_KEY_DELETE,	"kD" },
-	{ "\004",		NEWT_KEY_DELETE,	NULL }, /* emacs ^D */
-	{ "\033[2~", 		NEWT_KEY_INSERT,        "kI" },
-
-	{ "\033\t",		NEWT_KEY_UNTAB,		"kB" },
-
-	{ "\033[5~",		NEWT_KEY_PGUP,		"kP" },
-	{ "\033[6~",		NEWT_KEY_PGDN,		"kN" },
-	{ "\033V",		NEWT_KEY_PGUP, 		NULL },
-	{ "\033v",		NEWT_KEY_PGUP, 		NULL },
-        { "\026",		NEWT_KEY_PGDN,		NULL },
-
-	{ "\033[[A",		NEWT_KEY_F1,		NULL },
-	{ "\033[[B",		NEWT_KEY_F2,		NULL },
-	{ "\033[[C",		NEWT_KEY_F3,		NULL },
-	{ "\033[[D",		NEWT_KEY_F4,		NULL },
-	{ "\033[[E",		NEWT_KEY_F5,		NULL },
-
-	{ "\033OP",		NEWT_KEY_F1,		NULL },
-	{ "\033OQ",		NEWT_KEY_F2,		NULL },
-	{ "\033OR",		NEWT_KEY_F3,		NULL },
-	{ "\033OS",		NEWT_KEY_F4,		NULL },
-
-	{ "\033[11~",		NEWT_KEY_F1,		"k1" },
-	{ "\033[12~",		NEWT_KEY_F2,		"k2" },
-	{ "\033[13~",		NEWT_KEY_F3,		"k3" },
-	{ "\033[14~",		NEWT_KEY_F4,		"k4" },
-	{ "\033[15~",		NEWT_KEY_F5,		"k5" },
-	{ "\033[17~",		NEWT_KEY_F6,		"k6" },
-	{ "\033[18~",		NEWT_KEY_F7,		"k7" },
-	{ "\033[19~",		NEWT_KEY_F8,		"k8" },
-	{ "\033[20~",		NEWT_KEY_F9,            "k9" },
-	{ "\033[21~",		NEWT_KEY_F10,		"k;" },
-	{ "\033[23~",		NEWT_KEY_F11,		"F1" },
-	{ "\033[24~",		NEWT_KEY_F12,		"F2" },
-	{ "\033",		NEWT_KEY_ESCAPE,	"@2" },
-        { "\033",		NEWT_KEY_ESCAPE,	"@9" },
-
-        { "\177",		NEWT_KEY_BKSPC,		NULL },
-        { "\010",		NEWT_KEY_BKSPC,		NULL },
-        
-	{ 0 },	/* LEAVE this one */
-};
-static void initKeymap();
-
-static const char ident[] = // ident friendly
-    "$Version: Newt windowing library v" VERSION " $"
-    "$Copyright: (C) 1996-2003 Red Hat, Inc. Written by Erik Troan $"
-    "$License: Lesser GNU Public License. $";
-
-static newtSuspendCallback suspendCallback = NULL;
-static void * suspendCallbackData = NULL;
-
-void newtSetSuspendCallback(newtSuspendCallback cb, void * data) {
-    suspendCallback = cb;
-    suspendCallbackData = data;
-}
-
-static void handleSigwinch(int signum) {
-    needResize = 1;
-}
-
-static int getkeyInterruptHook(void) {
-    return -1;
-}
-
-int _newt_wstrlen(const char *str, int len) {
-	mbstate_t ps;
-	wchar_t tmp;
-	int nchars = 0;
-	
-	if (!str) return 0;
-	if (!len) return 0;
-	if (len < 0) len = strlen(str);
-	memset(&ps,0,sizeof(mbstate_t));
-	while (len > 0) {
-		int x,y;
-		
-		x = mbrtowc(&tmp,str,len,&ps);
-		if (x >0) {
-		    	str += x;
-			len -= x;
-			y = wcwidth(tmp);
-			if (y>0)
-			  nchars+=y;
-		} else break;
-	}
-	return nchars;
-}
-
-/** Trim a string to fit 
- * @param title - string. NULL will be inserted if necessary
- * @param chrs  - available space. (character cells)
- */
-void trim_string(char *title, int chrs)
-{
-	char *p = title;
-	int ln = chrs;
-	int x = 0,y = 0;
-	wchar_t tmp;
-	mbstate_t ps;
-
-	memset(&ps, 0, sizeof(ps));
-
-	while (*p) {
-		x = mbrtowc(&tmp, p, ln, &ps);
-		if (x < 0) { // error
-			*p = '\0';
-			return;
-		}
-		y = wcwidth(tmp);
-		if (y > ln) {
-			*p = '\0';
-			return;
-		} else {
-			p += x;
-			ln -= y;
-		}
-	}	
-}
-
-static int getkey() {
-    int c;
-
-    while ((c = SLang_getkey()) == '\xC') { /* if Ctrl-L redraw whole screen */
-        SLsmg_touch_lines (0, SLtt_Screen_Rows - 1);
-        SLsmg_refresh();
-    }
-    return c;
-
-}
-
-void newtFlushInput(void) {
-    while (SLang_input_pending(0)) {
-	getkey();
-    }
-}
-
-/**
- * @brief Refresh the screen
- */
-void newtRefresh(void) {
-    SLsmg_refresh();
-}
-
-void newtSuspend(void) {
-    SLtt_set_cursor_visibility (1);
-    SLsmg_suspend_smg();
-    SLang_reset_tty();
-    SLtt_set_cursor_visibility (cursorOn);
-}
-
-/**
- *  @brief Return after suspension.
- *  @return 0 on success.
- */
-int newtResume(void) {
-    SLsmg_resume_smg ();
-    SLsmg_refresh();
-    return SLang_init_tty(0, 0, 0);
-}
-
-void newtCls(void) {
-    SLsmg_set_color(NEWT_COLORSET_ROOT);
-    SLsmg_gotorc(0, 0);
-    SLsmg_erase_eos();
-
-    newtRefresh();
-}
-
-/**
- * @brief Resize the screen
- * @param redraw - boolean - should we redraw the screen?
- */
-void newtResizeScreen(int redraw) {
-    SLtt_get_screen_size();
-    SLsmg_reinit_smg();
-    if (redraw) {
-        SLsmg_touch_lines (0, SLtt_Screen_Rows - 1);
-        newtRefresh();
-    }
-}
-
-/**
- * @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 = "";
-    if (strstr (lang, ".euc") != NULL)
-	trashScreen = 1;
-
-    (void) strlen(ident);
-
-    SLtt_get_terminfo();
-    SLtt_get_screen_size();
-    SLutf8_enable(-1); /* init. utf8 according to locale */
-
-    MonoValue = getenv(MonoEnv);
-    if ( MonoValue == NULL ) {
-	SLtt_Use_Ansi_Colors = 1;
-    } else {
-	SLtt_Use_Ansi_Colors = 0;
-    }
-
-    if ((ret = SLsmg_init_smg()) < 0)
-	return ret;
-    if ((ret = SLang_init_tty(0, 0, 0)) < 0)
-	return ret;
-
-    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;
-}
-
-/**
- * @brief Closedown the newt library, tidying screen.
- * @returns int , 0. (no errors reported)
- */
-int newtFinished(void) {
-    SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
-    newtCursorOn();
-    SLsmg_refresh();
-    SLsmg_reset_smg();
-    SLang_reset_tty();
-
-    return 0;
-}
-
-/**
- * @brief Set the colors used.
- * @param colors - newtColor struct used.
- */
-void newtSetColors(struct newtColors colors) {
-    if (!SLtt_Use_Ansi_Colors) {
-        int i;
-
-        for (i = 2; i < 25; i++)
-            SLtt_set_mono(i, NULL, 0);
-
-        SLtt_set_mono(NEWT_COLORSET_SELLISTBOX, NULL, SLTT_BOLD_MASK);
-
-        SLtt_set_mono(NEWT_COLORSET_ACTBUTTON, NULL, SLTT_REV_MASK);
-        SLtt_set_mono(NEWT_COLORSET_ACTCHECKBOX, NULL, SLTT_REV_MASK);
-        SLtt_set_mono(NEWT_COLORSET_ACTLISTBOX, NULL, SLTT_REV_MASK);
-        SLtt_set_mono(NEWT_COLORSET_ACTTEXTBOX, NULL, SLTT_REV_MASK);
-
-        SLtt_set_mono(NEWT_COLORSET_ACTSELLISTBOX, NULL, SLTT_REV_MASK | SLTT_BOLD_MASK);
-        
-        SLtt_set_mono(NEWT_COLORSET_DISENTRY, NULL, 0); // FIXME
-        SLtt_set_mono(NEWT_COLORSET_FULLSCALE, NULL, SLTT_ULINE_MASK | SLTT_REV_MASK);
-        SLtt_set_mono(NEWT_COLORSET_EMPTYSCALE, NULL, SLTT_ULINE_MASK);
-        return;
-    }
-    SLtt_set_color(NEWT_COLORSET_ROOT, "", colors.rootFg, colors.rootBg);
-    SLtt_set_color(NEWT_COLORSET_BORDER, "", colors.borderFg, colors.borderBg);
-    SLtt_set_color(NEWT_COLORSET_WINDOW, "", colors.windowFg, colors.windowBg);
-    SLtt_set_color(NEWT_COLORSET_SHADOW, "", colors.shadowFg, colors.shadowBg);
-    SLtt_set_color(NEWT_COLORSET_TITLE, "", colors.titleFg, colors.titleBg);
-    SLtt_set_color(NEWT_COLORSET_BUTTON, "", colors.buttonFg, colors.buttonBg);
-    SLtt_set_color(NEWT_COLORSET_ACTBUTTON, "", colors.actButtonFg,
-			colors.actButtonBg);
-    SLtt_set_color(NEWT_COLORSET_CHECKBOX, "", colors.checkboxFg,
-			colors.checkboxBg);
-    SLtt_set_color(NEWT_COLORSET_ACTCHECKBOX, "", colors.actCheckboxFg,
-			colors.actCheckboxBg);
-    SLtt_set_color(NEWT_COLORSET_ENTRY, "", colors.entryFg, colors.entryBg);
-    SLtt_set_color(NEWT_COLORSET_LABEL, "", colors.labelFg, colors.labelBg);
-    SLtt_set_color(NEWT_COLORSET_LISTBOX, "", colors.listboxFg,
-			colors.listboxBg);
-    SLtt_set_color(NEWT_COLORSET_ACTLISTBOX, "", colors.actListboxFg,
-			colors.actListboxBg);
-    SLtt_set_color(NEWT_COLORSET_TEXTBOX, "", colors.textboxFg,
-			colors.textboxBg);
-    SLtt_set_color(NEWT_COLORSET_ACTTEXTBOX, "", colors.actTextboxFg,
-			colors.actTextboxBg);
-    SLtt_set_color(NEWT_COLORSET_HELPLINE, "", colors.helpLineFg,
-			colors.helpLineBg);
-    SLtt_set_color(NEWT_COLORSET_ROOTTEXT, "", colors.rootTextFg,
-			colors.rootTextBg);
-
-    SLtt_set_color(NEWT_COLORSET_EMPTYSCALE, "", "white",
-			colors.emptyScale);
-    SLtt_set_color(NEWT_COLORSET_FULLSCALE, "", "white",
-			colors.fullScale);
-    SLtt_set_color(NEWT_COLORSET_DISENTRY, "", colors.disabledEntryFg,
-			colors.disabledEntryBg);
-
-    SLtt_set_color(NEWT_COLORSET_COMPACTBUTTON, "", colors.compactButtonFg,
-			colors.compactButtonBg);
-
-    SLtt_set_color(NEWT_COLORSET_ACTSELLISTBOX, "", colors.actSelListboxFg,
-		   colors.actSelListboxBg);
-    SLtt_set_color(NEWT_COLORSET_SELLISTBOX, "", colors.selListboxFg,
-		   colors.selListboxBg);
-}
-
-/* Keymap handling - rewritten by Henning Makholm <henning@makholm.net>,
- * November 2003.
- */
-
-struct kmap_trie_entry {
-    char c ;   /* character got from terminal */
-    int code;  /* newt key, or 0 if c does not make a complete sequence */
-    struct kmap_trie_entry *contseq; /* sub-trie for character following c */
-    struct kmap_trie_entry *next;    /* try this if char received != c */
-};
-/* Here are some static entries that will help in handling esc O foo and
-   esc [ foo as variants of each other: */
-static struct kmap_trie_entry
-    kmap_trie_escO     = { 'O', 0, 0, 0 },
-    kmap_trie_escBrack = { '[', 0, 0, &kmap_trie_escO },
-    kmap_trie_root     = { '\033', 0, &kmap_trie_escBrack, 0 };
-static int keyreader_buf_len = 10 ;
-static unsigned char default_keyreader_buf[10];
-static unsigned char *keyreader_buf = default_keyreader_buf;
-
-#if 0 /* for testing of the keymap manipulation code */
-static void dumpkeys_recursive(struct kmap_trie_entry *curr, int i, FILE *f) {
-    int j, ps ;
-    char seen[256]={0};
-    if( curr && i >= keyreader_buf_len ) {
-        fprintf(f,"ARGH! Too long sequence!\n") ;
-        return ;
-    }
-    for(;curr;curr=curr->next) {
-        keyreader_buf[i] = curr->c ;
-        ps = seen[(unsigned char)curr->c]++ ;
-        if( ps || curr->code || (!curr->code && !curr->contseq) ) {
-            for(j=0;j<=i;j++) {
-                if( keyreader_buf[j] > 32 && keyreader_buf[j]<127 &&
-                    keyreader_buf[j] != '^' && keyreader_buf[j] != '\\' )
-                    fprintf(f,"%c",keyreader_buf[j]);
-                else if( keyreader_buf[j] > 0 && keyreader_buf[j]<=32 )
-                    fprintf(f,"^%c",keyreader_buf[j] + 0x40);
-                else
-                    fprintf(f,"\\%03o",
-                            (unsigned)(unsigned char)keyreader_buf[j]);
-            }
-            if( curr->code )
-                fprintf(f,": 0x%X\n",curr->code);
-            else
-                fprintf(f,": (just keymap)\n");
-        }
-        dumpkeys_recursive(curr->contseq,i+1,f);
-    }
-}
-static void dump_keymap(void) {
-    FILE *f = fopen("newt.keydump","wt");
-    if (f) {
-        dumpkeys_recursive(&kmap_trie_root,0,f);
-        fclose(f);
-    }
-}
-#endif
-
-/* newtBindKey may overwrite a binding that is there already */
-static void newtBindKey(char *keyseq, int meaning) {
-    struct kmap_trie_entry *root = &kmap_trie_root ;
-    struct kmap_trie_entry **curptr = &root ;
-
-    /* Try to make sure the common matching buffer is long enough. */
-    if( strlen(keyseq) > keyreader_buf_len ) {
-        int i = strlen(keyseq)+10;
-        unsigned char *newbuf = malloc(i);
-        if (newbuf) {
-            if (keyreader_buf != default_keyreader_buf)
-                free(keyreader_buf);
-            keyreader_buf = newbuf;
-            keyreader_buf_len = i;
-        }
-    }
-    
-    if (*keyseq == 0) return; /* binding the empty sequence is meaningless */
-    
-    while(1) {
-        while ((*curptr) && (*curptr)->c != *keyseq)
-            curptr = &(*curptr)->next;
-        if ((*curptr)==0) {
-            struct kmap_trie_entry* fresh
-                =  calloc(strlen(keyseq),sizeof(struct kmap_trie_entry));
-            if (fresh == 0) return; /* despair! */
-            *curptr = fresh;
-            while (keyseq[1]) {
-                fresh->contseq = fresh+1;
-                (fresh++)->c = *(keyseq++);
-            }
-            fresh->c = *keyseq;
-            fresh->code = meaning;
-            return;
-        }
-        if (keyseq[1]==0) {
-            (*curptr)->code = meaning;
-            return;
-        } else {
-            curptr = &(*curptr)->contseq;
-            keyseq++;
-        }
-    }      
-}
-
-/* This function recursively inserts all entries in the "to" trie into
-   corresponding positions in the "from" trie, except positions that
-   are already defined in the "from" trie. */
-static void kmap_trie_fallback(struct kmap_trie_entry *to,
-                               struct kmap_trie_entry **from) {
-    if (*from == NULL)
-        *from = to ;
-    if (*from == to)
-        return ;
-    for (;to!=NULL;to=to->next) {
-        struct kmap_trie_entry **fromcopy = from ;
-        while ((*fromcopy) && (*fromcopy)->c != to->c)
-            fromcopy = &(*fromcopy)->next ;
-        if (*fromcopy) {
-            if ((*fromcopy)->code == 0)
-                (*fromcopy)->code = to->code;
-            kmap_trie_fallback(to->contseq, &(*fromcopy)->contseq);
-        } else {
-            *fromcopy = malloc(sizeof(struct kmap_trie_entry));
-            if (*fromcopy) {
-                **fromcopy = *to ;
-                (*fromcopy)->next = 0 ;
-            }
-        }
-    }
-}
-
-int newtGetKey(void) {
-    int key;
-    unsigned char *chptr = keyreader_buf, *lastmatch;
-    int lastcode;
-    struct kmap_trie_entry *curr = &kmap_trie_root;
-
-    do {
-	key = getkey();
-	if (key == SLANG_GETKEY_ERROR) {
-	    /* Either garbage was read, or stdin disappeared
-	     * (the parent terminal was proably closed)
-	     * if the latter, die.
-	     */
-	    if (feof(stdin))
-		    exit(1);
-	    if (needResize) {
-                needResize = 0;
-		return NEWT_KEY_RESIZE;
-            }
-
-	    /* ignore other signals */
-	    continue;
-	}
-
-	if (key == NEWT_KEY_SUSPEND && suspendCallback)
-	    suspendCallback(suspendCallbackData);
-    } while (key == NEWT_KEY_SUSPEND);
-
-    /* Read more characters, matching against the trie as we go */
-    lastcode = *chptr = key;
-    lastmatch = chptr ;
-    while(1) {
-         while (curr->c != key) {
-             curr = curr->next ;
-             if (curr==NULL) goto break2levels;
-         }
-         if (curr->code) {
-             lastcode = curr->code;
-             lastmatch = chptr;
-         }
-         curr = curr->contseq;
-         if (curr==NULL) break;
-
-         if (SLang_input_pending(5) <= 0)
-             break;
-
-         if (chptr==keyreader_buf+keyreader_buf_len-1) break;
-         *++chptr = key = getkey();
-    }
-   break2levels:
-
-      /* The last time the trie matched was at position lastmatch. Back
-       * up if we have read too many characters. */
-      while (chptr > lastmatch)
-          SLang_ungetkey(*chptr--);
-    
-      return lastcode;
-}
-
-/**
- * @brief Wait for a keystroke
- */
-void newtWaitForKey(void) {
-    newtRefresh();
-
-    getkey();
-    newtClearKeyBuffer();
-}
-
-/**
- * @brief Clear the keybuffer
- */
-void newtClearKeyBuffer(void) {
-    while (SLang_input_pending(1)) {
-	getkey();
-    }
-}
-
-/**
- * Open a new window.
- * @param left. unsigned int Size; _not_ including border
- * @param top: unsigned int size, _not_ including border
- * @param width unsigned int
- * @param height unsigned int
- * @param title - title string
- * @return zero on success (currently no errors reported)
- */
-int newtOpenWindow(unsigned int left, unsigned int top, 
-                   unsigned int width, unsigned int height,
-			  const char * title) {
-    int j, row, col;
-    int n;
-    int i;
-
-    newtFlushInput();
-
-    if (!currentWindow) {
-	currentWindow = windowStack;
-    } else {
-	currentWindow++;
-    }
-
-    currentWindow->left = left;
-    currentWindow->top = top;
-    currentWindow->width = width;
-    currentWindow->height = height;
-    currentWindow->title = title ? strdup(title) : NULL;
-
-    currentWindow->buffer = malloc(sizeof(SLsmg_Char_Type) * (width + 3) * (height + 3));
-
-    row = top - 1;
-    col = left - 1;
-    /* clip to the current screen bounds - msw */
-    if (row < 0)
-	row = 0;
-    if (col < 0)
-	col = 0;
-    if (left + width > SLtt_Screen_Cols)
-	width = SLtt_Screen_Cols - left;
-    if (top + height > SLtt_Screen_Rows)
-	height = SLtt_Screen_Rows - top;
-    n = 0;
-    for (j = 0; j < height + 3; j++, row++) {
-	SLsmg_gotorc(row, col);
-	SLsmg_read_raw(currentWindow->buffer + n,
-		       currentWindow->width + 3);
-	n += currentWindow->width + 3;
-    }
-
-    newtTrashScreen();
-
-    SLsmg_set_color(NEWT_COLORSET_BORDER);
-    SLsmg_set_char_set(1);
-    SLsmg_draw_box(top - 1, left - 1, height + 2, width + 2);
-    SLsmg_set_char_set(0);
-
-    if (currentWindow->title) {
-	trim_string (currentWindow->title, width-4);
-	i = wstrlen(currentWindow->title,-1) + 4;
-	i = ((width - i) / 2) + left;
-	SLsmg_gotorc(top - 1, i);
-	SLsmg_set_char_set(1);
-	SLsmg_write_char(SLSMG_RTEE_CHAR);
-	SLsmg_set_char_set(0);
-	SLsmg_write_char(' ');
-	SLsmg_set_color(NEWT_COLORSET_TITLE);
-	write_string_int((char *)currentWindow->title, NULL);
-	SLsmg_set_color(NEWT_COLORSET_BORDER);
-	SLsmg_write_char(' ');
-	SLsmg_set_char_set(1);
-	SLsmg_write_char(SLSMG_LTEE_CHAR);
-	SLsmg_set_char_set(0);
-    }
-
-    SLsmg_set_color(NEWT_COLORSET_WINDOW);
-    SLsmg_fill_region(top, left, height, width, ' ');
-
-    SLsmg_set_color(NEWT_COLORSET_SHADOW);
-    SLsmg_fill_region(top + height + 1, left, 1, width + 2, ' ');
-    SLsmg_fill_region(top, left + width + 1, height + 1, 1, ' ');
-
-    for (i = top; i < (top + height + 1); i++) {
-	SLsmg_gotorc(i, left + width + 1);
-	SLsmg_write_string(" ");
-    }
-
-    return 0;
-}
-
-/**
- * @brief Draw a centered window.
- * @param width - width in char cells
- * @param height - no. of char cells.
- * @param title - fixed title
- * @returns 0. No errors reported
- */
-int newtCenteredWindow(unsigned int width,unsigned int height, 
-                       const char * title) {
-    unsigned int top, left;
-
-    top = (SLtt_Screen_Rows - height) / 2;
-
-    /* I don't know why, but this seems to look better */
-    if ((SLtt_Screen_Rows % 2) && (top % 2)) top--;
-
-    left = (SLtt_Screen_Cols - width) / 2;
-
-    newtOpenWindow(left, top, width, height, title);
-
-    return 0;
-}
-
-/**
- * @brief Remove the top window
- */
-void newtPopWindow(void) {
-    int j, row, col;
-    int n = 0;
-
-    row = col = 0;
-
-    row = currentWindow->top - 1;
-    col = currentWindow->left - 1;
-    if (row < 0)
-	row = 0;
-    if (col < 0)
-	col = 0;
-    for (j = 0; j < currentWindow->height + 3; j++, row++) {
-	SLsmg_gotorc(row, col);
-	SLsmg_write_raw(currentWindow->buffer + n,
-			currentWindow->width + 3);
-	n += currentWindow->width + 3;
-    }
-
-    free(currentWindow->buffer);
-    free(currentWindow->title);
-
-    if (currentWindow == windowStack)
-	currentWindow = NULL;
-    else
-	currentWindow--;
-
-    SLsmg_set_char_set(0);
-
-    newtTrashScreen();
-
-    newtRefresh();
-}
-
-void newtGetWindowPos(int * x, int * y) {
-    if (currentWindow) {
-	*x = currentWindow->left;
-	*y = currentWindow->top;
-    } else
-	*x = *y = 0;
-}
-
-void newtGetrc(int * row, int * col) {
-   *row = cursorRow;
-   *col = cursorCol;
-}
-
-void newtGotorc(int newRow, int newCol) {
-    if (currentWindow) {
-	newRow += currentWindow->top;
-	newCol += currentWindow->left;
-    }
-
-    cursorRow = newRow;
-    cursorCol = newCol;
-    SLsmg_gotorc(cursorRow, cursorCol);
-}
-
-void newtDrawBox(int left, int top, int width, int height, int shadow) {
-    if (currentWindow) {
-	top += currentWindow->top;
-	left += currentWindow->left;
-    }
-
-    SLsmg_draw_box(top, left, height, width);
-
-    if (shadow) {
-	SLsmg_set_color(NEWT_COLORSET_SHADOW);
-	SLsmg_fill_region(top + height, left + 1, 1, width - 1, ' ');
-	SLsmg_fill_region(top + 1, left + width, height, 1, ' ');
-    }
-}
-
-void newtClearBox(int left, int top, int width, int height) {
-    if (currentWindow) {
-	top += currentWindow->top;
-	left += currentWindow->left;
-    }
-
-    SLsmg_fill_region(top, left, height, width, ' ');
-}
-
-static void initKeymap(void) {
-    const struct keymap * curr;
-
-    /* First bind built-in default bindings. They may be shadowed by
-       the termcap entries that get bound later. */
-    for (curr = keymap; curr->code; curr++) {
-        if (curr->str)
-            newtBindKey(curr->str,curr->code);
-    }
-
-    /* Then bind strings from termcap entries */
-    for (curr = keymap; curr->code; curr++) {
-	if (curr->tc) {
-            char *pc = SLtt_tgetstr(curr->tc);
-            if (pc) {
-                newtBindKey(pc,curr->code);
-            }
-        }
-    }
-
-    /* Finally, invent lowest-priority keybindings that correspond to
-       searching for esc-O-foo if esc-[-foo was not found and vice
-       versa.  That is needed because of strong confusion among
-       different emulators of VTxxx terminals; some terminfo/termcap
-       descriptions are apparently written by people who were not
-       aware of the differences between "applicataion" and "terminal"
-       keypad modes. Or perhaps they were, but tried to make their
-       description work with a program that puts the keyboard in the
-       wrong emulation mode. In short, one needs this: */
-    kmap_trie_fallback(kmap_trie_escO.contseq, &kmap_trie_escBrack.contseq);
-    kmap_trie_fallback(kmap_trie_escBrack.contseq, &kmap_trie_escO.contseq);
-}
-
-/**
- * @brief Delay for a specified number of usecs
- * @param int - number of usecs to wait for.
- */
-void newtDelay(unsigned int usecs) {
-    fd_set set;
-    struct timeval tv;
-
-    FD_ZERO(&set);
-
-    tv.tv_sec = usecs / 1000000;
-    tv.tv_usec = usecs % 1000000;
-
-    select(0, &set, &set, &set, &tv);
-}
-
-struct eventResult newtDefaultEventHandler(newtComponent c,
-					   struct event ev) {
-    struct eventResult er;
-
-    er.result = ER_IGNORED;
-    return er;
-}
-
-void newtRedrawHelpLine(void) {
-    char * buf;
-
-    SLsmg_set_color(NEWT_COLORSET_HELPLINE);
-
-    if (currentHelpline) {
-	/* buffer size needs to be wide enough to hold all the multibyte
-	   currentHelpline + all the single byte ' ' to fill the line */
-	int wlen = wstrlen(*currentHelpline, -1);
-	int len;
-
-	if (wlen > SLtt_Screen_Cols)
-	    wlen = SLtt_Screen_Cols;
-	len = strlen(*currentHelpline) + (SLtt_Screen_Cols - wlen);
-	buf = alloca(len + 1);
-	memset(buf, ' ', len);
-	memcpy(buf, *currentHelpline, strlen(*currentHelpline));
-	buf[len] = '\0';
-    } else {
-	buf = alloca(SLtt_Screen_Cols + 1);
-	memset(buf, ' ', SLtt_Screen_Cols);
-	buf[SLtt_Screen_Cols] = '\0';
-    }
-    SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
-    write_string_int(buf, NULL);
-}
-
-void newtPushHelpLine(const char * text) {
-    if (!text)
-	text = defaultHelpLine;
-
-    if (currentHelpline)
-	(*(++currentHelpline)) = strdup(text);
-    else {
-	currentHelpline = helplineStack;
-	*currentHelpline = strdup(text);
-    }
-
-    newtRedrawHelpLine();
-}
-
-void newtPopHelpLine(void) {
-    if (!currentHelpline) return;
-
-    free(*currentHelpline);
-    if (currentHelpline == helplineStack)
-	currentHelpline = NULL;
-    else
-	currentHelpline--;
-
-    newtRedrawHelpLine();
-}
-
-void newtDrawRootText(int col, int row, const char * text) {
-    SLsmg_set_color(NEWT_COLORSET_ROOTTEXT);
-
-    if (col < 0) {
-	col = SLtt_Screen_Cols + col;
-    }
-
-    if (row < 0) {
-	row = SLtt_Screen_Rows + row;
-    }
-
-    SLsmg_gotorc(row, col);
-    write_string_int((char *)text, NULL);
-}
-
-int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense) {
-    switch (sense) {
-      case NEWT_FLAGS_SET:
-	return oldFlags | newFlags;
-
-      case NEWT_FLAGS_RESET:
-	return oldFlags & (~newFlags);
-
-      case NEWT_FLAGS_TOGGLE:
-	return oldFlags ^ newFlags;
-
-      default:
-	return oldFlags;
-    }
-}
-
-void newtBell(void)
-{
-    SLtt_beep();
-}
-
-void newtGetScreenSize(int * cols, int * rows) {
-    if (rows) *rows = SLtt_Screen_Rows;
-    if (cols) *cols = SLtt_Screen_Cols;
-}
-
-void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop) {
-    c->left = newLeft;
-    c->top = newTop;
-}
-
-void newtDefaultMappedHandler(newtComponent c, int isMapped) {
-    c->isMapped = isMapped;
-}
-
-void newtCursorOff(void) {
-    cursorOn = 0;
-    SLtt_set_cursor_visibility (cursorOn);
-}
-
-void newtCursorOn(void) {
-    cursorOn = 1;
-    SLtt_set_cursor_visibility (cursorOn);
-}
-
-void newtTrashScreen(void) {
-    if (trashScreen)
-	SLsmg_touch_lines (0, SLtt_Screen_Rows - 1);
-}
-     
diff -ruN newt-0.52.2-old/textbox.c newt-0.52.2/textbox.c
--- newt-0.52.2-old/textbox.c	2006-06-20 21:58:34.000000000 +0100
+++ newt-0.52.2/textbox.c	2006-06-20 22:02:39.000000000 +0100
@@ -15,9 +15,10 @@
     char *blankline;
     int linesAlloced;
     int doWrap;
-    newtComponent sb;
+    newtComponent sb_act, sb;
     int topLine;
     int textWidth;
+    int isActive;
 };
 
 static char * expandTabs(const char * text);
@@ -43,8 +44,10 @@
     struct textbox * tb = co->data;
 
     co->isMapped = isMapped;
-    if (tb->sb)
+    if (tb->sb) {
 	tb->sb->ops->mapped(tb->sb, isMapped);
+	tb->sb_act->ops->mapped(tb->sb_act, isMapped);
+    }
 }
 
 static void textboxPlace(newtComponent co, int newLeft, int newTop) {
@@ -53,8 +56,10 @@
     co->top = newTop;
     co->left = newLeft;
 
-    if (tb->sb)
+    if (tb->sb) {
 	tb->sb->ops->place(tb->sb, co->left + co->width - 1, co->top);
+	tb->sb_act->ops->place(tb->sb_act, co->left + co->width - 1, co->top);
+    }
 }
 
 void newtTextboxSetHeight(newtComponent co, int height) {
@@ -107,16 +112,20 @@
     tb->lines = NULL;
     tb->topLine = 0;
     tb->textWidth = width;
+    tb->isActive = 0;
     tb->blankline = malloc(width+1);
     memset(tb->blankline,' ',width);
     tb->blankline[width] = '\0';
 
     if (flags & NEWT_FLAG_SCROLL) {
 	co->width += 2;
+	tb->sb_act = newtVerticalScrollbar(co->left + co->width - 1, co->top, 
+			   co->height, COLORSET_ACTTEXTBOX, COLORSET_TEXTBOX);
 	tb->sb = newtVerticalScrollbar(co->left + co->width - 1, co->top, 
 			   co->height, COLORSET_TEXTBOX, COLORSET_TEXTBOX);
+	co->takesFocus = 1;
     } else {
-	tb->sb = NULL;
+	tb->sb_act = tb->sb = NULL;
     }
 
     return co;
@@ -345,8 +354,13 @@
     
     if (tb->sb) {
 	size = tb->numLines - c->height;
-	newtScrollbarSet(tb->sb, tb->topLine, size ? size : 0);
-	tb->sb->ops->draw(tb->sb);
+	if (tb->isActive) {
+		newtScrollbarSet(tb->sb_act, tb->topLine, size ? size : 0);
+		tb->sb_act->ops->draw(tb->sb_act);
+	} else {
+		newtScrollbarSet(tb->sb, tb->topLine, size ? size : 0);
+		tb->sb->ops->draw(tb->sb);
+	}
 	dw = 2;
     }
 
@@ -387,7 +401,11 @@
 
     er.result = ER_IGNORED;
 
-    if (ev.when == EV_EARLY && ev.event == EV_KEYPRESS && tb->sb) {
+    if (!tb->sb || ev.when == EV_EARLY || ev.when == EV_LATE)
+	return er;
+
+    switch(ev.event) {
+      case EV_KEYPRESS:
 	newtTrashScreen();
 	switch (ev.u.key) {
 	  case NEWT_KEY_UP:
@@ -419,8 +437,8 @@
 	    er.result = ER_SWALLOWED;
 	    break;
 	}
-    }
-    if (ev.when == EV_EARLY && ev.event == EV_MOUSE && tb->sb) {
+	break;
+      case EV_MOUSE:
 	/* Top scroll arrow */
 	if (ev.u.mouse.x == co->width && ev.u.mouse.y == co->top) {
 	    if (tb->topLine) tb->topLine--;
@@ -436,6 +454,17 @@
 	    
 	    er.result = ER_SWALLOWED;
 	}
+	break;
+      case EV_FOCUS:
+	tb->isActive = 1;
+	textboxDraw(co);
+	er.result = ER_SWALLOWED;
+	break;
+      case EV_UNFOCUS:
+	tb->isActive = 0;
+	textboxDraw(co);
+	er.result = ER_SWALLOWED;
+	break;
     }
     return er;
 }
