Repository: hluk/CopyQ Branch: master Commit: a16201edf3e2 Files: 594 Total size: 9.0 MB Directory structure: gitextract_5_z0o7o6/ ├── .claude/ │ └── settings.json ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── actions/ │ │ └── download-miniaudio/ │ │ └── action.yml │ ├── dependabot.yml │ └── workflows/ │ ├── build-linux.yml │ ├── build-macos.yml │ ├── build-windows.yml │ └── codespell.yml ├── .gitignore ├── .gitlab-ci.yml ├── .pre-commit-config.yaml ├── .readthedocs.yaml ├── .weblate ├── AGENTS.md ├── AUTHORS ├── CHANGES.md ├── CMakeLists.txt ├── CMakePresets.json ├── Doxyfile ├── HACKING ├── INSTALL ├── LICENSE ├── README.md ├── RELEASE.md ├── docs/ │ ├── Makefile │ ├── autobuild.sh │ ├── backup.rst │ ├── basic-usage.rst │ ├── build-source-code.rst │ ├── command-examples.rst │ ├── command-line.rst │ ├── commands-display.rst │ ├── commands-script.rst │ ├── conf.py │ ├── customize-and-build-the-windows-installer.rst │ ├── faq.rst │ ├── fixing-bugs.rst │ ├── glossary.rst │ ├── images.rst │ ├── index.rst │ ├── installation.rst │ ├── keyboard.rst │ ├── known-issues.rst │ ├── make.bat │ ├── password-protection.rst │ ├── pin-items.rst │ ├── requirements.txt │ ├── scripting-api.rst │ ├── scripting.rst │ ├── security.rst │ ├── sessions.rst │ ├── source-code-overview.rst │ ├── synchronize.rst │ ├── tabs-and-items.rst │ ├── tags.rst │ ├── text-encoding.rst │ ├── theme.rst │ ├── translations.rst │ ├── writing-commands-and-adding-functionality.rst │ └── writing-raw-data.rst ├── gpl.txt ├── plugins/ │ ├── CMakeLists.txt │ ├── itemencrypted/ │ │ ├── CMakeLists.txt │ │ ├── itemencrypted.cpp │ │ ├── itemencrypted.h │ │ └── itemencryptedsettings.ui │ ├── itemfakevim/ │ │ ├── CMakeLists.txt │ │ ├── fakevim/ │ │ │ ├── LGPL_EXCEPTION.TXT │ │ │ ├── LICENSE.LGPL │ │ │ ├── fakevimactions.cpp │ │ │ ├── fakevimactions.h │ │ │ ├── fakevimhandler.cpp │ │ │ ├── fakevimhandler.h │ │ │ ├── fakevimtr.h │ │ │ └── private/ │ │ │ └── fakevim_export.h │ │ ├── itemfakevim.cpp │ │ ├── itemfakevim.h │ │ ├── itemfakevim.qrc │ │ └── itemfakevimsettings.ui │ ├── itemimage/ │ │ ├── CMakeLists.txt │ │ ├── itemimage.cpp │ │ ├── itemimage.h │ │ └── itemimagesettings.ui │ ├── itemnotes/ │ │ ├── CMakeLists.txt │ │ ├── itemnotes.cpp │ │ ├── itemnotes.h │ │ └── itemnotessettings.ui │ ├── itempinned/ │ │ ├── CMakeLists.txt │ │ ├── itempinned.cpp │ │ └── itempinned.h │ ├── itemsync/ │ │ ├── CMakeLists.txt │ │ ├── filewatcher.cpp │ │ ├── filewatcher.h │ │ ├── itemsync.cpp │ │ ├── itemsync.h │ │ └── itemsyncsettings.ui │ ├── itemtags/ │ │ ├── CMakeLists.txt │ │ ├── itemtags.cpp │ │ ├── itemtags.h │ │ └── itemtagssettings.ui │ └── itemtext/ │ ├── CMakeLists.txt │ ├── itemtext.cpp │ ├── itemtext.h │ └── itemtextsettings.ui ├── pyproject.toml ├── qxt/ │ ├── AUTHORS │ ├── COPYING │ ├── qxtglobalshortcut.cpp │ ├── qxtglobalshortcut.h │ ├── qxtglobalshortcut_mac.cpp │ ├── qxtglobalshortcut_p.h │ ├── qxtglobalshortcut_win.cpp │ ├── qxtglobalshortcut_x11.cpp │ └── xcbkeyboard.h ├── shared/ │ ├── Info.plist │ ├── com.github.hluk.copyq.desktop.in │ ├── com.github.hluk.copyq.metainfo.xml │ ├── copyq-completion │ ├── copyq.1 │ ├── copyq.iss │ ├── flatpak/ │ │ ├── README.md │ │ └── com.github.hluk.copyq.json │ ├── gnome-extension/ │ │ ├── extension.js │ │ └── metadata.json │ ├── gpl-3.0.rtf │ ├── plugins/ │ │ └── example.js │ └── themes/ │ ├── black.ini │ ├── dark.ini │ ├── forest.ini │ ├── items.css │ ├── light.ini │ ├── main_window.css │ ├── main_window_simple.css │ ├── menu.css │ ├── nord.ini │ ├── nord_light.ini │ ├── notification.css │ ├── paper.ini │ ├── simple.ini │ ├── solarized-dark.ini │ ├── solarized-light.ini │ ├── tooltip.css │ └── wine.ini ├── src/ │ ├── CMakeLists.txt │ ├── app/ │ │ ├── app.cpp │ │ ├── app.h │ │ ├── applicationexceptionhandler.cpp │ │ ├── applicationexceptionhandler.h │ │ ├── clipboardclient.cpp │ │ ├── clipboardclient.h │ │ ├── clipboardmonitor.cpp │ │ ├── clipboardmonitor.h │ │ ├── clipboardownermonitor.cpp │ │ ├── clipboardownermonitor.h │ │ ├── clipboardserver.cpp │ │ └── clipboardserver.h │ ├── audio.cmake │ ├── common/ │ │ ├── action.cpp │ │ ├── action.h │ │ ├── actionhandlerenums.h │ │ ├── actionoutput.cpp │ │ ├── actionoutput.h │ │ ├── actiontablemodel.cpp │ │ ├── actiontablemodel.h │ │ ├── appconfig.cpp │ │ ├── appconfig.h │ │ ├── audioplayer.cpp │ │ ├── audioplayer.h │ │ ├── client_server.cpp │ │ ├── client_server.h │ │ ├── clientsocket.cpp │ │ ├── clientsocket.h │ │ ├── clipboarddataguard.cpp │ │ ├── clipboarddataguard.h │ │ ├── clipboardmode.h │ │ ├── command.cpp │ │ ├── command.h │ │ ├── commandstatus.h │ │ ├── commandstore.cpp │ │ ├── commandstore.h │ │ ├── common.cpp │ │ ├── common.h │ │ ├── config.cpp │ │ ├── config.h │ │ ├── contenttype.h │ │ ├── display.cpp │ │ ├── display.h │ │ ├── encryption.cpp │ │ ├── encryption.h │ │ ├── globalshortcutcommands.cpp │ │ ├── globalshortcutcommands.h │ │ ├── keychainaccess.cpp │ │ ├── keychainaccess.h │ │ ├── log.cpp │ │ ├── log.h │ │ ├── messagehandlerforqt.cpp │ │ ├── messagehandlerforqt.h │ │ ├── mimetypes.cpp │ │ ├── mimetypes.h │ │ ├── navigationstyle.h │ │ ├── option.cpp │ │ ├── option.h │ │ ├── predefinedcommands.cpp │ │ ├── predefinedcommands.h │ │ ├── process.cpp │ │ ├── process.h │ │ ├── processsignals.h │ │ ├── regexp.h │ │ ├── server.cpp │ │ ├── server.h │ │ ├── settings.cpp │ │ ├── settings.h │ │ ├── shortcuts.cpp │ │ ├── shortcuts.h │ │ ├── sleeptimer.h │ │ ├── tabs.cpp │ │ ├── tabs.h │ │ ├── temporaryfile.cpp │ │ ├── temporaryfile.h │ │ ├── temporarysettings.cpp │ │ ├── temporarysettings.h │ │ ├── textdata.cpp │ │ ├── textdata.h │ │ ├── timer.h │ │ ├── version.cpp.in │ │ └── version.h │ ├── copyq.qrc │ ├── copyq.rc │ ├── gui/ │ │ ├── aboutdialog.cpp │ │ ├── aboutdialog.h │ │ ├── actiondialog.cpp │ │ ├── actiondialog.h │ │ ├── actionhandler.cpp │ │ ├── actionhandler.h │ │ ├── actionhandlerdialog.cpp │ │ ├── actionhandlerdialog.h │ │ ├── addcommanddialog.cpp │ │ ├── addcommanddialog.h │ │ ├── clipboardbrowser.cpp │ │ ├── clipboardbrowser.h │ │ ├── clipboardbrowserplaceholder.cpp │ │ ├── clipboardbrowserplaceholder.h │ │ ├── clipboardbrowsershared.h │ │ ├── clipboarddialog.cpp │ │ ├── clipboarddialog.h │ │ ├── clipboardspy.cpp │ │ ├── clipboardspy.h │ │ ├── commandaction.cpp │ │ ├── commandaction.h │ │ ├── commandcompleter.cpp │ │ ├── commandcompleter.h │ │ ├── commandcompleterdocumentation.h │ │ ├── commanddialog.cpp │ │ ├── commanddialog.h │ │ ├── commandedit.cpp │ │ ├── commandedit.h │ │ ├── commandhelpbutton.cpp │ │ ├── commandhelpbutton.h │ │ ├── commandsyntaxhighlighter.cpp │ │ ├── commandsyntaxhighlighter.h │ │ ├── commandwidget.cpp │ │ ├── commandwidget.h │ │ ├── configtabappearance.cpp │ │ ├── configtabappearance.h │ │ ├── configtabtabs.cpp │ │ ├── configtabtabs.h │ │ ├── configurationmanager.cpp │ │ ├── configurationmanager.h │ │ ├── encryptionpassword.cpp │ │ ├── encryptionpassword.h │ │ ├── execmenu.cpp │ │ ├── execmenu.h │ │ ├── fancylineedit.cpp │ │ ├── fancylineedit.h │ │ ├── filedialog.cpp │ │ ├── filedialog.h │ │ ├── filtercompleter.cpp │ │ ├── filtercompleter.h │ │ ├── filterlineedit.cpp │ │ ├── filterlineedit.h │ │ ├── fix_icon_id.h │ │ ├── fromiconid.h │ │ ├── geometry.cpp │ │ ├── geometry.h │ │ ├── icon_list.h │ │ ├── iconfactory.cpp │ │ ├── iconfactory.h │ │ ├── iconfont.cpp │ │ ├── iconfont.h │ │ ├── icons.h │ │ ├── iconselectbutton.cpp │ │ ├── iconselectbutton.h │ │ ├── iconselectdialog.cpp │ │ ├── iconselectdialog.h │ │ ├── iconwidget.cpp │ │ ├── iconwidget.h │ │ ├── importexportdialog.cpp │ │ ├── importexportdialog.h │ │ ├── itemorderlist.cpp │ │ ├── itemorderlist.h │ │ ├── logdialog.cpp │ │ ├── logdialog.h │ │ ├── mainwindow.cpp │ │ ├── mainwindow.h │ │ ├── menuitems.cpp │ │ ├── menuitems.h │ │ ├── navigation.cpp │ │ ├── navigation.h │ │ ├── notification.h │ │ ├── notificationbasic.cpp │ │ ├── notificationbasic.h │ │ ├── notificationbutton.h │ │ ├── notificationdaemon.cpp │ │ ├── notificationdaemon.h │ │ ├── notificationnative/ │ │ │ ├── notificationnative.cpp │ │ │ └── notificationnative.h │ │ ├── passwordprompt.cpp │ │ ├── passwordprompt.h │ │ ├── pixelratio.h │ │ ├── pluginwidget.cpp │ │ ├── pluginwidget.h │ │ ├── screen.cpp │ │ ├── screen.h │ │ ├── selectiondata.cpp │ │ ├── selectiondata.h │ │ ├── shortcutbutton.cpp │ │ ├── shortcutbutton.h │ │ ├── shortcutdialog.cpp │ │ ├── shortcutdialog.h │ │ ├── shortcutswidget.cpp │ │ ├── shortcutswidget.h │ │ ├── tabbar.cpp │ │ ├── tabbar.h │ │ ├── tabdialog.cpp │ │ ├── tabdialog.h │ │ ├── tabicons.cpp │ │ ├── tabicons.h │ │ ├── tabpropertieswidget.cpp │ │ ├── tabpropertieswidget.h │ │ ├── tabswidgetinterface.h │ │ ├── tabtree.cpp │ │ ├── tabtree.h │ │ ├── tabwidget.cpp │ │ ├── tabwidget.h │ │ ├── theme.cpp │ │ ├── theme.h │ │ ├── traymenu.cpp │ │ ├── traymenu.h │ │ ├── windowgeometryguard.cpp │ │ └── windowgeometryguard.h │ ├── images/ │ │ └── icon.icns │ ├── item/ │ │ ├── clipboarditem.cpp │ │ ├── clipboarditem.h │ │ ├── clipboardmodel.cpp │ │ ├── clipboardmodel.h │ │ ├── indexes.cpp │ │ ├── indexes.h │ │ ├── itemdelegate.cpp │ │ ├── itemdelegate.h │ │ ├── itemeditor.cpp │ │ ├── itemeditor.h │ │ ├── itemeditorwidget.cpp │ │ ├── itemeditorwidget.h │ │ ├── itemfactory.cpp │ │ ├── itemfactory.h │ │ ├── itemfilter.h │ │ ├── itemsaverwrapper.cpp │ │ ├── itemsaverwrapper.h │ │ ├── itemstore.cpp │ │ ├── itemstore.h │ │ ├── itemwidget.cpp │ │ ├── itemwidget.h │ │ ├── itemwidgetwrapper.cpp │ │ ├── itemwidgetwrapper.h │ │ ├── persistentdisplayitem.cpp │ │ ├── persistentdisplayitem.h │ │ ├── serialize.cpp │ │ └── serialize.h │ ├── knotifications5/ │ │ └── copyq.notifyrc │ ├── main.cpp │ ├── miniaudio/ │ │ ├── CMakeLists.txt │ │ └── miniaudio_impl.cpp │ ├── notifications.cmake │ ├── platform/ │ │ ├── dummy/ │ │ │ ├── dummyclipboard.cpp │ │ │ ├── dummyclipboard.h │ │ │ ├── dummyplatform.cpp │ │ │ └── dummyplatform.h │ │ ├── mac/ │ │ │ ├── cfref.h │ │ │ ├── copyqpasteboardmime.h │ │ │ ├── copyqpasteboardmime.mm │ │ │ ├── deploy.cmake.in │ │ │ ├── fixup_bundle.cmake.in │ │ │ ├── foregroundbackgroundfilter.h │ │ │ ├── foregroundbackgroundfilter.mm │ │ │ ├── macactivity.h │ │ │ ├── macactivity.mm │ │ │ ├── macclipboard.h │ │ │ ├── macclipboard.mm │ │ │ ├── macplatform.cmake │ │ │ ├── macplatform.h │ │ │ ├── macplatform.mm │ │ │ ├── macplatformwindow.h │ │ │ ├── macplatformwindow.mm │ │ │ ├── mactimer.h │ │ │ ├── mactimer.mm │ │ │ ├── objcstrong.h │ │ │ ├── urlpasteboardmime.h │ │ │ └── urlpasteboardmime.mm │ │ ├── platform.cmake │ │ ├── platformclipboard.cpp │ │ ├── platformclipboard.h │ │ ├── platformcommon.cpp │ │ ├── platformcommon.h │ │ ├── platformnativeinterface.h │ │ ├── platformwindow.h │ │ ├── unix/ │ │ │ ├── unixsignalhandler.cpp │ │ │ └── unixsignalhandler.h │ │ ├── win/ │ │ │ ├── winplatform.cmake │ │ │ ├── winplatform.cpp │ │ │ ├── winplatform.h │ │ │ ├── winplatformclipboard.cpp │ │ │ ├── winplatformclipboard.h │ │ │ ├── winplatformwindow.cpp │ │ │ └── winplatformwindow.h │ │ └── x11/ │ │ ├── systemclipboard/ │ │ │ ├── CMakeLists.txt │ │ │ ├── keyboard-shortcuts-inhibit-unstable-v1.xml │ │ │ ├── waylandclipboard.cpp │ │ │ ├── waylandclipboard.h │ │ │ └── wlr-data-control-unstable-v1.xml │ │ ├── x11info.cpp │ │ ├── x11info.h │ │ ├── x11platform.cmake │ │ ├── x11platform.cpp │ │ ├── x11platform.h │ │ ├── x11platformclipboard.cpp │ │ ├── x11platformclipboard.h │ │ ├── x11platformwindow.cpp │ │ └── x11platformwindow.h │ ├── scriptable/ │ │ ├── commandhelp.cpp │ │ ├── commandhelp.h │ │ ├── scriptable.cpp │ │ ├── scriptable.h │ │ ├── scriptablebytearray.cpp │ │ ├── scriptablebytearray.h │ │ ├── scriptabledir.cpp │ │ ├── scriptabledir.h │ │ ├── scriptablefile.cpp │ │ ├── scriptablefile.h │ │ ├── scriptableitemselection.cpp │ │ ├── scriptableitemselection.h │ │ ├── scriptablenetworkreply.cpp │ │ ├── scriptablenetworkreply.h │ │ ├── scriptablenetworkrequest.cpp │ │ ├── scriptablenetworkrequest.h │ │ ├── scriptableproxy.cpp │ │ ├── scriptableproxy.h │ │ ├── scriptablesettings.cpp │ │ ├── scriptablesettings.h │ │ ├── scriptabletemporaryfile.cpp │ │ ├── scriptabletemporaryfile.h │ │ ├── scriptoverrides.h │ │ └── scriptvaluefactory.h │ ├── tests/ │ │ ├── itemencryptedtests.cpp │ │ ├── itemencryptedtests.h │ │ ├── itemfakevimtests.cpp │ │ ├── itemfakevimtests.h │ │ ├── itemimagetests.cpp │ │ ├── itemimagetests.h │ │ ├── itempinnedtests.cpp │ │ ├── itempinnedtests.h │ │ ├── itemsynctests.cpp │ │ ├── itemsynctests.h │ │ ├── itemtagstests.cpp │ │ ├── itemtagstests.h │ │ ├── itemtests/ │ │ │ ├── itemtests.cpp │ │ │ └── itemtests.h │ │ ├── test_utils.h │ │ ├── testinterface.h │ │ ├── tests.cmake │ │ ├── tests.cpp │ │ ├── tests.h │ │ ├── tests_classes.cpp │ │ ├── tests_cli.cpp │ │ ├── tests_commands.cpp │ │ ├── tests_common.cpp │ │ ├── tests_common.h │ │ ├── tests_dialogs.cpp │ │ ├── tests_drag_n_drop.cpp │ │ ├── tests_encryption.cpp │ │ ├── tests_encryption_expire.cpp │ │ ├── tests_expire.cpp │ │ ├── tests_import_export.cpp │ │ ├── tests_items.cpp │ │ ├── tests_navigation.cpp │ │ ├── tests_other.cpp │ │ ├── tests_playsound.cpp │ │ ├── tests_script_commands.cpp │ │ ├── tests_scripts.cpp │ │ ├── tests_slow_clipboard.cpp │ │ └── tests_tray.cpp │ ├── ui/ │ │ ├── aboutdialog.ui │ │ ├── actiondialog.ui │ │ ├── actionhandlerdialog.ui │ │ ├── addcommanddialog.ui │ │ ├── clipboarddialog.ui │ │ ├── commanddialog.ui │ │ ├── commandedit.ui │ │ ├── commandwidget.ui │ │ ├── configtabappearance.ui │ │ ├── configtabgeneral.ui │ │ ├── configtabhistory.ui │ │ ├── configtablayout.ui │ │ ├── configtabnotifications.ui │ │ ├── configtabtray.ui │ │ ├── configurationmanager.ui │ │ ├── importexportdialog.ui │ │ ├── itemorderlist.ui │ │ ├── logdialog.ui │ │ ├── mainwindow.ui │ │ ├── pluginwidget.ui │ │ ├── shortcutdialog.ui │ │ ├── shortcutswidget.ui │ │ ├── tabdialog.ui │ │ └── tabpropertieswidget.ui │ ├── version.cmake │ └── version_file.cmake ├── translations/ │ ├── copyq_ar.ts │ ├── copyq_ca.ts │ ├── copyq_cs.ts │ ├── copyq_da.ts │ ├── copyq_de.ts │ ├── copyq_el.ts │ ├── copyq_es.ts │ ├── copyq_et.ts │ ├── copyq_fa.ts │ ├── copyq_fi.ts │ ├── copyq_fr.ts │ ├── copyq_ga.ts │ ├── copyq_he.ts │ ├── copyq_hr.ts │ ├── copyq_hu.ts │ ├── copyq_id.ts │ ├── copyq_it.ts │ ├── copyq_ja.ts │ ├── copyq_kab.ts │ ├── copyq_ko.ts │ ├── copyq_lt.ts │ ├── copyq_nb.ts │ ├── copyq_nl.ts │ ├── copyq_pl.ts │ ├── copyq_pt_BR.ts │ ├── copyq_pt_PT.ts │ ├── copyq_ru.ts │ ├── copyq_sk.ts │ ├── copyq_sv.ts │ ├── copyq_tr.ts │ ├── copyq_uk.ts │ ├── copyq_vi.ts │ ├── copyq_zh_CN.ts │ └── copyq_zh_TW.ts └── utils/ ├── bump_version.sh ├── copy_files.sh ├── create_source_package.sh ├── fix-translations.py ├── fosshub.py ├── generata-big-data-tab.sh ├── github/ │ ├── build-macos-deps.sh │ ├── build-windows-deps.sh │ ├── deploy-windows.sh │ ├── test-linux-global-shortcuts.sh │ ├── test-linux-gnome-extension.sh │ ├── test-linux-wayland.sh │ ├── test-linux.sh │ ├── test-macos.sh │ ├── test-signals.sh │ └── test-start-server.sh ├── gitlab/ │ ├── build-before_script.sh │ ├── build-script.sh │ ├── test-before_script.sh │ ├── test-script.sh │ ├── test_gui-before_script.sh │ └── test_gui-script.sh ├── linux_make_icons.sh ├── lupdate.sh ├── make_icns.sh ├── make_ico.sh ├── patches/ │ └── knotifications/ │ └── 0001-Support-updating-Snore-notifications.patch ├── sanitize.sh ├── script_docs_to_cpp.py ├── sign_released_files.sh ├── update_icon_font.py └── windows_copyq_update.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .claude/settings.json ================================================ { "permissions": { "allow": [ "Bash(cmake -B build :*)", "Bash(build/copyq-tests :*)", "Bash(build/copyq :*)" ] }, "env": { "COPYQ_SESSION_NAME": "test", "COPYQ_SETTINGS_PATH": "build/copyq-test-conf", "COPYQ_ITEM_DATA_PATH": "build/copyq-test-data", "COPYQ_PLUGINS": "", "COPYQ_DEFAULT_ICON": "1", "COPYQ_SESSION_COLOR": "#f90", "COPYQ_THEME_PREFIX": "$PWD/shared/themes", "COPYQ_PASSWORD": "TEST123", "COPYQ_LOG_LEVEL": "DEBUG", "QT_LOGGING_RULES": "*.debug=true;qt.*.debug=false", "QT_QPA_PLATFORM": "minimal" } } ================================================ FILE: .github/CODEOWNERS ================================================ * @hluk ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us fix problems. title: '' labels: bug assignees: '' --- **Describe the bug** **To Reproduce** **Expected behavior** **Screenshots** **Version, OS and Environment** - Application Version (for example 10.0.0) - OS (for example Windows 11, Ubuntu 24.04, Fedora 42, macOS Sonoma 14.4) - Desktop environment, window manager (if applicable) - Installation method (for example Windows installer, portable zip, Flatpak, Homebrew, manual build) **Additional context** ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project. title: '' labels: feature assignees: '' --- **Is your feature request related to a problem? Please describe.** **Describe the solution you'd like** **Describe alternatives you've considered** **Additional context** ================================================ FILE: .github/actions/download-miniaudio/action.yml ================================================ name: Download miniaudio description: Downloads and verifies miniaudio.h from a pinned commit (cached) runs: using: composite steps: - name: Set miniaudio version shell: bash run: | # 0.11.25 echo 'MINIAUDIO_COMMIT=9634bedb5b5a2ca38c1ee7108a9358a4e233f14d' >> "$GITHUB_ENV" echo 'MINIAUDIO_SHA256=ac7af4de748b7e26b777f37e01cee313a308a7296a3eb080e2906b320cc55c89' >> "$GITHUB_ENV" - name: Cache miniaudio header id: cache uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: src/miniaudio.h key: miniaudio-${{ env.MINIAUDIO_COMMIT }} - name: Download and verify miniaudio if: steps.cache.outputs.cache-hit != 'true' shell: bash run: | curl -sSLo src/miniaudio.h --fail-with-body --retry 3 \ "https://raw.githubusercontent.com/mackron/miniaudio/$MINIAUDIO_COMMIT/miniaudio.h" if command -v sha256sum >/dev/null 2>&1; then sha256cmd='sha256sum -c' elif command -v shasum >/dev/null 2>&1; then sha256cmd='shasum -a 256 -c' else echo '::error::No SHA-256 utility found'; exit 1 fi echo "$MINIAUDIO_SHA256 src/miniaudio.h" | $sha256cmd ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" ================================================ FILE: .github/workflows/build-linux.yml ================================================ --- name: Linux on: push: branches: [master] pull_request: branches: [master] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: common_packages: >- ninja-build libxfixes-dev libxtst-dev extra-cmake-modules libwayland-dev gnupg2 xvfb openbox xdotool qt6_packages: >- libegl-dev qt6-base-private-dev qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools qt6-declarative-dev libqt6svg6-dev libqt6svg6 libkf6guiaddons-dev libkf6guiaddons libqt6waylandclient6 qt6-wayland qt6-wayland-dev qt6-wayland-dev-tools libqca-qt6-dev libqca-qt6-2 libqca-qt6-plugins qtkeychain-qt6-dev qt5_packages: >- qtbase5-dev qtbase5-dev-tools qtbase5-private-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools libqt5x11extras5-dev libqt5svg5-dev libqt5svg5 libqt5waylandclient5-dev qtwayland5 qtwayland5-dev-tools libkf5notifications-dev libqca-qt5-2-dev libqca-qt5-2 libqca-qt5-2-plugins qtkeychain-qt5-dev # FIXME: Sending signal to client process does not cause the process # to exit with non-zero code with GitHub Actions. Why? COPYQ_TESTS_SKIP_SIGNAL: '1' jobs: build: name: ${{matrix.buildname}} runs-on: ${{matrix.os}} strategy: # Avoid canceling all jobs on transient failures. fail-fast: false matrix: include: - os: ubuntu-22.04 buildname: Qt 5 compiler: g++ compiler_package: g++ with_qt6: false with_native_notifications: true cmake_preset: Debug - os: ubuntu-latest buildname: Qt 6 compiler: g++ compiler_package: g++ with_qt6: true with_native_notifications: false test_wayland: true test_gnome: true coverage: true cmake_preset: Debug compiler_flags: >- --coverage -fprofile-arcs -ftest-coverage -fprofile-abs-path -fprofile-update=atomic - os: ubuntu-latest buildname: Qt 6 Clang compiler: clang++ compiler_package: clang with_qt6: true with_native_notifications: false cmake_preset: Debug steps: - name: Checkout source code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5 with: submodules: false fetch-depth: 1 - name: Enable ccache uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 # v1.2 with: key: ${{ github.job }}-${{ matrix.os }} - name: Set up ccache run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - name: Install dependencies uses: awalsh128/cache-apt-pkgs-action@acb598e5ddbc6f68a970c5da0688d2f3a9f04d05 # v1 with: version: 1.0 packages: >- ${{ matrix.compiler_package }} ${{ env.common_packages }} ${{ matrix.with_qt6 && env.qt6_packages || env.qt5_packages }} ${{ matrix.coverage && 'lcov' || '' }} ${{ matrix.coverage && 'kwin-wayland kwin-wayland-backend-virtual libwayland-server0 procps' || '' }} ${{ matrix.test_gnome && 'gnome-shell gnome-shell-common glib2.0-bin' || '' }} - name: Download miniaudio uses: ./.github/actions/download-miniaudio - name: Build with CMake uses: lukka/run-cmake@af1be47fd7c933593f687731bc6fdbee024d3ff4 # v10 with: configurePreset: '${{ matrix.cmake_preset }}' buildPreset: '${{ matrix.cmake_preset }}' configurePresetAdditionalArgs: >- [ '-DCMAKE_CXX_COMPILER=${{matrix.compiler}}', '-DCMAKE_CXX_FLAGS=${{matrix.compiler_flags}}', '-DCMAKE_C_FLAGS=${{matrix.compiler_flags}}', '-DWITH_QT6=${{matrix.with_qt6}}', '-DWITH_NATIVE_NOTIFICATIONS=${{matrix.with_native_notifications}}' ] - name: Create gnupg directory for tests run: mkdir -p ~/.gnupg && chmod go-rwx ~/.gnupg - name: Test on GNOME working-directory: >- ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }} if: matrix.test_gnome run: '${{github.workspace}}/utils/github/test-linux-gnome-extension.sh' env: COPYQ_TESTS_EXECUTABLE: >- ${{runner.workspace}}/install/copyq/${{ matrix.cmake_preset }}/bin/copyq - name: Test on Wayland working-directory: >- ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }} if: matrix.test_wayland run: '${{github.workspace}}/utils/github/test-linux-wayland.sh' env: COPYQ_TESTS_EXECUTABLE: >- ${{runner.workspace}}/install/copyq/${{ matrix.cmake_preset }}/bin/copyq - name: Test on X11 working-directory: >- ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }} run: '${{github.workspace}}/utils/github/test-linux.sh' env: COPYQ_TESTS_EXECUTABLE: >- ${{runner.workspace}}/install/copyq/${{ matrix.cmake_preset }}/bin/copyq COPYQ_TESTS_SKIP_DRAG_AND_DROP: >- ${{ matrix.with_qt6 && '0' || '1' }} - name: Update coverage if: matrix.coverage working-directory: >- ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }} run: | lcov --capture --directory . \ --base-directory '${{github.workspace}}' \ --no-external \ --rc branch_coverage=1 \ --rc geninfo_no_exception_branch=1 \ --output-file coverage-full.info # Remove 3rd party files in source tree lcov --remove coverage-full.info \ '*/plugins/itemfakevim/fakevim/*' \ '*/src/gui/fix_icon_id.h' \ --output-file coverage.info - name: Upload coverage to Codecov if: matrix.coverage uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5 with: files: ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}/coverage.info fail_ci_if_error: true verbose: true token: ${{ secrets.CODECOV_TOKEN }} ================================================ FILE: .github/workflows/build-macos.yml ================================================ --- name: macOS on: push: branches: [master] tags: ['v*'] pull_request: branches: [master] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: QT_VERSION: '6.10.2' KF_VERSION: '6.23' KF_PATCH: '0' KF_BRANCH: stable QCA_VERSION: '2.3.10' QTKEYCHAIN_VERSION: '0.15.0' jobs: build: name: ${{matrix.buildname}} runs-on: ${{matrix.os}} strategy: # Avoid canceling all jobs on transient failures. fail-fast: false matrix: include: - os: macos-15-intel buildname: macOS 13 bundle_suffix: '-macos-13' cmake_preset: macOS-13 - os: macos-14 buildname: macOS 12 M1 bundle_suffix: '-macos-12-m1' cmake_preset: macOS-12-m1 steps: - name: Checkout source code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5 with: submodules: false fetch-depth: 0 - name: Enable ccache uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 # v1.2 with: key: ${{ github.job }}-${{ matrix.os }} max-size: 1G - name: Set up ccache run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - name: Install Qt uses: jurplel/install-qt-action@d325aaf2a8baeeda41ad0b5d39f84a6af9bcf005 # v4 with: version: ${{ env.QT_VERSION }} modules: qtimageformats qt5compat cache: true set-env: true - name: Set up dependency paths run: | DEPS_PREFIX=$GITHUB_WORKSPACE/deps/install # install-qt-action sets QT_ROOT_DIR but may not set CMAKE_PREFIX_PATH. echo "DEPS_PREFIX=$DEPS_PREFIX" >> "$GITHUB_ENV" echo "CMAKE_PREFIX_PATH=${DEPS_PREFIX};${QT_ROOT_DIR}" >> "$GITHUB_ENV" - name: Cache dependencies id: cache-deps uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: ${{ github.workspace }}/deps/install key: >- macos-deps-kf${{ env.KF_VERSION }}.${{ env.KF_PATCH }}-qca${{ env.QCA_VERSION }}-qtkeychain${{ env.QTKEYCHAIN_VERSION }}-${{ runner.arch }}-${{ hashFiles('utils/patches/**') }} - name: Build dependencies if: steps.cache-deps.outputs.cache-hit != 'true' run: '${{ github.workspace }}/utils/github/build-macos-deps.sh' - name: Download miniaudio uses: ./.github/actions/download-miniaudio - name: Build with CMake uses: lukka/run-cmake@af1be47fd7c933593f687731bc6fdbee024d3ff4 # v10 with: configurePreset: '${{ matrix.cmake_preset }}' buildPreset: '${{ matrix.cmake_preset }}' - name: Create gnupg directory for tests run: mkdir -p ~/.gnupg && chmod go-rwx ~/.gnupg - name: Get version string id: version run: | version=$(git describe --tags --always HEAD | sed -E \ -e 's/^v([0-9]+\.[0-9]+\.[0-9]+)/\1/' \ -e 's/-([0-9]+).*/\.\1/') echo "version=$version" >> "$GITHUB_OUTPUT" echo "Version: $version" - name: Create macOS bundle working-directory: '${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}' # Retry cpack due to frequent errors: "hdiutil: create failed - Resource busy" run: (cpack || cpack || cpack) && mv -v copyq-*.dmg 'CopyQ-${{ steps.version.outputs.version }}${{ matrix.bundle_suffix }}.dmg' - name: Upload macOS bundle uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v4 with: name: 'CopyQ-${{ steps.version.outputs.version }}${{ matrix.bundle_suffix }}.dmg' path: '${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}/CopyQ-${{ steps.version.outputs.version }}${{ matrix.bundle_suffix }}.dmg' - name: Test working-directory: '${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}' run: '${{github.workspace}}/utils/github/test-macos.sh' - name: Upload crash reports if: failure() uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v4 with: name: 'crash-reports${{ matrix.bundle_suffix }}' path: '~/Library/Logs/DiagnosticReports/*' if-no-files-found: ignore release: if: startsWith(github.ref, 'refs/tags/v') needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Download artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 - name: Upload to release uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2 with: draft: true files: 'CopyQ-*/*.dmg' ================================================ FILE: .github/workflows/build-windows.yml ================================================ --- name: Windows on: push: branches: [master] tags: ['v*'] pull_request: branches: [master] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: QT_VERSION: '6.10.2' KF_VERSION: '6.23' KF_PATCH: '0' KF_BRANCH: stable SNORETOAST_VERSION: '0.9.1' QCA_VERSION: '2.3.10' QTKEYCHAIN_VERSION: '0.15.0' COPYQ_TESTS_SKIP_DRAG_AND_DROP: '1' COPYQ_TESTS_SKIP_BASH: '1' COPYQ_TESTS_NO_SYMLINKS: '1' # There is no audio device on the CI system COPYQ_TESTS_SKIP_AUDIO: '1' jobs: build: name: Windows runs-on: windows-2025 defaults: run: shell: bash steps: - name: Checkout source code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5 with: submodules: false # Full history needed for git describe (version string). fetch-depth: 0 - name: Set up MSVC uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1 with: arch: x64 - name: Install Qt uses: jurplel/install-qt-action@d325aaf2a8baeeda41ad0b5d39f84a6af9bcf005 # v4 with: version: ${{ env.QT_VERSION }} arch: win64_msvc2022_64 modules: qtimageformats qt5compat cache: true set-env: true - name: Set OpenSSL path run: echo "OPENSSL_ROOT_DIR=C:/Program Files/OpenSSL" >> "$GITHUB_ENV" - name: Enable sccache uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 # v1.2 with: variant: sccache key: windows-msvc - name: Set up dependency paths run: | DEPS_PREFIX="${GITHUB_WORKSPACE}/deps/install" echo "DEPS_PREFIX=$DEPS_PREFIX" >> "$GITHUB_ENV" echo "$DEPS_PREFIX/bin" >> "$GITHUB_PATH" # Extend CMAKE_PREFIX_PATH with Qt and KDE deps. # install-qt-action sets QT_ROOT_DIR but may not set CMAKE_PREFIX_PATH. echo "CMAKE_PREFIX_PATH=${DEPS_PREFIX}/lib/cmake;${DEPS_PREFIX}/share/ECM/cmake;${QT_ROOT_DIR}/lib/cmake" >> "$GITHUB_ENV" - name: Cache KDE dependencies id: cache-deps uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: ${{ github.workspace }}/deps/install key: >- windows-deps -kf${{ env.KF_VERSION }}.${{ env.KF_PATCH }} -qca${{ env.QCA_VERSION }} -qtkeychain${{ env.QTKEYCHAIN_VERSION }} -snoretoast${{ env.SNORETOAST_VERSION }} -${{ hashFiles('utils/patches/**') }} - name: Build KDE dependencies if: steps.cache-deps.outputs.cache-hit != 'true' run: utils/github/build-windows-deps.sh - name: Download miniaudio uses: ./.github/actions/download-miniaudio - name: Build with CMake uses: lukka/run-cmake@af1be47fd7c933593f687731bc6fdbee024d3ff4 # v10 env: VCPKG_ROOT: '' with: configurePreset: Windows buildPreset: Windows configurePresetAdditionalArgs: >- [ '-DWITH_NATIVE_NOTIFICATIONS=TRUE', '-DWITH_QCA_ENCRYPTION=TRUE', '-DWITH_KEYCHAIN=TRUE' ] - name: Get version string id: version run: | version=$(git describe --tags --always HEAD | sed -E \ -e 's/^v([0-9]+\.[0-9]+\.[0-9]+)/\1/' \ -e 's/-([0-9]+).*/\.\1/') echo "version=$version" >> "$GITHUB_OUTPUT" echo "Version: $version" - name: Deploy application run: utils/github/deploy-windows.sh env: APP_VERSION: ${{ steps.version.outputs.version }} BUILD_DIR: ${{ runner.workspace }}/build/copyq/Windows - name: Set up GPG for tests shell: pwsh run: | $env:PATH = "C:\Program Files\Git\usr\bin;$env:PATH" New-Item -ItemType Directory -Force "$HOME\.gnupg" | Out-Null gpg --version - name: Test working-directory: ${{ github.workspace }}/copyq-${{ steps.version.outputs.version }} shell: cmd run: | set "PATH=%CD%;C:\Program Files\Git\usr\bin" .\copyq-tests.exe env: QT_FORCE_STDERR_LOGGING: 1 COPYQ_LOG_LEVEL: DEBUG COPYQ_TESTS_RERUN_FAILED: 1 COPYQ_PLUGINS: ${{ github.workspace }}\copyq-${{ steps.version.outputs.version }}\itemtests.dll - name: Create portable zip run: 7z a "copyq-${{ steps.version.outputs.version }}.zip" "copyq-${{ steps.version.outputs.version }}" - name: Build installer shell: cmd run: | "%ProgramFiles(x86)%\Inno Setup 6\ISCC.exe" /O"%GITHUB_WORKSPACE%" ^ /DAppVersion="${{ steps.version.outputs.version }}" ^ /DRoot="%GITHUB_WORKSPACE%\copyq-${{ steps.version.outputs.version }}" ^ /DSource="%GITHUB_WORKSPACE%" ^ "%GITHUB_WORKSPACE%\shared\copyq.iss" - name: Upload portable zip uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: copyq-${{ steps.version.outputs.version }}.zip path: copyq-${{ steps.version.outputs.version }}.zip - name: Upload installer uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: copyq-${{ steps.version.outputs.version }}-setup.exe path: copyq-${{ steps.version.outputs.version }}-setup.exe release: if: startsWith(github.ref, 'refs/tags/v') needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Download artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 - name: Upload to release uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2 with: draft: true files: | copyq-*/*.zip copyq-*/*.exe ================================================ FILE: .github/workflows/codespell.yml ================================================ # Codespell configuration is within .codespellrc --- name: Codespell on: push: branches: [master] pull_request: branches: [master] permissions: contents: read jobs: codespell: name: Check for spelling errors runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5 - name: Codespell uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2 ================================================ FILE: .gitignore ================================================ # Generated CMake files CMakeFiles/ CMakeCache.txt cmake_install.cmake # Generated Visual Studio files /plugins/Debug/ /plugins/Release/ /plugins/Win*/ /Debug/ /Release/ /Win*/ *.sln *.suo *.*sdf *.vc?proj* # Generated Makefiles /plugins/Makefile /plugins/*/Makefile /src/Makefile /Makefile # Generated Qt files /plugins/**/*.dir/ /src/copyqcon.dir/ /src/copyq.dir/ /src/copyq_*.qm /src/copyq_*.qm.rule /src/qrc_copyq.cxx /src/translations.qrc /src/qrc_translations.cxx moc_* ui_* *.depends *.o *.dylib *.moc **/qrc_*.cpp /.qmake.cache /copyq.app copyq.pro.user* CMakeLists.txt.user* .DS_Store .qmake.stash *.pyc *.dmg /build* *.qm # Generated Sphinx files /docs/_build # Generated Flatpak files /shared/flatpak/.flatpak-builder /shared/flatpak/copyq # Visual Studio Code /.vscode # Files for utils/launchpad/build.sh .gitconfig launchpad.key ================================================ FILE: .gitlab-ci.yml ================================================ --- image: ubuntu:24.04 variables: BUILD_DIR: "build" INSTALL_PREFIX: "copyq" SCREENSHOT_DIR: "screenshots" TESTS_LOG_DIR: "logs" DEBIAN_FRONTEND: "noninteractive" build: stage: build before_script: - utils/gitlab/build-before_script.sh script: - utils/gitlab/build-script.sh # Upload installed application. artifacts: paths: - "$INSTALL_PREFIX" cache: paths: - build # Run simple tests (doesn't require GUI) test: stage: test before_script: - utils/gitlab/test-before_script.sh script: - utils/gitlab/test-script.sh dependencies: - build # GUI tests (requires X11) test_gui: stage: test before_script: - utils/gitlab/test_gui-before_script.sh script: - utils/gitlab/test_gui-script.sh # Upload screenshots on failure. artifacts: when: on_failure paths: - "$SCREENSHOT_DIR" - "$TESTS_LOG_DIR" dependencies: - build ================================================ FILE: .pre-commit-config.yaml ================================================ --- repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-executables-have-shebangs - id: check-merge-conflict - id: check-xml - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace ================================================ FILE: .readthedocs.yaml ================================================ # Read the Docs configuration file for Sphinx projects # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details --- version: 2 build: os: ubuntu-22.04 tools: python: "3.11" sphinx: configuration: docs/conf.py python: install: - requirements: docs/requirements.txt ================================================ FILE: .weblate ================================================ [weblate] url = https://hosted.weblate.org/api/ translation = copyq/master ================================================ FILE: AGENTS.md ================================================ ## Commands Always use the following environment variables for all `build/copyq` and `build/copyq-tests` commands: export COPYQ_SESSION_NAME="test" export COPYQ_SETTINGS_PATH="build/copyq-test-conf" export COPYQ_ITEM_DATA_PATH="build/copyq-test-data" export COPYQ_PLUGINS="" export COPYQ_DEFAULT_ICON="1" export COPYQ_SESSION_COLOR="#f90" export COPYQ_THEME_PREFIX="$PWD/shared/themes" export COPYQ_PASSWORD="TEST123" export COPYQ_LOG_LEVEL="DEBUG" export QT_LOGGING_RULES="*.debug=true;qt.*.debug=false" export QT_QPA_PLATFORM="xcb" Run CMake to configure build: cmake -B build -G Ninja \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_EXPORT_COMPILE_COMMANDS=1 \ -DCMAKE_INSTALL_PREFIX=$PWD/build/install \ -DCMAKE_CXX_FLAGS="-ggdb -fdiagnostics-color" \ -DWITH_TESTS=ON \ -DPEDANTIC=ON . Build: `cmake -B build --build` Install: `cmake -B build --target install` Tests require X11 session (or Wayland) and a window manager. Use `Xvfb` and `openbox` to initialize the testing environment. Avoid running all tests, always specify a list tests functions to run. Run tests after build: `build/copyq-tests $TEST_FUNCTIONS` Run tests for specific plugin: `build/copyq-tests PLUGINS:sync $TEST_FUNCTIONS` List tests function names: `build/copyq-tests -functions` List tests function names for a plugin: `build/copyq-tests PLUGINS:image -functions` Start the server process: `build/copyq` In case any process exits with exit code 11 (SIGSEGV) use `coredumpctl` utility to find the root cause. Stop the server process: `build/copyq exit` List server and client logs (server process does not need to run): `build/copyq logs` Run a script - requires server to be running: build/copyq source script.js # the above command is equivalent to build/copyq 'source("script.js")' Scripting API documentation is in @docs/scripting-api.rst. After changing it, run @utils/script_docs_to_cpp.py to update the completion popup in the GUI. Useful scripts (omit the `tab(...)` call to use the default tab): - `tab('TAB1'); add('ITEM')` - prepend ITEM text item to the TAB1 tab - `tab('TAB1'); size()` - item count in the TAB1 tab - `tab('TAB1'); read(0,1,2)` - read items at indexes 0, 1 and 2 in the TAB1 tab - `config()` - list configuration options with current value and description - `config('check_clipboard', 'false')` - set an option ## Project structure - @plugins - code for various plugins build as dynamic modules loaded optionally by the app - @src - main app code - @src/app - wrappers for QCoreApplication object - @src/common - common functionality, client/server local socket handling, logging - @src/gui - GUI widgets and some helper modules - @src/item - tab and item data handling, serialization code - @src/platform - platform-specific code - @src/scriptable - scripting capabilities - @src/tests - tests for the main app - @src/ui - Qt widget definition files (XML) - @qxt - code to handle global system-wide shortcuts ================================================ FILE: AUTHORS ================================================ Adam Batkin Giacomo Margarito Greg Carp Ilya Plenne Jörg Thalheim Kim Jzhone Kos Ivantsov lightonflux Lukas Holecek Marjolein Hoekstra Martin Lepadusch Matt d'Entremont Michal Čihař Patricio M. Ros Robert Orzanna Ryan Wooden Scott Kostyshak Sebastian Schuberth Tomas Nilzon Wilfried Caruel x2357 ================================================ FILE: CHANGES.md ================================================ # 13.0.0 ## Added - Windows: Preferences now include auto-start option, previously available only in the installer. ## Changed - Tabs synchronized with a directory on the disk will now include files from sub-directories (#2638). - Filtering/searching items in large tabs no longer blocks UI (#3111, #3261). ## Fixed - Fixes saving edited HTML and setting style in internal editor (#3227). - Fixes updating selected item colors (#3219). - Wayland: Fixes clipboard access in KDE Plasma 6.5 (#3228). This requires KGuiAddons library installed on the system. # 12.0.1 ## Fixed - X11: Fixes registering global shortcuts with modifiers (#3212). - macOS: Fixes providing builds for Intel architecture. - Fixes maximum length for session name (it is 16 characters as the error message says, not 15). # 12.0.0 ## Added - Wayland: Global shortcuts are now registered using Portal if available. - Black theme (#3142). Thanks to @FadeMind. - Adds attributes for controlling the dialog window created via `dialog()` (#2947): `.onTop` makes the dialog stay on top of other windows, `.modal` makes the dialog modal (blocks interaction with other windows in the application until closed). - Adds support showing icon font symbol in notes using `application/x-copyq-item-icon` format. - Adds support for setting colors in theme files by name. For example: `edit_bg=white`. ## Changed - Temporary tabs that are not stored on disk will now not expire if configuration changes (#3172). - Pinned and locked items will not be dropped if tab size (maximum item count) changes (#3008). - The app now propagates exit code properly if it is aborted or receives a Unix signal (SIGINT, SIGTERM). - Support for Qt older than 5.15 has been dropped. - The build now uses Qt 6 by default. Use `cmake -DWITH_QT6=OFF ...` to build the app for Qt 5. - Windows: The application will be now hidden from screenshots and screen recordings by default (#3165). This can be disabled using option "Hide from screenshots and recordings". - Logs are now stored in multiple files based on the process and the log records have a slightly different format (start with timestamp). ## Fixes - Drops unsafe sanitizing QTextDocument fonts (#3156). Qt 6 should handle any rich texts safely now. - Logging now does not use lock files and avoids crashes if the application loop was not yet started. - Avoids resetting properties of a tab if it is renamed. - Fixes setting color for item counter (#2717). - Fixes editing and providing UTF-8 text by default (#3093). - Fixes updating item preview if when window is shown. - Fixes changing synchronization directory for a tab. - Fixes possible crash if calling a function with unexpected function argument. - Fixes background of the command line in some themes in FakeVim plugin. - Fixes renaming tabs with item storing disabled. - Avoids collapsing tab in the tab tree after it is moved. - Fixes item counter value after moving the tab in the tab tree. - Fixes moving tab group with items in the tab tree. - Linux: Fixes storing the first clipboard change after starting the app and modifying configuration. - Linux: Avoids exiting on commit data request from the session manager (#3145). # 11.0.0 ## Added - Adds support for dark/light window title scheme. - New `frameless_window` option (#2570) toggles the main window frame and title bar (if supported by the window manager): copyq toggleConfig frameless_window - Adds support for localizing command names in the command INI files (#3032): [Command] Name = ... Name_cs = ... Name_fr = ... Name_pt_BR = ... Name_pt = ... - Adds support for showing preview for more image formats (namely ico and webp). - Adds support for more complex network requests in scripts. New `NetworkRequest` class can be used to set custom headers, HTTP method, number of allowed redirects and timeout. ## Changed - Avoids hiding the main window on backspace (#3107). - Enables Vi/Emacs navigation (#3012) in menus, and `Ctrl+[` in Vi and `Ctrl+G` in Emacs to work in many other places as `Esc` key (for example, to hide menus, dialogs). Users can override shortcuts, but not some reserved ones in specific cases (mainly, if the item list or a menu has focus). - Selections and current items/rows/data in scripts now only relate to the tab selected with `tab(...)` in scripts (this is still by default the selected tab when the command started). Affected script functions: - `move()` - `setData()` - `removeData()` - `selectedItems()` - `selectedItemData()` - `setSelectedItemData()` - `setSelectedItemsData()` - `currentItem()` - `ItemSelection().current()` - Drops unnecessary timeouts when executing commands and actions from scripts. - Avoids fetching and passing clipboard to `action()`/`execute()` if the commands do not contains `%1` placeholder. This can improve performance. ## Fixed - Fixes `dialog()`: custom size, layout and resizing (#3003). - Fixes overriding filter/search string with `filter()` (previously the new value was appended to the current filter). - Fixes refocusing the item after editing its notes. - Synchronize plugin: Fixes missing data in the last item when tab is full. - Windows: Fixes the icon for uninstaller (#2864). - Fixes build for Qt 6.9 and above. - Fixes potentially misconfigured log file path at app start (#3087). - Linux: Avoids auto-hiding the main window when moved on some window managers (#3119). # 10.0.0 ## Added - Emacs navigation key-bindings support. - Adds support for setting urgency and persistency to notifications. Script function `notification()` takes new arguments: '.urgency' (low, normal, high, critical), '.persistent' (toggle persistent notification) ## Changed - Updates icon font from Font-Awesome 6.7.2. - On Windows, the main window is shown when starting the application using the program icon (#2965). - Calling `exit()` script function prints "Terminating server" on stderr instead of stdout. ## Fixed - Fixes item selection with Ctrl+Space (#2850). - Fixes confirming exit if any commands are running. - Fixes selecting specific row on search (#2770). - Clipboard data cloning will be now aborted if the data changes during the process. This avoids using incomplete data in rare cases. - Fixes contrast of the selected row number color (#2887). The row number text color of selected item is set to the same color as item text by default. This can be overridden via "Edit Theme" button using option `num_sel_fg`. - Fixes internal editor syntax highlighting for numbers containing separators (for example `100_000`, `0x1234_abcd`) and avoids incorrectly highlighting multiple lines as regular expression in some cases. - On GNOME (Wayland session), the clipboard monitor and provider processes run in XWayland mode because GNOME does not support Wayland data control protocol. This behavior can be skipped by settings `QT_QPA_PLATFORM` environment variable to "wayland" (or other value). - On Wayland compositors, fixes unnecessary application start delay if clipboard access (the data control protocol) is not supported. - On Linux, the "Ignore items with no or single character" predefined command properly avoids synchronizing empty text or single character. - On Linux, fixes waiting on keyboard modifiers release when synchronizing selection. - Avoids recursive item preview updates when using display commands. - Avoids removing items if drag'n'drop action fails. - Wayland: Fixes crash if getting owned clipboard data. - Wayland: Fixes setting UTF-8 text on broken GNOME's XWayland. # 9.1.0 ## Added - Allows processing all clipboard changes (#2787, #2746). If clipboard contains secret (for example is copied from a password manager), `onSecretClipboardChanged()` script function is called with data containing `mimeSecret` format set to `1`. Also ensures that callbacks are called consistently for all clipboard changes with properly set formats `mimeClipboardMode`, `mimeOutputTab` and `mimeCurrentTab`. ## Fixed - Fixes editing multiple items (#2810). - Fixes synchronization plugin causing redundant UI updates and menu misbehavior (#2649). - Fixes showing sub-menus for custom commands in tray menu (#2730). - Fixes switching tab if `onItemsLoaded()` is overridden (#2788). - Fixes theme option `hover_item_css` (#2687). - Avoids modifying data from display commands and causing redundant UI updates (#2837). - Avoids sharing execute() state in case it is launched recursively. # 9.0.0 ## Added - Adds `editItem()` script function for editing any item format (#2672). - Item color is now shown in tray menu as the default icon (#2700). ## Changed - Removes large margins in the tab tree. - Single action "Toggle Tag …" replaces the two separate actions "Tag as …" and "Remove tag …" for each custom tag (this can make the item context menu a lot more compact). - Selected items can now be accessed even from commands started from outside the app using global commands or from command line. - The `dialog()` script function can now be used for asking Yes/No questions without providing any fields. In such case, the function will return `true` instead of `undefined` after accepting the dialog. For example: const remove = dialog( '.title', 'Remove Items', '.label', 'Do you really want to remove all items?' ); if (!remove) abort(); // remove items ... - The `execute()` script function now throws an exception when command cannot be executed instead of returning `undefine`. ## Fixed - Includes many performance improvements for working with large amount of items. - Fixes triggering menu items by number (#2569). - Fixes text color in the internal item editor (#2643). - Fixes showing global shortcuts in tray menu (#2382). - Fixes passing captured texts to automated commands (#2707). - Fixes duplicate synchronized items after tagging or modifying data. - Fixes situation when display commands stop updating items. - The pre-defined "Move to tab" action will be shown only if the current tab is not the same as target tab (#2669). Previously, in such case the item was removed unexpectedly. - Windows: Detect and ignore secrets from more apps (#2679). - Linux: Fixes storing previously synchronized clipboard (#2630). - Linux: Fixes storing selection when "Store text selected using mouse" option is enabled but "Run automatic commands on selection" is disabled (#2651). - Linux: Fixes clipboard synchronization with Qt 6 GUI framework. - Linux: Fixes showing tab tree labels with Qt 6 GUI framework. # 8.0.0 ## Added - Tab item limit has been increased to 100,000 (#1144). - New macOS builds for M1/arm64 architectures are available (#1884). - New Debian/Raspbian builds for arm/arm64 architectures are available. - Allows overriding item activation using `paste()`. - Allows overriding script functions to handle some events: items added/removed/changed (`onItemsAdded()`, `onItemsRemoved()`, `onItemsChanged()`), tab items loaded (`onItemsLoaded()`), tab selected (`onTabSelected()`) (#59). - Allows to cancel removing items by overriding `onItemsRemoved()` script function. If the exit code is non-zero (for example `fail()` is called), items will not be removed. But this can also cause a new items not to be added if the tab is full. - Allows overriding current clipboard owner (`currentClipboardOwner()`) used by the clipboard monitor process. By default it uses `currentWindowTitle()`. - Allows using Ctrl+C to copy items even if search entry box is focused unless it has a selection (#2440). - Linux: Adds build option to disable X11 support (`cmake -DWITH_X11=OFF ...`) (#2532). - Linux: Adds build option to disable autostart which is useful mainly for Flatpak builds (#2517, #2518). ## Changed - Windows binaries (which are 64 bit) are now by default installed to "Program Files" instead of incorrect "Program Files (X86)". After installing the new version, the **old path must be manually removed**. - Windows and macOS builds are now based on newer Qt 6. - Avoids accessing clipboard from password managers (#2282, #2495, #2500). This disallows storing and processing such data. Specifically, the clipboard is ignored if it contains following data: `Clipboard Viewer Ignore` on Windows, `application/x-nspasteboard-concealed-type` on macOS, `x-kde-passwordManagerHint` with `secret` value on Linux. - Large data items in tabs are now stored in separate location unless Synchronize or Encryption plugins are active for the tab. This allows storing more items in tabs while using less memory. The data path can be printed via `copyq info data` command and overridden using `COPYQ_ITEM_DATA_PATH` environment variable. To disable this functionality use `copyq config item_data_threshold -1` - the default value is 1024 and items larger than this amount of bytes are stored in the separate location. - Command dialog now shows advanced properties for built-in commands allowing to copy the command line to set global shortcut in system. - Global shortcuts are now also visible in menus (#2382). - Avoids pasting all image formats as new item. - Display commands are now applied to tray menu items too. - Linux: Last stored text item is updated from any new mouse selection only if the item content matches the start or the end of the selection (but not the middle like previously). This may avoid some unexpected item updates. - Updates icon font from Font-Awesome 6.5.1. ## Fixed - Fixes drag'n'drop ordering for plugins and commands. This could have caused a missing icon, app crash or various inconsistencies. - Fixes managing keys with gpg 2.1 and above (#2463, #1208). - Fixes creating duplicate item with Synchronize plugin when adding a tag for example (#2355). - Fixes conflicting notes and text with Synchronize plugin (#2355) - Fixes deleted global object after running scripts (#2542). - Wayland: Fixes copying images to another app instance. # 7.1.0 ## Changed - Image editor (if set) will now open instead of built-in text editor when selecting Edit action on image items containing no text. - Encryption now uses larger/safer keys (#2385). ## Fixed - Fixes saving and opening empty encrypted tabs. - Fixes minimal size of dialogs (#2299). - Fixes importing commands with regular expressions containing slash characters in scripts. - Fixes font weight with Qt 6. - Fixes closing the app with Qt 6. - Fixes the build and calling some script functions with Qt 6.5. - X11: Fixes crash when entering search with some keyboard layouts (#2171). # 7.0.0 ## Added - Windows installer has an option to install for current user or all users (#1912). ## Changed - The preferred format to edit is now "text/plain;charset=utf-8" with "text/plain" as fallback. Additionally, if no such format is available, "text/uri-list" is used. - Toggle Clipboard Storing menu item uses static text and icon instead of changing these dynamically after each use (#2255). - Settings integrity is now handled solely by Qt. Previously, additional `*.bak` files where created for configuration files. - Commands are no longer migrated to the new format on start. The old command configuration file has been last used in version 3.9.0 (released on 2019-06-27). - Native notification text length is limited now to avoid slow downs when showing notifications in some desktop environments. The limit is about 100,000 characters and 100 lines. ## Fixed - Fixes Sort/Reverse Selected Items menu actions (#2267). - Fixes moving items to a tab in tab bar using drag'n'drop (#1246). - Fixes possibly buggy window manager frame geometry (#2247). # 6.4.0 ## Added - Items in menu can be additionally filtered using the item notes (#2170). - Items can be sorted with a custom order via scripting. For example: var sel = ItemSelection().selectAll(); const texts = sel.itemsFormat(mimeText); sel.sort(function(i,j){ return texts[i] < texts[j]; }); ## Changed - More shortcuts and even sequences of shortcuts can be now captured and assigned. This uses new QKeySequenceEdit UI widget from Qt framework. - UI uses the preferred sans-serif system font in the dark theme. ## Fixed - Fixes copying items in order they were selected (#2124). - Fixes re-selecting the edited item after external editor closes. - Fixes menu theme (#2139). - Avoids duplicating items from clipboard in synchronized tabs (#2236). - macOS: Fixes compatibility with macOS 10.15 (#2103). - Linux: Fixes synchronizing UTF-encoded text to/from primary selection (#2195) - Wayland: Avoids showing window after a screen is turned on. - Wayland: Avoids a rare crash while accessing clipboard data. - Wayland: Fixes pasting to some XWayland apps (#2234) - X11: Avoids app freeze when entering search mode (#2171). - X11: Fixes capturing quickly changing clipboard text (ignores unchanged TIMESTAMP). # 6.3.2 ## Fixed - Fixes potential crash when rendering an empty item list. # 6.3.1 ## Fixed - Fixes rendering issues (#1728, #2093). - Fixes the space between row number and the item content. This is customizable with `num_margin` theme option. - Fixes Qt 6 build. - Wayland: Fixes synchronizing selection with clipboard with UTF-8 text. - X11: Fixes tray window popup position on multi-monitor (#2038). # 6.3.0 ## Changed - UI margins are decreased leaving more space space for item content. - Script function `config()` now lists current values for each option (#412). Example of new `copyq config` output: ... clipboard_notification_lines=3 Number of lines to show for new clipboard content. Set to 0 to disable. clipboard_tab=&clipboard Name of tab that will automatically store new clipboard content. Leave empty to disable automatic storing. close_on_unfocus=false Close main window when other application has focus ... - FakeVim plugin improvements from upstream: * Ignores only full-line comments in configuration file * Support backslashes in substitute command patterns * Partial support for multi-repeat command (:g, :v) - Improves rendering item list speed. - Updates icon font from Font-Awesome 6.2.0 ## Fixed - Fixes showing window under mouse cursor (#2088). - In single-click-activate mode, multiple items can be selected while holding Shift or Ctrl (#2056). - The pre-defined command "Ignore items with no or single character" now also avoids synchronizing selection and showing popup if less than two characters where copied. - Wayland: Fixes synchronizing selection with clipboard in various cases. - Wayland: Fixes possible crash when managed clipboard data changes while it is accessed. # 6.2.0 ## Added - Tabs can now load at least some items from a partially corrupted data file dropping the rest of the items. - Simpler and safer data saving uses Qt framework (`QSaveFile`). - New `Settings` class in scripts can be used to manage INI configuration files (#1964). ## Changed - Obscure untested Save button has been removed from Action dialog. ## Fixed - Fixes restoring window geometry in a loop (#1946). - Fixes converting internal byte array representation in scripts in some rare cases. - Fixes tray menu appearance to follow the configuration (#1896). - The search history popup menu for will be closed if mouse wheel scrolls and mouse pointer is outside the menu (#1980). - macOS: Fixes pasting (#2012). - Windows: Fixes exiting the app on logout (#1249). - Windows: Workaround to treat native path separators properly and not as special escape characters. # 6.1.0 ## Added - Users can now customize shortcuts for the built-in editor (#708). - Users can now set default style sheet for HTML items to override for example color for hyperlinks with `a { color: lightblue }` (#1859). The new settings can be found under Item configuration tab under Text sub-tab. ## Changed - Window geometry (size and position) restoring is now simpler: The app sets geometry only initially and when the current screen/monitor changes. The mouse cursor position indicates the current screen. In case the app cannot inspect the mouse pointer position (for example on some Wayland compositors), it is left up to the window manager to decide to move the window to another screen. Users can still disable the automatic geometry by running the following command (in Action dialog or terminal) and restarting the app: copyq config restore_geometry false ## Fixed - Fixes moving items in synchronized tabs after activating them from the context menu (#1897). - Windows: Fixes tray icon tooltip (#1864). - Windows: External editor command now treats native path separators properly (#1894, #1868). - macOS: Fixes crash when pasting from the main window or menu (#1847). - macOS: Older versions of macOS (down to 10.15) are now supported again (#1866). - Wayland: Fixes using correct window title icon (#1910). - Wayland: Fixes retrieving UTF-8 encoded text from selection in environments which supports it. - Wayland: Fixes restoring window size without breaking window position (window position cannot be set in most or all Wayland compositors). # 6.0.1 ## Fixed - X11: Fixes global/system-wide shortcuts (#1860). # 6.0.0 ## Added - Native notifications now have lower urgency if the display interval is less than 10 seconds. This makes clipboard change notification less intrusive. - Preview dock can be focused with Tab key (#1826). Escape, Tab or Shift+Tab returns focus back to the item list. - All options are now documented/described when using command `copyq config`. - Command editor now supports highlighting multi-line strings enclosed by backticks (#1845). - New option to disable restoring window/dialog geometry (app needs to be restarted after changing the option): copyq config restore_geometry false - macOS: New option to enable native tray menu (#1652): copyq config native_tray_menu true - Support for building the source code with Qt 6 framework. ## Changed - While search bar is focused, pressing Down or PageDown key now selects next item without focusing the item list (#1834). - Internal commands (like ""Show/hide main window", Pin/Unpin, Encrypt/Decrypt) will now be automatically updated in following application releases or whenever the language changes. The side-effect is that only icon, shortcuts, enabled state and list order can be changed for these commands. Old internal commands added in previous versions (5.0.0 and lower) of the app need to be removed manually. - Increases the default delay for storing changed clipboard owner. This can help save correct window title for new clipboard content when the window is closed right after the copy operation. The delay can be changed using: copyq config change_clipboard_owner_delay_ms 500 - The application version now excludes the "v" prefix in UI and CLI. - Log Qt warnings by default (at Warning log level messages). - Linux: Other data formats are now stored for primary selection so as to support some automatic commands properly (for example, ignore selection when it contains a special format). Images and non-plain text formats are still ignored for performance reasons. ## Fixed - Drag'n'drop operations are now properly ended (#1809). - Main window will now open only inside the visible screen area (#1768). - "Clear Current Tab" command will no longer show a message dialog if there are pinned items (#1823). - Improves initial size for native tray menu. - Fixes removing backup file for old commands configuration. - Fixes broken item selection state (#1828). - Fixes hiding main window immediately when shown. This can be caused by long animations in window manager. - Further performance improvements for logging, application startup and file synchronization. - Linux: Native status icon (using D-Bus) is used by default instead of the legacy tray icon. Application start delay/sleep hacks should no longer be needed (#1526). - Wayland: Improved clipboard access. - Wayland: Fixes selection/clipboard synchronization. - Windows: Any application instance is now closed automatically before installation. # v5.0.0 ## Added - Search matches similar accented characters (#1318). For example, searching for "vacsina" would also show items containing "väčšina". - If the clipboard tab is renamed, clipboard will be still stored in the renamed tab. Similarly if a specific tab is set for tray menu. This basically modifies `clipboard_tab`, `tray_tab` options when renaming tabs. - New predefined command to clear the current tab. - Tabs can be reordered in Preferences (in addition to tab bar/tree). - Tabs can be reordered from command line or a script. For example: copyq 'config("tabs", ["&clipboard", "work", "study"])' - New buttons can move commands, tabs and plugins in configuration to top and bottom with a single click. This previously required dragging item to the top/bottom or multiple clicks on the move up/down buttons. - Script function `dialog()` supports non-editable combo box. For example: var choice = dialog('.combo:Select', ['a', 'b', 'c']) - Script function `dialog()` restores last position and size of dialog windows with matching title (set with `.title`). - Syntax highlighting for more script keywords. - New script class `ItemSelection` allows more powerful, consistent, safe and fast handling of multiple items. Examples: // move matching items to the top of the tab ItemSelection().select(/^prefix/).move(0) // remove all items from given tab but keep pinned items ItemSelection(tabName).selectRemovable().removeAll(); ## Changed - Simpler lock file mechanism is used instead of a system semaphore and shared memory lock (#1737). This allows to support more platforms. - Editor font from Appearance settings is used for the edit widget in Command and Action dialogs (#1757). - Theme does not modify the scrollbar in item list by default (#1751). ## Removed - Windows: Migrating old configuration from registry to file format is no longer supported. ## Fixed - Icons are rendered properly in About dialog. This uses correct icon font from the app instead the one installed on the system. - Correct UI layout direction is used depending on the selected language (#1696). - Automatic commands that use regular expressions for matching window title or clipboard content are imported properly (hluk/copyq-commands#45). - Native notifications are updated correctly when using existing notification ID. - Bash completion script is installed to a correct path. - macOS: Fixes pasting/copying when using different keyboard layouts (#1733). - macOS: Avoids focusing own window before paste operation (#1601). - macOS: Tries to paste directly to the process ID if the window ID is not available (#1395) (#1686). # v4.1.0 - Old notification system can now be used instead of native/system notifications (#1620). This can be disabled in Notifications tab in Preferences. - Additional configuration file for notifications will not be created automatically (#1638). - In scripting, `console` object can be used for logging, measuring elapsed time and asserting conditions. - `plugins.itempinned.mimePinned` contains item data format for pinned items (item is pinned if it contains the format). - Command completion menu contains more complete list of script objects/function and better description. - Action dialog command, `action()` and commands (if "Content"/filter regular expression is unset) now do not replace `%2` through `%9`. This allows passing URLs without requiring to escape encoded characters like `%20` or `%3A`. - Syntax highlighting for hexadecimal and boolean values in the command editor. - Fix moving the main window to different display/screen (#1624). - Windows: Native notifications are disabled on Windows 7 (#1623). This fixes crash because of unsupported features. - Windows: Fixed crash when loading some themes (#1621). - Wayland: Restores last stored geometry for a window (since getting current screen does not work). - MinGW Windows builds are available again (without native notification support). # v4.0.0 ## Features - Synchronization plugin newly keeps order of new items consistent between multiple application instances (#1558). Newly added items in one instance will appear at the top of other instances. - Search now finds separate words if regular expressions are disabled (#1569). Searching for "foo bar" will find items containing both "foo" and "bar" and the relative position of words no longer matter. - System notification popups are now used instead of own implementation. - Item rows in main window and tray menu are now indexed from one instead of zero by default (#1085). This can be reverted to the old behavior using command `copyq config row_index_from_one false`. - A tag can be marked as "locked" in configuration. Items with such tags cannot be removed until the tag is removed or "unlocked". - Command line completion for bash (#1460). Thanks, Jordan! - History combo box is focused when Action dialog opens to easily recall recent commands. Note: Focusing combo boxes is not supported on macOS. - Web plugin has been completely dropped (unmaintained with performance and possible security problems). Simple HTTP rendering is still supported by Text plugin. - Advanced option `window_paste_with_ctrl_v_regex` to change default paste shortcut Shift+Insert to Ctrl+V for specific windows (only on Windows and Linux/X11). This is regular expression matching window titles. - New advanced options allow to set intervals and wait times for copying, pasting and window focus: * `script_paste_delay_ms` - delay after `paste()`, default is 250ms (#1577) * `window_wait_before_raise_ms` * `window_wait_raised_ms` * `window_wait_after_raised_ms` * `window_key_press_time_ms` * `window_wait_for_modifiers_released_ms` - Format "text/plain;charset=utf-8" is now preferred to "text/plain". - FakeVim: Auto-indents when adding new lines. ## Scripting - New scripting engine. This adds some new functionality, better ECMAScript support, improved performance and would allow Qt 6 support in the future. - Argument `--start-server` to both starts the app if not yet running and runs a command (#1590). For example, `copyq --start-server show` would show main window even if the app was not started yet. - Accessing a missing plugin from script throws an human-readable error and show an popup if uncaught (for example, "plugins.itemtags" could throw "Plugin itemtags is not installed"). - Script function `setPointerPosition()` throws an error if it fails to set the mouse pointer position. - Fixes for `NetworkReply` objects to properly fetch data when needed (#1603). Script functions `networkGet()` and `networkPost()` now wait for data to be fetched. New script functions `networkGetAsync()` and `networkPostAsync()` can be used to make asynchronous network request. Property `NetworkReply.finished` can be used to retrieved completion status of a request. - New script function `styles()` to list possible application styles and option `style` to override the default or current style. ## Platforms - Wayland support, notably clipboard access and window size restoring. - Windows: Builds are now 64bit (built by Visual Studio tools). - Linux: Selecting the app icon in the desktop environment using the installed entry in the application menu or launcher, shows main window immediately. Previously, the app started silently in tray or minimized state. - Linux/X11: Fixes copying from VirtualBox (#1565). - macOS: Fix version information (#1552). ## User Interface - The default theme is kept consistent with system theme (#1613). This also allows to use new special placeholders like `default_bg` and `default_text` in custom style sheet files. - Command dialog always shows the command type at top. - Updated icons (Font Awesome 5.15.3). - FakeVim: Command line not supports better text interaction (select, copy, cut, paste). ## Fixes - Fix crashed with some custom system themes (#1521). - Fix importing old saved tabs/configuration (#1501). - Fix trailing spaces in copied commands. - Fix filtering shortcuts in preferences. - Fixes for window geometry restoring. - Tray menu items are updated only just before the menu is shown. - Avoid storing "text/richtext" by default since displaying of this format is not supported. - Better performance when updating synchronized items. - Various appearance and theme fixes (#1559). ## Various - Code base now follows C++17 standard. - GitHub Actions now continuously build and test for Linux and macOS, and provide development builds for macOS. # v3.13.0 - Newly, if a global shortcut is triggered when the main window is active, the command will be executed with item selection and item data available (#1435). - New `focusPrevious()` script function to activate window that was focused before the main window. - Export now write data to a temporary file before saving. - Display command are now also applied on item preview (e.g. to enable syntax highlighting in the preview). - New command line option "tray_menu_open_on_left_click" to check default mouse button behavior for tray icon (`copyq config tray_menu_open_on_left_click true`). - New command line option "activate_item_with_single_click" to activate items with single click (`copyq config activate_item_with_single_click true`). - New command line options "filter_regular_expression" and "filter_case_insensitive" to change the item search behavior. - New command line option "native_menu_bar" to disable native/global menu bar (`copyq config native_menu_bar false`). - Updated icons (Font Awesome 5.15.1) - Improved performance of loading the icon font. - Fix crash when exporting large amount of data (#1462). - Fix entering vi search mode (#1458). - Fix size of scrollable text area in item preview (#1472). - OSX: Broken native/global menu bar was replaced by default with application menu bar (#1444). This can be changed with `copyq config native_menu_bar true`. - OSX: Mouse click on tray icon is now handled similarly to other platforms. This can be changed with `copyq config tray_menu_open_on_left_click true`. # v3.12.0 - Unsaved data are now saved whenever application is unfocused, otherwise immediately after an item is edited and saved or after ~5 minute intervals if items change. These intervals can be configured - use `copyq config` to list options with `save_delay_` prefix. For example, disable storing after an item is added (only when app is unfocused, exits or tab is unloaded): copyq config save_delay_ms_on_item_added -1 - Filter field in commands can now modify menu items. This is done by setting properties to "menuItem" object. Example: copyq: menuItem['checkable'] = true if (plugins.itempinned.isPinned.apply(this, selectedItems())) { menuItem['checked'] = true menuItem['text'] = 'Unpin' menuItem['color'] = '#f00' menuItem['tag'] = 'X' } else { menuItem['checked'] = false menuItem['text'] = 'Pin' menuItem['icon'] = '' } - Application icon will no longer automatically change when there is an ongoing operation (i.e. the icon snip animation). This caused performance issues in some environments and it was not tested automatically so it often broke. When clipboard storing is disabled the icon only changes opacity slightly. - New `preview()` script function shows/hides item preview. - Avoid terminating application on SIGHUP (#1383) - Use brighter bar for pinned items with a dark theme (#1398) - Improved notification text line wrapping (#1409) - Improved layout when showing many shortcut buttons (#1425) - Fix indentation when importing commands with CRLF (#1426) - Fix using the configured notification font (#1393) - Fix initial item size (avoid scroll bars) - Fix decrypting item with note - Fix hiding windows after changing "Always on Top" option - Fix tool bar flickering when browsing items - Fix crash when destroying main window - Fix rare crash when menu items change - FakeVim: Improved completion menu control with Vim emulation - FakeVim: Always start in normal mode - FakeVim: Fix searching backwards - Windows: Paste operation is now postponed until user releases shortcut (#1412). This works better than releasing the shortcut keys automatically and is consistent with behavior on Linux. - Windows: Fix SSL/TLS errors; `networkGet()` should now work with `https` protocol - Windows: Fix native GUI style (#1427) # v3.11.1 - Fix scrolling in selected text items (#1371) - Fix using application icon font instead of a system-installed on (#1369) - X11: Fix checking correct text before selection synchronization # v3.11.0 - Tab character size can now be set (number of spaces) and maps more accurately to space character width (#1341). The default value is 8 spaces which is smaller than before. This can be changed on command line: copyq config text_tab_width 4 - New `move()` script function moves selected items within tab. - New `menuItems()` script function creates custom menus. - CSS stylesheet files to fully customize appearance - Allow keyboard navigation in item preview dock - "Show Preview" is now available in File menu instead of Item menu - Shortcuts Ctrl+P and Ctrl+N selects previous/next action in Action dialog. - New synchronized item/files are now added to item list ordered alphabetically by filename which is faster and more consistent on multiple platforms than ordering by modification-time (#833). - Improved performance when synchronizing items/files - Non-owned synchronized files at the end of item list are now dropped (but not deleted) if the list is full. - Updated icons (Font Awesome 5.13.0) - Simpler item scrollbar style - Omit showing new notification under mouse pointer (#1310) - Duplicate "CopyQ Error" notification are not shown - Bind x to Delete in Vi style navigation mode - Left/Right arrow keys now work in FakeVim editor mode by default - FakeVim editor mode now supports cutting text to given register - If FakeVim editor mode is active in a dialog, Esc key allows to close the - Consistent window and dialog titles in application (" - CopyQ" suffix) dialog. - Fix opening tray menu with empty search - Fix search in main window and tray with different keyboard layouts (#1316) - Fix restoring search when closing internal editor - Fix crash when synchronizing pinned items/files (#1311) - Fix pasting synchronized file instead of its content (#1309) - Fix enabling menu items with filters in commands (#1284) - Fix commands for removing tags from items (#1332) - Fix copying from item preview dock (#1326) - Fix position of main window on current screen (#1216) - Fix copying "text/plain;charset=utf-8" format as a text (#1324) - Fix preview search highlight in Appearance configuration (#1354) - Fix hover/mouse-over style for items (#1347) - Fix wrapping long notification text - Fix jitter when scrolling in item list - Fix item width - X11: Fix re-getting clipboard content after aborted (#1356) - Windows: Use builds with Qt 5.13 # v3.10.0 - Use environment variable `COPYQ_DEFAULT_ICON=1` to show the original application icon instead of the one from current icon theme. - Avoid updating menu too unnecessarily - Drop using deprecated Qt API and require at least Qt 5.5 (meaning Ubuntu 14.04 and Debian 8 are no longer supported) - Use non-native color and font dialogs which fixes showing these in Gnome/Gtk - Fix GUI with fractional scaling - Fix updating tray menu (remove empty sections) - Fix editing synchronized file content instead of its path - OSX: Omit preventing system from entering the sleep mode - X11: Improve clipboard/selection synchronization - X11: Avoid reading clipboard in parallel in the monitor process # v3.9.3 - New `loadTheme()` script function loads theme from INI file. - Currently selected item stays on top on PageUp/Down (less jittery list view scrolling) - Performance improvements: Updates GUI only when necessary; dedicated processes to run menu filters and display commands; reloads configuration once when setting multiple options with `config()` - Skips using a command from a disabled plugin - Logs information on slow menu filters and display commands - Fix hiding item preview when disabled (caused an empty window to be shown) and when no items are selected - Fix taking screenshots on multiple monitors - Fix duplicate show/hide tray menu items - Fix moving synchronized items to top when activated - Fix calling `onExit()` second time when on shutdown - Fix removing empty actions from history in Action dialog - Fix updating version from Git when rebuilding - OSX: Fix refocusing correct main window widget - Windows: Use Qt 5.12.5 builds (MinGW 7.3.0 32-bit, msvc2017 64-bit) # v3.9.2 - Fix unnecessary tab reloading after expired. - Fix repeated menu updates. - Fix loading tabs with an empty item - Fix initializing expire timeout (it was always 0 or 1 minute) # v3.9.1 - Commands are moved to a separate configuration file "copyq-commands.ini". - Horizontal tabs in the configuration dialog were replaced with a list of sections so it's possible to view all of the sections even in a smaller window. - New option `hide_main_window_in_task_bar` to hide window in task bar can be set using `copyq config hide_main_window_in_task_bar true`. - New `logs()` script function prints application logs. - New `clipboardFormatsToSave()` script function allows to override clipboard formats to save. - Some hidden options can be modified using `config()` script function. - Font sizes in items and editor are limited to prevent application freeze. - Application icons are cached so as to avoid creating icons for the snip animation again. - Fix restoring tabs with some non-ASCII characters - Fix opening window on different screen with different DPI - Fix 100% CPU utilization on wide screens (5120x1440) - Fix icon size and GUI margins in Tabs configuration tab - X11: Fix stuck clipboard access - X11: Faster selection synchronization - OSX: Prevent showing font download dialog - OSX: Fix clipboard owner window title # v3.9.0 - Large images in clipboard are no longer automatically converted to other formats - it caused slowdowns and was mostly unnecessary since some usable image format was provided. - The server/GUI process now provides the clipboard and no other process is started (i.e. "copyq provideClipboard"). The other process helped to unblock GUI in rare cases when an application requested large amount of clipboard data, but it could cause some slowdowns to start the process. - Closing external editor focuses the edited item again (if the editor was open from main window). - Only Global Shortcut commands are shown in tray menu. - Separate Global and Application shortcuts into tabs in configuration dialog. - New per-tab configuration allows disabling storing items on disk and limiting number of items. - New script function unload() and forceUnload() allow unloading tabs from main memory. - Tabs synchronized with a directory on disk are updated only when needed. An update happens regularly when synced tab has focus or item data and are too old. Update interval is 10s and can be changed by setting env variable COPYQ_SYNC_UPDATE_INTERVAL_MS (in ms). - X11: New option allows to disable running automatic commands on X11 selection change. - Fix rare crash on exit. - Fix value returned by filter() after it's hidden - Fix memory leak (tool bar and menu items were not properly cleaned up) - Fix crash when opening content dialog with many formats - OSX: Fix pixelated UI rendering on retina displays. - Windows: Fix blocking Ctrl, Shift and other modifier keys after invoking paste action. The downside is that it's no longer possible to invoke command assigned to a global shortcut repeatedly without releasing these keys. - X11: Fix high CPU usage when mouse selection cannot be accessed. - X11: Fix assigning global shortcuts with keypad keys # v3.8.0 - Custom settings from scripts (using settings() function) are now saved in "copyq-scripts.ini" file in configuration directory. Existing configuration needs to be moved manually from "[script]" section in the main configuration file ("copyq info config" command prints the path) to "[General]" section to the new file (in the same directory). - Correct clipboard owner (window title) is now used when the window is hidden after copy operation (e.g. password manager copies password and hides its window immediately). - New script functions onStart and onExit allow to defined commands run when the application starts and exits. - New script functions pointerPosition and setPointerPosition to get/set mouse cursor position on screen. - New script callback onClipboardUnchanged called when clipboard changes but monitored content remains the same. - Block default shortcut overridden by a command while its filter command needs to run. - Item selection is not cleared when main window hides in response to activating an item or automatically when unfocused. - Clipboard dialog opens much faster and retrieves clipboard data only when needed. - Clipboard dialog contains special clipboard formats and the whole list is sorted - plain text first, HTML, other text, application, application specific (`application/x-`), special (uppercase). - Detect encoding for other text formats. - Method text for ByteArray returns correctly formatted text from unicode encoded data (e.g. UTF-8). - Show pin and tag menu items even if shortcut is not assigned (can be disabled completely in Command dialog). - Hide encrypt/decrypt commands when keys for Encrypt plugin don't exist. - Command list is focused when Command dialog opens; the less important "Find" field is smaller and moved below the list. - Process manager is completely redone and the dialog is no longer created at application start (faster application start, smaller memory footprint). - Process manager has filter field for searching for commands. - Process manager has new column showing error message. - Process manager has color status icons for running, starting and failed processes. - Next/Previous formats are no longer available (were rarely used and untested). - Updated donation link: https://liberapay.com/CopyQ/ - FakeVim, if enabled, is used for other multi-line text fields in the application (e.g. item notes, command editor). - FakeVim, if in a dialog, binds save and quit command to the dialog buttons - `:w` for Apply, `:wq` for OK, `:q` for Cancel. - FakeVim status bar shows an icon for errors and warnings. - FakeVim now handles set commands correctly. - FakeVim text cursor is gray if the editor is not focused. - Fix opening image editor for encrypted items. - Fix opening SVG image editor if the bitmap one is unset. - Fix stopping client processes properly. - Fix showing main window under mouse pointer (with showAt function). - Fix client crash when calling a method without instance (e.g. command "copyq ByteArray().size"). - OSX: Fix opening main window above full screen window. - OSX: Fix selecting item with Up/Down keys when searching. - X11: Fix setting wrong window title for own clipboard. - X11: Fix synchronizing selection if the change is quick. - X11: Fix tray icon on KDE. # v3.7.3 - Search and item selection reset when main window is closed - Updated icons (Font Awesome 5.6.3) - Tray icon animation is not triggered if no automatic commands are run. - Improved color themes on some systems - Omit auto-hiding main window when it has a dialog open - Fix transparency of some icons - Fix size of menu when open on different screen - Fix window geometry restore and rendering issues - Fix auto-hide main window (e.g. on Gnome when using Activities) - X11: Fix small tray icon on Gnome - X11: Fix icon mask file name according to standard ("copyq_mask") # v3.7.2 - Backspace deletes last character in tray menu search instead of clearing it completely - Window title shows "" label when non-text items are copied - Command dialog uses simpler layout for easier command editing - Command dialog shows simple command description - Remove empty lines at the end of copied and exported commands - New script functions to calculate hash: md5sum, sha1sum, sha256sum, sha512sum - Retrieving clipboard data is interrupted if it's slow - Editing commands no longer causes high CPU usage - Completion menu for command editor is resized once - Items are rendered faster and are shown with incorrect size initially while scrolling instead of showing empty items - When Action dialog opens, the command editor is focused instead of the combo box containing command history (this consistent with default focus behavior on OS X) - Clipboard monitor process loads configuration only at start - Autostart option now works in the Flatpak package - OSX: Application no longer crashes when using the main window close button - X11: TIMESTAMP clipboard format is used to avoid retrieving unchanged content unnecessarily - X11: Data installation path can be overridden with CMake options (CMAKE_INSTALL_DATAROOTDIR and DATA_INSTALL_PREFIX) - X11: Store current window title with new clipboard data right after clipboard-change signal is received # v3.7.1 - Store formats specified in Format field in automatic commands - Fix restoring geometry on screens with different scaling factors - X11: Fix restoring geometry on i3 window manager - X11: Fix the first clipboard/selection signal when unchanged # v3.7.0 - New option to show notes beside item content - Removed option to show icon instead of notes - Only plain text is Copied/Pasted from menu if Shift key is pressed - Customizable shortcut for Item context menu - Remove unmaintained Data plugin (can be replaced with a script) - Allow to set icon to tab groups in tree view - Allow export even if a tab group or an unloaded tab is selected - Automatic commands are no longer run in clipboard monitor context - Omit aborting monitor by calling abort() from automatic commands - Omit aborting automatic commands by changing configuration - Updated icons (Font Awesome 5.4.2) - Fix sizes of items with notes and when using Web plugin - Fix icons alignment - Fix setting different font weights in Appearance configuration - Fix button sizes in Appearance configuration - Fix position of the context menu for large items - Fix server crash when a client disconnected while processing its request - Fix crash when changing icon or renaming unloaded tab - Fix handling of incorrect editor command - X11: Faster and safer clipboard checking and synchronization - X11: Prioritize checking clipboard before selection # v3.6.1 - Omit displaying notes twice when "Show simple items" is enabled - Fix broken tab decryption # v3.6.0 - Invoking search with a shortcut reuses last search expression - Exiting from search (ESC) doesn't unselect found item - `COPYQ_SETTINGS_PATH` environment variable overrides default config path - Merge top item with same new clipboard text - Check clipboard after start - Animate app icon when a clipboard changes or a client calls some functions - Use gpg for encryption if gpg2 is unavailable - Faster tray and context menu updates - Close dialog() after client process exits - Display system, arch and compiler info when using version() - Tests are about 2x faster - Updated icons (Font Awesome 5.3.1) - Fix search field icon position - Fix overriding `onClipboardChanged()` and similar script functions - Fix closing client processes - Fix deleting temporary timer object - Fix handling return values and abort() in afterMilliseconds() - Fix icon font sizes and omit using system-installed font - Fix showing label - X11: Fix showing window after using close button on Qt 5.11 - X11: Fix crash when UI scaling is too large - Windows: Fix removing old DLLs with installer # v3.5.0 - Icon for global shortcuts in Shortcut configuration tab - Simpler icons (smaller installation footprint) - Faster copying and pasting from the application - Faster and simpler invocation for commands run automatically - More compact Process Manager dialog - Scriptable function select() waits for clipboard to be set - Image masks for colorizing icons ("icon-mask" and "icon-busy-mask") - Improved logging - Updated icons (Font Awesome 5.0.13) - Fix showing icons when "System icons" is enabled (Windows and OS X) - Fix initial setup for encryption - Fix storing SVG images and other XML formats with text - Fix stopping clipboard monitor and other processes at exit - Fix restarting monitor whenever script commands change - Fix updating status in Process Manager - Fix using tab() multiple times from script - Fix building for Qt 5.11 - Windows: Use Qt 5.6 LTS version for released binaries - OSX: Fix URI list and UTF-16 text clipboard formats - X11: Faster clipboard/selection synchronization # v3.4.0 - Fix icon sizes in menu - Fix showing dialog() above main window - Fix closing clipboard monitor and provider on exit - Safer data serialization and communication protocol - Smoother colorized application icon - Faster pasting to target window - Run script commands in own context - Omit showing same notification multiple times - Omit handling text/uri-list by default - OSX: Fix opening main window from tray menu - OSX: Fix exporting configuration - OSX: Fix focusing own windows for pasting - Linux: Fix crashing on Wayland - X11: Fix showing incorrect clipboard content # v3.3.1 - Mark tray menu item in clipboard - Scroll view when dragging items to top or bottom - Always use current tab name in new tab dialog - Update clipboard label in tray menu immediately - Raise last window after menu is closed - Paste commands correctly even if pasted into text edit widget - Unload unneeded tabs after exported/imported - Omit slow data compression on export - Fix queryKeyboardModifiers() script function - Fix settings autostart option from script - Fix warnings when trying to load bitmap icons as SVG - OSX: Fix settings global shortcuts with some keyboard layouts - OSX: Fix tray menu icon size - X11: Fix Autostart option - X11: Fix crash when icon is too big - X11: Omit resetting empty clipboard and selection - X11: Omit overriding new clipboard with older selection content # v3.3.0 - Add option for searching numbers in item list and tray menu - Use exception instead of return code for exportData()/importData() - Draw icon shadow (for internal icon font) - Remove support for Qt 4, require Qt >= 5.1.0 - Fix storing only non-empty clipboard items - Fix opening web browser from script with open() - Fix exiting clipboard provider process when not needed - Fix exportData()/importData() with relative file paths - Fix SVG app icon resolution in some panels - Fix closing window after a menu is closed and window is unfocused - Fix icons for command error notifications - Fix warnings when using system icons - Linux: Fixes for AppData, desktop and flatpak files - OSX: Fix pasting items - OSX: Log errors when global shortcut registration fails # v3.2.0 - Add option to close main window when unfocused - Add script command type for enhancing scripting API and CLI - Add display command type for overriding item display data - Add documentation for plugins scripting API - Add script function afterMilliseconds() - Add isGlobalShortcut property to commands - Allow to set global and menu command shortcuts in preferences - New icon appearance (Font Awesome 5) - Search in icon dialog (just start typing text) - Improve scripting API for plugins - Show command type with icon in command dialog - Allow to set tray and window icon tag - Allow to store MIME types with spaces - Allow to set negative offsets for notifications - Allow to override clipboard handling with script commands - Script functions add() and insert() can add multiple items - Hide vertical scroll bar in text items if not needed - Hide main tool bar when internal editor is visible - Run scripts safely in client process - Omit closing internal editor if item changes - Smoother scrolling and item browsing - Fix accepting dialog() on Ctrl+Enter and Enter - Fix sleep() timing out before interval - Fix Dir().separator() return value type - Fix item rendering - Fix window title and tool tip for multi-line clipboard - Fix tool bar rendering while editing an item - Fix scaling pixel font sizes in HTML items - Fix rendering item number in top left corner - Fix rendering drag'n'drop preview on high-DPI screens - Fix rendering notification icon on high-DPI screens - Fix disabling antialiasing - Fix opening menu/window on left screen (negative coordinates) - Linux: Fix merging X11 selection if the first item is pinned - Linux: Fix displaying tray menu on KDE/Plasma - Windows: Fix negative item size warnings # v3.1.2 - Don't show mouse cursor for selecting text after clicking on item - Fix rendering background for item preview dock - Fix showing main window under mouse pointer - Fix loading tray icon - Fix scrollbar interaction in items - Fix performance for eliding huge text - Fix correct mouse pointer in text items - itemtext: Render plain text instead of empty HTML - itemtext: Always limit text size in items - itemweb: Use some sane settings for items - itemencrypted: Copy to selection with copyEncryptedItems() # v3.1.1 - Improve performance for items with long lines - Linux: Fix tray icon # v3.1.0 - Add "Paste current date and time" predefined command - Add "Take screenshot" predefined command - Add scriptable function queryKeyboardModifiers() - Add scriptable function screenNames() - Add scriptable function isClipboard() - Add scriptable function toggleConfig() - Add scriptable function iconColor() - Allow to change icon color using COPYQ_SESSION_COLOR - Expand text ellipsis if selected - Avoid copying ellipsis if selected and copy rich text only if needed - Improved command widget layout - Copy encrypted items as hidden in UI - Open external editor if internal fails - Fix item rendering on high DPI screens - Fix tray icon on high DPI screens - Fix taking screenshots on multiple monitors and on high DPI screens - Fix flicker when rendering items for the first time - Fix icon layout for notes - Fix showing icon if notes are empty - Fix copying/drag'n'dropping files into a synchronized tab - Fix long message alignment in notifications - Fix activating simple items with double-click - Fix styling of current and selected items - Fix setting clipboard immediately after start - Fix size of items with tags - Fix moving multiple items to clipboard and to the top of the list - Fix updating global shortcuts with setCommands() - Fix clearing search after opening internal editor - Fix aborting script execution - Fix black scroll bar in items - Fix completion popup resizing - OSX: Fix some memory leaks - Linux: Add manual pages - Linux: Fix getting icon for non-default session from theme - Linux: Fix settings tab name in KDE/Plasma - Linux: Fix restoring with session manager - Windows: Add pinned items to installer - Windows: Fix saving tab with another plugin - Windows: Fix pasting to a window - Windows: Fix setting foreground window even if app is in background # v3.0.3 - Added new documentation - Added option to disable auto-completion for commands - Improved image thumbnail rendering - Fixed opening window on current screen - Fixed item rendering when searching - Fixed tab reloading and closing external editor - Fixed image sizes - Fixed loading plugins on OS X - Fixed selecting area in screenshot - Fixed rendering and showing tooltip for notes - Fixed hang on exit when using QtCurve theme # v3.0.2 - Added script functions for listing synchronized tabs and their paths - Fixed showing window on current screen - Fixed notification position with multiple screens - Fixed rendering items when scrolling - Fixed pasting from main window after switching tabs - Fixed copy/paste to some apps on OS X - Fixed focusing editor when closing completion popup on OS X - Fixed setting temporary file template from script # v3.0.1 - Install themes on OS X - Improve pasting to current window - Fix crash when the first tab is not loaded - Fix crash when reloading tab after closing editor - Fix item rendering and UI elements for high DPI displays - Fix window focus after closing menu or main window on OS X - Fix opening main window on current space on OS X - Fix pasting to some windows on OS X - Fix navigating item list - Fix getting boolean from checkbox in dialog() - Fix default move action for drag'n'drop - Fix exiting on logout when tray is disabled # v3.0.0 - Pinned and protected items - Export/import tabs, configuration and commands in one file - Create and modify commands from script - Create temporary files from script - Create notifications with buttons from script - Take screenshots using script - Allow to process lines on stdout from execute() scriptable using a function - Safer and faster encrypt/decrypt commands (need to be re-added) - Improved menu scriptable function - Improved icon sharpness - Improved plugin architecture - Improved logging and displaying log - Performance and memory consumption improvements - Implemented copy() on OS X - Fixed focusing menu and windows on OS X - Fixed configuration folder path for portable version on Windows - Fixed opening menu for a tab - Fixed using correct GPG version for encryption - Fixed tray menu position in KDE/Plasma # v2.9.0 - Set text style in editor - Search in editor - Quick help in completion popup menu for commands - Easier text selection in item preview - Show whole text and unscaled image in item preview - Improved pasting to windows on Linux/X11 - Fixed global shortcuts at application start on Linux/X11 - Fixed closing application from installer on Windows - Fixed showing item preview at start - Fixed saving position of new tabs and tab lists # v2.8.3 - Search items from tray menu - Added support for animated gifs (played when selected) - Added special formats for automatic commands to sync and store clipboard - Added auto-completion for command editor - Added scriptable variables for MIME types - Fix encryption with new OpenPGP - Fix passing big data to commands on Windows # v2.8.2 - Simplify appearance of items with notes and tags - Support for drag'n'dropping images to more applications - Added list widget for custom dialog - Fixed opening windows on current screen - Fixed tray icon appearance on Linux - Fixed focusing tray menu from command - Fixed dialog button translation on Windows - Fixed passing big data to commands # v2.8.1 - All Qt messages are logged - Fixed and improved commands for Tags plugin - Fixed removing last items when changing item limit - Fixed library paths for OS X - Fixed pasting items on Windows - Fixed copying from script on Windows # v2.8.0 - Insert images in editor - Show simple items options - Item preview window - Move to Qt 5 on Windows and newer Linux distros - Faster item content listing - Simple filter for Log dialog - Smooth icons on OS X - Fixed system icons - Fixed pasting animated images - Fixed occasional crashes when finalizing commands with Qt 5 - Fixed opening log speed on Windows - Lithuanian translation # v2.7.1 - Colorize items with command - Drag'n'drop items in selection order - Fixed item selection with "next" and "previous" commands - Fixed encrypting/decrypting items on Windows - Fixed occasional client crashes at exit - Fixed editor command on OS X # v2.7.0 - Log accessible from GUI - Performance and memory usage improvements - Added scriptable function to set current tab (setCurrentTab()) - Added scriptable function to modify new items (setData()) - Appearance fixes - Simplified window management - Improved pasting to current window on Windows - Window geometry fixes - Command with Enter shortcut overrides item activate action # v2.6.1 - Moved configuration from registry on Windows - Fixed shortcuts on Windows - Fixed window geometry restoring # v2.6.0 - Show item notes in tray and window title - Removed broken console executable on Windows - Dutch translation - Added env() and setEnv() to access and modify environment variables - Access shortcut which activated command - Fixed closing the application at shutdown on Windows - Fixed some global shortcuts on Windows - Fixed capturing some shortcuts # v2.5.0 - Smarter tab name matching (ignore key hints '&') - Fixed omit passing global shortcuts to widgets - Fixed autostart option on Ubuntu - Fixed window geometry saving and restoring - Fixed reading binary input on Windows - Fixed clearing configuration # v2.4.9 - Added new light theme - Added scriptable function focused() to test main window focus - Customizable shortcuts for tab navigation - Extended item selection - Fixed tab expiration and updating context menu - Fixed passing text to command from action dialog # v2.4.8 - New command to show main window under mouse cursor or at a position with custom size - Hide clipboard content when "application/x-copyq-hidden" is "1" - "Copy next/previous item" command waits for clipboard to be set - Fixed updating window title and tray tool tip on X11 - Fixed modifying multiple commands in Command dialog - Fixed implicit date to string conversions # v2.4.7 - Separate dialog for command help - Added scriptable function visible() to check main window visibility - Linux: Install bitmap icons for menus - Linux: Install AppData file - Allow to search for specific MIME types stored in items - Menu items and customizable shortcut for cycling item format - Fixed icon alignment - Fixed moving tabs with Qt 5 - Fixed overriding socket file path (Linux and OS X) - Fixed "Paste as Plain Text" command (Windows and OS X) - Fixed tab tree layout and changing icons for tab groups - Fixed URL encoding # v2.4.6 - Fixed crash when removing command - Fixed encryption/decryption selected items - Fixed reading from standard input - GUI fixes for high-DPI displays # v2.4.5 - Option to save/restore history for filtering items - Clipboard changes with unchanged content is ignored - Notify about unsaved changes in command dialog - Use application icons from current icon theme on Linux - Simple error checking for user scripts - Fix blocked system shutdown on Linux/X11 # v2.4.4 - Option to choose tab for storing clipboard - Fixed overriding mouse selection (Linux/X11) - Fixed window title updates from user commands - Fixed toggling window visibility with Qt 5 - Minor GUI improvements and user command fixes # v2.4.3 - Plugin for tagging items - Plugins can provide script functions and commands - Improved automatic commands execution - Fixed gradients, transparency and other style improvements - Fixed decryption with newer version of GnuPG - Fixes for Qt 5 version # v2.4.2 - Send input data to execute() - Better clipboard encoding guessing - Set tab icon from commands using tabicon() - Fixed window title encoding on Windows - Fixed restoring window geometry - Performance fixes - Various bug and usability fixes - New logo # v2.4.1 - Added scriptable classes File and Dir - Added scriptable function settings() for saving custom user data - Improved dialog() command - Windows: Qt translated strings bundled with application - Fixed %1 in command - Fixed building with tests and Qt5 # v2.4.0 - Separate dialog for user commands and global shortcuts - Search for item by row number - Command highlighting - More shortcuts can be mapped on Windows and X11 - New "copy" command to copy from current window to clipboard - New "dialog" command to show dialog with custom input fields - Fixed crash on log out on Windows - Fixed clipboard monitoring on Windows - Fixed argument encoding from client on Windows - Fixed log output when printing messages from multiple processes - GUI fixes # v2.3.0 - Support for OS X - Japanese translation - Custom icons for tabs - Show item count next to each tab name (optional) - Added Process Manager for running and finished commands - Scripting improvements - Nicer format for copied user commands - GUI fixes # v2.2.0 - Custom system shortcuts for any user command - Drag'n'drop items to tabs - Options to set position and maximum size for notifications - Option to open windows on same desktop - Weblate service for translations (https://hosted.weblate.org/projects/copyq/master/) - Commands input and output is UTF-8 only (this fixes encoding issues on Windows) - Scripting engine improvements - Various GUI improvements and fixes - Fix main window position in various X11 window managers - Fix crashing with Oxygen GUI style - Fix storing images from clipboard on Windows - Various GUI improvements and fixes # v2.1.0 - French translation - Save/load and copy/paste user commands - Easier way to write longer commands and scripts - Remove formats in clipboard and item content dialogs - Command "toggle" focuses main window if unfocused (instead of closing) - Choose log file and amount of information to log - Lot of bugfixes and GUI improvements # v2.0.1 - Initial OS X support - Configuration moved into installed directory in Windows - Change language in configuration - New tool bar with item actions - Option to apply color theme in tabs, tool bar and menus - Allow to match items using a command - Focus output item of the last executed command - Allow to cancel exit if there are active commands - Removed option to hide menu bar (inconsistent behavior) - Fix showing lock icon in encrypted items # v2.0.0 - Synchronize items with files on disk - Faster tab loading and saving (data format was changed; only backward compatible) - User can limit size of text items - Opening external image editor fixed on Windows - New logo and website - Lot of other fixes # v1.9.3 - Item and tab encryption (using GnuPG) - FakeVim plugin for editing items (Vim editor emulation) - Drag'n'drop items from and to list - Improved appearance for notes - Improved search bar - New GUI for application and system-wide shortcuts - Option to unload tabs after an interval - Fixed item sizes and disabling font anti-aliasing - Major bug fixes (mainly for Windows) and performance improvements # v1.9.2 - Better performance - GUI improvements and bugfixes # v1.9.1 - Notifications -- customizable theme, timeout and position on screen - Optional notification for new clipboard content - Autostart option on Linux - Reset empty clipboard to previous content - More user-friendly item editor - Optional font antialiasing - Changed layout of configuration dialog - Other fixes # v1.9.0 - User notes - Improved appearance settings with some example themes - Tree view for tabs with groups - Sessions, i.e. run multiple independent instances - Lot of GUI improvements - Compatibility with Qt5 - Bugfixes (crashing on Unity, icon colors etc.) # v1.8.3 - Options to hide tab bar and main menu - Automatic paste works with more applications under Linux/X11 - Multi-monitor support - Lot of GUI fixes and improvements # v1.8.2 - Added shortcut to paste current and copy next/previous item - Bugfixes (paste to correct window, show tray menu on Unity, GUI and usability fixes) # v1.8.1 - Spanish translation - Option and system-wide shortcuts to temporarily disable clipboard storing - Option for main window transparency - Custom action on item activation - Various GUI improvements and bugfixes # v1.8.0 - New shortcuts: "Next/previous item to clipboard", "Paste as plain text" - Show clipboard content in main window title and tray tooltip - New options for commands (transform current item, close main window) - GUI enhancements, faster application start with many tabs and items, lot of bugfixes # v1.7.5 - User-settable editor for images - Command-line fixes for Windows - Commands for items of specified format (MIME type) - Tray menu fixes # v1.7.4 - Improved automatic paste from tray # v1.7.3 - Paste immediately after choosing tray item - German translation - Support for system-wide shortcuts on Qt 5 # v1.7.2 - Clipboard content visible in tray tooltip # v1.7.1 - Bugfixes for text encoding # v1.7.0 - Plugins for saving and displaying clipboard content - Bugfixes (lot of refactoring and tests happened) # v1.6.3 - Some important bugfixes # v1.6.2 - Dialog for viewing item content - Improved tray menu - Minor GUI updates # v1.6.1 - Configurable tray menu - Lot of fixes in GUI and bugfixes # v1.6.0 - Highlight text and copy text in items - Interactive web view - Commands for any MIME type - e.g. it's possible to create QR Code image from an URL and save it in list - Pipe commands using '|' character # v1.5.0 - Option to use WebKit to render HTML - Wrap text with long lines - Faster list rendering - Icons from FontAwesome - Desktop icon on Linux # v1.4.1 - Support for other languages -- right now supports only English and Czech (any help is welcome) - New "insert" command - More safe item saving # v1.4.0 - lot of GUI Improvements, faster interaction - Automatic commands for matched windows (only on Linux and Windows) # v1.3.3 - GUI Improvements - New system-wide shortcuts - Item editing improved # v1.3.2 - Drag'n'Drop to clipboard - "Always on Top" option - Change tab bar position - Fix parsing arguments # v1.3.1 - GUI improvements - Mode for Vi navigation (h, j, k, l keys for movement) - Better performance # v1.3.0 - Import/export items to/from a file (not compatible with older saved format) - Use scripts to handle item history - Improved performance # v1.2.5 - Save/load items to/from a file - Sort selected items - Easier tab browsing (left/right arrow keys) - GUI improvements - More shortcut combinations work on Linux # v1.2.4 - Improved commands - Fixed and faster scrolling - Better tab manipulation # v1.2.3 - Bugfixes and major clean-up # v1.2.2 - Performance improved # v1.2.1 - Save items from commands in other tabs - Missing icons in Windows version # v1.2.0 - Appearance settings - Tab manipulation from command line - Copy/paste items from/to tabs - Faster searching # v1.1.0 - Better performance - New configuration options - Improved command line # v1.0.2 - Improved Windows compatibility - Global shortcuts - Automatic commands # v1.0.1 - Compatibility with different platforms ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.16) project(copyq) if (APPLE) set(COPYQ_EXECUTABLE_NAME "CopyQ") else() set(COPYQ_EXECUTABLE_NAME copyq) endif() # C++17 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) if(CMAKE_BUILD_TYPE MATCHES Debug) set(COPYQ_DEBUG ON) add_definitions( -DCOPYQ_DEBUG ) endif() OPTION(PEDANTIC "Enable all compiler warnings" OFF) # Options (cmake -LH) OPTION(WITH_PLUGINS "Compile plugins" ON) OPTION(WITH_QCA_ENCRYPTION "Enable QCA-based tab encryption" ON) OPTION(WITH_KEYCHAIN "Enable system keyring integration using QtKeychain" ON) OPTION(WITH_GNOME_CLIPBOARD_EXTENSION "Install GNOME extension, required for clipboard monitoring" ON) OPTION(WITH_AUDIO "Build with audio playback support (miniaudio)" ON) add_definitions( -DQT_USE_STRINGBUILDER ) if (WIN32) # Prevent windows.h from defining min/max macros that conflict with std::min/std::max. add_definitions( -DNOMINMAX ) endif() # Unix-specific options if (UNIX AND NOT APPLE) include(GNUInstallDirs) set(DATA_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}" CACHE PATH "Install path for data") set(PLUGIN_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_MODULE_PREFIX}/copyq/plugins" CACHE PATH "Install path for plugins") set(ICON_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/icons/hicolor/scalable/apps" CACHE PATH "Install path for icons") set(ICON_INSTALL_PREFIX_TEMPLATE "${DATA_INSTALL_PREFIX}/icons/hicolor/%SIZE%/apps" CACHE PATH "Install path for icons (%SIZE% is icon size)") set(THEME_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/copyq/themes" CACHE PATH "Install path for themes") set(DESKTOP_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/applications" CACHE PATH "Install path for desktop file") set(APPDATA_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/metainfo" CACHE PATH "Install path for AppData file") set(MANPAGE_INSTALL_PREFIX "${CMAKE_INSTALL_MANDIR}/man1" CACHE PATH "Install path for manual pages") set(TRANSLATION_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/copyq/translations" CACHE PATH "Install path for translations") set(BASH_COMPLETION_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/bash-completion/completions/" CACHE PATH "Install path for bash completions") set(ICON_NAME "copyq" CACHE STRING "Name for icon files") set(COPYQ_AUTOSTART_COMMAND "" CACHE STRING "Autostart command") OPTION(COPYQ_AUTOSTART "Enable autostart option" ON) endif() set(CMAKE_AUTOMOC ON) OPTION(WITH_QT6 "Enable Qt 6" ON) if (WITH_QT6) set(QT_DEFAULT_MAJOR_VERSION 6) find_package(Qt6Widgets 6.1.0 REQUIRED) set(copyq_qt Qt6) add_definitions( -DQT_DEPRECATED_WARNINGS_SINCE=0x051500 ) else() set(QT_DEFAULT_MAJOR_VERSION 5) find_package(Qt5Widgets 5.15.0 REQUIRED) set(copyq_qt Qt5) endif() list(APPEND copyq_LIBRARIES ${copyq_qt}::Widgets) # QCA encryption support if (WITH_QCA_ENCRYPTION) find_package(Qca-qt${QT_DEFAULT_MAJOR_VERSION} REQUIRED) list(APPEND copyq_LIBRARIES qca-qt${QT_DEFAULT_MAJOR_VERSION}) add_definitions(-DWITH_QCA_ENCRYPTION) message(STATUS "QCA encryption support enabled") else() message(STATUS "QCA encryption support DISABLED") set(WITH_KEYCHAIN OFF) endif() # QtKeychain support for system keyring integration if (WITH_KEYCHAIN) find_package(Qt${QT_DEFAULT_MAJOR_VERSION}Keychain REQUIRED) list(APPEND copyq_LIBRARIES qt${QT_DEFAULT_MAJOR_VERSION}keychain) add_definitions(-DWITH_KEYCHAIN) message(STATUS "Keychain support enabled") else() message(STATUS "Keychain support disabled") endif() set(copyq_APP_ID com.github.hluk.copyq) set(copyq_ICON_PREFIX src/images/icon) set(copyq_ICON_NORMAL src/images/icon.svg) set(copyq_ICON_MASK src/images/icon_mask.svg) set(copyq_DESKTOP shared/${copyq_APP_ID}.desktop) set(copyq_APPDATA shared/${copyq_APP_ID}.metainfo.xml) set(copyq_BASH_COMPLETION shared/copyq-completion) set(copyq_MANPAGE shared/copyq.1) # Be more strict while compiling debugging version if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-long-long") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wextra -Wall -pedantic -Wfloat-equal -Woverloaded-virtual -Wundef -Wno-inconsistent-missing-destructor-override -Wno-variadic-macro-arguments-omitted") endif() if (PEDANTIC) if (CMAKE_COMPILER_IS_GNUCXX) list(APPEND copyq_pedantic_flags -Wextra -Wall -Wsuggest-override -Wlogical-op -Wnoexcept -Wstrict-null-sentinel ) else() list(APPEND copyq_pedantic_flags -Weverything -Winconsistent-missing-override -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-disabled-macro-expansion -Wno-double-promotion -Wno-exit-time-destructors -Wno-extra-semi-stmt -Wno-inconsistent-missing-destructor-override -Wno-redundant-parens -Wno-shadow-field -Wno-shadow-field-in-constructor -Wno-shorten-64-to-32 -Wno-sign-conversion -Wno-suggest-destructor-override -Wno-unknown-warning-option -Wno-used-but-marked-unused -Wno-weak-vtables -Wno-switch-default -fcomment-block-commands=retval ) endif() list(APPEND copyq_pedantic_flags -pedantic -Wcast-align -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wstrict-overflow=4 -Wundef ) list(APPEND copyq_pedantic_flags -Wno-padded -Wno-switch-enum ) endif() include(src/version.cmake) message(STATUS "Building CopyQ version ${copyq_version}.") if (UNIX AND NOT APPLE) install(FILES ${copyq_ICON_NORMAL} DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}.svg) install(FILES ${copyq_ICON_MASK} DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}_mask.svg) install(FILES ${copyq_APPDATA} DESTINATION ${APPDATA_INSTALL_PREFIX}) install(FILES ${copyq_MANPAGE} DESTINATION ${MANPAGE_INSTALL_PREFIX}) install(FILES ${copyq_BASH_COMPLETION} DESTINATION ${BASH_COMPLETION_INSTALL_PREFIX} RENAME copyq) if (WITH_GNOME_CLIPBOARD_EXTENSION) set(copyq_GNOME_EXTENSION_DESTINATION "${DATA_INSTALL_PREFIX}/gnome-shell/extensions/copyq-clipboard@hluk.github.com") install(FILES shared/gnome-extension/extension.js shared/gnome-extension/metadata.json DESTINATION "${copyq_GNOME_EXTENSION_DESTINATION}") endif() configure_file(${copyq_DESKTOP}.in ${copyq_DESKTOP}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${copyq_DESKTOP} DESTINATION ${DESKTOP_INSTALL_PREFIX}) foreach (copyq_ICON_EXTENT 16 22 24 32 48 64 128) set(copyq_ICON_SIZE "${copyq_ICON_EXTENT}x${copyq_ICON_EXTENT}") string(REPLACE "%SIZE%" "${copyq_ICON_SIZE}" copyq_ICON_TARGET_PREFIX "${ICON_INSTALL_PREFIX_TEMPLATE}") foreach (copyq_ICON_TYPE "") install(FILES "${copyq_ICON_PREFIX}${copyq_ICON_TYPE}_${copyq_ICON_SIZE}.png" DESTINATION "${copyq_ICON_TARGET_PREFIX}" RENAME "${ICON_NAME}${copyq_ICON_TYPE}.png") endforeach() endforeach() set(copyq_THEME_INSTALL_PREFIX ${THEME_INSTALL_PREFIX}) file(GLOB copyq_THEMES shared/themes/*.css shared/themes/*.ini) install(FILES ${copyq_THEMES} DESTINATION ${THEME_INSTALL_PREFIX}) add_definitions( -DCOPYQ_ICON_PREFIX="${ICON_INSTALL_PREFIX}/${ICON_NAME}" ) add_definitions( -DCOPYQ_THEME_PREFIX="${THEME_INSTALL_PREFIX}" ) add_definitions( -DCOPYQ_PLUGIN_PREFIX="${PLUGIN_INSTALL_PREFIX}" ) add_definitions( -DCOPYQ_DESKTOP_FILE="${DESKTOP_INSTALL_PREFIX}/${copyq_APP_ID}.desktop" ) add_definitions( -DCOPYQ_TRANSLATION_PREFIX="${TRANSLATION_INSTALL_PREFIX}" ) add_definitions( -DCOPYQ_BASH_COMPLETION_PREFIX="${BASH_COMPLETION_INSTALL_PREFIX}" ) add_definitions( -DCOPYQ_ICON_NAME="${ICON_NAME}" ) if (COPYQ_AUTOSTART) add_definitions( -DCOPYQ_AUTOSTART ) endif() if (COPYQ_AUTOSTART_COMMAND) add_definitions( -DCOPYQ_AUTOSTART_COMMAND="${COPYQ_AUTOSTART_COMMAND}" ) endif() elseif (APPLE) set(copyq_themes_dest_dir "${COPYQ_EXECUTABLE_NAME}.app/Contents/Resources/themes") file(GLOB copyq_THEMES shared/themes/*.css shared/themes/*.ini) install(FILES ${copyq_THEMES} DESTINATION "${copyq_themes_dest_dir}" COMPONENT Runtime) endif() if (MSVC) include(InstallRequiredSystemLibraries) endif() add_definitions( -DQT_NO_CAST_TO_ASCII ) set_property(GLOBAL PROPERTY COPYQ_INSTALLED_PLUGINS) if (WITH_PLUGINS) add_subdirectory(plugins) endif() add_subdirectory(src) ================================================ FILE: CMakePresets.json ================================================ { "version": 6, "configurePresets": [ { "name": "Debug", "generator": "Ninja", "binaryDir": "${sourceParentDir}/build/copyq/${presetName}", "installDir": "${sourceParentDir}/install/copyq/${presetName}", "cacheVariables": { "WITH_TESTS": "TRUE", "WITH_QCA_ENCRYPTION": "TRUE", "PEDANTIC": "TRUE", "CMAKE_BUILD_TYPE": "Debug", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache" } }, { "name": "macOS-10", "generator": "Ninja", "binaryDir": "${sourceParentDir}/build/copyq/${presetName}", "installDir": "${sourceParentDir}/build/copyq/${presetName}", "cacheVariables": { "WITH_QT6": "TRUE", "WITH_TESTS": "TRUE", "CMAKE_PREFIX_PATH": "$penv{CMAKE_PREFIX_PATH}", "CMAKE_OSX_DEPLOYMENT_TARGET": "10.15", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_FLAGS": "-Wno-deprecated-declarations" } }, { "name": "macOS-13", "generator": "Ninja", "binaryDir": "${sourceParentDir}/build/copyq/${presetName}", "installDir": "${sourceParentDir}/build/copyq/${presetName}", "cacheVariables": { "WITH_QT6": "TRUE", "WITH_TESTS": "TRUE", "CMAKE_PREFIX_PATH": "$penv{CMAKE_PREFIX_PATH}", "CMAKE_OSX_DEPLOYMENT_TARGET": "13.0", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_FLAGS": "-Wno-deprecated-declarations" } }, { "name": "macOS-12-m1", "generator": "Ninja", "binaryDir": "${sourceParentDir}/build/copyq/${presetName}", "installDir": "${sourceParentDir}/build/copyq/${presetName}", "cacheVariables": { "WITH_QT6": "TRUE", "WITH_TESTS": "TRUE", "CMAKE_PREFIX_PATH": "$penv{CMAKE_PREFIX_PATH}", "CMAKE_OSX_DEPLOYMENT_TARGET": "12", "CMAKE_OSX_ARCHITECTURES": "arm64", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_FLAGS": "-Wno-deprecated-declarations" } }, { "name": "Windows", "generator": "Ninja", "binaryDir": "${sourceParentDir}/build/copyq/${presetName}", "installDir": "${sourceParentDir}/install/copyq/${presetName}", "cacheVariables": { "WITH_QT6": "TRUE", "WITH_TESTS": "TRUE", "CMAKE_PREFIX_PATH": "$penv{CMAKE_PREFIX_PATH}", "CMAKE_BUILD_TYPE": "Release", "CMAKE_C_COMPILER_LAUNCHER": "sccache", "CMAKE_CXX_COMPILER_LAUNCHER": "sccache", "CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION": "." } } ], "buildPresets": [ { "name": "Debug", "configurePreset": "Debug", "configuration": "Debug", "targets": "install" }, { "name": "macOS-10", "configurePreset": "macOS-10", "configuration": "Release", "targets": "install" }, { "name": "macOS-13", "configurePreset": "macOS-13", "configuration": "Release", "targets": "install" }, { "name": "macOS-12-m1", "configurePreset": "macOS-12-m1", "configuration": "Release", "targets": "install" }, { "name": "Windows", "configurePreset": "Windows", "configuration": "Release", "targets": "install" } ], "packagePresets": [ { "name": "macOS-10", "configurePreset": "macOS-10" }, { "name": "macOS-13", "configurePreset": "macOS-13" }, { "name": "macOS-12-m1", "configurePreset": "macOS-12-m1" } ] } ================================================ FILE: Doxyfile ================================================ # Doxyfile 1.7.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = src/include src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.cpp *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called Helvetica to the output # directory and reference it in all dot files that doxygen generates. # When you want a differently looking font you can specify the font name # using DOT_FONTNAME. You need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = Ubuntu # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. DOT_IMAGE_FORMAT = svg # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES ================================================ FILE: HACKING ================================================ https://copyq.readthedocs.io/en/latest/build-source-code.html ================================================ FILE: INSTALL ================================================ https://copyq.readthedocs.io/en/latest/build-source-code.html ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ # CopyQ [![Documentation Status](https://readthedocs.org/projects/copyq/badge/?version=latest)](https://copyq.readthedocs.io/en/latest/?badge=latest) [![Translation Status](https://hosted.weblate.org/widgets/copyq/-/svg-badge.svg)](https://hosted.weblate.org/engage/copyq/?utm_source=widget) [![Linux Build Status](https://github.com/hluk/CopyQ/actions/workflows/build-linux.yml/badge.svg?branch=master&event=push)](https://github.com/hluk/CopyQ/actions?query=branch%3Amaster+event%3Apush+workflow%3ALinux) [![macOS Build Status](https://github.com/hluk/CopyQ/actions/workflows/build-macos.yml/badge.svg?branch=master&event=push)](https://github.com/hluk/CopyQ/actions?query=branch%3Amaster+event%3Apush+workflow%3AmacOS) [![Windows Build Status](https://github.com/hluk/CopyQ/actions/workflows/build-windows.yml/badge.svg?branch=master&event=push)](https://github.com/hluk/CopyQ/actions?query=branch%3Amaster+event%3Apush+workflow%3AWindows) [![Coverage Status](https://codecov.io/gh/hluk/CopyQ/branch/master/graph/badge.svg)](https://codecov.io/gh/hluk/CopyQ) CopyQ is an advanced clipboard manager with powerful editing and scripting features. - [Downloads](https://github.com/hluk/CopyQ/releases) - [Web Site](https://hluk.github.io/CopyQ/) - [Documentation](https://copyq.readthedocs.io) - [Mailing List](https://groups.google.com/group/copyq) - [Bug Reports](https://github.com/hluk/CopyQ/issues) - [Donate](https://liberapay.com/CopyQ/) - [Scripting API](https://copyq.readthedocs.io/en/latest/scripting-api.html) ## Overview * CopyQ monitors the system clipboard and saves its content in customized tabs. * Saved clipboard entries can later be copied and pasted directly into any application. ## Features * Support for Linux, Windows, and [macOS 13+](https://doc.qt.io/qt-6/macos.html) * Store text, HTML, images, and any other custom formats * Quickly browse and filter items in clipboard history * Sort, create, edit, remove, copy/paste, drag'n'drop items in tabs * Add notes and tags to items * System-wide keyboard shortcuts with customizable commands * Paste items with keyboard shortcuts, from tray, or from main window * Fully customizable appearance * Advanced command-line interface and scripting * Ignore clipboard copied from specified windows or containing specified text * Support for simple Vim-like editor with keyboard shortcuts * Many more features ## Install Packaging status To install CopyQ, use the binary package or the installer provided for your operating system. For unlisted operating systems, please follow the instructions in [Build from Source Code](https://copyq.readthedocs.io/en/latest/build-source-code.html). ### Windows [![Chocolatey package](https://repology.org/badge/version-for-repo/chocolatey/copyq.svg)](https://repology.org/metapackage/copyq) On Windows you can use any of the following options to install CopyQ: * [Installer (setup.exe)](https://github.com/hluk/CopyQ/releases) * [Portable zip package](https://github.com/hluk/CopyQ/releases) * [Scoop package](https://scoop.sh/) from the [extras bucket](https://github.com/lukesampson/scoop-extras). * [Chocolatey package](https://chocolatey.org/packages/copyq) Using Scoop: ``` scoop install copyq ``` Using Chocolatey: ``` choco install copyq ``` ### macOS macOS 13 and above are supported (this mainly depends on the [Qt version](https://doc.qt.io/qt-6/macos.html)). [![Homebrew package](https://repology.org/badge/version-for-repo/homebrew_casks/copyq.svg)](https://repology.org/metapackage/copyq) On macOS you can use [Homebrew](https://brew.sh/) to install CopyQ: ```bash brew install --cask copyq ``` If you encounter an issue where the app crashes with a dialog saying "CopyQ is damaged" or "CopyQ cannot be opened", you may need to run the following commands (for details, see #2652): ```bash xattr -d com.apple.quarantine /Applications/CopyQ.app codesign --force --deep --sign - /Applications/CopyQ.app ``` ### Debian 11+, Ubuntu 22.04+, and their derivatives Install `copyq` and `copyq-plugins` packages. #### Ubuntu PPA Install and keep CopyQ always up to date by running the following commands from the terminal (the package from PPA contains all plugins and documentation): ```bash sudo apt install software-properties-common python-software-properties sudo add-apt-repository ppa:hluk/copyq sudo apt update sudo apt install copyq # this package contains all plugins and documentation ``` ### Fedora Install `copyq` package. ### Arch Linux Install `copyq` package. ### Other Linux Distributions Install [Flatpak](https://flatpak.org/) and `com.github.hluk.copyq` from [Flathub](https://flathub.org/). ```bash flatpak install flathub com.github.hluk.copyq ``` Start CopyQ from the menu or with the following command: ```bash flatpak run com.github.hluk.copyq ``` ## Using the App To start CopyQ, double-click the program icon or run `copyq`. The list with the clipboard history is accessible by clicking on the system tray icon or by running `copyq toggle`. Copying text or image to the clipboard will create a new item in the list. Selected items can be: * edited (`F2`) * removed (`Delete`) * sorted (`Ctrl+Shift+S`, `Ctrl+Shift+R`) * repositioned (with mouse or `Ctrl+Up/Down`) * copied back to the clipboard (`Ctrl+C`) * pasted to the previously active window (`Enter`) All items will be restored when CopyQ is next started. To exit CopyQ, select Exit from the tray menu or press `Ctrl-Q` in the CopyQ window. Read more: - [Basic Usage](https://copyq.readthedocs.io/en/latest/basic-usage.html) - [Keyboard](https://copyq.readthedocs.io/en/latest/keyboard.html) ### Adding Functionality To create custom actions that can be executed from the menu, with keyboard shortcuts, or when the clipboard changes: - go to the Command dialog (`F6` shortcut) - click the `Add` button, then select a predefined command, or create a new one - optionally change the command details (shortcut, name) - click `OK` to save the command One of the very useful predefined commands is "Show/hide main window". Read more: - [Writing Commands](https://copyq.readthedocs.io/en/latest/writing-commands-and-adding-functionality.html) - [CopyQ Commands Repository](https://github.com/hluk/copyq-commands) ### Command Line CopyQ has a powerful command line and scripting interface. Note: The main application must be running to be able to issue commands using the command line. Print help for some useful command line arguments: copyq --help copyq --help add Insert some text in the history: copyq add -- 'first item' 'second item' 'third item' Omitting the double-dash (`--`) in the command above would mean that slashes (`\`) in arguments will be treated as special characters. For example, `\n` will be treated as the new line character, `\t` as tab, `\\` as slash, `\x` as `x`, etc. Create a single item containing two lines: copyq add 'first line\nsecond line' Print the content of the first three items: copyq read 0 1 2 copyq separator "," read 0 1 2 Show the current clipboard content: copyq clipboard copyq clipboard text/html copyq clipboard \? # lists formats in clipboard Copy text to the clipboard: copyq copy "Some Text" Load file content into the clipboard: copyq copy - < file.txt copyq copy text/html < index.html copyq copy image/jpeg - < image.jpg Create image items: copyq write image/gif - < image.gif copyq write image/svg - < image.svg Read more: - [Scripting](https://copyq.readthedocs.io/en/latest/scripting.html) - [Scripting API](https://copyq.readthedocs.io/en/latest/scripting-api.html) ## Build from Source Code See the documentation section [Build from Source Code](https://copyq.readthedocs.io/en/latest/build-source-code.html). ## Contributions You can help translate CopyQ (click the banner below) or help [fix issues and implement new features](https://github.com/hluk/CopyQ/issues). [![Translations](https://hosted.weblate.org/widgets/copyq/-/287x66-white.png)](https://hosted.weblate.org/engage/copyq/?utm_source=widget) Read more: - [Build from Source Code](https://copyq.readthedocs.io/en/latest/build-source-code.html) - [Fixing Bugs and Adding Features](https://copyq.readthedocs.io/en/latest/fixing-bugs.html) - [Translations](https://copyq.readthedocs.io/en/latest/translations.html) ================================================ FILE: RELEASE.md ================================================ This is step-by-step description on how to release new version of CopyQ. # Update Version and Changelog Update `CHANGES.md` file (go through all commits since the last release tag). Bump the version: utils/bump_version.sh 14.0.0 Verify and push the changes: for r in origin gitlab; do git push --follow-tags $r master || break; done # Build Flatpak Update [flathub package](https://github.com/flathub/com.github.hluk.copyq): 1. Update "tag" and "commit" in "com.github.hluk.copyq.json" file. 2. Push to your fork. 3. [Create pull request](https://github.com/flathub/com.github.hluk.copyq/compare/master...hluk:master). 4. Verify the build when the build finishes (flathubbot will add comments). 5. Merge the changes if the build is OK. # Download Packages Pushing the version tag triggers GitHub Actions workflows that build and upload packages to the draft GitHub Release automatically: - Windows installer (`copyq-VERSION-setup.exe`) - Windows portable zip (`copyq-VERSION.zip`) - macOS Intel DMG (`CopyQ-macos-13.dmg`) - macOS Apple Silicon DMG (`CopyQ-macos-12-m1.dmg`) Check the [Actions tab](https://github.com/hluk/CopyQ/actions) for build progress. - Create source package: $COPYQ_SOURCE/utils/create_source_package.sh 14.0.0 # Checksums and Signing Create checksums and sign all new packages, source tarball and binaries: $COPYQ_SOURCE/utils/sign_released_files.sh This creates `checksums-sha512.txt` with the checksums and its signature in `cosign.bundle`. # Publish Release Create [release on GitHub](https://github.com/hluk/CopyQ/releases) for the new version tag. Upload packages and binaries to: - [github](https://github.com/hluk/CopyQ/releases) (include `checksums-sha512.txt` and `cosign.bundle`) - [sourceforge](https://sourceforge.net/projects/copyq/files/) Write release announcement to [CopyQ group](https://groups.google.com/forum/#!forum/copyq). ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = python -msphinx SPHINXPROJ = CopyQ SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/autobuild.sh ================================================ #!/bin/bash # Automatically re-build the documentation whenever it changes. # # Requires sphinx-autobuild script: # # pip install --user sphinx-autobuild # export PATH="$HOME/.local/bin:$PATH" # exec sphinx-autobuild \ --ignore '.*' \ --ignore "*.swp" \ --ignore "*~" \ . _build/html ================================================ FILE: docs/backup.rst ================================================ .. _backup: Backup ====== This page describes how to back up tabs, configuration and commands in CopyQ. Back Up All Data Automatically on Exit -------------------------------------- You can use `command that backs up all items, tabs and settings after exit `__. To install the command see `the description in the repository `__. Back Up Manually ---------------- To back up all the data, **exit the application** first and **copy the configuration directory** and **the data directory**. Path to the configuration is usually: - Windows: ``%APPDATA%\copyq`` - Portable version for Windows: ``config`` sub-folder in unzipped application directory - Linux: ``~/.config/copyq`` Path to the data is usually: - Windows: ``%APPDATA%\copyq\items`` - Portable version for Windows: ``items`` sub-folder in unzipped application directory - Linux: ``~/.local/share/copyq/copyq/items`` To copy the configuration path to clipboard from CopyQ: 1. Open Action dialog (``F5`` shortcut). 2. Enter the command: .. code-block:: js copyq: dir = Dir(info('config') + '/..') copy(dir.absolutePath()) 3. Click OK dialog button. To copy the data path, change ``'config'`` to ``'data'``. To restore the backup, exit the application and replace the configuration directory. .. warning:: Before making or restoring back up, always exit CopyQ (don't only close the main window). Export and Import ----------------- You can easily export selected tabs and optionally configuration and commands within the application. .. warning:: Tabs are exported **without any encryption** by default (you would need CopyQ 14.0.0 and above) and if a tab is synchronized with directory on disk the files themselves will not be exported. To export the data click "Export..." in "File" menu, select what to export, confirm with OK button and select target file to save. To restore the data click "Import..." in "File" menu, select file to import and select what to import. .. note:: Import will not overwrite existing tabs and commands but create new ones. Alternatively you can use command line for export and import everything (selection dialogs won't be opened). .. code-block:: bash copyq exportData {FILE/PATH/TO/EXPORT} copyq importData {FILE/PATH/TO/IMPORT} ================================================ FILE: docs/basic-usage.rst ================================================ Basic Usage =========== This page describes the basic functionality of CopyQ clipboard manager. First Start ----------- To start CopyQ, double-click the program icon or run command ``copyq``. This starts the graphical interface which can be accessed from the tray (NOTE: on OS X the tray defaults to the top-right of the screen and is not to be confused with Launchpad). Click the tray icon to show application window or right-click the tray icon and select "Show/Hide" or run ``copyq show`` command. .. image:: images/copyq-show.png :width: 400 :alt: copyq show The central element in the application window is **item list** containing **clipboard history**. By default, the application **stores any new clipboard content** in the list. If you copy some text it will immediately show at the top of the list. Try copying text or images from various application to see how this works. .. seealso:: :ref:`faq-disable-clipboard-storing` Basic Item Manipulation ----------------------- In the item list, press ``F2`` to **edit selected text items**. After editing, press ``F2`` again to **save the text**. Create **new item** with ``Ctrl+N``, type some text and press ``F2`` to save the new item. **Copy the selected items** back to clipboard with Enter key or ``Ctrl+C``. **Move items** around with ``Ctrl+Down`` and ``Ctrl+Up``. You can move important or special items to new tabs (see :ref:`tabs` for more info). Search ------ In the list you can **filter items by typing some text**. For example, typing "Example" hides items that don't contain "Example" text. Press Enter key to copy the first found item. Tray ---- To quickly copy item to clipboard, you can select the item from tray menu. To display the menu either right-click on tray icon, run command ``copyq menu`` or use a custom system shortcut. .. image:: images/copyq-menu.png :width: 400 :alt: copyq menu After selecting an item in tray menu and pressing enter (pressing a number key works as well), the item is copied to the clipboard. .. seealso:: :ref:`faq-show-app` :ref:`faq-paste-from-window` ================================================ FILE: docs/build-source-code.rst ================================================ Build from Source Code ====================== This page describes how to build the application from source code. Get the Source Code ------------------- Download the source code from git repository :: git clone https://github.com/hluk/CopyQ.git or download the latest source code archive from: - `latest release `__ - `master branch in zip `__ - `master branch in tar.gz `__ Install Dependencies -------------------- The build requires: - `CMake `__ - `Qt `__ Optional: - `miniaudio `__ -- for built-in audio playback (``playSound``) Debian / Ubuntu ^^^^^^^^^^^^^^^ On **Debian** and derivatives you can install all build dependencies with: :: sudo apt install \ build-essential \ cmake \ extra-cmake-modules \ git \ libminiaudio-dev \ libqt6svg6-dev \ libqt6waylandclient6 \ libwayland-dev \ libxfixes-dev \ libxtst-dev \ qt6-base-dev \ qt6-base-dev-tools \ qt6-base-private-dev \ qt6-declarative-dev \ qt6-l10n-tools \ qt6-tools-dev \ qt6-tools-dev-tools \ qt6-wayland \ qt6-wayland-dev \ qt6-wayland-dev-tools \ qtkeychain-qt6-dev On Debian 13 or Ubuntu 24.04 and newer, you can also install `QCA` packages: :: sudo apt install \ libqca-qt6-dev \ libqca-qt6-plugins On Debian 13 or Ubuntu 25.04 and newer, you can also install `KF6` packages: :: sudo apt install \ libkf6guiaddons-dev Fedora / RHEL / CentOS ^^^^^^^^^^^^^^^^^^^^^^ On **Fedora** and derivatives you can install all build dependencies with: :: sudo dnf install \ cmake \ extra-cmake-modules \ gcc-c++ \ git \ kf6-kguiaddons-devel \ kf6-knotifications-devel \ kf6-kstatusnotifieritem-devel \ libSM-devel \ libXfixes-devel \ libXtst-devel \ miniaudio-devel \ qca-qt6-devel \ qca-qt6-ossl \ qt6-qtbase-devel \ qt6-qtbase-private-devel \ qt6-qtdeclarative-devel \ qt6-qtsvg-devel \ qt6-qttools-devel \ qt6-qtwayland-devel \ qtkeychain-qt6-devel \ wayland-devel miniaudio (manual download) ^^^^^^^^^^^^^^^^^^^^^^^^^^ If your distribution does not package miniaudio, you can download the single header file directly into the source tree: :: curl -sSLo src/miniaudio.h \ https://raw.githubusercontent.com/mackron/miniaudio/0.11.25/miniaudio.h CMake will find it automatically. Alternatively, place ``miniaudio.h`` anywhere and point CMake to it with ``-DMINIAUDIO_INCLUDE_DIR=/path/to/dir``. Build and Install ----------------- Build the source code with CMake and make or using an IDE of your choice (see next sections). :: cd CopyQ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local . # Add -DWITH_QCA_ENCRYPTION=OFF for systems without `QCA` packages # Add -DWITH_NATIVE_NOTIFICATIONS=OFF for systems without `KF6` packages # Add -DWITH_AUDIO=OFF to disable audio support (or if miniaudio is unavailable) make make install Qt Creator ---------- Qt Creator is IDE focused on developing C++ and Qt applications. Install Qt Creator from your package manager or by selecting it from Qt installation utility. Set up Qt library, C++ compiler and CMake. .. seealso:: `Adding Kits `__ Open file ``CMakeLists.txt`` in repository clone to create new project. Visual Studio ------------- You need to install Qt for given version Visual Studio. In Visual Studio 2017 open folder containing repository clone using "File - Open - Folder". In older versions, create solution manually by running ``cmake -G "Visual Studio 14 2015 Win64" .`` (select appropriate generator name) in repository clone folder. .. seealso:: `CMake - Visual Studio Generators `__ Building and Packaging for OS X ------------------------------- On OS X, required Qt 6 libraries and utilities can be easily installed with `Homebrew `__. :: cd CopyQ git -C "utils/github/homebrew" init . git -C "utils/github/homebrew" add . git -C "utils/github/homebrew" commit -m "Initial" brew tap copyq/kde utils/github/homebrew/ # if the above "brew tap" command produces an error like # "Error: Tap copyq/kde remote mismatch" # then run # brew untap --force copyq/kde # and re-run the above "brew tap" command brew install qt6 copyq/kde/kf6-knotifications copyq/kde/kf6-kstatusnotifieritem Build with the following commands: :: cmake -DCMAKE_PREFIX_PATH="$(brew --prefix qt6)" . cmake --build . cpack To build with Qt 5 (make sure to install qt@5 yourself): :: cmake -DCMAKE_PREFIX_PATH="$(brew --prefix qt5)" -DWITH_QT6=OFF . cmake --build . cpack This will produce a self-contained application bundle ``CopyQ.app`` which can then be copied or moved into ``/Applications``. NOTE: If no Items are shown when you start CopyQ and open "File - Preferences - Items", then your CopyQ plugins were not installed. If you saw warning messages like this:: //install_name_tool: warning: changes being made to the file will invalidate the code signature in: //CopyQ/_CPack_Packages/Darwin/DragNDrop/copyq-6.2.0-Darwin/CopyQ.app/Contents/Plugins/.dylib when you ran the above "cpack" command, then you have likely encountered `issue 1903 `__. In that case you may codesign the CopyQ app again using the following command, un-install the previous CopyQ app, and install the re-signed ``CopyQ.app``:: codesign --force --deep --sign - $PWD/_CPack_Packages/Darwin/DragNDrop/copyq-*-Darwin/CopyQ.app ================================================ FILE: docs/command-examples.rst ================================================ .. _command-examples: Command Examples ================ Here are some useful commands for creating custom menu items, global shortcuts and automatically process new clipboard content in CopyQ. If you want to use any of the commands below, copy it to clipboard and paste it to the command list in Command dialog (opened with F6 shortcut). For detailed info see :ref:`faq-share-commands`. All these and more commands are available at `CopyQ command repository `__. Join Selected Items ~~~~~~~~~~~~~~~~~~~ Creates new item containing concatenated text of selected items. .. code-block:: ini [Command] Name=Join Selected Items Command=copyq add -- %1 InMenu=true Icon=\xf066 Shortcut=Space Paste Current Date and Time ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copies current date/time text to clipboard and pastes to current window on global shortcut Win+Alt+T. .. code-block:: ini [Command] Command=" copyq: var time = dateString('yyyy-MM-dd hh:mm:ss') copy('Current date/time is ' + time) paste()" GlobalShortcut=meta+alt+t Icon=\xf017 Name=Paste Current Time Play Sound when Copying to Clipboard ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following commands will play an audio file whenever something is copied to the clipboard. Built-in (Cross-Platform) ^^^^^^^^^^^^^^^^^^^^^^^^^ The built-in audio capabilities are available since version 14.0.0 and supports WAV, MP3 and FLAC formats on all platforms. .. code-block:: ini [Command] Name=Play Sound on Copy Command=" copyq: playSound('/path/to/notification.wav')" Automatic=true Icon=\xf028 To play at a lower volume: .. code-block:: ini [Command] Name=Play Sound on Copy (Quiet) Command=" copyq: playSound({file: '/path/to/notification.wav', volume: 25})" Automatic=true Icon=\xf028 Alternatively, if audio is not available in the app itself, you can use external utilities to play audio file mentioned below. Windows ^^^^^^^ Plays the user-specified audio file whenever something is copied to the clipboard. By default, this adds to the sound associated to native notifications rather than replacing it, so you may want to use Qt (non-native) notifications to use this. .. code-block:: ini [Command] Name=Play Sound on Copy Command=" powershell: (New-Object Media.SoundPlayer \"C:\\Users\\copy.wav\").PlaySync()" Automatic=true Icon=\xf028 GNU/Linux ^^^^^^^^^ Requires VLC multimedia player: .. code-block:: ini [Command] Name=Play Sound on Copy Command=" bash: cvlc --play-and-exit ~/audio/example.mp3" Automatic=true Icon=\xf028 `Alternative using the mpv player `__ Edit and Paste ~~~~~~~~~~~~~~ Following command allows to edit current clipboard text before pasting it. If the editing is canceled the text won't be pasted. .. code-block:: ini [Command] Command=" copyq: var text = dialog('paste', str(clipboard())) if (text) { copy(text) copySelection(text) paste() }" GlobalShortcut=ctrl+shift+v Icon=\xf0ea Name=Edit and Paste Remove Background and Text Colors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Removes background and text colors from rich text (e.g. text copied from web pages). Command can be both automatically applied on text copied to clipboard and invoked from menu (or using custom shortcut). .. code-block:: ini [Command] Automatic=true Command=" copyq: var html = str(input()) html = html.replace(/color\\s*:/g, 'xxx:') setData('text/html', html)" Icon=\xf042 InMenu=true Input=text/html Name=Remove Background and Text Colors Linkify ~~~~~~~ Stores an item with interactive link from plain text URL copied to clipboard. .. code-block:: ini [Command] Automatic=true Command=" copyq: const link = str(input()); const href = `${link}`; setData('text/html', href);" Icon=\xf127 Input=text/plain Match=^(https?|ftps?|file|mailto):// Name=Linkify Highlight Text ~~~~~~~~~~~~~~ Highlight all occurrences of a text (change ``x = "text"`` to match something else than ``text``). .. code-block:: ini [Command] Name=Highlight Text Command=" copyq: x = 'text' style = 'background: yellow; text-decoration: underline' text = str(input()) x = x.toLowerCase() lowertext = text.toLowerCase() html = '' a = 0 esc = function(a, b) { return escapeHTML( text.substr(a, b - a) ) } while (1) { b = lowertext.indexOf(x, a) if (b != -1) { html += esc(a, b) + '' + esc(b, b + x.length) + '' } else { html += esc(a, text.length) break } a = b + x.length; } tab( selectedtab() ) write( index(), 'text/plain', text, 'text/html', '' + html + '' )" Input=text/plain Wait=true InMenu=true Render HTML ~~~~~~~~~~~ Render HTML code. .. code-block:: ini [Command] Name=Render HTML Match=^\\s*<(!|html) Command=" copyq: tab(selectedtab()) write(index() + 1, 'text/html', input())" Input=text/plain InMenu=true Translate to English ~~~~~~~~~~~~~~~~~~~~ Pass to text to `Google Translate `__. .. code-block:: ini [Command] Name=Translate to English Command=" copyq: text = str(input()) url = \"https://translate.google.com/#auto/en/???\" x = url.replace(\"???\", encodeURIComponent(text)) html = '' tab(selectedtab()) write(index() + 1, \"text/html\", html)" Input=text/plain InMenu=true Paste and Forget ~~~~~~~~~~~~~~~~ Paste selected items and clear clipboard. .. code-block:: ini [Command] Name=Paste and Forget Command=" copyq: tab(selectedtab()) items = selecteditems() if (items.length > 1) { text = '' for (i in items) text += read(items[i]); copy(text) } else { select(items[0]) } hide() paste() copy('')" InMenu=true Icon=\xf0ea Shortcut=Ctrl+Return Render Math Equations ~~~~~~~~~~~~~~~~~~~~~ Render math equations using `MathJax `__ (e.g. ``$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}$$``). .. code-block:: ini [Command] Name=Render Math Equations Command=" copyq: text = str(input()) js = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML' html = '' + escapeHTML(text) + ''; tab(selectedtab()) write(index() + 1, 'text/html', html)" Input=text/plain InMenu=true Icon=\xf12b Move Images to Other Tab ~~~~~~~~~~~~~~~~~~~~~~~~ With this command active, images won't be saved in the first tab. This can make application a bit more snappier since big image data won't need to be loaded when main window is displayed or clipboard is stored for the first time. .. code-block:: ini [Command] Name=Move Images to Other Tab Input=image/png Automatic=true Remove=true Icon=\xf03e Tab=&Images Copy Clipboard to Window Tabs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Following command automatically adds new clipboard to tab with same name as title of the window where copy operation was performed. .. code-block:: ini [Command] Name=Window Tabs Command="copyq: item = unpack(input()) window_title = item[\"application/x-copyq-owner-window-title\"] if (window_title) { // Remove the part of window title before dash // (it's usually document name or URL). tabname = str(window_title).replace(/.* (-|\x2013) /, \"\") tab(\"Windows/\" + tabname) write(\"application/x-copyq-item\", input()) } " Input=application/x-copyq-item Automatic=true Icon=\xf009 Quickly Show Current Clipboard Content ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Quickly pop up notification with text in clipboard using ``Win+Alt+C`` system shortcut. .. code-block:: ini [Command] Name=Show clipboard Command=" copyq: seconds = 2; popup(\"\", clipboard(), seconds * 1000)" GlobalShortcut=Meta+Alt+C Replace All Occurrences in Selected Text ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: ini [Command] Command=" copyq: copy(); const text = str(clipboard()); if (text) { const r1 = 'Text'; const r2 = 'Replace with'; const reply = dialog(r1, '', r2, ''); if (reply) { copy(text.replace(new RegExp(reply[r1], 'g'), reply[r2])); paste(); } }" GlobalShortcut=meta+alt+r Icon= IsGlobalShortcut=true Name=Replace in Selection Copy Nth Item ~~~~~~~~~~~~~ Copy item in row depending on which shortcut was pressed. E.g. Ctrl+2 for item in row "2". .. code-block:: ini [Command] Name=Copy Nth Item Command=" copyq: var shortcut = str(data(\"application/x-copyq-shortcut\")); var row = shortcut ? shortcut.replace(/^\\D+/g, '') : currentItem(); var itemIndex = (config('row_index_from_one') == 'true') ? row - 1 : row; selectItems(itemIndex); copy(\"application/x-copyq-item\", pack(getItem(itemIndex)));" InMenu=true Icon=\xf0cb Shortcut=ctrl+1, ctrl+2, ctrl+3, ctrl+4, ctrl+5, ctrl+6, ctrl+7, ctrl+8, ctrl+9, ctrl+0 Edit Files ~~~~~~~~~~ Opens files referenced by selected item in external editor (uses "External editor command" from "History" config tab). Works with following path formats (some editors may not support all of these). - ``C:/...`` - ``file://...`` - ``~...`` (some shells) - ``%...%...`` (Windows environment variables) - ``$...`` (environment variables) - ``/c/...`` (gitbash) .. code-block:: ini [Command] Name=Edit Files Match=^([a-zA-Z]:[\\\\/]|~|file://|%\\w+%|$\\w+|/) Command=" copyq: var editor = config('editor') .replace(/ %1/, '') var filePaths = str(input()) .replace(/^file:\\/{2}/gm, '') .replace(/^\\/(\\w):?\\//gm, '$1:/') .split('\\n') var args = [editor].concat(filePaths) execute.apply(this, args)" Input=text/plain InMenu=true Icon=\xf040 Shortcut=f4 Change Monitoring State Permanently ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Disables clipboard monitoring permanently, i.e. the state is restored when clipboard changes even after application is restarted. Should be the first automatic command in the list of commands so other commands are not invoked. .. code-block:: ini [Command] Automatic=true Command=" copyq: var option = 'disable_monitoring' var disabled = str(settings(option)) === 'true' if (str(data('application/x-copyq-shortcut'))) { disabled = !disabled settings(option, disabled) popup('', disabled ? 'Monitoring disabled' : 'Monitoring enabled') } if (disabled) { disable() ignore() } else { enable() }" GlobalShortcut=meta+alt+x Icon=\xf05e Name=Toggle Monitoring Show Window Title ~~~~~~~~~~~~~~~~~ Shows source application window title for new items in tag ("Tags" plugin must be enabled in "Items" config tab). .. code-block:: ini [Command] Automatic=true Command=" copyq: var window = str(data('application/x-copyq-owner-window-title')) var tagsMime = 'application/x-copyq-tags' var tags = str(data(tagsMime)) + ', ' + window setData(tagsMime, tags)" Icon=\xf009 Name=Store Window Title Show Copy Time ~~~~~~~~~~~~~~ Shows copy time of new items in tag ("Tags" plugin must be enabled in "Items" config tab). .. code-block:: ini [Command] Automatic=true Command=" copyq: var time = dateString('yyyy-MM-dd hh:mm:ss') setData('application/x-copyq-user-copy-time', time) var tagsMime = 'application/x-copyq-tags' var tags = str(data(tagsMime)) + ', ' + time setData(tagsMime, tags)" Icon=\xf017 Name=Store Copy Time Mark Selected Items ~~~~~~~~~~~~~~~~~~~ Toggles highlighting of selected items. .. code-block:: ini [Command] Command=" copyq: var color = 'rgba(255, 255, 0, 0.5)' var mime = 'application/x-copyq-color' var firstSelectedItem = selectedItems()[0] var currentColor = str(read(mime, firstSelectedItem)) if (currentColor != color) setData(mime, color) else removeData(mime)" Icon=\xf1fc InMenu=true Name=Mark/Unmark Items Shortcut=ctrl+m Change Upper/Lower Case of Selected Text ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: ini [Command] Command=" copyq: if (!copy()) abort() var text = str(clipboard()) var newText = text.toUpperCase() if (text == newText) newText = text.toLowerCase() if (text == newText) abort(); copy(newText) paste()" GlobalShortcut=meta+ctrl+u Icon=\xf034 Name=Toggle Upper/Lower Case Change Copied Text to Title Case ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: ini [Command] Name=Paste as title case Command=" copyq: function toTitleCase(str) { return str.replace( /\\w\\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); } ); } copy(toTitleCase(str(input()))) paste() " Input=text/plain IsGlobalShortcut=true HideWindow=true Icon=\xf15b GlobalShortcut=meta+ctrl+t ================================================ FILE: docs/command-line.rst ================================================ Command Line ============ Tabs, items, clipboard and configuration can be changed through command line interface. Run command ``copyq help`` to see complete list of commands and their description. .. warning:: On Windows, you may not see any output when executing CopyQ in terminal/console (PowerShell or cmd). See workarounds in :ref:`known-issue-windows-console-output`. To add new item to tab with name "notes" run: :: copyq tab notes add "This is the first note." To print the item: :: copyq tab notes read 0 Add other item: :: copyq tab notes add "This is second note." and print all items in the tab: :: copyq eval -- "tab('notes'); for(i=size(); i>0; --i) print(str(read(i-1)) + '\n');" This will print: :: This is the first note. This is second note. Among other things that are possible with CopyQ are: * open video player if text copied in clipboard is URL with multimedia * store text copied from a code editor in "code" tab * store URLs in different tab * save screenshots (print-screen) * load all files from directory to items (create image gallery) * replace a text in all matching items * run item as a Python script ================================================ FILE: docs/commands-display.rst ================================================ .. _commands-display: Display Commands ================ Display command is type of command that modifies item data before displaying. The modified data are only used for displaying the item and are not stored. The command is executed just before an item needs to be displayed. This can sometimes happen multiple times for the same item if the data or configuration changes or the tab was unloaded. Display commands can be created in Command dialog by setting Type of Action to :ref:`command-dialog-display`. Use ``data()`` to retrieve current item data and ``setData()`` to set the data to display (these are not stored permanently). E.g. use slightly different color for plain text items. .. code-block:: js copyq: if ( str(data(mimeText)) && !str(data(mimeHtml)) ) { html = escapeHtml(data(mimeText)) setData(mimeHtml, '' + html + '') } E.g. try to interpret text as Markdown (with ``marked`` external utility). .. code-block:: js copyq: var text = data(mimeText) var result = execute('marked', null, text) if (result && result.exit_code == 0) { setData(mimeHtml, result.stdout) } ================================================ FILE: docs/commands-script.rst ================================================ .. _commands-script: Script Commands =============== Script command is type of command which allows overriding existing functions and creating new ones (allowing new command line arguments to be used). The command is executed before any script and all defined variables and functions are available to the scripts. Script commands can be created in Command dialog by setting Type of Action to :ref:`command-dialog-script`. Extending Command Line Interface -------------------------------- By adding following script command you can use ``hello()`` from other script or on command line (``copyq hello``): .. code-block:: js global.hello = function() { print('Hello, World!\n') } Script commands are executed in own scope so as to avoid adding temporary variables in the global scope which contains all functions like ``copy()`` or ``add()``. Using ``global`` object allows to modify the global scope. It's useful to move code used by multiple commands to a new script command. It can also simplify using ``copyq`` from another application or shell script. Override Functionality ---------------------- Existing functions can be overridden from script commands. Specifically :any:`onClipboardChanged` and functions it calls can be overridden to customize handling of new clipboard content. E.g. following command saves only textual clipboard data and removes any formatted text: .. code-block:: js var saveData_ = saveData saveData = function() { if ( str(data(mimeText)) != "" ) { popup('Saving only text') removeData(mimeHtml) saveData_() } else { popup('Not saving non-textual data') } } E.g. following command overrides ``paste()`` to use an external utility for pasting clipboard: .. code-block:: js paste = function() { var x = execute( 'xdotool', 'keyup', 'alt', 'ctrl', 'shift', 'super', 'meta', 'key', 'shift+Insert') if (!x) throw 'Failed to run xdotool' if (x.stderr) throw 'Failed to run xdotool: ' + str(x.stderr) } E.g. show custom notifications for clipboard and primary selection changes. .. code-block:: js function clipboardNotification(owns, hidden) { var id = isClipboard() ? 'clipboard' : 'selection' var icon = isClipboard() ? '\uf0ea' : '\uf246' var owner = owns ? 'CopyQ' : str(data(mimeWindowTitle)) var title = id + ' - ' + owner var message = hidden ? '' : data(mimeText).left(100) notification( '.id', id, '.title', title, '.message', message, '.icon', icon ) } var onClipboardChanged_ = onClipboardChanged onClipboardChanged = function() { clipboardNotification(false, false) onClipboardChanged_() } var onOwnClipboardChanged_ = onOwnClipboardChanged onOwnClipboardChanged = function() { clipboardNotification(true, false) onOwnClipboardChanged_() } var onHiddenClipboardChanged_ = onHiddenClipboardChanged onHiddenClipboardChanged = function() { clipboardNotification(true, true) onHiddenClipboardChanged_() } ================================================ FILE: docs/conf.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # # CopyQ documentation build configuration file, created by # sphinx-quickstart on Sat May 27 07:37:30 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # #source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General information about the project. project = 'CopyQ' copyright = '2024, Lukas Holecek' author = 'Lukas Holecek' title = 'CopyQ Documentation' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. #version = '' # The full version, including alpha/beta/rc tags. #release = '' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". #html_static_path = ['_static'] # Logo and favicon html_logo = '../src/images/icon_64x64.png' html_favicon = '../src/images/icon_32x32.png' # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = 'CopyQdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'CopyQ.tex', title, author, 'manual'), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'copyq', title, [author], 1) ] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'CopyQ', title, author, 'CopyQ', 'One line description of project.', 'Miscellaneous'), ] # Localization locale_dirs = ['locale/'] ================================================ FILE: docs/customize-and-build-the-windows-installer.rst ================================================ Customize and Build the Windows Installer ========================================= Translations ------------ Most of the translations for the installer are taken directly from the installer generator Inno Setup (http://www.jrsoftware.org/isinfo.php). You can add translations for CopyQ-specific messages in ``shared/copyq.iss``. Just copy lines starting with ``en.`` from ``[Custom Messages]`` section and change prefix to ``de.`` (for german translation). Modify and Test Installation ---------------------------- Normally the installation file is generated automatically by CI which creates a portable app folder from build files and runs Inno Setup. You don't have to build the app again, you just need: 1. Download the unzipped portable version of the app. 2. Clone of this repository. 3. Install `Inno Setup `__. 4. Open `shared/copyq.iss `__ in Inno Setup and add few lines at the beginning of the file. :: #define AppVersion 2.8.1-beta #define Source C:\path\to\CopyQ-repository-clone #define Destination C:\path\to\CopyQ-portable You should now be able to modify the file in Inno Setup and run it easily. ================================================ FILE: docs/faq.rst ================================================ FAQ - Frequently Asked Questions ================================ .. _faq-show-app: How to open CopyQ window or tray menu using shortcut? ----------------------------------------------------- Add new command to open the CopyQ window or menu with a global shortcut: 1. Open "Command" dialog (``F6`` shortcut). 2. Click "Add" button in the dialog. 3. Select "Show/hide main window" or "Show the tray menu" from the list and click "OK" button. 4. Click the button next to "Global Shortcut" label and set the shortcut. 5. Click "OK" button to save the changes. For more information about commands see :ref:`writing-commands`. .. _faq-paste-from-window: How to paste double-clicked item from CopyQ window? --------------------------------------------------- 1. Open "Preferences" (``Ctrl+P`` shortcut). 2. Go to "History" tab. 3. Enable "Paste to current window" option. Next time you open the CopyQ main window and activate an item, it should be pasted. .. _faq-paste-text: How to paste as plain text? --------------------------- To **paste clipboard as plain text**: 1. Open "Command" dialog (``F6`` shortcut). 2. Click "Add" button in the dialog. 3. Select "Paste clipboard as plain text" from the list and click "OK" button. 4. Click the button next to "Global Shortcut" label and set the shortcut. 5. Click "OK" button to save the changes. To **paste selected items as plain text** (from CopyQ window) follow the steps above but add "Paste as Plain Text" command instead and change "Shortcut". .. _faq-store-text: How to store only plain text? ----------------------------- To **disallow storing HTML and rich text**: 1. Open "Preferences" (``Ctrl+P`` shortcut). 2. Go to "Items" tab. 3. Disable "Web" item in the list. 4. Select "Text" item. 5. Disable "Save and display HTML and rich text". Similarly, you can also disable "Images" in the list to avoid storing and rendering images. Existing items won't be affected but **any data formats can be removed**: 1. Select an item. 2. Press ``F4`` shortcut ("Item - Show Content..." in menu). 3. Select format from list. 4. Press ``Delete`` key. .. _faq-disable-clipboard-storing: How to disable storing clipboard? --------------------------------- To temporarily disable storing the clipboard in the CopyQ item list, select menu item "File - Disable Clipboard Storing" (``Ctrl+Shift+X`` shortcut). To re-enable the functionality select "File - Enable Clipboard Storing" (same shortcut). To permanently disable storing the clipboard in CopyQ: 1. Open "Preferences" (``Ctrl+P`` shortcut). 2. Go to "History" tab. 3. Clear "Tab for storing clipboard" field. How to back up tabs, configuration and commands? ------------------------------------------------ From menu select "File - Export" and choose which tabs to export and whether to export configuration and commands. To restore the backup, select menu item "File - Import", select the exported file, and then choose what to import back. .. note:: Importing tabs and commands won't override existing tabs, and will create new ones. See also: :ref:`backup` .. _faq-disable-notifications: How to enable or disable displaying notification when clipboard changes? ------------------------------------------------------------------------ To enable displaying the notifications: 1. Open "Preferences" (``Ctrl+P`` shortcut). 2. Go to "Notifications" tab. 3. Set non-zero value for "Interval in seconds to display notifications". 4. Set non-zero value for "Number of lines for clipboard notification". 5. Click "OK" button. To enable displaying the notifications, set either of the options mentioned above to zero. .. _faq-share-commands: How to load shared commands and share them? ------------------------------------------- You can stumble upon code that looks like this. .. code-block:: ini [Command] Name=Show/hide main window Command=copyq: toggle() Icon=\xf022 GlobalShortcut=ctrl+shift+1 This code represents a command that can used in CopyQ (specifically it opens main window on Ctrl+Shift+1). To use the command in CopyQ: 1. Copy the code above. 2. Open "Command" dialog (``F6`` shortcut). 3. Click "Paste Commands" button at the bottom of the dialog. 4. Click OK button. (Now you should be able to open main window with Ctrl+Shift+1.) To share your commands, you can select the commands from command list in "Command" dialog and press "Copy Selected" button (or just hit Ctrl+C). .. _faq-ignore-password-manager: How to omit storing text copied from specific windows like a password manager? ------------------------------------------------------------------------------ Add and modify automatic command to ignore text copied from the window: 1. Open "Command" dialog (``F6`` shortcut). 2. Click "Add" button in the dialog. 3. Select "Ignore *Password* window" from the list and click "OK" Button. 4. Select "Show Advanced" 5. Change "Window" text box to match the title (or part of it) of the Window to ignore (e.g. ``KeePass``). But for **KeePassXC** (and possibly other apps), it is better to set "Format" to ``x-kde-passwordManagerHint`` instead (also remember to remove the default that is set in the "Window" setting, since both "Window" and "Format" need to match if they're set). 6. Click "OK" button to save the changes. .. note:: This new command should be at the top of the command list because automatic commands are executed in the order they appear in the list, and we don't want to process sensitive data in any way. In some cases, e.g. the password manager is an extension of a web browser or a password is copied from a menu instead of a window, the command above won't work. You can try setting the "Window" text box to ``^$``, which usually matches popup menus. For a more reliable way, use `a command to blacklist texts `__ (it stores just a salted hash, the text itself is not stored anywhere). .. _faq-logging: How to enable logging? ---------------------- Set environment variable ``COPYQ_LOG_LEVEL`` to ``DEBUG`` for verbose logging and set ``COPYQ_LOG_FILE`` to a file path for the log. You can copy current log file path to clipboard from Action dialog (F5 shortcut) by entering command ``copyq 'copy(info("log"))'``. Alternatively, press ``F12`` to directly access the log. If you **cannot access GUI**, you can **restart CopyQ from terminal** and **log to a separate file**. On Linux and macOS: .. code-block:: zsh copyq exit export COPYQ_LOG_LEVEL='DEBUG' export COPYQ_LOG_FILE="$HOME/copyq.log" echo "Logs will be written to $COPYQ_LOG_FILE" copyq On Windows (in PowerShell): .. code-block:: powershell & 'C:\Program Files\CopyQ\copyq.exe' exit $env:COPYQ_LOG_LEVEL = 'DEBUG' $env:COPYQ_LOG_FILE = [Environment]::GetFolderPath("MyDocuments") + '\copyq.log' echo "Logs will be written to $env:COPYQ_LOG_FILE" & 'C:\Program Files\CopyQ\copyq.exe' How to preserve the order of copied items when copying or pasting multiple items? --------------------------------------------------------------------------------- a. Reverse order of selected items with ``Ctrl+Shift+R`` and copy them. b. Alternatively, select items in reverse order and then copy. See `#165 `__. How does pasting single/multiple items work internally? ------------------------------------------------------- ``Return`` key copies the whole item (with all formats) to the clipboard and -- if the "Paste to current window" option is enabled -- it sends ``Shift+Insert`` to previous window. So the target application decides what format to paste on ``Shift+Insert``. If you select more items and press ``Return``, just the concatenated text of selected items is put into the clipboard. Though it could do more in future, like join HTML, images or other formats. See `#165 `__. Why does pasting from CopyQ not work? ------------------------------------- Pasting from CopyQ works only on Windows, macOS and X11 on Linux. Specifically, this feature is not supported on Wayland, but you can use the workaround: :ref:`known-issue-wayland` First, check if you have the appropriate options enabled: a. For pasting from main window, enable "Paste to current window" in "History" configuration tab. b. For pasting from tray menu, enable "Paste activated item to current window" in "Tray" configuration tab. If the pasting still doesn't work, check if ``Shift+Insert`` shortcut pastes to the target window. That's the shortcut CopyQ uses by default. To change this to ``Ctrl+V`` see `#633 `__. If pasting still doesn't work, it could be caused by either of these problems: - CopyQ fails to focus the target window correctly. - The format copied to the clipboard is not supported by the target application. How to open the menu or context menu with only the keyboard? ------------------------------------------------------------ Use ``Alt+I`` to open the item menu or use the ``Menu`` key on your keyboard to open the context menu for selected items. .. _faq-hide-menu-bar: How to hide the menu bar in the main CopyQ window? -------------------------------------------------- The menu bar can be hidden by modifying the style sheet of the current theme. 1. Open "Preferences" (``Ctrl+P`` shortcut). 2. Go to "Appearance" tab. 3. Enable checkbox "Set colors for tabs, tool bar and menus". 4. Click "Edit Theme" button. 5. Find ``menu_bar_css`` option and add ``height: 0``: .. code-block:: ini menu_bar_css=" ;height: 0 ;background: ${bg} ;color: ${fg}" How to reuse file paths copied from a file manager? --------------------------------------------------- By default, only the text is stored in item list when you copy or cut files from a file manager. Other data is usually needed to be able to copy/paste files from CopyQ. You have to add additional data formats (MIME) using an automatic command (similar to one below). The commonly used format in many file managers is ``text/uri-list``. Other special formats include ``x-special/gnome-copied-files`` for Nautilus and ``application/x-kde-cutselection`` for Dolphin. These formats are used to specify type of action (copy or cut). .. code-block:: ini [Command] Command=" var originalFunction = global.clipboardFormatsToSave global.clipboardFormatsToSave = function() { return originalFunction().concat([ mimeUriList, 'x-special/gnome-copied-files', 'application/x-kde-cutselection', ]) }" Icon=\xf0c1 IsScript=true Name=Store File Manager Metadata How to trigger a command based on primary selection only? --------------------------------------------------------- You can check ``application/x-copyq-clipboard-mode`` format in automatic commands. E.g. if you set input format of a command it will be only executed on Linux mouse selection change: .. code-block:: ini [Command] Automatic=true Command=" copyq: popup(input())" Input=application/x-copyq-clipboard-mode Name=Executed only on X11 selection change Otherwise you can check it in command: .. code-block:: ini [Command] Automatic=true Command=" copyq: if (str(data(mimeClipboardMode)) == 'selection') popup('selection changed') else popup('clipboard changed')" Name=Show clipboard/selection change Why can I no longer paste from the application on macOS? -------------------------------------------------------- See: :ref:`known-issue-macos-paste-after-install` Why does my external editor fail to edit items? ----------------------------------------------- CopyQ creates a temporary file with content of the edited item and passes it as argument to the custom editor command. If the file changes, the item is also modified. Usual issues are: - External editor opens an empty file. - External editor warns that the file is missing. - Saving the file doesn't have any effect on the origin item. This happens if **the command to launch the editor exits, but the editor application itself is still running**. Since the command exited, CopyQ assumes that the editor itself is no longer running, and stops monitoring the changes in the temporary file (and removes the file). Here is the correct command to use for some editors:: emacsclientw.exe --alternate-editor="" %1 gvim --nofork %1 sublime_text --wait %1 code --wait %1 open -t -W -n %1 .. _faq-config-path: Where to find saved items and configuration? -------------------------------------------- You can find configuration and saved items in: a. Windows folder ``%APPDATA%\copyq`` for installed version of CopyQ. b. Windows sub-folder ``config`` in unzipped portable version of CopyQ. c. Linux directory ``~/.config/copyq``. d. In a directory specific to a given CopyQ instance - see :ref:`sessions`. Run ``copyq info config`` to get absolute path to the configuration file (parent directory contains saved items). Why are items and configuration not saved? ------------------------------------------ Check access rights to configuration directory and files. Why do global shortcuts not work? --------------------------------- Global/system shortcuts (or specific key combinations) don't work in some desktop environments (e.g. Wayland on Linux). As a workaround, you can try to assign the shortcuts in your system settings. To get the command to launch for a shortcut: 1. Open Command dialog (F6 from main window). 2. Click on the command with the global shortcut in the left panel. 3. Enable "Show Advanced" checkbox. 4. Copy the content of "Command" text field. .. note:: If the command looks like this: :: copyq: toggle() the actual command to use is: :: copyq -e "toggle()" .. _faq-force-hide-main-window: Why doesn't the main window close on tiling window managers? ------------------------------------------------------------ The main window remains open if it cannot minimize to task bar and tray icon is not available. This is a safety feature to allow users to see that the application is running and make any initial setup when the app is started for the first time. To force hiding main window: 1. Open "Preferences" (``Ctrl+P`` shortcut). 2. Go to "Layout" tab. 3. Enable "Hide main window" option. Alternatively, run the following command:: copyq config hide_main_window true Why does encryption ask for password so often? ---------------------------------------------- CopyQ 14.0.0 and above has a built-in encryption support, which requires password only at start (and when changing encryption password). Even that can be avoided if "Use external key store" option is enabled and the system supports it (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet). In older versions, there is an Encryption plugin which uses ``gpg2`` utility to decrypt tabs and items. The password usually needs to be entered once every few minutes. If the password prompt is showing up too often, either increase tab unloading interval ("Unload tab after an interval" option in "History" tab in Preferences), or change ``gpg`` configuration (see `#946 `__). How to fix "copyq: command not found" errors? --------------------------------------------- If you're getting ``copyq: command not found`` or similar error, it means that the ``copyq`` executable cannot be found by the shell or a language interpreter. This usually happens if the executable's directory is not in the ``PATH`` environmental variable. If this happens when running from within the command, e.g. .. code-block:: bash bash: text="SOME TEXT" copyq copy "$text" you can **fix it by using** ``COPYQ`` environment variable instead. .. code-block:: bash bash: text="SOME TEXT" "$COPYQ" copy "$text" What to do when CopyQ crashes or misbehaves? -------------------------------------------- When CopyQ crashes or doesn't behave as expected, try to look up a similar `issue `__ first and provide details in a comment for that issue. If you cannot find any such an issue, `report a new bug `__. Try to provide the following details: - CopyQ version - operating system (desktop environment, window manager, etc.) - steps to reproduce the issue - application log (see :ref:`faq-share-commands`) - stacktrace if available (e.g. on Linux ``coredumpctl dump --reverse copyq``) ================================================ FILE: docs/fixing-bugs.rst ================================================ Fixing Bugs and Adding Features =============================== This page describes how to build, fix and improve the source code. Making Changes -------------- Pull requests are welcome at `github project page `__. For more info see `Creating a pull request from a fork `__. Try to keep the code style consistent with the existing code. Build the Debug Version ----------------------- .. code-block:: bash mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_TESTS=ON .. make Run Tests --------- You can run automated tests if the application is built either in debug mode, with CMake flag ``-DWITH_TESTS=ON``. Run the tests with following command. .. code-block:: bash copyq tests This command will execute all test cases in new special CopyQ session so that user configuration, tabs and items are not modified. It's better to close any other CopyQ session before running tests since they can affect test results. While running tests there must be **no keyboard and mouse interaction**. Preferably you can execute the tests in separate virtual environment. On Linux you can run the tests on virtual X11 server with ``xvfb-run``. .. code-block:: bash xvfb-run sh -c 'openbox & sleep 1; copyq tests' Test invocation examples: - Print help for tests: ``copyq tests --help`` - Run specific tests: ``copyq tests commandHelp commandVersion`` - Run specific tests for a plugin: ``copyq tests 'PLUGINS:pinned' isPinned`` - Run tests only for specific plugins: ``copyq tests 'PLUGINS:pinned|tags'`` - List tests: ``copyq tests -functions`` - List tests for a plugin: ``copyq tests PLUGINS:tags -functions`` - Less verbose tests: ``copyq tests -silent`` - Slower GUI tests: ``COPYQ_TESTS_KEYS_WAIT=1000 COPYQ_TESTS_KEY_DELAY=50 copyq tests editItems`` ================================================ FILE: docs/glossary.rst ================================================ .. _glossary: Glossary ======== Here is a list of frequent terms from CopyQ. - Action - a command run from Action dialog - Clipboard - system clipboard that stores and provides copied stuff (``Ctrl+C``) - Command - user-defined command or script executed by the app - Item - element stored in a tab, usually automatically created from a new clipboard content - Main window - main application window shown by selecting "Show" from tray menu - Plugin - a binary file which adds some functionality when app starts - Process - an executed command - Script - simple code written in internal scripting language used by the app - Tray - tray or notification area in panel, contains small icons for various applications - Tray menu - menu invoked from app icon in tray (usually by right mouse button click) - Tab - container for multiple items, similar to tabs in modern web browsers ================================================ FILE: docs/images.rst ================================================ Images ====== This page describes how to display and work with images in CopyQ. Display Image Items ------------------- Displaying images can be configured in "Items" configuration tab. On Windows, "Item Image" plugin needs to be installed. To disable storing and displaying image, disable the Image plugin (uncheck the checkbox next to "Image" in configuration). Editor ------ Editors for bitmap and SVG images can be set in the configuration. .. image:: images/image-editor.png Editing an image item (default shortcut is Ctrl+E) should open the image editor. Unfortunately, sometimes an item looks like an image but is an HTML. You can list available formats in Content dialog F4. Preview Image ------------- It's useful to limit size of image item to a maximum width and height in the configuration. You can still display the whole image in Preview dock (F7) or using Content dialog (F4). Take Screenshots ---------------- You can use built-in functionality for `taking screenshots `__ of whole or part of the desktop. Paste taken screenshots to CopyQ to store them for later use. Save Image to a File -------------------- To save an image to a file, either copy it or drag'n'drop it to a file manager (if supported) or save it using command line. .. code-block:: bash copyq read image/png 0 > image.png Alternatively use `"Save Item/Clipboard To a File" command `__. ================================================ FILE: docs/index.rst ================================================ Welcome to CopyQ's documentation! ================================= CopyQ is clipboard manager -- a desktop application which stores content of the system clipboard whenever it changes and allows to search the history and copy it back to the system clipboard or paste it directly to other applications. This documentation describes some basic concepts and workflows as well as more advanced topics like scripting and application development process. .. toctree:: :caption: The Basics :maxdepth: 2 installation basic-usage tabs-and-items keyboard images tags security theme faq known-issues glossary .. toctree:: :caption: Advanced Topics :maxdepth: 2 command-line sessions pin-items password-protection synchronize writing-commands-and-adding-functionality scripting command-examples commands-script commands-display backup writing-raw-data scripting-api .. toctree:: :caption: Development :maxdepth: 2 build-source-code fixing-bugs source-code-overview translations text-encoding customize-and-build-the-windows-installer ================================================ FILE: docs/installation.rst ================================================ Installation ============ Packages and installation files are available at `Releases page `__. Alternatively, you can install the app with one of the following methods: On **Windows**, you can install `Chocolatey package `__. On **macOS** (13 and above), you can use `Homebrew `__ to install the app (also see the problem in the next section): .. code-block:: bash brew install --cask copyq On **macOS**, if you encounter an issue where the app crashes with a dialog saying "CopyQ is damaged" or "CopyQ cannot be opened", you may need to run the following commands (for details, see `issue #2652 `__): .. code-block:: bash xattr -d com.apple.quarantine /Applications/CopyQ.app codesign --force --deep --sign - /Applications/CopyQ.app On **macOS**, after Homebrew installation, the ``copyq`` CLI command is not available by default. To enable CLI access, create a symlink manually: .. code-block:: bash sudo ln -sf /Applications/CopyQ.app/Contents/MacOS/CopyQ /usr/local/bin/copyq After this, you can use the CLI: .. code-block:: bash copyq --version copyq clipboard copyq size On **Debian** and **Ubuntu+** install a stable version from official repositories: .. code-block:: bash sudo apt install copyq # copyq-plugins and copyq-doc is split out and can be installed independently On **Fedora**, install "copyq" package: .. code-block:: bash sudo dnf install copyq On other Linux distributions, you can use `Flatpak `__ to install the app: .. code-block:: bash # Install from Flathub. flatpak install --user --from https://flathub.org/repo/appstream/com.github.hluk.copyq.flatpakref # Run the app. flatpak run com.github.hluk.copyq ================================================ FILE: docs/keyboard.rst ================================================ Keyboard ======== This page lists useful default shortcuts and key mappings for CopyQ and describes how to change them. CopyQ is keyboard-friendly, i.e. it should be possible to quickly access any functionality with keyboard without using mouse. Default Shortcuts ----------------- .. note:: On OS X, use ⌘ key instead of Ctrl for the shortcuts. - PgDown/PgUp, Home/End, Up/Down - item list navigation - Left, Right, Ctrl+Tab, Ctrl+Shift+Tab - tab navigation - Ctrl+T, Ctrl+W - create and remove tabs - Ctrl+Up, Ctrl+Down - move selected items - Esc - cancel search, hide window - Ctrl+Q - exit - F2 - edit selected items - Ctrl+E - edit items in an external editor - F5 - open action dialog for selected items - Delete - delete selected items - Ctrl+A - select all - Enter - put current item into clipboard and paste item (optional) - Ctrl+1...Ctrl+9 - focus a tab in given order - Ctrl+0 - focus last tab Search ------ Start typing a text to search items. This works in main application window and ``copyq menu``. Change Shortcuts ---------------- To change the shortcuts: 1. Open "File - Preferences". 2. Select "Shortcuts" tab. 3. Click the button next to action you need to change. 4. Press a shortcut on keyboard. 5. Click OK to save the dialog. Create new Shortcut ------------------- If and action with shortcut is missing in the Shortcuts configuration tab, you can use predefined ones: 1. Open "File - Commands/Global Shortcuts...". 2. Click "Add" button. 3. Select command (e.g. "Show/hide main window"). 4. Press a shortcut on keyboard. 5. Click OK to save the dialog. ================================================ FILE: docs/known-issues.rst ================================================ Known Issues ============ This document lists known commonly occurring issues and possible solutions. .. _known-issue-window-tray-hidden: On Windows, tray icon is hidden/repositioned after restart ---------------------------------------------------------- With current official builds of CopyQ, the tray icon position and hide/show status are not restored after the application is restarted or after logging in. **Workaround** is to use CopyQ binaries build with older Qt framework version (Qt 5.9); these are provided in latest comments in the issue link below. .. seealso:: `Issue #1258 `__ .. _known-issue-windows-console-output: On Windows, CopyQ does not print anything on console ---------------------------------------------------- On Windows, you may not see any output when executing CopyQ in a console/terminal application (PowerShell or cmd). **Workarounds:** * Use different console application: Git Bash, Cygwin or similar. * Use Action dialog in CopyQ (``F5`` shortcut) and set "Store standard output" to "text/plain" to save the output as new item in current tab. * Append ``| Write-Output`` to commands in PowerShell: .. code-block:: powershell & 'C:\Program Files\CopyQ\copyq.exe' help | Write-Output .. seealso:: `Issue #349 `__ .. _known-issue-macos-paste-after-install: On macOS, CopyQ won't paste after installation/update ----------------------------------------------------- CopyQ is not signed app, you need to grant Accessibility again when it's installed or updated. **To fix this**, try following steps: 1. Go to System Preferences -> Security & Privacy -> Privacy -> Accessibility (or just search for "Allow apps to use Accessibility"). 2. Click the unlock button. 3. Select CopyQ from the list and remove it (with the "-" button). .. seealso:: - `Issue #1030 `__ - `Issue #1245 `__ .. _known-issue-gnome: On GNOME, new clipboard is not stored ------------------------------------- The app requires CopyQ Clipboard Monitor GNOME extension to be enabled so it can watch clipboard changes and store them. The GNOME extension can be installed with CopyQ 14.0.0. .. _known-issue-wayland: On Linux, global shortcuts, pasting or clipboard monitoring does not work ------------------------------------------------------------------------- This can be caused by running CopyQ under a **Wayland** window manager instead of the X11 server. Depending on the desktop environment, these features may not be supported: - global shortcuts - clipboard monitoring - pasting from CopyQ and issuing copy command to other apps (that is passing shortcuts to application) - screenshot functionality - retrieving and matching window titles - querying keyboard modifiers and mouse position **Workaround:** try using the **Wayland Support** command mentioned below or set ``QT_QPA_PLATFORM`` environment variable to run the app under **Xwayland** mode (additional package may be needed, for example: ``xorg-x11-server-Xwayland`` in Fedora). For example, launch CopyQ with:: env QT_QPA_PLATFORM=xcb copyq If CopyQ autostarts, you can change ``Exec=...`` line in ``~/.config/autostart/copyq.desktop``:: Exec=env QT_QPA_PLATFORM=xcb copyq For **Flatpak** application, see `this workaround `__. .. note:: Mouse selection will still work only if the source application itself supports it. .. seealso:: `Wayland Support `__ command reimplements some features on Wayland through external tools (see `README `__ for details on how to add the command). `Issue #27 `__ Scripting command "copy()" fails -------------------------------- The command ``copy()`` sends the Ctrl+C shortcut to the current window. This can fail depending on the active application. If CopyQ won't detect a clipboard change, it throws an exception. The execution then fails with the message ``Failed to copy to clipboard!``. An alternative under Windows is to use a Powershell script to override the ``copy`` operation (see :ref:`faq-share-commands`): .. code-block:: powershell [Command] Command=" copy = function() { execute('powershell', '-Command', ` Add-Type -AssemblyName System.Windows.Forms; Start-Sleep -Milliseconds 300; [System.Windows.Forms.SendKeys]::SendWait(\"^c\"); Start-Sleep -Milliseconds 300; `); }" IsScript=true Name=Override copy() The delays are added to make sure no focus issues occur and the text is copied to the clipboard. ================================================ FILE: docs/make.bat ================================================ @ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=python -msphinx ) set SOURCEDIR=. set BUILDDIR=_build set SPHINXPROJ=CopyQ if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The Sphinx module was not found. Make sure you have Sphinx installed, echo.then set the SPHINXBUILD environment variable to point to the full echo.path of the 'sphinx-build' executable. Alternatively you may add the echo.Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd ================================================ FILE: docs/password-protection.rst ================================================ .. _encrypt: Password Protection =================== This page describes how to encrypt and protect selected tabs and single items with a password. .. note:: CopyQ 14.0.0 and above will support encrypting all data using a custom Password. This can be enabled with "Encrypt Tabs" option in Preferences. As An alternative, available in older versions, the below describes using Encryption plugin to encrypt specific tabs or single items (this requires a GnuPG utility to be installed). Installation ------------ To enable this feature you need to have "Encryption" item plugin. .. image:: images/encryption-install.png The plugin configuration (under "Items" configuration tab in Configuration dialog) may prompt you to install `GnuPG `__: - For Windows you can use `Chocolatey `__ to install `Gpg4win `__:: choco install gpg4win - For Linux install ``gpg`` command line utility. It's usually provided by ``gnupg`` package but the package name may differ on some distributions. Generate Keys and Set Password ------------------------------ To be able to encrypt tabs and items you first need to generate private and public key files. Click on the "Generate Ney Keys..." button and wait. .. image:: images/encryption-generate-keys.png If didn't set a password in previous step click "Change Password..." button and set it. .. image:: images/encryption-password.png Last step in configuration is to set tabs to encrypt. You can skip this step if you only need to encrypt single item in each tab (see next section). .. image:: images/encryption-tabs.png Click "OK" button to confirm Configuration dialog. Protect Tabs ------------ Now you can create the tabs you want to encrypt (Ctrl+T to create new tab). The tab name should be same as one of the tabs entered in plugin configuration in previous step. .. image:: images/encryption-tab.png You'll be prompt to enter password in future (you only need to enter it once in a while). If you enter wrong password or cancel the password prompt you can later click on "Reload" button in tab to enter password again. .. image:: images/encryption-reload.png Protect Single Items -------------------- To protect items in unprotected tab you can add menu and tool bar actions with keyboard shortcut. Go to Command dialog F6, click on "Add" button, "Encryption" commands from list and confirm dialogs with "OK" button. Now you can select items and press Ctrl+L to encrypt ("Items - Encryption - Encrypt" in menu). To decrypt selected item press Ctrl+L ("Items - Encryption - Decrypt" in menu). ================================================ FILE: docs/pin-items.rst ================================================ Pin Items ========= This page describes how to pin selected items in a tab so they cannot be accidentally removed or moved from current row. Why pin items? -------------- There are two main reasons to pin items. If a new item is added to a list (e.g. automatically when clipboard changed), rest of the items need to move one row down, except pinned items which stay on the same row. This is useful to **pin important items to the top of the list**. If a tab is full (see option "Maximum number of items in history" in "History" configuration tab), adding a new item removes old item from bottom of the list. **Pinned items cannot be removed** so the last unpinned item is removed instead. .. note:: New items cannot be added to a tab if all its items are pinned and the tab is full. Configuration ------------- .. note:: On Windows, to enable this feature you need to install "Pinned Items" plugin. To enable this functionality, assign keyboard shortcut for Pin and Unpin actions in "Shortcuts" tab in Preferences (``Ctrl+P``). .. note:: Keyboard shortcut for both menu items can be the same since at most one of the menu items is always visible. Pinning Items ------------- If set up correctly, when you select items, Pin action should be available in toolbar, context menu and "Item" menu. Selecting the Pin menu item (or pressing assigned keyboard shortcut) will pin selected items to their current rows. Pinned items will show with **gray bar on the right side** in the list. Deleting pinned items won't work, unpin the items first. Unpin action is available if an pinned item is selected. Pinned items also will stay in same rows unless you **move them with mouse or using keyboard shortcuts** (``Ctrl+Up/Down/Home/End``). ================================================ FILE: docs/requirements.txt ================================================ sphinx==7.2.6 sphinx-rtd-theme==1.3.0 ================================================ FILE: docs/scripting-api.rst ================================================ .. _scripting-api: Scripting API ============= CopyQ provides scripting capabilities to automatically handle clipboard changes, organize items, change settings and much more. Supported language features and functions can be found at `ECMAScript Reference `__. The language is mostly equivalent to modern JavaScript. Some features may be missing but feel free to use for example `JavaScript reference on MDN `__. CopyQ-specific features described in this document: - `Functions`_ - `Types`_ - `Objects`_ - `MIME types`_ - `Plugins`_ .. note:: These terms are equivalent: format, MIME type, media type Execute Script -------------- The scripts can be executed from: a. Action or Command dialogs (F5, F6 shortcuts), if the first line starts with ``copyq:`` b. command line as ``copyq eval '