about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-12-28 18:58:24 +0100
committerbptato <nincsnevem662@gmail.com>2024-12-28 18:58:24 +0100
commit5881750f9db31489fb3b9f03e53bc80eba897234 (patch)
tree9f33ce795909b58d2953ada3975ce71897bcc2ac /src
parent3fdb9c9ccb1ff4eb6fd5b8fde2be3725eb618b4f (diff)
downloadchawan-5881750f9db31489fb3b9f03e53bc80eba897234.tar.gz
env: do not copy attrs, fix screen on client
Now screen.width etc. works in the pager too.
Diffstat (limited to 'src')
-rw-r--r--src/css/cascade.nim10
-rw-r--r--src/html/dom.nim8
-rw-r--r--src/html/env.nim8
-rw-r--r--src/local/client.nim5
-rw-r--r--src/server/buffer.nim29
5 files changed, 31 insertions, 29 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim
index 0eb8e26d..3a983a63 100644
--- a/src/css/cascade.nim
+++ b/src/css/cascade.nim
@@ -43,11 +43,11 @@ func applies(feature: MediaFeature; window: Window): bool =
   of mftHover:
     return feature.b
   of mftPrefersColorScheme:
-    return feature.b == window.attrs.prefersDark
+    return feature.b == window.attrsp.prefersDark
   of mftWidth:
-    return feature.appliesLR(window, float64(window.attrs.widthPx))
+    return feature.appliesLR(window, float64(window.attrsp.widthPx))
   of mftHeight:
-    return feature.appliesLR(window, float64(window.attrs.heightPx))
+    return feature.appliesLR(window, float64(window.attrsp.heightPx))
   of mftScripting:
     return feature.b == (window.settings.scripting != smFalse)
 
@@ -299,12 +299,12 @@ proc applyDeclarations(styledNode: StyledNode; parent: CSSValues;
     let style = element.cachedStyle
     if window.styling and style != nil:
       for decl in style.decls:
-        let vals = parseComputedValues(decl.name, decl.value, window.attrs)
+        let vals = parseComputedValues(decl.name, decl.value, window.attrsp[])
         if decl.important:
           rules[coAuthor].important.add(vals)
         else:
           rules[coAuthor].normal.add(vals)
-    presHints = element.calcPresHints(window.attrs)
+    presHints = element.calcPresHints(window.attrsp[])
   styledNode.computed = rules.buildComputedValues(presHints, parent)
 
 func hasValues(rules: CSSValueEntryMap): bool =
diff --git a/src/html/dom.nim b/src/html/dom.nim
index 1f8b10a9..e175cc91 100644
--- a/src/html/dom.nim
+++ b/src/html/dom.nim
@@ -81,7 +81,7 @@ type
     bmp: NetworkBitmap
 
   Window* = ref object of EventTarget
-    attrs*: WindowAttributes
+    attrsp*: ptr WindowAttributes
     internalConsole*: Console
     navigator* {.jsget.}: Navigator
     screen* {.jsget.}: Screen
@@ -2559,7 +2559,7 @@ proc sheets*(document: Document): seq[CSSStylesheet] =
       if elem of HTMLStyleElement:
         let style = HTMLStyleElement(elem)
         style.sheet = style.textContent.parseStylesheet(document.factory,
-          document.baseURL, addr document.window.attrs)
+          document.baseURL, document.window.attrsp)
         document.cachedSheets.add(style.sheet)
       elif elem of HTMLLinkElement:
         let link = HTMLLinkElement(elem)
@@ -3392,7 +3392,7 @@ proc loadSheet(window: Window; link: HTMLLinkElement; url: URL; applies: bool) =
   ).then(proc(s: JSResult[string]) =
     # Check applies here, to avoid leaking the window size.
     if s.isSome:
-      let sheet = s.get.parseStylesheet(window.factory, url, addr window.attrs)
+      let sheet = s.get.parseStylesheet(window.factory, url, window.attrsp)
       if applies:
         # Note: we intentionally load all sheets to prevent media query
         # based tracking.
@@ -3421,7 +3421,7 @@ proc loadResource(window: Window; link: HTMLLinkElement) =
     var applies = true
     if media != "":
       let cvals = parseComponentValues(media)
-      let media = parseMediaQueryList(cvals, addr window.attrs)
+      let media = parseMediaQueryList(cvals, window.attrsp)
       applies = media.appliesImpl(window)
     window.loadSheet(link, url, applies)
 
diff --git a/src/html/env.nim b/src/html/env.nim
index 3405229c..fc5ec312 100644
--- a/src/html/env.nim
+++ b/src/html/env.nim
@@ -82,13 +82,13 @@ proc getter(mimeTypeArray: var MimeTypeArray; atom: JSAtom): JSValue
 proc availWidth(ctx: JSContext; screen: var Screen): int {.jsfget.} =
   let window = ctx.getWindow()
   if window.settings.scripting == smApp:
-    return window.attrs.widthPx
+    return window.attrsp.widthPx
   return 80 * 9
 
 proc availHeight(ctx: JSContext; screen: var Screen): int {.jsfget.} =
   let window = ctx.getWindow()
   if window.settings.scripting == smApp:
-    return window.attrs.heightPx
+    return window.attrsp.heightPx
   return 24 * 18
 
 proc width(ctx: JSContext; screen: var Screen): int {.jsfget.} =
@@ -343,12 +343,12 @@ proc runJSJobs*(window: Window) =
     ctx.writeException(window.console.err)
 
 proc newWindow*(scripting: ScriptingMode; images, styling, autofocus: bool;
-    attrs: WindowAttributes; factory: CAtomFactory; loader: FileLoader;
+    attrsp: ptr WindowAttributes; factory: CAtomFactory; loader: FileLoader;
     url: URL; urandom: PosixStream; imageTypes: Table[string, string];
     userAgent: string): Window =
   let err = newDynFileStream(stderr)
   let window = Window(
-    attrs: attrs,
+    attrsp: attrsp,
     internalConsole: newConsole(err),
     navigator: Navigator(),
     loader: loader,
diff --git a/src/local/client.nim b/src/local/client.nim
index e072ea92..9d21a9f3 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -12,6 +12,7 @@ import html/env
 import html/formdata
 import html/jsencoding
 import html/jsintl
+import html/script
 import html/xmlhttprequest
 import io/console
 import io/dynstream
@@ -168,8 +169,10 @@ proc newClient*(config: Config; forkserver: ForkServer; loaderPid: int;
     factory: newCAtomFactory(),
     loader: loader,
     urandom: urandom,
-    pager: newPager(config, forkserver, jsctx, warnings, urandom, loader)
+    pager: newPager(config, forkserver, jsctx, warnings, urandom, loader),
+    settings: EnvironmentSettings(scripting: smApp)
   )
+  client.attrsp = addr client.pager.term.attrs
   client.timeouts = client.pager.timeouts
   let global = JS_GetGlobalObject(jsctx)
   jsctx.setGlobal(client)
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index 3012c639..ea6a0d94 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -884,7 +884,6 @@ proc processData(buffer: Buffer; iq: openArray[uint8]): bool =
 proc windowChange*(buffer: Buffer; attrs: WindowAttributes) {.proxy.} =
   buffer.attrs = attrs
   buffer.prevStyled = nil
-  buffer.window.attrs = attrs
   buffer.reshape()
 
 type UpdateHoverResult* = object
@@ -1934,20 +1933,20 @@ proc launchBuffer*(config: BufferConfig; url: URL; attrs: WindowAttributes;
     charsetStack: charsetStack,
     cacheId: -1,
     outputId: -1,
-    factory: factory,
-    window: newWindow(
-      config.scripting,
-      config.images,
-      config.styling,
-      config.autofocus,
-      attrs,
-      factory,
-      loader,
-      url,
-      urandom,
-      config.imageTypes,
-      config.userAgent
-    )
+    factory: factory
+  )
+  buffer.window = newWindow(
+    config.scripting,
+    config.images,
+    config.styling,
+    config.autofocus,
+    addr buffer.attrs,
+    factory,
+    loader,
+    url,
+    urandom,
+    config.imageTypes,
+    config.userAgent
   )
   if buffer.config.scripting != smFalse:
     buffer.window.navigate = proc(url: URL) = buffer.navigate(url)