Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .github/workflows/release-developer-id.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,17 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
run: |
version="${GITHUB_REF_NAME#v}"
awk -v heading="## [$version]" '
index($0, heading) == 1 { found = 1; next }
found && /^## \[/ { exit }
found { print }
END { if (!found) exit 1 }
' CHANGELOG.md > release-notes.md
test -s release-notes.md

gh release create "$GITHUB_REF_NAME" \
dist/developer-id/*.dmg \
dist/developer-id/*.sha256 \
--title "MousePortal $GITHUB_REF_NAME" \
--notes "Signed and notarized MousePortal release."
--notes-file release-notes.md
28 changes: 25 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,39 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
- Improved portal visual editor
- Configuration profile import/export

## [1.1.0] - 2026-08-31
## [1.1.0] - 2026-09-02

### Added
- Window layout snapshots and lock-screen recovery for standard application windows.
- Display-canvas previews with switchable automatic and manually saved layouts.
- Manual and automatic window-layout snapshots for each display arrangement.
- Display-canvas previews with switchable saved layouts and visible window placement.
- Apply, rename, delete, and automatic-to-manual promotion actions for saved layouts.
- Independent controls for global window recovery, sleep/lock capture, and automatic wake restoration.
- Searchable ignored-application settings for excluding apps from future snapshots.
- System, Light, and Dark application themes across all 20 supported languages.

### Changed
- Moved display controls into a clearer top toolbar and each display card.
- Persisted the resizable display-layout sidebar width.
- Kept four portal rows visible before scrolling.

### Fixed
- Prevented wake handling from scanning displays or moving windows when automatic restoration is disabled.
- Improved matching for multiple windows from the same application and preserved layouts with saved windows.
- Limited restoration to standard, non-minimized, non-full-screen windows and documented unsupported macOS window modes.

## [1.0.1] - 2026-07-24

### Fixed
- Prevented a portal's two lines from overlapping or sharing an endpoint on the same display edge.

## [1.0.0] - 2026-07-19

### Added
- First public release of Hotkey Jump and bidirectional edge portals.
- Automatic display-arrangement detection, named layouts, and display visualization.
- Global shortcut and portal configuration with menu bar and launch-at-login support.
- Localized interface in 20 languages.

## [0.1.2] - 2026-06-15

### Changed
Expand Down
1 change: 1 addition & 0 deletions MousePortal/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
// 设置单例引用
AppDelegate.shared = self
AppTheme.stored().apply()
terminateOtherInstancesIfNeeded()

// 确保应用作为正规前台应用运行(对于 swift run 方式很重要)
Expand Down
8 changes: 6 additions & 2 deletions MousePortal/Resources/ar.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@
/* الإعدادات - عام */
"settings.app_behavior" = "سلوك التطبيق";
"settings.language" = "اللغة";
"settings.theme" = "المظهر";
"theme.system" = "اتّباع النظام";
"theme.light" = "فاتح";
"theme.dark" = "داكن";
"settings.show_menubar_icon" = "إظهار الأيقونة في شريط القوائم";
"settings.launch_at_login" = "التشغيل عند تسجيل الدخول";
"settings.permissions" = "الأذونات";
Expand Down Expand Up @@ -161,7 +165,7 @@
"window_recovery.remember_before_sleep" = "تذكّر النوافذ قبل الإسبات أو القفل";
"window_recovery.automatic" = "الاستعادة تلقائياً بعد تنبيه الشاشات";
"window_recovery.behavior" = "الاستعادة بعد التنبيه";
"window_recovery.save" = "حفظ التخطيط الحالي";
"window_recovery.save" = "حفظ تخطيط النوافذ";
"window_recovery.ignored_apps" = "التطبيقات المتجاهلة";
"window_recovery.search_apps" = "البحث عن التطبيقات";
"window_recovery.ignored_apps_description" = "فعّل تطبيقاً لاستبعاده من اللقطات المستقبلية.";
Expand All @@ -178,4 +182,4 @@
"window_layout.rename_title" = "إعادة تسمية تخطيط النوافذ";
"window_layout.name_placeholder" = "أدخل اسم تخطيط النوافذ";
"window_recovery.enable_in_settings" = "فعّل استعادة النوافذ أولاً من الإعدادات.";
"window_recovery.save_help" = "حفظ مواضع النوافذ الحالية.";
"window_recovery.save_help" = "حفظ مواضع النوافذ وأحجامها الحالية.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/de.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
/* Einstellungen - Allgemein */
"settings.app_behavior" = "App-Verhalten";
"settings.language" = "Sprache";
"settings.theme" = "Design";
"theme.system" = "Systemeinstellung";
"theme.light" = "Hell";
"theme.dark" = "Dunkel";
"settings.show_menubar_icon" = "Symbol in Menüleiste anzeigen";
"settings.launch_at_login" = "Bei Anmeldung starten";
"settings.permissions" = "Berechtigungen";
Expand Down Expand Up @@ -159,7 +163,7 @@
"window_recovery.remember_before_sleep" = "Fenster vor Ruhezustand oder Sperren merken";
"window_recovery.automatic" = "Nach dem Aufwachen der Displays automatisch wiederherstellen";
"window_recovery.behavior" = "Wiederherstellung nach Ruhezustand";
"window_recovery.save" = "Aktuelles Layout sichern";
"window_recovery.save" = "Fensterlayout speichern";
"window_recovery.ignored_apps" = "Ignorierte Apps";
"window_recovery.search_apps" = "Apps suchen";
"window_recovery.ignored_apps_description" = "Aktivieren Sie eine App, um sie aus zukünftigen Schnappschüssen auszuschließen.";
Expand All @@ -176,4 +180,4 @@
"window_layout.rename_title" = "Fensterlayout umbenennen";
"window_layout.name_placeholder" = "Name des Fensterlayouts eingeben";
"window_recovery.enable_in_settings" = "Aktiviere zuerst die Fensterwiederherstellung in den Einstellungen.";
"window_recovery.save_help" = "Aktuelle Fensterpositionen speichern.";
"window_recovery.save_help" = "Aktuelle Fensterpositionen und -größen speichern.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
/* Settings - General */
"settings.app_behavior" = "App Behavior";
"settings.language" = "Language";
"settings.theme" = "Theme";
"theme.system" = "Follow System";
"theme.light" = "Light";
"theme.dark" = "Dark";
"settings.show_menubar_icon" = "Show menu bar icon";
"settings.launch_at_login" = "Launch at login";
"settings.permissions" = "Permissions";
Expand Down Expand Up @@ -159,7 +163,7 @@
"window_recovery.remember_before_sleep" = "Remember windows before sleep or lock";
"window_recovery.automatic" = "Restore automatically after displays wake";
"window_recovery.behavior" = "Wake Recovery";
"window_recovery.save" = "Save Current Layout";
"window_recovery.save" = "Save Window Layout";
"window_recovery.ignored_apps" = "Ignored Applications";
"window_recovery.search_apps" = "Search applications";
"window_recovery.ignored_apps_description" = "Turn on an app to exclude it from future snapshots.";
Expand All @@ -176,4 +180,4 @@
"window_layout.rename_title" = "Rename Window Layout";
"window_layout.name_placeholder" = "Enter window layout name";
"window_recovery.enable_in_settings" = "Enable Window Recovery in Settings first.";
"window_recovery.save_help" = "Save the current window positions.";
"window_recovery.save_help" = "Save the current window positions and sizes.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/es.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
/* Ajustes - General */
"settings.app_behavior" = "Comportamiento de la app";
"settings.language" = "Idioma";
"settings.theme" = "Tema";
"theme.system" = "Seguir el sistema";
"theme.light" = "Claro";
"theme.dark" = "Oscuro";
"settings.show_menubar_icon" = "Mostrar icono en la barra de menús";
"settings.launch_at_login" = "Iniciar al arrancar";
"settings.permissions" = "Permisos";
Expand Down Expand Up @@ -159,7 +163,7 @@
"window_recovery.remember_before_sleep" = "Recordar ventanas antes del reposo o bloqueo";
"window_recovery.automatic" = "Restaurar automáticamente al activarse las pantallas";
"window_recovery.behavior" = "Recuperación al despertar";
"window_recovery.save" = "Guardar diseño actual";
"window_recovery.save" = "Guardar diseño de ventanas";
"window_recovery.ignored_apps" = "Aplicaciones ignoradas";
"window_recovery.search_apps" = "Buscar aplicaciones";
"window_recovery.ignored_apps_description" = "Activa una aplicación para excluirla de futuras instantáneas.";
Expand All @@ -176,4 +180,4 @@
"window_layout.rename_title" = "Renombrar disposición de ventanas";
"window_layout.name_placeholder" = "Introduce el nombre de la disposición";
"window_recovery.enable_in_settings" = "Activa primero la restauración de ventanas en Ajustes.";
"window_recovery.save_help" = "Guarda las posiciones actuales de las ventanas.";
"window_recovery.save_help" = "Guarda las posiciones y tamaños actuales de las ventanas.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/fr.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
/* Réglages - Général */
"settings.app_behavior" = "Comportement de l'app";
"settings.language" = "Langue";
"settings.theme" = "Thème";
"theme.system" = "Suivre le système";
"theme.light" = "Clair";
"theme.dark" = "Sombre";
"settings.show_menubar_icon" = "Afficher l'icône dans la barre des menus";
"settings.launch_at_login" = "Lancer au démarrage";
"settings.permissions" = "Autorisations";
Expand Down Expand Up @@ -159,7 +163,7 @@
"window_recovery.remember_before_sleep" = "Mémoriser les fenêtres avant la veille ou le verrouillage";
"window_recovery.automatic" = "Restaurer automatiquement au réveil des écrans";
"window_recovery.behavior" = "Récupération au réveil";
"window_recovery.save" = "Enregistrer la disposition actuelle";
"window_recovery.save" = "Enregistrer la disposition des fenêtres";
"window_recovery.ignored_apps" = "Applications ignorées";
"window_recovery.search_apps" = "Rechercher des applications";
"window_recovery.ignored_apps_description" = "Activez une application pour l’exclure des prochains instantanés.";
Expand All @@ -176,4 +180,4 @@
"window_layout.rename_title" = "Renommer la disposition des fenêtres";
"window_layout.name_placeholder" = "Saisissez le nom de la disposition";
"window_recovery.enable_in_settings" = "Activez d’abord la restauration des fenêtres dans Réglages.";
"window_recovery.save_help" = "Enregistrer les positions actuelles des fenêtres.";
"window_recovery.save_help" = "Enregistrer les positions et tailles actuelles des fenêtres.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/hi.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@
/* सेटिंग्स - सामान्य */
"settings.app_behavior" = "ऐप व्यवहार";
"settings.language" = "भाषा";
"settings.theme" = "थीम";
"theme.system" = "सिस्टम के अनुसार";
"theme.light" = "हल्की";
"theme.dark" = "गहरी";
"settings.show_menubar_icon" = "मेनू बार में आइकन दिखाएं";
"settings.launch_at_login" = "लॉगिन पर लॉन्च करें";
"settings.permissions" = "अनुमतियां";
Expand Down Expand Up @@ -161,7 +165,7 @@
"window_recovery.remember_before_sleep" = "स्लीप या लॉक से पहले विंडो याद रखें";
"window_recovery.automatic" = "डिस्प्ले जागने के बाद अपने आप पुनर्स्थापित करें";
"window_recovery.behavior" = "जागने पर पुनर्प्राप्ति";
"window_recovery.save" = "वर्तमान लेआउट सहेजें";
"window_recovery.save" = "विंडो लेआउट सहेजें";
"window_recovery.ignored_apps" = "अनदेखे ऐप";
"window_recovery.search_apps" = "ऐप खोजें";
"window_recovery.ignored_apps_description" = "किसी ऐप को भविष्य के स्नैपशॉट से बाहर रखने के लिए उसे चालू करें।";
Expand All @@ -178,4 +182,4 @@
"window_layout.rename_title" = "विंडो लेआउट का नाम बदलें";
"window_layout.name_placeholder" = "विंडो लेआउट नाम दर्ज करें";
"window_recovery.enable_in_settings" = "पहले सेटिंग्स में विंडो रिकवरी चालू करें।";
"window_recovery.save_help" = "मौजूदा विंडो स्थितियाँ सहेजें।";
"window_recovery.save_help" = "मौजूदा विंडो की स्थितियाँ और आकार सहेजें।";
8 changes: 6 additions & 2 deletions MousePortal/Resources/id.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@
/* Pengaturan - Umum */
"settings.app_behavior" = "Perilaku Aplikasi";
"settings.language" = "Bahasa";
"settings.theme" = "Tema";
"theme.system" = "Ikuti sistem";
"theme.light" = "Terang";
"theme.dark" = "Gelap";
"settings.show_menubar_icon" = "Tampilkan ikon di bilah menu";
"settings.launch_at_login" = "Jalankan saat login";
"settings.permissions" = "Izin";
Expand Down Expand Up @@ -161,7 +165,7 @@
"window_recovery.remember_before_sleep" = "Ingat jendela sebelum tidur atau terkunci";
"window_recovery.automatic" = "Pulihkan otomatis setelah layar aktif";
"window_recovery.behavior" = "Pemulihan setelah aktif";
"window_recovery.save" = "Simpan tata letak saat ini";
"window_recovery.save" = "Simpan tata letak jendela";
"window_recovery.ignored_apps" = "Aplikasi yang diabaikan";
"window_recovery.search_apps" = "Cari aplikasi";
"window_recovery.ignored_apps_description" = "Aktifkan aplikasi untuk mengecualikannya dari cuplikan berikutnya.";
Expand All @@ -178,4 +182,4 @@
"window_layout.rename_title" = "Ubah nama tata letak jendela";
"window_layout.name_placeholder" = "Masukkan nama tata letak jendela";
"window_recovery.enable_in_settings" = "Aktifkan Pemulihan Jendela di Pengaturan terlebih dahulu.";
"window_recovery.save_help" = "Simpan posisi jendela saat ini.";
"window_recovery.save_help" = "Simpan posisi dan ukuran jendela saat ini.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/it.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@
/* Impostazioni - Generali */
"settings.app_behavior" = "Comportamento app";
"settings.language" = "Lingua";
"settings.theme" = "Tema";
"theme.system" = "Segui il sistema";
"theme.light" = "Chiaro";
"theme.dark" = "Scuro";
"settings.show_menubar_icon" = "Mostra icona nella barra dei menu";
"settings.launch_at_login" = "Avvia al login";
"settings.permissions" = "Permessi";
Expand Down Expand Up @@ -161,7 +165,7 @@
"window_recovery.remember_before_sleep" = "Ricorda le finestre prima dello stop o del blocco";
"window_recovery.automatic" = "Ripristina automaticamente al riavvio degli schermi";
"window_recovery.behavior" = "Ripristino al riavvio";
"window_recovery.save" = "Salva disposizione attuale";
"window_recovery.save" = "Salva layout finestre";
"window_recovery.ignored_apps" = "App ignorate";
"window_recovery.search_apps" = "Cerca app";
"window_recovery.ignored_apps_description" = "Attiva un’app per escluderla dalle istantanee future.";
Expand All @@ -178,4 +182,4 @@
"window_layout.rename_title" = "Rinomina disposizione finestre";
"window_layout.name_placeholder" = "Inserisci il nome della disposizione";
"window_recovery.enable_in_settings" = "Abilita prima il ripristino finestre nelle Impostazioni.";
"window_recovery.save_help" = "Salva le posizioni attuali delle finestre.";
"window_recovery.save_help" = "Salva le posizioni e le dimensioni attuali delle finestre.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/ja.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
/* 設定 - 一般 */
"settings.app_behavior" = "アプリの動作";
"settings.language" = "言語";
"settings.theme" = "テーマ";
"theme.system" = "システム設定に従う";
"theme.light" = "ライト";
"theme.dark" = "ダーク";
"settings.show_menubar_icon" = "メニューバーにアイコンを表示";
"settings.launch_at_login" = "ログイン時に起動";
"settings.permissions" = "権限";
Expand Down Expand Up @@ -159,7 +163,7 @@
"window_recovery.remember_before_sleep" = "スリープまたはロック前にウインドウを記憶";
"window_recovery.automatic" = "ディスプレイ復帰後に自動復元";
"window_recovery.behavior" = "スリープ解除時の復元";
"window_recovery.save" = "現在の配置を保存";
"window_recovery.save" = "ウインドウ配置を保存";
"window_recovery.ignored_apps" = "除外するアプリ";
"window_recovery.search_apps" = "アプリを検索";
"window_recovery.ignored_apps_description" = "オンにしたアプリは今後のスナップショットから除外されます。";
Expand All @@ -176,4 +180,4 @@
"window_layout.rename_title" = "ウインドウ配置の名前を変更";
"window_layout.name_placeholder" = "ウインドウ配置名を入力";
"window_recovery.enable_in_settings" = "先に設定でウインドウ復元を有効にしてください。";
"window_recovery.save_help" = "現在のウインドウ位置を保存します。";
"window_recovery.save_help" = "現在のウインドウの位置とサイズを保存します。";
8 changes: 6 additions & 2 deletions MousePortal/Resources/ko.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
/* 설정 - 일반 */
"settings.app_behavior" = "앱 동작";
"settings.language" = "언어";
"settings.theme" = "테마";
"theme.system" = "시스템 설정 따르기";
"theme.light" = "라이트";
"theme.dark" = "다크";
"settings.show_menubar_icon" = "메뉴 막대에 아이콘 표시";
"settings.launch_at_login" = "로그인 시 시작";
"settings.permissions" = "권한";
Expand Down Expand Up @@ -159,7 +163,7 @@
"window_recovery.remember_before_sleep" = "잠자기 또는 잠금 전에 윈도우 기억";
"window_recovery.automatic" = "디스플레이가 깨어난 후 자동 복원";
"window_recovery.behavior" = "깨우기 복구";
"window_recovery.save" = "현재 레이아웃 저장";
"window_recovery.save" = "창 레이아웃 저장";
"window_recovery.ignored_apps" = "무시할 앱";
"window_recovery.search_apps" = "앱 검색";
"window_recovery.ignored_apps_description" = "앱을 켜면 이후 스냅샷에서 제외됩니다.";
Expand All @@ -176,4 +180,4 @@
"window_layout.rename_title" = "윈도우 배치 이름 변경";
"window_layout.name_placeholder" = "윈도우 배치 이름 입력";
"window_recovery.enable_in_settings" = "먼저 설정에서 윈도우 복원을 켜세요.";
"window_recovery.save_help" = "현재 윈도우 위치를 저장합니다.";
"window_recovery.save_help" = "현재 창의 위치와 크기를 저장합니다.";
8 changes: 6 additions & 2 deletions MousePortal/Resources/ms.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@
/* Tetapan - Umum */
"settings.app_behavior" = "Tingkah Laku Aplikasi";
"settings.language" = "Bahasa";
"settings.theme" = "Tema";
"theme.system" = "Ikut sistem";
"theme.light" = "Cerah";
"theme.dark" = "Gelap";
"settings.show_menubar_icon" = "Tunjukkan ikon di bar menu";
"settings.launch_at_login" = "Lancar semasa log masuk";
"settings.permissions" = "Kebenaran";
Expand Down Expand Up @@ -161,7 +165,7 @@
"window_recovery.remember_before_sleep" = "Ingat tetingkap sebelum tidur atau dikunci";
"window_recovery.automatic" = "Pulihkan secara automatik selepas paparan bangun";
"window_recovery.behavior" = "Pemulihan selepas bangun";
"window_recovery.save" = "Simpan susun atur semasa";
"window_recovery.save" = "Simpan susun atur tetingkap";
"window_recovery.ignored_apps" = "Aplikasi diabaikan";
"window_recovery.search_apps" = "Cari aplikasi";
"window_recovery.ignored_apps_description" = "Hidupkan aplikasi untuk mengecualikannya daripada petikan akan datang.";
Expand All @@ -178,4 +182,4 @@
"window_layout.rename_title" = "Namakan semula susun atur tetingkap";
"window_layout.name_placeholder" = "Masukkan nama susun atur tetingkap";
"window_recovery.enable_in_settings" = "Hidupkan Pemulihan Tetingkap dalam Tetapan dahulu.";
"window_recovery.save_help" = "Simpan kedudukan tetingkap semasa.";
"window_recovery.save_help" = "Simpan kedudukan dan saiz tetingkap semasa.";
Loading
Loading