release: prepare v0.4.10 window settings

This commit is contained in:
David Perov 2026-10-02 10:48:19 +03:00
parent d3ccff0a6a
commit 048f9d2096
9 changed files with 31 additions and 39 deletions

View file

@ -47,6 +47,12 @@ Enable **Start minimized** in Settings to keep the main Talkis window hidden on
## Latest Changes
### v0.4.10
- Settings can hide the floating desktop widget while keeping dictation hotkeys active. The choice survives restarts and is respected by the watchdog, tray actions and repeated launches.
- Added **Start minimized** (off by default): the main window stays hidden on the next launch, while the tray/menu bar and hotkeys remain available. Initial setup, required permission recovery and startup errors still reveal the window.
- Both new settings use compact switch rows without explanatory descriptions. Failed saves keep the previous choice; changing model settings preserves window preferences.
### v0.4.9
- Microphone startup has a three-second budget and native dictation start/stop runs outside the interface thread, keeping Talkis responsive when an audio driver stalls after idle or sleep. Dictation and call recording retain their WebView fallback; live translation reports a startup timeout.

View file

@ -47,6 +47,12 @@ Talkis сделан для повседневной работы: IDE, чаты,
## Последние изменения
### v0.4.10
- В настройках можно скрыть плавающий виджет на рабочем столе, сохранив диктовку по горячим клавишам. Выбор сохраняется после перезапуска и учитывается при автоматическом восстановлении виджета, действиях из трея и повторном запуске программы.
- Добавлена опция **«Сворачивать при запуске»** (по умолчанию выключена): со следующего запуска основное окно остаётся скрытым, а значок в строке меню или трее и горячие клавиши продолжают работать. Первоначальная настройка, восстановление обязательных разрешений и ошибка запуска показывают окно.
- У обеих новых настроек оставлены компактные строки с переключателями без поясняющих описаний. При ошибке сохранения остаётся прежний выбор; изменение настроек моделей сохраняет параметры отображения окон.
### v0.4.9
- Запуск микрофона ограничен тремя секундами, а начало и завершение нативной диктовки вынесены из потока интерфейса: зависший аудиодрайвер после простоя или сна больше не должен блокировать управление Talkis. Для диктовки и созвонов сохранён резервный способ записи через WebView; синхронный перевод сообщает о превышении времени запуска.

View file

@ -1,7 +1,7 @@
{
"name": "talkis",
"private": true,
"version": "0.4.9",
"version": "0.4.10",
"license": "AGPL-3.0-or-later",
"type": "module",
"packageManager": "bun@1.2.13",

4
src-tauri/Cargo.lock generated
View file

@ -5725,7 +5725,7 @@ dependencies = [
[[package]]
name = "talkis"
version = "0.4.9"
version = "0.4.10"
dependencies = [
"base64 0.22.1",
"block2 0.6.2",
@ -5774,7 +5774,7 @@ dependencies = [
[[package]]
name = "talkis-llm"
version = "0.4.9"
version = "0.4.10"
dependencies = [
"llama-cpp-2",
"serde_json",

View file

@ -1,6 +1,6 @@
[package]
name = "talkis"
version = "0.4.9"
version = "0.4.10"
description = "Talkis - Voice to Text Desktop Widget"
authors = ["trixter"]
license = "AGPL-3.0-or-later"
@ -13,7 +13,7 @@ default-members = ["."]
resolver = "2"
[workspace.package]
version = "0.4.9"
version = "0.4.10"
edition = "2021"
license = "AGPL-3.0-or-later"

View file

@ -25,6 +25,7 @@
},
"dialog:default",
"store:allow-load",
"store:allow-reload",
"store:allow-get",
"store:allow-set",
"store:allow-save",

View file

@ -2,7 +2,7 @@
"$schema": "https://schema.tauri.app/config/2",
"productName": "Talkis",
"mainBinaryName": "Talkis",
"version": "0.4.9",
"version": "0.4.10",
"identifier": "com.trixter.talkis",
"build": {
"beforeDevCommand": "bun scripts/run-vite.mjs --talkis-check-dev-port && bun run dev",

View file

@ -73,10 +73,6 @@ export const settingsGeneral = {
ru: "Показывать виджет на рабочем столе",
en: "Show the desktop widget",
},
"settings.widgetVisibility.desc": {
ru: "Когда виджет скрыт, Talkis продолжает работать по горячим клавишам. Вернуть виджет можно здесь; настройки доступны через значок Talkis в строке меню или трее.",
en: "With the widget hidden, Talkis keeps working via hotkeys. Restore it here; settings remain available from the Talkis menu bar or tray icon.",
},
"settings.widgetVisibility.on": { ru: "Показан", en: "Shown" },
"settings.widgetVisibility.off": { ru: "Скрыт", en: "Hidden" },
"settings.widgetVisibility.error": {
@ -109,10 +105,6 @@ export const settingsGeneral = {
ru: "Сворачивать при запуске",
en: "Start minimized",
},
"settings.startMinimized.desc": {
ru: "Со следующего запуска окно Talkis будет скрыто. Открыть его можно через значок в строке меню или трее. Показ виджета настраивается отдельно.",
en: "On the next launch, the Talkis window will stay hidden. Open it from the menu bar or tray icon. Widget visibility is configured separately.",
},
"settings.startMinimized.on": { ru: "Включено", en: "On" },
"settings.startMinimized.off": { ru: "Выключено", en: "Off" },
"settings.startMinimized.error": {

View file

@ -372,6 +372,17 @@ export function SettingsTab(): ReactElement | null {
"SETTINGS",
`Failed to save startup setting: ${String(error)}`,
);
try {
const latest = await getSettings({ reload: true });
settingsRef.current = latest;
setSettings(latest);
} catch (reloadError) {
void logError(
"SETTINGS",
`Failed to reload startup setting: ${String(reloadError)}`,
);
}
} finally {
startMinimizedPendingRef.current = false;
setStartMinimizedPending(false);
@ -1146,17 +1157,6 @@ export function SettingsTab(): ReactElement | null {
>
{t("settings.widgetVisibility.title")}
</div>
<div
id="widget-visibility-description"
style={{
fontSize: 12,
color: "var(--text-low)",
lineHeight: 1.5,
marginTop: 4,
}}
>
{t("settings.widgetVisibility.desc")}
</div>
</div>
<SettingsToggleControl
enabled={settings.widgetVisible}
@ -1167,7 +1167,6 @@ export function SettingsTab(): ReactElement | null {
: "settings.widgetVisibility.off",
)}
ariaLabel={t("settings.widgetVisibility.title")}
describedBy="widget-visibility-description"
onToggle={() => {
void toggleWidgetVisibility();
}}
@ -1306,17 +1305,6 @@ export function SettingsTab(): ReactElement | null {
>
{t("settings.startMinimized.title")}
</div>
<div
id="start-minimized-description"
style={{
marginTop: 4,
color: "var(--text-low)",
fontSize: 11,
lineHeight: 1.35,
}}
>
{t("settings.startMinimized.desc")}
</div>
</div>
<SettingsToggleControl
enabled={settings.startMinimized}
@ -1327,14 +1315,13 @@ export function SettingsTab(): ReactElement | null {
: "settings.startMinimized.off",
)}
ariaLabel={t("settings.startMinimized.title")}
describedBy="start-minimized-description"
onToggle={() => {
void toggleStartMinimized();
}}
/>
</div>
{startMinimizedError && (
<div role="alert" style={{ color: "var(--error)", fontSize: 11 }}>
<div role="alert" style={{ color: "var(--danger)", fontSize: 11 }}>
{startMinimizedError}
</div>
)}