-
Notifications
You must be signed in to change notification settings - Fork 212
Open
Milestone
Description
This is a tracking issue for the upcoming v6 release that we have been working hard 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
- 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 says545 files changed, 11479 insertions(+), 29372 deletions(-)
- Many Extension API improvements to make it easier to write extensions with less code (more on this TBA).
- Lots of other smaller improvements and bug fixes.
- 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 to set up and run.
To see what else is planned, see the: milestone (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. feat: replace keybinder with DE-wrappers #1256 fa16d93 4570ba4
- BREAKING: Changed the functionality of the "jump keys" to select, but not launch the item (Change 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 (Make "Launch at Login" wrap 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).
- The
- 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 Remove "Blacklisted App Dirs" option #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 aroundgapplication launch io.ulauncher.Ulauncher
(Switch to Gtk.Application and makeulauncher
command "toggle" by default #988, feat: dbus activatable #1164, d90b89f 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 Fix for Ulauncher dialog not getting keyboard focus #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 (fuzzy matching rewrite using new function get_matching_blocks() #827 and de1cd32).
- We now also strip accents (diacritics) before fuzzy searching (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) (Search now also searches app descriptions, albeit with lower priority #938) and keywords (Include keywords when searching for application. #1012)
- Results are also slightly weighted by launch count, to favor your commonly launched apps feat(search): weight apps by launch count #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 (Rewrite apps logic using Gio.DesktopAppInfo.get_all() #835).
- Ulauncher now uses Unix sockets instead of Websockets to communicate with extensions (Unix Socket Implementation #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 feat: Try to use wlr-layer-shell protocol on wayland #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 Remove the no-shadow setting #1149 and Black borders when the compositor is closed in v6 #1235 for details.
- We have replaced all our usage of pickle with JSON (safer, faster and more consistent). Switch state files and extensions to be stored as JSON instead of pickle #849 refactor: switch extension message format from pickle to json #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 (Remove pyxdg dependency and switch to store state files in XDG_STATE_HOME #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) (Argument to shell commands get %s instead of the real argument #389) - Added support (X11 only) to raise the app if it's already running and has a window, instead of launching a new one (Try to activate app before launching #979)
- The result view now supports scrolling if the amount of items is higher than the window height allows (Scrollable result list view #968)
- Ulauncher now uses your icon theme for the media icons instead of supplying it's own icons (Replace custom file browse mode icons with user theme 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 (Refactor preferences window #998). It is still a web view inside though.
- The calculator mode got several improvements.
- Formats the output according to the locale (Formatting the result with locale for calc mode #937)
- Improve the partial query handling and round the output to at most 15 decimals (V6 calc improvements #1014)
- Support trigonometric functions and constants (Calculator: Add trigonometric methods and constants #1015)
- Support modulus (Add mod operator support #999)
- Added setting to customize the jump keys and included Alt+0 in the defaults (allow customized or alternative jump (shortcut) keys instead of Alt+<number> #964 and Add Alt+0 (Alt+zero) as part of the results shortcuts #950)
- The optional app indicator (tray icon) now supports activating the launcher with a middle click add "Show Ulauncher" menu item to tray menu and set it as secondary target #1069, or left click if you install a recent version of XApp AppIndicator: Support separating between right and left clicks #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 does, but without needing an extension (3601dfd).
- You can now move the Ulauncher window by dragging it (Add functionality to drag the main window and Preferences window to move them #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 bothcss_file_gtk
andcss_file_gtk_3.20+
(old themes specifying both ways will remain to work the same way) (Simplify CSS themes by removing GTK 3.20 support #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) (Remove semver.py and implement a much simpler version checker #859).
- BREAKING: versions.json is ignored by Ulauncher v6, in favor of git tags like
apiv3
orapiv3.1
etc Completely remove versions.json support #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 methodsget_name()
,get_keyword()
,get_icon()
. Just use the propertiesname
,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.*
andapi.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 (Extension client: Use a new thread for each extension event listener invocation #1113)
- Extension event binding has been simplified to reduce boilerplate code (Automatic event binding #936, Pass custom arguments directly to extension's event listener methods #1057, Implement triggers #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 thePreferencesEvent
. The PreferencesEvent still exists for backward compatibility, but we recommend to simply use the class__init__
now (see Load extension preferences directly in __init__ #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. Implement triggers #1097- Triggers can now have custom icons: Allow overriding extension icon at the keyword level. #817
- The new method
on_input
that replacesKeywordQueryEvent
does not inherit the API suggestion: add event.get_keyword_id() #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: Rework extension keyword #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) feat(ext_remote): use git if installed to support any repo #1203
- Extension icons can now be themed icon names like "edit-paste" rather than just image files (Extension icons should support system icons #803).
- RenderResultListAction is now optional. You can return a list (or yield results d1ae619) directly instead where you previously would use it (Support list as a shortcut/alias to RenderResultListAction #923)
- Simplified the Result class names from
ExtensionResultItem
andExtensionSmallResultItem
to justResult
(set the a propertycompact
toTrue
to use the smaller template. Merge Result classes (Result, SearchableResult, SmallResult, ExtensionResult, ExtensionSmallResult) #1118 Merge Result classes (and glade ui files) #1120 - Simplified the Extension API so you can import all the modules you need directly from
ulauncher.api
(Rename *ResultItem to just *Result #934, 741ebae) - Add support for optional Installation instructions in the manifest (for missing dependencies like system commands) Add help/instructions text in the manifest (show message in Extension Preferences after installing the extension) #805
- Fixed extension preferences type
text
type to show as a textarea (f8bc100) - Added extension preferences type
checkbox
andnumber
(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 nowapi_version
(again)developer_name
is nowauthors
- We no longer ask for a manifest "description", as that wasn't really used Remove unused property "description" from manifest #1083 (preferences and triggers still uses descriptions, but the manifest root doesn't have this field)
preferences
is now a dictionary Change manifest.preferences to a dictionary #1085 and optional as triggers (aka "type": "keyword") has been moved out to their own separate placetriggers
Implement triggers #1097query_debounce
is now specified directly in the manifest root asinput_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.
RedBearAK, lorenzleutgeb, ctwhome, BharatKalluri, four43 and 22 moreiago-lito, LinuxOnTheDesktop, jrahmatzadeh, lorenzleutgeb, RedBearAK and 30 moremattalxndr, muhammad-saleh, tomasnorre, cheap-glitch, Saghen and 14 more
Metadata
Metadata
Assignees
Labels
No labels