Closed spl237 closed 1 year ago
Just thinking out loud, couldn't you use EXCLUSIVE
when creating the window and then switch to ON_DEMAND
once its mapped?
Already tried that! Doesn't work - as soon as you switch to ON_DEMAND, the window loses focus.
as soon as you switch to ON_DEMAND, the window loses focus.
That sounds more like a WM issue if I'm not mistaken
Yeah, unfortunately it sounds like there's nothing a client can do about this behavior with the protocol as it currently is.
as soon as you switch to ON_DEMAND, the window loses focus.
That sounds more like a WM issue if I'm not mistaken
Yes, that doesn't sound right. The only case I can imagine is when another layershell client in the TOP
/OVERLAY
layers has EXCLUSIVE
set as well. Then the focus should likely switch to that client once we lose our EXCLUSIVE
flag. What compositor are you using?
Wayfire. But I have had quite a few focus problems, particularly with opening menus off the panel - in order to give those keyboard focus, I have had to do a fairly arcane workaround - so it looks as if this may just be something that isn't handled well in Wayfire.
Yes, Wayfire <= 0.7.5 does not support on-demand mode iirc: see https://github.com/wmww/gtk-layer-shell/issues/141#issuecomment-1343278392
Hmmm. That's odd, because I am using 0.7.5, and I am sure I have got on-demand mode working in some circumstances. I'm going to do some more digging about in this today and try to get to the bottom of it.
As I understand it, there are three different keyboard interactivity options for a layer. NONE means the layer never has keyboard focus. EXCLUSIVE means that the layer has keyboard focus and can never lose it, meaning no other layers can have focus while that layer is open. And ON_DEMAND means that layer does not have focus, but gets it if it is clicked.
None of these, unfortunately, do quite what I need...
I have a text search window which is opened when the user starts to type when in a menu; the text search window immediately replaces the menu. So this window needs to have keyboard focus at the moment it opens, so the user can continue to type and keystrokes continue to go to the new window.
However, this window also needs to behave like a menu, in that if the user clicks outside the window, I want that to be detected as a focus-out event and for the window to then close.
If I set focus for this window to NONE, it does not receive keystrokes and can never do so - so that doesn't work.
If I set focus to EXCLUSIVE, it does receive keystrokes, but can never lose focus, so I cannot close it by clicking outside.
If I set focus to ON_DEMAND, the window will close if clicked outside, and can have keyboard focus, but only if the user stops typing, clicks in the new window to give it keyboard focus, and then carries on typing, which is really not good from a usability perspective.
What I need is either a fourth state, something like RELEASABLE, whereby a layer initially has keyboard focus but non-exclusively, so it can lose it when clicked away, or alternatively a way to create a layer as ON_DEMAND, and then to programmatically ensure that it has keyboard focus when it is opened without the user needing to click on it.
Are either of these possible, either with or without code changes?
Many thanks in advance.