This is a tracking issue for the upcoming v6 release that we have been working h…ard on. Subscribe to this issue to be notified of the v6 development, as we are closing issues as they get fixed for the v6 branch (now the main branch).
### What has been done
1. Lots of refactoring, and rewrites to internal parts of Ulauncher that caused bugs, inconsistencies, performance issues, or were holding us back from fixing issues, adding features or just made it very hard to work with Ulauncher in general. We got rid of a total of 7 dependencies (in the Debian package). It's faster and lighter on your system resource usage, because of taking better advantage of the fast and capable GTK APIs, Unix sockets, and many smaller performance improvements. It's also significantly easier to build and contribute to Ulauncher now as well. These changes are too many and too complex to detail here. `git diff --shortstat` as of writing this says `545 files changed, 11479 insertions(+), 29372 deletions(-)`
2. Many Extension API improvements to make it easier to write extensions with less code (more on this TBA).
3. Lots of other smaller improvements and bug fixes.
4. Removed a couple of features that were causing more issues than they solved, and changed the behavior of some others to be more intuitive, performant, compatible or to work enable planned future changes.
To test Ulauncher v6, follow the [instructions](https://github.com/Ulauncher/Ulauncher/blob/v6/CONTRIBUTING.md) to set up and run.
To see what else is planned, see the: [milestone](https://github.com/Ulauncher/Ulauncher/milestone/7) (note that the milestone is subject to change, incomplete and doesn't include smaller things like updating our documentation, website and extension website).
### Ulauncher application changes
* **BREAKING**: Dropped support for Python versions older than 3.8.
* **BREAKING**: Dropped support for GTK+ versions older than 3.22.
* **BREAKING**: Replaced the previous hotkey binding library (X11 only) with custom desktop environment wrappers for Gnome, Elementary and Budige, XFCE and KDE/Plasma, and instructions in the preferences window for other desktops. #1256 fa16d93d8fef5b7b16194d1d856085184c0f24f3 4570ba473b155772bfd42446847d60525373a1f4
* **BREAKING**: Changed the functionality of the "jump keys" to select, but not launch the item (#965)
* **BREAKING**: "Launch at Login" is now re-implemented using systemd instead of XDG autostart (#808)
* The `--hide-window` CLI option is now renamed to `--daemon`. `--hide-window` is now an invalid option that will cause Ulauncher not to start. This is so that old XDG autostart files won't be conflicting with the new implementation (6f39063).
* **BREAKING**: Removed "Blacklisted Apps Dirs" feature. This was previously needed mostly for performance reasons because we were monitoring desktop application entries (we we no longer need to do that as of #834). Let us know though if you find after having tested Ulauncher v6, that you still need this setting.
* Ulauncher is now a implemented as a dbus activatable single instance (SingleMainWindow) GTK.Application instead of separate windows and DBus listeners, and as a result of this `ulauncher-toggle` is just a wrapper around `gapplication launch io.ulauncher.Ulauncher ` (#988, #1164, d90b89fca336efa3c265d6b051da46a2a014fd2b and many more)
* These changes fixes the issues with focus stealing that previously required an workaround that only worked for X11 and was still unreliable #1128
* This in turn also changed the `ulauncher-toggle` command to always activate the window, rather then actually toggling it.
* The fuzzy search logic and the highlighter is now rewritten to use a new internal method to get matching blocks (using python-Levenstein), which is both faster and much better than before (#827 and de1cd32).
* We now also strip accents (diacritics) before fuzzy searching (#855)
* Search now also includes the app description (a.k.a the "comment" field in the desktop entry files) (#938) and keywords (#1012)
* Results are also slightly weighted by launch count, to favor your commonly launched apps #1175
* Ulauncher now uses the GTK APIs to fetch the desktop apps, instead of handling this ourselves on a low level. This allowed us to simplify our logic and remove 1.5+K lines of code, one dependency, one runtime process, and many sources of bugs (#835).
* Ulauncher now uses Unix sockets instead of Websockets to communicate with extensions (#822). This rewrite is a major improvement for performance and security, and it's fully backward compatible.
* Ulauncher now support wlr-layer-shell protocol to allows positioning and displaying over fullscreen windows #1172
* We now auto-detect and handle desktops without a compositor cases without needing the "--no-window-shadow" CLI flag. If you still get the black borders issue please let us know though. See #1149 and #1235 for details.
* We have replaced all our usage of pickle with JSON (safer, faster and more consistent). #849 #1240
* Configuration files have been moved. We now adopted the new [XDG_STATE_HOME(https://www.reddit.com/r/linux/comments/ny34vs/new_xdg_state_home_in_xdg_base_directory_spec/) spec (#846). Note that Ulauncher v6 will migrate your old configuration files the first time you launch it, so this is not a breaking change.
* Script shortcuts now support `%s` to access the argument, which means if you use `%s` in your shell scripts code and don't want this you have to change to something else (like using f-strings in python) (#389)
* Added support (X11 only) to raise the app if it's already running and has a window, instead of launching a new one (#979)
* The result view now supports scrolling if the amount of items is higher than the window height allows (#968)
* Ulauncher now uses _your_ icon theme for the media icons instead of supplying it's own icons (#806).
* Ulauncher's Preferences behaves like a standard GTK window that has a header bar that you can drag it with, resize, maximize etc (#998). It is still a web view inside though.
* The calculator mode got several improvements.
* Formats the output according to the locale (#937)
* Improve the partial query handling and round the output to at most 15 decimals (#1014)
* Support trigonometric functions and constants (#1015)
* Support modulus (#999)
* Added setting to customize the jump keys and included Alt+0 in the defaults (#964 and #950)
* The optional app indicator (tray icon) now supports activating the launcher with a middle click #1069, or left click if you install a recent version of XApp #1075
* `Ulauncher` can now take an optional argument to set the Ulauncher query
`gapplication action io.ulauncher.Ulauncher set-query "'hello'"`
* For Gnome Desktop users, the settings (ex "Sound" are now included by default as apps, providing the same functionality as the extension [ulauncher-gnome-settings](https://github.com/friday/ulauncher-gnome-settings) does, but without needing an extension (3601dfd).
* You can now move the Ulauncher window by dragging it (#957) (seemingly this is broken currently).
### Theme changes
* Since we removed the support for ancient GTK 3.18 you can specify only `css_file_gtk` to target GTK 3.20+, rather than needing both `css_file_gtk` and `css_file_gtk_3.20+` (old themes specifying both ways will remain to work the same way) (#836).
### Extension changes
Most extensions that runs in Ulauncher v5 now should run in Ulauncher v6 as well. Almost all changes we made are backwards compatible. The exceptions are if the extension used APIs that were not meant for extensions to use.
* **BREAKING**: Simplified the Ulauncher API version by dropping the patch version. While this was made to be compatible with the previously documented ways to specify the version, the new implementation doesn't support all variants of the semver contraints that the old one did (this is very unlikely to affect extensions) (#859).
* **BREAKING**: versions.json is ignored by Ulauncher v6, in favor of git tags like `apiv3` or `apiv3.1` etc #1091
* **BREAKING**: The old extension debugging instructions are no longer supported (we made it easy to install from a local git repository instead, see below).
* **BREAKING**: Removed `Result` getter methods `get_name()`, `get_keyword()`, `get_icon()`. Just use the properties `name`, `keyword`, `icon` directly if you need to access properties from the result (38e8792).
* **BREAKING**: The new reworked `Result` class now no longer support positional parameters (note that this feature was never documented to begin with, and I have found no extensions that used this).
* **BREAKING**: Moved many APIs extensions shouldn't have had access to like (`api.server.*`and `api.shared.action.LaunchAppAction`)
* **BREAKING**: Event listeners are now triggered in a separate thread per call. For most this is will just work and make extensions run faster, but if your extension really has to be blocking/transactional you have to work around this (#1113)
* Extension event binding has been simplified to reduce boilerplate code (#936, #1057, #1097)
* Extension preferences are now loaded and available directly when the extension object is created (as a dict `self.preferences`). Previously they were loaded into the same property and format, but after the extension was initialized via the `PreferencesEvent`. The PreferencesEvent still exists for backward compatibility, but we recommend to simply use the class `__init__` now (see #1047)
* We changed the terminology and APIs for "Triggers". These were previously defined as "preferences" with `type` "keyword" in the manifest. But this was both confusing and a limiting factor for them. #1097
* Triggers can now have custom icons: #817
* The new method `on_input` that replaces `KeywordQueryEvent` does not inherit the #284 issue, and does not use any custom Ulauncher data type for the argument. Just "input text" and "keyword id" (both strings). For old extensions in Ulauncher v6 this issue has been solved in a different way: #1056
* Our extension installer has been internally rewritten:
* Uses git repository discover references instead of the rate-limited GitHub API.
* Supports installing from GitHub, GitLab, and Codea-compatible remote repos (like Codeberg)
* Supports installing from any other local or remote repo, but only when the user has git installed (git is not a Ulauncher dependency) #1203
* Extension icons can now be themed icon names like "edit-paste" rather than just image files (#803).
* RenderResultListAction is now optional. You can return a list (or yield results d1ae619b7a042aca0ed7f9c4d0b343bccd4b164e) directly instead where you previously would use it (#923)
* Simplified the Result class names from `ExtensionResultItem` and `ExtensionSmallResultItem` to just `Result` (set the a property `compact` to `True` to use the smaller template. #1118 #1120
* Simplified the Extension API so you can import all the modules you need directly from `ulauncher.api` (#934, 741ebae87234aa87a54d38b1a8fd5e89b103b328)
* Add support for optional Installation instructions in the manifest (for missing dependencies like system commands) #805
* Fixed extension preferences type `text` type to show as a textarea (f8bc100)
* Added extension preferences type `checkbox` and `number` (d675036, 39811bb)
* The extension manifest has gone through many spec changes. The old format(s) are still supported, but we reformat it internally:
* `required_api_version` is now `api_version` (again)
* `developer_name` is now `authors`
* We no longer ask for a manifest "description", as that wasn't really used #1083 (preferences and triggers still uses descriptions, but the manifest root doesn't have this field)
* `preferences` is now a dictionary #1085 and optional as triggers (aka "type": "keyword") has been moved out to their own separate place `triggers` #1097
* `query_debounce` is now specified directly in the manifest root as `input_debounce` because we no longer use the terminology "query" for the extension input triggers
* "Extension actions" have been simplified so you can now use simple data types instead:
* `DoNothingAction` --> `True`
* `HideWindowAction()` --> `False`
* `SetUserQueryAction("string")` --> `"string"`
* All other actions are represented as JSON objects.