about summary refs log tree commit diff stats
path: root/src/display
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2022-10-04 12:13:27 +0200
committerbptato <nincsnevem662@gmail.com>2022-10-04 12:13:27 +0200
commitc4e2de9cd8cad7e28b33e68b1b76f9044fe510be (patch)
tree92930e716d3c1ffca8614c030a35c5008655bca4 /src/display
parent10d3154eff79ce53b82fa946556f52f3e10eac90 (diff)
downloadchawan-c4e2de9cd8cad7e28b33e68b1b76f9044fe510be.tar.gz
WIP pager
Diffstat (limited to 'src/display')
-rw-r--r--src/display/client.nim44
-rw-r--r--src/display/pager.nim62
2 files changed, 85 insertions, 21 deletions
diff --git a/src/display/client.nim b/src/display/client.nim
index ef855017..82fc2299 100644
--- a/src/display/client.nim
+++ b/src/display/client.nim
@@ -11,6 +11,7 @@ import std/monotimes
 
 import css/sheet
 import config/config
+import display/pager
 import html/dom
 import html/htmlparser
 import io/buffer
@@ -34,7 +35,9 @@ type
     errormessage: string
     userstyle: CSSStylesheet
     loader: FileLoader
-    console: Console
+    console {.jsget.}: Console
+    pager {.jsget.}: Pager
+    config: Config
     jsrt: JSRuntime
     jsctx: JSContext
     regex: Option[Regex]
@@ -94,7 +97,6 @@ proc addBuffer(client: Client) =
     client.buffer = client.buffer.next
   client.buffer.loader = client.loader
   client.buffer.userstyle = client.userstyle
-  client.buffer.markcolor = gconfig.markcolor
 
 proc prevBuffer(client: Client) {.jsfunc.} =
   if client.buffer.prev != nil:
@@ -361,7 +363,7 @@ proc changeLocation(client: Client) {.jsfunc.} =
   let buffer = client.buffer
   var url = buffer.location.serialize(true)
   client.statusMode()
-  let status = readLine("URL: ", url, buffer.width)
+  let status = readLine("URL: ", url, buffer.width, config = client.config)
   if status:
     client.loadUrl(url)
 
@@ -448,7 +450,7 @@ proc command(client: Client, src: string) =
 proc command(client: Client): bool {.jsfunc.} =
   var iput: string
   client.statusMode()
-  let status = readLine("COMMAND: ", iput, client.buffer.width)
+  let status = readLine("COMMAND: ", iput, client.buffer.width, config = client.config)
   if status:
     client.command(iput)
   return status
@@ -473,7 +475,7 @@ proc searchPrev(client: Client) {.jsfunc.} =
 proc search(client: Client) {.jsfunc.} =
   client.statusMode()
   var iput: string
-  let status = readLine("/", iput, client.buffer.width)
+  let status = readLine("/", iput, client.buffer.width, config = client.config)
   if status:
     if iput.len != 0:
       client.regex = compileSearchRegex(iput)
@@ -483,7 +485,7 @@ proc search(client: Client) {.jsfunc.} =
 proc searchBack(client: Client) {.jsfunc.} =
   client.statusMode()
   var iput: string
-  let status = readLine("?", iput, client.buffer.width)
+  let status = readLine("?", iput, client.buffer.width, config = client.config)
   if status:
     if iput.len != 0:
       client.regex = compileSearchRegex(iput)
@@ -499,7 +501,7 @@ proc isearch(client: Client) {.jsfunc.} =
     if mark != nil:
       client.buffer.removeMark(mark)
 
-  let status = readLine("/", iput, client.buffer.width, {}, false, (proc(state: var LineState): bool =
+  let status = readLine("/", iput, client.buffer.width, {}, false, client.config, (proc(state: var LineState): bool =
     del_mark
     let regex = compileSearchRegex($state.news)
     client.buffer.cpos = cpos
@@ -537,7 +539,7 @@ proc isearchBack(client: Client) {.jsfunc.} =
   template del_mark() =
     if mark != nil:
       client.buffer.removeMark(mark)
-  let status = readLine("?", iput, client.buffer.width, {}, false, (proc(state: var LineState): bool =
+  let status = readLine("?", iput, client.buffer.width, {}, false, client.config, (proc(state: var LineState): bool =
     del_mark
     let regex = compileSearchRegex($state.news)
     client.buffer.cpos = cpos
@@ -567,6 +569,7 @@ proc isearchBack(client: Client) {.jsfunc.} =
 
 proc quit(client: Client) {.jsfunc.} =
   print(HVP(getTermAttributes().height, 0))
+  print(EL())
   quit(0)
 
 proc feedNext(client: Client) {.jsfunc.} =
@@ -618,7 +621,7 @@ proc input(client: Client) =
   let c = client.console.readChar()
   client.s &= c
 
-  let action = getNormalAction(client.s)
+  let action = getNormalAction(client.config, client.s)
   client.evalJSFree(action, "<command>")
 
 proc followRedirect(client: Client)
@@ -628,13 +631,13 @@ proc checkAuth(client: Client) =
     client.buffer.refreshBuffer()
     client.statusMode()
     var username = ""
-    let ustatus = readLine("Username: ", username, client.buffer.width)
+    let ustatus = readLine("Username: ", username, client.buffer.width, config = client.config)
     if not ustatus:
       client.needsauth = false
       return
     client.statusMode()
     var password = ""
-    let pstatus = readLine("Password: ", password, client.buffer.width, hide = true)
+    let pstatus = readLine("Password: ", password, client.buffer.width, hide = true, config = client.config)
     if not pstatus:
       client.needsauth = false
       return
@@ -768,14 +771,14 @@ proc jsEventLoop(client: Client) =
       sleep(wait)
 
 proc launchClient*(client: Client, pages: seq[string], ctype: string, dump: bool) =
-  if gconfig.startup != "":
-    let s = readFile(gconfig.startup)
+  if client.config.startup != "":
+    let s = readFile(client.config.startup)
     client.console.err = newFileStream(stderr)
-    client.command0(s, gconfig.startup, silence = true)
+    client.command0(s, client.config.startup, silence = true)
     client.jsEventLoop()
     client.console.err = newStringStream()
     quit()
-  client.userstyle = gconfig.stylesheet.parseStylesheet()
+  client.userstyle = client.config.stylesheet.parseStylesheet()
   if not stdin.isatty:
     client.readPipe(ctype)
   try:
@@ -819,8 +822,9 @@ proc log(console: Console, ss: varargs[string]) {.jsfunc.} =
 proc sleep(client: Client, millis: int) {.jsfunc.} =
   sleep millis
 
-proc newClient*(): Client =
+proc newClient*(config: Config): Client =
   new(result)
+  result.config = config
   result.loader = newFileLoader()
   result.console = newConsole()
   let rt = newJSRuntime()
@@ -833,14 +837,12 @@ proc newClient*(): Client =
   ctx.registerType(Client, asglobal = true)
   global.setOpaque(result)
   ctx.setProperty(global.val, "client", global.val)
-
-  let consoleClassId = ctx.registerType(Console)
-  let jsConsole = ctx.newJSObject(consoleClassId)
-  jsConsole.setOpaque(result.console)
-  ctx.setProperty(global.val, "console", jsConsole.val)
   free(global)
 
+  ctx.registerType(Console)
+
   ctx.addUrlModule()
   ctx.addDOMModule()
   ctx.addHTMLModule()
   ctx.addRequestModule()
+  ctx.addPagerModule()
diff --git a/src/display/pager.nim b/src/display/pager.nim
new file mode 100644
index 00000000..9fc8957d
--- /dev/null
+++ b/src/display/pager.nim
@@ -0,0 +1,62 @@
+import config/config
+import io/buffer
+import js/javascript
+
+type
+  Container = ref object
+    buffer: Buffer
+    children: seq[Container]
+
+  Pager* = ref object
+    rootContainer: Container
+    container: Container
+    config: Config
+
+proc cursorLeft(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorLeft()
+proc cursorDown(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorDown()
+proc cursorUp(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorUp()
+proc cursorRight(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorRight()
+proc cursorLineBegin(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorLineBegin()
+proc cursorLineEnd(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorLineEnd()
+proc cursorNextWord(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorNextWord()
+proc cursorPrevWord(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorPrevWord()
+proc cursorNextLink(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorNextLink()
+proc cursorPrevLink(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorPrevLink()
+proc pageDown(pager: Pager) {.jsfunc.} = pager.container.buffer.pageDown()
+proc pageUp(pager: Pager) {.jsfunc.} = pager.container.buffer.pageUp()
+proc pageRight(pager: Pager) {.jsfunc.} = pager.container.buffer.pageRight()
+proc pageLeft(pager: Pager) {.jsfunc.} = pager.container.buffer.pageLeft()
+proc halfPageDown(pager: Pager) {.jsfunc.} = pager.container.buffer.halfPageDown()
+proc halfPageUp(pager: Pager) {.jsfunc.} = pager.container.buffer.halfPageUp()
+proc cursorFirstLine(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorFirstLine()
+proc cursorLastLine(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorLastLine()
+proc cursorTop(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorTop()
+proc cursorMiddle(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorMiddle()
+proc cursorBottom(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorBottom()
+proc cursorLeftEdge(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorLeftEdge()
+proc cursorVertMiddle(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorVertMiddle()
+proc cursorRightEdge(pager: Pager) {.jsfunc.} = pager.container.buffer.cursorRightEdge()
+proc centerLine(pager: Pager) {.jsfunc.} = pager.container.buffer.centerLine()
+proc scrollDown(pager: Pager) {.jsfunc.} = pager.container.buffer.scrollDown()
+proc scrollUp(pager: Pager) {.jsfunc.} = pager.container.buffer.scrollUp()
+proc scrollLeft(pager: Pager) {.jsfunc.} = pager.container.buffer.scrollLeft()
+proc scrollRight(pager: Pager) {.jsfunc.} = pager.container.buffer.scrollRight()
+proc lineInfo(pager: Pager) {.jsfunc.} = pager.container.buffer.lineInfo()
+proc reshape(pager: Pager) {.jsfunc.} = pager.container.buffer.reshape = true
+proc redraw(pager: Pager) {.jsfunc.} = pager.container.buffer.redraw = true
+
+proc newContainer(): Container =
+  new(result)
+
+proc newPager*(config: Config, buffer: Buffer): Pager =
+  result.config = config
+  result.rootContainer = newContainer()
+
+proc addBuffer*(pager: Pager, buffer: Buffer) =
+  var ncontainer = newContainer()
+  ncontainer.buffer = buffer
+  pager.container.children.add(ncontainer)
+  pager.container = ncontainer
+
+proc addPagerModule*(ctx: JSContext) =
+  ctx.registerType(Pager)