diff -urN cui36/cui.c cui37/cui.c --- cui36/cui.c Fri Jan 31 01:10:00 2014 +++ cui37/cui.c Fri Jan 31 01:30:00 2014 @@ -188,6 +188,7 @@ { obj->flags |= CUI_FLG_HIDE; cui_clear(obj); + if(obj == cui_focus_get()) cui_focus_set(NULL); } void @@ -218,6 +219,13 @@ return cui_rect_and(r, t, r); /* r and t --> r */ } +int +cui_is_visible_rect(cui obj) +{ + struct cui_rect tmp; + return cui_visible_rect(obj, &tmp); +} + void cui_xywh_set(cui obj, int x, int y, int w, int h) { @@ -228,6 +236,7 @@ obj->w = w; obj->h = h; if(visi) cui_show(obj); + if(obj == cui_focus_get() && !cui_is_visible_rect(obj)) cui_focus_set(NULL); } void diff -urN cui36/cui.h cui37/cui.h --- cui36/cui.h Fri Jan 31 01:10:00 2014 +++ cui37/cui.h Fri Jan 31 01:30:00 2014 @@ -54,6 +54,7 @@ void cui_show(cui obj); int cui_is_visible(cui obj); int cui_visible_rect(cui obj, cui_rect r); +int cui_is_visible_rect(cui obj); void cui_xywh_set(cui obj, int x, int y, int w, int h); void cui_x_set(cui obj, int x); void cui_w_set(cui obj, int w); diff -urN cui36/focus.c cui37/focus.c --- cui36/focus.c Fri Jan 31 01:10:00 2014 +++ cui37/focus.c Fri Jan 31 01:30:00 2014 @@ -40,6 +40,7 @@ if(obj == focus) return old; if(!(obj->flags & CUI_FLG_CAN_FOCUS)) return old; if(!cui_is_visible(obj)) return old; + if(!cui_is_visible_rect(obj)) return old; switch(key){ case CUI_KEY_UP: case CUI_KEY_DOWN: