Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-96449

Standardise interpretation of Qt::Popup in QtGui and QWindow across platforms

    XMLWordPrintable

Details

    • Task
    • Resolution: Unresolved
    • P2: Important
    • None
    • None
    • GUI: Window management
    • None
    • Linux/X11, macOS, Windows

    Description

      The documentation of Qt::Popup states:

      Indicates that the widget is a pop-up top-level window, i.e. that it is modal, but has a window system frame appropriate for pop-up menus.

      A QWindow that has the Qt::Popup flag set behaves inconsistently across the different desktop platforms, depending on how much of QWidget's popup behavior a QPA plugin tries to take care of.

      Observations:

      Mouse Grabbing

      macOS redirects all mouse events to the popup.

      Windows and X11 do no such thing; all mouse events go to the QWindow under the mouse.

      Key Grabbing

      macOS directs any key event to the active popup.

      Windows directs key events to the active window, the popup can be made active by clicking into it.

      X11 never sends any key events to a popup window, they go to the transient parent. The popup never gets focus.

      Activation and state sharing

      On macOS, transient parent and popup(s) sometimes share activation state. Clicking into the parent doesn't deactivate the popup, no WindowActivate/Deactivate events are generated. Activating another application deactivates the parent, but not the popup.

      On Windows, clicking into a popup deactivates the titlebar of the transient parent, but Qt still considers the parent active (isActive is true for both parent and popup). WindowActivate/Deactivate events are generated for both popup and parent, even though the state doesn't change. Activating another application generates a Deactivate event only for the QWindow that was previously active (possibly only the popup).

      On X11, a popup is always active and always on top, even if another application becomes active.

      Closing of popups

      On macOS (until https://codereview.qt-project.org/c/qt/qtbase/+/369794), QWindow popups are automatically closed when clicking outside of them, including anywhere in the frame of another window in the same application.

      On Windows and X11, popup QWindow are not closed automatically.

      Proposal for how it should be

      Given the documentation of Qt::Popup to imply:

      • top level window
      • modal
      • window frame appropriate for popup menus (such as "no frame, but drop shadow)

      The Popup flag should mean the following for QWindow on all platforms:

      Mouse and Keyboard Grabbing

      Modal means that other user interface elements cannot be interacted with as long as the popup is open. This means that the active popup should implicitly grab all mouse and keyboard input.

      Activation state sharing

      A popup is never a window on its own, it is an extension of the parent from which it is opened. Therefore, a popup should always be as active as the parent.

      Closing of popups

      Popup type QWindows should by default close themselves when the user evidently wants to transfer input focus to another window. They should be closed when the application is deactivated, or when the user clicks the mouse outside of them.

       

      This is in essence how QWidget and QApplication implement the Qt::Popup flag. QWidget::mousePressEvent closes itself when the mouse is pressed outside of it; QApplication handles deactivation events to close the entire popup stack.

      Attachments

        Issue Links

          There are no Sub-Tasks for this issue.
          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

          Activity

            People

              vhilshei Volker Hilsheimer
              vhilshei Volker Hilsheimer
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:

                Gerrit Reviews

                  There are no open Gerrit changes