Showing preview only (691K chars total). Download the full file or copy to clipboard to get everything.
Repository: albertlauncher/albert
Branch: main
Commit: 461cb064bbcc
Files: 213
Total size: 641.0 KB
Directory structure:
gitextract_i3xvbsgx/
├── .clang-format
├── .docker/
│ ├── README.md
│ ├── arch.Dockerfile
│ ├── fedora.Dockerfile
│ └── ubuntu.Dockerfile
├── .dockerignore
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bugreport.yml
│ │ ├── 2-missing_terminal.yml
│ │ └── config.yml
│ ├── stale.yml
│ └── workflows/
│ ├── ci.yml
│ ├── telegram_notify_comments.yml
│ └── telegram_notify_issues.yml
├── .gitignore
├── .gitmodules
├── .pre-commit-config.yaml
├── CHANGELOG.md
├── CMakeLists.txt
├── LICENSE.md
├── README.md
├── cmake/
│ ├── FindAlbert.cmake.in
│ ├── MacOSXBundleInfo.plist.in
│ ├── MacOSXFrameworkInfo.plist.in
│ ├── albert-config.cmake.in
│ ├── albert-macros.cmake
│ └── bundle-macos.cmake.in
├── dist/
│ ├── cliff.toml
│ ├── cliff_template_minimal.md
│ ├── cliff_template_rich.md
│ ├── flatpak/
│ │ ├── README.md
│ │ └── org.albertlauncher.Albert.yml
│ ├── macos/
│ │ ├── albert.icns
│ │ ├── albert_icns.sh
│ │ └── generate_appcast_item.sh
│ └── xdg/
│ └── albert.desktop
├── include/
│ └── albert/
│ ├── app.h
│ ├── asyncgeneratorqueryhandler.h
│ ├── backgroundexecutor.h
│ ├── desktopentryparser.h
│ ├── download.h
│ ├── extension.h
│ ├── extensionplugin.h
│ ├── fallbackhandler.h
│ ├── frontend.h
│ ├── generatorqueryhandler.h
│ ├── globalqueryhandler.h
│ ├── icon.h
│ ├── indexitem.h
│ ├── indexqueryhandler.h
│ ├── inputhistory.h
│ ├── item.h
│ ├── logging.h
│ ├── matchconfig.h
│ ├── matcher.h
│ ├── messagebox.h
│ ├── networkutil.h
│ ├── notification.h
│ ├── oauth.h
│ ├── oauthconfigwidget.h
│ ├── plugindependency.h
│ ├── plugininstance.h
│ ├── pluginloader.h
│ ├── pluginmetadata.h
│ ├── pluginprovider.h
│ ├── query.h
│ ├── querycontext.h
│ ├── queryexecution.h
│ ├── queryhandler.h
│ ├── queryresults.h
│ ├── rankedqueryhandler.h
│ ├── rankitem.h
│ ├── ratelimiter.h
│ ├── standarditem.h
│ ├── systemutil.h
│ ├── telemetryprovider.h
│ ├── timeit.h
│ ├── urlhandler.h
│ ├── usagescoring.h
│ └── widgetsutil.h
├── resources/
│ ├── index.theme
│ └── resources.qrc
├── src/
│ ├── app/
│ │ ├── application.cpp
│ │ ├── application.h
│ │ ├── messagehandler.cpp
│ │ ├── messagehandler.h
│ │ ├── pathmanager.cpp
│ │ ├── pathmanager.h
│ │ ├── pluginqueryhandler.cpp
│ │ ├── pluginqueryhandler.h
│ │ ├── qtpluginloader.cpp
│ │ ├── qtpluginloader.h
│ │ ├── qtpluginprovider.cpp
│ │ ├── qtpluginprovider.h
│ │ ├── report.cpp
│ │ ├── report.h
│ │ ├── rpcserver.cpp
│ │ ├── rpcserver.h
│ │ ├── systemtrayicon.cpp
│ │ ├── systemtrayicon.h
│ │ ├── telemetry.cpp
│ │ ├── telemetry.h
│ │ ├── telemetryprovider.cpp
│ │ ├── triggersqueryhandler.cpp
│ │ ├── triggersqueryhandler.h
│ │ └── urlhandler.cpp
│ ├── common/
│ │ ├── extension.cpp
│ │ ├── item.cpp
│ │ └── rankitem.cpp
│ ├── config.h.in
│ ├── frontend/
│ │ ├── frontend.cpp
│ │ ├── session.cpp
│ │ └── session.h
│ ├── icon/
│ │ ├── composedicon.cpp
│ │ ├── composedicon.h
│ │ ├── filetypeicon.cpp
│ │ ├── filetypeicon.h
│ │ ├── graphemeicon.cpp
│ │ ├── graphemeicon.h
│ │ ├── icon.cpp
│ │ ├── iconifiedicon.cpp
│ │ ├── iconifiedicon.h
│ │ ├── imageicon.cpp
│ │ ├── imageicon.h
│ │ ├── qiconicon.cpp
│ │ ├── qiconicon.h
│ │ ├── recticon.cpp
│ │ ├── recticon.h
│ │ ├── standardicon.cpp
│ │ ├── standardicon.h
│ │ ├── themeicon.cpp
│ │ └── themeicon.h
│ ├── main.cpp
│ ├── platform/
│ │ ├── mac/
│ │ │ └── platform.mm
│ │ ├── platform.h
│ │ ├── signalhandler.h
│ │ ├── unix/
│ │ │ └── signalhandler.cpp
│ │ └── xdg/
│ │ ├── desktopentryparser.cpp
│ │ ├── iconlookup.cpp
│ │ ├── iconlookup.h
│ │ ├── platform.cpp
│ │ ├── themefileparser.cpp
│ │ └── themefileparser.h
│ ├── plugin/
│ │ ├── extensionregistry.cpp
│ │ ├── extensionregistry.h
│ │ ├── plugininstance.cpp
│ │ ├── pluginloader.cpp
│ │ ├── pluginprovider.cpp
│ │ ├── pluginregistry.cpp
│ │ ├── pluginregistry.h
│ │ └── topologicalsort.hpp
│ ├── plugin.h.in
│ ├── query/
│ │ ├── asyncgeneratorqueryhandler.cpp
│ │ ├── fallbackhandler.cpp
│ │ ├── generatorqueryhandler.cpp
│ │ ├── globalquery.cpp
│ │ ├── globalquery.h
│ │ ├── globalqueryexecution.cpp
│ │ ├── globalqueryexecution.h
│ │ ├── globalqueryhandler.cpp
│ │ ├── query.cpp
│ │ ├── queryengine.cpp
│ │ ├── queryengine.h
│ │ ├── queryexecution.cpp
│ │ ├── queryhandler.cpp
│ │ ├── queryresults.cpp
│ │ ├── rankedqueryhandler.cpp
│ │ ├── usagedatabase.cpp
│ │ ├── usagedatabase.h
│ │ └── usagescoring.cpp
│ ├── settings/
│ │ ├── pluginswidget/
│ │ │ ├── pluginsmodel.cpp
│ │ │ ├── pluginsmodel.h
│ │ │ ├── pluginssortproxymodel.cpp
│ │ │ ├── pluginssortproxymodel.h
│ │ │ ├── pluginswidget.cpp
│ │ │ ├── pluginswidget.h
│ │ │ ├── pluginwidget.cpp
│ │ │ └── pluginwidget.h
│ │ ├── querywidget/
│ │ │ ├── fallbacksmodel.cpp
│ │ │ ├── fallbacksmodel.h
│ │ │ ├── queryhandlermodel.cpp
│ │ │ ├── queryhandlermodel.h
│ │ │ ├── querywidget.cpp
│ │ │ ├── querywidget.h
│ │ │ └── querywidget.ui
│ │ ├── settingswindow.cpp
│ │ ├── settingswindow.h
│ │ └── settingswindow.ui
│ └── util/
│ ├── color.h
│ ├── download.cpp
│ ├── extensionplugin.cpp
│ ├── indexitem.cpp
│ ├── indexqueryhandler.cpp
│ ├── inputhistory.cpp
│ ├── itemindex.cpp
│ ├── itemindex.h
│ ├── levenshtein.cpp
│ ├── levenshtein.h
│ ├── matcher.cpp
│ ├── messagebox.cpp
│ ├── networkutil.cpp
│ ├── notification.cpp
│ ├── oauth.cpp
│ ├── oauthconfigwidget.cpp
│ ├── qiconengineadapter.cpp
│ ├── qiconengineadapter.h
│ ├── querypreprocessing.cpp
│ ├── querypreprocessing.h
│ ├── ratelimiter.cpp
│ ├── standarditem.cpp
│ └── systemutil.cpp
└── test/
├── test.cpp
└── test.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
Language: Cpp
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveAssignments:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveBitFields:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveDeclarations:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignEscapedNewlines: DontAlign
AlignOperands: Align
AlignTrailingComments:
Kind: Always
OverEmptyLines: 0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros:
- __capability
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Always
AfterEnum: false
AfterExternBlock: false
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: false
AfterUnion: false
BeforeCatch: true
BeforeElse: true
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAfterAttributes: Never
BreakAfterJavaFieldAnnotations: false
BreakArrays: true
BreakBeforeBinaryOperators: All
BreakBeforeConceptDeclarations: Always
BreakBeforeBraces: Custom
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: AfterColon
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
ColumnLimit: 100
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- forever
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^<Q.*'
Priority: 200
SortPriority: 200
CaseSensitive: true
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseBlocks: false
IndentCaseLabels: false
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: None
IndentRequiresClause: true
IndentWidth: 4
IndentWrappedFunctionNames: false
InsertBraces: false
InsertNewlineAtEOF: false
InsertTrailingCommas: None
IntegerLiteralSeparator:
Binary: 0
Decimal: 0
Hex: 0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature
LineEnding: DeriveLF
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PackConstructorInitializers: Never
PenaltyBreakAssignment: 150
PenaltyBreakBeforeFirstCallParameter: 300
PenaltyBreakComment: 500
PenaltyBreakFirstLessLess: 400
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 600
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 50
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 300
PointerAlignment: Right
PPIndentWidth: -1
QualifierAlignment: Leave
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: false
RemoveSemicolon: false
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: Never
SortJavaStaticImport: Before
SortUsingDeclarations: Lexicographic
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
- Q_CLASSINFO
- Q_ENUM
- Q_ENUM_NS
- Q_FLAG
- Q_FLAG_NS
- Q_GADGET
- Q_GADGET_EXPORT
- Q_INTERFACES
- Q_MOC_INCLUDE
- Q_NAMESPACE
- Q_NAMESPACE_EXPORT
- Q_OBJECT
- Q_PROPERTY
- Q_REVISION
- Q_DISABLE_COPY
- Q_SET_OBJECT_NAME
- QT_BEGIN_NAMESPACE
- QT_END_NAMESPACE
- QML_ADDED_IN_MINOR_VERSION
- QML_ANONYMOUS
- QML_ATTACHED
- QML_DECLARE_TYPE
- QML_DECLARE_TYPEINFO
- QML_ELEMENT
- QML_EXTENDED
- QML_EXTENDED_NAMESPACE
- QML_EXTRA_VERSION
- QML_FOREIGN
- QML_FOREIGN_NAMESPACE
- QML_IMPLEMENTS_INTERFACES
- QML_INTERFACE
- QML_NAMED_ELEMENT
- QML_REMOVED_IN_MINOR_VERSION
- QML_SINGLETON
- QML_UNAVAILABLE
- QML_UNCREATABLE
- QML_VALUE_TYPE
TabWidth: 4
UseTab: Never
WhitespaceSensitiveMacros:
- BOOST_PP_STRINGIZE
- CF_SWIFT_NAME
- NS_SWIFT_NAME
- PP_STRINGIZE
- STRINGIZE
...
================================================
FILE: .docker/README.md
================================================
# Dockerfiles
## Build
```sh
docker build --progress=plain -f "${path}/arch.Dockerfile" -t albert:arch --platform linux/amd64 .
docker build --progress=plain -f "${path}/fedora.Dockerfile" -t albert:fedora .
docker build --progress=plain -f "${path}/ubuntu.Dockerfile" -t albert:ubuntu .
```
- `--platform linux/amd64`. Arch has no ARM image. Needed on docker for mac to emulate.
- `--progress=plain` Disables the buildkit output folding
## Run using X
Don't forget to install and run [XQuartz](https://www.xquartz.org/) on macOS.
```sh
docker run --rm -it \
-e QT_LOGGING_RULES="albert*=true" \
-e DISPLAY="host.docker.internal:0" \
albert:ubuntu -c "xterm & albert"
```
================================================
FILE: .docker/arch.Dockerfile
================================================
ARG BASE_IMAGE=archlinux:latest
FROM ${BASE_IMAGE} AS base
RUN pacman -Syu --verbose --noconfirm \
cmake \
gcc \
libarchive \
libqalculate \
libxml2 \
make \
pkgconf \
python \
qcoro-qt6 \
qt6-base \
qt6-declarative \
qt6-scxml \
qt6-svg \
qt6-tools \
qtkeychain-qt6 \
&& pacman -Scc --noconfirm
FROM base AS build
COPY . /src
ARG build_dir="/build"
RUN cmake \
-S /src \
-B $build_dir \
-DBUILD_TESTS=ON \
&& cmake --build $build_dir -j$(nproc) \
&& cmake --install $build_dir --prefix /usr \
&& ctest --test-dir $build_dir --output-on-failure \
&& rm -rf $build_dir
FROM build AS build-plugin
RUN cmake \
-S /src/plugins/applications \
-B $build_dir \
-DCMAKE_PREFIX_PATH=/usr/lib/$(gcc -dumpmachine)/cmake/ \
&& cmake --build $build_dir -j$(nproc) \
&& cmake --install $build_dir --prefix /usr \
&& ctest --test-dir $build_dir --output-on-failure \
&& rm -rf $build_dir
ENTRYPOINT ["bash"]
================================================
FILE: .docker/fedora.Dockerfile
================================================
ARG BASE_IMAGE=fedora:latest
FROM ${BASE_IMAGE} AS base
RUN yum install -y \
cmake \
gcc-c++ \
libarchive-devel \
libqalculate-devel \
pkgconfig \
python3-devel \
qt6-qtbase \
qt6-qtbase-mysql \
qt6-qtbase-odbc \
qt6-qtbase-postgresql \
qt6-qtscxml-devel \
qt6-qtsvg-devel \
qt6-qttools-devel \
qtkeychain-qt6-devel \
qcoro-qt6-devel \
xml2 \
&& yum clean all \
&& rm -rf /var/cache/yum/*
FROM base AS build
COPY . /src
ARG build_dir="/build"
RUN cmake \
-S /src \
-B $build_dir \
-DBUILD_TESTS=ON \
&& cmake --build $build_dir -j$(nproc) \
&& cmake --install $build_dir --prefix /usr \
&& ctest --test-dir $build_dir --output-on-failure \
&& rm -rf $build_dir
FROM build AS build-plugin
RUN cmake \
-S /src/plugins/applications \
-B $build_dir \
-DCMAKE_PREFIX_PATH=/usr/lib64/cmake \
&& cmake --build $build_dir -j$(nproc) \
&& cmake --install $build_dir --prefix /usr \
&& ctest --test-dir $build_dir --output-on-failure \
&& rm -rf $build_dir
ENTRYPOINT ["bash"]
================================================
FILE: .docker/ubuntu.Dockerfile
================================================
ARG BASE_IMAGE=ubuntu:24.04
FROM ${BASE_IMAGE} AS base
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get -qq update \
&& apt-get install --no-install-recommends -y \
cmake \
g++ \
libarchive-dev \
libgl1-mesa-dev \
libglvnd-dev \
libqalculate-dev \
libqt6opengl6-dev \
libqt6sql6-sqlite \
libqt6svg6-dev \
libxml2-utils \
make \
pkg-config \
python3-dev \
qt6-base-dev \
qt6-scxml-dev \
qt6-tools-dev \
qt6-tools-dev-tools \
qt6-l10n-tools \
qtkeychain-qt6-dev \
qcoro-qt6-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
FROM base AS dev
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get -qq update \
&& apt-get install --no-install-recommends -y \
ccache \
clangd \
lldb \
ninja-build \
xterm \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
FROM base AS build
COPY . /src
ARG build_dir="/build"
RUN cmake \
-S /src \
-B $build_dir \
-DBUILD_TESTS=ON \
&& cmake --build $build_dir -j$(nproc) \
&& cmake --install $build_dir --prefix /usr \
&& ctest --test-dir $build_dir --output-on-failure \
&& rm -rf $build_dir
FROM build AS build-plugin
RUN cmake \
-S /src/plugins/applications \
-B $build_dir \
-DCMAKE_PREFIX_PATH=/usr/lib/$(gcc -dumpmachine)/cmake/ \
&& cmake --build $build_dir -j$(nproc) \
&& cmake --install $build_dir --prefix /usr \
&& ctest --test-dir $build_dir --output-on-failure \
&& rm -rf $build_dir
================================================
FILE: .dockerignore
================================================
.*
documentation
*build*
================================================
FILE: .github/CONTRIBUTING.md
================================================
Stay civil. Inappropriate content will be removed without warning.
See also the contributing section on the [Albert website](https://albertlauncher.github.io/gettingstarted/contributing/).
================================================
FILE: .github/ISSUE_TEMPLATE/1-bugreport.yml
================================================
name: Bug report
description: Report a bug.
assignees: ManuelSchneid3r
labels: ["Needs triage"]
body:
- type: dropdown
id: Source
attributes:
label: Source
description: Where did you get the build from?
options:
- Open Build Service
- Homebrew
- AUR
- Built from source
- Other (leave a note)
default: 0
validations:
required: true
- type: textarea
attributes:
label: App logs
render: Text
description: |
Run the command below and post its output.
**Linux** `QT_LOGGING_RULES='albert*=true' albert`
**macOS** `QT_LOGGING_RULES='albert*=true' /Applications/Albert.app/Contents/MacOS/albert`
placeholder: "Post the logs here"
validations:
required: true
- type: textarea
attributes:
label: Current Behavior
description: A concise description of what you're experiencing.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: A concise description of what you expected to happen.
validations:
required: true
- type: textarea
attributes:
label: Anything else?
description: Anything that will give more context about the issue you are encountering!
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/2-missing_terminal.yml
================================================
name: Missing terminal
description: Report a missing terminal.
title: "Missing terminal <name>"
assignees: ManuelSchneid3r
labels: ["C: App", "Needs triage"]
body:
- type: input
attributes:
label: Absolute path to the desktop file
description: See <a href="https://specifications.freedesktop.org/desktop-entry-spec/latest/">this</a> if you dont know what a desktop file is.
placeholder: /usr/share/applications/…
validations:
required: true
- type: textarea
attributes:
label: Contents of the desktop file
render: INI
placeholder: "[Desktop Entry] …"
validations:
required: true
- type: textarea
attributes:
label: App report
render: Text
description: |
Run the command below and post its output.
**Linux** `albert --report`
**macOS** `/Applications/Albert.app/Contents/MacOS/albert --report`
placeholder: "Post the report here"
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: Feature request
url: https://github.com/orgs/albertlauncher/discussions/1307
about: Post a feature request on the wishlist. Dont forget to vote!
- name: Chat on Discord
url: https://discord.gg/t8G2EkvRZh
about: Bridged community chat.
- name: Chat on Telegram
url: https://telegram.me/albert_launcher_community
about: Bridged community chat.
================================================
FILE: .github/stale.yml
================================================
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 365
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
daysUntilClose: 182
# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
onlyLabels: []
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- Suggestion
- Bug P1 Blocker
- Bug P2 High
- Bug P3 Medium
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: false
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: false
# Set to true to ignore issues with an assignee (defaults to false)
exemptAssignees: false
# Label to use when marking as stale
staleLabel: stale
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when removing the stale label.
# unmarkComment: >
# Your comment here.
# Comment to post when closing a stale Issue or Pull Request.
# closeComment: >
# Your comment here.
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Limit to only `issues` or `pulls`
only: issues
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
# pulls:
# daysUntilStale: 30
# markComment: >
# This pull request has been automatically marked as stale because it has not had
# recent activity. It will be closed if no further activity occurs. Thank you
# for your contributions.
# issues:
# exemptLabels:
# - confirmed
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI/CD
on:
push:
branches: [ "main", "dev", "devel" ]
tags: '*'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
SourceArtifact:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v3
with:
submodules: 'recursive'
path: source
- name: Upload source artifact
uses: actions/upload-artifact@v4
with:
name: source-artifact
include-hidden-files: true
path: source
ReleaseSourceArchives:
needs: SourceArtifact
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- name: Download source artifact
uses: actions/download-artifact@v4
with:
name: source-artifact
path: albert
- name: Create archives
run: |
tar --exclude=".*" -czvf ${{ github.ref_name }}.tar.gz albert
zip -r ${{ github.ref_name }}.zip albert -x "*/.*"
- name: Release
uses: softprops/action-gh-release@v1
with:
generate_release_notes: true
files: |
${{ github.ref_name }}.tar.gz
${{ github.ref_name }}.zip
LinuxBuilds:
needs: SourceArtifact
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
dockerfile: [arch.Dockerfile, fedora.Dockerfile, ubuntu.Dockerfile]
steps:
- name: Download source artifact
uses: actions/download-artifact@v4
with:
name: source-artifact
- name: Build docker test image
run: docker build . --file .docker/${{ matrix.dockerfile }} --target build-plugin
MacBuilds:
needs: SourceArtifact
name: ${{matrix.buildname}}
runs-on: ${{matrix.os}}
strategy:
matrix:
include:
- os: macos-15-intel
buildname: macOS x86_64
arch: 'x86_64'
- os: macos-15
buildname: macOS arm64
arch: 'arm64'
steps:
- name: Download source artifact
uses: actions/download-artifact@v4
with:
name: source-artifact
path: source
- name: Install dependencies available at homebrew
env:
#HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_AUTO_UPDATE: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
HOMEBREW_NO_INSTALL_UPGRADE: 1
run: |
brew install llvm@18 qt qcoro6
brew install --ignore-dependencies libqalculate qtkeychain # python libarchive sparkle
- name: Build and package
run: |
cmake -S source -B build \
-DCMAKE_C_COMPILER=$(brew --prefix llvm@18)/bin/clang \
-DCMAKE_CXX_COMPILER=$(brew --prefix llvm@18)/bin/clang++ \
-DCMAKE_OSX_DEPLOYMENT_TARGET=11 \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_OSX_ARCHITECTURES="${{ matrix.arch }}" \
-DBUILD_PLUGIN_DEBUG=OFF \
-DBUILD_PLUGIN_DOCS=OFF
cmake --build build
- name: Build and package
run: cd build && cpack -V
- name: Append suffix
run: |
set -x
dmg=$(echo build/Albert-*.dmg)
new_dmg="${dmg::${#dmg} - 4}-${{ matrix.arch }}.dmg"
mv "${dmg}" "${new_dmg}"
mv "${dmg}.sha256" "${new_dmg}.sha256"
- name: Upload macOS bundle artifact
uses: actions/upload-artifact@v4
with:
name: macos-bundle-artifact-${{ matrix.arch }}
path: |
build/*.dmg
build/*.sha256
#appcast_item.txt
RelaseMacBuilds:
needs: MacBuilds
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- name: Get all build artifacts
uses: actions/download-artifact@v4
with:
pattern: macos-bundle-artifact-*
merge-multiple: true
- name: Upload
uses: softprops/action-gh-release@v1
with:
files: |
Albert-*.dmg
Albert-*.sha256
UpdateTap:
needs: RelaseMacBuilds
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # deletes .
with:
repository: albertlauncher/homebrew-albert
token: ${{ secrets.PAT }}
- name: Get all build artifacts
uses: actions/download-artifact@v4
with:
pattern: macos-bundle-artifact-*
merge-multiple: true
- name: Update cask
run: |
find .
ver=${{ github.ref_name }}
ver="${ver#v}" # Remove leading 'v'
sha_arm=$(cut -f 1 -d " " Albert-v$ver-arm64.dmg.sha256)
sha_intel=$(cut -f 1 -d " " Albert-v$ver-x86_64.dmg.sha256)
# Note this is GNU sed
sed -i "s/version .*$/version \"$ver\"/; s/^ sha256.*$/ sha256 arm: \"${sha_arm}\", intel: \"${sha_intel}\"/" Casks/albert.rb
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add Casks/albert.rb
git commit -m "${{ github.ref_name }}"
git push
# Appcast:
# needs: RelaseMacBuilds
# if: startsWith(github.ref, 'refs/tags/')
# runs-on: ubuntu-latest
# steps:
# - name: Checkout website source code
# uses: actions/checkout@v3
# with:
# repository: albertlauncher/documentation
# ref: 'master'
# token: ${{ secrets.PAT }}
#- name: list files
# run: find .
#- run: sed -i -e '/<\/language>/r appcast_item.txt' src/appcast.xml
#- name: Push appcast
# run: |
# git config --local user.name "GitHub Action"
# git config --local user.email "action@github.com"
# git add src/appcast.xml
# git commit -m "Update appcast"
# git push origin master
#- name: Restore macports dependencies
# id: cache-macports # ref'ed below
# uses: actions/cache/restore@v4
# with:
# path: |
# /opt/local/lib
# /opt/local/include
# key: ${{ matrix.os }}-macports-r2
#- name: Install macports (for universal binaries of libqalculate and libarchive)
# if: steps.cache-macports.outputs.cache-hit != 'true'
# run: |
# case ${{ matrix.os }} in
# macos-11)
# wget "https://github.com/macports/macports-base/releases/download/v2.8.1/MacPorts-2.8.1-11-BigSur.pkg"
# sudo installer -pkg ./MacPorts-2.8.1-11-BigSur.pkg -target /
# ;;
# macos-12)
# wget "https://github.com/macports/macports-base/releases/download/v2.8.1/MacPorts-2.8.1-12-Monterey.pkg"
# sudo installer -pkg ./MacPorts-2.8.1-12-Monterey.pkg -target /
# ;;
# macos-13)
# wget "https://github.com/macports/macports-base/releases/download/v2.8.1/MacPorts-2.8.1-13-Ventura.pkg"
# sudo installer -pkg ./MacPorts-2.8.1-13-Ventura.pkg -target /
# ;;
# esac
# sudo sh -c 'echo "\n+universal" >> /opt/local/etc/macports/variants.conf'
#- name: Install dependencies using macports
# if: steps.cache-macports.outputs.cache-hit != 'true'
# run : sudo /opt/local/bin/port install libqalculate libarchive # increase steps.cache-macports.outputs.cache-primary-key revision on change
#- name: Save macports dependencies
# uses: actions/cache/save@v4
# with:
# path: |
# /opt/local/lib
# /opt/local/include
# key: ${{ steps.cache-macports.outputs.cache-primary-key }}
# - name: Checkout source code
# uses: actions/checkout@v3
# with:
# submodules: recursive
# - name: Get latest CMake and ninja
# uses: lukka/get-cmake@latest
#- name: Install Qt dependencies
# uses: jurplel/install-qt-action@v3
# with:
# version: ${{ matrix.qt_version }}
# cache: true
# modules: 'qtscxml qt5compat qtshadertools'
#- name: Create writable /opt/local
# run: sudo install -d -o $UID -m 755 /opt/local
#- name: Generate appcast item
# env:
# EDDSA_PRIVATE_KEY: ${{ secrets.EDDSA_PRIVATE_KEY }}
# VERSION: ${{ github.ref_name }}
# run: ./dist/macos/generate_appcast_item.sh "build/Albert-${{ github.ref_name }}.dmg" "${VERSION:1}" "$EDDSA_PRIVATE_KEY" appcast_item.txt
================================================
FILE: .github/workflows/telegram_notify_comments.yml
================================================
name: Telegram Notifications
on:
issue_comment:
types: [created]
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Send notifications to Telegram
run: >
curl -s
-X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_NOTIFIER_BOT_TOKEN }}/sendMessage
-d chat_id=${{ secrets.TELEGRAM_ALBERT_CHAT_ID }}
-d text="${MESSAGE}"
-d parse_mode=HTML
-d disable_web_page_preview=true
>> /dev/null
env:
MESSAGE: "<b>${{ github.event.comment.user.login }}</b> on <a href=\"${{ github.event.comment.html_url }}\"><b>${{ github.event.repository.name }}#${{ github.event.issue.number }}</b>: <i>${{ github.event.issue.title }}</i></a>%0A${{ github.event.comment.body }}"
================================================
FILE: .github/workflows/telegram_notify_issues.yml
================================================
name: Telegram Notifications
on:
issues:
types: [opened, reopened]
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Send notifications to Telegram
run: >
curl -s
-X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_NOTIFIER_BOT_TOKEN }}/sendMessage
-d chat_id=${{ secrets.TELEGRAM_ALBERT_CHAT_ID }}
-d text="${MESSAGE}"
-d parse_mode=HTML
-d disable_web_page_preview=true
>> /dev/null
env:
MESSAGE: "New issue:%0A<a href=\"${{ github.event.issue.html_url }}\"><b>${{ github.event.repository.name }}#${{ github.event.issue.number }}</b>: <i>${{ github.event.issue.title }}</i></a>"
================================================
FILE: .gitignore
================================================
.DS_Store
/CMakeLists.txt.user*
/build*
/documentation
justfile
/.qtcreator
================================================
FILE: .gitmodules
================================================
[submodule "i18n"]
path = i18n
url = https://github.com/albertlauncher/i18n.git
[submodule "lib/QHotkey"]
path = lib/QHotkey
url = https://github.com/QtCommunity/QHotkey
[submodule "lib/QNotification"]
path = lib/QNotification
url = https://github.com/QtCommunity/QNotification
[submodule "plugins/application"]
path = plugins/application
url = https://github.com/albertlauncher/albert-plugin-application.git
[submodule "plugins/applications"]
path = plugins/applications
url = https://github.com/albertlauncher/albert-plugin-applications.git
[submodule "plugins/bluetooth"]
path = plugins/bluetooth
url = https://github.com/albertlauncher/albert-plugin-bluetooth.git
[submodule "plugins/caffeine"]
path = plugins/caffeine
url = https://github.com/albertlauncher/albert-plugin-caffeine.git
[submodule "plugins/calculator-qalculate"]
path = plugins/calculator-qalculate
url = https://github.com/albertlauncher/albert-plugin-calculator-qalculate.git
[submodule "plugins/chromium"]
path = plugins/chromium
url = https://github.com/albertlauncher/albert-plugin-chromium.git
[submodule "plugins/clipboard"]
path = plugins/clipboard
url = https://github.com/albertlauncher/albert-plugin-clipboard.git
[submodule "plugins/commandline"]
path = plugins/commandline
url = https://github.com/albertlauncher/albert-plugin-commandline.git
[submodule "plugins/contacts"]
path = plugins/contacts
url = https://github.com/albertlauncher/albert-plugin-contacts.git
[submodule "plugins/datetime"]
path = plugins/datetime
url = https://github.com/albertlauncher/albert-plugin-datetime.git
[submodule "plugins/debug"]
path = plugins/debug
url = https://github.com/albertlauncher/albert-plugin-debug.git
[submodule "plugins/dictionary"]
path = plugins/dictionary
url = https://github.com/albertlauncher/albert-plugin-dictionary.git
[submodule "plugins/docs"]
path = plugins/docs
url = https://github.com/albertlauncher/albert-plugin-docs.git
[submodule "plugins/files"]
path = plugins/files
url = https://github.com/albertlauncher/albert-plugin-files.git
[submodule "plugins/github"]
path = plugins/github
url = https://github.com/albertlauncher/albert-plugin-github.git
[submodule "plugins/hash"]
path = plugins/hash
url = https://github.com/albertlauncher/albert-plugin-hash.git
[submodule "plugins/homebrew"]
path = plugins/homebrew
url = https://github.com/albertlauncher/albert-plugin-homebrew.git
[submodule "plugins/mediaremote"]
path = plugins/mediaremote
url = https://github.com/albertlauncher/albert-plugin-mediaremote.git
[submodule "plugins/menubar"]
path = plugins/menubar
url = https://github.com/albertlauncher/albert-plugin-menubar.git
[submodule "plugins/obsidian"]
path = plugins/obsidian
url = https://github.com/albertlauncher/albert-plugin-obsidian.git
[submodule "plugins/python"]
path = plugins/python
url = https://github.com/albertlauncher/albert-plugin-python.git
[submodule "plugins/snippets"]
path = plugins/snippets
url = https://github.com/albertlauncher/albert-plugin-snippets.git
[submodule "plugins/spotify"]
path = plugins/spotify
url = https://github.com/albertlauncher/albert-plugin-spotify.git
[submodule "plugins/ssh"]
path = plugins/ssh
url = https://github.com/albertlauncher/albert-plugin-ssh.git
[submodule "plugins/system"]
path = plugins/system
url = https://github.com/albertlauncher/albert-plugin-system.git
[submodule "plugins/timer"]
path = plugins/timer
url = https://github.com/albertlauncher/albert-plugin-timer.git
[submodule "plugins/timezones"]
path = plugins/timezones
url = https://github.com/albertlauncher/albert-plugin-timezones.git
[submodule "plugins/urlhandler"]
path = plugins/urlhandler
url = https://github.com/albertlauncher/albert-plugin-urlhandler.git
[submodule "plugins/vpn"]
path = plugins/vpn
url = https://github.com/albertlauncher/albert-plugin-vpn.git
[submodule "plugins/websearch"]
path = plugins/websearch
url = https://github.com/albertlauncher/albert-plugin-websearch.git
[submodule "plugins/widgetsboxmodel"]
path = plugins/widgetsboxmodel
url = https://github.com/albertlauncher/albert-plugin-widgetsboxmodel.git
================================================
FILE: .pre-commit-config.yaml
================================================
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
#- repo: https://github.com/pre-commit/pre-commit-hooks
# rev: v3.2.0
# hooks:
# - id: trailing-whitespace
# - id: end-of-file-fixer
# - id: check-yaml
# - id: check-added-large-files
- repo: https://github.com/jorisroovers/gitlint
rev: v0.19.1
hooks:
- id: gitlint
args:
- --ignore=body-is-missing,body-min-length
- --contrib=contrib-title-conventional-commits
- -c
- contrib-title-conventional-commits.types=fix,feat,chore,docs,style,refactor,perf,test,revert,ci,build,api
- --msg-filename
================================================
FILE: CHANGELOG.md
================================================
## v34.0.10 (2026-02-13)
### Features
#### Plugins
- **Widgets BoxModel** · Warn on icon rendering taking too long
### Performance
#### Plugins
- **Widgets BoxModel** · Warm up font rendering
### Fixes
#### Core
- _GeneratorQueryHandler_ · Workaround Qt 6.4 deadlocks
- _BackgroundExecutor_ · Workaround Qt 6.4 deadlocks
## v34.0.9 (2026-02-13)
### Fixes
#### Core
- _widgetsboxmodel_ · Accidentially released dev branch
#### Plugins
- **URL Handler** · Disable implict input action
## v34.0.8 (2026-02-13)
### Fixes
#### Plugins
- **Python plugins** · Dependent template breaks almost all builds
### Miscellaneous Tasks
#### Core
- Remove title from cliff templates
#### Plugins
- **GitHub** · Remove leftover debug output
## v34.0.7 (2026-02-12)
### Fixes
- **Python plugins** · Default trigger overrides not used
## v34.0.6 (2026-02-12)
### Features
#### Plugins
- **Files** · Treat depth 0 as special value (infty)
- **Python plugins**
- Let default trigger be module name
- Add prefpanes plugin
### Fixes
#### Core
- Remove unnecessary redundancy in global query log
- Avoid holding a lock while calling plugin code
#### Plugins
- **Files** · File item completion
- **Jetbrains projects** · Python 3.12 problems
- **Python plugins** · _PyPluginLoader_ · Do not hold GIL while emitting `finished` signal
- **Timers** · Disable auto input action text
### Miscellaneous Tasks
#### Core
- _cliff_ · Ignore plugin release commits
- Remove unreleased changes from changelog
#### Plugins
- **PacMan** · Add maintainer
## v34.0.5 (2026-02-04)
### Features
#### Plugins
- **Jetbrains projects** · Global query handling
- **VSCode projects** · Support workspaces and singlefile recents
### Performance
#### Plugins
- **Jetbrains projects** · Debounce projects cache update
### Fixes
#### Core
- Run calls to `items()` threaded
#### Plugins
- **Chromium** · GCC13 builds
- **PacMan** · Query context variable
- **Pass** · Pass generate could have empty location
### Miscellaneous Tasks
#### Core
- Change motivational text in plugins tab placeholder widget
#### Plugins
- **Bitwarden** · Add maintainer
- **Jetbrains projects** · Update readme
## v34.0.4 (2026-02-02)
### Features
#### Plugins
- **Albert** · Show composed dir icon on albert dirs
- **Files** · Default to case insensitive matching for fs browsers
- **Spotify** · Add open settings action on error items
- **Widgets BoxModel**
- Linear-gradient brush support
- Add ubuntu prototype theme
### Fixes
#### Core
- Link to extension website
#### Plugins
- **Widgets BoxModel** · Correct `input_hint_color` default
### Miscellaneous Tasks
#### Core
- Update FAQ link
#### Plugins
- **Albert** · Translation correction
- **Chromium**
- Log reason on favicons db copy failure
- Add some more data directories
- Scan for profiles on init only if none configured
- **Files**
- Drop static dir mime type
- Do not store mime types, fetch mimetype on demand
- **Spotify** · Update german translations
- **Widgets BoxModel** · Update README
## v34.0.3 (2026-01-28)
### Features
#### Plugins
- **Applications**
- _macOS_ · Use default terminal for *.command files
- Add cosmic-term support
- Support guake terminal
- **Chromium**
- [**BREAKING**] · Add profile selection combo box
- Add option "Show favicons"
- **Clipboard** · Use clipboard emoji icon
### Performance
#### Plugins
- **Widgets BoxModel** · Cache icon by item identifier
### Fixes
#### Core
- _RankedQueryHandler_ · Do not call rankItems on main thread
- Segfault on plugin selection of unloaded plugin
#### Plugins
- **Bitwarden** · Return type and attr error
- **Clipboard** · Deadlock on clipboard change
- **Date and time** · Timer not started/stopped in same thread
- **Python plugins**
- Empty debug line
- Missing dependencies are not automatically installed
- Duplicate interpreter config dump
### Miscellaneous Tasks
#### Plugins
- **Applications** · Update translations
- **Bluetooth** · Add README link
- **Chromium**
- Add README
- Platform specific base dirs
- **Python plugins**
- Update translations
- Comment config dumps
## v34.0.2 (2026-01-21)
### Fixes
#### Plugins
- **Applications** · Non persistent and ineffective applications options
- **Python plugins**
- Pip freeze parsing
- Reset venv when Python version changed
- Handle errors of process executions
### Documentation
- Give the albert namespace a docstring
- Remove reference to ExtensionRegistry
### Miscellaneous Tasks
#### Core
- Codesign bundle with local certificate
#### Plugins
- **Python plugins**
- Instantiate plugins on main thread
- Drop dynamic dependecy installation
## v34.0.1 (2026-01-19)
### Fixes
#### Core
- Misleading tooltip in query widget
- Segfault on initial run
#### Plugins
- **Date and time**
- "Show date on empty query" not persisent
- Segfaults due to timers controlled from different threads
### Documentation
- Fix missing graphemeDefaultBrush docs
- Remove leftover icon topic
- Group `App` functions
### Miscellaneous Tasks
- _gitlint_ · Ignore body min length
## v34.0.0 (2026-01-19)
### Features
#### Core
- [**BREAKING**] Tokenize strings using unicode word boundaries
- Add 🕚 inputhint to global query wildcard
- Add Homebrew plugin
#### Plugins
- **Arch Linux Wiki** · Infinite scrolling
- **Documentation** · Allow custom docsets
- **GitHub**
- Use a placeholder icon to impove visual appearance
- Lazily fetch pages (Infinite scroll)
- **Kill Process** · Support all platforms
- **Obsidian**
- Flatpak app support
- Snapcraft support
- **Python plugins** · Add firefox plugin
- **Spotify** · Lazy item generation (Infinite scroll)
- **Widgets BoxModel**
- Customizable window properties
- Drop "quit on close" option
- **Wikipedia** · Infinite scrolling
### API
#### Core
- [**BREAKING**] Drop property.h
- [**BREAKING**] Rename `bind` to `bindWidget`
- [**BREAKING**] Drop `util` namespace
- [**BREAKING**] Drop `tryCreateDirectory`
- [**BREAKING**] Expose the `UsageScoring` class
- [**BREAKING**] Remove color macros from public interface
- [**BREAKING**] Simplify `UsageScoring` API
- [**BREAKING**] Add asynchronous query handling support
- [**BREAKING**] _BackgroundExecutor_ · Remove any logging or exception handling
- Make `template<typename T> T* extension(const QString &id)` const
- [**BREAKING**] Move UsageScoring into the Query
- [**BREAKING**] Add object oriented global `App` interface
- [**BREAKING**] Remove const from global query handlers parameter
- [**BREAKING**] Add `GeneratorQueryHandler` class
- [**BREAKING**] Drop `GlobalQueryHandler::handleGlobalQuery`
- [**BREAKING**] Rename `Query` to `QueryContext`
- [**BREAKING**] Rename `ThreadedQueryHandler` to `RankedQueryHandler`
- Add class `AsyncGeneratorQueryHandler`
- [**BREAKING**] Rename `QueryContext::string` to `QueryContext::query`
- Make `QueryContext::isValid` thread-safe
- Asynchronous PluginInstance initialization
- [**BREAKING**] _PluginInstance_ · Remove keychain API
- [**BREAKING**] Facade `ExtensionRegistry` behind `App` interface
- [**BREAKING**] Redesign icon API
#### Plugins
- **Python plugins** · [**BREAKING**] · Python plugin interface v5.0
### Performance
#### Plugins
- **Calculator** · Initialize calculator in background thread
- **Documentation** · Asynchronous initialization
- **Python plugins** · Asynchronous plugin initialization
### Fixes
#### Core
- No tray icon on xdg platforms
- Taborder in settingswidget
- _QueryResults_ · Proper tr context
- _OAuth_ · Do not silently fail on incorrect credentials
- Prevent segfaults on plugin unload while window is visible
- _GlobalQuery_ · Threading bugs
- Replace leftover bool ref stop token
- Add icon.h to header file set
- Use clang for dedicated plugin test builds
- `configWidget` call on unloaded plugin
- Workaround Qt 6.4 deadlocks
- Dead link in CONTRIBUTING.md
- Mute shadow warnings
- Mute -Wunused warnings
#### Plugins
- **CopyQ** · Invalid return type
- **Debug** · Workaround GCC13 bugs
- **Docker** · Proper tag handling
- **Documentation** · Extract docsets into the docset directory
- **Emoji** · Loading error when locale is 'C'
- **Files** · Apply mime filter to the root item.
- **GitHub**
- Fix typos in logs
- Avoid writing keychain on initial read
- Workaround GCC13 bugs (Ubuntu 24.04).
- **Obsidian** · Backward compatibility
- **Pass** · Correct license
- **Python plugins**
- Python AST API dropped attr `Str`
- Fix virtual dispatch of `GlobalQueryHandler::items`
- Fix virtual dispatch of `IndexQueryHandler::items`
- Fix virtual dispatch of `IndexQueryHandler::rankItems`
- Use regular exceptions instead of pybind11_fail
- **Spotify**
- Broken error icon lookup
- Avoid unneccesary writes to keychain on initial read
- **Widgets BoxModel**
- Correct window_shadow_size literal
- Segfaults on null query
- Derive palette from app instead style
### Documentation
#### Core
- Structure by topics
- Update doxygen topic structure
- Update query handlers documentation
- Update ALBERT_PLUGIN macro documentation
- Fix maintainers field documentation
- Document how to handle plugin initialization failure
- Add a note on GCC-13 generator bugs
- _PluginLoader_ · Move contract into class description
- Reorder changelog groups
#### Plugins
- **Documentation** · Document the custom docset feature
### Testing
#### Plugins
- **Files** · Fix tests according to d033020b89f0306eaf09fdf95070e1697ed7c633
- **Python plugins** · Update tests
### Miscellaneous Tasks
#### Core
- Mute `-Wshadow` warnings
- _docker_ · Build test images with Clang and Ninja
- _test_ · Mute `-Wunused-result` warnings
- _changelog_ · Group plugin commits if >1
- Rename plugin _path_ to _commandline_
- Mute clazy-fully-qualified-moc-types
- Print theme search paths on start
- _RateLimiter_ · Async acquire support
- Drop Widgetsboxmodel QSS frontend
- Git ignore ".qtcreator"
- _StandardIconType_ · Add values and documentation
- _Telemetry_ · Derive QObject, use proper context objects
- Remove global engine access on item activation
- _RPCServer_ · Avoid using QtPrivate
- _QueryEngine_ · Emit signal per handler type
- Separate plugin macros from `config.h` into `plugin.h`
- Do not export privately linked dependencies
- _docker_ · Pull qcoro dependencies
- _GlobalQuery_ · Print diag and add results of valid queries only
- Update translations
- _CI_ · Update macos build system
- _CI_ · Add QCoro dependency
- Run dedicated plugin test builds in docker files
- Do not print plugin exceptions to the root logging category
- Update changelog template
- Revert to GCC builds
- Do not send anything if users opt out telemetry
#### Plugins
- **AUR**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Albert**
- Adapt API changes
- Use new icon API
- **Applications**
- Adapt API changes
- Drop soft hyphen removal
- Use new icon API
- **Arch Linux Wiki**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Bitwarden**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Bluetooth**
- Adapt API changes
- Use new icon API
- **Caffeine**
- Adapt API changes
- Use new icon API
- **Calculator**
- Adapt API changes
- Use new icon API
- **Chromium**
- Adapt API changes
- Use new icon API
- **Clipboard**
- Adapt API changes
- Remove unused include
- Adapt new icon API
- **CoinGecko**
- Adapt to API changes
- Add readme
- Add CODEOWNERS
- Adapt icon API changes
- **Contacts**
- Adapt API changes
- Remove legacy shared_ptr holder
- Adapt new icon API
- **CopyQ**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Date and time**
- Adapt API changes
- Adapt new icon API
- **Debug**
- Adapt API changes
- Adapt new icon API
- **Dictionary**
- Adapt API changes
- Adapt new icon API
- **Docker**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Documentation**
- Add README content
- Document the custom dataset feature
- Adapt API changes
- Drop legacy workaraound for lacking move semantics
- Adapt new icon API
- **Emoji**
- Increase interface version
- Add CODEOWNERS
- Adapt icon API changes
- **Files**
- Adapt API changes
- Fix test
- Remove unused include
- Adapt new icon API
- **GitHub**
- Adapt API changes
- Move all saved search handling into root handler
- Adapt further API changes
- Use qtkeychain directly
- Adapt new icon API
- **GoldenDict**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Hash Generator**
- Adapt API changes
- Adapt new icon API
- **Jetbrains projects**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Kill Process**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Locate**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Media player remote**
- Adapt API changes
- Adapt new icon API
- **Menu bar**
- Adapt API changes
- Adapt new icon API
- **Obsidian**
- Fix range-loop-detach warning
- Print found vaults to console
- Adapt API changes
- Index all vaults on change
- Adapt further API changes
- Adapt new icon API
- **PacMan**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Pass**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Pomodoro**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Python Eval**
- Adapt to API changes
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Python plugins**
- Drop plugin duckduckgo
- Remove unused include
- Update plugins
- **SSH**
- Adapt API changes
- Adapt new icon API
- **Snippets**
- Adapt API changes
- Avoid `-Wunused`
- Update translations
- Adapt new icon API
- **Spotify**
- Adapt API changes
- Use detail::DyamicItem
- _TrackItem_ · Show only authors in description
- _ArtistItem_ · Show followers and genres in description
- _AlbumItem_ · Show only artists in description
- _PlaylistItem_ · Show only owner in description
- _ShowItem_ · Show only publisher in description
- _EpisodeItem_ · Show only description in description
- _AudiobookItem_ · Show only authors in description
- Further adaption of API changes
- Use qtkeychain directly
- Adapt new icon API
- **Syncthing**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **System**
- Adapt API changes
- Remove unused include
- Adapt new icon API
- **TeX to Unicode**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Time zones**
- Adapt API changes
- Adapt new icon API
- **Timers**
- Adapt API changes
- Adapt new icon API
- **Translator**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **URL Handler**
- Adapt API changes
- Adapt new icon API
- **Unit Converter**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **VPN**
- Adapt API changes
- Adapt new icon API
- **VSCode projects**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **VirtualBox**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- **Web search**
- Adapt API changes
- Adapt new icon API
- **Widgets BoxModel**
- Adapt API changes
- Mute missing context object warning
- Take namespace of the old WBM frontend
- Adapt new icon API
- **Wikipedia**
- Add CODEOWNERS
- Adapt icon API changes
- **X Window Switcher**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
- Add maintainer
- **Zeal**
- Adapt to API changes
- Add CODEOWNERS
- Adapt icon API changes
## v33.0.1 (2025-10-15)
### Core changes
#### Fixes
- Workaround hidpi icon Qt bug
#### Miscellaneous Tasks
- _QIconEngineAdapter_ · Remove drawing code
## v33.0.0 (2025-10-14)
### Core changes
#### Features
- _triggersqueryhandler_ · Add fuzzy support
- _tray_ · Install the app tray icon on xdg
- Built-in fallback theme support
- _PluginQueryHandler_ · Add 'Load'/'Reload' actions
- User customizable PATH
#### Fixes
- _triggersqueryhandler_ · Properly sync triggers
- _rankitem_ · Correct inverted text length in operator<
- _globalquery_ · Remove leftover explicit comparator
- Update wayland faq link
#### Performance
- _rankitem_ · Avoid multiple string allocations in comparison (🚀200%)
- _globalqueryhandler_ · Instant response times in handleTriggerQuery
#### API
- Add `util::percentEncoded`
- Add `util::percentDecoded`
- [**BREAKING**] Add customizable and typesafe icon support
- _PluginInstance_ · [**BREAKING**] Asynchronous keychain access
#### Documentation
- _cmake-macros_ · Add missing metadata fields
- _plugininstance_ · Add \ref, remove \since, some updates.
- _extensionplugin_ · Add doxygen references
- _TriggerQueryHandler_ · Update doxygen documentation
#### Miscellaneous Tasks
- Add api group to gitlint
- Remove justfile
- Add git cliff configuration
- Move frontend resources into frontend repository
- _Scoring_ · Fetch exceptions thrown from items
- Replace about text with list of links
- Notify on major version change
### Plugin changes
#### Features
- **Albert** · Use paths of app data locations as input action text
- **Applications** · Add sakura terminal support
- **Bluetooth** · Linux/BlueZ support
- **Bluetooth** · Device icon based on class of device
- **Clipboard** · Add fuzzy support
- **Documentation** · _icon_ · Pixel density dependent icon
- **Jetbrains projects** · Handle multiple config dir prefixes (#4)
- **Jetbrains projects** · Update icons to 2025 (#5)
- **Python Eval** · Customizable list of modules to preload
- **VirtualBox** · Use SDK manually installed into venv
#### Fixes
- **Applications** · _macOS_ · Index apps in $HOME/Applications
- **Calculator** · Remove completion on evaluation errors
- **Emoji** · Do not lower others while capitalizing 1st char
- **GitHub** · Correct endpoint in "Show on GitHub" action
- **Menu bar** · Mutex item acces
- **PacMan** · Remove trigger from input action
- **Python Eval** · Remove trigger from input action
- **Python plugins** · Add missing `setTrigger` trampoline
- **System** · Strict standard conform array initialization
#### Performance
- **Spotify** · Select smallest picture greater than 128px
#### API
- **Python plugins** · [**BREAKING**] · Reflect core API changes in the Python API.
#### Documentation
- **Python plugins** · Unify and update links
- **Python plugins** · Polish stubfile. Minor fixes.
- **Python plugins** · _IndexQueryHandler_ · Mark final methods `@final`
#### Testing
- **Python plugins** · Add additional tests
#### Miscellaneous Tasks
- **AUR** · Add maintainer
- **AUR** · Add README
- **AUR** · Adopt v4 API changes
- **AUR** · Adopt v4 StandardItem API changes
- **Albert** · _icon_ · Adapt to updated icon API
- **Applications** · _icon_ · Adapt to updated icon API
- **Applications** · Make exec_args usable on all platforms
- **Arch Linux Wiki** · Adopt v4 API changes
- **Arch Linux Wiki** · Adopt v4 StandardItem API changes
- **Bitwarden** · Add README
- **Bitwarden** · Adopt v4 API changes
- **Bitwarden** · Adopt v4 StandardItem API changes
- **Bluetooth** · Platform abstraction
- **Bluetooth** · _icon_ · Adapt to updated icon API
- **Caffeine** · _icon_ · Adapt to updated icon API
- **Calculator** · _icon_ · Adapt to updated icon API
- **Chromium** · _icon_ · Adapt to updated icon API
- **Clipboard** · _icon_ · Adapt to updated icon API
- **CoinGecko** · Adopt v4 API changes
- **CoinGecko** · Adopt v4 StandardItem API changes
- **Contacts** · Remove unused code
- **Contacts** · _icon_ · Adapt to updated icon API
- **Contacts** · Avoid copyingitems vector on indexing
- **CopyQ** · Adopt v4 API changes
- **CopyQ** · Adopt v4 StandardItem API changes
- **Date and time** · _icon_ · Adapt to updated icon API
- **Debug** · _icon_ · Adapt to updated icon API
- **Dictionary** · _icon_ · Adapt to updated icon API
- **Docker** · Adopt v4 API changes
- **Docker** · Adopt v4 StandardItem API changes
- **DuckDuckGo** · Adopt v4 API changes
- **DuckDuckGo** · Adopt v4 StandardItem API changes
- **Emoji** · Add maintainers
- **Emoji** · Adopt v4 API changes
- **Emoji** · Adopt v4 StandardItem API changes
- **Files** · _icon_ · Adapt to updated icon API
- **GitHub** · _icon_ · Adapt to updated icon API
- **GitHub** · Adapt to async keychain API
- **GoldenDict** · Add README
- **GoldenDict** · Adopt v4 API changes
- **GoldenDict** · Adopt v4 StandardItem API changes
- **Hash Generator** · _icon_ · Adapt to updated icon API
- **Jetbrains projects** · Add maintainers
- **Jetbrains projects** · Adopt v4 API changes
- **Jetbrains projects** · Add README
- **Jetbrains projects** · Adopt v4 StandardItem API changes
- **Kill Process** · Add maintainer
- **Kill Process** · Adopt v4 API changes
- **Kill Process** · Adopt v4 StandardItem API changes
- **Locate** · Adopt v4 API changes
- **Locate** · Adopt v4 StandardItem API changes
- **Media player remote** · _icon_ · Adapt to updated icon API
- **Menu bar** · _icon_ · Adapt to updated icon API
- **Obsidian** · _icon_ · Adapt to updated icon API
- **PATH** · _icon_ · Adapt to updated icon API
- **PacMan** · Add README
- **PacMan** · Adopt v4 API changes
- **PacMan** · Adopt v4 StandardItem API changes
- **Pass** · Add maintainers
- **Pass** · Adopt v4 API changes
- **Pass** · Adopt v4 StandardItem API changes
- **Pomodoro** · Adopt v4 API changes
- **Pomodoro** · Adopt v4 StandardItem API changes
- **Python Eval** · Adopt v4 API changes
- **Python Eval** · Adopt v4 StandardItem API changes
- **Python plugins** · Drop color plugin
- **Python plugins** · Drop dice_roll plugin
- **Python plugins** · Use smart_holders for items
- **Python plugins** · >3.9 typing annotations
- **Python plugins** · Update to pybind v3.0.1
- **Python plugins** · Refactor and minor optimizations.
- **SSH** · _icon_ · Adapt to updated icon API
- **Snippets** · _icon_ · Adapt to updated icon API
- **Spotify** · _icon_ · Adapt to updated icon API
- **Spotify** · Adopt async keychain API
- **Syncthing** · Adopt v4 API changes
- **Syncthing** · Adopt v4 StandardItem API changes
- **System** · _icon_ · Adapt to updated icon API
- **TeX to Unicode** · Add maintainers
- **TeX to Unicode** · Adopt v4 API changes
- **TeX to Unicode** · Adopt v4 StandardItem API changes
- **Time zones** · _icon_ · Adapt to updated icon API
- **Timers** · _icon_ · Adapt to updated icon API
- **Translator** · Adopt v4 API changes
- **Translator** · Adopt v4 StandardItem API changes
- **URL Handler** · _icon_ · Adapt to updated icon API
- **Unit Converter** · Add maintainers
- **Unit Converter** · Adopt v4 API changes
- **Unit Converter** · Adopt v4 StandardItem API changes
- **VPN** · _icon_ · Adapt to updated icon API
- **VSCode projects** · Add maintainer
- **VSCode projects** · Adopt v4 API changes
- **VSCode projects** · Adopt v4 StandardItem API changes
- **VirtualBox** · Adopt v4 API changes
- **VirtualBox** · Adopt v4 StandardItem API changes
- **Web search** · _icon_ · Adapt to updated icon API
- **Widgets BoxModel** · _icon_ · Adapt to updated icon API
- **Widgets BoxModel** · Adopt changes of async keychain
- **Widgets BoxModel QSS** · _icon_ · Adapt to updated icon API
- **Widgets BoxModel QSS** · Adopt API changes of async keychain
- **Wikipedia** · Adopt v4 API changes
- **Wikipedia** · Adopt v4 StandardItem API changes
- **X Window Switcher** · Adopt v4 API changes
- **X Window Switcher** · Adopt v4 StandardItem API changes
- **Zeal** · Adopt v4 API changes
- **Zeal** · Adopt v4 StandardItem API changes
## v0.32.1 (2025-08-21)
### Albert
- Fix plugins list view borders in breeze styles
### Plugins
- **github**
- Add saved search action "Show on GitHub"
- **obsidian**
- Fix obsidian.json path on xdg platforms
- **widgetsboxmodel**
- Fix window property signals
## v0.32.0 (2025-08-16)
### Albert
- Add plugin: Obsidian
### API
- Let `runAppleScript` return the result and throw on error
- Add maintainers to metadata
- Move InputHistory to namespace `detail`
### Plugins
- **clipboard**
- Specialize behavior of different platforms
Qt on macOS does not deliver clipboard changes reliably. Poll on macos. React on
clipboard changes everywhere else.
- **copyq**
- v3 Add macOS support
- **kill**
- Add platform filter.
- **obsidian** 🆕
- **python**
- API v3.1 Add additional metadata fields
- md_maintainers
- md_readme_url
- md_platforms
## v0.31.1 (2025-07-29)
Fix pre Qt6.7 builds not supporting QString spaceship operator
## v0.31.0 (2025-07-28)
### API
- Move `applyUsageScore` into `TriggerQueryHandler`
- `GlobalQueryHandler::applyUsageScore` pass by reference
### Plugins
- **python** Add plugins as submodules
- **ssh** v10
- Allow customizing the ssh command
- Allow customizing the remote command
- **locate** v3
- Drop update database action
- Filter using `Matcher`
- Use system file icons
## v0.30.1 (2025-07-12)
### Plugins
- **contacts**
- Use AppleScript to open contacts which allows setting a selection.
- **github**
- Avoid downloading icons multiple times
- **python**
- Use pip freeze instead of inspect to check for existing packages
## v0.30.0 (2025-06-30)
Adds minor API improvements and new plugins Spotify (WIP) and VSCode.
### Albert
- Add construction site emojis to beta plugins title
### API
- Move `Action` into `item.h`. Apply perfect forwarding in ctor.
- API: Add `QString albert::util::runAppleScript(const QString &script)`
- Move DesktopEntryParser from app plugin into private albert API
### Plugins
- **files**
- Index trash item also by native title
- Fix link paths
- **github**
- Fix translations of listview headers
- Drop fixed listview height
- **mediaremote**
- v7
- Drop public API
- Reintroduce multi player support
- Nice composed icons
- **spotify** 🆕
### Python plugins
- **vscode_projects** 🆕
- **translators** Improve description
## v0.29.4 (2025-06-27)
### Albert
- Add optional field "readme_url" to metadata. Add a link in the plugin settings if it is available
- Fix dysfunctional url scheme handler
## v0.29.3 (2025-06-26)
Fix release.
## v0.29.2 (2025-06-25)
Hotfix release.
## v0.29.1 (2025-06-24)
Hotfix gitmodules private link causing all Linux builds to fail
## v0.29.0 (2025-06-24)
- New GitHub plugin
- Next step in making the API more developer friendly
### Albert
- Move AppQueryHandler into plugin
### API
- c++23 👋
- Make `PluginLoader` asynchronous
- `StandardItem` changes
- Make `input_action_text` the last constructor argument
- Apply perfect forwarding in constructor and shared_ptr factory.
- The default behavior of `inputActionText()` is to return `name()` if
`input_action_text` is the null string. Set `input_action_text` explicitly to
the empty string to get no input action text at all.
- Return `text()` in `Item::inputActionText` base implementation
- Remove frontend related classes from public API
- Add `albert::util::toQString(const std::filesystem::path&)`
- Simplify messagebox functions
- Add modal parent parameter to messagbox utils
- Drop `makeRestRequest` from `networkutil.h`
- Move `ExtensionPlugin` into `util` namespace
- Move `TelemetryProvider` into private namespace
- Rename `albert::util::FileDownloader` to `albert::util::Download`
- Add `shared_ptr<Download> albert::util::Download::unique(const QUrl &url, const QString &path)`
- Move plugin dependecies into `albert::util` namespace
### Plugins
- **application**
- Moved from core to plugin
- **applications**
- Read env variable `ALBERT_APPLICATIONS_COMMAND_PREFIX`
- **bluetooth**
- Fix MRU order
- **caffeine**
- Fix completion behavior
- **docs**
- Index docsets in background thread
- **github** 🆕
- **python**
- Check and install missing dependencies _before_ loading plugins
- Add button that opens terminal in activated venv
- **ssh**
- Fix missing sort in triggered handler
- **widgetsboxmodel**
- Remove deprecated theme info
- Support F/B bindings for pgdown/pgup
## v0.28.2 (2025-06-20)
Hotfix index initialization
## v0.28.1 (2025-06-19)
Fix release.
## v0.28.0 (2025-05-30)
### Albert
- Make global and triggered triggersqueryhandler behave the same
### API
- Force plugins to not convert from ascii.
- Move system related functions into `systemutil.h`
- Remove `void open(const std::string &path);`
- Remove default param workdir in `runDetachedProcess`
- Add `long long runDetachedProcess(const QStringList&);`
- Remove `open(const std::string &path);`
- Add `open(const std::filesystem::path &path);`
- Remove `Query::isFinished()`
- Changes to `albert::util::InputHistory`
- Add `uint limit() const;`
- Add `void setLimit(uint);`
- Support multiline entries (store in JSON format)
- Add keychain support
- Add `QString PluginInstance::readKeychain(const QString & key) const;`
- Add `void writeKeychain(const QString & key, const QString & value);`
- Iconprovider add `mask:` and `comp:` schemes
- mask: Mask a given icon given a radius divisor.
- comp: Composes two given icons.
- Move messagebox utils to `messagebox.h`
- Move utility symbols into `albert::util` namespace
- Add class `albert::util::FileDownLoader`
- Add class `albert::util::OAuthConfigWidget`
- Add class `albert::util::OAuth`
- Add `widgetsutil.h`
- Add `bind` function for QCheckBox
- Add `bind` function for QLineEdit
- Add `bind` function for QSpinBox
- Add `bind` function for QDoubleSpinBox
- Remove `ALBERT_PROPERTY_CONNECT_*` macros
- Add `networkutil.h`
- Move `albert::network()` to `albert::util::network`
- Add `waitForFinished(QNetworkReply *reply)`
- Add `QNetworkRequest makeRestRequest(…)`
- Add CMake macros
- `albert_plugin_link_qt`
- `albert_plugin_dbus_interface`
- `albert_plugin_sources`
- `albert_plugin_link`
- `albert_plugin_include_directories`
- `albert_plugin_i18n`
- `albert_plugin_generate_metadata`
- `albert_plugin_compile_options`
- Add dynamic items feature
- Add interface class `albert::Item::Observer`
- Add `void albert::Item::addObserver(Observer *observer);`
- Add `void albert::Item::removeObserver(Observer *observer);`
- Add `albert:` scheme handling support
- Add `albert::UrlHandler` extension
### Plugins
- **chromium**
- Show the full folder path
- **datetime**
- Add paste action
- Dynamic item support
- **docs**
- Compose icon with the books emoji to compensate for its 32x32 size
- Fix missing cache location initialization
- Fix directory init mismatch
- **mpris** → **mediaremote**
- v6 macOS implementation
- **path**
- Fix trigger behavior
- **snippets**
- Fix https://github.com/albertlauncher/albert-plugin-snippets/issues/1
- Use query dependent synopsis
- Allow putting text directly into inputline
- Add input validation in snippet name input dialog
- **ssh**
- Avoid empty match in global query.
- **timer**
- Use dynamic item feature
- **timezones**
- Fix icon and translations
- Use batch add to avoid flicker
- **vpn**
- Use dynamic item feature
- **websearch**
- Fix 6.9 breaking tableview behavior
- **widgetsboxmodel**
- Make use of Query::dataChanged for dynamic items
- Disable window properties for now
- Add input edit mode
- Change animation durations to a more calm behavior
- Drop redundant history text equality check
- Properly reset input history search on hide.
- Restore user input on backward history iteration end
- Fix macOS cmd+backspace behavior in multiline editing
- Fix weird selection glitch
- Fix out of bounds crashes. Trigger length is set async and may exceed the text length.
- Fix null query segfaults
- Fix comboboxes not showing system theme
## v0.27.8 (2025-04-06)
Hotfix release for the frontends.
### Plugins
- **widgetsboxmodel**
- Fix uninitialized trigger length causing crashes
- **widgetsboxmodel-qss**
- Adopt completion bahavior
- Non hiding action support.
- Themesqueryhandler behavior from wbm
## v0.27.7 (2025-04-02)
Hotfix git submodule urls.
## v0.27.6 (2025-04-02)
### Albert
- Organize plugins in submodules.
- Run the empty query on `*`
- Add *'Open in terminal'* action to AppQueryHandler
### API
- Add `albert::Action::hide_on_activation`
- Add `albert::PluginInstance::dataLocations`
- Add `albert::show(const QString&)`
- Add standard message box functions modal to the main window.
- Add `albert::question(…)`
- Add `albert::information(…)`
- Add `albert::warning(…)`
- Add `albert::critical(…)`
### Plugins
- **bluetooth**
- Add icons for (in)active/(dis)connected items.
- Add completions.
- **caffeine**
- Polish translations of durations.
- Add natural duration spec (eg 1h1m).
- Fix weird trigger completions.
- Fix default trigger matching.
- Add deactivation notification.
- Use special text ∞ in settings.
- **clipboard** - Avoid flicker by using batch add.
- **system**
- New icon set.
- Update macOS logout command.
- **timer** - Remove timers from empty query without hiding the window.
- **vpn** - Add icons clearly indicating the state.
- **websearch** - New default icon.
- **widgetsboxmodel** and **widgetsboxmodel-qss**
QStyleSheetStyle and its style sheets are a mess to work with and pretty limited.
They may be suitable to style dedicated widgets but not for entire UIs.
This release lays the foundation for a frontend that is not a pain to work with.
The widgetsboxmodel as you know it has been forked to `widgetsboxmodel-qss`.
But for now it still has the id `widgetsboxmodel` id until the prototype is polished enough.
The id of the new widgetsboxmodel frontend without style sheets is widgetsboxmodel-ng.
- Theme files support.
- Allow multiline input. Shift enter inserts a newline.
- Empahsize the trigger.
- Add context menu to button
- Allow non hiding actions.
- Add a handcrafted, buffered windowframe. Drop glitchy Qt shadow.
- Add option 'Disable input method'.
- Completion and synopsis side by side.
- Handcrafted rounded rects that support gradients.
- Ads settable window properties like colors, margins, sizes and such.
- Put settingsbutton into the input layout. No overlay anymore.
- Always show action to set the _current_ mode first (dark, light).
- Add debug overlay option
- Loads of fixes and mini improvements.
## v0.27.5 (2025-03-06)
### Plugins
- **widgetsboxmodel** - Fix dark mode detection on Gnome
- **coingecko** - Make sure cache location exists
- **emoji** - Make sure cache location exists
## v0.27.4 (2025-03-05)
### Albert
- Fix translation file lookup
### Plugins
- **vpn**
- Add xdg platform (network manager)
- Listen to state changes
- **python.vpn** - Archive plugin
- Append _en to the plural files
## v0.27.3 (2025-02-28)
Hotfix Qt 6.2 backward compatibility (Ubuntu 22.04 builds).
## v0.27.2 (2025-02-28)
Hotfix #1517
## v0.27.1 (2025-02-27)
### Albert
- Fixes and minor improvements
- Update translations
### Plugins
- **vpn**
- Change icons
- Fix translations
- **python**
- Redesign the settings widget
- Allow users to reset the venv
- Avoid initializing venv on every start
## v0.27.0 (2025-02-27)
This is primarily an intermediate release that reverts bad design decisions that make progress difficult.
### API
- `albert`
- Remove class `ItemsModel`
- Remove enum `ItemRoles`
- Remove `openUrl(const QUrl &url)`
- Remove `ExtensionWatcher<T>`
- Add class `ResultItem`
- Add `const ExtensionRegistry &extensionRegistry();`
- Add `tryCreateDirectory(const filesystem::path&)`
- `network()`: Return reference
- `albert::ExtensionRegistry`
- Remove `T* extension<T>(const QString &id)`
- `albert::PluginInstance`
- Remove `ExtensionRegistry ®istry();`
- Remove `createOrThrow(const QString &path)`
- Make `cache/config/dataLocation` return filesystem::path
- Add `extensions()`
- `ExtensionPlugin`
- Add `ExtensionPlugin::extensions()`
- `albert::MatchConfig`
- Avoid recurring default separator regex instatiation
- Change field order
- `albert::Query`
- Add isActive()
- Return `vector<ResultItem>` in `matches` and `fallbacks`
- Return `bool` in `activate*`
- Remove signal `finished`
- Add signal `matchesAboutToBeAdded`
- Add signal `matchesAdded`
- Add signal `invalidated`
- Add signal `activeChanged`
- `albert::TriggerQueryHandler`
- Pass queries as reference
- `synopsis()` > `synopsis(const QString &query)`
- `albert::GlobalQueryHandler`
- Pass queries as reference
- Remove param of `handleEmptyQuery`
- Rename albert/util.h to albert/albert.h
### Plugins
- **python**
- Add tests.
- Google Docstring format stub file.
- **Python API v3.0**. See changelog in stub file for details.
## v0.26.13 (2025-01-06)
Hotfix backward compatibility.
## v0.26.12 (2025-01-06)
### Albert
- Fix device dependent pixmap creation
- Avoid usage of deprecated QStyle::standardPixmap
### Plugins
- **applications** - Add ghostty
## v0.26.11 (2024-12-30)
### Albert
- Add a motivating text in the plugin settings placeholder page
### Plugins
- **timer**
- Allow h, m, s durations
- Clean obsolete translations
- User timer emoji icon
- **caffeine** - Fix non-persistent default interval
- **menubar** - Do not retain NSRunningApplication forever.
- **widgetsboxmodel**
- Update icon handling
- Do not upscale icons that are smaller than requested
- Draw the icon such that it is centered in the icon area
- **chromium** - Update bookmark icon
- **websearch** - Change icon sizes which lead to blurry output
- **applications** - Change missing terminal link to issues choice
## v0.26.10 (2024-12-06)
### Albert
- Add some more precise Match tests
- Hardcode /usr/local/bin into PATH on macos
- Fix Matcher type conversion
- Precompile headers
### Plugins
- **chromium** - Avoid warnings on emtpy paths
- **menubar**
- Properly display glyphs
- Fix modifier conversion
- Minor improvements and fixes
- **bluetooth** - Add open settings action
## v0.26.9 (2024-12-02)
- **widgetsboxmodel** - Fix broken input history behavior
- **applications** - Set ignore_show_in_keys default to true
- **clipboard** - Fix typo
- **path** - Show PATH in settings and tr synopsis
- **docs** - "Fix" mac builds
## v0.26.8 (2024-11-18)
### Albert
- Minor improvements around telemetry
### API
- Add variadic ``Matcher::match(…)``
### Plugins
- **python** - Interface 2.5
- **applications**
- Recurse app directories on macos
- Revert back to command based heuristic to find terminals
- **menubar** - Show hotkeys
## v0.26.7 (2024-11-07)
### Albert
- CPack drop qt deploy tool
- Update translations
- Parse cli params asap for faster hotkeys
### Plugins
- **menubar** - v1.0
- **system** - Move sleep inhibition in separate plugin
- **caffeine** - Separate from system
## v0.26.6 (2024-10-23)
### Albert
- Actually make use of telemetry and send enabled plugins and activated extensions.
- Add context menu to the plugin list
- En/disable plugin
- Un/load plugin
- Option to sort list by checked state
- Improve testing
- Drop doctest. Use QTest.
- Drop doctest and use QTest
- Enable CTest for better CI
### API
- ``albert``
- Add ``quit()``
- Add ``restart()``
- Add ``open(QUrl url)``
- Add ``open(QString path)``
- Add ``open(filesystem::path path)``
- ``InputHistory``
- Constructor now optionally takes a path
- Add colors to logging.h
### Plugins
- **applications**
- Send telemetry about available terminals
- Log warning on unsupported terminals
- Case sensitive desktop ids
- Fix desktop entry shadowing
- Add terminal org.gnome.ptyxis
- **bluetooth** - Fix warning on language
- **files**
- Add filebrowser option: Show hidden files
- Add filebrowser option: Sort case insensitive
- Add filebrowser option: Show directories first
- Use QTest
- **widgetsboxmodel** - Fix weird end of history behavior
## v0.26.5 (2024-10-16)
### Plugins
- **qmlboxmodel** - Archive plugin
- **applications**
- Fix segfaults on Qt 6.8
- Add option "split camel case"
- Add option "use acronyms"
- Add terminals debian-uxterm and com.alacritty.Alacritty
- **python** - Do not allow site_import
- **dictionary** - Implement FallbackHandler
- **contacts**
- Implement IndexQueryHandler
- Index contacts in background
- Use all available names
- Add website addresses actions
## v0.26.4 (2024-09-24)
### Albert
- ItemIndex: Fix access to moved item. Skip emtpy IndexItems.
### Plugins
- **applications** - Search in /System/Cryptexes/App/System/Applications
- **files** - Fix f-term action failing on spaces
- **files** - Fix xfce4-terminal
- **snippets** - Fix typo
- **websearch** - Create required data directory on start
- **syncthing** - Use python-syncthing2. python-syncthing is dead.
- **unit_converter** - Remove future typehints
## v0.26.3 (2024-09-07)
### Plugins
- **calculator_qalculate**
- Add option: Units in global query
- Add option: Functions in global query
- **python**
- Proper venv isolation
- Fix excluding regex breaking aur builds
- No quotes around logs
## v0.26.2 (2024-08-21)
Hotfix docs plugin cluttering output due to nonunique item id
## v0.26.1 (2024-08-20)
### Albert
- Albert license v1.1
### Plugins
- **system**
- Also match the trigger for sleep inhibition
- Allow changing trigger for sleep inhibition
- **docs**
- Proper anchor support for all kinds of docsets
- Add the type to the description
- **files**
- Add option "index file path"
- Also fix persistence for option "case senstive file browsers"
- **applications**
- Sort terminals list by caseinsensitive name
## v0.26.0 (2024-08-16)
### Albert
- Give ``QIcon::fromTheme`` another try
### API
- Remove const from ``GQH::hgq`` and ``GQH::heq``
- Drop ``albert::runTerminal``. Moved to applications plugin.
- Make private property available in subclasses
- Add getter for plugin dependencies
### Plugins
- **system:10.0** - Add inhibit sleep feature
- **docs:3.17** - Be more tolerant with anchors
- **applications:12.0**
- Move terminal detection here
- Proper flatpak terminal support
- Add public interface to run terminals
- Proper platform abstraction
- Foundation for xdg-terminal-execute
- Foundation for URL scheme and mime type handlers
- **inhibit_sleep** Archive. Moved to system plugin.
- **docker:3.0** Revert to trigger query handling.
- **unit_converter:1.6** Port to API v2
- **jetbrains:2.0** - Add Aqua and Writerside
- **tex_to_unicode:1.3** Port to v2.3
## v0.25.0 (2024-08-02)
### Albert
- Simplify `MatchConfig`
- Hardcode `error_tolerance_divisor` to 4
### Plugins
- **chromium**
- Avoid initial double indexing
- Fix status message in settings window
- Fix warnings on empty paths
- **bluetooth** - Support fuzzy matching
- **urlhandler** - Use ``albert::openUrl``. ``QDesktopServices::openUrl`` fails on wayland.
## v0.24.3 (2024-07-09)
### Albert
- Port applications settings to new id
- Fix telemetry
### Plugins
- **snippets:5.4** Show a snippet preview in description.
## v0.24.2 (2024-07-02)
### Albert
- Add "open terminal here" to app directory items
- Hotfix #1408
### Plugins
- **python:4.5** Update python stub file
- **goldendict:1.5** Remove breaking type hints
## v0.24.1 (2024-06-28)
### Plugins
- **python:4.4** Revert back to using pybind submodule (v2.12.0)
## v0.24.0 (2024-06-28)
### Albert
- Ignore soft hyphens in lookup strings
- Add TriggersQueryHandler builtin handler
- Drop PluginConfigQueryHandler
- Ignore order of query words
- Do not run fallbacks on empty queries
- Allow unsetting hotkey on backspace
- Move about into general tab
- Use a button for hotkeys such that tab order is usable
- Cache icons in the fallback handler to avoid laggy resize
- Set 700 on albert dirs
- Use same config location and format on all platforms.
- Show message box on errors while loading enabled plugins
- Make openUrl working on wayland by using xdg-open
### API
- Loads of changes around the project structure
- `AUTOMOC`, `UIC`, `RCC` per target
- Structure sources in folders
- Flatten headers
- No paths in core source files (rather lots of include dirs)
- Finally proper target export such that plugin build in build tree as well as separate projects
- Add custom target `global_lupdate`
- CMake
- `albert_plugin(…)` modifications
- Add `QT` parameter
- Add `I18N_SOURCES` parameter
- `SOURCE_FILES` > `SOURCES`
- `I18N_SOURCE_FILES` > `I18N_SOURCES`
- `INCLUDE_DIRECTORIES` > `INCLUDE`
- `LINK_LIBRARIES` > `LINK`
- Make `SOURCES` optional. Specify source conventions: `include/*.h`, `src/*.h`, `src/*.cpp`, `src/*.mm`, `src/*.ui` and `<plugin_id>.qrc`
- Drop `METADATA` the metadata.json is a mandatory convention now.
- Drop `TS_FILES`. Autosource from 'i18n' dir given a naming convention.
`<plugin_id>.ts` and `<plugin_id>_<ui_language>.ts`
- Add CMake option `BUILD_PLUGINS`
- General
- Move `Q_OBJECT` into `ALBERT_PLUGIN` macro
- Remove app functions from API
- Rename `albert.h` to `util.h`
- `albert::networkManager` -> `albert::network`
- Add convenience classes for plugin interdependencies
- Allow `RankItem`s to be created using a `Match`
- Revert back to per plugin translations. Plugins shall be self contained modules and in principle be packagable in a separate package.
- Let `QtPluginLoader` automatically load translations if available.
- Add finished and total count to translations metadata
- User per target compile options
- Add `havePasteSupport()`
- Remove `openIssueTracker` from interface
- Separate and improve `ALBERT_PLUGIN_PROPERTY` macros
- `ALBERT_PROPERTY_GETSET`
- `ALBERT_PLUGIN_PROPERTY_GETSET`
- `ALBERT_PROPERTY_CONNECT_SPINBOX`
- Add param in property changed signal
- `PluginInstance`
- Add `{cache,config,data}Location`. Checks are up to the clients.
- Add `createOrThrow` as a utility function for the above functions.
- Add weak refs for `PluginLoader` and `ExtensionRegistry`
- Drop convenience functions like `id`, `name`, `description`.
- Drop `initialize`/`finalize`
- Registering extensions can fail
- Auto register root extensions
- Changes to icon provider API
- Add `QIcon` support
- Make it free functions
- Remove caching
- Returned size can be smaller than `requestedSize`, but is never larger.
- `Query`, engine and handlers
- Handle handler configuration in core (trigger, fuzzy, enabled).
Remove the getters, have only setters to update plugins.
- Add `TriggerQueryHandler::setUserTrigger`
- Remove `TriggerQueryHandler::trigger()`
- Remove `TriggerQueryHandler::fuzzyMatching()`
- Do not allow users to disable triggered query handlers.
This may end up in states where plugins are loaded but actually not used.
Also some handlers may rely on them to be there, like e.g. the files global
handler redirects tabs to the triggered handlers.
- Remove `const` from handleTriggerQuery
- Support ignore diacritics
- Support ignore word order
- Make `Query` contextually convertible to `QString`
- Unify query interface, no more global- and triggerquery
- Add parameterizable `Matcher`/`Match` class
- Add dedicated empty query handling
Empty patterns should match everything. For global queries that's too
much. For triggered queries it is desired though. Since a lot of global
query handlers relay the `handleTriggerQuery` to `handleGlobalQuery` it is
not possible to have both. This introduces a dedicated function for
GlobalQueryHandlers that will be called on empty queries:
### Plugins
- **widgetsboxmodel** - Use QWindow::startSystemMove instead QWidget:move for Wayland Support
- **websearch**
- Add fallback option
- Add GPT to default engines
- Add fallback section.
- Allow inline editing of fallback and trigger withough using the search engine widget.
- Use matcher for more tolerant queries
- Complete to trigger instead of name
- **timezones**
- **timer**
- **telegram** - Archive failed telegram quick access approach
- **path** - Rename from 'terminal'
- **system** - System commands update for KDE Plasma 6
- **ssh** - Allow params only in triggered handler
- **sparkle** - Archive for now
- **snippets** - Check if paste is supported at all
- **qmlboxmodel** - Port
- **python**
- Namespace plugin id
- Compensate the API changes gracefully to defer a breaking API change
- Ship stub file with the plugin
- Add buttons for stubfile and user plugin dir
- API 2.3
- Deprecate obscure module attached md_id. Use PluginInstance.id.
- Expose function albert.havePasteSupport
- Expose class albert.Matcher
- Expose class albert.Match
- Expose method albert.TQH.handleTriggerQuery
- Expose method albert.GQH.handleGlobalQuery
- albert.PluginInstance:
- Add read only property id
- Add read only property name
- Add read only property description
- Add instance method registerExtension(…)
- Add instance method deregisterExtension(…)
- Deprecate initialize(…). Use __init__(…).
- Deprecate finalize(…). Use __del__(…).
- Deprecate __init__ extensions parameter. Use (de)registerExtension(…).
- Auto(de)register plugin extension. (if isinstance(Plugin, Extension))
- albert.Notification:
- Add property title
- Add property text
- Add instance method send()
- Add instance method dismiss()
- Minor breaking change that is probably not even in use:
Notification does not display unless send(…) has been called
- **mpris** - Rewrite using xml interface files
- **exprtk** - Archive exprtk prototype
- **docs**
- Fix XML based docs.
- Do not upscale icons
- Fix leak on plugin unloading
- **dictionary** - Drop resources, use Dictionary.app icon
- **datetime**
- Separate timetzonehandler
- Add "show_date_on_empty_query" option
- **clipboard**
- Check if paste is supported at all
- Use albert::WeakDependency
- **chromium**
- Add completion
- Display bookmark folder
- **bluetooth** New extension on macos
- Enable disable Bluetooth
- Connect to paired devices
- **applications**
- Add non localized option on macos
- Merge applications_macos and applications_xdg
- Add completion
- All python plugins: Minor fixes and port to API 2.3
- **zeal** - Add fallback extension
- **wikipedia** - Add fuzzy search support
- **tr** - Check paste support
- **timer** - Move to archive
- **syncthing** - Initial prototype
- **goldendict** - Support flatpaks and goldendict-ng
- **emoji** - Check paste support
## v0.23.0 (2024-03-03)
### Albert
- i18n
- Make fallback order settable in new query tab.
- Load native plugins threaded.
- Add --no-load cli param
- Use hashmap and avoid exceptions. Twice as fast 🚀
- Add german translation
- Make "Show settings" action the default for plugin items
### API
- Change frontend interface design
- drop extensions() from PluginInstance interface.
Extensions can now bei registered dynamically at any time.
- Reduce the plugin system interfaces to the bare minimum
- Allow hard plugin dependencies.
- Private destructors for interfaces
- Refactoring
- ExtensionRegistry add > registerExtension
- ExtensionRegistry remove > deregisterExtension
- Make UI strings in the metadata required.
- Allow plugins to have public interfaces
- Revert to authors. Drop maintainers. (plugin metadata)
- Remove polymorphism in PluginInstance id/name/description
- Remove dynamic allocation of cache/config/dataDir()
- Drop template parameter QOBJECT
- Frontend is not an extension
- Support localized metadata
- CMake interface
- Drop long_description from metadata
- Add TS_FILES parameter to albert_plugin macro.
- Revert back to json metadata file again
- Complete metadata using cmake project details
- Move Qt::Widgets into the public link interface
### Plugins
- Support i18n
- **qmlboxmodel** archive wip
- **widgetsboxmodel**
- Fix animation on linux
- Dark theme support
- Themes update
- Reproducible style (fusion)
- Fix history search
- Move persistent window position to state
- Clear icon cache on hide
- Archive unlicensed themes
- Remove "Show fallbacks on empty result" option
- Drop fonts from themes
- **websearch:8.0**
- Capital You_T_ube
- Add Google translate default engine
- **ssh:8.0**
- Reduce complexity of this overengineered plugin
- Remove quick connect
- Remove known hosts
- Remove file watchers (configs change not that often)
- remove indexer mutexes
- remove fuzzy index
- **snippets:5.0**
- Public extension interface "Add snippet"
- **qmlboxmodel:3.0**
- Archived
- **python**
- Open external links in config labels by default
- API v2.2
- Drop source watches. a plugin provider cant just reload without notifying the plugin registry
- API 2.2
- PluginInstance.configWidget supports 'label'
- __doc__ is not used anymore, since 0.23 drops long_description metadata
- md_maintainers not used anymore
- md_authors new optional field
- **dictionary:3.0** Former platform_services
- Rename plugin platform services to dict
- **clipboard:3.0**
- use snippets interface
- **applications_macos:5.0**
- Use KVO to track NSQuery results
- **virtualbox:1.6** Add info on vboxapi requirement
- **docker:2.0** Show error on conn failure.
- **pomodoro:1.5** Fix notifications
- **inhibit_sleep:1.0** Similar to caffeine, theine, amphetamine etc…
## v0.22.17 (2023-11-26)
### Albert
- Prepend albert to logging categories, default filter debug
- Remove logging rules cli arguments
Dont work on some systems and there is QT_LOGGING_RULES for it
- Differentiate terminator terminals suffering bug 660
### Plugins
- **mpris:2.0** Ported
## v0.22.16 (2023-11-18)
### Albert
- Remove the visual warning on crashes.
- Remove autostart option
- Add "report" RPC
### Plugins
- **python:2.1.0** - Improve UX while installing dependencies
- **calc:1.4** - Threadsafe and aborting calculations
- **system:1.8** - Dont prompt on gnome session logout
- **app_xdg:1.8** - Use Ubuntu gettext domains
- **bitwarden** - Add copy-username action
## v0.22.15 (2023-11-08)
### Albert
- Fix missing smooth transform in icon provider
- Add style information to report
- Use X-GNOME-Autostart-Delay
- Add proper unix signal handling using self pipe trick
- Revert printing to logfile
- Give enough time to connect to other instance.
### Plugins
- **system:1.8** - Dont prompt on gnome session logout
- **wbm:1.6** - Remove unnecessary cast that may introduce segfaults
- **app_xdg:1.8** - Use Ubuntu gettext domains
- **python** - Fix links in stub
## v0.22.14 (2023-10-06)
Let RPCServer take care of crash reports. This is a hotfix to remove the recurring crash report on start, if the app is run more than once, e.g. because the session manager restores a session including albert, but albert is also configured to be autostarted.
## v0.22.13 (2023-10-05)
### Albert
- Hotfix create missing application paths
- Fix pixmaps path
### Plugins
- **qml** Fix version branching logic
## v0.22.12 (2023-10-03)
### Albert
- CI/CD: Fix path in sed expression
### Plugins
- **sparkle** Add macos updater plugin prototype
- **jetbrains** Add RustRover editor
## v0.22.11 (2023-10-03)
### Albert
- Add missing "-executable=" for macdeployqt plugin parameters
### Plugins
- **py** Hotfix: Workaround https://bugreports.qt.io/browse/QTBUG-117153
## v0.22.10 (2023-10-03)
### Albert
- CI/CD: Appcast prototype
- Store log in cache dir
- Add loadtype NOUNLOAD
There are some plugins that dont like to be unloaded (Sparkle, Python).
Add a mechanism to let plugins prohibit users to unload it at runtime.
### Plugins
- **python** Fix 6.5.2 only QLogCat quirks. Fixes arch builds
## v0.22.9 (2023-09-28)
- CD: upload on tag
- Revert. NO_SONAME makes troubles on other platforms.
## v0.22.8 (2023-09-28)
- Hotfix fixing RPM based builds
## v0.22.7 (2023-09-27)
- Restore 6.2 backward compatibility
## v0.22.6 (2023-09-26)
- Proper tab navigation in handler widget
- NativePluginProvider: Use absolute file paths.
### Plugins
- **files** Fix "rel. dirpaths of depth 1 have dot prepended" issue
- **docs** Fix recent changes to download urls
- **qalc** Fix tab order
## v0.22.5 (2023-09-22)
### Albert
- CMake: On macOS include the macports lookup path
- Fix segfaults on busywait
- Hardcode /usr/local/bin to PATH
- Move last report ts from settings to state
- Add iconlookup in /usr/local/share although not standardized
### Plugins
- **qml** Add hack around lacking DropShadow.samples in Qt <6.4
- **apps_macos**
- Find all apps in home dir
- Keep apps up to date unsing online search
- Localized app names
- Add prefpanes
- **docs** Disable build on macOS. Licensing does not allow usage on macOS.
- **files** Add emtpy trash action on macos
- **muparser** Archive muparser. One calculator is enough.
- **qml** Fix shadow clipping
- **qml** Fix clear on hide breaking history search
- **goldendict** Fix import issue
- **pass** Add OTP feature
## v0.22.4 (2023-08-30)
### Plugins
- **docs**
- Add cache for docset list
- Use find_program to find brew for ootb cmake config
- **muparser** Use find_program to find brew for ootb cmake config
- **python**
- Silently skip dirs and files that are no python modules
- iid v2.1: Add config facilities
- **qalcualte** Use find_program to find brew for ootb cmake config
- **qml** Add Cmd/Ctrl+Enter/Return to show actions
- **snippets** Port old snippets
- **googletrans** Archive. py-googletrans is broken.
- **translators** Add "translators" plugin
- **emoji** Add "Use derived emojis" option
- **dice_roll** iid 2.0
## v0.22.3 (2023-08-17)
### Albert
- Dont show version notification before app is fully initialized
## v0.22.2 (2023-08-14)
### Albert
- Fix logging filters
- Proper database move
### Plugins
- **ws** Fix websearch breaking users search engines config
- **ws** Fix websearch not applying icon when selected from file dialog
## v0.22.1 (2023-08-14)
### Albert
- Freedesktop notification implementation
- Adopt generic Notification interface on macOS
- Fix Linux paste action
### Plugins
- **apps_xdg** Default trigger "apps"
- **python**
- Update notification function
- Fix function warn > warning
- **clipboard** Add paste action
### Python plugins
- **pint,yt** Archived. Require maintenance
- **timer** Adopt notification api changes
## v0.22.0 (2023-08-12)
### Albert
- Add commandline option for logging filter rules
- Add contour terminal
- Add settingswindow shortcut action for plugin settings
- Add feature copy and paste
- Add "Run empty query" option
- Add handler configurations tab
- Sort fallbacks
- LexSort items having equal score
- Doxygen documentation
### API
- `TriggerQueryHandler`
- Add bool `supportsFuzzyMatching()`
- Add bool `fuzzyMatchingEnabled()`
- Add void `setFuzzyMatchingEnabled(bool)`
- Add `QString trigger()` (the user configured one)
- `GlobalQueryHandler`
- Add `applyUsageScore(…)`.
- Inherit `TQH`, i.e. every handler is a `TQH`
- `IndexQueryHandler`
- Reimplement TQH `fuzzy` methods
- Default `synopsis` `<filter>`
- Plugin system
- Revert multithreaded plugin loading (Qt makes problems everywhere)
- Statically inject metadata, use it for PluginInstances
- Move native plugin interface into plugin:: namespace
- Cache/Conf/Data dirs per plugin only (were per Extension)
- Add `PluginInstance::extensions()`
- Add Template based `ExtensionPlugin(Instance)`
- Make native plugin a template class to allow subclassing any `QObject`
- Frontend:
- Add `Frontend::winId`, Move the window quirks to the core
- Use app-wide input history file
- Add generic qml/widgets icon provider to interface
- Add generic icon provider, creating icons on the fly
- Fuctions and macros:
- Put all free functions in `albert.h`
- Add `openUrl` QUrl overload
- Add convenience macros for user property definition
- Require albert logging category to pass the name
- Add state file
- Add global settings factory
- Rename `History` to `InputHistory`
- Drop `QueryHandler` convenience class
- Drop global `albert.h` include
#### Plugins
- **clipboard** - Add paste action
- **wbm**
- Remove option "display icon"
- Appwide input history
- **websearch**
- Adopt to sorted fallbacks, drop dragndrop in listview
- Add drag'n'drop image feature
- **snippets** - Add paste action
- **qml:2.0** - Revamped QML frontend
- **python**
- Mimic internal api as close as possible
- Attach logging functions to plugin modules
- Expose albert::setClipboardTextAndPaste
- Expose albert::Notification
- Interface v2.0 stub
- **files**
- Show filePath instead path in subtext
- Add option for case sentivity of fs browsers.
- Add user property for inline config
- **emoji** - New generic and platform agnostic emoji implementation
- **duckduckgo** - Add extension
- **color** - Add extension
## v0.21.1 (2023-06-27)
### Albert
- Add cmd/ctrl + number tab navigation in settings
- Automatically add hpp and qml files to plugin projects
### Plugins
- **docs:1.2** - Fix misleading comment in config widget
- **tex_to_unicode** Fix crash due to wrong type annotation
- **emoji** Fix #179. Call cacheLocation as method of self.
## v0.21.0 (2023-06-23)
### Albert
- Settings window
- Add a new search widget in settingswindow
- Make handlers of all types optionable
- Make window and search widgets tabs in the settings window
- Change usagedatabase location to datadir
- Change IPC socket path to `$CACHEDIR/albert/ipc_socket`. Was `$CACHEDIR/albert_socket`.
- Fix triggered global query MRU sort
### API
- Remove `Item::hasActions`
- Add global config, cache and data location functions
- Change `RankItem::score` type to float (0,1**
- Make queries pointers in handler functions
- Add function to get global network manager
- Use explicit named query handling methods (no parameter overloading) `handleTriggerQuery` and
`handleGlobalQuery`. This reduces confusion, avoids annoying extra boilerplate to disambiguate
methods to avoid hide-virtual warnings and serves as a lowest common denominator on a
language/naming level since these features may not be supported by script languages (e.g. Python).
### Plugins
- Add
- **docs** Reduced set of Zeal docsets at hands
- **clipboard** Clipboard history
- **coingecko** v1.0
- **mathematica** iid:1.0 port
- **contacts:1.2**
- Formatting: Remove Apple specific braces
- **snip:1.3**
- Add "Add" and "Remove" button in config widget
- Add "Add snippet" item on "add" query
- Add "Remove" action to snippet items
- **python:1.8** Adopt API v0.21. **New interface version iid 1.0**
- Add Extension.cache-, config- and dataLocation
- Expose FallbackHandler
- Proper multi extension registration
- Move interface spec into python stub file (yay!)
- Expose TriggerQueryHandler
- Expose GlobalQueryHandler
- Expose QueryHandler
- Expose IndexQueryHandler
- Expose Item class entirely such that plugins can subclass it
- Use pointer for queries
- Remove global cache/config/data dir functions
- Add stub file for type hinting and documentation in IDEs
## v0.20.14 (2023-05-01)
### Albert
- Sort triggerwidget by name rather than id
- Avoid segfaults when setting hotkey failed.
### Plugins
- **ws** - Fix oversized text in config
- **sys:1.6** - Dynamic default commands.
- **app_xdg** - Remove content margins of settings widget
- **system** - Add lxqt defaults
- **python_eval:1.3** - Fix type of result in item subtext
- **locate:1.7** - Fix lambda capture
- **api_test** - Drop plugin
- **aur:1.6** - Fix install action
- **jetbrains_projects** - handle missing projectOpenTimestamp
## v0.20.13 (2023-03-30)
### Plugins
- **ws** - Show space markers in trigger section
- **vbox:v1.3** - Port iid:0.5
- **dice_roll** - iid:0.5 v1.0
- **emoji** - iid:0.5 v1.0
## v0.20.12 (2023-03-29)
### Plugins
- **system:1.4** Make items checkable and titles customizeable
## v0.20.11 (2023-03-27)
### Albert
- Respect whitespaces in rpcs
### Plugins
- **wbm** Add option "Center on active screen"
- **app_xdg** Add action "reveal desktop entry"
- **files** Workaround Qt appending slash to root paths
- **bitwarden** 1.1 (iid: 0.5)
- **vpn** Add wireguard to connection types
- **pacman** Fix out of scope lambda vars
## v0.20.10 (2023-03-20)
- **vpn** Add wireguard to connection types
## v0.20.9 (2023-03-13)
### Albert
- Update supported terminals (add st and blackbox, remove tilda)
### Plugins
- **wbm** Hide task bar entry
- **ws** Add google scholar to defaults
## v0.20.8 (2023-02-11)
### Albert
- Tilda support
- Print font in report
### Plugins
- **contacts_mac** v1.0
- **wbm** Dont hide window when control modifier is hold
- **xdgapps** Do not inherit QT_QPA_PLATFORM to launched apps
## v0.20.7 (2023-02-10)
### Albert
- Clear icon cache if unused for a minute.
### Plugins
- **wbm** Postpone query deletion until hide event to prevent busy wait for destruction
## v0.20.6 (2023-02-08)
### Albert
- Close settingswindow on ctrl+w
### Plugins
- **wbm** Avoid segfaults on failing screenAt()
- **jetbrains:1.1** Polish. Fix Macos.
## v0.20.5 (2023-02-01)
### Albert
- Drop usage weight. Add option to prioritize perfect matches. See #695
## v0.20.4 (2023-01-31)
### Albert
- Reintroduce telemetry
- Fix disfunctional link in settings
### Plugins
- **tex_to_unicode** py interface 0.5
- **vpn** 1.1 (iid: 0.5)
- **yt** v1.3 create tmp dirs lazily
- **jetbrains** 1.0 (iid:0.5)
## v0.20.3 (2023-01-27)
### Albert
- Remove plugin registry from global search
- Add -Wno-inline
- Fix line breaks in errors displayed in settings
- Tray icon isMask
### Plugins
- **platform_mac** 1.0
- **py** Add button to open the dependency dir
- **pint** 1.0 (currency converter)
## v0.20.2 (2023-01-25)
### Plugins
- **py** Quote cd path
- **pacman** v1.6 iid:0.5
- **timer** v1.4 iid:0.5
## v0.20.1 (2023-01-25)
### Albert
- Fix pedantic warnings
- BW tray
- Use env vars to set default locale
- Strech config widget
- Fix segfaults on empty icon name lookup
### Plugins
- Lots of UI polishing
- **qalc** Fix precision probles
- **websearch** Add google maps to defaults
- **datetime** Use default locale
## v0.20.0 (2023-01-24)
### Albert
- Make Triggerwidget edit trigger on double click anywhere
### API
- Config widget per plugin (v0.20)
### Plugins
- **chromium:1.4** Add path reset button
- **locate** 1.6
- **docker** 1.3
## v0.19.4 (2023-01-22)
### Plugins
- **qalc** v1.0 Prototype
## v0.19.3 (2023-01-22)
### Albert
- **md** Use content if long description is a file path
- Use both, extension and item id, as icon cache key
- Add standard pixmaps support to iconprovider
- Workaround terminator bug #702
### Plugins
- **wbm** Add Nord theme
- **calc** Respect LC_*
- **chromium** Fix filewatcher does not watch bookmarks
- **wbm** Do not exit on missing themes
- **wbm** Use generic placeholder color for input hint
- **app:xdg** Add exec key option. Also exclude 'env' in exec keys.
- **wbm** Fix clipped label
- **WBM** fix open theme file action
- **files** Provide trash item
- **wbm** Fix list view height margins
- **trash** Drop. Provided by files plugin now.
## v0.19.2 (2023-01-18)
### Plugins
- **datetime** v1.0
- **urlhandler** Fix tld validation
## v0.19.1 (2023-01-18)
### Albert
- Fix recurring new version info
- Allow copyconstruction of rank and index items
### Plugins
- **calc** 1.5
- Inline evaluation
- Default trigger '='
- Synopsis
- **wbm** Add item activation using Ctrl+O
## v0.19.0 (2023-01-18)
### Albert
- Add reload actinon for plugins
- Support Console term
- Fix backgroundexecutor not using move semantics
- Refactoring
- Show plugin header files in IDEs
- Use handcrafted icon lookup again
### API
- Revert to dedicated FallbackHandler
- Clean interface using opaque pointers
- GlobalQueryHandler::rankItems -> handlyQuery
- IndexQueryHandlers have to set items directly
### Plugins
- **wbs** 1.3 add query handler providing themes
- **apps_xdg** 1.5 Remove desktop indexing
- **ssh** 1.5
- Fix ssh connect containing user or port
- Allow specifying a command to send to the host
- Add action (keep/close term)
- **yt** v1.2 (iid:0.5)
- **kill** v1.1 (iid:0.5)
## v0.18.13 (2023-01-13)
Fix invalid submodule link breaking OBS builds
### Plugins
- **chromium** Fix config loading
- **goldendict** 1.1 (0.18)
## v0.18.12 (2023-01-13)
### Albert
- Always print report in debug mode
- Add platform, lang and locale to report
- Support Terminology
### Plugins
- **mac_apps** - Dont show system service apps
- **python** - ! Add default md_id if not available
## v0.18.11 (2023-01-11)
### Albert
- Add missing long description in plugin metadata.
- Add metadata LONG_DESCRIPTON to docs
### Plugins
- **urlhandler** - Handcraft tld validation. Make handler global.
- **py** - Create site-packages dir if necessary
- **snippets** - Fix open snippet
## v0.18.10 (2023-01-09)
Fixes, minor changes and requests
## v0.18.9 (2023-01-07)
### Plugins
- **py** Ask user to install missing python dependencies in terminal
- **googletrans** 1.0
- **pass** 1.2
## v0.18.8 (2023-01-07)
### Albert
- Give sensible defaults for usage history
- Fix memory weight not being loaded
- Merge frontend tab into general
- Support foot terminal
- Check for other instances _before_ laoding plugins
### Plugins
- **files** - Avoid starting indexing on file index serialization
- **googletrans** 1.0
- **pass** 1.2
## v0.18.7 (2023-01-05)
Drop albertctl. Back to `albert <command>`
## v0.18.6 (2023-01-05)
### Albert
- sendTrayNotification(…) add time parameter
- Support wezterm.
### Plugins
- **Python** 1.5
- sendTrayNotification(…) add ms parameter
- **Hash** 1.5
- Global query handler
- Add copy 8 char action
- **Pomodoro** 1.1
- **CopyQ** 1.2
## v0.18.5 (2023-01-04)
### Albert
- Support Kitty terminal
- Support Alacritty terminal
### Plugins
- **wbm** Show synopsis in tooltip
## v0.18.4 (2023-01-03)
### Albert
- fix single instance mechanism
### Python plugins
- **docker** - Archive, curious segfaults
- **aur** - Port 0.5
- **awiki** - Port 0.5
## v0.18.3 (2023-01-02)
### Plugins
- **wbm** Fix theme dir paths
## v0.18.2 (2023-01-02)
- Better diagnostics on frontend loading
## v0.18.1 (2023-01-01)
- Fix armhf builds
## v0.18.0 (2022-12-31)
Note that there have been some breaking changes. The new plugin id format changed settings keys and
config/cache/data paths. If you want to keep your old plugin settings you have to adjust the section
names in the config file and adjust the paths in your config/cache/data dirs. (e.g. from
`org.albert.files` to `files`). I'd recommend to start from scratch though, since too much changed.
### Albert
- Shorter plugin ids.
- Customizeable triggers (if the extension permits)
- Central plugin management
- More useful plugin metadata
- User customizable scoring parameters
- Add user option memory decay
- Add user option memory weight
- Finally scoring for _all_ items
- Inputline history goes to a file now
- Settingswidget overhaul
- Hello Qt6, C++20 👋
- Entirely new interface (see header files)
- Value typed Action class based on std::function
- Drop all former *Action classes
- Free functions replace and extend action subclass functionality
- Updates to Item interface
- New and extended query handling interface classes
- Extended frontend interface
- New abstract plugin provider interface
- Common plugin metadata
- Maintainership is a thing now!
- Add StandardItem factory for better type deduction and readability
- Add bgexecutor class
- Add timeprinter
- Leaner logging
- Query design change (realtime, global, indexed)
- Add extension watcher template class
- Move XDG into the lib.
### Plugins
- **python** 1.4 (0.18)
- Use system pybind
- 0.5 interface
- auto pip dependencies
- **files** 1.2 (0.18)
- Drop bashlike completions. We have items.
- Settings per root path
- Add name filter dialog
- Add option watch filesystem
- Add option max depth
- **snippets** 1.1 (0.18)
- files instead database
- **widgetsboxmodel** 1.2 (0.18)
- Fading busy indicating settingsbutton
- Drop rich text
- Proper async query without flicker using statemachines
- Add input hint
- Add option show fallbacks on empty query
- Add option history search
- Archived
- **firefox**
- **qml box model**
- **mpris**
- **vbox**
## v0.17.6 (2022-10-08)
- Let users choose the chromium bookmarks path
- Fix #978
## v0.17.5 (2022-10-05)
Fix #1064.
## v0.17.4 (2022-10-04)
Fix #1117
## v0.17.3 (2022-07-05)
Sloppy hotfix #1088. 0.18 will change DB entirely anyway.
## v0.17.2 (2020-12-24)
Drop telemetry
### Plugins
- **wbm** Fix completion
## v0.17.1 (2020-12-21)
### Albert
- Fix OBS builds
- Several fixes
- Archive virtualbox python extension
## v0.17.0 (2020-12-17)
### Albert
- Again break init order of Item for the sake of less boilerplate. Presumed this frequency indexStrings > actions > completion > urgency.
- Let shells handle splitting/quoting
- Add core as QueryHandler. Add restart, quit, settings action. Also to tray and cli.
- Drop shutil:: and let shells handle lexing
### Plugins
- FINALLY ARCHIVE EXTERNAL EXTENSIONS.
- New extension state : MissingDependencies
- Disable settings items of exts in this new state
- Use pybind v2.6.1
- **term** v1.1 Let shells handle lexing
- **calc** Add muparserInt option for hex calculations
- Use QLoggingCategory in all extensions
- Implicit dependency check for executables and Python modules
- **Pyv1.3** Adopt core changes. PyAPIv0.4. Changes to the API:
- embedded module is called 'albert' now
- Reflect core api changes:
- Positional arguments of the standard item changes
- New semantics of the term action constructors
- String commandline will be executed in a shell
- StringList commandline will be executed without shell
- Add core version of iconLookup(StringList)
- New metadata labels:
- __version__: new versioning scheme iid_maj.iid_min.ext_version
- __title__: former __prettyname__
- __authors__: string or list
- __exec_deps__: string or list
- __py_deps__: string or list
- __triggers__: string or list
- Allow multiple triggers
- Allow multiple authors
- **locate** ' for basename '' for full path lookups
- **timer** Make notification stay.
- **baseconv** Python-style base prefixes to detect source base
- **texdoc** Add texdoc plugin
- **aur** add yay helper
## v0.16.4 (2020-12-10)
### Albert
- Fix tab order
### Plugins
- **chromium** Chromium v1.1
- **docker** New extension prototype
- **timer** Use dbus instead of notify-send
- **units** v1.2 including to time conversion
## v0.16.3 (2020-12-03)
- Hotfix for #955
- Archive defunct CoinMarketCap and Bitfinex extensions
## v0.16.2 (2020-11-26)
### Albert
- Allow multiple instances of albert on different X sessions
- Fix super key not registering
- Add terms: Elementary, Tilix, QTerminal, Termite
- Fix build on FreeBSD
- Dont show fallbacks on triggered queries
### Plugins
- **Applications** Index desktop files on desktop
- **firefox** Rework v2
- **ssh** Respect the Include keyword
- **ssh** Allow hyphens to be part of hostnames
- **chromium** Add brave-browser to list of chromium based browsers.
- New:
- **emoji**
- **bitwarden**
- **xkcd**
- **node.js evaluator**
- **php evaluator**
## v0.16.1 (2018-12-31)
### Albert
- Fix default plugin lookup path
- Fix flicker when changing frontends
- Fix "Terminal option resets after a restart"
- Link libglobalshortcut statically
- Add a build flag for QtCharts
- Drop debug options if favor of QLoggingCategory env vars
### Plugins
- **ssh** Fix input regex. Sort by length then lexically.
- **ssh** Use backward compatible ssh url syntax
- **qml** Consistent form layout
- **aur** Sort items by length first
## v0.16.0 (2018-12-28)
### Albert
- Add jekyll website as submodule
- New project structure (minimal shared lib)
- Let travis build against Ubuntu 18.04 and 16.04
- Backward compatibility for Ubuntu 16.04
- Let fuzzy require an additional character. Tolerance: floor((wordlen - 1)/3))
- Print logging category to stdout QT_LOGGING_RULES="*debug=false;driver.usb.debug=true"
### Plugins
- **Term** Change terminal action order: Let "Run w/o term" be the last one
- **VBox** Set default build switch for VirtualBox to OFF
- **Files** Add fancy icons to mime dialog
- **Py** Use ast to read metadata without loading the modules
- **Py** Additional constraint: Metadata have to be string literals (for ast)
- **Py** Additional constraint: Name modules according PEP8
- **Py/WinSwitch** Add close win action
- **Py/VBox** Add VirtualBox extension
## v0.15.0 (2018-12-16)
Usage graph in the settings (QtCharts (>=5.6))
### Plugins
- **QML**
- Frontend plugin requires ()5.9
- History search of the input now allows substring matching (Type and navigate)
- Store user input of every session
- New Python extension: **Fortune**
- New Python extension: **Window switcher**
## v0.14.22 (2018-09-21)
- Telemetry is now opt-in.
- New themes
- New Python extension: **Pidgin**
## v0.14.21 (2018-06-08)
Bugfixes
## v0.14.20 (2018-06-04)
Bugfixes
## v0.14.19 (2018-05-15)
- New Python extension: **Datetime**. (Time display and conversion. Supersedes the external extension)
- New Python extension: **Bitfinex**. (Quickly access Bitfinex markets)
- The file browse mode finally mimics bash completion behavior.
## v0.14.18 (2018-03-23)
- Hotfix release
## v0.14.17 (2018-03-23)
### Plugins
- **applications**
- New option in applications extension: Use keywords for lookup
- New option in applications extension: Use generic name for lookup
- New Python extension: **Arch Wiki**
- The _kvstore_ extension was renamed to **Snippets** and got an improved config UI.
## v0.14.16 (2018-03-09)
### Plugins
- **Gnome dictionary** (nikhilwanpal)
- **Mathematica** (Asger Hautop Drewsen)
- **TeX to unicode** (Asger Hautop Drewsen)
- **IP address** (Benedict Dudel)
- **Multi Translate** (David Britt)
- **Emoji lookup** (David Britt)
- **Kaomoji lookup** (David Britt)
- **Timer**
- **Binance**
## v0.14.15 (2018-01-26)
### Plugins
- **python** - API PythonInterface/v0.2 (`configLocation()`, `dataLocation()`,`cacheLocation()`).
- New:
- **CoinMarketCap**
- **Trash**
- **Pomodoro**
- **Epoch**
- **Packagist**
## v0.14.14 (2017-12-06)
New Python extension: **npm** (Benedict Dudel)
## v0.14.13 (2017-11-25)
- Rich text support
### Plugins
- New:
- **AUR**
- **scrot**
## v0.14.12 (2017-11-23)
- New **CopyQ** Python extension (Ported from external extension)
## v0.14.11 (2017-11-19)
- New **locate** Python extension
## v0.14.10 (2017-11-16)
Bugfixes
## v0.14.9 (2017-11-16)
- Better HiDPI support
- New commandline option for debug output (-d)
## v0.14.8 (2017-11-14)
### Plugins
- New
- **Gnote** (Ported from external extension)
- **Tomboy** (Ported from external extension)
- **Pacman**
- **Pass**
- **Kill**
## v0.14.7 (2017-11-03)
Bugfixes
## v0.14.6 (2017-10-31)
New **Wikipedia** Python extension
## v0.14.5 (2017-10-30)
Bugfixes
## v0.14.4 (2017-10-25)
New **base converter** Python extension
## v0.14.3 (2017-10-21)
New **Google Translate** Python extension
## v0.14.2 (2017-10-20)
Bugfixes
## v0.14.1 (2017-10-19)
Bugfixes
## v0.14.0 (2017-10-18)
### Plugins
- New
- **Python Embedding**
- **Python Eval**
- **Debugging**
- **Zeal**
- **GoldenDict**
- **Unit Converter**
- **Currency Converter**
## v0.13.1 (2017-00-30)
Bugfixes
## v0.13.0 (2017-09-28)
- Modular frontends
- QML frontend
- Tree structure in file index and "smart" indexing
- Shell like completion for terminal extension
### Plugins
- New: KeyValue
- New: Hash Generator
## v0.12.0 (2017-06-09)
- Git-like ignore files
- Dedicated dialog for websearch editing.
## v0.11.3 (2017-05-28)
Bugfixes
## v0.11.2 (2017-05-13)
- <kbd>Home</kbd> and <kbd>End</kbd> now work for the results list holding <kbd>Ctrl</kbd>.
## v0.11.1 (2017-04-16)
Bugfixes
## v0.11.0 (2017-04-16)
- Fine-grained control of the MIME types to be indexed.
- Extensions can now have multiple triggers.
- The sorting algorithm is now stable.
- Browse mode now lists the results in lexicographical order with directories before the files.
- The use of fallbacks has been disabled for triggered queries.
- Further the websearch extension now contains an URL handler.
- The qss property `selection-color` works as expected now.
## v0.10.4 (2017-04-14)
Bugfixes
## v0.10.3 (2017-04-02)
- Terminal extension does no more show suggestions.
- Any shell querying dropped.
- Bugfixes
## v0.10.2 (2017-03-24)
Bugfixes
## v0.10.1 (2017-03-20)
Bugfixes
## v0.10.0 (2017-03-19)
- Tab completion.
- Hovering over the input box the mouse wheel can now be used to browse the history.
- Spotlight themes (Bright, Dark and Space).
- The terminal extension now provides the shell aliases too.
- File browse mode.
- The application extension allows to ignore the `OnlyShowIn`/`NotShowIn` keys.
- The bash script to clone the template extension is now deprecated and replaced by a Python script.
### Plugins
- New: MPRIS
- New: Secure Shell
## v0.9.5 (2017-03-13)
Bugfixes
## v0.9.4 (2017-03-01)
Bugfixes
## v0.9.3 (2017-02-05)
Bugfixes
## v0.9.2 (2017-01-30)
Bugfixes
## v0.9.1 (2017-01-23)
- Chooseable terminal command of a list of installed terminals.
- The app icon now uses a theme icon
- _Open terminal here_ action.
- Mostly fixes
## v0.9.0 (2017-01-17)
- New extension system architecture
### Plugins
- External extensions
- Firefox
- Improved VirtualBox extension
## v0.8.11 (2016-09-29)
- Plugin abstraction architecture
- New plugin support: Native C++ QPlugins
- New plugin support: Executables
- Single click activation of items
- Action modifiers
- Multithreading
- Core is now responsible for usage counting (obsoletes most serialization)
- Asynchronous query "live" results
- Tray icon
- New option: Show tray icon
- New extension: Debug
## v0.8.10 (2016-06-23)
- New extension: Virtual Box
- Basic IPC
- Graceful termination on SIGHUP
## v0.8.9 (2016-05-12)
- New option: Hide on close
- New option: Display shadow
- Graceful termination on SIGINT
## v0.8.8 (2016-04-28)
- Single instance
## v0.8.7.3 (2016-04-27), v0.8.7.2 (2016-04-03), v0.8.7.1 (2016-03-31)
- Hotfixes
## v0.8.7 (2016-03-31)
- New extension: Terminal
- Project structure: Use libraries
## v0.8.6 (2016-03-28)
- Restructured settings widget
## v0.8.5 (2016-03-25)
- Custom icon lookup
- Make main window movable
- Show alternative actions o Tab
- New option: Always on top
- New option: Hide on focus out
- New option: Display icons
- New option: Display scrollbar
- Dozens of new themes: Dark, Bright, SolarizedDark, SolarizedBright in several colors.
## v0.8.4 (2016-03-15)
- Show message box after ungraceful termination
## v0.8.3 (2016-03-13)
- Restructured settings widget
## v0.8.2 (2016-03-09)
- New option: Group separators for calculator
- New themes: Arc
- New theme: Numix
## v0.8.1 (2016-03-04)
- Minor tasks and improvements
## v0.8.0 (2015-10-27)
- New extension: System control
## v0.7.7 (2015-10-16)
- Bring settings window to front if it is already open.
## v0.7.6 (2015-10-15)
- Reorderable websearches
- Allow exclusive queries by trigger
## v0.7.5 (2015-10-12)
- Graceful termination on SIGINT
## v0.7.1 (2015-10-06), v0.7.2 (2015-10-07), v0.7.3 (2015-10-07), v0.7.4 (2015-10-08)
- Tasks, Hotfixes, minor changes
## v0.7.0 (2015-10-05)
- Implement plugin architecture
- Port the modules
- Ignore file (".albertignore")
- Actions
- Threaded background indexing
- New themes
## v0.6.0 (2014-11-12)
- Make action modifications configurable
- Command history
## v0.5.0 (2014-11-06)
- Add configuration widget to configure the modules
- Make user interface themable
- Provide proof-of-concept themes
- Make actions modifiable
- Show action modifications in the list
- Use CMake build system
## v0.4.0 (2014-10-16)
- Add settings widget
- Implement indexing and search algorithms 'prefixmatch' and 'fuzzy'
## v0.3.0 (2014-09-12)
- Implement serialization of indexes
- New module:
- Applications
- Bookmarks
- Calculator
- Web search
## v0.2.0 (2014-09-08)
- Abstract module architecture
- New module: Files
## v0.1.0 (2014-09-01)
- Basic user interface
- Hotkeymanager
================================================
FILE: CMakeLists.txt
================================================
# SPDX-FileCopyrightText: 2024 Manuel Schneider
cmake_minimum_required(VERSION 3.26) # Required by BUILD_LOCAL_INTERFACE generator expression
# dont touch! set by metatool
set(PROJECT_VERSION 34.0.10)
project(albert
VERSION ${PROJECT_VERSION}
DESCRIPTION "Keyboard launcher"
HOMEPAGE_URL "https://albertlauncher.github.io"
LANGUAGES CXX
)
if(APPLE)
enable_language(OBJCXX) # used by pch
endif()
set(PROJECT_DISPLAY_NAME "Albert")
# Local cmake modules (also CMake uses this in a pretty obscure way, e.g. for the plist)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
# Put the binaries in dedicated toplevel directories
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
### Dependencies ##############################################################
# QNotification
add_subdirectory(lib/QNotification EXCLUDE_FROM_ALL)
# QHotkey
set(QT_DEFAULT_MAJOR_VERSION 6)
set(BUILD_SHARED_LIBS FALSE)
set(QHOTKEY_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory(lib/QHotkey EXCLUDE_FROM_ALL)
target_compile_options(qhotkey
PRIVATE
-Wno-gnu-zero-variadic-macro-arguments
-Wno-unused-parameter
-Wno-shadow
-Wno-elaborated-enum-base
-Wno-deprecated-declarations
-Wno-nullability-completeness
)
# QCoro
find_package(QCoro6 REQUIRED COMPONENTS Coro Core)
qcoro_enable_coroutines()
### Lib ######################################################################
set(TARGET_LIB lib${PROJECT_NAME})
set(LIB_PUBLIC_HEADER
${PROJECT_BINARY_DIR}/include/albert/config.h # generated
${PROJECT_BINARY_DIR}/include/albert/plugin.h # generated
${PROJECT_BINARY_DIR}/include/albert/export.h # generated
include/albert/app.h
include/albert/asyncgeneratorqueryhandler.h
include/albert/extension.h
include/albert/extensionplugin.h
include/albert/fallbackhandler.h
include/albert/frontend.h
include/albert/generatorqueryhandler.h
include/albert/globalqueryhandler.h
include/albert/icon.h
include/albert/item.h
include/albert/plugindependency.h
include/albert/plugininstance.h
include/albert/pluginloader.h
include/albert/pluginmetadata.h
include/albert/pluginprovider.h
include/albert/query.h
include/albert/querycontext.h
include/albert/queryexecution.h
include/albert/queryhandler.h
include/albert/queryresults.h
include/albert/rankedqueryhandler.h
include/albert/rankitem.h
include/albert/telemetryprovider.h
include/albert/urlhandler.h
include/albert/usagescoring.h
# util
include/albert/backgroundexecutor.h
include/albert/download.h
include/albert/indexitem.h
include/albert/indexqueryhandler.h
include/albert/inputhistory.h
include/albert/logging.h
include/albert/matchconfig.h
include/albert/matcher.h
include/albert/messagebox.h
include/albert/networkutil.h
include/albert/notification.h
include/albert/oauth.h
include/albert/oauthconfigwidget.h
include/albert/ratelimiter.h
include/albert/standarditem.h
include/albert/systemutil.h
include/albert/timeit.h
include/albert/widgetsutil.h
)
set(LIB_SRC
src/app/application.cpp
src/app/application.h
src/app/messagehandler.cpp
src/app/messagehandler.h
src/app/pathmanager.cpp
src/app/pathmanager.h
src/app/pluginqueryhandler.cpp
src/app/pluginqueryhandler.h
src/app/qtpluginloader.cpp
src/app/qtpluginloader.h
src/app/qtpluginprovider.cpp
src/app/qtpluginprovider.h
src/app/report.cpp
src/app/report.h
src/app/rpcserver.cpp
src/app/rpcserver.h
src/app/systemtrayicon.cpp
src/app/systemtrayicon.h
src/app/telemetry.cpp
src/app/telemetry.h
src/app/telemetryprovider.cpp
src/app/triggersqueryhandler.cpp
src/app/triggersqueryhandler.h
src/app/urlhandler.cpp
src/common/extension.cpp
src/common/item.cpp
src/common/rankitem.cpp
src/config.h.in
src/frontend/frontend.cpp
src/frontend/session.cpp
src/frontend/session.h
src/icon/composedicon.cpp
src/icon/composedicon.h
src/icon/filetypeicon.cpp
src/icon/filetypeicon.h
src/icon/graphemeicon.cpp
src/icon/graphemeicon.h
src/icon/icon.cpp
src/icon/iconifiedicon.cpp
src/icon/iconifiedicon.h
src/icon/imageicon.cpp
src/icon/imageicon.h
src/icon/qiconicon.cpp
src/icon/qiconicon.h
src/icon/recticon.cpp
src/icon/recticon.h
src/icon/standardicon.cpp
src/icon/standardicon.h
src/icon/themeicon.cpp
src/icon/themeicon.h
src/platform/platform.h
src/platform/signalhandler.h
src/plugin.h.in
src/plugin/extensionregistry.cpp
src/plugin/extensionregistry.h
src/plugin/plugininstance.cpp
src/plugin/pluginloader.cpp
src/plugin/pluginprovider.cpp
src/plugin/pluginregistry.cpp
src/plugin/pluginregistry.h
src/plugin/topologicalsort.hpp
src/query/asyncgeneratorqueryhandler.cpp
src/query/fallbackhandler.cpp
src/query/generatorqueryhandler.cpp
src/query/globalquery.cpp
src/query/globalquery.h
src/query/globalqueryexecution.cpp
src/query/globalqueryexecution.h
src/query/globalqueryhandler.cpp
src/query/query.cpp
src/query/queryengine.cpp
src/query/queryengine.h
src/query/queryexecution.cpp
src/query/queryhandler.cpp
src/query/queryresults.cpp
src/query/rankedqueryhandler.cpp
src/query/usagedatabase.cpp
src/query/usagedatabase.h
src/query/usagescoring.cpp
src/settings/pluginswidget/pluginsmodel.cpp
src/settings/pluginswidget/pluginsmodel.h
src/settings/pluginswidget/pluginssortproxymodel.cpp
src/settings/pluginswidget/pluginssortproxymodel.h
src/settings/pluginswidget/pluginswidget.cpp
src/settings/pluginswidget/pluginswidget.h
src/settings/pluginswidget/pluginwidget.cpp
src/settings/pluginswidget/pluginwidget.h
src/settings/querywidget/fallbacksmodel.cpp
src/settings/querywidget/fallbacksmodel.h
src/settings/querywidget/queryhandlermodel.cpp
src/settings/querywidget/queryhandlermodel.h
src/settings/querywidget/querywidget.cpp
src/settings/querywidget/querywidget.h
src/settings/settingswindow.cpp
src/settings/settingswindow.h
src/util/color.h
src/util/download.cpp
src/util/extensionplugin.cpp
src/util/indexitem.cpp
src/util/indexqueryhandler.cpp
src/util/inputhistory.cpp
src/util/itemindex.cpp
src/util/itemindex.h
src/util/levenshtein.cpp
src/util/levenshtein.h
src/util/matcher.cpp
src/util/messagebox.cpp
src/util/networkutil.cpp
src/util/notification.cpp
src/util/oauth.cpp
src/util/oauthconfigwidget.cpp
src/util/qiconengineadapter.cpp
src/util/qiconengineadapter.h
src/util/querypreprocessing.cpp
src/util/querypreprocessing.h
src/util/ratelimiter.cpp
src/util/standarditem.cpp
src/util/systemutil.cpp
)
if (WIN32)
list(APPEND LIB_SRC
src/platform/win/signalhandler.cpp
)
elseif (APPLE)
list(APPEND LIB_SRC
src/platform/unix/signalhandler.cpp
src/platform/mac/platform.mm
)
elseif(UNIX) # assume xdg
list(APPEND LIB_PUBLIC_HEADER
include/albert/desktopentryparser.h
)
list(APPEND LIB_SRC
src/platform/unix/signalhandler.cpp
src/platform/xdg/iconlookup.cpp
src/platform/xdg/iconlookup.h
src/platform/xdg/platform.cpp
src/platform/xdg/desktopentryparser.cpp
src/platform/xdg/themefileparser.cpp
src/platform/xdg/themefileparser.h
)
endif()
set(LIB_UI
src/settings/querywidget/querywidget.ui
src/settings/settingswindow.ui
)
add_library(${TARGET_LIB} SHARED
${LIB_PUBLIC_HEADER}
${LIB_SRC}
${LIB_UI}
resources/resources.qrc
)
add_library("${PROJECT_NAME}::${TARGET_LIB}" ALIAS ${TARGET_LIB})
include(GNUInstallDirs)
include(GenerateExportHeader)
generate_export_header(${TARGET_LIB}
BASE_NAME ${PROJECT_NAME}
EXPORT_FILE_NAME "${PROJECT_BINARY_DIR}/include/albert/export.h"
)
# target_precompile_headers(${TARGET_LIB} PRIVATE ${LIB_PUBLIC_HEADER})
target_include_directories(${TARGET_LIB}
PUBLIC
"$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>"
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>"
PRIVATE
"${PROJECT_BINARY_DIR}/include/${PROJECT_NAME}"
"${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME}"
src
src/app
src/common
src/frontend
src/handlers
src/platform
src/platform/mac
src/platform/unix
src/platform/xdg
src/plugin
src/query
src/settings
src/settings/pluginswidget
src/settings/querywidget
src/util
)
configure_file(
"${PROJECT_SOURCE_DIR}/src/config.h.in"
"${PROJECT_BINARY_DIR}/include/albert/config.h"
@ONLY
)
configure_file(
"${PROJECT_SOURCE_DIR}/src/plugin.h.in"
"${PROJECT_BINARY_DIR}/include/albert/plugin.h"
@ONLY
)
find_package(Qt6 6.4 REQUIRED COMPONENTS # QString::operator""_s
Core
Concurrent
Network
Sql
Svg
Widgets
LinguistTools
)
target_link_libraries(${TARGET_LIB}
PRIVATE
$<BUILD_LOCAL_INTERFACE:QHotkey::QHotkey>
$<BUILD_LOCAL_INTERFACE:QNotifications::QNotifications>
QCoro6::Coro
Qt6::Concurrent
Qt6::Core
Qt6::Network
Qt6::Sql
Qt6::Widgets
)
if(APPLE)
target_link_libraries(${TARGET_LIB} PRIVATE objc "-framework Cocoa")
target_compile_options(${TARGET_LIB} PRIVATE "-fobjc-arc")
set_source_files_properties(src/platform/mac/platform.mm PROPERTIES COMPILE_FLAGS "-fobjc-arc")
elseif(UNIX)
if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
target_compile_definitions(${TARGET_LIB}
PRIVATE -DMULTIARCH_TUPLE="${CMAKE_LIBRARY_ARCHITECTURE}"
)
endif()
endif()
target_compile_features(${TARGET_LIB} PUBLIC cxx_std_23)
set_target_properties(${TARGET_LIB} PROPERTIES
#INSTALL_RPATH "$ORIGIN"
CXX_STANDARD 23
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
CXX_VISIBILITY_PRESET hidden
FRAMEWORK TRUE
FRAMEWORK_VERSION A
MACOSX_FRAMEWORK_BUNDLE_VERSION "${PROJECT_VERSION}"
MACOSX_FRAMEWORK_IDENTIFIER "org.albertlauncher.albert.interface"
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PROJECT_VERSION}
OUTPUT_NAME "${PROJECT_NAME}"
PUBLIC_HEADER "${LIB_PUBLIC_HEADER}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" # also mach-o compat version
# NO_SONAME true # do _not_ add. linkers other that ldd will make troubles using non relative paths
VERSION ${PROJECT_VERSION}
VISIBILITY_INLINES_HIDDEN 1
AUTOMOC ON
AUTOUIC ON
AUTORCC ON
)
target_compile_options(${TARGET_LIB}
PUBLIC
#-Werror
-Wall
-Wextra
-Wpedantic
# warnings that should be errors
-Werror=return-type # silently buils but crashes at runtime
-Werror=float-conversion # Implicit cast may loose precision (e.g. match scores)
-Wno-deprecated-enum-enum-conversion # bitwise operation between different enumeration types used by drawText
-Wno-attributes # mute visibility warnings
# -Wconversion
# -Weffc++
-Winline
-Wmissing-field-initializers
-Wshadow
-Wstrict-aliasing
-Winvalid-pch
# Use this from time to time
# -Weverything
# -Wdocumentation
# -Wno-c++98-compat
# -Wno-c++20-compat
# -Wno-c++98-compat-pedantic
# ??
# -Wl,-undefined
)
### Internationalization
file(GLOB TS_FILES i18n/*.ts)
# Source files to be translated (separate because some files may be masked)
file(GLOB_RECURSE TRANSLATION_SOURCE_FILES
include/.h
src/*.h
src/*.ui
src/*.mm
src/*.cpp
)
if(Qt6_VERSION VERSION_GREATER_EQUAL "6.7.0")
message(STATUS "Using new qt_add_translations")
qt_add_translations(
${TARGET_LIB}
TS_FILES ${TS_FILES}
SOURCES ${TRANSLATION_SOURCE_FILES}
LUPDATE_OPTIONS
#-no-obsolete
-locations none
IMMEDIATE_CALL
)
else()
message(STATUS "Using old qt_add_translations")
qt_add_translations(
${TARGET_LIB}
TS_FILES ${TS_FILES}
SOURCES ${TRANSLATION_SOURCE_FILES}
LUPDATE_OPTIONS
# -no-obsolete
-locations none
)
endif()
# For convenience, QtCreator does not show the umbrella target
add_custom_target(global_lupdate DEPENDS update_translations)
### Export/Install
include(CMakePackageConfigHelpers)
set(LIB_EXPORT_NAME "${PROJECT_NAME}-targets")
set(LIB_TARGETS_FILE "${LIB_EXPORT_NAME}.cmake")
set(LIB_CONFIG_FILE "${PROJECT_NAME}-config.cmake")
set(LIB_VERSION_FILE "${PROJECT_NAME}-config-version.cmake")
set(LIB_MACROS_FILE "${PROJECT_NAME}-macros.cmake")
set(LIB_FIND_ALBERT_FILE "FindAlbert.cmake")
set(LIB_CMAKE_MODULE_DIR "${PROJECT_SOURCE_DIR}/cmake")
set(INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/Albert")
# Install the target
# https://cmake.org/cmake/help/latest/command/install.html#targets
install(
TARGETS ${TARGET_LIB}
EXPORT ${LIB_EXPORT_NAME} # association for install(EXPORT …) and export(EXPORT …)
FRAMEWORK DESTINATION .
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
)
# Create a targets file in install tree
# https://cmake.org/cmake/help/latest/command/install.html#export
# By default the generated file will be called <export-name>.cmake
install(
EXPORT ${LIB_EXPORT_NAME} # association from above
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${INSTALL_CONFIGDIR}
)
# Create a targets file in build tree (matching install(EXPORT))
# https://cmake.org/cmake/help/latest/command/export.html#exporting-targets-matching-install-export
# Seems like a shorthand for export(TARGETS)
export(
EXPORT ${LIB_EXPORT_NAME} # association from above
NAMESPACE ${PROJECT_NAME}::
FILE "${PROJECT_BINARY_DIR}/${LIB_TARGETS_FILE}"
)
include(CMakePackageConfigHelpers)
# Create version file in build tree
write_basic_package_version_file(
"${PROJECT_BINARY_DIR}/${LIB_VERSION_FILE}"
VERSION "${PROJECT_VERSION}"
COMPATIBILITY AnyNewerVersion
)
# Create config file in build tree
configure_package_config_file(
"${LIB_CMAKE_MODULE_DIR}/${LIB_CONFIG_FILE}.in"
"${PROJECT_BINARY_DIR}/${LIB_CONFIG_FILE}"
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)
# Copy the macros to the build directory
configure_file(
"${LIB_CMAKE_MODULE_DIR}/${LIB_MACROS_FILE}"
"${PROJECT_BINARY_DIR}/${LIB_MACROS_FILE}"
COPYONLY
)
# Copy the dummy FindAlbert to the build directory
configure_file(
"${LIB_CMAKE_MODULE_DIR}/${LIB_FIND_ALBERT_FILE}.in"
"${PROJECT_BINARY_DIR}/${LIB_FIND_ALBERT_FILE}"
@ONLY
)
install(FILES
"${PROJECT_BINARY_DIR}/${LIB_CONFIG_FILE}"
"${PROJECT_BINARY_DIR}/${LIB_VERSION_FILE}"
"${PROJECT_BINARY_DIR}/${LIB_MACROS_FILE}"
DESTINATION ${INSTALL_CONFIGDIR}
)
### App ######################################################################
set(TARGET_APP ${CMAKE_PROJECT_NAME})
add_executable(${TARGET_APP} MACOSX_BUNDLE "src/main.cpp")
if (APPLE)
set(ICON_NAME "albert")
set(ICON_PATH "dist/macos/${ICON_NAME}.icns")
target_sources(${TARGET_APP} PRIVATE ${ICON_PATH})
set_source_files_properties(${ICON_PATH} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
set_target_properties(${TARGET_APP} PROPERTIES
BUNDLE True
OUTPUT_NAME "${PROJECT_DISPLAY_NAME}${DEV_BUNDLE_SUFFIX}"
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_DISPLAY_NAME}" # "${PROJECT_NAME}"
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION}"
MACOSX_BUNDLE_COPYRIGHT "Copyright (c) 2024 Manuel Schneider"
MACOSX_BUNDLE_GUI_IDENTIFIER "org.albertlauncher.albert${DEV_BUNDLE_ID_SUFFIX}"
MACOSX_BUNDLE_ICON_FILE "${ICON_NAME}"
MACOSX_BUNDLE_INFO_STRING "Albert keyboard launcher"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${CMAKE_PROJECT_VERSION}"
)
# Avoid regranting permissions all the time
option(BUILD_DEV_BUNDLE "Build a separate dev bundle (saves some headaches on permissions)" OFF)
if (BUILD_DEV_BUNDLE)
set(DEV_BUNDLE_SUFFIX "Dev")
set(DEV_BUNDLE_ID_SUFFIX ".dev")
set(CODESIGN_IDENTITY "Albert Dev Code Signing")
add_custom_command(
TARGET ${TARGET_APP} POST_BUILD
COMMAND codesign --force --deep --sign "${CODESIGN_IDENTITY}" "$<TARGET_BUNDLE_DIR:${TARGET_APP}>"
)
endif()
elseif (UNIX)
install(FILES dist/xdg/albert.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES resources/albert.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps)
install(FILES resources/albert-tray.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps)
endif()
target_link_libraries(${TARGET_APP} PRIVATE ${TARGET_LIB})
#INSTALL_RPATH_USE_LINK_PATH TRUE
#INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}"
#BUILD_WITH_INSTALL_RPATH FALSE
#INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/albert/" # Set the RPATH for the library lookup
#INSTALL_RPATH "$ORIGIN/../Frameworks/albert/" # Set the RPATH for the library lookup
install(
TARGETS ${TARGET_APP}
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
### Plugins ###################################################################
# Since the cmake module path of this project contains a dummy FindAlbert.cmake
# CMake uses this one instead of searching systemwide.
list(APPEND CMAKE_MODULE_PATH "${PROJECT_BINARY_DIR}")
# # on macOS include the macports lookup path
# if (APPLE)
# list(APPEND CMAKE_PREFIX_PATH "/opt/local")
# message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
# endif()
#2024: Drop ports use brew only
# if (APPLE)
# list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew")
# message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
# endif()
option(BUILD_PLUGINS "Build plugins" ON)
set(PLUGINS_DIR "${CMAKE_CURRENT_LIST_DIR}/plugins")
if (BUILD_PLUGINS)
file(GLOB ENTRIES RELATIVE "${PLUGINS_DIR}" plugins/*)
list(FILTER ENTRIES EXCLUDE REGEX "^\\..+")
foreach(ENTRY ${ENTRIES})
if(IS_DIRECTORY "${PLUGINS_DIR}/${ENTRY}")
string(TOUPPER ${ENTRY} UPPER)
option(BUILD_PLUGIN_${UPPER} "Build plugin ${ENTRY}" ON)
if (BUILD_PLUGIN_${UPPER})
add_subdirectory("${PLUGINS_DIR}/${ENTRY}")
endif()
endif()
endforeach()
endif()
### Test ######################################################################
option(BUILD_TESTS "Build tests (Requires QTest)" OFF)
if (BUILD_TESTS)
include(CTest)
find_package(Qt6 REQUIRED COMPONENTS Test)
get_target_property(SRC_TST ${TARGET_LIB} SOURCES)
get_target_property(INC_TST ${TARGET_LIB} INCLUDE_DIRECTORIES)
get_target_property(LIBS_TST ${TARGET_LIB} LINK_LIBRARIES)
get_target_property(CXX_STD_TST ${TARGET_LIB} CXX_STANDARD)
set(TARGET_TST ${CMAKE_PROJECT_NAME}_test)
add_executable(${TARGET_TST} ${SRC_TST} test/test.h test/test.cpp)
target_include_directories(${TARGET_TST} PRIVATE ${INC_TST} test)
target_link_libraries(${TARGET_TST} PRIVATE ${LIBS_TST} Qt6::Test)
set_target_properties(${TARGET_TST} PROPERTIES
CXX_STANDARD ${CXX_STD_TST}
AUTOMOC ON
AUTOUIC ON
AUTORCC ON
)
add_test(NAME ${TARGET_TST} COMMAND ${TARGET_TST})
endif()
### Packaging #################################################################
if (APPLE)
set(CPACK_GENERATOR "DragNDrop")
set(CPACK_PACKAGE_CHECKSUM "SHA256")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "${PROJECT_DISPLAY_NAME} executable")
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_DISPLAY_NAME}-v${PROJECT_VERSION}")
set(CPACK_PACKAGE_NAME "${PROJECT_DISPLAY_NAME}")
#set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/${ICON_PATH}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}")
set(CPACK_PACKAGE_VENDOR "manuelschneid3r")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.md")
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_WELCOME "${PROJECT_SOURCE_DIR}/README.md")
set(CPACK_STRIP_FILES TRUE)
set(CPACK_MONOLITHIC_INSTALL TRUE)
configure_file("cmake/bundle-macos.cmake.in" "${PROJECT_BINARY_DIR}/bundle-macos.cmake" @ONLY)
install(SCRIPT "${PROJECT_BINARY_DIR}/bundle-macos.cmake")
include(CPack)
endif()
================================================
FILE: LICENSE.md
================================================
Copyright 2021 Manuel Schneider
Albert license v1.1
Personal use in source and binary forms, with or without modification, and
redistribution in source and binary forms without modification
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must not target Microsoft or Apple platforms, reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Informal note:
This is basically a BSD-2-Clause without the permission for redistribution of modifications and an explicit exclusion of Microsoft or Apple platforms.
I am not a lawyer and it is hard to properly regulate redistribution of modifications so I simply do not permit it.
However, if you just want to help with e.g. a public pull request, I will turn a blind eye.
================================================
FILE: README.md
================================================
# Albert launcher
[](https://github.com/albertlauncher/albert/tags)
[](https://github.com/albertlauncher/albert/actions/workflows/ci.yml)
[](https://build.opensuse.org/package/show/home:manuelschneid3r/albert)
[](https://telegram.me/albert_launcher_community)
[](https://discord.gg/t8G2EkvRZh)
Albert is a plugin-based, desktop-agnostic C++/Qt keyboard launcher.
Visit the [*website*](https://albertlauncher.github.io/) for more information.
Enjoy using Albert! If you find it helpful, feel free to [tip me](https://albertlauncher.github.io/donation/).
================================================
FILE: cmake/FindAlbert.cmake.in
================================================
# FindAlbert dummy package
# This file serves the purpose to allow plugins to use find_package even if
# they are part of the same project as Albert. This is useful for convenient
# development such that the project itsself includes all upstream plugins
# while still allowing the plugins to be build as separate projects.
include("${CMAKE_CURRENT_LIST_DIR}/@LIB_MACROS_FILE@")
================================================
FILE: cmake/MacOSXBundleInfo.plist.in
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundleExecutable</key> <!-- Do not put in one line or else cmakes heuristics fail -->
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
<key>CFBundleGetInfoString</key>
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
<key>CFBundleIconFile</key>
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
<key>CFBundleIdentifier</key>
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
<key>CFBundleLongVersionString</key>
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
<key>CFBundleName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>NSHumanReadableCopyright</key>
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
<!--<key>CFBundleDevelopmentRegion</key><string>English</string>-->
<key>CFBundleAllowMixedLocalizations</key><true/>
<key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
<key>CFBundlePackageType</key><string>APPL</string>
<key>LSUIElement</key><true/>
<key>LSRequiresNativeExecution</key><true/>
<key>NSHighResolutionCapable</key><string>True</string>
<!--https://stackoverflow.com/questions/17893849/qml-causing-switch-to-discrete-graphics-->
<key>NSSupportsAutomaticGraphicsSwitching</key><true/>
<key>NSContactsUsageDescription</key><string>Contacts plugin access.</string>
<key>NSBluetoothAlwaysUsageDescription</key><string>Bluetooth plugin access.</string>
<key>NSDesktopFolderUsageDescription</key><string>Files plugin access.</string>
<key>NSDocumentsFolderUsageDescription</key><string>Files plugin access.</string>
<key>NSDownloadsFolderUsageDescription</key><string>Files plugin access.</string>
<key>NSNetworkVolumesUsageDescription</key><string>Files plugin access.</string>
<key>NSRemovableVolumesUsageDescription</key><string>Files plugin access.</string>
<key>NSLocationUsageDescription</key><string>Required to access WLAN names.</string>
<key>NSAppleEventsUsageDescription</key><string>Applescript support.</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array><string>${PROJECT_NAME}</string></array>
</dict>
</array>
</dict>
</plist>
================================================
FILE: cmake/MacOSXFrameworkInfo.plist.in
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!--<key>CFBundleDevelopmentRegion</key>
<string>English</string>-->
<key>CFBundleExecutable</key>
<string>${MACOSX_FRAMEWORK_NAME}</string>
<key>CFBundleIconFile</key>
<string>${MACOSX_FRAMEWORK_ICON_FILE}</string>
<key>CFBundleIdentifier</key>
<string>${MACOSX_FRAMEWORK_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${MACOSX_FRAMEWORK_BUNDLE_VERSION}</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_FRAMEWORK_SHORT_VERSION_STRING}</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
</plist>
================================================
FILE: cmake/albert-config.cmake.in
================================================
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@LIB_TARGETS_FILE@")
include("${CMAKE_CURRENT_LIST_DIR}/@LIB_MACROS_FILE@")
================================================
FILE: cmake/albert-macros.cmake
================================================
# - Albert cmake macros
#
# Use albert_plugin() to add a plugin.
#
# albert_plugin(
# [SOURCES ...]
# [I18N_SOURCES ...]
# [INCLUDE ...]
# [LINK ...]
# [QT ...]
# )
#
# Create a plugin target with the given name.
#
# Expects a metadata.json file in the source directory. Supported metadata keys are:
#
# | Parameter | Type | Notes |
# |---------------------:|:------------:|---------------------------------------------------------------------------|
# | id | Reserved | PROJECT_NAME added by CMake. |
# | version | Reserved | PROJECT_VERSION added by CMake. |
# | translations | Reserved | Added by CMake. |
# | name | local string | Human readable name. |
# | description | local string | Brief, imperative description, e.g. "Open files". |
# | license | string | SPDX license identifier. E.g. BSD-2-Clause, MIT, LGPL-3.0-only, … |
# | url | string | Browsable online source code |
# | readme_url | string | Online README |
# | authors | string list | List of copyright holders. Preferably using mentionable GitHub usernames. |
# | maintainers | string list | List of maintainers. Preferably using mentionable GitHub usernames. |
# | runtime_dependencies | string list | Default: `[]`. Required libraries. |
# | binary_dependencies | string list | Default: `[]`. Required executables. |
# | plugin_dependencies | string list | Default: `[]`. Required plugins. |
# | credits | string list | Default: `[]`. Attributions, mentions, third party library licenses, … |
# | loadtype | string | Default: `user`. `frontend` or `user`. |
#
# Note: Local string types can be used to localize the metadata. (e.g. "name[de]": "Anwendungen")
#
# Translations files in a directory named 'i18n' are added automatically.
# The filenames must have the pattern <plugin_id>_<language_code>.ts.
# <plugin_id>.ts is the native plurals file.
#
# SOURCES
# List source files.
# Supports (nonrecursive) globbing patterns.
# If unspecified the default is a recursive globbing pattern for:
# include/*.h, src/*.h, src/*.cpp, src/*.mm, src/*.ui and <plugin_id>.qrc
#
# I18N_SOURCES
# List translation source files.
# Supports (nonrecursive) globbing patterns.
# Use if some of the source files are disabled on certain platforms.
# If unspecified defaults to the target sources.
#
# INCLUDE
# List directories to include.
# Shorthand for CMake target_include_directories(plugin_target …
#
# LINK
# List of libraries to link.
# Shorthand for CMake target_link_libraries(plugin_target …
#
# QT
# List of Qt components to link.
# Finds and links the given Qt components.
#
cmake_minimum_required(VERSION 3.19) # string(JSON…
macro(albert_plugin_link_qt)
set(options REQUIRED)
set(one_value_args VERSION)
set(multi_value_args QT)
cmake_parse_arguments(ARG_QT "${options}" "${one_value_args}" "${multi_value_args}" ${ARGV})
set(_qt_find_args COMPONENTS ${ARG_QT_UNPARSED_ARGUMENTS})
if(ARG_QT_REQUIRED)
list(APPEND _qt_find_args REQUIRED)
endif()
if(ARG_QT_VERSION)
list(PREPEND _qt_find_args ${ARG_QT_VERSION})
endif()
find_package(Qt6 ${_qt_find_args})
foreach(MODULE IN LISTS ARG_QT_UNPARSED_ARGUMENTS)
target_link_libraries(${PROJECT_NAME} PRIVATE "Qt6::${MODULE}")
endforeach()
endmacro()
#
# albert_plugin_add_dbus_interface(<xml_interface_spec>)
#
# Adds a DBus interface to the plugin from an XML interface specification.
#
# The the DBUS_SRCS are generated in the PROJECT_BINARY_DIR.
#
macro(albert_plugin_dbus_interface)
set(options)
set(one_value_args XML INCLUDE)
set(multi_value_args)
cmake_parse_arguments(ARG_DBUS "${options}" "${one_value_args}" "${multi_value_args}" ${ARGV})
get_filename_component(ARG_DBUS_XML_BASENAME ${ARG_DBUS_XML} NAME_WE)
set_source_files_properties(${ARG_DBUS_XML} PROPERTIES NO_NAMESPACE ON)
if(ARG_DBUS_INCLUDE)
set_source_files_properties(${ARG_DBUS_XML} PROPERTIES INCLUDE ${ARG_DBUS_INCLUDE})
endif()
qt_add_dbus_interface(DBUS_SRCS ${ARG_DBUS_XML} ${ARG_DBUS_XML_BASENAME})
target_sources(${PROJECT_NAME} PRIVATE
${ARG_DBUS_XML}
${DBUS_SRCS}
)
endmacro()
macro(albert_plugin_sources)
file(GLOB SOURCES ${ARGV})
target_sources(${PROJECT_NAME} PRIVATE ${SOURCES})
endmacro()
macro(albert_plugin_link)
target_link_libraries(${PROJECT_NAME} ${ARGV})
endmacro()
macro(albert_plugin_include_directories)
target_include_directories(${PROJECT_NAME} ${ARGV})
endmacro()
macro(albert_plugin_compile_options)
target_compile_options(${PROJECT_NAME} ${ARGV})
endmacro()
macro(albert_plugin_i18n)
find_package(Qt6 6.0 REQUIRED COMPONENTS
Core # required by LinguistTools
LinguistTools
)
# TODO ubuntu 26.04
# qt_add_translations improves greatly with 6.7/6.8
# for now plural files are full translation files with empty singulars
# sure one could build custom targets and such but since this already
# implemented in recent qt versions it's not worth the effort
file(GLOB TS_FILES "i18n/${PROJECT_NAME}*.ts")
if (NOT ARG_I18N_SOURCES)
get_target_property(ARG_I18N_SOURCES ${PROJECT_NAME} SOURCES)
else()
file(GLOB ARG_I18N_SOURCES ${ARG_I18N_SOURCES})
endif()
if (TS_FILES)
qt_add_translations(
${PROJECT_NAME}
TS_FILES ${TS_FILES}
SOURCES ${ARG_I18N_SOURCES}
LUPDATE_OPTIONS
# -no-obsolete
-locations none
# QM_FILES_OUTPUT_VARIABLE QM_FILES
)
endif()
# install(FILES ${QM_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/albert/i18n")
# Prepare a list of translations for the metadata
foreach(TS_FILE ${TS_FILES})
get_filename_component(BASENAME ${TS_FILE} NAME_WLE)
if (NOT ${BASENAME} STREQUAL ${PROJECT_NAME})
execute_process(
COMMAND xmllint --xpath "count(//translation[not(@type='unfinished')])" ${TS_FILE}
OUTPUT_VARIABLE FINISHED_COUNT
COMMAND_ERROR_IS_FATAL ANY
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND xmllint --xpath "count(//translation)" ${TS_FILE}
OUTPUT_VARIABLE TOTAL_COUNT
COMMAND_ERROR_IS_FATAL ANY
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(REPLACE "${PROJECT_NAME}_" "" LANGUAGE_CODE ${BASENAME})
list(APPEND TRANSLATIONS "${LANGUAGE_CODE} (${FINISHED_COUNT}/${TOTAL_COUNT})")
endif()
endforeach()
endmacro()
macro(albert_plugin_generate_metadata)
if (NOT DEFINED PROJECT_VERSION)
message(FATAL_ERROR "Plugin version is undefined")
endif()
file(READ "${PROJECT_SOURCE_DIR}/metadata.json" MD)
string(JSON MD SET ${MD} "id" "\"${PROJECT_NAME}\"")
string(JSON MD SET ${MD} "version" "\"${PROJECT_VERSION}\"")
if (TRANSLATIONS)
list(JOIN TRANSLATIONS "\", \"" TRANSLATIONS_CSV)
string(JSON MD SET ${MD} "translations" "[\"${TRANSLATIONS_CSV}\"]")
endif()
# get_target_property(LIB_DEPENDENCIES ${PROJECT_NAME} LINK_LIBRARIES)
# if (DEFINED LIB_DEPENDENCIES)
# list(JOIN LIB_DEPENDENCIES "\", \"" LIB_DEPENDENCIES_CSV)
# string(JSON MD SET ${MD} "lib_deps" "[\"${LIB_DEPENDENCIES_CSV}\"]")
# endif()
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/metadata.json" "${MD}")
target_sources(${PROJECT_NAME} PRIVATE
"${PROJECT_SOURCE_DIR}/metadata.json"
"${PROJECT_BINARY_DIR}/metadata.json"
)
endmacro()
# This macro creates a plugin target with the given name.
macro(albert_plugin)
set(arg_bool )
set(arg_vals )
set(arg_list SOURCES I18N_SOURCES INCLUDE LINK QT)
cmake_parse_arguments(ARG "${arg_bool}" "${arg_vals}" "${arg_list}" ${ARGV})
if (NOT DEFINED ARG_SOURCES)
file(GLOB_RECURSE ARG_SOURCES
src/*.h
src/*.hpp
src/*.cpp
src/*.mm
src/*.ui
include/*.h
${PROJECT_NAME}.qrc
)
else()
file(GLOB ARG_SOURCES ${ARG_SOURCES})
endif()
add_library(${PROJECT_NAME} SHARED ${ARG_SOURCES})
add_library(albert::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
PREFIX "" # no libfoo
AUTOMOC ON
AUTOUIC ON
AUTORCC ON
)
target_compile_definitions(${PROJECT_NAME} PRIVATE QT_NO_CAST_FROM_ASCII)
# Append. There are defaults.
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY AUTOMOC_MACRO_NAMES "ALBERT_PLUGIN")
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_BINARY_DIR})
albert_plugin_sources(README.md) # if readme exists add to sources
if (DEFINED ARG_INCLUDE)
albert_plugin_include_directories(${ARG_INCLUDE})
endif()
if (DEFINED ARG_LINK)
albert_plugin_link(${ARG_LINK})
endif()
albert_plugin_link(PRIVATE albert::libalbert)
if (DEFINED ARG_QT)
albert_plugin_link_qt(${ARG_QT})
endif()
install(
TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/albert
)
# after add_target, uses SOURCES
# before metadata, defines TRANSLATIONS
albert_plugin_i18n()
albert_plugin_generate_metadata()
endmacro()
================================================
FILE: cmake/bundle-macos.cmake.in
================================================
set(PROJECT_NAME "@PROJECT_NAME@") # bundle path
set(CMAKE_PREFIX_PATH "@CMAKE_PREFIX_PATH@") # library lookup
set(CMAKE_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@") # library paths
set(CMAKE_INSTALL_DATADIR "@CMAKE_INSTALL_DATADIR@")
set(CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@") # qml lib lookup dir for macdeployqt
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
set(BUNDLE_PATH "${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app")
# PRINT CMAKE ENV
message(STATUS "--- ENV ---")
get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "--- ENV END ---")
# MOVE FILES INTO BUNDLE
## Library
file(MAKE_DIRECTORY "${BUNDLE_PATH}/Contents/Frameworks")
file(RENAME
"${CMAKE_INSTALL_PREFIX}/albert.framework"
"${BUNDLE_PATH}/Contents/Frameworks/albert.framework"
)
## Plugins
file(MAKE_DIRECTORY "${BUNDLE_PATH}/Contents/PlugIns")
file(RENAME
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/albert
${BUNDLE_PATH}/Contents/PlugIns/albert
)
## Resources
set(RES_SRC ${CMAKE_INSTALL_PREFIX}/share/albert)
file(GLOB children RELATIVE ${RES_SRC} ${RES_SRC}/*)
foreach(child ${children})
file(RENAME
${RES_SRC}/${child}
${BUNDLE_PATH}/Contents/Resources/${child}
)
endforeach()
file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}")
# ADD RPATHS TO EXECUTABLE
execute_process(
COMMAND install_name_tool
-add_rpath "@executable_path/../Frameworks/" # in bundle
-add_rpath "/opt/local/lib/" # RPATH macports
-add_rpath "/opt/homebrew/lib/" # RPATH homebrew arm
-add_rpath "/usr/local/lib/" # RPATH homebrew intel
"${BUNDLE_PATH}/Contents/MacOS/${PROJECT_NAME}"
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)
# DEPLOY (APPROACH #1, use qt_deploy_runtime_dependencies)
# set(QT_DEPLOY_SUPPORT "@QT_DEPLOY_SUPPORT@")
# message(STATUS "QT_DEPLOY_SUPPORT ${QT_DEPLOY_SUPPORT}")
# include("${QT_DEPLOY_SUPPORT}")
# ## Get a list of plugin files
# # file(GLOB PLUGINS "${BUNDLE_PATH}/Contents/MacOS/plugins/*")
# # message(STATUS PLUGINS: ${PLUGINS})
# qt_deploy_runtime_dependencies(
# EXECUTABLE ${BUNDLE_PATH}
# # ADDITIONAL_EXECUTABLES ${PLUGINS}
# GENERATE_QT_CONF
# VERBOSE
# )
# DEPLOY (APPROACH #2, call macdeployqt)
# find_program(MACDEPLOYQT NAMES macdeployqt macdeployqt REQUIRED)
# get_filename_component(QT_BIN_DIR "${MACDEPLOYQT}" DIRECTORY)
# get_filename_component(QT_DIR "${QT_BIN_DIR}" DIRECTORY)
# set(QT_LIB_DIR "${QT_DIR}/${CMAKE_INSTALL_LIBDIR}")
# # Build list of -executable= parameters for plugins consumed by macdeployqt
# FILE(GLOB PLUGINS "${BUNDLE_PATH}/Contents/PlugIns/albert/*")
# foreach(PLUGIN ${PLUGINS})
# list(APPEND PLUGINS_EXEC_PARAMS "-executable=${PLUGIN}")
# endforeach()
# message(STATUS "MACDEPLOYQT ${MACDEPLOYQT}")
# message(STATUS "QT_DIR ${QT_DIR}")
# message(STATUS "QT_BIN_DIR ${QT_BIN_DIR}")
# message(STATUS "QT_LIB_DIR ${QT_LIB_DIR}")
# execute_process(
# COMMAND "${MACDEPLOYQT}"
# "${BUNDLE_PATH}"
# "-executable=${BUNDLE_PATH}/Contents/Frameworks/albert.framework/Versions/A/albert"
# ${PLUGINS_EXEC_PARAMS}
# #"-libpath=${CMAKE_INSTALL_PREFIX}" # albert lib
# #"-libpath=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" # albert lib
# #"-libpath=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" # albert lib
# "-libpath=/opt/local/lib" # macports dependencies
# #"-qmldir=${CMAKE_SOURCE_DIR}/plugins/qmlboxmodel/resources/qml"
# "-appstore-compliant"
# "-verbose=1"
# #"-dmg"
# COMMAND_ECHO STDOUT
# COMMAND_ERROR_IS_FATAL ANY
# )
# CODE SIGN
# execute_process(
# COMMAND xattr -d com.apple.quarantine "${BUNDLE_PATH}"
# COMMAND_ECHO STDOUT
# COMMAND_ERROR_IS_FATAL ANY
# )
execute_process(
COMMAND codesign --force --deep --sign - "${BUNDLE_PATH}"
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)
## CLEANUP
# include(BundleUtilities)
# verify_app("${BUNDLE_PATH}")
# Older, possibly useful stuff
## Build library lookup paths from CMAKE_PREFIX_PATH
#foreach(PATH ${CMAKE_PREFIX_PATH})
# list(APPEND DIRS "${PATH}/lib")
#endforeach()
#list(APPEND DIRS "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") # albert lib
#list(APPEND DIRS "/Library/Developer/CommandLineTools/Library/Frameworks/") # system python
#include(BundleUtilities)
#fixup_bundle("${BUNDLE_PATH}" "${LIBS}" "${DIRS}")
================================================
FILE: dist/cliff.toml
================================================
# https://git-cliff.org/docs/configuration
[changelog]
trim = false
conventional_commits = true
filter_unconventional = false
require_conventional = false
[git]
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->Features" },
{ message = "^api", group = "<!-- 1 -->API" },
{ message = "^perf", group = "<!-- 2 -->Performance" },
{ message = "^fix", group = "<!-- 3 -->Fixes" },
{ message = "^doc", group = "<!-- 4 -->Documentation" },
{ message = "^style", group = "<!-- 5 -->Styling" },
{ message = "^test", group = "<!-- 6 -->Testing" },
{ message = "^refactor", skip = true },
{ message = "^chore\\(release\\)", skip = true },
{ message = "^chore\\(plugins\\)", skip = true },
{ message = "^chore\\(deps.*\\)", skip = true },
{ message = "^chore\\(pr\\)", skip = true },
{ message = "^chore\\(pull\\)", skip = true },
{ message = "^chore|^ci", group = "<!-- 7 -->Miscellaneous Tasks" },
{ message = ".*", group = "<!-- 8 -->Other" },
]
================================================
FILE: dist/cliff_template_minimal.md
================================================
{% if extra.plugin_contexts -%}
{% set_global commits = commits -%}
{% for context in extra.plugin_contexts -%}
{% set_global commits = commits | concat(with=context.commits) -%}
{% endfor -%}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% set_global core_commits = [] -%}
{% for commit in commits -%}
{% if not commit.extra.plugin_name -%}
{% set_global core_commits = core_commits | concat(with=commit) -%}
{% endif -%}
{% endfor -%}
{% set_global plugin_commits = [] -%}
{% for commit in commits -%}
{% if commit.extra.plugin_name -%}
{% set_global plugin_commits = plugin_commits | concat(with=commit) -%}
{% endif -%}
{% endfor -%}
{% if core_commits -%}
#### Core
{% for commit in core_commits -%}
- {% if commit.breaking %}[**BREAKING**] {% endif -%}
{% if commit.scope %}_{{ commit.scope }}_ · {% endif -%}
{{ commit.message | upper_first }}
{% endfor -%}
{% endif -%}
{% if plugin_commits %}
#### Plugins
{% for name, commits in plugin_commits | group_by(attribute="extra.plugin_name") -%}
{% if commits | length > 1 -%}
- **{{ name }}**
{%- for commit in commits %}
- {% if commit.breaking %}[**BREAKING**] · {% endif %}
{%- if commit.scope %}_{{ commit.scope }}_ · {% endif %}
{%- if commit.message %}{{ commit.message | upper_first }}{% endif -%}
{% endfor %}
{% else -%}
{% for commit in commits -%}
- **{{ name }}**
{%- if commit.breaking %} · [**BREAKING**]{% endif %}
{%- if commit.scope %} · _{{ commit.scope }}_{% endif %}
{%- if commit.message %} · {{ commit.message | upper_first }}{% endif %}
{% endfor -%}
{% endif -%}
{% endfor -%}
{% endif -%}
{% endfor -%}
{% endif -%}
================================================
FILE: dist/cliff_template_rich.md
================================================
{% if extra.plugin_contexts -%}
{% set_global commits = commits -%}
{% for context in extra.plugin_contexts -%}
{% set_global commits = commits | concat(with=context.commits) -%}
{% endfor -%}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% set_global core_commits = [] -%}
{% for commit in commits -%}
{% if not commit.extra.plugin_name -%}
{% set_global core_commits = core_commits | concat(with=commit) -%}
{% endif -%}
{% endfor -%}
{% set_global plugin_commits = [] -%}
{% for commit in commits -%}
{% if commit.extra.plugin_name -%}
{% set_global plugin_commits = plugin_commits | concat(with=commit) -%}
{% endif -%}
{% endfor -%}
{% if core_commits -%}
#### Core
{% for commit in core_commits -%}
- {% if commit.breaking %}[**BREAKING**] {% endif -%}
{% if commit.scope %}_{{ commit.scope }}_ · {% endif -%}
[{{ commit.message | upper_first }}](https://github.com/albertlauncher/albert/commit/{{ commit.id}})
{% endfor -%}
{% endif -%}
{% if plugin_commits %}
#### Plugins
{% for name, commits in plugin_commits | group_by(attribute="extra.plugin_name") -%}
{% if commits | length > 1 -%}
- **{{ name }}**
{%- for commit in commits %}
- {% if commit.breaking %}[**BREAKING**] · {% endif %}
{%- if commit.scope %}_{{ commit.scope }}_ · {% endif %}
{%- if commit.message %}[{{ commit.message | upper_first }}](https://github.com/albertlauncher/{{ commit.extra.repo_name }}/commit/{{ commit.id}}){% endif -%}
{% endfor %}
{% else -%}
{% for commit in commits -%}
- **{{ name }}**
{%- if commit.breaking %} · [**BREAKING**]{% endif %}
{%- if commit.scope %} · _{{ commit.scope }}_{% endif %}
{%- if commit.message %} · [{{ commit.message | upper_first }}](https://github.com/albertlauncher/{{ commit.extra.repo_name }}/commit/{{ commit.id}}){% endif %}
{% endfor -%}
{% endif -%}
{% endfor -%}
{% endif -%}
{% endfor -%}
{% endif -%}
================================================
FILE: dist/flatpak/README.md
================================================
This is a disfunctional prototype.
Flatpak does not yet provide permissions to run albert in way that makes sense for a launcher.
qalculate needs flathub shared modules
```
git clone https://github.com/flathub/shared-modules.git
```
================================================
FILE: dist/flatpak/org.albertlauncher.Albert.yml
================================================
app-id: org.albertlauncher.Albert
runtime: org.kde.Platform
runtime-version: '6.4'
sdk: org.kde.Sdk
command: bootstrap-albert.sh
rename-desktop-file: albert.desktop
rename-icon: albert
copy-icon: true
finish-args:
- --device=dri
- --filesystem=host
#- --filesystem=xdg-cache
#- --filesystem=xdg-config
#- --filesystem=xdg-documents
- --share=ipc
- --share=network
- --socket=session-bus
- --socket=wayland
- --socket=x11
modules:
- name: Albert
buildsystem: cmake-ninja
builddir: true
prefix: /usr
post-install:
- echo 'albert -d -p /app/lib/albert "$@"' > /app/bin/bootstrap-albert.sh
chmod +x /app/bin/bootstrap-albert.sh
config-opts:
- -DCMAKE_BUILD_TYPE=RelWithDebInfo
- -DBUILD_CALCULATOR_QALCULATE=OFF
sources:
- type: git
url: https://github.com/albertlauncher/albert
branch: master
modules:
- name: pybind11
buildsystem: cmake-ninja
builddir: true
sources:
- type: git
url: https://github.com/pybind/pybind11
branch: v2.10.4
modules:
- name: cpython
build-options:
cflags: -fPIC
ldflags: -fpic
sources:
- type: archive
url: https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tar.xz
md5: 7bf85df71bbe7f95e5370b983e6ae684
- name: libmuparser
buildsystem: cmake-ninja
sources:
- type: git
url: https://github.com/beltoforion/muparser
branch: v2.3.4
# - name: libqalculate
# build-options:
# arch:
# aarch64:
# cxxflags: -fsigned-char
# config-opts:
# - --disable-static
# - --enable-maintainer-mode
# - --enable-compiled-definitions
# sources:
# - type: archive
# url: https://github.com/Qalculate/libqalculate/releases/download/v4.6.0/libqalculate-4.6.0.tar.gz
# sha256: 07b11dba19a80e8c5413a6bb25c81fb30cc0935b54fa0c9090c4ff8661985e08
================================================
FILE: dist/macos/albert_icns.sh
================================================
#!/bin/sh
input_path=../../resources/albert.svg
output_path=output.iconset
mkdir -p "$output_path"
# the convert command comes from imagemagick
for size in 32 64 128 256; do
double="$(($size * 2))"
convert -background none -density $size -resize x$size ${input_path} $output_path/icon_${size}x${size}.png
convert -background none -density $size -resize x$double ${input_path} $output_path/icon_${size}x${size}@2x.png
done
iconutil -c icns $output_path -o albert.icns
================================================
FILE: dist/macos/generate_appcast_item.sh
================================================
#!/usr/bin/env bash
set -exu
DMG_PATH="$1"
VERSION="$2"
SPARKLE_ED_PRIVATE_KEY="$3"
OUTPUT="$4"
BREW_PREFIX="$(brew --prefix)"
echo "
<item>
<title>Version $VERSION</title>
<pubDate>$(date +'%a, %d %b %Y %H:%M:%S %z')</pubDate>
<link>https://albertlauncher.github.io/</link>
<sparkle:version>2.0</sparkle:version>
<sparkle:minimumSystemVersion>11.0.0</sparkle:minimumSystemVersion>
<sparkle:releaseNotesLink>https://albertlauncher.github.io/news/</sparkle:releaseNotesLink>
<enclosure
url=\"https://github.com/albertlauncher/albert/releases/download/v$VERSION/Albert-v$VERSION.dmg\"
sparkle:version=\"$VERSION\"
sparkle:shortVersionString=\"$VERSION\"
$($BREW_PREFIX/Caskroom/sparkle/2.5.0/bin/sign_update -s "$SPARKLE_ED_PRIVATE_KEY" "$DMG_PATH")
type=\"application/octet-stream\"/>
</item>
" > "$OUTPUT"
================================================
FILE: dist/xdg/albert.desktop
================================================
#!/usr/bin/env xdg-open
[Desktop Entry]
Categories=Utility;
Comment=A desktop agnostic launcher
Exec=albert --platform xcb %u
GenericName=Launcher
Icon=albert
Name=Albert
StartupNotify=false
Type=Application
Version=1.0
MimeType=x-scheme-handler/albert
# Give desktop environments time to init. Otherwise QGnomePlatform does not correctly pick up the palette.
X-GNOME-Autostart-Delay=3
================================================
FILE: include/albert/app.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
/// \defgroup core Core API
/// Core classes and functions.
/// \defgroup core_extension Extension
/// Extension system and built-in extension interfaces classes.
/// \ingroup core
/// \defgroup core_plugin Plugin system
/// \ingroup core
/// Classes and functions of the plugin system.
/// \defgroup core_query Query handling
/// \ingroup core
/// Classes and functions of the query system.
/// \defgroup util Utility API
/// Utility classes and helper functions.
/// \defgroup util_plugin Plugin
/// \ingroup util
/// Utility for plugins.
/// \defgroup util_query Query
/// \ingroup util
/// Utility for indexing and query handling.
/// \defgroup util_net Network
/// \ingroup util
/// Network utility.
/// \defgroup util_system System
/// \ingroup util
/// System/Desktop utility.
/// \defgroup util_ui UI
/// \ingroup util
/// UI utility.
#pragma once
#include <QObject>
#include <QString>
#include <albert/export.h>
#include <filesystem>
#include <map>
#include <memory>
class QNetworkAccessManager;
class QSettings;
class QUrl;
/// The Albert namespace.
namespace albert
{
class Extension;
class UsageScoring;
///
/// The public app instance interface.
///
/// \ingroup core
///
class ALBERT_EXPORT App : public QObject
{
Q_OBJECT
public:
/// Returns the global app instance.
static App &instance();
/// @name Main window
/// @{
/// Shows the frontend and optionally sets the text to _input_text_.
virtual void show(const QString &input_text = {}) = 0;
/// Shows the settings window and optionally selects the plugin with _plugin_id_.
virtual void showSettings(QString plugin_id = {}) = 0;
/// @}
/// @name Extensions
/// @{
/// Get map of all registered extensions
virtual const std::map<QString,Extension*> &extensions() const = 0;
/// Get map of all extensions of type T
template<typename T>
std::map<QString, T*> extensions() const
{
std::map<QString, T*> results;
for (auto &[id, extension] : extensions())
if (T *t = dynamic_cast<T*>(extension))
results.emplace(id, t);
return results;
}
/// Get extension by id implicitly dynamic_cast'ed to type T.
template<typename T>
T* extension(const QString &id) const
{
try {
return dynamic_cast<T*>(extensions().at(id));
} catch (const std::out_of_range &) {
return nullptr;
}
}
/// @}
/// @name Application control
/// @{
///
/// Restarts the application.
///
/// This function is thread-safe.
///
static void restart();
///
/// Quits the application.
///
/// This function is thread-safe.
///
static void quit();
/// @}
/// @name Persistence
/// @{
///
/// Returns a `QSettings` object initialized with the application configuration file path.
///
/// As `unique_ptr` for the sake of movability.
///
/// This function is thread-safe.
///
static std::unique_ptr<QSettings> settings();
///
/// Returns a `QSettings` object initialized with the application state file path.
///
/// As `unique_ptr` for the sake of movability.
///
/// This function is thread-safe.
///
static std::unique_ptr<QSettings> state();
///
/// Returns the path to the application config directory.
///
/// This function is thread-safe.
///
static const std::filesystem::path &configLocation();
///
/// Returns the path to the application cache directory.
///
/// This function is thread-safe.
///
static const std::filesystem::path &cacheLocation();
///
/// Returns the path to the application data directory.
///
/// This function is thread-safe.
///
static const std::filesystem::path &dataLocation();
/// @}
signals:
/// Emitted when an extension has been registered.
void added(albert::Extension*);
/// Emitted when an extension has been deregistered.
void removed(albert::Extension*);
protected:
App();
virtual ~App();
};
} // namespace albert
================================================
FILE: include/albert/asyncgeneratorqueryhandler.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <albert/queryhandler.h>
#include <memory>
#include <vector>
namespace QCoro { template<typename T> class AsyncGenerator; }
namespace albert
{
class Item;
using AsyncItemGenerator = QCoro::AsyncGenerator<std::vector<std::shared_ptr<albert::Item>>>;
///
/// Coroutine-based asynchronous generator query handler.
///
/// Convenience base class for implementing triggered query handlers using C++ coroutines. Results
/// are produced lazily via an asynchronous item generator. The items are displayed in the order
/// they are yielded.
///
/// This class is suitable for I/O-bound query handling (e.g. network requests, subprocessing,
/// etc.). For CPU-bound work, prefer \ref GeneratorQueryHandler or its subclasses.
///
/// If you derive this class you want to link against QCoro which provides coroutine support for Qt
/// classes. Note that QCoro is still in development.
///
/// \ingroup util_query
///
class ALBERT_EXPORT AsyncGeneratorQueryHandler : public QueryHandler
{
public:
///
/// Yields batches of items for _context_ asynchronously and lazily.
///
/// The batch size is defined by the implementation.
///
/// \note GCC-13 does not support returning temporary values in generators.
/// So for as long as Ubuntu 24.04 is supported, we have to return lvalues.
///
/// \note Called from main thread. Do not run blocking operations in it.
///
virtual AsyncItemGenerator items(QueryContext &context) = 0;
protected:
/// Destructs the handler.
~AsyncGeneratorQueryHandler() override;
/// Returns an asynchronous generator query execution for _context_.
std::unique_ptr<QueryExecution> execution(QueryContext &context) override;
};
} // namespace albert
================================================
FILE: include/albert/backgroundexecutor.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <QFutureWatcher>
#include <QtConcurrentRun>
#include <atomic>
#include <functional>
namespace albert
{
///
/// Convenience class for recurring indexing tasks.
///
/// Takes care of the QtConcurrent boilerplate code to start, abort and schedule restarts of threads.
///
/// \ingroup util_query
///
template<typename T>
class BackgroundExecutor
{
std::unique_ptr<QFutureWatcher<T>> future_watcher_;
bool rerun_ = false;
std::atomic_bool stop_ = false;
public:
///
/// The task to be executed in a thread.
///
/// Return the results of type `T`. Abort if _abort_ is `true`.
///
std::function<T(const bool &abort)> parallel;
///
/// The finish callback.
///
/// When the \ref parallel function finished, this function will be called in the main thread.
/// Use \ref BackgroundExecutor::takeResult to get the _results_ returned from \ref parallel.
///
std::function<void()> finish;
/// Constructs the background executor.
BackgroundExecutor() = default;
///
/// Destructs the background executor.
///
/// Silently blocks execution until a running task is finished.
/// See \ref isRunning() and \ref waitForFinished().
///
~BackgroundExecutor()
{
stop_ = true;
rerun_ = false;
// Qt 6.4 QFutureWatcher is broken.
// isFinished returns wrong values and waitForFinished blocks forever on finished futures.
// TODO(26.04): Remove workaround when dropping Qt < 6.5 support.
if (future_watcher_
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
&& !future_watcher_->isFinished())
#else
&& future_watcher_->isRunning())
#endif
future_watcher_->waitForFinished();
}
///
/// Run or schedule a rerun of the task.
///
/// If a task is running this function sets the abort flag and schedules a rerun.
/// \ref finish will not be called for the cancelled run.
///
void run()
{
if (isRunning())
{
stop_ = true;
rerun_ = true;
}
else
{
stop_ = false;
rerun_ = false;
future_watcher_ = std::make_unique<QFutureWatcher<T>>();
QObject::connect(future_watcher_.get(), &QFutureWatcher<T>::finished,
future_watcher_.get(), [this]
{
if (rerun_)
{
future_watcher_.reset();
run(); // discard results and rerun
}
else
{
try {
finish(); // may throw
} catch (...) {}
future_watcher_.reset();
}
});
future_watcher_->setFuture(QtConcurrent::run([this]{ return parallel(stop_); }));
}
}
/// Stops the current execution.
inline void stop() { stop_ = true; }
/// Returns `true` if the asynchronous computation is currently running; otherwise returns `false`.
inline bool isRunning() const { return future_watcher_.get(); }
/// Blocks until the current task finished.
inline void waitForFinished()
{
if (future_watcher_)
future_watcher_->waitForFinished();
}
///
/// Takes the result from the future.
///
/// Must be called from \ref finish only. Rethrows any exception thrown in \ref parallel.
///
inline T takeResult() { return future_watcher_->future().takeResult(); }
};
}
================================================
FILE: include/albert/desktopentryparser.h
================================================
// Copyright (c) 2024-2024 Manuel Schneider
#pragma once
#include <QLocale>
#include <QString>
#include <albert/export.h>
#include <map>
#include <optional>
namespace albert::detail {
/// Desktop entry parser
/// http://standards.freedesktop.org/desktop-entry-spec/latest/
class ALBERT_EXPORT DesktopEntryParser
{
public:
DesktopEntryParser(const QString &path);
/// Get and escape string according to spec
///
/// Values of type string may contain all ASCII characters except for
/// control characters.
///
/// @returns The escaped string of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
QString getString(const QString §ion, const QString &key) const;
/// Get localestring according to spec
///
/// Values of type localestring are user displayable, and are encoded in UTF-8.
///
/// @returns The localestring of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
QString getLocaleString(const QString §ion, const QString &key);
/// Get iconstring according to spec
///
/// Values of type iconstring are the names of icons; these may be
/// absolute paths, or symbolic names for icons located using the
/// algorithm described in the Icon Theme Specification. Such values
/// are not user-displayable, and are encoded in UTF-8.
///
/// @returns The iconstring of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
QString getIconString(const QString §ion, const QString &key);
/// Get boolean according to spec
///
/// Values of type boolean must either be the string true or false.
///
/// @returns The boolean of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
bool getBoolean(const QString §ion, const QString &key);
/// Get numeric according to spec
///
/// Values of type numeric must be a valid floating point number as
/// recognized by the %f specifier for scanf in the C locale.
///
/// @returns The numeric of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
double getNumeric(const QString &, const QString &);
/// Split an Exec string according to spec
static std::optional<QStringList> splitExec(const QString &s) noexcept;
private:
/// Get a raw, unescaped value for a section and key.
///
/// @returns The raw, unescaped string of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
QString getRawValue(const QString §ion, const QString &key) const;
/// Get an escaped value for a section and key.
///
/// The escape sequences \s, \n, \t, \r, and \\ are supported for values of
/// type string, localestring and iconstring, meaning ASCII space, newline,
/// tab, carriage return, and backslash, respectively.
///
/// @returns The escaped string of the key in section
/// @param section The section to get the value from
/// @param key The key to the value for
/// @throws out_of_range if lookup failed
QString getEscapedValue(const QString §ion, const QString &key) const;
std::map<QString, std::map<QString,QString>> data;
QLocale locale;
};
}
================================================
FILE: include/albert/download.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <QObject>
#include <albert/export.h>
#include <memory>
class QNetworkReply;
class QString;
class QUrl;
namespace albert
{
///
/// Downloads a file from the given URL to the given path.
///
/// Does not check if the file exists. The download will fail to save the file in this case.
///
/// \ingroup util_net
///
class ALBERT_EXPORT Download : public QObject
{
Q_OBJECT
public:
///
/// Constructs a download with the given _url_, _path_ and _parent_.
///
Download(const QUrl &url, const QString &path, QObject *parent = nullptr);
///
/// Destructs this download.
///
~Download();
///
/// Returns a unique download for _url_ and _path_.
///
/// If a download for the same URL and path already exists, it is returned;
/// otherwise a new download is created and returned.
/// The download created is automatically started and lives in the main thread.
///
/// This function is thread-safe.
///
static std::shared_ptr<Download> unique(const QUrl &url, const QString &path);
///
/// Returns the url of the download.
///
/// This function is thread-safe.
///
const QUrl &url();
///
/// Returns the destination path of the download.
///
/// This function is thread-safe.
///
const QString &path();
///
/// Returns true if the download is active.
///
/// This function is thread-safe.
///
bool isActive();
///
/// Returns the error of the download, if any.
///
/// This function is thread-safe.
///
const QString &error();
///
/// Starts the download.
///
/// Do **not** move the download to another thread **after** calling this method.
///
void start();
signals:
///
/// Emitted when the download has finished.
///
void finished();
private:
class Private;
std::unique_ptr<Private> d;
};
}
================================================
FILE: include/albert/extension.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <albert/export.h>
class QString;
namespace albert
{
///
/// Abstract extension class.
///
/// \ingroup core_extension
///
class ALBERT_EXPORT Extension
{
public:
///
/// Returns the extension identifier.
///
/// To avoid naming conflicts use the namespace of your plugin,
/// e.g. files (root extension), files.rootbrowser, files.homebrowser, …
///
virtual QString id() const = 0;
///
/// Returns the pretty, human readable extension name.
///
virtual QString name() const = 0;
///
/// Returns the brief extension description.
///
virtual QString description() const = 0;
protected:
///
/// Destructs the extension.
///
virtual ~Extension();
};
} // namespace albert
================================================
FILE: include/albert/extensionplugin.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <QObject>
#include <albert/extension.h>
#include <albert/plugininstance.h>
namespace albert
{
///
/// Extension plugin base class.
///
/// Implements pure virtual functions of \ref Extension and \ref PluginInstance.
///
/// \ingroup util_plugin
///
class ALBERT_EXPORT ExtensionPlugin : public PluginInstance,
virtual public Extension
{
public:
///
/// Returns \ref PluginMetadata::id.
///
QString id() const override;
///
/// Returns \ref PluginMetadata::name.
///
QString name() const override;
///
/// Returns \ref PluginMetadata::description.
///
QString description() const override;
///
/// Returns `this` extension.
///
std::vector<albert::Extension*> extensions() override;
};
}
================================================
FILE: include/albert/fallbackhandler.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <QString>
#include <albert/export.h>
#include <albert/extension.h>
#include <albert/item.h>
#include <memory>
#include <vector>
namespace albert
{
class Item;
///
/// Abstract fallback item provider.
///
/// \ingroup core_extension
///
class ALBERT_EXPORT FallbackHandler : virtual public Extension
{
public:
///
/// Returns fallback items for _query_.
///
virtual std::vector<std::shared_ptr<Item>> fallbacks(const QString &) const = 0;
protected:
///
/// Destructs the fallback handler.
///
~FallbackHandler() override;
};
}
================================================
FILE: include/albert/frontend.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <QObject>
#include <QString>
#include <albert/export.h>
#include <albert/plugininstance.h>
class QWidget;
namespace albert
{
namespace detail
{
class Query;
///
/// The interface for albert frontends.
///
class ALBERT_EXPORT Frontend : public albert::PluginInstance
{
Q_OBJECT
public:
///
/// Visibility of the frontend
///
virtual bool isVisible() const = 0;
///
/// Set the visibility state of the frontend
///
virtual void setVisible(bool visible) = 0;
///
/// Input line text
///
virtual QString input() const = 0;
///
/// Input line text setter
///
virtual void setInput(const QString&) = 0;
///
/// The native window id. Used to apply platform quirks.
///
virtual unsigned long long winId() const = 0;
///
/// The config widget show in the window settings tab
///
virtual QWidget *createFrontendConfigWidget() = 0;
///
/// The query setter
///
virtual void setQuery(Query *query) = 0;
signals:
void inputChanged(QString);
void visibleChanged(bool);
protected:
~Frontend() override;
};
}
}
================================================
FILE: include/albert/generatorqueryhandler.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <albert/queryhandler.h>
#include <memory>
#include <vector>
namespace QCoro { template<typename T> class Generator; }
namespace albert
{
class Item;
using ItemGenerator = QCoro::Generator<std::vector<std::shared_ptr<albert::Item>>>;
///
/// Coroutine-based synchronous generator query handler.
///
/// Convenience base class for implementing triggered query handlers using C++ coroutines. Results
/// are produced lazily via a synchronous item generator. Item production is executed in a worker
/// thread, allowing CPU-bound work without blocking the main thread. The items are displayed in the
/// order they are yielded.
///
/// This class is intended for computational workloads. For I/O-bound or event-driven tasks, prefer
/// \ref AsyncGeneratorQueryHandler.
///
/// \ingroup util_query
///
class ALBERT_EXPORT GeneratorQueryHandler : public QueryHandler
{
public:
///
/// Yields batches of items for _context_ lazily.
///
/// The batch size is defined by the implementation.
///
/// \note Executed in a background thread.
///
/// \note GCC-13 does not support returning temporary values in generators.
/// So for as long as Ubuntu 24.04 is supported, we have to return lvalues.
///
virtual ItemGenerator items(QueryContext &context) = 0;
protected:
/// Destructs the handler.
~GeneratorQueryHandler() override;
/// Returns a threaded synchronous generator query execution for _context_.
std::unique_ptr<QueryExecution> execution(QueryContext &context) override;
};
} // namespace albert
================================================
FILE: include/albert/globalqueryhandler.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <albert/rankedqueryhandler.h>
#include <albert/rankitem.h>
#include <memory>
#include <vector>
namespace albert
{
///
/// Query handler participating in the global search.
///
/// By design, every global query handler is also a triggered query handler. Therefore this class
/// inherits \ref RankedQueryHandler and as such inherits its contract. I.e. the handler returns a
/// complete set of match-scored items eagerly. The provided match scores will be combined with the
/// usage-based scoring weighted by user configuration. Finally the items (of all global handlers)
/// will be yielded lazily in order of their final score.
///
/// Note: Global queries are expected to complete within a few milliseconds.
///
/// \ingroup core_extension
///
class ALBERT_EXPORT GlobalQueryHandler : public albert::RankedQueryHandler
{
public:
///
/// Returns a list of special items that should show up on an emtpy query.
///
/// The empty pattern matches everything. For triggered queries this is desired and by design
/// lots of triggered handlers reuse GlobalQueryHandler::rankItems. The empty global query is
/// not executed. This function allows dedicated empty global query handling.
///
virtual std::vector<std::shared_ptr<Item>> handleEmptyQuery();
protected:
/// Destructs the handler.
~GlobalQueryHandler() override;
};
} // namespace albert
================================================
FILE: include/albert/icon.h
================================================
// SPDX-FileCopyrightText: 2025 Manuel Schneider
// SPDX-License-Identifier: MIT
#pragma once
#include <QString>
#include <albert/export.h>
#include <memory>
#include <filesystem>
class QBrush;
class QIcon;
class QPainter;
class QPixmap;
class QRect;
class QSize;
class QString;
namespace albert
{
///
/// Abstract icon engine.
///
/// \ingroup core_query
///
class ALBERT_EXPORT Icon
{
public:
/// Destructs the icon.
virtual ~Icon();
/// Returns a clone of this icon.
virtual std::unique_ptr<Icon> clone() const = 0;
///
/// Returns the device independent size of the available icon for the given
/// _device_independent_size_ and _device_pixel_ratio_.
///
/// The base implementations returns _device_independent_size_.
///
virtual QSize actualSize(const QSize &device_independent_size, double device_pixel_ratio);
///
/// Returns a pixmap for the requested _device_independent_size_ and _device_pixel_ratio_.
///
/// The base implementation creates a transparent pixmap of \ref actualSize and calls \ref paint on it.
///
virtual QPixmap pixmap(const QSize &device_independent_size, double device_pixel_ratio);
/// Uses the given _painter_ to paint the icon into the rectangle _rect_.
virtual void paint(QPainter *painter, const QRect &rect) = 0;
///
/// Returns `true` if the icon is valid; otherwise returns `false`.
///
/// The base implementation returns `false`.
///
virtual bool isNull();
/// Returns a URL representation of the icon.
virtual QString toUrl() const = 0;
///
/// Returns the cache key of the icon.
///
/// The base implementation calls \ref toUrl. Reimplement to get faster lookups.
///
virtual QString cacheKey();
/// Returns a `QIcon` using _icon_ as icon engine.
static QIcon qIcon(std::unique_ptr<albert::Icon> icon);
/// Returns a built-in icon for the given _url_.
static std::unique_ptr<Icon> iconFromUrl(const QString &url);
/// Returns a built-in icon for the given _urls_.
static std::unique_ptr<Icon> iconFromUrls(const QStringList &urls);
/// @name Image icon
/// @{
/// Returns an icon from an image file at _path_.
static std::unique_ptr<Icon> image(const QString &path);
/// @copydoc image(const QString &)
static std::unique_ptr<Icon> image(const std::filesystem::path &path);
/// @}
/// @name File type icon
/// @{
/// Returns an icon representing the file type of the file at _path_.
static std::unique_ptr<Icon> fileType(const QString &path);
/// @copydoc fileType(const QString &)
static std::unique_ptr<Icon> fileType(const std::filesystem::path &path);
/// @}
/// @name Theme icon ([XDG icon lookup](https://specifications.freedesktop.org/icon-theme/latest/))
/// @{
/// Returns an icon from the current icon theme with the given _icon_name_.
static std::unique_ptr<Icon> theme(const QString &icon_name);
/// @}
/// @name Standard icon (QStyle standard pixmap)
/// @{
///
/// This enum describes the available standard icons.
///
/// See [Qt documentation](https://doc.qt.io/qt-6/qstyle.html#StandardPixmap-enum) for more details.
///
enum StandardIconType
{
TitleBarMinButton = 1, ///< Menu button on a title bar.
TitleBarMenuButton = 0, ///< Minimize button on title bars (e.g., in QMdiSubWindow).
TitleBarMaxButton = 2, ///< Maximize button on title bars.
TitleBarCloseButton = 3, ///< Close button on title bars.
TitleBarNormalButton = 4, ///< Normal (restore) button on title bars.
TitleBarShadeButton = 5, ///< Shade button on title bars.
TitleBarUnshadeButton = 6, ///< Unshade button on title bars.
TitleBarContextHelpButton = 7, ///< The Context help button on title bars.
MessageBoxInformation = 9, ///< The "information" icon.
MessageBoxWarning = 10, ///< The "warning" icon.
gitextract_i3xvbsgx/
├── .clang-format
├── .docker/
│ ├── README.md
│ ├── arch.Dockerfile
│ ├── fedora.Dockerfile
│ └── ubuntu.Dockerfile
├── .dockerignore
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bugreport.yml
│ │ ├── 2-missing_terminal.yml
│ │ └── config.yml
│ ├── stale.yml
│ └── workflows/
│ ├── ci.yml
│ ├── telegram_notify_comments.yml
│ └── telegram_notify_issues.yml
├── .gitignore
├── .gitmodules
├── .pre-commit-config.yaml
├── CHANGELOG.md
├── CMakeLists.txt
├── LICENSE.md
├── README.md
├── cmake/
│ ├── FindAlbert.cmake.in
│ ├── MacOSXBundleInfo.plist.in
│ ├── MacOSXFrameworkInfo.plist.in
│ ├── albert-config.cmake.in
│ ├── albert-macros.cmake
│ └── bundle-macos.cmake.in
├── dist/
│ ├── cliff.toml
│ ├── cliff_template_minimal.md
│ ├── cliff_template_rich.md
│ ├── flatpak/
│ │ ├── README.md
│ │ └── org.albertlauncher.Albert.yml
│ ├── macos/
│ │ ├── albert.icns
│ │ ├── albert_icns.sh
│ │ └── generate_appcast_item.sh
│ └── xdg/
│ └── albert.desktop
├── include/
│ └── albert/
│ ├── app.h
│ ├── asyncgeneratorqueryhandler.h
│ ├── backgroundexecutor.h
│ ├── desktopentryparser.h
│ ├── download.h
│ ├── extension.h
│ ├── extensionplugin.h
│ ├── fallbackhandler.h
│ ├── frontend.h
│ ├── generatorqueryhandler.h
│ ├── globalqueryhandler.h
│ ├── icon.h
│ ├── indexitem.h
│ ├── indexqueryhandler.h
│ ├── inputhistory.h
│ ├── item.h
│ ├── logging.h
│ ├── matchconfig.h
│ ├── matcher.h
│ ├── messagebox.h
│ ├── networkutil.h
│ ├── notification.h
│ ├── oauth.h
│ ├── oauthconfigwidget.h
│ ├── plugindependency.h
│ ├── plugininstance.h
│ ├── pluginloader.h
│ ├── pluginmetadata.h
│ ├── pluginprovider.h
│ ├── query.h
│ ├── querycontext.h
│ ├── queryexecution.h
│ ├── queryhandler.h
│ ├── queryresults.h
│ ├── rankedqueryhandler.h
│ ├── rankitem.h
│ ├── ratelimiter.h
│ ├── standarditem.h
│ ├── systemutil.h
│ ├── telemetryprovider.h
│ ├── timeit.h
│ ├── urlhandler.h
│ ├── usagescoring.h
│ └── widgetsutil.h
├── resources/
│ ├── index.theme
│ └── resources.qrc
├── src/
│ ├── app/
│ │ ├── application.cpp
│ │ ├── application.h
│ │ ├── messagehandler.cpp
│ │ ├── messagehandler.h
│ │ ├── pathmanager.cpp
│ │ ├── pathmanager.h
│ │ ├── pluginqueryhandler.cpp
│ │ ├── pluginqueryhandler.h
│ │ ├── qtpluginloader.cpp
│ │ ├── qtpluginloader.h
│ │ ├── qtpluginprovider.cpp
│ │ ├── qtpluginprovider.h
│ │ ├── report.cpp
│ │ ├── report.h
│ │ ├── rpcserver.cpp
│ │ ├── rpcserver.h
│ │ ├── systemtrayicon.cpp
│ │ ├── systemtrayicon.h
│ │ ├── telemetry.cpp
│ │ ├── telemetry.h
│ │ ├── telemetryprovider.cpp
│ │ ├── triggersqueryhandler.cpp
│ │ ├── triggersqueryhandler.h
│ │ └── urlhandler.cpp
│ ├── common/
│ │ ├── extension.cpp
│ │ ├── item.cpp
│ │ └── rankitem.cpp
│ ├── config.h.in
│ ├── frontend/
│ │ ├── frontend.cpp
│ │ ├── session.cpp
│ │ └── session.h
│ ├── icon/
│ │ ├── composedicon.cpp
│ │ ├── composedicon.h
│ │ ├── filetypeicon.cpp
│ │ ├── filetypeicon.h
│ │ ├── graphemeicon.cpp
│ │ ├── graphemeicon.h
│ │ ├── icon.cpp
│ │ ├── iconifiedicon.cpp
│ │ ├── iconifiedicon.h
│ │ ├── imageicon.cpp
│ │ ├── imageicon.h
│ │ ├── qiconicon.cpp
│ │ ├── qiconicon.h
│ │ ├── recticon.cpp
│ │ ├── recticon.h
│ │ ├── standardicon.cpp
│ │ ├── standardicon.h
│ │ ├── themeicon.cpp
│ │ └── themeicon.h
│ ├── main.cpp
│ ├── platform/
│ │ ├── mac/
│ │ │ └── platform.mm
│ │ ├── platform.h
│ │ ├── signalhandler.h
│ │ ├── unix/
│ │ │ └── signalhandler.cpp
│ │ └── xdg/
│ │ ├── desktopentryparser.cpp
│ │ ├── iconlookup.cpp
│ │ ├── iconlookup.h
│ │ ├── platform.cpp
│ │ ├── themefileparser.cpp
│ │ └── themefileparser.h
│ ├── plugin/
│ │ ├── extensionregistry.cpp
│ │ ├── extensionregistry.h
│ │ ├── plugininstance.cpp
│ │ ├── pluginloader.cpp
│ │ ├── pluginprovider.cpp
│ │ ├── pluginregistry.cpp
│ │ ├── pluginregistry.h
│ │ └── topologicalsort.hpp
│ ├── plugin.h.in
│ ├── query/
│ │ ├── asyncgeneratorqueryhandler.cpp
│ │ ├── fallbackhandler.cpp
│ │ ├── generatorqueryhandler.cpp
│ │ ├── globalquery.cpp
│ │ ├── globalquery.h
│ │ ├── globalqueryexecution.cpp
│ │ ├── globalqueryexecution.h
│ │ ├── globalqueryhandler.cpp
│ │ ├── query.cpp
│ │ ├── queryengine.cpp
│ │ ├── queryengine.h
│ │ ├── queryexecution.cpp
│ │ ├── queryhandler.cpp
│ │ ├── queryresults.cpp
│ │ ├── rankedqueryhandler.cpp
│ │ ├── usagedatabase.cpp
│ │ ├── usagedatabase.h
│ │ └── usagescoring.cpp
│ ├── settings/
│ │ ├── pluginswidget/
│ │ │ ├── pluginsmodel.cpp
│ │ │ ├── pluginsmodel.h
│ │ │ ├── pluginssortproxymodel.cpp
│ │ │ ├── pluginssortproxymodel.h
│ │ │ ├── pluginswidget.cpp
│ │ │ ├── pluginswidget.h
│ │ │ ├── pluginwidget.cpp
│ │ │ └── pluginwidget.h
│ │ ├── querywidget/
│ │ │ ├── fallbacksmodel.cpp
│ │ │ ├── fallbacksmodel.h
│ │ │ ├── queryhandlermodel.cpp
│ │ │ ├── queryhandlermodel.h
│ │ │ ├── querywidget.cpp
│ │ │ ├── querywidget.h
│ │ │ └── querywidget.ui
│ │ ├── settingswindow.cpp
│ │ ├── settingswindow.h
│ │ └── settingswindow.ui
│ └── util/
│ ├── color.h
│ ├── download.cpp
│ ├── extensionplugin.cpp
│ ├── indexitem.cpp
│ ├── indexqueryhandler.cpp
│ ├── inputhistory.cpp
│ ├── itemindex.cpp
│ ├── itemindex.h
│ ├── levenshtein.cpp
│ ├── levenshtein.h
│ ├── matcher.cpp
│ ├── messagebox.cpp
│ ├── networkutil.cpp
│ ├── notification.cpp
│ ├── oauth.cpp
│ ├── oauthconfigwidget.cpp
│ ├── qiconengineadapter.cpp
│ ├── qiconengineadapter.h
│ ├── querypreprocessing.cpp
│ ├── querypreprocessing.h
│ ├── ratelimiter.cpp
│ ├── standarditem.cpp
│ └── systemutil.cpp
└── test/
├── test.cpp
└── test.h
SYMBOL INDEX (356 symbols across 144 files)
FILE: include/albert/app.h
function namespace (line 54) | namespace albert
FILE: include/albert/asyncgeneratorqueryhandler.h
function namespace (line 8) | namespace QCoro { template<typename T> class AsyncGenerator; }
function namespace (line 10) | namespace albert
FILE: include/albert/backgroundexecutor.h
function namespace (line 10) | namespace albert
FILE: include/albert/desktopentryparser.h
function namespace (line 10) | namespace albert::detail {
FILE: include/albert/download.h
function namespace (line 12) | namespace albert
FILE: include/albert/extension.h
function namespace (line 8) | namespace albert
FILE: include/albert/extensionplugin.h
function namespace (line 9) | namespace albert
FILE: include/albert/fallbackhandler.h
function namespace (line 12) | namespace albert
FILE: include/albert/frontend.h
function namespace (line 11) | namespace albert
FILE: include/albert/generatorqueryhandler.h
function namespace (line 8) | namespace QCoro { template<typename T> class Generator; }
function namespace (line 10) | namespace albert
FILE: include/albert/globalqueryhandler.h
function namespace (line 10) | namespace albert
FILE: include/albert/icon.h
function namespace (line 17) | namespace albert
FILE: include/albert/indexitem.h
function namespace (line 10) | namespace albert
FILE: include/albert/indexqueryhandler.h
function namespace (line 11) | namespace albert
FILE: include/albert/inputhistory.h
function namespace (line 10) | namespace albert::detail
FILE: include/albert/item.h
function Action (line 19) | Action final
FILE: include/albert/matchconfig.h
function namespace (line 7) | namespace albert
FILE: include/albert/matcher.h
function namespace (line 12) | namespace albert
FILE: include/albert/messagebox.h
function namespace (line 9) | namespace albert
FILE: include/albert/networkutil.h
function namespace (line 10) | namespace albert
FILE: include/albert/notification.h
function namespace (line 8) | namespace albert
FILE: include/albert/oauth.h
function namespace (line 12) | namespace albert
FILE: include/albert/oauthconfigwidget.h
function namespace (line 9) | namespace albert
FILE: include/albert/plugindependency.h
function namespace (line 10) | namespace albert
function onDeregistered (line 147) | void onDeregistered(Extension *e)
FILE: include/albert/plugininstance.h
function namespace (line 15) | namespace albert
FILE: include/albert/pluginloader.h
function namespace (line 9) | namespace albert
FILE: include/albert/pluginmetadata.h
function namespace (line 8) | namespace albert
FILE: include/albert/pluginprovider.h
function namespace (line 8) | namespace albert
FILE: include/albert/query.h
function namespace (line 9) | namespace albert
function namespace (line 17) | namespace albert::detail
FILE: include/albert/querycontext.h
function namespace (line 8) | namespace albert
FILE: include/albert/queryexecution.h
function namespace (line 9) | namespace albert
FILE: include/albert/queryhandler.h
function namespace (line 12) | namespace albert
FILE: include/albert/queryresults.h
function namespace (line 13) | namespace albert
FILE: include/albert/rankedqueryhandler.h
function namespace (line 9) | namespace albert
FILE: include/albert/rankitem.h
function namespace (line 9) | namespace albert
FILE: include/albert/ratelimiter.h
function namespace (line 9) | namespace albert::detail
FILE: include/albert/standarditem.h
function namespace (line 8) | namespace albert{ class Icon; }
function namespace (line 10) | namespace albert
FILE: include/albert/systemutil.h
type QList (line 11) | typedef QList<QString> QStringList;
function namespace (line 13) | namespace albert
FILE: include/albert/telemetryprovider.h
function namespace (line 13) | namespace albert::detail
FILE: include/albert/timeit.h
function namespace (line 10) | namespace albert::detail
FILE: include/albert/urlhandler.h
function namespace (line 9) | namespace albert
FILE: include/albert/usagescoring.h
function namespace (line 10) | namespace albert
function ItemKey (line 60) | struct std::hash<albert::ItemKey>
FILE: include/albert/widgetsutil.h
function namespace (line 12) | namespace albert
FILE: src/app/application.cpp
function App (line 75) | App &App::instance() { return *app_instance; }
class Application::Private (line 122) | class Application::Private
function QString (line 414) | QString Application::Private::loadFrontend(PluginLoader *loader)
function Application (line 494) | Application &Application::instance() { return static_cast<Application&>(...
function PluginRegistry (line 514) | PluginRegistry &Application::pluginRegistry() { return d->plugin_registr...
function QueryEngine (line 516) | QueryEngine &Application::queryEngine() { return d->query_engine; }
function Telemetry (line 518) | Telemetry &Application::telemetry() { return d->telemetry; }
function SystemTrayIcon (line 520) | SystemTrayIcon &Application::systemTrayIcon() { return d->tray_icon; }
function PathManager (line 522) | PathManager &Application::pathManager() { return d->path_manager; }
function Frontend (line 546) | Frontend *Application::frontend() { return d->frontend; }
function QString (line 548) | QString Application::currentFrontend() { return d->frontend_plugin->meta...
function QStringList (line 550) | QStringList Application::availableFrontends()
function QHotkey (line 570) | const QHotkey *Application::hotkey() const { return d->hotkey.get(); }
type albert (line 590) | namespace albert {
FILE: src/app/application.h
function namespace (line 13) | namespace albert {
FILE: src/app/messagehandler.cpp
function messageHandler (line 8) | void messageHandler(QtMsgType type, const QMessageLogContext &context, c...
FILE: src/app/pathmanager.cpp
class PathManager::Private (line 14) | class PathManager::Private
function QStringList (line 33) | const QStringList &PathManager::originalPathEntries() const { return d->...
function QStringList (line 35) | const QStringList &PathManager::additionalPathEntries() const { return d...
FILE: src/app/pathmanager.h
function class (line 8) | class PathManager
FILE: src/app/pluginqueryhandler.cpp
class PluginItem (line 16) | class PluginItem : public Item
method PluginItem (line 22) | PluginItem(PluginRegistry &plugin_registry, const Plugin &plugin):
method QString (line 25) | QString id() const override { return plugin_.id; }
method QString (line 27) | QString text() const override
method QString (line 30) | QString subtext() const override
method QString (line 56) | QString inputActionText() const override
method icon (line 59) | unique_ptr<Icon> icon() const override
method actions (line 71) | vector<Action> actions() const override
function QString (line 113) | QString PluginQueryHandler::id() const { return u"pluginregistry"_s; }
function QString (line 115) | QString PluginQueryHandler::name() const { return tr("Plugins"); }
function QString (line 117) | QString PluginQueryHandler::description() const { return tr("Manage plug...
function QString (line 119) | QString PluginQueryHandler::defaultTrigger() const { return u"plugin "_s; }
FILE: src/app/pluginqueryhandler.h
function class (line 8) | class PluginQueryHandler : public albert::IndexQueryHandler
FILE: src/app/qtpluginloader.cpp
function QString (line 18) | static QString fetchLocalizedMetadata(const QJsonObject &json, const QSt...
function QString (line 150) | QString QtPluginLoader::path() const { return loader_.fileName(); }
function PluginMetadata (line 152) | const PluginMetadata &QtPluginLoader::metadata() const { return metadata...
function now (line 154) | static inline auto now() { return system_clock::now(); }
function diff (line 157) | static inline auto diff(const time_point<system_clock> & tp)
function PluginInstance (line 245) | PluginInstance *QtPluginLoader::instance() { return instance_; }
FILE: src/app/qtpluginloader.h
function namespace (line 8) | namespace albert { class PluginInstance; }
FILE: src/app/qtpluginprovider.cpp
function QString (line 64) | QString QtPluginProvider::id() const { return QStringLiteral("qtpluginpr...
function QString (line 66) | QString QtPluginProvider::name() const { return QStringLiteral("C++/Qt"); }
function QString (line 68) | QString QtPluginProvider::description() const
FILE: src/app/qtpluginprovider.h
function namespace (line 8) | namespace albert { class PluginLoader; }
function class (line 11) | class QtPluginProvider : public albert::PluginProvider
FILE: src/app/report.cpp
function QStringList (line 13) | QStringList report()
FILE: src/app/rpcserver.cpp
function QString (line 12) | static inline QString socketPath() { return QDir(App::cacheLocation()).f...
class RPCServer::Private (line 14) | class RPCServer::Private
method onConnection (line 20) | void onConnection()
function QByteArray (line 82) | QByteArray RPCServer::sendMessage(const QByteArray &bytes, bool await_re...
FILE: src/app/rpcserver.h
function namespace (line 6) | namespace albert { class ExtensionRegistry; }
function class (line 9) | class RPCServer
FILE: src/app/systemtrayicon.cpp
function QString (line 15) | static inline QString tr(const char *sourceText, const char *disambiguat...
FILE: src/app/systemtrayicon.h
function class (line 9) | class SystemTrayIcon
FILE: src/app/telemetry.cpp
function QJsonObject (line 107) | QJsonObject Telemetry::albertTelemetry() const
function QString (line 132) | static QString machineIdentifier()
function QString (line 140) | static QString iso8601now()
function QJsonDocument (line 147) | QJsonDocument Telemetry::buildReport() const
function QString (line 164) | QString Telemetry::buildReportString() const
FILE: src/app/telemetry.h
function namespace (line 10) | namespace albert { class ExtensionRegistry; }
function class (line 12) | class Telemetry : public QObject
FILE: src/app/triggersqueryhandler.cpp
function QString (line 23) | QString TriggersQueryHandler::id() const { return u"triggers"_s; }
function QString (line 25) | QString TriggersQueryHandler::name() const { return u"Triggers"_s; }
function QString (line 27) | QString TriggersQueryHandler::description() const { return tr("Trigger c...
FILE: src/app/triggersqueryhandler.h
type TriggerHandler (line 25) | struct TriggerHandler {
FILE: src/common/item.cpp
function QString (line 9) | QString Item::inputActionText() const { return text(); }
class detail::DynamicItem::Private (line 21) | class detail::DynamicItem::Private
FILE: src/frontend/session.h
function namespace (line 8) | namespace albert::detail {
function class (line 13) | class Session : public QObject
FILE: src/icon/composedicon.cpp
function QString (line 77) | QString ComposedIcon::toUrl() const
function QString (line 130) | QString ComposedIcon::scheme() { return u"comp"_s; }
FILE: src/icon/composedicon.h
function namespace (line 8) | namespace albert {
FILE: src/icon/filetypeicon.cpp
function QString (line 22) | QString FileTypeIcon::toUrl() const { return u"%1:%2"_s.arg(scheme(), pa...
function QString (line 24) | QString FileTypeIcon::scheme() { return u"qfip"_s; }
FILE: src/icon/filetypeicon.h
function namespace (line 7) | namespace albert {
FILE: src/icon/graphemeicon.cpp
function QString (line 57) | QString GraphemeIcon::toUrl() const
function QString (line 83) | QString GraphemeIcon::scheme() { return u"grapheme"_s; }
function QBrush (line 85) | QBrush GraphemeIcon::defaultBrush(){ return QApplication::palette().colo...
FILE: src/icon/graphemeicon.h
function namespace (line 8) | namespace albert {
FILE: src/icon/icon.cpp
function QSize (line 21) | QSize Icon::actualSize(const QSize &device_independent_size, qreal)
function QPixmap (line 26) | QPixmap Icon::pixmap(const QSize &device_independent_size, qreal device_...
function QString (line 42) | QString Icon::cacheKey() { return toUrl(); }
function checkUrlScheme (line 46) | static inline bool checkUrlScheme(const QString &url, const QString &sch...
function dispatch (line 53) | static unique_ptr<Icon> dispatch(const QString &url)
function QIcon (line 90) | QIcon Icon::qIcon(unique_ptr<Icon> icon) {
function QBrush (line 137) | QBrush Icon::graphemeDefaultBrush() { return GraphemeIcon::defaultBrush(...
function QBrush (line 147) | const QBrush &Icon::iconifiedDefaultBackgroundBrush()
function QBrush (line 150) | const QBrush &Icon::iconifiedDefaultBorderBrush()
FILE: src/icon/iconifiedicon.cpp
function QRadialGradient (line 10) | static QRadialGradient makeBackgroundGradient(auto s, auto e)
function QLinearGradient (line 19) | static QLinearGradient makeBorderGradient(auto s, auto e)
function QSize (line 45) | QSize IconifiedIcon::actualSize(const QSize &device_independent_size, do...
function QString (line 122) | QString IconifiedIcon::toUrl() const
function QString (line 163) | QString IconifiedIcon::scheme() { return u"icon"_s; }
FILE: src/icon/iconifiedicon.h
function namespace (line 9) | namespace albert {
FILE: src/icon/imageicon.cpp
function QString (line 23) | QString ImageIcon::toUrl() const { return u"%1:%2"_s.arg(fileScheme(), p...
function QString (line 25) | QString ImageIcon::fileScheme() { return u"file"_s; }
function QString (line 27) | QString ImageIcon::qrcScheme() { return u"qrc"_s; }
FILE: src/icon/imageicon.h
function namespace (line 7) | namespace albert {
FILE: src/icon/qiconicon.cpp
function QSize (line 8) | QSize QIconIcon::actualSize(const QSize &device_independent_size, qreal ...
function QPixmap (line 22) | QPixmap QIconIcon::pixmap(const QSize &device_independent_size, qreal de...
FILE: src/icon/qiconicon.h
function namespace (line 7) | namespace albert {
FILE: src/icon/recticon.cpp
function QString (line 71) | QString RectIcon::toUrl() const
function QString (line 106) | QString RectIcon::scheme() { return u"rect"_s; }
function QBrush (line 108) | QBrush RectIcon::defaultColor() { return QBrush(Qt::black); }
function QBrush (line 114) | QBrush RectIcon::defaultBorderColor() { return QBrush(Qt::black); }
FILE: src/icon/recticon.h
function namespace (line 7) | namespace albert {
FILE: src/icon/standardicon.cpp
function QString (line 21) | QString StandardIcon::toUrl() const
function QString (line 26) | QString StandardIcon::scheme() { return u"qsp"_s; }
FILE: src/icon/standardicon.h
function namespace (line 6) | namespace albert {
FILE: src/icon/themeicon.cpp
function QString (line 27) | QString ThemeIcon::toUrl() const { return u"%1:%2"_s.arg(scheme(), name_...
function QString (line 29) | QString ThemeIcon::scheme() { return u"xdg"_s; }
FILE: src/icon/themeicon.h
function namespace (line 7) | namespace albert {
FILE: src/main.cpp
type albert (line 5) | namespace albert {
function main (line 9) | int main(int argc, char **argv)
FILE: src/platform/platform.h
function namespace (line 6) | namespace platform
FILE: src/platform/signalhandler.h
function class (line 5) | class SignalHandler
FILE: src/platform/unix/signalhandler.cpp
type SocketFileDescriptor (line 12) | enum SocketFileDescriptor { Write, Read, Count }
function unixSignalHandler (line 18) | void unixSignalHandler(int signal)
function qtSignalHandler (line 25) | void qtSignalHandler()
type sigaction (line 59) | struct sigaction
type sigaction (line 71) | struct sigaction
FILE: src/platform/xdg/desktopentryparser.cpp
function QString (line 39) | QString DesktopEntryParser::getRawValue(const QString §ion, const QS...
function QString (line 58) | QString DesktopEntryParser::getEscapedValue(const QString §ion, cons...
function QString (line 88) | QString DesktopEntryParser::getString(const QString §ion, const QStr...
function QString (line 93) | QString DesktopEntryParser::getLocaleString(const QString §ion, cons...
function QString (line 123) | QString DesktopEntryParser::getIconString(const QString §ion, const ...
FILE: src/platform/xdg/iconlookup.cpp
function QString (line 17) | QString XDG::IconLookup::iconPath(QString iconName, QSize , QString them...
function QString (line 54) | QString XDG::IconLookup::themeIconPath(QString iconName, QString themeName)
function QString (line 102) | QString XDG::IconLookup::doRecursiveIconLookup(const QString &iconName, ...
function QString (line 130) | QString XDG::IconLookup::doIconLookup(const QString &iconName, const QSt...
function QString (line 164) | QString XDG::IconLookup::lookupThemeFile(const QString &themeName)
FILE: src/platform/xdg/iconlookup.h
function namespace (line 8) | namespace XDG {
FILE: src/platform/xdg/themefileparser.cpp
function QString (line 11) | QString XDG::ThemeFileParser::path()
function QString (line 16) | QString XDG::ThemeFileParser::name()
function QString (line 21) | QString XDG::ThemeFileParser::comment()
function QStringList (line 26) | QStringList XDG::ThemeFileParser::inherits()
function QStringList (line 34) | QStringList XDG::ThemeFileParser::directories()
function QString (line 52) | QString XDG::ThemeFileParser::context(const QString &directory)
function QString (line 60) | QString XDG::ThemeFileParser::type(const QString &directory)
FILE: src/platform/xdg/themefileparser.h
function namespace (line 7) | namespace XDG {
FILE: src/plugin/extensionregistry.h
function namespace (line 10) | namespace albert
FILE: src/plugin/plugininstance.cpp
class PluginInstance::Private (line 16) | class PluginInstance::Private
function QWidget (line 34) | QWidget *PluginInstance::buildConfigWidget() { return nullptr; }
function PluginLoader (line 59) | const PluginLoader &PluginInstance::loader() const { return *d->loader; }
FILE: src/plugin/pluginregistry.h
function namespace (line 8) | namespace albert {
function class (line 18) | class Plugin
FILE: src/plugin/topologicalsort.hpp
type TopologicalSortResult (line 9) | struct TopologicalSortResult
function topologicalSort (line 16) | TopologicalSortResult<T> topologicalSort(std::map<T, std::set<T>> graph)
FILE: src/query/asyncgeneratorqueryhandler.cpp
class AsyncExecution (line 12) | class AsyncExecution final : public QueryExecution
method AsyncExecution (line 21) | AsyncExecution(QueryContext &ctx, AsyncItemGenerator &&gen)
method cancel (line 32) | void cancel() override
method isActive (line 39) | bool isActive() const override { return active; }
method canFetchMore (line 41) | bool canFetchMore() const override {
method fetchMore (line 48) | void fetchMore() override
method fetchMoreTask (line 54) | QCoro::Task<> fetchMoreTask()
FILE: src/query/generatorqueryhandler.cpp
class GeneratorQueryHandlerExecution (line 15) | class GeneratorQueryHandlerExecution final : public QueryExecution
method GeneratorQueryHandlerExecution (line 33) | GeneratorQueryHandlerExecution(QueryContext &ctx, GeneratorQueryHandle...
method cancel (line 73) | void cancel() override { }
method isActive (line 75) | bool isActive() const override { return active; }
method canFetchMore (line 77) | bool canFetchMore() const override { return context.isValid() && !at_e...
method fetchMore (line 79) | void fetchMore() override
method onFetchFinished (line 94) | void onFetchFinished()
FILE: src/query/globalquery.cpp
function QString (line 10) | QString GlobalQuery::id() const { return u"globalquery"_s; }
function QString (line 12) | QString GlobalQuery::name() const { return u"Global query"_s; }
function QString (line 14) | QString GlobalQuery::description() const { return u"Runs a bunch of glob...
function QString (line 23) | QString GlobalQuery::synopsis(const QString &query) const
FILE: src/query/globalquery.h
function namespace (line 7) | namespace albert { class GlobalQueryHandler; }
function class (line 9) | class GlobalQuery : public albert::QueryHandler
FILE: src/query/globalqueryexecution.cpp
class GlobalQueryResult (line 21) | class GlobalQueryResult : public albert::RankItem
method GlobalQueryResult (line 24) | explicit GlobalQueryResult(albert::GlobalQueryHandler *h, const albert...
type MappedData (line 34) | struct MappedData {
type ReducedData (line 42) | struct ReducedData {
type Diagnostics (line 43) | struct Diagnostics {
class GlobalQueryExecution::Private (line 53) | class GlobalQueryExecution::Private
function QueryHandler (line 207) | const QueryHandler &GlobalQueryExecution::handler() const { return conte...
function QString (line 209) | QString GlobalQueryExecution::query() const
function QString (line 212) | QString GlobalQueryExecution::trigger() const { return context.trigger(); }
FILE: src/query/globalqueryexecution.h
function namespace (line 7) | namespace albert{ class GlobalQueryHandler; }
FILE: src/query/query.cpp
class Query::Private (line 13) | class Query::Private
function QString (line 66) | QString Query::trigger() const { return d->trigger; }
function QString (line 68) | QString Query::query() const { return d->string; }
FILE: src/query/queryengine.cpp
function UsageScoring (line 151) | UsageScoring QueryEngine::usageScoring() const
function QString (line 212) | QString QueryEngine::trigger(const QString &id) const
FILE: src/query/queryengine.h
function namespace (line 9) | namespace albert {
function class (line 19) | class QueryEngine : public QObject
FILE: src/query/queryhandler.cpp
function QString (line 9) | QString QueryHandler::synopsis(const QString &) const { return {}; }
function QString (line 11) | QString QueryHandler::defaultTrigger() const { return id() + QChar::Spac...
FILE: src/query/rankedqueryhandler.cpp
function ItemGenerator (line 12) | ItemGenerator RankedQueryHandler::items(QueryContext &ctx)
function ItemGenerator (line 19) | ItemGenerator RankedQueryHandler::lazySort(vector<RankItem> rank_items)
FILE: src/query/usagedatabase.cpp
function UsageDatabase (line 18) | UsageDatabase &UsageDatabase::instance()
type Activation (line 90) | struct Activation
FILE: src/query/usagedatabase.h
function class (line 13) | class UsageDatabase
FILE: src/settings/pluginswidget/pluginsmodel.cpp
function QVariant (line 74) | QVariant PluginsModel::data(const QModelIndex &index, int role) const
function ItemFlags (line 135) | ItemFlags PluginsModel::flags(const QModelIndex &idx) const
FILE: src/settings/pluginswidget/pluginsmodel.h
function class (line 8) | class PluginsModel: public QAbstractListModel
FILE: src/settings/pluginswidget/pluginssortproxymodel.h
function class (line 6) | class PluginsSortProxyModel : public QSortFilterProxyModel
FILE: src/settings/pluginswidget/pluginwidget.cpp
function QWidget (line 35) | QWidget *PluginWidget::createPluginPageHeader() const
function QWidget (line 61) | QWidget *PluginWidget::createPluginPageBody() const
function QWidget (line 85) | QWidget *PluginWidget::createPluginPageFooter() const
FILE: src/settings/querywidget/fallbacksmodel.cpp
type Column (line 16) | enum class Column {
function QVariant (line 54) | QVariant FallbacksModel::data(const QModelIndex &index, int role) const
function QVariant (line 87) | QVariant FallbacksModel::headerData(int section, Qt::Orientation orienta...
FILE: src/settings/querywidget/fallbacksmodel.h
function namespace (line 8) | namespace albert {
function class (line 13) | class FallbacksModel : public QAbstractTableModel
FILE: src/settings/querywidget/queryhandlermodel.cpp
type Column (line 14) | enum class Column { Name, Trigger, Global, Fuzzy }
function QVariant (line 47) | QVariant QueryHandlerModel::data(const QModelIndex &idx, int role) const
function QVariant (line 161) | QVariant QueryHandlerModel::headerData(int section, Qt::Orientation orie...
FILE: src/settings/querywidget/queryhandlermodel.h
function namespace (line 6) | namespace albert { class QueryHandler; }
function class (line 8) | class QueryHandlerModel : public QAbstractTableModel
FILE: src/settings/querywidget/querywidget.h
function class (line 9) | class QueryWidget : public QWidget
FILE: src/settings/settingswindow.cpp
class QHotKeyDialog (line 22) | class QHotKeyDialog : public QDialog
method QHotKeyDialog (line 26) | QHotKeyDialog(QWidget *parent) : QDialog(parent)
method event (line 35) | bool event(QEvent *event) override
FILE: src/util/color.h
function namespace (line 5) | namespace color
FILE: src/util/download.cpp
class Download::Private (line 21) | class Download::Private
function QUrl (line 39) | const QUrl &Download::url() { return d->url; }
function QString (line 41) | const QString &Download::path() { return d->path; }
function QString (line 49) | const QString &Download::error()
FILE: src/util/extensionplugin.cpp
function QString (line 9) | QString ExtensionPlugin::id() const
function QString (line 12) | QString ExtensionPlugin::name() const
function QString (line 15) | QString ExtensionPlugin::description() const
FILE: src/util/indexqueryhandler.cpp
class IndexQueryHandler::Private (line 12) | class IndexQueryHandler::Private
FILE: src/util/inputhistory.cpp
class InputHistory::Private (line 16) | class InputHistory::Private
function QString (line 79) | QString InputHistory::next(const QString &substring)
function QString (line 93) | QString InputHistory::prev(const QString &substring)
function uint (line 118) | uint InputHistory::limit() const { return d->max; }
FILE: src/util/itemindex.cpp
type StringIndexItem (line 26) | struct StringIndexItem
type Location (line 33) | struct Location
type WordIndexItem (line 40) | struct WordIndexItem
type WordMatch (line 48) | struct WordMatch
type StringMatch (line 55) | struct StringMatch
type IndexData (line 63) | struct IndexData
class ItemIndex::Private (line 98) | class ItemIndex::Private
function MatchConfig (line 233) | const MatchConfig &ItemIndex::config() { return d->config; }
FILE: src/util/itemindex.h
function ItemIndex (line 15) | ItemIndex final
FILE: src/util/levenshtein.cpp
function uint (line 11) | uint Levenshtein::computePrefixEditDistanceWithLimit(const QString &pref...
FILE: src/util/levenshtein.h
function class (line 9) | class Levenshtein
FILE: src/util/matcher.cpp
class Matcher::Private (line 12) | class Matcher::Private
method Match (line 21) | Match match(const QString &s) const
function Match (line 93) | Match Matcher::match(const QString &s) const { return d->match(s); }
FILE: src/util/messagebox.cpp
function QWidget (line 10) | inline static QWidget *mainWindow() { return QWidget::find(Application::...
FILE: src/util/networkutil.cpp
function QNetworkAccessManager (line 10) | QNetworkAccessManager &albert::network()
function QNetworkReply (line 16) | QNetworkReply *albert::await(QNetworkReply *reply)
function QString (line 29) | QString albert::percentEncoded(const QString &string)
function QString (line 32) | QString albert::percentDecoded(const QString &string)
FILE: src/util/notification.cpp
class Notification::Private (line 8) | class Notification::Private
function QString (line 23) | const QString &Notification::title() const
function QString (line 33) | const QString &Notification::text() const
FILE: src/util/oauth.cpp
function QString (line 22) | static QString generateRandomString(int length) {
function QString (line 35) | static QString generateCodeChallenge(const QString &code_verifier) {
class OAuth2::Private (line 43) | class OAuth2::Private
function QString (line 513) | const QString &OAuth2::clientId() const { return d->client_id; }
function QString (line 524) | const QString &OAuth2::clientSecret() const { return d->client_secret; }
function QString (line 535) | const QString &OAuth2::scope() const { return d->scope; }
function QString (line 546) | const QString &OAuth2::authUrl() const { return d->auth_url; }
function QString (line 557) | const QString &OAuth2::redirectUri() const { return d->redirect_uri; }
function QString (line 578) | const QString &OAuth2::tokenUrl() const { return d->token_url; }
function QString (line 589) | const QString &OAuth2::accessToken() const { return d->access_token; }
function QString (line 591) | const QString &OAuth2::refreshToken() const { return d->refresh_token; }
function QDateTime (line 593) | const QDateTime &OAuth2::tokenExpiration() const { return d->token_expir...
function QString (line 629) | const QString &OAuth2::error() const { return d->error; }
FILE: src/util/oauthconfigwidget.cpp
class OAuthConfigWidget::Private (line 15) | class OAuthConfigWidget::Private
method Private (line 29) | Private(OAuthConfigWidget *_q, OAuth2 &_oauth):
method updateGrantState (line 85) | void updateGrantState()
FILE: src/util/qiconengineadapter.cpp
class QPainter (line 5) | class QPainter
function QSize (line 14) | QSize QIconEngineAdapter::actualSize(const QSize &device_dependent_size,...
function QPixmap (line 19) | QPixmap QIconEngineAdapter::pixmap(const QSize &size, QIcon::Mode mode, ...
function QPixmap (line 24) | QPixmap QIconEngineAdapter::scaledPixmap(const QSize &device_independent...
function QString (line 34) | QString QIconEngineAdapter::iconName() { return icon_->toUrl(); }
function QIconEngine (line 36) | QIconEngine* QIconEngineAdapter::clone() const { return new QIconEngineA...
FILE: src/util/qiconengineadapter.h
function namespace (line 6) | namespace albert { class Icon; }
function class (line 8) | class QIconEngineAdapter : public QIconEngine
FILE: src/util/querypreprocessing.cpp
function QStringList (line 9) | QStringList preprocessQuery(QString s, const MatchConfig &config)
function QStringList (line 52) | QStringList preprocessLegacy(QString s)
FILE: src/util/querypreprocessing.h
function namespace (line 4) | namespace albert { class MatchConfig; }
FILE: src/util/ratelimiter.cpp
class detail::Acquire::Private (line 16) | class detail::Acquire::Private
method grant (line 22) | void grant()
class detail::RateLimiterPrivate (line 52) | class detail::RateLimiterPrivate
method uint (line 61) | inline uint remaining()
method grantNext (line 67) | inline void grantNext()
method queueAcquire (line 86) | inline void queueAcquire(Acquire *acquire)
function uint (line 107) | uint RateLimiter::delay() const
FILE: src/util/standarditem.cpp
function QString (line 24) | QString StandardItem::id() const { return id_; }
function QString (line 26) | QString StandardItem::text() const { return text_; }
function QString (line 28) | QString StandardItem::subtext() const { return subtext_; }
function QString (line 38) | QString StandardItem::inputActionText() const { return input_action_text...
FILE: src/util/systemutil.cpp
function checkPasteSupport (line 45) | static bool checkPasteSupport()
function QString (line 123) | QString albert::toQString(const filesystem::path &path)
function QString (line 134) | QString albert::runAppleScript(const QString &script)
FILE: test/test.cpp
type PluginInstanceMock (line 68) | struct PluginInstanceMock : public ExtensionPlugin{}
type PluginLoaderMock (line 70) | struct PluginLoaderMock : public PluginLoader
method PluginLoaderMock (line 76) | PluginLoaderMock(const QString &id):
method QString (line 87) | QString path() const noexcept override { return path_; }
type SyncPluginLoaderMock (line 92) | struct SyncPluginLoaderMock : public PluginLoaderMock
method load (line 96) | void load() noexcept override
method unload (line 102) | void unload() noexcept override
type AsyncPluginLoaderMock (line 108) | struct AsyncPluginLoaderMock : public SyncPluginLoaderMock
method load (line 111) | void load() noexcept override
type PluginProviderMock (line 117) | struct PluginProviderMock : public PluginProvider
method PluginProviderMock (line 120) | PluginProviderMock(vector<PluginLoader*> p) : loaders_(p){}
method QString (line 122) | QString id() const noexcept override { return "testpluginprovider"; }
method QString (line 123) | QString name() const noexcept override { return "Mock Plugin Provider"; }
method QString (line 124) | QString description() const noexcept override { return "Mock Plugin Pr...
method plugins (line 126) | vector<PluginLoader *> plugins() override { return loaders_; }
function indexMatch (line 587) | static auto indexMatch(const QStringList &item_strings,
FILE: test/test.h
function class (line 6) | class AlbertTests : public QObject
Condensed preview — 213 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (695K chars).
[
{
"path": ".clang-format",
"chars": 6570,
"preview": "---\nLanguage: Cpp\nAccessModifierOffset: -4\nAlignAfterOpenBracket: Align\nAlignArrayOfStructures: None\nAlignConsecu"
},
{
"path": ".docker/README.md",
"chars": 686,
"preview": "# Dockerfiles\n\n\n## Build\n\n```sh\ndocker build --progress=plain -f \"${path}/arch.Dockerfile\" -t albert:arch --platform lin"
},
{
"path": ".docker/arch.Dockerfile",
"chars": 1002,
"preview": "ARG BASE_IMAGE=archlinux:latest\n\nFROM ${BASE_IMAGE} AS base\nRUN pacman -Syu --verbose --noconfirm \\\n cmake \\\n gcc "
},
{
"path": ".docker/fedora.Dockerfile",
"chars": 1081,
"preview": "ARG BASE_IMAGE=fedora:latest\n\nFROM ${BASE_IMAGE} AS base\nRUN yum install -y \\\n cmake \\\n gcc-c++ \\\n libarchive-d"
},
{
"path": ".docker/ubuntu.Dockerfile",
"chars": 1498,
"preview": "ARG BASE_IMAGE=ubuntu:24.04\n\nFROM ${BASE_IMAGE} AS base\nRUN export DEBIAN_FRONTEND=noninteractive \\\n && apt-get -qq upda"
},
{
"path": ".dockerignore",
"chars": 25,
"preview": ".*\ndocumentation\n*build*\n"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 190,
"preview": "Stay civil. Inappropriate content will be removed without warning.\n\nSee also the contributing section on the [Albert web"
},
{
"path": ".github/ISSUE_TEMPLATE/1-bugreport.yml",
"chars": 1266,
"preview": "name: Bug report\ndescription: Report a bug.\nassignees: ManuelSchneid3r\nlabels: [\"Needs triage\"]\nbody:\n- type: dropdown\n "
},
{
"path": ".github/ISSUE_TEMPLATE/2-missing_terminal.yml",
"chars": 939,
"preview": "name: Missing terminal\ndescription: Report a missing terminal.\ntitle: \"Missing terminal <name>\"\nassignees: ManuelSchneid"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 422,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: Feature request\n url: https://github.com/orgs/albertlauncher/disc"
},
{
"path": ".github/stale.yml",
"chars": 2002,
"preview": "# Configuration for probot-stale - https://github.com/probot/stale\n\n# Number of days of inactivity before an Issue or Pu"
},
{
"path": ".github/workflows/ci.yml",
"chars": 8308,
"preview": "name: CI/CD\n\non:\n push:\n branches: [ \"main\", \"dev\", \"devel\" ]\n tags: '*'\n\nconcurrency:\n group: ${{ github.workfl"
},
{
"path": ".github/workflows/telegram_notify_comments.yml",
"chars": 761,
"preview": "name: Telegram Notifications\n\non:\n\n issue_comment:\n types: [created]\n\njobs:\n notify:\n\n runs-on: ubuntu-latest\n\n "
},
{
"path": ".github/workflows/telegram_notify_issues.yml",
"chars": 689,
"preview": "name: Telegram Notifications\n\non:\n issues:\n types: [opened, reopened]\n\njobs:\n notify:\n\n runs-on: ubuntu-latest\n\n"
},
{
"path": ".gitignore",
"chars": 77,
"preview": ".DS_Store\n/CMakeLists.txt.user*\n/build*\n/documentation\njustfile\n/.qtcreator\n\n"
},
{
"path": ".gitmodules",
"chars": 4145,
"preview": "[submodule \"i18n\"]\n\tpath = i18n\n\turl = https://github.com/albertlauncher/i18n.git\n\n[submodule \"lib/QHotkey\"]\n\tpath = lib"
},
{
"path": ".pre-commit-config.yaml",
"chars": 719,
"preview": "# See https://pre-commit.com for more information\n# See https://pre-commit.com/hooks.html for more hooks\nrepos:\n#- rep"
},
{
"path": "CHANGELOG.md",
"chars": 85159,
"preview": "## v34.0.10 (2026-02-13)\n\n### Features\n\n#### Plugins\n\n- **Widgets BoxModel** · Warn on icon rendering taking too long\n\n#"
},
{
"path": "CMakeLists.txt",
"chars": 21153,
"preview": "# SPDX-FileCopyrightText: 2024 Manuel Schneider\n\ncmake_minimum_required(VERSION 3.26) # Required by BUILD_LOCAL_INTERFA"
},
{
"path": "LICENSE.md",
"chars": 1766,
"preview": "Copyright 2021 Manuel Schneider\nAlbert license v1.1\n\nPersonal use in source and binary forms, with or without modificati"
},
{
"path": "README.md",
"chars": 1031,
"preview": "# Albert launcher\n\n[](https://g"
},
{
"path": "cmake/FindAlbert.cmake.in",
"chars": 380,
"preview": "# FindAlbert dummy package\n\n# This file serves the purpose to allow plugins to use find_package even if\n# they are part "
},
{
"path": "cmake/MacOSXBundleInfo.plist.in",
"chars": 2649,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "cmake/MacOSXFrameworkInfo.plist.in",
"chars": 907,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "cmake/albert-config.cmake.in",
"chars": 127,
"preview": "@PACKAGE_INIT@\n\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/@LIB_TARGETS_FILE@\")\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/@LIB_MACROS_F"
},
{
"path": "cmake/albert-macros.cmake",
"chars": 10259,
"preview": "# - Albert cmake macros\n#\n# Use albert_plugin() to add a plugin.\n#\n# albert_plugin(\n# [SOURCES ...]\n# [I18N_SO"
},
{
"path": "cmake/bundle-macos.cmake.in",
"chars": 4650,
"preview": "set(PROJECT_NAME \"@PROJECT_NAME@\") # bundle path\nset(CMAKE_PREFIX_PATH \"@CMAKE_PREFIX_PATH@\") # library lookup\nset(CMA"
},
{
"path": "dist/cliff.toml",
"chars": 1009,
"preview": "# https://git-cliff.org/docs/configuration\n\n[changelog]\ntrim = false\nconventional_commits = true\nfilter_unconventional ="
},
{
"path": "dist/cliff_template_minimal.md",
"chars": 1694,
"preview": "{% if extra.plugin_contexts -%}\n{% set_global commits = commits -%}\n{% for context in extra.plugin_contexts -%}\n{% set_g"
},
{
"path": "dist/cliff_template_rich.md",
"chars": 1936,
"preview": "{% if extra.plugin_contexts -%}\n{% set_global commits = commits -%}\n{% for context in extra.plugin_contexts -%}\n{% set_g"
},
{
"path": "dist/flatpak/README.md",
"chars": 235,
"preview": "This is a disfunctional prototype.\nFlatpak does not yet provide permissions to run albert in way that makes sense for a "
},
{
"path": "dist/flatpak/org.albertlauncher.Albert.yml",
"chars": 2094,
"preview": "app-id: org.albertlauncher.Albert\nruntime: org.kde.Platform\nruntime-version: '6.4'\nsdk: org.kde.Sdk\ncommand: bootstrap-a"
},
{
"path": "dist/macos/albert_icns.sh",
"chars": 476,
"preview": "#!/bin/sh\n\ninput_path=../../resources/albert.svg\noutput_path=output.iconset\nmkdir -p \"$output_path\"\n\n# the convert comma"
},
{
"path": "dist/macos/generate_appcast_item.sh",
"chars": 900,
"preview": "#!/usr/bin/env bash\n\nset -exu\n\nDMG_PATH=\"$1\"\nVERSION=\"$2\"\nSPARKLE_ED_PRIVATE_KEY=\"$3\"\nOUTPUT=\"$4\"\nBREW_PREFIX=\"$(brew --"
},
{
"path": "dist/xdg/albert.desktop",
"chars": 387,
"preview": "#!/usr/bin/env xdg-open\n[Desktop Entry]\nCategories=Utility;\nComment=A desktop agnostic launcher\nExec=albert --platform x"
},
{
"path": "include/albert/app.h",
"chars": 4231,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n/// \\defgroup core Core API\n/// Core c"
},
{
"path": "include/albert/asyncgeneratorqueryhandler.h",
"chars": 1835,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/queryhan"
},
{
"path": "include/albert/backgroundexecutor.h",
"chars": 3670,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QFutureWatcher>"
},
{
"path": "include/albert/desktopentryparser.h",
"chars": 3821,
"preview": "// Copyright (c) 2024-2024 Manuel Schneider\n\n#pragma once\n#include <QLocale>\n#include <QString>\n#include <albert/export."
},
{
"path": "include/albert/download.h",
"chars": 2023,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/extension.h",
"chars": 854,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/extensionplugin.h",
"chars": 900,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/fallbackhandler.h",
"chars": 670,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/frontend.h",
"chars": 1243,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/generatorqueryhandler.h",
"chars": 1670,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/queryhan"
},
{
"path": "include/albert/globalqueryhandler.h",
"chars": 1492,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/rankedqu"
},
{
"path": "include/albert/icon.h",
"chars": 13365,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/indexitem.h",
"chars": 573,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/indexqueryhandler.h",
"chars": 1899,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/inputhistory.h",
"chars": 1688,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/item.h",
"chars": 4559,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QStringList>\n#i"
},
{
"path": "include/albert/logging.h",
"chars": 897,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QLoggingCategor"
},
{
"path": "include/albert/matchconfig.h",
"chars": 787,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/matcher.h",
"chars": 3475,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QRegularExpress"
},
{
"path": "include/albert/messagebox.h",
"chars": 1597,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/networkutil.h",
"chars": 686,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/notification.h",
"chars": 1808,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/oauth.h",
"chars": 4078,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QDateTime>\n#inc"
},
{
"path": "include/albert/oauthconfigwidget.h",
"chars": 601,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/plugindependency.h",
"chars": 5098,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QCoreApplicatio"
},
{
"path": "include/albert/plugininstance.h",
"chars": 2830,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/pluginloader.h",
"chars": 1886,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/pluginmetadata.h",
"chars": 2383,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QStringList>\n#i"
},
{
"path": "include/albert/pluginprovider.h",
"chars": 673,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/extensio"
},
{
"path": "include/albert/query.h",
"chars": 1493,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/querycontext.h",
"chars": 1005,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/queryexecution.h",
"chars": 1403,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/queryhandler.h",
"chars": 2965,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/queryresults.h",
"chars": 6099,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/rankedqueryhandler.h",
"chars": 1574,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/generato"
},
{
"path": "include/albert/rankitem.h",
"chars": 1358,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/ratelimiter.h",
"chars": 848,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "include/albert/standarditem.h",
"chars": 5377,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/item.h>\n"
},
{
"path": "include/albert/systemutil.h",
"chars": 2322,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QtGlobal>\n#incl"
},
{
"path": "include/albert/telemetryprovider.h",
"chars": 413,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QJsonObject>\n#i"
},
{
"path": "include/albert/timeit.h",
"chars": 665,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n\n#pragma once\n#include <QDebug>\n#include <QString>\n#include <chrono>\n#i"
},
{
"path": "include/albert/urlhandler.h",
"chars": 744,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <albert/export.h"
},
{
"path": "include/albert/usagescoring.h",
"chars": 2103,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QString>\n#inclu"
},
{
"path": "include/albert/widgetsutil.h",
"chars": 3910,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QCheckBox>\n#inc"
},
{
"path": "resources/index.theme",
"chars": 336,
"preview": "# This is the builtin fallback theme.\n# Its purpose is to make plugin development easy.\n# Put your icons into it and que"
},
{
"path": "resources/resources.qrc",
"chars": 240,
"preview": "<RCC>\n <qresource prefix=\"/icons/fallback/scalable\">\n <file>albert-tray.svg</file>\n <file>albert.svg</f"
},
{
"path": "src/app/application.cpp",
"chars": 21591,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"application.h\"\n#include \"config.h\"\n#include \"extensionregistry.h\""
},
{
"path": "src/app/application.h",
"chars": 1478,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#pragma once\n#include \"app.h\"\n#include <QObject>\n#include <memory>\nclass Pa"
},
{
"path": "src/app/messagehandler.cpp",
"chars": 1770,
"preview": "// Copyright (c) 2024 Manuel Schneider\n\n#include \"messagehandler.h\"\n#include <QMessageBox>\n#include <QString>\n#include <"
},
{
"path": "src/app/messagehandler.h",
"chars": 169,
"preview": "// Copyright (c) 2024 Manuel Schneider\n\n#pragma once\n#include <QString>\n\nvoid messageHandler(QtMsgType type, const QMess"
},
{
"path": "src/app/pathmanager.cpp",
"chars": 1453,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"pathmanager.h\"\n#include \"logging.h\"\n#include \"app.h\"\n#include <QS"
},
{
"path": "src/app/pathmanager.h",
"chars": 445,
"preview": "// Copyright (C) 2022-2025 Manuel Schneider\n\n#pragma once\n#include <memory>\n#include <QStringList>\nclass QSettings;\n\ncla"
},
{
"path": "src/app/pluginqueryhandler.cpp",
"chars": 4375,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"icon.h\"\n#include \"pluginloader.h\"\n#includ"
},
{
"path": "src/app/pluginqueryhandler.h",
"chars": 560,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#pragma once\n#include \"indexqueryhandler.h\"\n#include <QCoreApplication>\ncla"
},
{
"path": "src/app/qtpluginloader.cpp",
"chars": 9024,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"config.h\"\n#include \"logging.h\"\n#include \"plugininstance.h\"\n#inclu"
},
{
"path": "src/app/qtpluginloader.h",
"chars": 715,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#pragma once\n#include \"pluginloader.h\"\n#include \"pluginmetadata.h\"\n#include"
},
{
"path": "src/app/qtpluginprovider.cpp",
"chars": 3061,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"logging.h\"\n#include \"qtpluginloader.h\"\n#include \"qtpluginprovider"
},
{
"path": "src/app/qtpluginprovider.h",
"chars": 771,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#pragma once\n#include \"pluginprovider.h\"\n#include <QStringList>\n#include <m"
},
{
"path": "src/app/report.cpp",
"chars": 2250,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include <QApplication>\n#include <QDir>\n#include <QFont>\n#include <QIcon>\n#"
},
{
"path": "src/app/report.h",
"chars": 91,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#include <QStringList>\n\nQStringList report();\n"
},
{
"path": "src/app/rpcserver.cpp",
"chars": 3004,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"albert/logging.h\"\n#include \"rpcserver.h\"\n"
},
{
"path": "src/app/rpcserver.h",
"chars": 463,
"preview": "// Copyright (C) 2022-2025 Manuel Schneider\n\n#pragma once\n#include <functional>\n#include <memory>\nnamespace albert { cla"
},
{
"path": "src/app/systemtrayicon.cpp",
"chars": 2794,
"preview": "// Copyright (C) 2025-2025 Manuel Schneider\n\n#include \"application.h\"\n#include \"systemutil.h\"\n#include \"systemtrayicon.h"
},
{
"path": "src/app/systemtrayicon.h",
"chars": 380,
"preview": "// Copyright (C) 2025-2025 Manuel Schneider\n\n#pragma once\n#include <memory>\nclass QSettings;\nclass QSystemTrayIcon;\nclas"
},
{
"path": "src/app/telemetry.cpp",
"chars": 5735,
"preview": "// Copyright (C) 2014-2025 Manuel Schneider\n\n#include \"app.h\"\n#include \"extensionregistry.h\"\n#include \"logging.h\"\n#inclu"
},
{
"path": "src/app/telemetry.h",
"chars": 712,
"preview": "// Copyright (C) 2014-2024 Manuel Schneider\n\n#pragma once\n#include <QDateTime>\n#include <QObject>\n#include <QTimer>\nclas"
},
{
"path": "src/app/telemetryprovider.cpp",
"chars": 155,
"preview": "// Copyright (C) 2024-2024 Manuel Schneider\n\n#include \"telemetryprovider.h\"\n\nalbert::detail::TelemetryProvider::~Telemet"
},
{
"path": "src/app/triggersqueryhandler.cpp",
"chars": 2316,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"app.h\"\n#include \"icon.h\"\n#include \"logging.h\"\n#include \"matcher.h"
},
{
"path": "src/app/triggersqueryhandler.h",
"chars": 1018,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#pragma once\n#include \"globalqueryhandler.h\"\n#include <QCoreApplication>\n#i"
},
{
"path": "src/app/urlhandler.cpp",
"chars": 135,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"urlhandler.h\"\n\n// vtable goes here\nalbert::UrlHandler::~UrlHandle"
},
{
"path": "src/common/extension.cpp",
"chars": 122,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"extension.h\"\n\n// vtable\nalbert::Extension::~Extension() = default"
},
{
"path": "src/common/item.cpp",
"chars": 893,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"item.h\"\n#include <set>\nusing namespace albert;\n\nItem::~Item() {}\n"
},
{
"path": "src/common/rankitem.cpp",
"chars": 1069,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"rankitem.h\"\nusing namespace std;\n\nalbert::RankItem::RankItem(shar"
},
{
"path": "src/config.h.in",
"chars": 382,
"preview": "// SPDX-FileCopyrightText: 2024 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\nnamespace albert\n{\nstatic"
},
{
"path": "src/frontend/frontend.cpp",
"chars": 132,
"preview": "// Copyright (c) 2024 Manuel Schneider\n\n#include \"frontend.h\"\n\n// vtable goes here\nalbert::detail::Frontend::~Frontend()"
},
{
"path": "src/frontend/session.cpp",
"chars": 723,
"preview": "// Copyright (c) 2024-2025 Manuel Schneider\n\n#include \"frontend.h\"\n#include \"query.h\"\n#include \"queryengine.h\"\n#include "
},
{
"path": "src/frontend/session.h",
"chars": 519,
"preview": "// Copyright (c) 2024 Manuel Schneider\n\n#pragma once\n#include <QObject>\n#include <vector>\n#include <memory>\nclass QueryE"
},
{
"path": "src/icon/composedicon.cpp",
"chars": 4431,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"composedicon.h\"\n#include \"networkutil.h\"\n#include <QPai"
},
{
"path": "src/icon/composedicon.h",
"chars": 1221,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"icon.h\"\n#include <QBrush>\n#include <memory"
},
{
"path": "src/icon/filetypeicon.cpp",
"chars": 820,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"filetypeicon.h\"\n#include \"systemutil.h\"\n#include <QFile"
},
{
"path": "src/icon/filetypeicon.h",
"chars": 671,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"qiconicon.h\"\n#include <filesystem>\n\nnamesp"
},
{
"path": "src/icon/graphemeicon.cpp",
"chars": 2473,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"graphemeicon.h\"\n#include \"networkutil.h\"\n#include <QApp"
},
{
"path": "src/icon/graphemeicon.h",
"chars": 908,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"icon.h\"\n#include <QBrush>\n#include <QStrin"
},
{
"path": "src/icon/icon.cpp",
"chars": 6047,
"preview": "// SPDX-FileCopyrightText: 2022-2026 Manuel Schneider\n\n#include \"icon.h\"\n#include \"composedicon.h\"\n#include \"filetypeico"
},
{
"path": "src/icon/iconifiedicon.cpp",
"chars": 5892,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"iconifiedicon.h\"\n#include \"networkutil.h\"\n#include <QPa"
},
{
"path": "src/icon/iconifiedicon.h",
"chars": 1359,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"icon.h\"\n#include <QIcon>\n#include <QBrush>"
},
{
"path": "src/icon/imageicon.cpp",
"chars": 902,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"imageicon.h\"\n#include \"systemutil.h\"\n#include <QFile>\nu"
},
{
"path": "src/icon/imageicon.h",
"chars": 692,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"qiconicon.h\"\n#include <filesystem>\n\nnamesp"
},
{
"path": "src/icon/qiconicon.cpp",
"chars": 1034,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"qiconicon.h\"\nusing namespace albert;\n\nQIconIcon::QIconI"
},
{
"path": "src/icon/qiconicon.h",
"chars": 442,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"icon.h\"\n#include <QIcon>\n\nnamespace albert"
},
{
"path": "src/icon/recticon.cpp",
"chars": 3541,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"recticon.h\"\n#include <QPainter>\n#include <QUrlQuery>\n#i"
},
{
"path": "src/icon/recticon.h",
"chars": 1101,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"icon.h\"\n#include <QBrush>\n\nnamespace alber"
},
{
"path": "src/icon/standardicon.cpp",
"chars": 1216,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"standardicon.h\"\n#include \"logging.h\"\n#include <QApplica"
},
{
"path": "src/icon/standardicon.h",
"chars": 571,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"qiconicon.h\"\n\nnamespace albert {\n\nclass AL"
},
{
"path": "src/icon/themeicon.cpp",
"chars": 904,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#include \"themeicon.h\"\n#if defined(Q_OS_UNIX) && !defined(Q_OS_MA"
},
{
"path": "src/icon/themeicon.h",
"chars": 603,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"qiconicon.h\"\n#include <QString>\n\nnamespace"
},
{
"path": "src/main.cpp",
"chars": 398,
"preview": "// Copyright (C) 2024-2025 Manuel Schneider\n\n#include <iostream>\nusing namespace std;\nnamespace albert {\nextern int run("
},
{
"path": "src/platform/mac/platform.mm",
"chars": 10906,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"logging.h\"\n#include \"platform.h\"\n#include <Cocoa/Cocoa.h>\n#includ"
},
{
"path": "src/platform/platform.h",
"chars": 301,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#pragma once\n#include <QString>\n\nnamespace platform\n{\n\nvoid initPlatform();"
},
{
"path": "src/platform/signalhandler.h",
"chars": 183,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n// See https://doc.qt.io/qt-6/unix-signals.html\n\n#pragma once\nclass SignalHa"
},
{
"path": "src/platform/unix/signalhandler.cpp",
"chars": 2637,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"logging.h\"\n#include \"signalhandler.h\"\n#include <QCoreApplication>"
},
{
"path": "src/platform/xdg/desktopentryparser.cpp",
"chars": 6345,
"preview": "// Copyright (c) 2024-2024 Manuel Schneider\n\n#include \"desktopentryparser.h\"\n#include <QFile>\n#include <albert/logging.h"
},
{
"path": "src/platform/xdg/iconlookup.cpp",
"chars": 5340,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include <QDebug>\n#include <QDir>\n#include <QFileInfo>\n#include <QIcon>\n#in"
},
{
"path": "src/platform/xdg/iconlookup.h",
"chars": 992,
"preview": "// Copyright (C) 2014-2024 Manuel Schneider\n\n#pragma once\n#include <QSize>\n#include <QStringList>\n#include <map>\n\nnamesp"
},
{
"path": "src/platform/xdg/platform.cpp",
"chars": 157,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"platform.h\"\n\nvoid platform::initPlatform(){}\n\nvoid platform::init"
},
{
"path": "src/platform/xdg/themefileparser.cpp",
"chars": 2499,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"themefileparser.h\"\n\n\nXDG::ThemeFileParser::ThemeFileParser(const "
},
{
"path": "src/platform/xdg/themefileparser.h",
"chars": 644,
"preview": "// Copyright (C) 2014-2018 Manuel Schneider\n\n#pragma once\n#include <QStringList>\n#include <QSettings>\n\nnamespace XDG {\n\n"
},
{
"path": "src/plugin/extensionregistry.cpp",
"chars": 875,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#include \"extension.h\"\n#include \"extensionregistry.h\"\n#include \"logging.h\"\n"
},
{
"path": "src/plugin/extensionregistry.h",
"chars": 1079,
"preview": "// SPDX-FileCopyrightText: 2025 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n#include <QObject>\n#inclu"
},
{
"path": "src/plugin/plugininstance.cpp",
"chars": 1990,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"plugininstance.h\"\n#include \"pluginloader."
},
{
"path": "src/plugin/pluginloader.cpp",
"chars": 195,
"preview": "// Copyright (c) 2024-2025 Manuel Schneider\n\n#include \"pluginloader.h\"\nusing namespace albert;\n\nthread_local PluginLoade"
},
{
"path": "src/plugin/pluginprovider.cpp",
"chars": 144,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"pluginprovider.h\"\n\n// vtable in lib\nalbert::PluginProvider::~Plug"
},
{
"path": "src/plugin/pluginregistry.cpp",
"chars": 13418,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"extensionregistry.h\"\n#include \"logging.h\""
},
{
"path": "src/plugin/pluginregistry.h",
"chars": 2575,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#pragma once\n#include <QObject>\n#include <QString>\n#include <map>\n#include "
},
{
"path": "src/plugin/topologicalsort.hpp",
"chars": 1893,
"preview": "// Copyright (c) 2024 Manuel Schneider\n\n#pragma once\n#include <map>\n#include <set>\n#include <vector>\n\ntemplate<class T>\n"
},
{
"path": "src/plugin.h.in",
"chars": 881,
"preview": "// SPDX-FileCopyrightText: 2024 Manuel Schneider\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#define ALBERT_PLUGIN_II"
},
{
"path": "src/query/asyncgeneratorqueryhandler.cpp",
"chars": 2180,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"asyncgeneratorqueryhandler.h\"\n#include \"logging.h\"\n#include \"quer"
},
{
"path": "src/query/fallbackhandler.cpp",
"chars": 150,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"fallbackhandler.h\"\n\n// vtable goes here\nalbert::FallbackHandler::"
},
{
"path": "src/query/generatorqueryhandler.cpp",
"chars": 6469,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"generatorqueryhandler.h\"\n#include \"logging.h\"\n#include <QCoroGene"
},
{
"path": "src/query/globalquery.cpp",
"chars": 779,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"globalquery.h\"\n#include \"globalqueryexecution.h\"\n#include <ranges"
},
{
"path": "src/query/globalquery.h",
"chars": 576,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"queryhandler.h\"\n#include <QString>\n#include <map>\nna"
},
{
"path": "src/query/globalqueryexecution.cpp",
"chars": 8359,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"color.h\"\n#include \"globalqueryexecution.h\"\n#include \"globalqueryh"
},
{
"path": "src/query/globalqueryexecution.h",
"chars": 1019,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"querycontext.h\"\n#include \"queryexecution.h\"\n#include"
},
{
"path": "src/query/globalqueryhandler.cpp",
"chars": 248,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"globalqueryhandler.h\"\nusing namespace albert;\nusing namespace std"
},
{
"path": "src/query/query.cpp",
"chars": 2409,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"query.h\"\n#include \"queryexecution.h\"\n#include \"queryhandler.h\"\n#i"
},
{
"path": "src/query/queryengine.cpp",
"chars": 11806,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"extensionregistry.h\"\n#include \"fallbackha"
},
{
"path": "src/query/queryengine.h",
"chars": 2705,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#pragma once\n#include \"globalquery.h\"\n#include \"usagescoring.h\"\n#include <Q"
},
{
"path": "src/query/queryexecution.cpp",
"chars": 271,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"queryexecution.h\"\nusing namespace albert;\n\nnamespace {\nuint query"
},
{
"path": "src/query/queryhandler.cpp",
"chars": 525,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"queryhandler.h\"\n#include <QString>\nusing namespace albert;\n\nQuery"
},
{
"path": "src/query/queryresults.cpp",
"chars": 2486,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"extension.h\"\n#include \"logging.h\"\n#include \"messagebox.h\"\n#includ"
},
{
"path": "src/query/rankedqueryhandler.cpp",
"chars": 1226,
"preview": "// Copyright (c) 2023-2025 Manuel Schneider\n\n#include \"rankedqueryhandler.h\"\n#include \"usagescoring.h\"\n#include <QCoroGe"
},
{
"path": "src/query/usagedatabase.cpp",
"chars": 5048,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"albert/logging.h\"\n#include \"usagedatabase"
},
{
"path": "src/query/usagedatabase.h",
"chars": 721,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"usagescoring.h\" // ItemKey\n#include <QString>\n#incl"
},
{
"path": "src/query/usagescoring.cpp",
"chars": 1353,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"logging.h\"\n#include \"rankitem.h\"\n#include \"usagescoring.h\"\nusing "
},
{
"path": "src/settings/pluginswidget/pluginsmodel.cpp",
"chars": 4675,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"logging.h\"\n#include \"pluginloader.h\"\n#include \"pluginmetadata.h\"\n"
},
{
"path": "src/settings/pluginswidget/pluginsmodel.h",
"chars": 684,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#pragma once\n#include <QAbstractListModel>\nclass PluginRegistry;\nclass Plug"
},
{
"path": "src/settings/pluginswidget/pluginssortproxymodel.cpp",
"chars": 1169,
"preview": "// Copyright (c) 2024-2024 Manuel Schneider\n\n#include \"albert/app.h\"\n#include \"pluginssortproxymodel.h\"\n#include <QSetti"
},
{
"path": "src/settings/pluginswidget/pluginssortproxymodel.h",
"chars": 408,
"preview": "// Copyright (c) 2024-2024 Manuel Schneider\n\n#pragma once\n#include <QSortFilterProxyModel>\n\nclass PluginsSortProxyModel "
},
{
"path": "src/settings/pluginswidget/pluginswidget.cpp",
"chars": 6378,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"messagebox.h\"\n#include \"pluginloader.h\"\n#include \"pluginmetadata."
},
{
"path": "src/settings/pluginswidget/pluginswidget.h",
"chars": 664,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#pragma once\n#include <QWidget>\nclass PluginRegistry;\nclass PluginsModel;\nc"
},
{
"path": "src/settings/pluginswidget/pluginwidget.cpp",
"chars": 6349,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"plugininstance.h\"\n#include \"pluginloader.h\"\n#include \"pluginmetad"
},
{
"path": "src/settings/pluginswidget/pluginwidget.h",
"chars": 588,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#pragma once\n#include <QWidget>\nclass Plugin;\nclass PluginRegistry;\nclass Q"
},
{
"path": "src/settings/querywidget/fallbacksmodel.cpp",
"chars": 4589,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#include \"fallbackhandler.h\"\n#include \"fallbacksmodel.h\"\n#include \"icon.h\"\n"
},
{
"path": "src/settings/querywidget/fallbacksmodel.h",
"chars": 1227,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#pragma once\n#include <QAbstractTableModel>\n#include <vector>\nclass QIcon;\n"
},
{
"path": "src/settings/querywidget/queryhandlermodel.cpp",
"chars": 6145,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#include \"globalqueryhandler.h\"\n#include \"queryengine.h\"\n#include \"queryhan"
},
{
"path": "src/settings/querywidget/queryhandlermodel.h",
"chars": 832,
"preview": "// Copyright (c) 2022-2024 Manuel Schneider\n\n#pragma once\n#include <QAbstractTableModel>\nclass QueryEngine;\nnamespace al"
},
{
"path": "src/settings/querywidget/querywidget.cpp",
"chars": 2643,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"fallbacksmodel.h\"\n#include \"queryengine.h\"\n#include \"queryhandler"
},
{
"path": "src/settings/querywidget/querywidget.h",
"chars": 382,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#pragma once\n#include \"ui_querywidget.h\"\n#include <QWidget>\nclass QueryEngi"
},
{
"path": "src/settings/querywidget/querywidget.ui",
"chars": 6715,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QueryWidget</class>\n <widget class=\"QWidget\" name=\"Que"
},
{
"path": "src/settings/settingswindow.cpp",
"chars": 8184,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"application.h\"\n#include \"frontend.h\"\n#include \"messagebox.h\"\n#inc"
},
{
"path": "src/settings/settingswindow.h",
"chars": 724,
"preview": "// Copyright (c) 2014-2024 Manuel Schneider\n\n#pragma once\n#include \"ui_settingswindow.h\"\n#include <QWidget>\nclass Applic"
},
{
"path": "src/settings/settingswindow.ui",
"chars": 10965,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>SettingsWindow</class>\n <widget class=\"QWidget\" name=\""
},
{
"path": "src/util/color.h",
"chars": 488,
"preview": "// SPDX-FileCopyrightText: 2022-2025 Manuel Schneider\n\n#pragma once\n\nnamespace color\n{\ninline constexpr const char* blac"
},
{
"path": "src/util/download.cpp",
"chars": 4210,
"preview": "// Copyright (c) 2025-2025 Manuel Schneider\n\n#include \"download.h\"\n#include \"logging.h\"\n#include \"networkutil.h\"\n#includ"
},
{
"path": "src/util/extensionplugin.cpp",
"chars": 482,
"preview": "// Copyright (c) 2024-2025 Manuel Schneider\n\n#include \"extensionplugin.h\"\n#include \"pluginloader.h\"\n#include \"pluginmeta"
},
{
"path": "src/util/indexitem.cpp",
"chars": 208,
"preview": "// Copyright (c) 2021-2024 Manuel Schneider\n\n#include \"indexitem.h\"\nusing namespace albert;\nusing namespace std;\n\nIndexI"
},
{
"path": "src/util/indexqueryhandler.cpp",
"chars": 1282,
"preview": "// Copyright (c) 2023-2024 Manuel Schneider\n\n#include \"indexqueryhandler.h\"\n#include \"itemindex.h\"\n#include \"querycontex"
},
{
"path": "src/util/inputhistory.cpp",
"chars": 3109,
"preview": "// Copyright (c) 2022-2025 Manuel Schneider\n\n#include \"app.h\"\n#include \"inputhistory.h\"\n#include \"logging.h\"\n#include <Q"
},
{
"path": "src/util/itemindex.cpp",
"chars": 12414,
"preview": "// Copyright (c) 2021-2024 Manuel Schneider\n\n#include \"item.h\"\n#include \"itemindex.h\"\n#include \"levenshtein.h\"\n#include "
},
{
"path": "src/util/itemindex.h",
"chars": 1081,
"preview": "// SPDX-FileCopyrightText: 2024 Manuel Schneider\n\n#pragma once\n#include <QString>\n#include <albert/export.h>\n#include <a"
},
{
"path": "src/util/levenshtein.cpp",
"chars": 5758,
"preview": "// Copyright (c) 2021-2024 Manuel Schneider\n\n#include \"levenshtein.h\"\n#include <algorithm>\n#include <iostream>\n#include "
},
{
"path": "src/util/levenshtein.h",
"chars": 1126,
"preview": "// Copyright (c) 2021-2024 Manuel Schneider\n\n#pragma once\n#include <QString>\n#include <vector>\n\n// Fast allocation-avoid"
},
{
"path": "src/util/matcher.cpp",
"chars": 2766,
"preview": "// SPDX-FileCopyrightText: 2024 Manuel Schneider\n\n#include \"levenshtein.h\"\n#include \"matchconfig.h\"\n#include \"matcher.h\""
},
{
"path": "src/util/messagebox.cpp",
"chars": 1214,
"preview": "// Copyright (c) 2025-2025 Manuel Schneider\n\n#include \"application.h\"\n#include \"frontend.h\"\n#include \"messagebox.h\"\n#inc"
},
{
"path": "src/util/networkutil.cpp",
"chars": 833,
"preview": "// Copyright (c) 2025-2025 Manuel Schneider\n\n#include \"networkutil.h\"\n#include <QDateTime>\n#include <QEventLoop>\n#includ"
}
]
// ... and 13 more files (download for full content)
About this extraction
This page contains the full source code of the albertlauncher/albert GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 213 files (641.0 KB), approximately 164.3k tokens, and a symbol index with 356 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.