Releases: rgdevment/CopyPaste
v2.2.6
Standalone:
- Skip registry write if exe does not exist on disk
- Skip registry write when running from a Flutter build folder (\build\windows)
- Auto-remove stale HKCU...\Run entry in both cases
MSIX:
- Remove any leftover HKCU...\Run entry from previous standalone installs on launch
- Replace openWindowsStartupSettings workaround with real WinRT StartupTask API
- Add C++ MethodChannel (copypaste/startup_task) via cppwinrt for getState / enable / disable
- Handle DisabledByUser state by surfacing ms-settings:startupapps as fallback
Tests:
- MsixStartupTask: state parsing, method dispatch, taskId forwarding, PlatformException handling
- StartupHelper: isDevBuildPath edge cases, MSIX channel interaction
Full Changelog: v2.2.5...v2.2.6
v2.2.5
-
Replaced the fragile compile-time
STORE_BUILDflag with a runtime FFI call to
GetCurrentPackageFullName(kernel32). The app now detects at startup whether it
is running as an MSIX (Microsoft Store) package or a standalone installer. -
Bootstrap log now includes the install type, full package name, resolved data path
and acrylic status:msix=true|false, package=..., base=..., acrylicInit=... -
Added
WinKnownFolders.localAppData()- resolves%LOCALAPPDATA%via
SHGetKnownFolderPath(shell32) instead of reading the environment variable.
Works correctly in edge cases where the env var is absent (services, scheduled tasks). -
StorageConfig.create()now accepts awindowsLocalAppDataResolverparameter so
the resolution strategy is fully injectable and testable. -
Removed the PowerShell-based StartupTask registration (~1.5 s overhead, AV friction).
-
MSIX builds now declare the startup task in the manifest (Enabled="true") and, when
the user toggles the setting in-app, openms-settings:startupappsvia
explorer.exeso Windows handles enablement - consistent with Microsoft's 2026
Store guidelines. -
Fixed a critical issue where new installs on Windows started with the main window
hidden. Users who installed via the Microsoft Store and clicked the app icon saw
nothing because the window remained hidden during the entire initialisation sequence. -
showOnStartnow includes Windows for first-run and onboarding scenarios. -
Gate-mode window (
enterGateMode) now setsskipTaskbar=falseso the onboarding
window is always reachable via the taskbar and Alt+Tab even if tray init fails. -
New
CrashLoggerservice writes a persistentcrash.logto the app data folder
on every unhandled error or startup failure, even beforeAppLoggeris ready. -
Log entries include: UTC timestamp, OS name/version, Dart version, context label,
error message and stack trace. -
Automatic PII redaction at write time: USERPROFILE/HOME path, username
segments (\Users<user>, /Users/, /home/) and email addresses
are replaced with , and before anything is written. -
File is capped at 512 KB; older content is cleared automatically when the limit
is reached. -
main() is now wrapped in runZonedGuarded + FlutterError.onError +
PlatformDispatcher.onError, all routing to CrashLogger.report. -
A 10-second watchdog timer in _initShell() calls _forceVisibleFallback() if
shell initialisation hangs, making the app window visible as a recovery path. -
exportLogs now bundles crash.log (if present) inside the exported zip.
-
All log and crash file content is passed through CrashLogger.redact before being
added to the archive - submitted reports contain no usernames, home paths or emails. -
PRIVACY.md updated: new Crash Log section, crash.log added to all per-platform
storage tables, export section reflects redaction, "Does NOT do" list updated. -
README.md updated: export description and bug-reporting guide mention crash.log
and automatic PII redaction. -
New crash_logger_test.dart - 35 tests covering initialize, report, file rotation,
overridePath, redaction (HOME, username, email, no false-positives). -
support_service_test.dart - 7 new tests: crash.log included/excluded in zip,
count excludes crash.log, redaction applied to logs and crash.log, non-sensitive
content preserved. -
storage_config_test.dart - 2 new tests: resolver used on Windows, ignored on
other platforms. -
Additional tests for search functionality and backup restoration callbacks.
Full Changelog: v2.2.4...v2.2.5
v2.2.4
-
Fix invisible window on Windows 10 / Intel GPU: added timeout + fallback to
waitUntilReadyToShow, Window.initialize(), and Window.setEffect() so the app
always shows even when Impeller stalls or Mica is unavailable -
Windows update badge: GitHub Releases check now runs on all platforms
(previously skipped on Windows standalone — badge never appeared) -
Windows startup: MSIX build now uses the native Windows StartupTask API
instead of the registry, no admin rights required; standalone installer
unchanged -
Diagnostic logs added throughout the window init pipeline (platform, version,
acrylic init status, each init step) to simplify future bug reports -
Linux package smoke test: skip libdartjni.so (Android JNI bridge pulled
transitively — not loaded on Linux, was causing false failures) -
Markdown linting: scope changed to project-owned files only, ignoring
build artifacts and third-party plugin changelogs -
README: added download badges for Windows, macOS and Linux; SEO and
formatting improvements; new 'Other Tools' section linking to LinkUnbound -
PRIVACY.md / SECURITY.md: fixed table formatting
-
CODE_OF_CONDUCT.md: fixed heading punctuation
What's Changed
- feat: Implement MSIX startup task for Windows and update installer co… by @rgdevment in #38
- refactor: Enhance window initialization and logging in AppWindow class by @rgdevment in #39
Full Changelog: v2.2.3...v2.2.4
v2.2.3
-
Fix Windows single-instance enforcement: second instances no longer spawn duplicate windows
- Replace unreliable GetLastError() with WaitForSingleObject() for mutex ownership detection
- Change mutex name from Global\ to Local\ for compatibility with MSIX (Microsoft Store) packaging
- Add native C++ guard in main.cpp using OpenMutexW before Flutter window creation, so no window flash occurs on duplicate launch
-
Windows: re-launching the app while already running now shows the onboarding screen (centered, focused) instead of a small popup near the cursor, making it impossible for basic users to miss
-
Wayland: improve unsupported session messages and dark mode detection on Linux
-
Linux: improve window focus handling and Wayland session detection
-
Remove unused setting
-
Reorganize FFI typedefs in single_instance.dart; remove dead getLastError binding from _Win32 singleton
-
Expand test coverage: AutoUpdateService, WindowFocusManager, Linux session, focus manager, single-instance mutex
-
Refactor Wayland session and startup helper tests for clarity
What's Changed
- feat: Update Wayland unsupported messages by @rgdevment in #37
Full Changelog: v2.2.2...v2.2.3
v2.2.2
-
fix: tray icon setting is now Windows-only — on macOS and Linux the tray icon always shows and the toggle no longer appears in Settings
-
fix: default showTrayIcon=true ensures all users (including those upgrading from older versions without this config) always start with tray mode
-
fix(ci): update script paths for linux-package-smoke.sh (moved to resources/scripts/)
-
chore: update README screenshots with v2 assets
Full Changelog: v2.2.1...v2.2.2
v2.2.1
- New onboarding screen shown on first launch for Windows users, guiding them through
the hotkey, tray icon, and background operation. - Default hotkey changed from Ctrl+Alt+V to Ctrl+Shift+V to avoid conflicts with
common system shortcuts on Windows. - Wakeup via named pipe: when a second instance is launched, the running instance
is brought to the foreground instead of opening a duplicate window. - Version-aware onboarding: the screen is shown once per install and correctly
suppressed on subsequent launches and after updates. - Improved Windows balloon notification copy.
- Wayland is now officially unsupported (X11 only). When CopyPaste is launched on a
Wayland session, a clear on-brand gate screen is shown explaining the limitation and
linking to the GitHub repo. The app does not attempt to run. - Autostart blocked on Wayland: the .desktop autostart entry is never created (and
any existing one is removed) when a Wayland session is detected. - Fixed: spurious OS notification ("CopyPaste esta preparado") appearing on the first
hotkey press. Caused by a missing gdk_notify_startup_complete() call in the GTK
application activate handler. - Fixed: Settings window not resizing correctly on Linux. Added GTK event-loop flush
delays around setResizable and geometry constraint calls to prevent race conditions
with the compositor. - Improved paste focus restoration: the _NET_ACTIVE_WINDOW message now uses source=2
(pager) instead of source=1 (application), which bypasses focus-stealing prevention
on KDE Plasma and some GNOME configurations. Added XRaiseWindow and a fallback
XSetInputFocus with X11 error trapping. - X11 atom caching: _NET_ACTIVE_WINDOW and _NET_WM_PID atoms are now interned once per
process instead of on every clipboard poll, reducing unnecessary round-trips to the
X server. - XTest extension check: XTestQueryExtension() is called once at startup; if the
extension is unavailable a warning is logged and paste simulation is disabled cleanly
instead of crashing. - Fixed potential memory leak in activateAndPaste: the return value of g_timeout_add()
is now checked; if registration fails the method call reference is released and paste
falls through immediately. - Cleaner hotkey registration errors: failure paths in registerHotkey now emit g_warning
messages (unsupported key, no modifiers, missing keycode, XGrabKey conflict), making
debugging on unusual desktop environments significantly easier. - XSync before XGetWindowAttributes: flushes pending X requests before reading window
attributes during hotkey registration, preventing stale-state reads. - Clipboard type constants: replaced magic numbers 0-6 throughout the Linux native code
with named #define constants (CLIP_TYPE_TEXT, CLIP_TYPE_IMAGE, etc.), matching the
Dart ClipboardDataType enum. - Removed all dead Wayland compatibility code (_waylandMode field, setWaylandMode()
method, all related guards).
- ClipboardService now handles unsupported or corrupt image formats gracefully instead
of throwing an unhandled exception. - StorageConfig: improved directory resolution logic for cross-platform consistency.
- CleanupService: orphan file detection is now more accurate — avoids incorrectly
deleting files that are referenced but whose records are in a different state. - ImageProcessor: improved file-existence checks and error handling paths.
- BackupService: minor directory management fixes to prevent failures on first run
when the backup directory does not yet exist.
A large batch of new tests was added across the codebase:
- TextClassifier edge cases: multiline input, all email/UUID/IP/color/JSON/phone
patterns, boundary conditions. - ClipboardService reclassification: ensures legacy plain-text items are correctly
re-typed as email, UUID, IP, color, JSON, phone, link on load. - Repository search integration: FTS5 full-text search and LIKE fallback paths,
combined filters, empty queries, special characters. - BackupService integration: full backup/restore cycle, directory creation, file integrity.
- ClipboardEvent platform parsing: all content types, malformed payloads, missing fields.
- Linux: isWaylandSession() — idempotency, non-Linux platforms, GDK_BACKEND=x11
override, headless/CI environment. - Linux: WaylandUnsupportedScreen — title, badge, body text, both buttons, callback,
dark mode, Spanish locale. - Linux: StartupHelper Wayland skip — verifies no .desktop file is created on Wayland
and that stale entries are removed. - Windows: WindowsOnboardingScreen — full widget coverage including locale, dark mode,
button callbacks. - Windows: SingleInstance — wakeup file handling, named pipe signalling, debounce logic.
- README updated with Linux beta notice, Wayland limitation explanation, and clearer
getting-started instructions. - Fixed broken Table of Contents anchor link in README.
- PRIVACY.md refreshed.
What's Changed
- Fix: windows instances by @rgdevment in #35
- feat: Update README and implement Wayland support checks in Linux cli… by @rgdevment in #36
Full Changelog: v2.2.0...v2.2.1
v2.2.0
-
Balloon notifications now display the app icon instead of the generic blue info icon (fixed FFI struct offsets for
NOTIFYICONDATAW+ExtractIconW) -
Startup and wakeup balloons are now localized (EN/ES)
-
Balloon messages correctly reflect the configured hotkey
-
Show in taskbarsetting now defaults to off for all users -
When taskbar mode is active, only a native taskbar click (or Escape) hides the window — hotkey and tray icon are unaffected
-
In-app hint (snackbar) is shown only when opening via the taskbar button, not via hotkey or tray
-
Fixed: pasting an item no longer leaves the window visible in taskbar mode
-
Update notifications are now enabled for Store builds — shows a Store-appropriate message with no GitHub links or Homebrew instructions
-
Store builds skip the Squirrel/WinSparkle updater and use the GitHub release API directly
-
Reset & Clean Install section moved from the About tab to the General tab
-
Snackbar hints are dismissed when the window is minimized and suppressed when Settings is open
-
Panel width default increased to 380 px (existing users keep their saved value)
-
Added
NSAppleEventsUsageDescriptiontoInfo.plistfor Accessibility compliance -
Improved AppDelegate for accessibility permission handling
-
Windows 10/11 detection corrected in exported support logs (build ≥ 22000 → Windows 11)
-
Wakeup hint no longer stacks with existing snackbars
-
Single-instance wakeup handling improved on Windows
-
Added full test suite for
SupportService(correctWindowsVersion,exportLogs) -
Added
showInTaskbarfield coverage inAppConfigTest -
Fixed pre-existing Windows binding error in
AutoUpdateServicetests -
Coverage raised from ~78 % to ~86 % (excluding generated/l10n files)
What's Changed
- feat: Add wakeup hint and improve single instance handling for Windows by @rgdevment in #34
Full Changelog: v2.1.6...v2.2.0
v2.1.6
What's new since v2.1.5:
- New: Enhanced support and reset features for CopyPaste, improving usability and reliability.
- New: Added support for new clipboard content types (email, phone, color, etc.).
- Improved: Updated localization files and user interface for a better experience.
- Improved: Major updates to the settings screen and main window.
- Improved: Better compatibility with macOS, including workflow and build improvements.
- Improved: Updated dependencies for improved stability and compatibility.
- Fixed: Various bug fixes and code refactoring for improved performance and maintainability.
This release includes many enhancements, new features, and bug fixes across the app, core, and workflows. For a full list of changes, see the project history.
What's Changed
- feat: add support for new clipboard content types (email, phone, colo… by @rgdevment in #32
- feat: Enhance support and reset features in CopyPaste by @rgdevment in #33
Full Changelog: v2.1.5...v2.1.6
v2.1.5
- Enhance Wayland support and update tray icon handling for Linux
- Improve error handling and cleanup in various services and screens
- Enhance Linux shell cleanup and improve clipboard event handling
- Fix Microsoft Store CLI publish job: migrate from ubuntu-latest to windows-latest to resolve libsecret dependency error
What's Changed
- fix: enhance Wayland support and update tray icon handling for Linux by @rgdevment in #30
Full Changelog: v2.1.4...v2.1.5
v2.1.4
- Improve clipboard UI refresh: add debounce on reload and force-reload logic to prevent stale list after app update without restart (macOS/Linux/Windows)
- Windows listener: replace redundant kWmClipboardUpdate with standard WM_CLIPBOARDUPDATE
- Windows listener: fix IsUrl to only lowercase first 9 chars instead of full string copy (avoids MB-scale allocations on large clipboard content)
- Windows listener: fix SetTextToClipboard to return false on encoding failure instead of writing empty string to clipboard
- Windows listener: ShouldExclude now reads 4 bytes directly via GlobalLock instead of copying full clipboard format into vector
- Windows listener: DetectFileType uses unordered_map for O(1) extension lookup instead of O(log n) map
- Fix Microsoft OAuth token endpoint URL and change resource to scope parameter
- Fix GitHub token handling and improve error reporting for asset downloads
What's Changed
- fix: add GitHub token handling and improve error reporting for downloads by @rgdevment in #27
- fix: update Microsoft OAuth token URL and change resource to scope by @rgdevment in #28
- feat: improve clipboard handling with debounce and reload logic by @rgdevment in #29
Full Changelog: v2.1.3...v2.1.4