* Deiconifying GTK frames on GNOME shell
@ 2021-09-05 9:39 martin rudalics
2021-09-05 10:26 ` Colin Baxter
2021-09-05 19:19 ` Dmitry Gutov
0 siblings, 2 replies; 25+ messages in thread
From: martin rudalics @ 2021-09-05 9:39 UTC (permalink / raw)
To: emacs-devel
When running a GTK3 build of Emacs on GNOME shell, the following
sequence of actions
(setq frame (make-frame))
(iconify-frame frame)
(make-frame-visible frame)
does not produce a visible frame here. Rather, the frame stays
iconified although (frame-visible-p frame) for it returns t.
(raise-frame frame) and (select-frame-set-input-focus frame) do not work
either. A similar problem happens when running Emacs under the
Enlightenment WM.
I invite users running Emacs under GNOME shell to tell us whether they
see the same behavior or whether the above sequence of operations works
as intended.
This affects all frame management routines calling candidate_frame and
people who customized `frame-auto-hide-function' to `iconify-frame'. In
particular, if you show the minibuffer in a separate frame, you cannot
raise that frame from Emacs once you have iconified it.
If we decide that this is a bug _we_ want to fix then I can offer the
following changes which seem to make things work here:
(1) In xterm.c swap the calls to
gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
(2) When trying to deiconify an iconified frame make it invisible first
and only then make it visible.
I have no idea whether and how these changes might affect other builds
so making these customizable might be a good idea. But first I'd like
to know whether we really care about this issue. Since I use GNOME
shell for testing purposes only, I do not care personally.
Thanks in advance, martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-05 9:39 Deiconifying GTK frames on GNOME shell martin rudalics
@ 2021-09-05 10:26 ` Colin Baxter
2021-09-06 8:31 ` martin rudalics
2021-09-05 19:19 ` Dmitry Gutov
1 sibling, 1 reply; 25+ messages in thread
From: Colin Baxter @ 2021-09-05 10:26 UTC (permalink / raw)
To: martin rudalics; +Cc: emacs-devel
>>>>> martin rudalics <rudalics@gmx.at> writes:
> When running a GTK3 build of Emacs on GNOME shell, the following
> sequence of actions
> (setq frame (make-frame)) (iconify-frame frame)
> (make-frame-visible frame)
> does not produce a visible frame here. Rather, the frame stays
> iconified although (frame-visible-p frame) for it returns t.
> (raise-frame frame) and (select-frame-set-input-focus frame) do
> not work either. A similar problem happens when running Emacs
> under the Enlightenment WM.
> I invite users running Emacs under GNOME shell to tell us whether
> they see the same behavior or whether the above sequence of
> operations works as intended.
For me, the sequence works as intended in openbox but not in either
gnome-session or gnome-session-classic.
Best wishes,
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-05 9:39 Deiconifying GTK frames on GNOME shell martin rudalics
2021-09-05 10:26 ` Colin Baxter
@ 2021-09-05 19:19 ` Dmitry Gutov
2021-09-06 8:32 ` martin rudalics
1 sibling, 1 reply; 25+ messages in thread
From: Dmitry Gutov @ 2021-09-05 19:19 UTC (permalink / raw)
To: martin rudalics, emacs-devel
On 05.09.2021 12:39, martin rudalics wrote:
> When running a GTK3 build of Emacs on GNOME shell, the following
> sequence of actions
>
> (setq frame (make-frame))
> (iconify-frame frame)
> (make-frame-visible frame)
>
> does not produce a visible frame here. Rather, the frame stays
> iconified although (frame-visible-p frame) for it returns t.
Same here, except (frame-visible-p frame) returns 'icon.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-05 10:26 ` Colin Baxter
@ 2021-09-06 8:31 ` martin rudalics
0 siblings, 0 replies; 25+ messages in thread
From: martin rudalics @ 2021-09-06 8:31 UTC (permalink / raw)
To: Colin Baxter; +Cc: emacs-devel
> For me, the sequence works as intended in openbox but not in either
> gnome-session or gnome-session-classic.
Thanks for responding. I conclude that the issue doesn't bother you.
martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-05 19:19 ` Dmitry Gutov
@ 2021-09-06 8:32 ` martin rudalics
2021-09-07 0:45 ` Dmitry Gutov
0 siblings, 1 reply; 25+ messages in thread
From: martin rudalics @ 2021-09-06 8:32 UTC (permalink / raw)
To: Dmitry Gutov, emacs-devel
>> When running a GTK3 build of Emacs on GNOME shell, the following
>> sequence of actions
>>
>> (setq frame (make-frame))
>> (iconify-frame frame)
>> (make-frame-visible frame)
>>
>> does not produce a visible frame here. Rather, the frame stays
>> iconified although (frame-visible-p frame) for it returns t.
>
> Same here, except (frame-visible-p frame) returns 'icon.
Even after doing (make-frame-visible frame)?
Just in case can you confirm that the earlier mentioned
(1) In xterm.c swap the calls to
gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
(2) When trying to deiconify an iconified frame make it invisible first
and only then make it visible.
hack would work?
Thanks, martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-06 8:32 ` martin rudalics
@ 2021-09-07 0:45 ` Dmitry Gutov
2021-09-07 8:16 ` martin rudalics
2021-09-10 8:33 ` martin rudalics
0 siblings, 2 replies; 25+ messages in thread
From: Dmitry Gutov @ 2021-09-07 0:45 UTC (permalink / raw)
To: martin rudalics, emacs-devel
On 06.09.2021 11:32, martin rudalics wrote:
> Even after doing (make-frame-visible frame)?
Yup.
> Just in case can you confirm that the earlier mentioned
>
> (1) In xterm.c swap the calls to
>
> gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
> gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
>
> (2) When trying to deiconify an iconified frame make it invisible first
> and only then make it visible.
>
> hack would work?
Yes, that seems to work. Consistently.
If I don't do (1), BTW, I can do (2) twice, and that also makes the
frame visible.
Meaning
(make-frame-invisible frame)
(make-frame-visible frame)
(make-frame-invisible frame)
(make-frame-visible frame)
If I do (1), then doing (2) only once is sufficient.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-07 0:45 ` Dmitry Gutov
@ 2021-09-07 8:16 ` martin rudalics
2021-09-09 13:13 ` Madhu
2021-09-10 8:33 ` martin rudalics
1 sibling, 1 reply; 25+ messages in thread
From: martin rudalics @ 2021-09-07 8:16 UTC (permalink / raw)
To: Dmitry Gutov, emacs-devel
>> (1) In xterm.c swap the calls to
>>
>> gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
>> gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
>>
>> (2) When trying to deiconify an iconified frame make it invisible first
>> and only then make it visible.
>>
>> hack would work?
>
> Yes, that seems to work. Consistently.
Thanks for checking.
> If I don't do (1), BTW, I can do (2) twice, and that also makes the frame visible.
>
> Meaning
>
> (make-frame-invisible frame)
> (make-frame-visible frame)
> (make-frame-invisible frame)
> (make-frame-visible frame)
>
> If I do (1), then doing (2) only once is sufficient.
Interesting. I will check when I switch to GNOME next time.
Many thanks, martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-07 8:16 ` martin rudalics
@ 2021-09-09 13:13 ` Madhu
2021-09-10 8:34 ` martin rudalics
0 siblings, 1 reply; 25+ messages in thread
From: Madhu @ 2021-09-09 13:13 UTC (permalink / raw)
To: emacs-devel
* martin rudalics <635efeee-ffd5-28e3-d966-1086990b1aac@gmx.at> :
Wrote on Tue, 7 Sep 2021 10:16:02 +0200:
>>> (1) In xterm.c swap the calls to
>>> gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
>>> gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
>>> (2) When trying to deiconify an iconified frame make it invisible first
>>> and only then make it visible.
>>> hack would work?
>> Yes, that seems to work. Consistently.
> Thanks for checking.
>
>> If I don't do (1), BTW, I can do (2) twice, and that also makes the
>> frame visible.
>> (make-frame-invisible frame)
>> (make-frame-visible frame)
>> (make-frame-invisible frame)
>> (make-frame-visible frame)
>>
>> If I do (1), then doing (2) only once is sufficient.
>
> Interesting. I will check when I switch to GNOME next time.
[I thought I posted this workaround that I've been using at least since
- either on a bugreport or in a message to you - but I can't spot it in
my XMAIL]
(defadvice make-frame-visible (around mutter-workaround (&optional frame) activate)
(if (or (eql (frame-parameter frame 'visibility) 'icon)
(eql (frame-parameter frame 'visibility) nil))
(set-frame-parameter frame 'visibility nil))
ad-do-it)
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-07 0:45 ` Dmitry Gutov
2021-09-07 8:16 ` martin rudalics
@ 2021-09-10 8:33 ` martin rudalics
2021-09-11 14:48 ` Dmitry Gutov
1 sibling, 1 reply; 25+ messages in thread
From: martin rudalics @ 2021-09-10 8:33 UTC (permalink / raw)
To: Dmitry Gutov, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 460 bytes --]
> If I don't do (1), BTW, I can do (2) twice, and that also makes the frame visible.
>
> Meaning
>
> (make-frame-invisible frame)
> (make-frame-visible frame)
> (make-frame-invisible frame)
> (make-frame-visible frame)
I attach a patch based on this recipe but it causes (occasionally
terrible) flickers on other desktops so I would have to special-case it
on mutter anyway. I still have no good idea what's really going on
here.
martin
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: viv.diff --]
[-- Type: text/x-patch; name="viv.diff", Size: 5562 bytes --]
diff --git a/src/w32term.c b/src/w32term.c
index ad4d1a3282..a1b20236d8 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -6903,11 +6903,6 @@ w32_make_frame_invisible (struct frame *f)
my_show_window (f, FRAME_W32_WINDOW (f), SW_HIDE);
- /* We can't distinguish this from iconification
- just by the event that we get from the server.
- So we can't win using the usual strategy of letting
- FRAME_SAMPLE_VISIBILITY set this. So do it by hand,
- and synchronize with the server to make sure we agree. */
SET_FRAME_VISIBLE (f, 0);
SET_FRAME_ICONIFIED (f, false);
diff --git a/src/xdisp.c b/src/xdisp.c
index e853c8c223..66535109b2 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -15675,9 +15675,6 @@ redisplay_internal (void)
FRAME_TTY (sf)->previous_frame = sf;
}
- /* Set the visible flags for all frames. Do this before checking for
- resized or garbaged frames; they want to know if their frames are
- visible. See the comment in frame.h for FRAME_SAMPLE_VISIBILITY. */
number_of_visible_frames = 0;
FOR_EACH_FRAME (tail, frame)
diff --git a/src/xterm.c b/src/xterm.c
index 1887c3255d..0de6be762c 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -8239,12 +8239,33 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = x_window_to_frame (dpyinfo, event->xexpose.window);
if (f)
{
+ if (CONSP (frame_size_history))
+ {
+ frame_size_history_extra
+ (f,
+ FRAME_VISIBLE_P (f)
+ ? build_string ("Expose, visible")
+ : build_string ("Expose, not visible"),
+ FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f),
+ -1, -1, event->xexpose.width, event->xexpose.height);
+ }
+
if (!FRAME_VISIBLE_P (f))
{
block_input ();
/* The following two are commented out to avoid that a
plain invisible frame gets reported as iconified. That
- problem occurred first for Emacs 26 and is described in
+ problem occurred first for Emacs 26 with GTK3 and is
+ the result of the following actions:
+
+ (1) x_make_frame_invisible sets f->visible to 0.
+
+ (2) We get an (unexpected) Expose event for f and here
+ set f->visible to 1.
+
+ (3) The subsequent UnmapNotify event finds f->visible
+ is 1 and sets f->iconified true.
+
https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html. */
/** SET_FRAME_VISIBLE (f, 1); **/
/** SET_FRAME_ICONIFIED (f, false); **/
@@ -8835,26 +8856,24 @@ handle_one_xevent (struct x_display_info *dpyinfo,
goto OTHER;
case FocusIn:
-#ifndef USE_GTK
/* Some WMs (e.g. Mutter in Gnome Shell), don't unmap
minimized/iconified windows; thus, for those WMs we won't get
a MapNotify when unminimizing/deconifying. Check here if we
- are deiconizing a window (Bug42655).
-
- But don't do that on GTK since it may cause a plain invisible
- frame get reported as iconified, compare
- https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html.
- That is fixed above but bites us here again. */
+ are deiconifying a window (Bug42655). */
f = any;
+ /* Should we handle invisible frames here too? */
if (f && FRAME_ICONIFIED_P (f))
{
+ if (CONSP (frame_size_history))
+ frame_size_history_plain
+ (f, build_string ("FocusIn, was iconified"));
+
SET_FRAME_VISIBLE (f, 1);
SET_FRAME_ICONIFIED (f, false);
f->output_data.x->has_been_visible = true;
inev.ie.kind = DEICONIFY_EVENT;
XSETFRAME (inev.ie.frame_or_window, f);
}
-#endif /* USE_GTK */
x_detect_focus_change (dpyinfo, any, event, &inev.ie);
goto OTHER;
@@ -9344,9 +9363,24 @@ handle_one_xevent (struct x_display_info *dpyinfo,
case VisibilityNotify:
f = x_top_window_to_frame (dpyinfo, event->xvisibility.window);
- if (f && (event->xvisibility.state == VisibilityUnobscured
- || event->xvisibility.state == VisibilityPartiallyObscured))
- SET_FRAME_VISIBLE (f, 1);
+ if (f)
+ {
+ if (event->xvisibility.state == VisibilityUnobscured
+ || event->xvisibility.state == VisibilityPartiallyObscured)
+ {
+ if (CONSP (frame_size_history))
+ frame_size_history_plain
+ (f, build_string ("VisibilityNotify, visible"));
+
+ SET_FRAME_VISIBLE (f, 1);
+ }
+ else
+ {
+ if (CONSP (frame_size_history))
+ frame_size_history_plain
+ (f, build_string ("VisibilityNotify, invisible"));
+ }
+ }
goto OTHER;
@@ -11918,11 +11952,6 @@ x_make_frame_invisible (struct frame *f)
x_sync (f);
- /* We can't distinguish this from iconification
- just by the event that we get from the server.
- So we can't win using the usual strategy of letting
- FRAME_SAMPLE_VISIBILITY set this. So do it by hand,
- and synchronize with the server to make sure we agree. */
SET_FRAME_VISIBLE (f, 0);
SET_FRAME_ICONIFIED (f, false);
@@ -11937,7 +11966,18 @@ x_make_frame_invisible (struct frame *f)
x_make_frame_visible_invisible (struct frame *f, bool visible)
{
if (visible)
+#if defined (USE_GTK)
+ if (FRAME_ICONIFIED_P (f))
+ {
+ x_make_frame_visible (f);
+ x_make_frame_invisible (f);
+ x_make_frame_visible (f);
+ }
+ else
x_make_frame_visible (f);
+#else
+ x_make_frame_visible (f);
+#endif
else
x_make_frame_invisible (f);
}
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-09 13:13 ` Madhu
@ 2021-09-10 8:34 ` martin rudalics
2021-09-10 12:04 ` Madhu
0 siblings, 1 reply; 25+ messages in thread
From: martin rudalics @ 2021-09-10 8:34 UTC (permalink / raw)
To: Madhu, emacs-devel
> [I thought I posted this workaround that I've been using at least since
... when? ...
> - either on a bugreport or in a message to you - but I can't spot it in
> my XMAIL]
Have we been discussing this issue before? Have you (or anyone else)
filed a report against it? No pointers anywhere?
> (defadvice make-frame-visible (around mutter-workaround (&optional frame) activate)
> (if (or (eql (frame-parameter frame 'visibility) 'icon)
> (eql (frame-parameter frame 'visibility) nil))
> (set-frame-parameter frame 'visibility nil))
> ad-do-it)
This works here for making the frame visible again. It fails for
`raise-frame' and `select-frame-set-input-focus' but I think it should
be possible to fix these with similar advices too.
I don't understand yet how this x_make_frame_visible_invisible stuff is
supposed to work in the first place and I haven't even found the commit
that introduced it yet. Maybe it got fixed or broken during
https://lists.gnu.org/r/emacs-devel/2018-03/msg00863.html
so there should be also a timeout around somewhere.
IIUC this could be a serious issue with frame switching on mutter so
maybe either other people use a workaround like yours or they use a
version of mutter where this problem doesn't happen.
martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-10 8:34 ` martin rudalics
@ 2021-09-10 12:04 ` Madhu
2021-09-11 8:38 ` martin rudalics
0 siblings, 1 reply; 25+ messages in thread
From: Madhu @ 2021-09-10 12:04 UTC (permalink / raw)
To: emacs-devel
* martin rudalics <366d9251-3609-9e0b-3d35-8af409af706a@gmx.at> :
Wrote on Fri, 10 Sep 2021 10:34:17 +0200:
>> [I thought I posted this workaround that I've been using at least since
> ... when? ...
a year at least (i have it in my October 2020 backup)
>> - either on a bugreport or in a message to you - but I can't spot it in
>> my XMAIL]
>
> Have we been discussing this issue before? Have you (or anyone else)
> filed a report against it? No pointers anywhere?
Apparently not.
I've noticed the problem since march last year - the mutter-wayland folk
i chatted with at that time disclaimed any notion of "iconify", saying
hiding a window does not change the state and this is required for
live-previews when switching workspaces, etc. though they claimed full
support for ewmh NET_WM_STATE_HIDDEN
>> (defadvice make-frame-visible (around mutter-workaround (&optional frame) activate)
>> (if (or (eql (frame-parameter frame 'visibility) 'icon)
>> (eql (frame-parameter frame 'visibility) nil))
>> (set-frame-parameter frame 'visibility nil))
>> ad-do-it)
>
> This works here for making the frame visible again. It fails for
> `raise-frame' and `select-frame-set-input-focus' but I think it should
> be possible to fix these with similar advices too.
no, I couldn't figure out how to make raise-frame (select a different
frame and set input focus) work on mutter-wayland with gtkonly emacs.
gdk's calls do not work.
I think that's being punted, and relief is expected from some
"xdg-activation protocol"
> I don't understand yet how this x_make_frame_visible_invisible stuff is
> supposed to work in the first place and I haven't even found the commit
> that introduced it yet. Maybe it got fixed or broken during
The mutter model means invisible frames are still supposed to keep
rendering - they just wont be composited on the main workspace.
> https://lists.gnu.org/r/emacs-devel/2018-03/msg00863.html
>
> so there should be also a timeout around somewhere.
>
> IIUC this could be a serious issue with frame switching on mutter so
> maybe either other people use a workaround like yours or they use a
> version of mutter where this problem doesn't happen.
[I try use it once in a while - try to get it to do what I want,
encounter problems, give up for a month, etc.]
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-10 12:04 ` Madhu
@ 2021-09-11 8:38 ` martin rudalics
2021-12-06 15:35 ` Madhu
0 siblings, 1 reply; 25+ messages in thread
From: martin rudalics @ 2021-09-11 8:38 UTC (permalink / raw)
To: Madhu, emacs-devel
>>> [I thought I posted this workaround that I've been using at least since
>> ... when? ...
>
> a year at least (i have it in my October 2020 backup)
I wonder whether you had written it in response to some change in either
Emacs or GNOME.
> I've noticed the problem since march last year - the mutter-wayland folk
> i chatted with at that time disclaimed any notion of "iconify", saying
> hiding a window does not change the state
Remarkable. We should and do get Expose events for such windows though.
But we lack UnmapNotify and VisibilityNotify events for them. One major
problem is that they seem to care about Wayland only now. Have you ever
tried the pgtk branch and how it behaves in this regard?
> and this is required for
> live-previews when switching workspaces, etc. though they claimed full
> support for ewmh NET_WM_STATE_HIDDEN
And IIUC we have troubles with that as well. x_get_current_wm_state is
not reliable in my experience (or maybe we don't call it often enough).
> no, I couldn't figure out how to make raise-frame (select a different
> frame and set input focus) work on mutter-wayland with gtkonly emacs.
`raise-frame' calls Fmake_frame_visible. Are advices not working when
called from C? Anyhow, you should try to do those advices in C in the
first place - that's what I tried in the patch I sent to Dmitry and it
works for `raise-frame' here (but causes havoc under xfwm).
> gdk's calls do not work.
In general? We do use them all the time.
> I think that's being punted, and relief is expected from some
> "xdg-activation protocol"
Has that been implemented already? The pgtk branch should probably know
about it first.
> The mutter model means invisible frames are still supposed to keep
> rendering - they just wont be composited on the main workspace.
But how comes then that when users iconify a frame by clicking at the
title bar icon or when they switch workspaces they get problems when
deiconyfing a frame or switching workspace again. All that time Emacs
should think of the frame as being exposed, visible, ... Is that
x_get_current_wm_state striking again so Emacs _is_ somehow aware of the
frame not being really visible and waits for a signal that the frame has
become visible again?
Basically we can adopt a model where Emacs thinks all the time that a
frame is not visible and always asks to make it visible when it thinks
that the frame should be visible. Just that `frame-list' could never
tell in such a model what the visible and invisible frames are ...
> [I try use it once in a while - try to get it to do what I want,
> encounter problems, give up for a month, etc.]
One evidence has become clear enough though: Our mutter clients don't
use multiple frames.
Thanks, martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-10 8:33 ` martin rudalics
@ 2021-09-11 14:48 ` Dmitry Gutov
2021-09-11 16:43 ` martin rudalics
0 siblings, 1 reply; 25+ messages in thread
From: Dmitry Gutov @ 2021-09-11 14:48 UTC (permalink / raw)
To: martin rudalics, emacs-devel
On 10.09.2021 11:33, martin rudalics wrote:
> > If I don't do (1), BTW, I can do (2) twice, and that also makes the
> frame visible.
> >
> > Meaning
> >
> > (make-frame-invisible frame)
> > (make-frame-visible frame)
> > (make-frame-invisible frame)
> > (make-frame-visible frame)
>
> I attach a patch based on this recipe but it causes (occasionally
> terrible) flickers on other desktops so I would have to special-case it
> on mutter anyway. I still have no good idea what's really going on
> here.
The patch seems to work, fixing the scenario above. Thanks.
Not sure at which step the flickers are supposed to appear - probably in
some more complex scenarios?
Perhaps related to the topic of the discussion: I very rarely use
multiple frames myself (child frames excepted), but I'm happy to help
troubleshoot bugs under GNOME anyway.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-11 14:48 ` Dmitry Gutov
@ 2021-09-11 16:43 ` martin rudalics
0 siblings, 0 replies; 25+ messages in thread
From: martin rudalics @ 2021-09-11 16:43 UTC (permalink / raw)
To: Dmitry Gutov, emacs-devel
> Not sure at which step the flickers are supposed to appear - probably in some more complex scenarios?
They occur with xfwm and, in a less annoying way, with plasma. I
haven't seen them with mutter.
> Perhaps related to the topic of the discussion: I very rarely use
> multiple frames myself (child frames excepted), but I'm happy to help
> troubleshoot bugs under GNOME anyway.
Thanks. Users that should be bitten most by this are those using
`frame-auto-hide-function'.
martin
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-09-11 8:38 ` martin rudalics
@ 2021-12-06 15:35 ` Madhu
2021-12-08 11:00 ` martin rudalics
0 siblings, 1 reply; 25+ messages in thread
From: Madhu @ 2021-12-06 15:35 UTC (permalink / raw)
To: rudalics; +Cc: emacs-devel
[-- Attachment #1: Type: Text/Plain, Size: 2333 bytes --]
[sorry for the long delay]
* martin rudalics <af8095d4-7b2f-32aa-342d-fcda36964257@gmx.at>
Wrote on Sat, 11 Sep 2021 10:38:12 +0200
[snip]
> > No, I couldn't figure out how to make raise-frame (select a different
> > frame and set input focus) work on mutter-wayland with gtkonly emacs.
>
> `raise-frame' calls Fmake_frame_visible. Are advices not working when
> called from C? Anyhow, you should try to do those advices in C in the
> first place - that's what I tried in the patch I sent to Dmitry and it
> works for `raise-frame' here (but causes havoc under xfwm).
>
> > gdk's calls do not work.
>
> In general? We do use them all the time.
No, just for raising the window. The problem was in the pgtk branch:
select-frame-set-input-focus would not select the frame raise it and
set the input focus.
> > I think that's being punted, and relief is expected from some
> > "xdg-activation protocol"
>
> Has that been implemented already? The pgtk branch should probably
> know about it first.
I couldn't spot it, but there is apparently a workaround for gtk3,
mentioned in the issue "Allow raising application accessory windows
under Wayland (#730)"
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/730 (needs
javascript)
a solution is mentioned by @chergert (3 years ago) "Okay, so this
appears to work fine to raise the secondary window if i just fake the
timestamp. Not what I want to do, but it means that plumbing can
support this just fine (which I thought was broken)."
which for him meant, instead of using gtk_window_present(), to instead use
#+BEGIN_SRC
/* TODO: We need the last event time to do this properly. Until then,
* we'll just fake some timing info to workaround wayland issues.
*/
gtk_window_present_with_time (window, g_get_monotonic_time () / 1000L);
#+END_SRC
(from gnome-builder/src/libide/gui/ide-gui-global.c)
Implementing that in pgtk with the attached patch seems to work. To
test:
emacs -Q -l test.el
(setq $a (make-frame)); move the new frame out of the way and
;; go back to the first frame.
(select-frame-set-input-focus $a)
;; after the patch this sets the input focus - on mutter 41 the cursor
;; is still over the old window
I'm hoping a pgtk user can test this/comment on if this is a right
approach?
---Madhu
https://bugzilla.redhat.com/show_bug.cgi?id=1349225
[-- Attachment #2: pgtk-workaround-frame-focus-on-wayland.patch --]
[-- Type: Text/X-Patch, Size: 873 bytes --]
From 8f3fcc9e80fbff04165c6a3f8bcc05b91c270268 Mon Sep 17 00:00:00 2001
From: Madhu <enometh@net.meer>
Date: Mon, 6 Dec 2021 20:55:45 +0530
Subject: [PATCH] pgtkterm: workaround frame focus on wayland
* src/pgktterm.c: (pgtk_focus_frame): force wayland to raise the frame
with a call to gtk_window_present_with_time with a faked up timestamp.
---
src/pgtkterm.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index bf863c8474..499a4dd03a 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -4381,6 +4381,10 @@ pgtk_focus_frame (struct frame *f, bool noactivate)
{
block_input ();
gtk_widget_grab_focus (wid);
+ if (FRAME_GTK_OUTER_WIDGET (f))
+ {
+ gtk_window_present_with_time (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), g_get_monotonic_time () / 1000L);
+ }
unblock_input ();
}
}
--
2.31.0
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-06 15:35 ` Madhu
@ 2021-12-08 11:00 ` martin rudalics
2021-12-08 11:09 ` Po Lu
0 siblings, 1 reply; 25+ messages in thread
From: martin rudalics @ 2021-12-08 11:00 UTC (permalink / raw)
To: Madhu; +Cc: Po Lu, Yuuki Harano, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 504 bytes --]
> Implementing that in pgtk with the attached patch seems to work. To
> test:
>
> emacs -Q -l test.el
>
> (setq $a (make-frame)); move the new frame out of the way and
> ;; go back to the first frame.
> (select-frame-set-input-focus $a)
> ;; after the patch this sets the input focus - on mutter 41 the cursor
> ;; is still over the old window
>
> I'm hoping a pgtk user can test this/comment on if this is a right
> approach?
Yuuki Harano, Po Lu - any comments on that patch?
TIA, martin
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: pgtk-workaround-frame-focus-on-wayland.patch --]
[-- Type: text/x-patch; name="pgtk-workaround-frame-focus-on-wayland.patch", Size: 902 bytes --]
>From 8f3fcc9e80fbff04165c6a3f8bcc05b91c270268 Mon Sep 17 00:00:00 2001
From: Madhu <enometh@net.meer>
Date: Mon, 6 Dec 2021 20:55:45 +0530
Subject: [PATCH] pgtkterm: workaround frame focus on wayland
* src/pgktterm.c: (pgtk_focus_frame): force wayland to raise the frame
with a call to gtk_window_present_with_time with a faked up timestamp.
---
src/pgtkterm.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index bf863c8474..499a4dd03a 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -4381,6 +4381,10 @@ pgtk_focus_frame (struct frame *f, bool noactivate)
{
block_input ();
gtk_widget_grab_focus (wid);
+ if (FRAME_GTK_OUTER_WIDGET (f))
+ {
+ gtk_window_present_with_time (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), g_get_monotonic_time () / 1000L);
+ }
unblock_input ();
}
}
--
2.31.0
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-08 11:00 ` martin rudalics
@ 2021-12-08 11:09 ` Po Lu
2021-12-08 16:02 ` Yuuki Harano
2021-12-08 16:33 ` Madhu
0 siblings, 2 replies; 25+ messages in thread
From: Po Lu @ 2021-12-08 11:09 UTC (permalink / raw)
To: martin rudalics; +Cc: Madhu, Yuuki Harano, emacs-devel
martin rudalics <rudalics@gmx.at> writes:
> Yuuki Harano, Po Lu - any comments on that patch?
>
> TIA, martin
Could you explain what it is supposed to fix?
I thought the reason frames couldn't be raised under PGTK was that
`frame_raise_lower_hook' is unimplemented there, which someone will
certainly get to soon.
Thanks.
> + gtk_window_present_with_time (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), g_get_monotonic_time () / 1000L);
I think GDK_CURRENT_TIME should work equally well here, right?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-08 11:09 ` Po Lu
@ 2021-12-08 16:02 ` Yuuki Harano
2021-12-09 0:28 ` Po Lu
2021-12-08 16:33 ` Madhu
1 sibling, 1 reply; 25+ messages in thread
From: Yuuki Harano @ 2021-12-08 16:02 UTC (permalink / raw)
To: rudalics; +Cc: luangruo, enometh, emacs-devel
On Wed, 8 Dec 2021 12:00:56 +0100,
martin rudalics <rudalics@gmx.at> wrote:
>> I'm hoping a pgtk user can test this/comment on if this is a right
>> approach?
>
> Yuuki Harano, Po Lu - any comments on that patch?
I think it's good.
It's working on GNOME(Wayland), but not Wayfire.
I don't test on Plasma and Sway.
Also, I tested with gtk_window_present instead of gtk_window_present_with_time.
It did not work on GNOME(Wayland).
On Wed, 08 Dec 2021 19:09:30 +0800,
Po Lu <luangruo@yahoo.com> wrote:
> Could you explain what it is supposed to fix?
See this thread:
https://lists.gnu.org/archive/html/emacs-devel/2021-12/msg00549.html
https://lists.gnu.org/archive/html/emacs-devel/2021-09/msg00909.html
--
Yuuki Harano
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-08 11:09 ` Po Lu
2021-12-08 16:02 ` Yuuki Harano
@ 2021-12-08 16:33 ` Madhu
2021-12-09 0:31 ` Po Lu
1 sibling, 1 reply; 25+ messages in thread
From: Madhu @ 2021-12-08 16:33 UTC (permalink / raw)
To: luangruo; +Cc: rudalics, masm+emacs, emacs-devel
* Po Lu <luangruo@yahoo.com> <87ilvze4k5.fsf@yahoo.com>
Wrote on Wed, 08 Dec 2021 19:09:30 +0800
> martin rudalics <rudalics@gmx.at> writes:
>> Yuuki Harano, Po Lu - any comments on that patch?
> Could you explain what it is supposed to fix?
Hello, it is meant to make (select-frame-set-input-focus) "work" on
wayland for the time being. It is not a correct fix. (x-focus-frame
$a t) will raise the frame when it should not be raised.
> I thought the reason frames couldn't be raised under PGTK was that
> `frame_raise_lower_hook' is unimplemented there, which someone will
> certainly get to soon.
The problem I believe is that the gdk/gtk apis to raise/lower windows
just doesn't work on wayland. Implementing frame_raise_lower_hook with, say
gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (FRAME_GTK_OUTER_WIDGET (f))));
has no effect.
I linked to two urls pointing to the bug reports on frame stacking
order. (Maybe I'm misunderstanding but there are at least a dozen
more reports)
it is a wrong fix, but on the other hand select-frame-set-input-focus
seems to be crucial (for me) for using more than 2 frames
>> + gtk_window_present_with_time (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), g_get_monotonic_time () / 1000L);
>
> I think GDK_CURRENT_TIME should work equally well here, right?
I'll check shortly, Thanks,
---Best Regards
Madhu
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-08 16:02 ` Yuuki Harano
@ 2021-12-09 0:28 ` Po Lu
2021-12-09 2:30 ` Madhu
0 siblings, 1 reply; 25+ messages in thread
From: Po Lu @ 2021-12-09 0:28 UTC (permalink / raw)
To: Yuuki Harano; +Cc: rudalics, enometh, emacs-devel
Yuuki Harano <masm+emacs@masm11.me> writes:
> I think it's good.
>
> It's working on GNOME(Wayland), but not Wayfire. I don't test on
> Plasma and Sway.
>
> Also, I tested with gtk_window_present instead of
> gtk_window_present_with_time. It did not work on GNOME(Wayland).
> See this thread:
> https://lists.gnu.org/archive/html/emacs-devel/2021-12/msg00549.html
> https://lists.gnu.org/archive/html/emacs-devel/2021-09/msg00909.html
Thanks, but could you test with GDK_CURRENT_TIME as the `time' argument
to `gtk_window_present_with_time'?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-08 16:33 ` Madhu
@ 2021-12-09 0:31 ` Po Lu
2021-12-09 2:33 ` Madhu
0 siblings, 1 reply; 25+ messages in thread
From: Po Lu @ 2021-12-09 0:31 UTC (permalink / raw)
To: Madhu; +Cc: rudalics, masm+emacs, emacs-devel
Madhu <enometh@meer.net> writes:
> Hello, it is meant to make (select-frame-set-input-focus) "work" on
> wayland for the time being. It is not a correct fix. (x-focus-frame
> $a t) will raise the frame when it should not be raised.
That's because the GDK developers, in their infinite wisdom, think that
windows shouldn't give the input focus to themselves without also
presenting themselves.
> The problem I believe is that the gdk/gtk apis to raise/lower windows
> just doesn't work on wayland. Implementing frame_raise_lower_hook with, say
> gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (FRAME_GTK_OUTER_WIDGET (f))));
> has no effect.
If it doesn't work on Wayland, at least it will work on X-Windows, or
Broadway, or some other window system supported by GDK.
I see no reason to keep it unimplemented.
Thanks.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-09 0:28 ` Po Lu
@ 2021-12-09 2:30 ` Madhu
2021-12-09 2:46 ` Po Lu
0 siblings, 1 reply; 25+ messages in thread
From: Madhu @ 2021-12-09 2:30 UTC (permalink / raw)
To: luangruo; +Cc: rudalics, masm+emacs, emacs-devel
* Po Lu <luangruo@yahoo.com> <87ilvyd3kd.fsf@yahoo.com>
Wrote on Thu, 09 Dec 2021 08:28:34 +0800
> Thanks, but could you test with GDK_CURRENT_TIME as the `time' argument
> to `gtk_window_present_with_time'?
It doesn't seem to work. The gitlab gnome-shell issue #730 seems to
think it is a GTK issue
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-09 0:31 ` Po Lu
@ 2021-12-09 2:33 ` Madhu
0 siblings, 0 replies; 25+ messages in thread
From: Madhu @ 2021-12-09 2:33 UTC (permalink / raw)
To: luangruo; +Cc: rudalics, masm+emacs, emacs-devel
[-- Attachment #1: Type: Text/Plain, Size: 995 bytes --]
* Po Lu <luangruo@yahoo.com> <87ee6md3g9.fsf@yahoo.com>
Wrote on Thu, 09 Dec 2021 08:31:02 +0800
> Madhu <enometh@meer.net> writes:
>> Hello, it is meant to make (select-frame-set-input-focus) "work" on
>> wayland for the time being. It is not a correct fix. (x-focus-frame
>> $a t) will raise the frame when it should not be raised.
>
> That's because the GDK developers, in their infinite wisdom, think that
> windows shouldn't give the input focus to themselves without also
> presenting themselves.
>
>> The problem I believe is that the gdk/gtk apis to raise/lower windows
>> just doesn't work on wayland. Implementing frame_raise_lower_hook with, say
>> gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (FRAME_GTK_OUTER_WIDGET (f))));
>> has no effect.
>
> If it doesn't work on Wayland, at least it will work on X-Windows, or
> Broadway, or some other window system supported by GDK.
>
> I see no reason to keep it unimplemented.
FWIW this is the patch I tried, which failed
[-- Attachment #2: 0001-src-pgtkterm.c-implement-frame-raise-lower-FAIL.patch --]
[-- Type: Text/X-Patch, Size: 2057 bytes --]
From e304e644aeab0732ebe3f6891e155d0939575122 Mon Sep 17 00:00:00 2001
From: Madhu <enometh@net.meer>
Date: Wed, 8 Dec 2021 21:39:59 +0530
Subject: [PATCH] src/pgtkterm.c - implement frame raise lower - FAIL
* src/pgtkterm.c: (pgtk_raise_frame, pgtk_lower_frame,
pgtk_frame_raise_lower): new. pgtk_create_terminal: hook into
terminal->frame_raise_lower_hook
---
src/pgtkterm.c | 39 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 38 insertions(+), 1 deletion(-)
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 0d9b342e6e..fd193f9e0b 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -195,6 +195,43 @@ frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
{
}
+
+/* Raise frame F. */
+
+static void
+pgtk_raise_frame (struct frame *f)
+{
+
+ if (FRAME_VISIBLE_P (f)) {
+ block_input ();
+ if (FRAME_GTK_OUTER_WIDGET (f))
+ gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (FRAME_GTK_OUTER_WIDGET (f))));
+ unblock_input ();
+ }
+}
+
+/* Lower frame F. */
+
+static void
+pgtk_lower_frame (struct frame *f)
+{
+ if (FRAME_VISIBLE_P (f))
+ {
+ block_input ();
+ gdk_window_lower (gtk_widget_get_window (GTK_WIDGET (FRAME_GTK_OUTER_WIDGET (f))));
+ unblock_input ();
+ }
+}
+
+static void
+pgtk_frame_raise_lower (struct frame *f, bool raise_flag)
+{
+ if (raise_flag)
+ pgtk_raise_frame (f);
+ else
+ pgtk_lower_frame (f);
+}
+
/* Free X resources of frame F. */
void
@@ -4675,7 +4712,7 @@ pgtk_create_terminal (struct pgtk_display_info *dpyinfo)
terminal->mouse_position_hook = pgtk_mouse_position;
terminal->frame_rehighlight_hook = XTframe_rehighlight;
terminal->buffer_flipping_unblocked_hook = pgtk_buffer_flipping_unblocked_hook;
- /* terminal->frame_raise_lower_hook = pgtk_frame_raise_lower; */
+ terminal->frame_raise_lower_hook = pgtk_frame_raise_lower;
terminal->frame_visible_invisible_hook = pgtk_make_frame_visible_invisible;
terminal->fullscreen_hook = pgtk_fullscreen_hook;
terminal->menu_show_hook = pgtk_menu_show;
--
2.31.0
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-09 2:30 ` Madhu
@ 2021-12-09 2:46 ` Po Lu
2021-12-09 9:20 ` Eli Zaretskii
0 siblings, 1 reply; 25+ messages in thread
From: Po Lu @ 2021-12-09 2:46 UTC (permalink / raw)
To: Madhu; +Cc: rudalics, masm+emacs, emacs-devel, Eli Zaretskii,
Lars Ingebrigtsen
Madhu <enometh@meer.net> writes:
> * Po Lu <luangruo@yahoo.com> <87ilvyd3kd.fsf@yahoo.com>
> Wrote on Thu, 09 Dec 2021 08:28:34 +0800
>
>> Thanks, but could you test with GDK_CURRENT_TIME as the `time' argument
>> to `gtk_window_present_with_time'?
>
> It doesn't seem to work. The gitlab gnome-shell issue #730 seems to
> think it is a GTK issue
Then I think your patch is OK, bar some formatting problems: sentences
in commit messages aside from the title should end with punctuation, and
you should try to keep code within 70 columns.
It should be exempt from copyright assignment, adding or changing less
than 15 lines of code, but you may have exceeded that limit already.
Eli or Lars, has Madhu completed the copyright assignment? And if not,
is this change exempt from copyright assignment? Thanks.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Deiconifying GTK frames on GNOME shell
2021-12-09 2:46 ` Po Lu
@ 2021-12-09 9:20 ` Eli Zaretskii
0 siblings, 0 replies; 25+ messages in thread
From: Eli Zaretskii @ 2021-12-09 9:20 UTC (permalink / raw)
To: Po Lu; +Cc: larsi, rudalics, enometh, masm+emacs, emacs-devel
> From: Po Lu <luangruo@yahoo.com>
> Cc: rudalics@gmx.at, masm+emacs@masm11.me, emacs-devel@gnu.org, Eli
> Zaretskii <eliz@gnu.org>, Lars Ingebrigtsen <larsi@gnus.org>
> Date: Thu, 09 Dec 2021 10:46:27 +0800
>
> It should be exempt from copyright assignment, adding or changing less
> than 15 lines of code, but you may have exceeded that limit already.
>
> Eli or Lars, has Madhu completed the copyright assignment?
Yes, his assignment is on file.
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2021-12-09 9:20 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-09-05 9:39 Deiconifying GTK frames on GNOME shell martin rudalics
2021-09-05 10:26 ` Colin Baxter
2021-09-06 8:31 ` martin rudalics
2021-09-05 19:19 ` Dmitry Gutov
2021-09-06 8:32 ` martin rudalics
2021-09-07 0:45 ` Dmitry Gutov
2021-09-07 8:16 ` martin rudalics
2021-09-09 13:13 ` Madhu
2021-09-10 8:34 ` martin rudalics
2021-09-10 12:04 ` Madhu
2021-09-11 8:38 ` martin rudalics
2021-12-06 15:35 ` Madhu
2021-12-08 11:00 ` martin rudalics
2021-12-08 11:09 ` Po Lu
2021-12-08 16:02 ` Yuuki Harano
2021-12-09 0:28 ` Po Lu
2021-12-09 2:30 ` Madhu
2021-12-09 2:46 ` Po Lu
2021-12-09 9:20 ` Eli Zaretskii
2021-12-08 16:33 ` Madhu
2021-12-09 0:31 ` Po Lu
2021-12-09 2:33 ` Madhu
2021-09-10 8:33 ` martin rudalics
2021-09-11 14:48 ` Dmitry Gutov
2021-09-11 16:43 ` martin rudalics
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).