Selaa lähdekoodia

Apply PR #23846: Themes aagain

opencode-agent[bot] 3 päivää sitten
vanhempi
sitoutus
904ad19977

+ 1 - 7
packages/opencode/src/cli/cmd/tui/app.tsx

@@ -1,7 +1,6 @@
 import { render, TimeToFirstDraw, useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
 import * as Clipboard from "@tui/util/clipboard"
 import * as Selection from "@tui/util/selection"
-import * as Terminal from "@tui/util/terminal"
 import { createCliRenderer, MouseButton, type CliRendererConfig } from "@opentui/core"
 import { RouteProvider, useRoute } from "@tui/context/route"
 import {
@@ -121,12 +120,6 @@ export function tui(input: {
     const unguard = win32InstallCtrlCGuard()
     win32DisableProcessedInput()
 
-    const mode = await Terminal.getTerminalBackgroundColor()
-
-    // Re-clear after getTerminalBackgroundColor() because setRawMode(false)
-    // restores the original console mode, including processed input on Windows.
-    win32DisableProcessedInput()
-
     const onExit = async () => {
       unguard?.()
       resolve()
@@ -137,6 +130,7 @@ export function tui(input: {
     }
 
     const renderer = await createCliRenderer(rendererConfig(input.config))
+    const mode = (await renderer.waitForThemeMode(1000)) ?? "dark"
 
     await render(() => {
       return (

+ 1 - 1
packages/opencode/src/cli/cmd/tui/context/theme.tsx

@@ -314,7 +314,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
     setStore(
       produce((draft) => {
         const lock = pick(kv.get("theme_mode_lock"))
-        const mode = lock ?? props.mode
+        const mode = lock ?? pick(renderer.themeMode) ?? props.mode
         if (!lock && pick(kv.get("theme_mode")) !== undefined) {
           kv.set("theme_mode", undefined)
         }

+ 0 - 39
packages/opencode/src/cli/cmd/tui/util/terminal.ts

@@ -17,12 +17,6 @@ function parse(color: string): RGBA | null {
   return null
 }
 
-function mode(background: RGBA | null): "dark" | "light" {
-  if (!background) return "dark"
-  const luminance = (0.299 * background.r + 0.587 * background.g + 0.114 * background.b) / 255
-  return luminance > 0.5 ? "light" : "dark"
-}
-
 /**
  * Query terminal colors including background, foreground, and palette (0-15).
  * Uses OSC escape sequences to retrieve actual terminal color values.
@@ -100,36 +94,3 @@ export async function colors(): Promise<{
     }, 1000)
   })
 }
-
-// Keep startup mode detection separate from `colors()`: the TUI boot path only
-// needs OSC 11 and should resolve on the first background response instead of
-// waiting on the full palette query used by system theme generation.
-export async function getTerminalBackgroundColor(): Promise<"dark" | "light"> {
-  if (!process.stdin.isTTY) return "dark"
-
-  return new Promise((resolve) => {
-    let timeout: NodeJS.Timeout
-
-    const cleanup = () => {
-      process.stdin.setRawMode(false)
-      process.stdin.removeListener("data", handler)
-      clearTimeout(timeout)
-    }
-
-    const handler = (data: Buffer) => {
-      const match = data.toString().match(/\x1b]11;([^\x07\x1b]+)/)
-      if (!match) return
-      cleanup()
-      resolve(mode(parse(match[1])))
-    }
-
-    process.stdin.setRawMode(true)
-    process.stdin.on("data", handler)
-    process.stdout.write("\x1b]11;?\x07")
-
-    timeout = setTimeout(() => {
-      cleanup()
-      resolve("dark")
-    }, 1000)
-  })
-}