about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-17 19:19:01 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-17 19:49:20 +0100
commit50f712a31e35807be70631b30e5faa9c603fd542 (patch)
tree224336a803976eeca6074c6830aa25996074c8fd /src
parentff1382caa19bfc8e0d7825d1b71ea1e5356aeda4 (diff)
downloadchawan-50f712a31e35807be70631b30e5faa9c603fd542.tar.gz
pager: merge ask with askChar, remove urandom
Diffstat (limited to 'src')
-rw-r--r--src/local/client.nim2
-rw-r--r--src/local/pager.nim79
2 files changed, 36 insertions, 45 deletions
diff --git a/src/local/client.nim b/src/local/client.nim
index b1fcb2cc..31f4bc30 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -170,7 +170,7 @@ proc newClient*(config: Config; forkserver: ForkServer; loaderPid: int;
     factory: newCAtomFactory(),
     loader: loader,
     crypto: Crypto(urandom: urandom),
-    pager: newPager(config, forkserver, jsctx, warnings, urandom, loader),
+    pager: newPager(config, forkserver, jsctx, warnings, loader),
     settings: EnvironmentSettings(scripting: smApp)
   )
   client.attrsp = addr client.pager.term.attrs
diff --git a/src/local/pager.nim b/src/local/pager.nim
index aee3c157..b61e02e9 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -127,10 +127,9 @@ type
     alertState: PagerAlertState
     alerts: seq[string]
     alive: bool
-    askcharpromise*: Promise[string]
-    askcursor: int
-    askpromise*: Promise[bool]
-    askprompt: string
+    askPromise*: Promise[string]
+    askCursor: int
+    askPrompt: string
     blockTillRelease: bool
     commandMode {.jsget.}: bool
     config*: Config
@@ -170,7 +169,6 @@ type
     term*: Terminal
     timeouts*: TimeoutState
     unreg*: seq[Container]
-    urandom: PosixStream
 
   ContainerData* = ref object of MapData
     container*: Container
@@ -202,8 +200,7 @@ proc connected3(pager: Pager; container: Container; stream: SocketStream;
 proc draw(pager: Pager)
 proc dumpBuffers(pager: Pager)
 proc evalJS(pager: Pager; src, filename: string; module = false): JSValue
-proc fulfillAsk(pager: Pager; y: bool)
-proc fulfillCharAsk(pager: Pager; s: string)
+proc fulfillAsk(pager: Pager; s: string)
 proc getHist(pager: Pager; mode: LineMode): History
 proc handleEvents(pager: Pager)
 proc handleRead(pager: Pager; fd: int)
@@ -456,7 +453,7 @@ proc evalJSFree(opaque: RootRef; src, filename: string) =
   JS_FreeValue(pager.jsctx, pager.evalJS(src, filename))
 
 proc newPager*(config: Config; forkserver: ForkServer; ctx: JSContext;
-    alerts: seq[string]; urandom: PosixStream; loader: FileLoader): Pager =
+    alerts: seq[string]; loader: FileLoader): Pager =
   let pager = Pager(
     alive: true,
     config: config,
@@ -466,7 +463,6 @@ proc newPager*(config: Config; forkserver: ForkServer; ctx: JSContext;
     jsrt: JS_GetRuntime(ctx),
     jsctx: ctx,
     luctx: LUContext(),
-    urandom: urandom,
     exitCode: -1,
     loader: loader,
     cookieJars: newCookieJarMap()
@@ -762,19 +758,15 @@ proc handleCommandInput(pager: Pager; c: char): EmptyPromise =
 proc input(pager: Pager): EmptyPromise =
   var p: EmptyPromise = nil
   pager.term.restoreStdin()
-  var buf: string
+  var buf = ""
   while true:
     let c = pager.term.readChar()
-    if pager.askpromise != nil:
-      if c == 'y':
-        pager.fulfillAsk(true)
-      elif c == 'n':
-        pager.fulfillAsk(false)
-    elif pager.askcharpromise != nil:
+    if pager.askPromise != nil:
       buf &= c
+      #TODO this probably doesn't work with legacy charsets
       if buf.validateUTF8Surr() != -1:
         continue
-      pager.fulfillCharAsk(buf)
+      pager.fulfillAsk(buf)
     elif pager.lineedit != nil:
       pager.inputBuffer &= c
       let edit = pager.lineedit
@@ -907,7 +899,8 @@ proc writeStatusMessage(pager: Pager; str: string; format = Format();
 proc refreshStatusMsg(pager: Pager) =
   let container = pager.container
   if container == nil: return
-  if pager.askpromise != nil: return
+  if pager.askPromise != nil:
+    return
   if pager.precnum != 0:
     discard pager.writeStatusMessage($pager.precnum & pager.inputBuffer)
   elif pager.inputBuffer != "":
@@ -1206,7 +1199,7 @@ proc draw(pager: Pager) =
     pager.term.writeGrid(pager.display.grid)
     pager.display.redraw = false
     redraw = true
-  if pager.askpromise != nil or pager.askcharpromise != nil:
+  if pager.askPromise != nil:
     pager.term.writeGrid(pager.status.grid, 0, pager.attrs.height - 1)
     pager.status.redraw = false
     redraw = true
@@ -1241,8 +1234,8 @@ proc draw(pager: Pager) =
     pager.term.outputGrid()
     if pager.term.imageMode != imNone:
       pager.term.outputImages()
-  if pager.askpromise != nil:
-    pager.term.setCursor(pager.askcursor, pager.attrs.height - 1)
+  if pager.askPromise != nil:
+    pager.term.setCursor(pager.askCursor, pager.attrs.height - 1)
   elif pager.lineedit != nil:
     pager.term.setCursor(pager.lineedit.getCursorX(), pager.attrs.height - 1)
   elif (let menu = pager.menu; menu != nil):
@@ -1258,31 +1251,29 @@ proc draw(pager: Pager) =
 
 proc writeAskPrompt(pager: Pager; s = "") =
   let maxwidth = pager.status.grid.width - s.width()
-  let i = pager.writeStatusMessage(pager.askprompt, maxwidth = maxwidth)
-  pager.askcursor = pager.writeStatusMessage(s, start = i)
-
-proc ask(pager: Pager; prompt: string): Promise[bool] {.jsfunc.} =
-  pager.askprompt = prompt
-  pager.writeAskPrompt(" (y/n)")
-  pager.askpromise = Promise[bool]()
-  return pager.askpromise
+  let i = pager.writeStatusMessage(pager.askPrompt, maxwidth = maxwidth)
+  pager.askCursor = pager.writeStatusMessage(s, start = i)
 
 proc askChar(pager: Pager; prompt: string): Promise[string] {.jsfunc.} =
-  pager.askprompt = prompt
+  pager.askPrompt = prompt
   pager.writeAskPrompt()
-  pager.askcharpromise = Promise[string]()
-  return pager.askcharpromise
-
-proc fulfillAsk(pager: Pager; y: bool) =
-  let p = pager.askpromise
-  pager.askpromise = nil
-  pager.askprompt = ""
-  p.resolve(y)
-
-proc fulfillCharAsk(pager: Pager; s: string) =
-  let p = pager.askcharpromise
-  pager.askcharpromise = nil
-  pager.askprompt = ""
+  pager.askPromise = Promise[string]()
+  return pager.askPromise
+
+proc ask(pager: Pager; prompt: string): Promise[bool] {.jsfunc.} =
+  return pager.askChar(prompt & " (y/n)").then(proc(s: string): Promise[bool] =
+    if s == "y":
+      return newResolvedPromise(true)
+    if s == "n":
+      return newResolvedPromise(false)
+    pager.askPromise = Promise[string]()
+    return pager.ask(prompt)
+  )
+
+proc fulfillAsk(pager: Pager; s: string) =
+  let p = pager.askPromise
+  pager.askPromise = nil
+  pager.askPrompt = ""
   p.resolve(s)
 
 proc addContainer*(pager: Pager; container: Container) =
@@ -1766,7 +1757,7 @@ proc windowChange(pager: Pager) =
   pager.clearStatus()
   for container in pager.containers:
     container.windowChange(pager.attrs)
-  if pager.askprompt != "":
+  if pager.askPrompt != "":
     pager.writeAskPrompt()
   pager.showAlerts()