Background: I'm working on a piece of software called ActivityWatch that logs what you do on your computer. Basically an attempt at addressing some of the issues with: RescueTime, selfspy, arbtt, etc.
One of the core things we do is log information about the active window (class and title). In the past, this has been done using on Linux using xprop and now python-xlib without issue.
But now we have a problem: Wayland is on the rise, and as far as I can see Wayland has no notion of an active window. So my fear is that we will have to implement support for each and every desktop environment available for Wayland (assuming they'll provide the capability to get information about the active window at all).
Hopefully they'll eventually converge and have some common interface to get this done, but I'm not holding my breath...
I've been anticipating this issue. But today we got our first user request for Wayland support by an actual Wayland user. As larger distros are adopting Wayland as the default display server protocol (Fedora 25 is already using it, Ubuntu will switch in 17.10 which is coming soon) the situation is going to get more critical over time.
Relevant issues for ActivityWatch:
There are other applications like ActivityWatch that would require the same functionality (RescueTime, arbtt, selfspy, etc.), they don't seem to support Wayland right now and I can't find any details about them planning to do so.
I'm now interested in implementing support for Gnome to start off with and follow up with others as the path becomes more clear.
A similar question concerning Weston has been asked here: get the list of active windows in wayland weston
Edit: I asked in #wayland on Freenode, got the following reply:
15:20:44 ErikBjare Hello everybody. I'm working on a piece of self-tracking software called ActivityWatch (https://github.com/ActivityWatch/activitywatch). I know this isn't exactly the right place to ask, but I was wondering if anyone knew anything about getting the active window in any Wayland-using DE. 15:20:57 ErikBjare Created a question on SO: https://stackoverflow.com/questions/45465016/how-do-i-get-the-active-window-on-gnome-wayland 15:21:25 ErikBjare Here's the issue in my repo for it: https://github.com/ActivityWatch/activitywatch/issues/92 15:22:54 ErikBjare There are a bunch of other applications that depend on it (RescueTime, selfspy, arbtt, ulogme, etc.) so they'd need it as well 15:24:23 blocage ErikBjare, in the core protocol you cannot know which windnow has the keyboard or cursor focus 15:24:39 blocage ErikBjare, in the wayland core protocol * 15:25:10 blocage ErikBjare, you can just know if your window has the focus or not, it a design choise 15:25:23 blocage avoid client spying each other 15:25:25 ErikBjare blocage: I'm aware, that's my reason for concern. I'm not saying it should be included or anything, but as it looks now every DE would need to implement it themselves if these kind of applications are to be supported 15:25:46 ErikBjare So wondering if anyone knew the teams working with Wayland on Gnome for example 15:26:11 ErikBjare But thanks for confirming 15:26:29 blocage ErikBjare, DE should create a custom extension, or use D-bus or other IPC 15:27:31 blocage ErikBjare, I guess some compositor are around here, but I do not know myself if there is such extension already 15:27:44 blocage compositor developers * 15:28:36 ErikBjare I don't think there is (I've done quite a bit of searching), so I guess I need to catch the attention of some DE developers 15:29:16 ErikBjare Thanks a lot though 15:29:42 ErikBjare blocage: Would you mind if I shared logs of our conversation in the issue? 15:30:05 blocage just use it :) it's public 15:30:19 ErikBjare ty :)
Edit 2: Filed an enhancement issue in the Gnome bugtracker.
tl;dr: How do I get the active window on Gnome when using Wayland?
The quickest (and fun) way to check if you are using Xorg or Wayland in GNOME 3 using GUI. Press Alt + F2 type r and smash Enter . If it show the error "Restart is not available on Wayland" img, sorry, you are using Wayland. If it work as expect (restart GNOME Shell), congrats, you are using Xorg.
Wayland is the default GNOME display server, and has been the default in Fedora since Fedora 25. However, users may still need to use the older Xorg display server for compatibility reasons. To confirm the current windowing system in use, go to Settings and select About.
The two previous answers are outdated, this is the current state of querying appnames and titles of windows in (Gnome) Wayland.
The Gnome-specific API will likely break between Gnome versions, but it works. It is heavily dependent on Gnome internal API to work so there is no chance of it becoming a standard API. There is a PR on aw-watcher-window to add this, but it needs some clean-up and afk-support if that's possible.
The wlr-foreign-toplevel-management protocol is (at the time of writing this) implemented by the Sway, Mir, Phosh and Wayfire compositors. Together with the idle.xml protocol which is pretty widely implemented by wayland compositors there's a complete implementation with afk-detection for ActivityWatch in aw-watcher-window-wayland. I've been in discussions with sway/rootston developers about whether wayland appnames and X11 wm_class is interchangeable and both Sway and Phosh use these interchangeably now so there should no longer be any distinguishable differences between Wayland and XWayland windows in the API anymore.
I have not researched if KWin has some API similar to Gnome Shell to fetch appnames and titles, but it does at least not implement wlr-foreign-toplevel-management.
In my opinion the best choice you have is not Wayland or any available library (there are not one). Actually who know in gnome-wayland about the active windows is Mutter, so you need to find a way to ask to Mutter the active windows. Gnome can develop an API to internally ask to mutter the active window and restore the functionality. But really, you don't have a place to ask for it. Mutter will not develop an API to access to his internal representation, because this will be pretty specific of Mutter only and not to all Wayland windows manager. So this need to be added to an external library, where this library could talk probably with the current window manager that it's in use to resolve your request in a general way.
Another possibility is add a Wayland plugin where all windows manager will have a way to share the current active windows and in some way a library to talk directly with wayland to restore the functionality.
So, your app is in a big problem. Most you can do is request this on mutter (where is know the active windows), but in my opinion it can not be resolved in Mutter.
I hope this will help you and you can find a way. Good luck.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With