diff options
Diffstat (limited to 'showmenu.c')
-rw-r--r-- | showmenu.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/showmenu.c b/showmenu.c new file mode 100644 index 0000000..2e1bfbd --- /dev/null +++ b/showmenu.c @@ -0,0 +1,53 @@ +#include <stdarg.h> +#include <termio.h> +#include "memory.h" +#include "showmenu.h" + +static int menu_index; + +static void menu_callback(int index){ + menu_index=index; +} + +i64 showmenu(const char *title,...){ + va_list ap,ap2; + va_start(ap,title); + va_copy(ap2,ap); + i64 nargs=0; + while(va_arg(ap2,const char*)!=NULL)nargs++; + va_end(ap2); + + moveto(2,0); + tprintf("=== %s ===",title); + + Menudata menudata; + menudata.nitems=(int)nargs; + menudata.items=malloc(nargs,Menuitem); + for(i64 i=0;i<nargs;i++){ + menudata.items[i].text=strdup(va_arg(ap,const char*)); + menudata.items[i].hotkey='\0'; + menudata.items[i].func=menu_callback; + } + va_end(ap); + + menu_index=0; + + Menuwidget *mw=menu_make(2,2,&menudata); + while(true){ + redraw(); + int key=tgetkey(); + if(key<=0)return -1; + bool selected=false; + switch(menu_handlekey(mw,key)){ + case MENUKEY_IGNORED: bel(); break; + case MENUKEY_CALLED: selected=true; break; + case MENUKEY_HANDLED: + default: + break; + } + if(selected)break; + } + + menu_destroy(mw); + return menu_index; +}
\ No newline at end of file |