Commit Graph

14 Commits

Author SHA1 Message Date
Carlos Garnacho
6df9eab880 frames: Handle _NET_WM_VISIBLE_NAME
This is occasionally set by Mutter, in order to hint about remote
X11 clients, etc.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2872>
2023-02-27 15:38:25 +00:00
Carlos Garnacho
6142765262 frames: Minor refactor
Move extraction of UTF8_STRING properties to a helper, as we'll
want to use it for several properties.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2872>
2023-02-27 15:38:25 +00:00
Carlos Garnacho
473f58cb5b frames: Rename function
There's different levels of "title" we'll want to poke, make
this function name a bit more specific.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2872>
2023-02-27 15:38:25 +00:00
Carlos Garnacho
e9fca3eba6 frames: Intern some Atoms in the MetaFrame struct
Start with the ones we handle through PropertyNotify events,
since we want to expand further on those.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2872>
2023-02-27 15:38:25 +00:00
Carlos Garnacho
0fff52ee28 frames: Avoid default NULL frame title
The default GtkWindow title if NULL is set is obtained from g_get_prgname(),
prefer an empty string here.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2791>
2023-01-18 14:17:00 +01:00
Carlos Garnacho
c7b3d8c607 frames: Push error traps around various X11 calls
It is a possibility that these requests result in an error, so handle
the possible fallout.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2745>
2023-01-12 14:00:52 +01:00
Carlos Garnacho
425c7652cf frames: Handle lack of WM_DELETE_WINDOW in WM_PROTOCOLS
It is expected that we XKillClient() those clients that do not handle
WM_DELETE_WINDOW messaging. Fixes closing glxgears.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2756>
2022-12-10 09:38:23 +00:00
Carlos Garnacho
66b1f43967 Revert "x11: Move Motif WM hints to a separate header"
Since we use XCB in the Mutter side, but Xlib in the frames client,
we cannot share the same struct definition since both libraries
will expect different type lengths (respectively, 32-bit ints vs.
longs).

Revert the changes that made both executables share the same
struct, since not both of them can get it right (and retrieve
correctly the struct with the contained flags) in reading the
Motif WM hints.

This reverts commit 2fb3c5a4f5.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2741>
2022-12-09 16:28:33 +00:00
Georges Basile Stavracas Neto
ac09ce11fd frames: Add CSS class on init
Adding the 'default-decoration' CSS class to MetaFrameHeader after
it is set as the headerbar makes it not account for the minimum size
correctly sometimes. This is a bit racy though - if the window opens
very quickly, it works as expected.

Adding the CSS class before the widget is used guarantees it'll
always report the correct size though, so do that.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2753>
2022-12-09 12:25:07 -03:00
Georges Basile Stavracas Neto
62ddea304a frames: Add default-decoration CSS class
Add this CSS class both to the header bar itself, since it is what
actually contains the window controls, and to MetaFrameHeader too,
since it's what's directly attached to the window.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2740>
2022-12-05 14:16:27 -03:00
Carlos Garnacho
2fb3c5a4f5 x11: Move Motif WM hints to a separate header
These are now referenced on the frames client side (in order to
track deletable state from the client window) and the mutter side
(pretty much everything else, like figuring out if a window wants
WM decorations).

It makes sense to make this a separate header, so that we don't
need to doubly define these flags/structs.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2735>
2022-12-05 12:40:53 +01:00
Carlos Garnacho
dfaa6fdc14 frames: Fix check of Motif WM hints
We use this for tracking the deletable state of the client window,
but forgot to check that the MWM_HINT_FUNCTIONS hint is set in
hints.flags before checking hints.functions.

This resulted in windows that do not specify this flag (and thus
should go with the defaults) in being mistakenly removed the close
button, as the functions flags would be typically 0 in that case.

Fixes issues with Chromium and Electron applications missing the
close button, since Chromium does this on X11.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2735>
2022-12-05 12:40:53 +01:00
Carlos Garnacho
f2237fa0c8 x11: Add frame synchronization to window frames
There's two meanings of "frame" there! Since SSD frames are now
rendered by an external client, and there are no actual mechanism
that ensures the frame did already get painted when the client did
respond to its NET_WM_FRAME_SYNC_REQUEST request, there may be
artifacts when resizing windows.

In order to get always the best visual result, we should actually
synchronize rendering with both the client window and the window
frame window.

This commit adds these mechanisms, so a sync alarm update is
expected on both windows until further resizes are allowed, this
ensures window and frame stay in sync, even after moving rendering
elsewhere.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2175>
2022-12-01 20:10:53 +00:00
Carlos Garnacho
3f8e4d515e frames: Add new X11 frames client
This small X11 client takes care of creating frames for client
windows, Mutter will use this client to delegate window frame
rendering and event handling.

The MetaWindowTracker object will keep track of windows created
from other clients, and will await for _MUTTER_NEEDS_FRAME property
updates on those (coming from Mutter), indicating the need for a
frame window.

This process is resilient to restarts of the frames client, existing
windows will be queried during start, and the existence of relevant
properties checked. Mutter will be able to just hide/show
SSD-decorated windows while the frames client restarts.

The frames are created through GTK4 widgets, the MetaWindowContent
widget acts as a replacement prop for the actual client window,
and the MetaFrameHeader wraps GtkHeaderBar so that windows can be
overshrunk, but otherwise a MetaFrame is a 100% true GTK4 GtkWindow.

After a frame window is created for a client window, the
_MUTTER_FRAME_FOR property will be set on the frame window,
indicating to mutter the correspondence between both Windows.

Additionally, the pixel sizes of the visible left/right/top/bottom
borders of the frame will be set through the _MUTTER_FRAME_EXTENTS
property, set on the frame window.

In order to make the frame window behave as the frame for the
client window, a number of properties will be tracked from the
client window to update the relevant frame behavior (window title,
resizability, availability of actions...), and also some forwarding
of events happening in the frame will be forwarded to the client
window (mainly, WM_DELETE_WINDOW when the close button is clicked).

Other than that, the frames are pretty much CSD GTK4 windows, so
window drags and resizes, and window context menus are forwarded for
the WM to handle.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2175>
2022-12-01 20:10:53 +00:00