<html>
    <head>
      <base href="https://bugzilla.gnome.org/" />
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [WAYLAND] random loss of focus on toplevel when mapping/unmapping grab-less xdg_popup"
   href="https://bugzilla.gnome.org/show_bug.cgi?id=773210#c1">Comment # 1</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [WAYLAND] random loss of focus on toplevel when mapping/unmapping grab-less xdg_popup"
   href="https://bugzilla.gnome.org/show_bug.cgi?id=773210">bug 773210</a>
              from <span class="vcard"><a href="page.cgi?id=describeuser.html&login=ofourdan%40redhat.com" title="Olivier Fourdan <ofourdan@redhat.com>"> <span class="fn">Olivier Fourdan</span></a>
</span></b>
        <pre>  "STARTUP: The focus window W1 (lt-test-co) is an ancestor of the newly mapped
   window W5 which isn't being focused.  Unfocusing the ancestor."

This comes from meta_window_show() in src/core/window.c when showing the popup
window:

2230 static void
2231 meta_window_show (MetaWindow *window)
2232 {
       [...]
2255   /* Now, in some rare cases we should *not* put a new window on top.
2256    * These cases include certain types of windows showing for the first
2257    * time, and any window which would be covered because of another window
2258    * being set "above" ("always on top").
2259    *
2260    * FIXME: Although "place_on_top_on_map" and "takes_focus_on_map" are
2261    * generally based on the window type, there is a special case when the
2262    * focus window is a terminal for them both to be false; this should
2263    * probably rather be a term in the "if" condition below.
2264    */
2265 
2266   if ( focus_window != NULL && window->showing_for_first_time &&
2267       ( (!place_on_top_on_map && !takes_focus_on_map) ||
2268       window_would_be_covered (window) )
2269     ) {
2270       if (meta_window_is_ancestor_of_transient (focus_window, window))
2271         {
2272           guint32     timestamp;
2273 
2274           timestamp = meta_display_get_current_time_roundtrip
(window->display);
2275 
2276           /* This happens for error dialogs or alerts; these need to
remain on
2277            * top, but it would be confusing to have its ancestor remain
2278            * focused.
2279            */
2280           meta_topic (META_DEBUG_STARTUP,
2281                       "The focus window %s is an ancestor of the newly
mapped "
2282                       "window %s which isn't being focused.  Unfocusing
the "
2283                       "ancestor.\n",
2284                       focus_window->desc, window->desc);
2285 
2286           meta_display_focus_the_no_focus_window (window->display,
2287                                                   window->screen,
2288                                                   timestamp);
2289         }

The xdg_popup window is indeed on top, doesn;t take focus (as it's without
grab), it;s showing for the first time does cover the toplevel window, which
explains why we get into this code path.

But there is this other message as well:

  "STARTUP: window W5 focus prevented by other activity; 76886753 < 76886786"

Which comes from intervening_user_event_occurred() in src/core/window.c called
from window_state_on_map(), which is precisely what sets takes_focus to FALSE,
ths trigging the condition.

The problem is the xdg_popup should not take focus, which means we /should/ hit
this condition every time, i.e. focus should be lost every time...</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>