unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Dmitry Gutov <dgutov@yandex.ru>, emacs-devel <emacs-devel@gnu.org>
Subject: Re: Deiconifying GTK frames on GNOME shell
Date: Fri, 10 Sep 2021 10:33:07 +0200	[thread overview]
Message-ID: <5b621645-1d03-d102-f40f-02a07e2d9541@gmx.at> (raw)
In-Reply-To: <c496aa37-e0c6-ae8f-6660-f0c7d789f54f@yandex.ru>

[-- 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);
 }

  parent reply	other threads:[~2021-09-10  8:33 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
2021-09-11 14:48         ` Dmitry Gutov
2021-09-11 16:43           ` martin rudalics

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5b621645-1d03-d102-f40f-02a07e2d9541@gmx.at \
    --to=rudalics@gmx.at \
    --cc=dgutov@yandex.ru \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).