From 0b0e5b3e63bdf95b897ef01160a7bfd26958ddc6 Mon Sep 17 00:00:00 2001 From: Tangles Date: Tue, 11 Feb 2020 00:21:47 +1100 Subject: [PATCH] userprefs - askpref (prompt user for a string value - be careful with this) --- config.l | 1 + dgamelaunch.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ dgamelaunch.h | 2 ++ dgl-common.c | 3 +++ 4 files changed, 52 insertions(+) diff --git a/config.l b/config.l index 52a29d0..01e71f2 100644 --- a/config.l +++ b/config.l @@ -128,6 +128,7 @@ chpasswd { yylval.i = DGLCMD_CHPASSWD; return TYPE_DGLCMD0; } chmail { yylval.i = DGLCMD_CHMAIL; return TYPE_DGLCMD0; } setprefpath { yylval.i = DGLCMD_SETPREFPATH; return TYPE_DGLCMD1; } setpref { yylval.i = DGLCMD_SETPREF; return TYPE_DGLCMD2; } +askpref { yylval.i = DGLCMD_ASKPREF; return TYPE_DGLCMD2; } readprefs { yylval.i = DGLCMD_READPREFS; return TYPE_DGLCMD0; } writeprefs { yylval.i = DGLCMD_WRITEPREFS; return TYPE_DGLCMD0; } watch_menu { yylval.i = DGLCMD_WATCH_MENU; return TYPE_DGLCMD0; } diff --git a/dgamelaunch.c b/dgamelaunch.c index 7cfa4ea..a5b36af 100644 --- a/dgamelaunch.c +++ b/dgamelaunch.c @@ -2272,6 +2272,52 @@ setpref(char *key, char *val) return TRUE; } +void +delpref(char *key) +{ + struct userpref *cpref = userprefs; + /* ugly special case #1 (list empty) */ + if (!userprefs) return; + /* ugly special case #2 (delete first item) */ + if (!strcmp (userprefs->name, key)) { + free(userprefs->name); + free(userprefs->value); + userprefs = userprefs->npref; + free(cpref); + return; + } + /* ugly general case (delete another item) */ + while (cpref->npref) { + if (!strcmp (cpref->npref->name, key)) { + struct userpref *dpref = cpref->npref; + cpref->npref = dpref->npref; + free(dpref->name); + free(dpref->value); + free(dpref); + return; + } + cpref = cpref->npref; + } +} + +int +askpref (char *prompt, char *key) +{ + /* blank entry removes any previously stored value */ + char value[80]; + clear(); + drawbanner(&banner); + mvaddstr(13, 1, prompt); + mvaddstr(14, 1, "=> "); + mygetnstr(value, 80, 1); + if (strlen(value) == 0) { + delpref(key); + return TRUE; + } + return setpref(key, value); +} + + /* ************************************************************* */ int diff --git a/dgamelaunch.h b/dgamelaunch.h index f561f6a..b746074 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -69,6 +69,7 @@ typedef enum DGLCMD_SETENV, /* setenv foo bar */ DGLCMD_SETPREFPATH, /* setprefpath foo */ DGLCMD_SETPREF, /* setpref foo bar */ + DGLCMD_ASKPREF, /* askpref "prompt" foo */ DGLCMD_READPREFS, /* readprefs */ DGLCMD_WRITEPREFS, /* writeprefs */ DGLCMD_WATCH_MENU, /* watch_menu */ @@ -362,6 +363,7 @@ extern int readprefs(void); extern int writeprefs(void); extern const char *getpref(char *key, char *fallback); extern int setpref(char *key, char *val); +extern int askpref(char *prompt, char *key); /*extern int menuloop(void);*/ extern void ttyrec_getpty(void); #ifndef HAVE_SETENV diff --git a/dgl-common.c b/dgl-common.c index 514b361..53f76a9 100644 --- a/dgl-common.c +++ b/dgl-common.c @@ -388,6 +388,9 @@ dgl_exec_cmdqueue_w(struct dg_cmdpart *queue, int game, struct dg_user *me, char case DGLCMD_SETPREF: if (p1 && p2) setpref(p1, p2); break; + case DGLCMD_ASKPREF: + if (p1 && p2) askpref(p1, p2); + break; case DGLCMD_READPREFS: if (loggedin && userpref_path) readprefs(); break; -- 2.47.3