diff --git a/src/main/window/floating-terminal-window.ts b/src/main/window/floating-terminal-window.ts index a3d9f7e9d84..809b5e35d2d 100644 --- a/src/main/window/floating-terminal-window.ts +++ b/src/main/window/floating-terminal-window.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, nativeTheme } from 'electron' +import { app, BrowserWindow, nativeTheme } from 'electron' import { join } from 'path' import { is } from '@electron-toolkit/utils' import icon from '../../../resources/icon.png?asset' @@ -12,55 +12,6 @@ const FLOATING_TERMINAL_MIN_HEIGHT = 280 let floatingTerminalWindow: BrowserWindow | null = null let appQuitting = false -function isFloatingTerminalSender( - event: Electron.IpcMainEvent | Electron.IpcMainInvokeEvent -): boolean { - return floatingTerminalWindow?.webContents.id === event.sender.id -} - -function sendWindowState(window: BrowserWindow): void { - if (window.isDestroyed()) { - return - } - window.webContents.send('floating-terminal-window:maximize-changed', window.isMaximized()) - window.webContents.send('floating-terminal-window:pinned-changed', window.isAlwaysOnTop()) -} - -ipcMain.handle('floating-terminal-window:isMaximized', (event): boolean => { - return isFloatingTerminalSender(event) && floatingTerminalWindow?.isMaximized() === true -}) - -ipcMain.handle('floating-terminal-window:isPinned', (event): boolean => { - return isFloatingTerminalSender(event) && floatingTerminalWindow?.isAlwaysOnTop() === true -}) - -ipcMain.on('floating-terminal-window:hide', (event) => { - if (isFloatingTerminalSender(event)) { - floatingTerminalWindow?.hide() - } -}) - -ipcMain.on('floating-terminal-window:toggleMaximized', (event) => { - const window = floatingTerminalWindow - if (!window || window.isDestroyed() || !isFloatingTerminalSender(event)) { - return - } - if (window.isMaximized()) { - window.unmaximize() - } else { - window.maximize() - } -}) - -ipcMain.on('floating-terminal-window:togglePinned', (event) => { - const window = floatingTerminalWindow - if (!window || window.isDestroyed() || !isFloatingTerminalSender(event)) { - return - } - window.setAlwaysOnTop(!window.isAlwaysOnTop(), 'floating') - sendWindowState(window) -}) - app.on('before-quit', () => { appQuitting = true }) @@ -92,7 +43,6 @@ export function showFloatingTerminalWindow(): void { minWidth: FLOATING_TERMINAL_MIN_WIDTH, minHeight: FLOATING_TERMINAL_MIN_HEIGHT, title: 'Floating Terminal', - frame: false, show: false, autoHideMenuBar: true, backgroundColor: nativeTheme.shouldUseDarkColors ? '#0a0a0a' : '#ffffff', @@ -105,7 +55,6 @@ export function showFloatingTerminalWindow(): void { }) floatingTerminalWindow = window - window.setAlwaysOnTop(true, 'floating') window.webContents.setBackgroundThrottling(false) window.once('ready-to-show', () => { if (!window.isDestroyed()) { @@ -126,8 +75,6 @@ export function showFloatingTerminalWindow(): void { floatingTerminalWindow = null } }) - window.on('maximize', () => sendWindowState(window)) - window.on('unmaximize', () => sendWindowState(window)) window.webContents.on('before-input-event', (event, input) => { if (input.type !== 'keyDown') { return diff --git a/src/preload/api-types.ts b/src/preload/api-types.ts index 9264445264f..9b1a626f54a 100644 --- a/src/preload/api-types.ts +++ b/src/preload/api-types.ts @@ -1178,15 +1178,6 @@ export type PreloadApi = { onMaximizeChanged: (callback: (isMaximized: boolean) => void) => () => void requestClose: () => void popupMenu: () => void - floatingTerminal: { - hide: () => void - toggleMaximized: () => void - isMaximized: () => Promise - onMaximizeChanged: (callback: (isMaximized: boolean) => void) => () => void - togglePinned: () => void - isPinned: () => Promise - onPinnedChanged: (callback: (pinned: boolean) => void) => () => void - } onWindowCloseRequested: (callback: (data: { isQuitting: boolean }) => void) => () => void confirmWindowClose: () => void } diff --git a/src/preload/index.ts b/src/preload/index.ts index b4a9f72bad7..0e56d34cb2f 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -2103,32 +2103,6 @@ const api = { popupMenu: (): void => { ipcRenderer.send('menu:popup') }, - floatingTerminal: { - hide: (): void => { - ipcRenderer.send('floating-terminal-window:hide') - }, - toggleMaximized: (): void => { - ipcRenderer.send('floating-terminal-window:toggleMaximized') - }, - isMaximized: (): Promise => - ipcRenderer.invoke('floating-terminal-window:isMaximized'), - onMaximizeChanged: (callback: (isMaximized: boolean) => void): (() => void) => { - const listener = (_event: Electron.IpcRendererEvent, isMaximized: boolean) => - callback(isMaximized) - ipcRenderer.on('floating-terminal-window:maximize-changed', listener) - return () => - ipcRenderer.removeListener('floating-terminal-window:maximize-changed', listener) - }, - togglePinned: (): void => { - ipcRenderer.send('floating-terminal-window:togglePinned') - }, - isPinned: (): Promise => ipcRenderer.invoke('floating-terminal-window:isPinned'), - onPinnedChanged: (callback: (pinned: boolean) => void): (() => void) => { - const listener = (_event: Electron.IpcRendererEvent, pinned: boolean) => callback(pinned) - ipcRenderer.on('floating-terminal-window:pinned-changed', listener) - return () => ipcRenderer.removeListener('floating-terminal-window:pinned-changed', listener) - } - }, /** Fired by the main process when the user tries to close the window * (X button, Cmd+Q, etc.). Renderer should show a confirmation dialog * if terminals are still running, then call confirmWindowClose(). diff --git a/src/renderer/src/components/floating-terminal/FloatingTerminalWindowApp.tsx b/src/renderer/src/components/floating-terminal/FloatingTerminalWindowApp.tsx index aeb70cac917..ce93bcd3581 100644 --- a/src/renderer/src/components/floating-terminal/FloatingTerminalWindowApp.tsx +++ b/src/renderer/src/components/floating-terminal/FloatingTerminalWindowApp.tsx @@ -1,10 +1,8 @@ import { useCallback, useEffect, useMemo, useState } from 'react' -import { Maximize2, Minimize2, Pin, PinOff, X } from 'lucide-react' import TabBar from '@/components/tab-bar/TabBar' import TerminalPane from '@/components/terminal-pane/TerminalPane' -import { Button } from '@/components/ui/button' import { Toaster } from '@/components/ui/sonner' -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' +import { TooltipProvider } from '@/components/ui/tooltip' import { FLOATING_TERMINAL_WORKTREE_ID } from '@/lib/floating-terminal' import { focusTerminalTabSurface } from '@/lib/focus-terminal-tab-surface' import { createSessionWriteSubscriber } from '@/lib/session-write-subscriber' @@ -35,8 +33,6 @@ export function FloatingTerminalWindowApp(): React.JSX.Element { const tabBarOrder = useAppStore((s) => s.tabBarOrderByWorktree[FLOATING_TERMINAL_WORKTREE_ID]) const floatingTerminalCwd = useAppStore((s) => s.settings?.floatingTerminalCwd ?? '~') const [cwd, setCwd] = useState(null) - const [pinned, setPinned] = useState(true) - const [maximized, setMaximized] = useState(false) const tabs = tabsByWorktree[FLOATING_TERMINAL_WORKTREE_ID] ?? EMPTY_TERMINAL_TABS const activeTabId = activeTabIdByWorktree[FLOATING_TERMINAL_WORKTREE_ID] ?? tabs[0]?.id ?? null @@ -82,27 +78,6 @@ export function FloatingTerminalWindowApp(): React.JSX.Element { [] ) - useEffect(() => { - let cancelled = false - void window.api.ui.floatingTerminal.isPinned().then((value) => { - if (!cancelled) { - setPinned(value) - } - }) - void window.api.ui.floatingTerminal.isMaximized().then((value) => { - if (!cancelled) { - setMaximized(value) - } - }) - const offPinned = window.api.ui.floatingTerminal.onPinnedChanged(setPinned) - const offMaximized = window.api.ui.floatingTerminal.onMaximizeChanged(setMaximized) - return () => { - cancelled = true - offPinned() - offMaximized() - } - }, []) - const createFloatingTab = useCallback(() => { const tab = createTab(FLOATING_TERMINAL_WORKTREE_ID, undefined, undefined, { activate: false }) setActiveTabForWorktree(FLOATING_TERMINAL_WORKTREE_ID, tab.id) @@ -136,94 +111,26 @@ export function FloatingTerminalWindowApp(): React.JSX.Element { return (
-
-
- setActiveTabForWorktree(FLOATING_TERMINAL_WORKTREE_ID, tabId)} - onClose={closeTab} - onCloseOthers={closeOthers} - onCloseToRight={closeToRight} - onNewTerminalTab={createFloatingTab} - onNewBrowserTab={() => {}} - terminalOnly - onSetCustomTitle={setTabCustomTitle} - onSetTabColor={setTabColor} - onTogglePaneExpand={(tabId) => - setTabPaneExpanded(tabId, expandedPaneByTabId[tabId] !== true) - } - activeTabType="terminal" - tabBarOrder={tabBarOrder} - /> -
-
- - - - - - {pinned ? 'Unpin floating terminal' : 'Pin floating terminal'} - - - - - - - - {maximized ? 'Restore' : 'Maximize'} - - - - - - - - Hide floating terminal - - -
-
+ setActiveTabForWorktree(FLOATING_TERMINAL_WORKTREE_ID, tabId)} + onClose={closeTab} + onCloseOthers={closeOthers} + onCloseToRight={closeToRight} + onNewTerminalTab={createFloatingTab} + onNewBrowserTab={() => {}} + terminalOnly + onSetCustomTitle={setTabCustomTitle} + onSetTabColor={setTabColor} + onTogglePaneExpand={(tabId) => + setTabPaneExpanded(tabId, expandedPaneByTabId[tabId] !== true) + } + activeTabType="terminal" + tabBarOrder={tabBarOrder} + />
{cwd ? tabs.map((tab) => (