├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.yml │ ├── config.yml │ └── feature-request.yml └── workflows │ ├── build-entry-pr.yml │ ├── build-entry.yml │ ├── code-style.yml │ ├── codeql.yml │ ├── linux-compile.yml │ ├── linux-package.yml │ ├── linux-release.yml │ ├── mac-package.yml │ ├── mac-release.yml │ ├── prebuild.yml │ ├── release-draft.yml │ ├── release-formal.yml │ ├── server-build.yml │ ├── server-release.yml │ ├── win-build.yml │ └── win-release.yml ├── .gitignore ├── Changes.md ├── LICENSE ├── LICENSES ├── .NETCommunityToolkit │ └── License.md ├── Avalonia │ └── licence.md ├── DotNetZip.Semverd │ ├── LICENSE.txt │ └── NOTICE.txt ├── FluentAvalonia.BreadcrumbBar │ └── LICENSE.txt ├── FluentAvalonia │ └── LICENSE.txt ├── H.NotifyIcon │ └── LICENSE.md ├── Magick.NET │ └── License.txt ├── SharpHook │ └── LICENSE.txt ├── Tmds.DBus │ └── LICENSE.txt ├── Vanara │ └── LICENSE.txt ├── WinUIEx │ └── LICENSE.txt └── moq │ └── License.txt ├── PreRelease.bat ├── README.md ├── build ├── ReadDesktopChanges.bat ├── ReadDesktopChanges.sh ├── appveyor │ ├── AppVeyor.bat │ └── appveyor.yml ├── linux │ ├── PostPublish.sh │ ├── app.desktop │ ├── icons │ │ └── icon.svg │ ├── linux.pupnet.conf │ └── package.sh └── macos │ ├── Info.plist │ ├── VolumeIcon.icns │ ├── buildAppBundle.sh │ ├── dmg-background.png │ ├── dmg-background.tiff │ ├── icon.icns │ └── icon_512x512.psd ├── docs ├── README_EN.md └── image │ ├── WinUI.png │ ├── WinUI_EN.png │ ├── android1.jpg │ ├── android1_EN.jpg │ ├── android2.jpg │ ├── android2_EN.jpg │ ├── android3.jpg │ └── android3_EN.jpg ├── script ├── Clipboard.js ├── HTTP Shortcuts │ └── BeforeUpload.js ├── SyncAutoxJs.js ├── UploadVerificationCode.js ├── en │ ├── shortcuts.json │ └── shortcuts.zip ├── shortcuts.json └── shortcuts.zip └── src ├── .editorconfig ├── .vscode ├── launch.json └── tasks.json ├── Directory.Packages.props ├── SyncClipboard.Abstract ├── ClipboardProfileDTO.cs ├── IClipboardImage.cs ├── IClipboardMoniter.cs ├── IProfileDtoHelper.cs ├── Notification │ ├── Button.cs │ ├── CallbackHandler.cs │ ├── INotification.cs │ ├── INotificationSession.cs │ ├── IProgressBar.cs │ ├── NotificationPara.cs │ └── NotificationSessionBase.cs ├── ProfileType.cs ├── ServerPara.cs └── SyncClipboard.Abstract.csproj ├── SyncClipboard.Core ├── AbstractClasses │ ├── ContextMenuBase.cs │ └── TrayIconBase.cs ├── AppCore.cs ├── Clipboard │ ├── ClipboardChangingListenerBase.cs │ ├── ClipboardFactoryBase.cs │ ├── ClipboardHtmlBuilder.cs │ ├── ClipboardImageBuilder.cs │ ├── IClipboardFactory.cs │ ├── IClipboardSetter.cs │ ├── LocalClipboard.cs │ └── Profile │ │ ├── FileProfile.cs │ │ ├── GroupProfile.cs │ │ ├── ImageProfile.cs │ │ ├── Profile.cs │ │ ├── TextProfile.cs │ │ └── UnknownProfile.cs ├── Commons │ ├── ConfigBase.cs │ ├── ConfigManager.cs │ ├── Env.cs │ ├── Event.cs │ ├── HotkeyManager.cs │ ├── ProgramEvent.cs │ ├── RuntimeConfig.cs │ ├── ServiceManager.cs │ ├── StartArguments.cs │ └── StaticConfig.cs ├── I18n │ ├── I18nHelper.cs │ ├── Strings.Designer.cs │ ├── Strings.resx │ └── Strings.zh-CN.resx ├── Interfaces │ ├── IAppConfig.cs │ ├── IClipboardChangingListener.cs │ ├── IContextMenu.cs │ ├── IFontManager.cs │ ├── IHttp.cs │ ├── IMainWindow.cs │ ├── INativeHotkeyRegistry.cs │ ├── IService.cs │ ├── IThreadDispatcher.cs │ ├── ITrayIcon.cs │ ├── IWebDav.cs │ └── Ilogger.cs ├── Models │ ├── ClipboardMetaInfomation.cs │ ├── DragDropEffects.cs │ ├── EmptyMessage.cs │ ├── HttpDownloadProgress.cs │ ├── Keyboard │ │ ├── Hotkey.cs │ │ ├── HotkeyStatus.cs │ │ └── Key.cs │ ├── LanguageModel.cs │ ├── LocaleString.cs │ ├── OpenSourceSoftware.cs │ ├── UniqueCommand.cs │ ├── UniqueCommandCollection.cs │ ├── UserConfigs │ │ ├── ClipboardAssistConfig.cs │ │ ├── ClipboardFactoryConfig.cs │ │ ├── ConfigKey.cs │ │ ├── EnvConfig.cs │ │ ├── FileFilterConfig.cs │ │ ├── HotkeyConfig.cs │ │ ├── MainWindowConfig.cs │ │ ├── ProgramConfig.cs │ │ ├── ServerConfig.cs │ │ └── SyncConfig.cs │ ├── WebDavCredential.cs │ └── WebDavNode.cs ├── Options │ ├── LoggerOption.cs │ └── UserConfigOption.cs ├── SyncClipboard.Core.csproj ├── UserServices │ ├── ClipboardService │ │ ├── ClipboardHander.cs │ │ ├── ConvertService.cs │ │ └── EasyCopyImageSerivce.cs │ ├── ServerService │ │ └── ServerService.cs │ └── SyncService │ │ ├── DownloadService.cs │ │ ├── ProgressToastReporter.cs │ │ ├── SyncService.cs │ │ └── UploadService.cs ├── Utilities │ ├── AppInstance.cs │ ├── Attributes │ │ └── PlatformStringAttribute.cs │ ├── ClipboardImage.cs │ ├── Counter.cs │ ├── DelegateExtention.cs │ ├── EnumExtention.cs │ ├── Fake │ │ ├── FakeFactory.cs │ │ ├── FakeNotification.cs │ │ └── FakeProgressBar.cs │ ├── IEnumerableExtention.cs │ ├── Image │ │ └── ImageHelper.cs │ ├── JsonStringEnumConverterEx.cs │ ├── KeyCodeMap.cs │ ├── Logger.cs │ ├── MessageDispatcher.cs │ ├── NextcloudLogInFlow.cs │ ├── Runner │ │ └── FreshableTask.cs │ ├── ScopeGuard.cs │ ├── StartUpHelper.cs │ ├── Sys.cs │ ├── Updater │ │ ├── AppVersion.cs │ │ ├── GitHubRelease.cs │ │ └── GithubUpdater.cs │ └── Web │ │ ├── Http.cs │ │ ├── HttpClientExtention.cs │ │ ├── HttpClientFactory.cs │ │ ├── WebDav.cs │ │ ├── WebDavBase.cs │ │ └── WebDavClient.cs └── ViewModels │ ├── AboutViewModel.cs │ ├── CliboardAssistantViewModel.cs │ ├── Converter.cs │ ├── FileSyncFilterSettingViewModel.cs │ ├── HotkeyViewModel.cs │ ├── LicenseViewModel.cs │ ├── MainViewModel.cs │ ├── NextCloudLogInViewModel.cs │ ├── PageDefinition.cs │ ├── ServiceStatusViewModel.cs │ ├── Sub │ └── ServiceStatus.cs │ ├── SyncSettingViewModel.cs │ └── SystemSettingViewModel.cs ├── SyncClipboard.Desktop.Default ├── AppServices.cs ├── Assets │ ├── default.png │ ├── download001.png │ ├── download002.png │ ├── download003.png │ ├── download004.png │ ├── download005.png │ ├── download006.png │ ├── download007.png │ ├── download008.png │ ├── download009.png │ ├── download010.png │ ├── download011.png │ ├── download012.png │ ├── download013.png │ ├── download014.png │ ├── download015.png │ ├── download016.png │ ├── download017.png │ ├── erro.png │ ├── upload001.png │ ├── upload002.png │ ├── upload003.png │ ├── upload004.png │ ├── upload005.png │ ├── upload006.png │ ├── upload007.png │ ├── upload008.png │ ├── upload009.png │ ├── upload010.png │ ├── upload011.png │ ├── upload012.png │ ├── upload013.png │ ├── upload014.png │ ├── upload015.png │ ├── upload016.png │ └── upload017.png ├── Program.cs ├── SyncClipboard.Desktop.Default.csproj ├── Utilities │ ├── IDbusNotifications.cs │ ├── Notification.cs │ └── NotificationSession.cs ├── Views │ └── TrayIconImpl.cs └── app.manifest ├── SyncClipboard.Desktop.MacOS ├── AppServices.cs ├── Assets │ ├── Light │ │ ├── default.png │ │ ├── download001.png │ │ ├── download002.png │ │ ├── download003.png │ │ ├── download004.png │ │ ├── download005.png │ │ ├── download006.png │ │ ├── download007.png │ │ ├── download008.png │ │ ├── download009.png │ │ ├── download010.png │ │ ├── download011.png │ │ ├── download012.png │ │ ├── download013.png │ │ ├── download014.png │ │ ├── download015.png │ │ ├── download016.png │ │ ├── download017.png │ │ ├── erro.png │ │ ├── upload001.png │ │ ├── upload002.png │ │ ├── upload003.png │ │ ├── upload004.png │ │ ├── upload005.png │ │ ├── upload006.png │ │ ├── upload007.png │ │ ├── upload008.png │ │ ├── upload009.png │ │ ├── upload010.png │ │ ├── upload011.png │ │ ├── upload012.png │ │ ├── upload013.png │ │ ├── upload014.png │ │ ├── upload015.png │ │ ├── upload016.png │ │ └── upload017.png │ ├── default-inactive.png │ └── erro-inactive.png ├── Program.cs ├── SyncClipboard.Desktop.MacOS.csproj ├── Utilities │ └── Notification.cs └── Views │ ├── MainWindow.axaml.cs │ └── TrayIconImpl.cs ├── SyncClipboard.Desktop ├── App.axaml ├── App.axaml.cs ├── AppConfig.cs ├── AppServices.cs ├── Assets │ ├── default-inactive.png │ ├── default.ico │ ├── erro-inactive.png │ ├── icon.ico │ ├── icon.png │ ├── icon.svg │ └── icon_white.png ├── Changes.md ├── ClipboardAva │ ├── ClipboardFactory.Linux.cs │ ├── ClipboardFactory.Macos.cs │ ├── ClipboardFactory.cs │ ├── ClipboardFormat.cs │ ├── ClipboardListener.cs │ ├── ClipboardReader │ │ ├── AvaloniaClipboardReader.cs │ │ ├── IClipboardReader.cs │ │ ├── LinuxCmdClipboardReader.cs │ │ ├── MultiSourceClipboardReader.cs │ │ ├── WlClipboardReader.cs │ │ └── XClipReader.cs │ ├── ClipboardSetterBase.cs │ ├── FileClipboardSetter.cs │ ├── ImageClipboardSetter.cs │ └── TextClipboardSetter.cs ├── Env.cs ├── SyncClipboard.Desktop.csproj ├── Utilities │ ├── FontManager.cs │ ├── Notification.cs │ └── SharpHookHotkeyRegistry.cs ├── ValueConverters │ ├── BoolToFontIcon.cs │ ├── BoolToPasswordIconConverter.cs │ └── KeyToJsonStringConverter.cs ├── ViewModels │ ├── DiagnoseDetailViewModel.cs │ └── DiagnoseViewModel.cs └── Views │ ├── .editorconfig │ ├── AboutPage.axaml │ ├── AboutPage.axaml.cs │ ├── CliboardAssistantPage.axaml │ ├── CliboardAssistantPage.axaml.cs │ ├── DiagnoseDetailPage.axaml │ ├── DiagnoseDetailPage.axaml.cs │ ├── DiagnosePage.axaml │ ├── DiagnosePage.axaml.cs │ ├── FileSyncFilterSettingPage.axaml │ ├── FileSyncFilterSettingPage.axaml.cs │ ├── HotkeyInput.axaml │ ├── HotkeyInput.axaml.cs │ ├── HotkeyPage.axaml │ ├── HotkeyPage.axaml.cs │ ├── HotkeyViewer.axaml │ ├── HotkeyViewer.axaml.cs │ ├── LicensePage.axaml │ ├── LicensePage.axaml.cs │ ├── MainView.axaml │ ├── MainView.axaml.cs │ ├── MainWindow.axaml │ ├── MainWindow.axaml.cs │ ├── NextCloudLogInPage.axaml │ ├── NextCloudLogInPage.axaml.cs │ ├── ServerSettingDialog.axaml │ ├── ServerSettingDialog.axaml.cs │ ├── ServiceStatusPage.axaml │ ├── ServiceStatusPage.axaml.cs │ ├── SyncContentControlPage.axaml │ ├── SyncContentControlPage.axaml.cs │ ├── SyncSettingPage.axaml │ ├── SyncSettingPage.axaml.cs │ ├── SystemSettingPage.axaml │ ├── SystemSettingPage.axaml.cs │ ├── TrayIconContextMenu.cs │ └── TrayIconImpl.cs ├── SyncClipboard.Server.Core ├── BasicAuthenticationHandler.cs ├── Controller │ ├── SyncClipboardController.cs │ ├── SyncClipboardControllerExtention.cs │ └── SyncClipboardPassiveController.cs ├── CredentialChecker │ ├── FileCredentialChecker.cs │ ├── ICredentialChecker.cs │ └── StaticCredentialChecker.cs ├── SyncClipboard.Server.Core.csproj └── Web.cs ├── SyncClipboard.Server ├── .dockerignore ├── Dockerfile ├── Program.cs ├── README_DOCKER.md ├── SyncClipboard.Server.csproj ├── appsettings.Development.json ├── appsettings.json └── docker-compose.yml ├── SyncClipboard.Test.Desktop ├── ServiceProvider.cs ├── SyncClipboard.Test.Desktop.csproj └── Usings.cs ├── SyncClipboard.Test.WinUI3 ├── ServiceProvider.cs ├── SyncClipboard.Test.WinUI3.csproj └── Usings.cs ├── SyncClipboard.Test ├── PlatformServiceProviderDataSource.cs ├── ServiceProviderDataSourceBase.cs ├── SyncClipboard.Test.csproj ├── SystemServiceProviderDataSource.cs └── Usings.cs ├── SyncClipboard.WinUI3 ├── .filenesting.json ├── App.xaml ├── App.xaml.cs ├── AppConfig.cs ├── AppServices.cs ├── Assets │ ├── default-inactive.ico │ ├── default.ico │ ├── download001.ico │ ├── download002.ico │ ├── download003.ico │ ├── download004.ico │ ├── download005.ico │ ├── download006.ico │ ├── download007.ico │ ├── download008.ico │ ├── download009.ico │ ├── download010.ico │ ├── download011.ico │ ├── download012.ico │ ├── download013.ico │ ├── download014.ico │ ├── download015.ico │ ├── download016.ico │ ├── download017.ico │ ├── erro-inactive.ico │ ├── erro.ico │ ├── icon.ico │ ├── icon.png │ ├── icon_white.png │ ├── upload001.ico │ ├── upload002.ico │ ├── upload003.ico │ ├── upload004.ico │ ├── upload005.ico │ ├── upload006.ico │ ├── upload007.ico │ ├── upload008.ico │ ├── upload009.ico │ ├── upload010.ico │ ├── upload011.ico │ ├── upload012.ico │ ├── upload013.ico │ ├── upload014.ico │ ├── upload015.ico │ ├── upload016.ico │ └── upload017.ico ├── ClipboardWinUI │ ├── ClipboardFactory.Native.cs │ ├── ClipboardFactory.cs │ ├── ClipboardListener.cs │ ├── ClipboardSetterBase.cs │ ├── FileClipboardSetter.cs │ ├── ImageClipboardSetter.cs │ ├── TextClipboardSetter.cs │ └── UnusualStorageItem.cs ├── Env.cs ├── Program.cs ├── SyncClipboard.WinUI3.csproj ├── Utilities │ └── ThreadDispatcher.cs ├── ValueConverters │ ├── BoolToPasswordIconConverter.cs │ ├── ConvertMethod.cs │ └── KeyToJsonStringConverter.cs ├── Views │ ├── .editorconfig │ ├── AboutPage.xaml │ ├── AboutPage.xaml.cs │ ├── AppTitleBar.xaml │ ├── AppTitleBar.xaml.cs │ ├── CliboardAssistantPage.xaml │ ├── CliboardAssistantPage.xaml.cs │ ├── FileSyncFilterSettingPage.xaml │ ├── FileSyncFilterSettingPage.xaml.cs │ ├── HotkeyInput.xaml │ ├── HotkeyInput.xaml.cs │ ├── HotkeyPage.xaml │ ├── HotkeyPage.xaml.cs │ ├── HotkeyViewer.xaml │ ├── HotkeyViewer.xaml.cs │ ├── LicensePage.xaml │ ├── LicensePage.xaml.cs │ ├── MainWindow.xaml │ ├── MainWindow.xaml.cs │ ├── NextCloudLogInPage.xaml │ ├── NextCloudLogInPage.xaml.cs │ ├── ServerSettingDialog.xaml │ ├── ServerSettingDialog.xaml.cs │ ├── ServiceStatusPage.xaml │ ├── ServiceStatusPage.xaml.cs │ ├── SyncContentControlPage.xaml │ ├── SyncContentControlPage.xaml.cs │ ├── SyncSettingPage.xaml │ ├── SyncSettingPage.xaml.cs │ ├── SystemSettingPage.xaml │ ├── SystemSettingPage.xaml.cs │ ├── TrayIcon.xaml │ ├── TrayIcon.xaml.cs │ ├── TrayIconContextMenu.cs │ └── TrayIconImpl.cs ├── Win32 │ ├── KeyboardMap.cs │ ├── NativeHotkeyRegistry.cs │ └── WindowIconExtention.cs └── app.manifest ├── SyncClipboard.Windows ├── Notification │ ├── NotificationManager.cs │ ├── ProgressBar.cs │ ├── Register.cs │ ├── ShellLink.cs │ ├── ToastContentBuilderExtend.cs │ └── ToastSession.cs └── SyncClipboard.Windows.csproj └── SyncClipboard.sln /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 询问问题 | Ask question 4 | url: https://github.com/Jeric-X/SyncClipboard/discussions/new/choose 5 | about: Ask a question about this project. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: 功能请求 | Feature request 2 | description: Suggest an idea for this project 3 | labels: ["feature request"] 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: 描述你想添加的功能 | Describe the feature you'd like 8 | validations: 9 | required: true 10 | - type: textarea 11 | attributes: 12 | label: 描述你正在使用的替代方案 | Describe alternatives you are using -------------------------------------------------------------------------------- /.github/workflows/build-entry-pr.yml: -------------------------------------------------------------------------------- 1 | name: build-pr 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | code-style: 8 | uses: ./.github/workflows/code-style.yml 9 | 10 | prebuild: 11 | uses: ./.github/workflows/prebuild.yml 12 | with: 13 | checkout-repo: ${{ github.repository }} 14 | checkout-ref: ${{ github.ref }} 15 | 16 | build-win: 17 | uses: ./.github/workflows/win-build.yml 18 | needs: prebuild 19 | 20 | build-server: 21 | uses: ./.github/workflows/server-build.yml 22 | 23 | build-linux: 24 | uses: ./.github/workflows/linux-package.yml 25 | needs: prebuild 26 | with: 27 | checkout-repo: ${{ github.repository }} 28 | checkout-ref: ${{ github.ref }} 29 | 30 | build-mac: 31 | uses: ./.github/workflows/mac-package.yml 32 | needs: prebuild 33 | with: 34 | checkout-repo: ${{ github.repository }} 35 | checkout-ref: ${{ github.ref }} 36 | -------------------------------------------------------------------------------- /.github/workflows/build-entry.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | permissions: 4 | contents: write 5 | on: 6 | push: 7 | branches: 8 | - '**' 9 | tags: 10 | - 'v*' 11 | 12 | jobs: 13 | code-style: 14 | uses: ./.github/workflows/code-style.yml 15 | 16 | prebuild: 17 | uses: ./.github/workflows/prebuild.yml 18 | with: 19 | checkout-repo: ${{ github.repository }} 20 | checkout-ref: ${{ github.ref }} 21 | 22 | build-win: 23 | needs: prebuild 24 | uses: ./.github/workflows/win-release.yml 25 | 26 | build-server: 27 | uses: ./.github/workflows/server-release.yml 28 | secrets: inherit 29 | 30 | build-linux: 31 | needs: prebuild 32 | uses: ./.github/workflows/linux-release.yml 33 | with: 34 | checkout-repo: ${{ github.repository }} 35 | checkout-ref: ${{ github.ref }} 36 | 37 | build-mac: 38 | needs: prebuild 39 | uses: ./.github/workflows/mac-release.yml 40 | with: 41 | checkout-repo: ${{ github.repository }} 42 | checkout-ref: ${{ github.ref }} 43 | 44 | create-gh-release-draft: 45 | if: ${{ startsWith(github.ref, 'refs/tags/') }} 46 | uses: ./.github/workflows/release-draft.yml 47 | 48 | create-gh-release-formal: 49 | if: ${{ startsWith(github.ref, 'refs/tags/') }} 50 | needs: [create-gh-release-draft, build-win, build-server, build-linux, build-mac] 51 | uses: ./.github/workflows/release-formal.yml -------------------------------------------------------------------------------- /.github/workflows/code-style.yml: -------------------------------------------------------------------------------- 1 | name: code-style 2 | 3 | on: 4 | workflow_call: 5 | 6 | jobs: 7 | check: 8 | runs-on: macos-14 # For a list of available runner types, refer to 9 | # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on 10 | 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | # Install the .NET workload 16 | - name: Install .NET 17 | uses: actions/setup-dotnet@v4 18 | with: 19 | dotnet-version: | 20 | 8.0.x 21 | 22 | - name: Install dependencies 23 | working-directory: ./src 24 | run: | 25 | dotnet workload install macos 26 | dotnet workload restore 27 | dotnet restore 28 | 29 | - name: Check code style 30 | working-directory: ./src 31 | run: | 32 | dotnet format --verify-no-changes --no-restore 33 | 34 | - name: Check code style info 35 | continue-on-error: true 36 | working-directory: ./src 37 | run: | 38 | dotnet format --verify-no-changes --severity info --no-restore -------------------------------------------------------------------------------- /.github/workflows/mac-release.yml: -------------------------------------------------------------------------------- 1 | name: mac-release 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | workflow_call: 8 | inputs: 9 | checkout-repo: 10 | required: true 11 | type: string 12 | checkout-ref: 13 | required: true 14 | type: string 15 | 16 | jobs: 17 | package: 18 | uses: ./.github/workflows/mac-package.yml 19 | with: 20 | checkout-repo: ${{ inputs.checkout-repo }} 21 | checkout-ref: ${{ inputs.checkout-ref }} 22 | 23 | release-macos: 24 | needs: package 25 | if : ${{ startsWith(github.ref, 'refs/tags/') }} 26 | strategy: 27 | matrix: 28 | cpu: [x64, arm64] 29 | 30 | runs-on: ubuntu-latest 31 | steps: 32 | - name: Download last-job-built change log 33 | uses: actions/download-artifact@v4 34 | with: 35 | name: feature 36 | 37 | - name: Download build artifacts 38 | uses: actions/download-artifact@v4 39 | with: 40 | name: "SyncClipboard_macos_${{ matrix.cpu }}.dmg" 41 | 42 | - name: Release 43 | uses: ncipollo/release-action@v1 44 | with: 45 | allowUpdates: true 46 | draft: true 47 | prerelease: ${{ contains(github.ref_name, 'beta') }} 48 | artifacts: SyncClipboard_macos_${{ matrix.cpu }}.dmg 49 | bodyFile: feature.txt -------------------------------------------------------------------------------- /.github/workflows/prebuild.yml: -------------------------------------------------------------------------------- 1 | name: prebuild 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | checkout-repo: 7 | required: true 8 | type: string 9 | checkout-ref: 10 | required: true 11 | type: string 12 | 13 | jobs: 14 | prebuild: 15 | runs-on: windows-latest # For a list of available runner types, refer to 16 | # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on 17 | 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | with: 22 | repository: ${{ inputs.checkout-repo }} 23 | ref: ${{ inputs.checkout-ref }} 24 | 25 | - name: Generate windows change log 26 | run: | 27 | .\PreRelease.bat 28 | type feature.txt 29 | 30 | - name: Upload windows change log 31 | uses: actions/upload-artifact@v4 32 | with: 33 | name: feature 34 | path: feature.txt -------------------------------------------------------------------------------- /.github/workflows/release-draft.yml: -------------------------------------------------------------------------------- 1 | name: release-draft 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | workflow_call: 8 | 9 | jobs: 10 | release-draft: 11 | runs-on: windows-latest 12 | steps: 13 | - name: Release 14 | uses: ncipollo/release-action@v1 15 | with: 16 | draft: true 17 | allowUpdates: false 18 | prerelease: ${{ contains(github.ref_name, 'beta') }} -------------------------------------------------------------------------------- /.github/workflows/release-formal.yml: -------------------------------------------------------------------------------- 1 | name: release-formal 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | workflow_call: 8 | 9 | jobs: 10 | release-formal: 11 | runs-on: windows-latest 12 | steps: 13 | - name: Download last-job-built change log 14 | uses: actions/download-artifact@v4 15 | with: 16 | name: feature 17 | 18 | - name: Release 19 | uses: ncipollo/release-action@v1 20 | with: 21 | draft: false 22 | allowUpdates: true 23 | prerelease: ${{ contains(github.ref_name, 'beta') }} 24 | bodyFile: feature.txt -------------------------------------------------------------------------------- /.github/workflows/server-build.yml: -------------------------------------------------------------------------------- 1 | name: server-build 2 | 3 | on: 4 | workflow_call: 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest # For a list of available runner types, refer to 9 | # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on 10 | 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | # Install the .NET workload 16 | - name: Install .NET 17 | uses: actions/setup-dotnet@v4 18 | with: 19 | dotnet-version: | 20 | 8.0.x 21 | 22 | - name: Install dependencies 23 | working-directory: ./src 24 | run: dotnet restore SyncClipboard.Server 25 | 26 | - name: Build SyncClipboard.Server 27 | run: dotnet publish src/SyncClipboard.Server/SyncClipboard.Server.csproj --configuration Release --no-restore 28 | 29 | - name: copy SyncClipboard.Server 30 | run: | 31 | mkdir server 32 | cp -r src/SyncClipboard.Server/bin/Release/net8.0/publish/ server/ 33 | 34 | - name: Upload build artifacts SyncClipboard.Server 35 | uses: actions/upload-artifact@v4 36 | with: 37 | name: SyncClipboard.Server 38 | path: server/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 JericX 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/.NETCommunityToolkit/License.md: -------------------------------------------------------------------------------- 1 | # .NET Community Toolkit 2 | 3 | Copyright © .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | ## MIT License (MIT) 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 14 | -------------------------------------------------------------------------------- /LICENSES/Avalonia/licence.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) .NET Foundation and Contributors 4 | All Rights Reserved 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /LICENSES/DotNetZip.Semverd/NOTICE.txt: -------------------------------------------------------------------------------- 1 | DotNetZip - Copyright (c) 2006 - 2011 Dino Chiesa 2 | DotNetZip - Copyright (c) 2006, 2007, 2008, 2009 Dino Chiesa and Microsoft Corporation. 3 | 4 | jzlib - Copyright (c) 2000,2001,2002,2003 ymnk, JCraft, Inc. 5 | zlib - Copyright (c) 1995-2004 Jean-loup Gailly and Mark Adler 6 | 7 | Apache Commons Compress - Copyright 2002-2014 The Apache Software Foundation 8 | This product includes software developed at The Apache Software Foundation (http://www.apache.org/). 9 | The files in the package org.apache.commons.compress.archivers.sevenz were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/), which has been placed in the public domain: 10 | "LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html) 11 | 12 | Many thanks to Tim Endres, Keiron Liddle, and (for libbzip2), Julian Seward at bzip.org. 13 | -------------------------------------------------------------------------------- /LICENSES/FluentAvalonia.BreadcrumbBar/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 indigo-san 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/FluentAvalonia/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 amwx 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/H.NotifyIcon/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 havendv 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/SharpHook/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Anatoliy Pylypchuk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/Tmds.DBus/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2006 Alp Toker 2 | Copyright 2010 Other Contributors 3 | Copyright 2016 Tom Deseyn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /LICENSES/Vanara/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 David Hall 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSES/WinUIEx/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Morten Nielsen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PreRelease.bat: -------------------------------------------------------------------------------- 1 | For /f "tokens=1* delims=:" %%i in ('Type Changes.md^|Findstr /n ".*"') do ( 2 | if "%%i"=="1" ( 3 | echo %%j>>version.txt 4 | ) 5 | if "%%j"=="" ( 6 | goto :end 7 | ) 8 | echo %%j>>feature.txt 9 | ) 10 | :end -------------------------------------------------------------------------------- /build/ReadDesktopChanges.bat: -------------------------------------------------------------------------------- 1 | For /f "tokens=1* delims=:" %%i in ('Type ..\src\SyncClipboard.Desktop\Changes.md^|Findstr /n ".*"') do ( 2 | if "%%j"=="" ( 3 | goto :end 4 | ) 5 | if "%%i"=="1" ( 6 | echo | set /p dummyName="%%j">version.txt 7 | ) ^ 8 | else ( 9 | echo %%j>>feature.txt 10 | ) 11 | ) 12 | :end -------------------------------------------------------------------------------- /build/ReadDesktopChanges.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | CHANGES=../src/SyncClipboard.Desktop/Changes.md 4 | 5 | cat $CHANGES | head -n 1 | tr -d "\n" > version.txt 6 | awk '{if ($0 == "") exit; else print}' $CHANGES > featuretemp.txt 7 | tail -n +2 featuretemp.txt > feature.txt 8 | -------------------------------------------------------------------------------- /build/appveyor/AppVeyor.bat: -------------------------------------------------------------------------------- 1 | setlocal enabledelayedexpansion 2 | set newline=^ 3 | For /f "tokens=1* delims=:" %%i in ('Type Changes.md^|Findstr /n ".*"') do ( 4 | if "%%i"=="1" set VERSION=%%j 5 | if "%%j"=="" ( 6 | echo !FEATURE!>feature.txt 7 | echo !VERSION!>version.txt 8 | goto :end 9 | ) 10 | set CHILDFEATURE=%%j 11 | set "FEATURE=!FEATURE!!CHILDFEATURE!!newline!" 12 | 13 | ) 14 | :end 15 | endlocal 16 | For /f "tokens=1* delims=:" %%i in ('Type version.txt^|Findstr /n ".*"') do ( 17 | if "%%i"=="1" set VERSION=%%j 18 | ) 19 | For /f "tokens=1* delims=:" %%i in ('Type feature.txt^|Findstr /n ".*"') do ( 20 | if "%%i"=="1" set FEATURE=%%j 21 | ) -------------------------------------------------------------------------------- /build/appveyor/appveyor.yml: -------------------------------------------------------------------------------- 1 | version: 1.0.{build} 2 | image: Visual Studio 2022 3 | configuration: Release 4 | platform: x64 5 | build_script: 6 | - cmd: >- 7 | dotnet restore 8 | 9 | dotnet publish SyncClipboard.Server\SyncClipboard.Server.csproj --configuration Release --no-restore 10 | 11 | dotnet publish SyncClipboard\SyncClipboard.csproj -c Release -r win-x64 --no-self-contained -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true 12 | 13 | msbuild SyncClipboard.WinUI3\SyncClipboard.WinUI3.csproj /p:Platform=x64 /p:RuntimeIdentifier=win-x64 /p:Configuration=Release /v:m 14 | 15 | ./AppVeyor.bat 16 | artifacts: 17 | - path: SyncClipboard/bin/x64/Release/net8.0-windows10.0.17763.0/win-x64/publish/SyncClipboard.exe 18 | name: SyncClipboard_$(VERSION) 19 | - path: SyncClipboard.Server/bin/x64/Release/net8.0/publish/ 20 | name: SyncClipboard.Server_$(VERSION) 21 | - path: SyncClipboard.WinUI3/bin/x64/Release/net8.0-windows10.0.19041.0/win-x64/ 22 | name: SyncClipboard.WinUI3_$(VERSION) 23 | # deploy: 24 | # - provider: GitHub 25 | # release: $(VERSION) 26 | # description: $(FEATURE) 27 | # auth_token: 28 | # secure: zuPhf3Nx5b5FX/XCtz5/goxwD1t3htaC59DgWs2AiaeNdoTssqKoT1QX+2S+h3pr 29 | # artifact: SyncClipboard_$(VERSION) 30 | # force_update: true 31 | # on: 32 | # APPVEYOR_REPO_TAG: true -------------------------------------------------------------------------------- /build/linux/PostPublish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This is a dummy bash script used for demonstration and test. It outputs a few variables 3 | # and creates a dummy file in the application directory which will be detected by the program. 4 | 5 | echo 6 | echo =========================== 7 | echo POST_PUBLISH BASH SCRIPT 8 | echo =========================== 9 | echo 10 | 11 | # Some useful macros environment variables 12 | echo BUILD_ARCH ${BUILD_ARCH} 13 | echo BUILD_TARGET ${BUILD_TARGET} 14 | echo BUILD_SHARE ${BUILD_SHARE} 15 | echo BUILD_APP_BIN ${BUILD_APP_BIN} 16 | echo 17 | 18 | echo Do work... 19 | set -x #echo on 20 | echo Copying files 21 | # build on Windows first, put outputs in [../linux/] foleder 22 | build_bin_dir=$(readlink -f './build_bin') 23 | echo build_bin_dir full path : $bin_source_dir 24 | 25 | cp -r ./build_bin/* ${BUILD_APP_BIN}/ 26 | set +x #echo off 27 | 28 | echo 29 | echo =========================== 30 | echo POST_PUBLISH END 31 | echo =========================== 32 | echo -------------------------------------------------------------------------------- /build/linux/app.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=${APP_FRIENDLY_NAME} 4 | Icon=${APP_ID} 5 | Comment=${APP_SHORT_SUMMARY} 6 | Exec=env LANG=en_US.UTF-8 ${INSTALL_EXEC} 7 | TryExec=${INSTALL_EXEC} 8 | NoDisplay=${DESKTOP_NODISPLAY} 9 | X-AppImage-Integrate=${DESKTOP_INTEGRATE} 10 | Terminal=${DESKTOP_TERMINAL} 11 | Categories=${PRIME_CATEGORY} 12 | StartupWMClass=${APP_BASE_NAME} 13 | MimeType= 14 | Keywords= -------------------------------------------------------------------------------- /build/macos/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIconFile 6 | icon.icns 7 | CFBundleIdentifier 8 | xyz.jericx.desktop.syncclipboard 9 | CFBundleName 10 | SyncClipboard 11 | LSMinimumSystemVersion 12 | 10.15 13 | CFBundleExecutable 14 | SyncClipboard.Desktop.MacOS 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundlePackageType 18 | APPL 19 | NSHighResolutionCapable 20 | 21 | CFBundleVersion 22 | 3.0.0 23 | CFBundleShortVersionString 24 | 3.0.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /build/macos/VolumeIcon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/build/macos/VolumeIcon.icns -------------------------------------------------------------------------------- /build/macos/buildAppBundle.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | APP_NAME="SyncClipboard.app" 4 | # PUBLISH_OUTPUT_DIRECTORY="../../macos-bin/." 5 | # chmod +x "$PUBLISH_OUTPUT_DIRECTORY/SyncClipboard.Desktop" 6 | 7 | # PUBLISH_OUTPUT_DIRECTORY should point to the output directory of your dotnet publish command. 8 | # One example is /path/to/your/csproj/bin/Release/netcoreapp3.1/osx-x64/publish/. 9 | # If you want to change output directories, add `--output /my/directory/path` to your `dotnet publish` command. 10 | INFO_PLIST="Info.plist" 11 | ICON_FILE="icon.icns" 12 | 13 | # if [ -d "$APP_NAME" ] 14 | # then 15 | # rm -rf "$APP_NAME" 16 | # fi 17 | 18 | # mkdir "$APP_NAME" 19 | 20 | # mkdir "$APP_NAME/Contents" 21 | # mkdir "$APP_NAME/Contents/MacOS" 22 | mkdir "$APP_NAME/Contents/Resources" 23 | 24 | cp -f "$INFO_PLIST" "$APP_NAME/Contents/Info.plist" 25 | cp "$ICON_FILE" "$APP_NAME/Contents/Resources/$ICON_FILE" 26 | # cp -a "$PUBLISH_OUTPUT_DIRECTORY" "$APP_NAME/Contents/MacOS" -------------------------------------------------------------------------------- /build/macos/dmg-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/build/macos/dmg-background.png -------------------------------------------------------------------------------- /build/macos/dmg-background.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/build/macos/dmg-background.tiff -------------------------------------------------------------------------------- /build/macos/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/build/macos/icon.icns -------------------------------------------------------------------------------- /build/macos/icon_512x512.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/build/macos/icon_512x512.psd -------------------------------------------------------------------------------- /docs/image/WinUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/WinUI.png -------------------------------------------------------------------------------- /docs/image/WinUI_EN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/WinUI_EN.png -------------------------------------------------------------------------------- /docs/image/android1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/android1.jpg -------------------------------------------------------------------------------- /docs/image/android1_EN.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/android1_EN.jpg -------------------------------------------------------------------------------- /docs/image/android2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/android2.jpg -------------------------------------------------------------------------------- /docs/image/android2_EN.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/android2_EN.jpg -------------------------------------------------------------------------------- /docs/image/android3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/android3.jpg -------------------------------------------------------------------------------- /docs/image/android3_EN.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/docs/image/android3_EN.jpg -------------------------------------------------------------------------------- /script/HTTP Shortcuts/BeforeUpload.js: -------------------------------------------------------------------------------- 1 | let text = getClipboardContent() 2 | if (text != null) { 3 | showToast(text) 4 | setVariable('Clipboard', text) 5 | } else { 6 | showToast('null clipboard value') 7 | } -------------------------------------------------------------------------------- /script/en/shortcuts.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/script/en/shortcuts.zip -------------------------------------------------------------------------------- /script/shortcuts.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/script/shortcuts.zip -------------------------------------------------------------------------------- /src/.editorconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeric-X/SyncClipboard/6afe10b3fce2dd1c7684ff6eb9633a1cb0acf430/src/.editorconfig -------------------------------------------------------------------------------- /src/SyncClipboard.Abstract/ClipboardProfileDTO.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json.Serialization; 2 | 3 | namespace SyncClipboard.Abstract; 4 | 5 | public record class ClipboardProfileDTO 6 | { 7 | [JsonPropertyName(nameof(File))] 8 | public string File { get; set; } 9 | [JsonPropertyName(nameof(Clipboard))] 10 | public string Clipboard { get; set; } 11 | [JsonPropertyName(nameof(Type))] 12 | [JsonConverter(typeof(JsonStringEnumConverter))] 13 | public ProfileType Type { get; set; } 14 | 15 | public ClipboardProfileDTO(string file = "", string clipboard = "", ProfileType type = ProfileType.Text) 16 | { 17 | File = file; 18 | Clipboard = clipboard; 19 | Type = type; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/SyncClipboard.Abstract/IClipboardImage.cs: -------------------------------------------------------------------------------- 1 | namespace SyncClipboard.Abstract; 2 | 3 | public interface IClipboardImage 4 | { 5 | public void Save(string path); 6 | } 7 | -------------------------------------------------------------------------------- /src/SyncClipboard.Abstract/IClipboardMoniter.cs: -------------------------------------------------------------------------------- 1 | namespace SyncClipboard.Abstract; 2 | 3 | public interface IClipboardMoniter 4 | { 5 | event Action ClipboardChanged; 6 | } 7 | -------------------------------------------------------------------------------- /src/SyncClipboard.Abstract/IProfileDtoHelper.cs: -------------------------------------------------------------------------------- 1 | namespace SyncClipboard.Abstract; 2 | 3 | public interface IProfileDtoHelper 4 | { 5 | Task CreateProfileDto(string destFolder); 6 | Task SetLocalClipboardWithDto(ClipboardProfileDTO profileDto, string fileFolder); 7 | } 8 | -------------------------------------------------------------------------------- /src/SyncClipboard.Abstract/Notification/Button.cs: -------------------------------------------------------------------------------- 1 | namespace SyncClipboard.Abstract.Notification; 2 | 3 | public class Button(string text, Action action) 4 | { 5 | public string Text { get; set; } = text; 6 | public string Uid { get; } = Guid.NewGuid().ToString(); 7 | public Action Callbacker { get; set; } = action; 8 | 9 | public void Invoke() 10 | { 11 | Callbacker.Invoke(); 12 | } 13 | } -------------------------------------------------------------------------------- /src/SyncClipboard.Abstract/Notification/CallbackHandler.cs: -------------------------------------------------------------------------------- 1 | namespace SyncClipboard.Abstract.Notification; 2 | 3 | public class CallbackHandler where NotificationIdType : notnull 4 | { 5 | private readonly Dictionary> _handlerList = []; 6 | private readonly Dictionary> _sessionList = []; 7 | 8 | public void OnActivated(NotificationIdType id, string buttonId) 9 | { 10 | var found = _handlerList.TryGetValue(id, out Dictionary? buttonList); 11 | if (found) 12 | { 13 | buttonList!.TryGetValue(buttonId, out Button? button); 14 | button?.Invoke(); 15 | _handlerList.Remove(id); 16 | } 17 | 18 | _sessionList.Remove(id); 19 | } 20 | 21 | public void OnClosed(NotificationIdType id) 22 | { 23 | _handlerList.Remove(id); 24 | _sessionList.Remove(id); 25 | } 26 | 27 | public void AddButton(NotificationIdType id, Button button, NotificationSessionBase session) 28 | { 29 | _sessionList.TryAdd(id, session); 30 | _handlerList.TryAdd(id, []); 31 | 32 | var buttonList = _handlerList[id]; 33 | buttonList.Add(button.Uid.ToString(), button); 34 | } 35 | 36 | public void AddButtons(NotificationIdType id, IEnumerable