diff -urN cui66/focus.c cui67/focus.c --- cui66/focus.c Fri Jan 31 02:10:00 2014 +++ cui67/focus.c Sat Feb 8 23:30:00 2014 @@ -3,9 +3,31 @@ #include int +cui_focus_glen(cui o1, cui o2, int key) +{ + int dx, dy; + + dx = (cui_gx(o1) + o1->w / 2) - (cui_gx(o2) + o2->w / 2); + dy = (cui_gy(o1) + o1->h / 2) - (cui_gy(o2) + o2->h / 2); + dy *= 2; + + switch(key){ + case CUI_KEY_UP: + case CUI_KEY_DOWN: + dx *= 4; + break; + case CUI_KEY_LEFT: + case CUI_KEY_RIGHT: + dy *= 4; + break; + } + return dx * dx + dy * dy; +} + +int cui_focus_move_val(cui obj, int key) { - if(cui_focus_get()) return cui_glen(obj, cui_focus_get()); + if(cui_focus_get()) return cui_focus_glen(obj, cui_focus_get(), key); switch(key){ case CUI_KEY_UP: @@ -55,16 +77,16 @@ if(focus){ switch(key){ case CUI_KEY_UP: - jg = cui_gy(obj) < cui_gy(focus); + jg = cui_gy(obj) + obj->h / 2 < cui_gy(focus) + focus->h / 2; break; case CUI_KEY_DOWN: - jg = cui_gy(obj) + obj->h > cui_gy(focus) + focus->h; + jg = cui_gy(obj) + obj->h / 2 > cui_gy(focus) + focus->h / 2; break; case CUI_KEY_LEFT: - jg = cui_gx(obj) < cui_gx(focus); + jg = cui_gx(obj) + obj->w / 2 < cui_gx(focus) + focus->w / 2; break; case CUI_KEY_RIGHT: - jg = cui_gx(obj) + obj->w > cui_gx(focus) + focus->w; + jg = cui_gx(obj) + obj->w / 2 > cui_gx(focus) + focus->w / 2; break; } if(old) jg = jg && v < *val;