-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Wayland autotype implementation (using xdg-desktop-portal) #10905
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Wayland autotype implementation (using xdg-desktop-portal) #10905
Conversation
|
Geez sure is nice when you don't have to muck with emulated key presses! I wonder if we could use this same method for X11 as well, do you know? |
Technically it should, as long as there's a desktop portal running that works on it, so I have a feeling KDE and GNOME would, but I don't think there's a generic portal that supports RemoteDesktop for other X11 WMs. Also, it is very nice I can just chuck keysyms at it without worrying about reversing keymaps and whatnot :) |
|
Worth a try to see if that fixes some of our awkward issues with international keyboard layout. |
|
Very nice, I will give this a spin! |
|
Applied a small patch to build on Debian bookworm and to fix some assumptions about a window title existing and the shortcut crash and to disable minimize behavior if the main window is inactive, didn't test X11 still works: https://gist.github.com/hifi/e32c03f7b131cfc9e2d38c1ca11764fe I registered this command with KDE to perform globally: Good work! I will stay on Wayland for now as this implements everything I need. Just needs some cleanups. |
|
Thanks @TheConfuZzledDude for the PR I was able to build this branch on my Tuxedo OS 3 (Plasma 6.0.5) after applying @hifi ’s patch. If I perform AutoType from the KeePassXC window, that one does not get minimized. That is due to the Assigned a global keyboard shortcut to The only issue I’m having is that when I switch keyboard layout, the autotype changes. On my default fr oss layout it types correctly. Changing to fr bepo_afnor or us intl types wrong characters. It is actually pressing the same keys on the keyboard, but now they have different characters. |
|
My bad about minimizing not working as I didn't test it properly. The intention was to not minimize the main window on global auto-type if the main window isn't the active window (aka entry auto-type). Also it's a bit funny keyboard layouts are still an issue as they are a nightmare on X11. |
You know I really would hope that the desktop portal would be able to query the keymap correctly, but I guess not. I think that using So I'd rather stick with this and maybe drop a question to the portal maintainers about whether they should be querying the current keymap when we request a keysym (or if we should do the exact same reverse mapping just with 200% extra effort) |
|
We should absolutely be pushing this onto the portal maintainers to handle. Direct query of the keymap or have them align the key maps accordingly between apps. I say keep current implementation and caveat that it only applies to keymaps that are largely US layout based. |
|
@Zahrun If you'd like a workaround for now, you can set up keyboard shortcuts in the KDE settings to switch layout to a default pc105 keyboard layout, and one to switch to the previous layout. Then, set the default auto-type sequence for your group to press the respective shortcuts |
|
I've been using this for a couple of days now and it's been working very well in practice with the known caveats. @TheConfuZzledDude Regarding keymap, does it make a difference if you start the remote desktop portal at the time of starting Auto-Type? If it helps then we could make it do the initial authorization for remote desktop on startup but immediately close the portal so that it can reopen it on demand to use the current keymap. |
|
@droidmonkey I also think that the layout management issue should be raised on the desktop portal side. @TheConfuZzledDude thank you for the workaround suggestion. I have a lot of custom auto-type sequences, so I prefer to switch layout, then do the auto-type, and then switch back manually. I'm actually currently using a script to do that with KPUInput in KeePass2 in mono. I'll adjust it to work with your implementation in KeePassXC. I hope one day the autotype will work with any layout configuration. @hifi In my experience, it does not matter in which layout I am when starting the portal. It seems to be always using fr oss, which is the layout I have in SDDM and in the ttys. It's not even the first layout in the layout setting list inside Plasma. EDIT: I am able to reproduce the keyboard layout issue with KDE Connect when typing from my Android device to the Plasma desktop, through xdg-desktop-portal, the keyboard layout issue is also happening. |
|
I created an issue on the KDE side for xdg-desktop-portal-kde at https://bugs.kde.org/show_bug.cgi?id=489021 |
Thanks! I was thinking of doing that myself, but I think I might post it on https://invent.kde.org/plasma/xdg-desktop-portal-kde/-/issues because it seems more active for the desktop portal Regardless, I'm going to try and clean this up a bit in the next week |
|
I opened the issue on bugs.kde.org due to the following guideline. Apart from that, I have a suggestion for the feature. Currently, when we open KeePassXC, it directly asks for Remote Control permission. New users might get confused by that. I think it would be good to display a message "We will ask for permission, this is for autotype feature". Or even give the option yes/no. Or probably best, ask for permission only if the user asks for an autotype to be done. And then keep the token. |
It could just request the remote desktop portal when being triggered and then keep it open after that until next restart. There's no need to open the portal at all if the user never uses auto-type. That's very likely for a lot of people who mostly only use the browser integration. |
|
@TheConfuZzledDude I think your input is needed at https://bugs.kde.org/show_bug.cgi?id=489021 :
|
|
Btw, does the desktop portal specification specify how it should deal with different keyboard mappings? If not, then this should be brought up with them as well. Otherwise, you'll have to chase each DE to get them to do what is needed. |
Just commented, found where the issue was, depending on how fast I get through the rest of this, I may go fix it myself if it's not by the time I'm done
Not really, the remote desktop documentation is kinda sparse apart from what's implied from the method name. I did some research, and it seems like the protocol was defined for/based on Mutter's remote desktop portal, so I think that's probably the "canonical" behaviour
That is the plan, but there's a few issues to work around, and might require changing the autotype plugin behaviour in general. When you start a remote desktop session you get a restore token that can be used to restore the session without prompt in the future, and this could be retained between launches as well. The question for that then is whether you should only be prompted the first time ever, and if so, where should the restore token be stored? I guess it should be kept secure since another program could steal it and silently start controlling your inputs or something, but that means probably storing it in the database which seems kinda meh. |
|
I like the idea of one-time ask (after first database unlock maybe) and store the token in the database. A new database requires a new token. This would emulate the behavior of the browser plugin. The downside would be if you used your database on multiple Linux wayland boxes. So you may need to add the computer name to the token storage key. |
|
is there any progress here? can i help with testing? |
d37e8b1 to
d6372c4
Compare
|
Did some quick checks for the minimizing issue as I don't want the main window to be minimized when global auto-type is being performed which matches the X11 behavior. Because a Wayland implementation cannot get the active window the behavior from KeePassXC is to always minimize our own if the window is unknown which should only happen with per-entry Auto-Type. The safety checks for focus loss prevention are also broken on Wayland as it's impossible to know which window we're typing to - except to our own - which is also not working. I'm currently running with this change to the Wayland platform which emulates it enough to get the correct behavior for both per-entry Auto-Type and global without touching the Auto-Type implementation itself and it also prevents typing to the main KeePassXC window if you re-focus it by accident during the sequence: #include <QApplication>
...
WId AutoTypePlatformWayland::activeWindow()
{
// If we have our own window focused, return something else to stop sequence
if (qApp->activeWindow()) {
return 2;
}
// Emulate active window detection by returning non-zero window
return 1;
}Own window detection could be moved to the main Auto-Type executor to also check for our own focus instead of just the active window changing from the platform executor but on that side it looks redundant. The only hack I have on top of this is the platform check on registering global shortcut to prevent the crash on the current head of this branch. |
698bf61 to
2f03e4f
Compare
|
This fails miserably with extended ascii and many symbols. I suspect that is because of the use of the X11 keymap lookups. Will have to implement lookups to XKB keysym to move this forward. |
a5c6e10 to
fc1bd20
Compare
|
Nicolas Felas from KDE is proposing a solution for the support of multiple layout in the portal at https://invent.kde.org/plasma/xdg-desktop-portal-kde/-/merge_requests/342 which would send the keysym instead of the key code. |
I also test this PR and use it daily, it works well. The command and script shortcut work for me, like the picture above. Same I'm troubled because the "request to control" window pops up every time I start up, and I found no "trust always" button for it. This PR has been so long and does well for wayland users, so why hasn't it been merged yet? |
|
I have tried this pr, using
|
|
I had this in the try also for quite a while already (needed a few adjustments to get it to build on my machine, see https://github.com/rsudev/keepassxc/tree/autotype-wayland-tryout, also rebased on latest develop) and it works well for me (with manual searching). |
The portal and KWin fixes just landed. Should be out with Plasma 6.5. |
|
Excellent, will pick this one back up |
fc1bd20 to
79fe263
Compare
|
My issue #12693 got closed as duplicate of this. I don't think the idea is quite the same but I would still like to bring my idea into this discussion. Instead of diving into the autotype nightmare on wayland, it would be awesome if we could use the same little dialog that pops up to just copy the password/username instead of having it autotype. On X11 the shortcut for that was Ctrl+Shift+1 and +2 but the normal shortcuts (Ctrl+C for password and Ctrl+B for username) would be way better to use. Also, the dialog should close when copied the username or password. I would test this PR but unfortunately I got the same issue as @LazyStability under Debian Testing + GNOME. Just nothing happens when sending the d-bus message. If I can somehow provide logs for this issue just tell me. |
|
That is exactly what this PR does |
| if (!m_inGlobalAutoTypeDialog.tryLock()) { | ||
| return; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems to be the error why the dbus message is not working in GNOME. I'm not that familiar with Qt but it seems like the code is trying to get a lock already in the if-statement before this one. Just removing these lines fixes the code for Gnome. However, I don't know if just removing it has other side effects
I upgraded to Plasma 6.5.2 and can confirm the autotype from this PR (commit bfb6e95) now works in any and every 3 keyboard layouts that I use 🥳 |




Fixes #2281
This is a work-in-progress attempt to implement auto-type on Wayland, using the RemoteDesktop portal. Caveats currently include:
All testing so far I've done on KDE Plasma 6.1, and the core functionality seems to work great there. Testing other platforms is a bit annoying to do, so I'd appreciate people trying it and giving feedback
Screenshots
Testing strategy
Type of change