diff -urN cui30/cui.c cui31/cui.c --- cui30/cui.c Fri Jan 31 00:10:00 2014 +++ cui31/cui.c Fri Jan 31 00:30:00 2014 @@ -11,8 +11,39 @@ #include #include -cui cui_focus = NULL; -int cui_running = FALSE; +typedef struct cui_main_stack *cui_main_stack; + +struct cui_main_stack{ + cui focus; + int running; + cui_main_stack prev; +}; + +static cui_main_stack main_stack = NULL; + +cui +cui_focus_get(void) +{ + return main_stack ? main_stack->focus : NULL; +} + +void +cui_focus_set(cui obj) +{ + if(main_stack) main_stack->focus = obj; +} + +int +cui_running_get(void) +{ + return main_stack ? main_stack->running : FALSE; +} + +void +cui_running_set(int v) +{ + if(main_stack) main_stack->running = v; +} cui cui_alloc(int size) @@ -135,7 +166,7 @@ int cui_focus_move_val(cui obj, int key) { - if(cui_focus) return cui_glen(obj, cui_focus); + if(cui_focus_get()) return cui_glen(obj, cui_focus_get()); switch(key){ case CUI_KEY_UP: @@ -154,12 +185,13 @@ cui_focus_move_judge(cui obj, int key, cui old, int *val) { int v, jg = FALSE; + cui focus = cui_focus_get(); if(obj == NULL) return old; old = cui_focus_move_judge(obj->next, key, old, val); old = cui_focus_move_judge(obj->children, key, old, val); - if(obj == cui_focus) return old; + if(obj == focus) return old; if(!(obj->flags & CUI_FLG_CAN_FOCUS)) return old; if(!cui_is_visible(obj)) return old; switch(key){ @@ -173,19 +205,19 @@ } v = cui_focus_move_val(obj, key); - if(cui_focus){ + if(focus){ switch(key){ case CUI_KEY_UP: - jg = cui_gy(obj) <= cui_gy(cui_focus); + jg = cui_gy(obj) <= cui_gy(focus); break; case CUI_KEY_DOWN: - jg = cui_gy(obj) + obj->h >= cui_gy(cui_focus) + cui_focus->h; + jg = cui_gy(obj) + obj->h >= cui_gy(focus) + focus->h; break; case CUI_KEY_LEFT: - jg = cui_gx(obj) <= cui_gx(cui_focus); + jg = cui_gx(obj) <= cui_gx(focus); break; case CUI_KEY_RIGHT: - jg = cui_gx(obj) + obj->w >= cui_gx(cui_focus) + cui_focus->w; + jg = cui_gx(obj) + obj->w >= cui_gx(focus) + focus->w; break; } if(old) jg = jg && v < *val; @@ -214,7 +246,7 @@ if(obj == NULL) return; if(!cui_is_visible(obj)) return; - val = (obj == cui_focus) ? CUI_DRAW_FOCUS : CUI_DRAW_NORMAL; + val = (obj == cui_focus_get()) ? CUI_DRAW_FOCUS : CUI_DRAW_NORMAL; cui_handler_call(obj, obj->handler_list, CUI_EVT_DRAW, val); cui_draw_chain(obj->children); } @@ -289,36 +321,45 @@ void cui_quit(void) { - cui_running = FALSE; + cui_running_set(FALSE); } void -cui_main(cui top_obj) +cui_main(cui top_obj, cui init_focus) { + struct cui_main_stack stk; + cui_main_stack sp = (cui_main_stack)&stk; + int key, val; - cui obj, bak; + cui focus, obj; + + sp->focus = init_focus; + sp->running = TRUE; + sp->prev = main_stack; + main_stack = sp; cui_esc_enter(); cui_key_enter(); - cui_running = TRUE; cui_clear(top_obj); cui_draw(top_obj); - while(cui_running){ + while(cui_running_get()){ if((key = cui_key_get2()) == 0) continue; - if(cui_focus){ - if(cui_handler_call(cui_focus, cui_focus->handler_list, CUI_EVT_KEY, key)) continue; + focus = cui_focus_get(); + if(focus){ + if(cui_handler_call(focus, focus->handler_list, CUI_EVT_KEY, key)) continue; } obj = cui_focus_move_judge(top_obj, key, NULL, &val); if(obj){ - bak = cui_focus; - cui_focus = obj; - cui_draw(bak); + cui_focus_set(obj); + cui_draw(focus); cui_draw(obj); } } cui_key_exit(); cui_esc_exit(); + + main_stack = sp->prev; } void diff -urN cui30/cui.h cui31/cui.h --- cui30/cui.h Fri Jan 31 00:10:00 2014 +++ cui31/cui.h Fri Jan 31 00:30:00 2014 @@ -53,8 +53,13 @@ void cui_x_set(cui obj, int x); void cui_w_set(cui obj, int w); +cui cui_focus_get(void); +void cui_focus_set(cui obj); +int cui_running_get(void); +void cui_running_set(int v); + void cui_quit(void); -void cui_main(cui top_obj); +void cui_main(cui top_obj, cui init_focus); void cui_free(cui obj); #endif diff -urN cui30/cui_test.c cui31/cui_test.c --- cui30/cui_test.c Fri Jan 31 00:20:00 2014 +++ cui31/cui_test.c Fri Jan 31 00:30:00 2014 @@ -7,8 +7,6 @@ #include "button.h" #include "dialog.h" -extern cui cui_focus; - int joke_hdr(cui obj, int evt, int val, void *prm) { @@ -20,11 +18,11 @@ cui_button_str_set(b1, "sorry"); cui_x_set(b1, lb->w + 1); cui_hide(b2); - cui_focus = b1; + cui_focus_set(b1); cui_w_set(lb, b1->x + b1->w); }else{ cui_hide(lb); - cui_focus = NULL; + cui_focus_set(NULL); cui_draw(lb->parent); } return TRUE; @@ -39,7 +37,7 @@ cui_w_set(lb, b2->x + b2->w); cui_bind(b1, CUI_EVT_BUTTON, joke_hdr, lb); cui_bind(b2, CUI_EVT_BUTTON, joke_hdr, lb); - cui_focus = b1; + cui_focus_set(b1); cui_draw(lb); return lb; } @@ -78,7 +76,7 @@ cui_bind(btn, CUI_EVT_BUTTON, my_hdr2, p); cui_bind(p->btn1, CUI_EVT_BUTTON, my_hdr, p); - cui_main(base); + cui_main(base, NULL); printf("result %s\n", p->btn_result); cui_free(base); return 0;