In WM_DRAWITEM, always calls the app with a valid current focus_item.

diff --git a/controls/listbox.c b/controls/listbox.c
index 742f664..d270314 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -488,7 +488,7 @@
  * Paint an item.
  */
 static void LISTBOX_PaintItem( WND *wnd, LB_DESCR *descr, HDC hdc,
-                               const RECT *rect, INT index, UINT action )
+                               const RECT *rect, INT index, UINT action, BOOL ignoreFocus )
 {
     LB_ITEMDATA *item = NULL;
     if (index < descr->nb_items) item = &descr->items[index];
@@ -525,7 +525,7 @@
         dis.itemID       = index;
         dis.itemState    = 0;
         if (item && item->selected) dis.itemState |= ODS_SELECTED;
-        if ((descr->focus_item == index) &&
+        if (!ignoreFocus && (descr->focus_item == index) &&
             (descr->caret_on) &&
             (descr->in_focus)) dis.itemState |= ODS_FOCUS;
         if (wnd->dwStyle & WS_DISABLED) dis.itemState |= ODS_DISABLED;
@@ -578,7 +578,7 @@
             SetBkColor( hdc, oldBk );
             SetTextColor( hdc, oldText );
         }
-        if ((descr->focus_item == index) &&
+        if (!ignoreFocus && (descr->focus_item == index) &&
             (descr->caret_on) &&
             (descr->in_focus)) DrawFocusRect( hdc, rect );
     }
@@ -641,7 +641,7 @@
     if (wnd->dwStyle & WS_DISABLED)
         SetTextColor( hdc, GetSysColor( COLOR_GRAYTEXT ) );
     SetWindowOrgEx( hdc, descr->horz_pos, 0, NULL );
-    LISTBOX_PaintItem( wnd, descr, hdc, &rect, index, action );
+    LISTBOX_PaintItem( wnd, descr, hdc, &rect, index, action, FALSE );
     if (oldFont) SelectObject( hdc, oldFont );
     if (oldBrush) SelectObject( hdc, oldBrush );
     ReleaseDC( wnd->hwndSelf, hdc );
@@ -935,7 +935,6 @@
     RECT focusRect = {-1, -1, -1, -1};
     HFONT oldFont = 0;
     HBRUSH hbrush, oldBrush = 0;
-    INT focusItem;
 
     if (descr->style & LBS_NOREDRAW) return 0;
 
@@ -961,14 +960,12 @@
         /* Special case for empty listbox: paint focus rect */
         rect.bottom = rect.top + descr->item_height;
         LISTBOX_PaintItem( wnd, descr, hdc, &rect, descr->focus_item,
-                           ODA_FOCUS );
+                           ODA_FOCUS, FALSE );
         rect.top = rect.bottom;
     }
 
     /* Paint all the item, regarding the selection
        Focus state will be painted after  */
-    focusItem = descr->focus_item;
-    descr->focus_item = -1;
 
     for (i = descr->top_item; i < descr->nb_items; i++)
     {
@@ -977,7 +974,7 @@
         else
             rect.bottom = rect.top + descr->items[i].height;
 
-        if (i == focusItem)
+        if (i == descr->focus_item)
         {
 	    /* keep the focus rect, to paint the focus item after */
 	    focusRect.left = rect.left;
@@ -985,7 +982,7 @@
 	    focusRect.top = rect.top;
 	    focusRect.bottom = rect.bottom;
         }
-        LISTBOX_PaintItem( wnd, descr, hdc, &rect, i, ODA_DRAWENTIRE );
+        LISTBOX_PaintItem( wnd, descr, hdc, &rect, i, ODA_DRAWENTIRE, TRUE );
         rect.top = rect.bottom;
 
         if ((descr->style & LBS_MULTICOLUMN) && !col_pos)
@@ -1015,9 +1012,8 @@
     }
 
     /* Paint the focus item now */
-    descr->focus_item = focusItem;
     if (focusRect.top != focusRect.bottom && descr->caret_on)
-        LISTBOX_PaintItem( wnd, descr, hdc, &focusRect, descr->focus_item, ODA_FOCUS );
+        LISTBOX_PaintItem( wnd, descr, hdc, &focusRect, descr->focus_item, ODA_FOCUS, FALSE );
 
     if (!IS_OWNERDRAW(descr))
     {