summaryrefslogtreecommitdiff
path: root/showmenu.c
diff options
context:
space:
mode:
Diffstat (limited to 'showmenu.c')
-rw-r--r--showmenu.c53
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