wayland: Add tracking of X11 windows

This is unused ATM, but will be used to check whether it is safe to
shut Xwayland down.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/709
This commit is contained in:
Carlos Garnacho 2019-05-24 21:09:32 +02:00 committed by Carlos Garnacho
parent 319f7f5b63
commit f5a2694eba
2 changed files with 38 additions and 0 deletions

View File

@ -58,6 +58,8 @@ typedef struct
GSubprocess *proc; GSubprocess *proc;
GMainLoop *init_loop; GMainLoop *init_loop;
GList *x11_windows;
MetaXWaylandDnd *dnd; MetaXWaylandDnd *dnd;
} MetaXWaylandManager; } MetaXWaylandManager;

View File

@ -43,6 +43,7 @@
#include "compositor/meta-window-actor-private.h" #include "compositor/meta-window-actor-private.h"
#include "meta/main.h" #include "meta/main.h"
#include "wayland/meta-wayland-actor-surface.h" #include "wayland/meta-wayland-actor-surface.h"
#include "x11/meta-x11-display-private.h"
enum enum
{ {
@ -620,6 +621,31 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager)
return TRUE; return TRUE;
} }
static void
window_unmanaged_cb (MetaWindow *window,
MetaXWaylandManager *manager)
{
manager->x11_windows = g_list_remove (manager->x11_windows, window);
g_signal_handlers_disconnect_by_func (window,
window_unmanaged_cb,
manager);
}
static void
window_created_cb (MetaDisplay *display,
MetaWindow *window,
MetaXWaylandManager *manager)
{
/* Ignore all internal windows */
if (!window->xwindow ||
meta_window_get_client_pid (window) == getpid ())
return;
manager->x11_windows = g_list_prepend (manager->x11_windows, window);
g_signal_connect (window, "unmanaged",
G_CALLBACK (window_unmanaged_cb), manager);
}
gboolean gboolean
meta_xwayland_init (MetaXWaylandManager *manager, meta_xwayland_init (MetaXWaylandManager *manager,
struct wl_display *wl_display) struct wl_display *wl_display)
@ -647,6 +673,9 @@ on_x11_display_closing (MetaDisplay *display)
void void
meta_xwayland_complete_init (MetaDisplay *display) meta_xwayland_complete_init (MetaDisplay *display)
{ {
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
MetaXWaylandManager *manager = &compositor->xwayland_manager;
/* We install an X IO error handler in addition to the child watch, /* We install an X IO error handler in addition to the child watch,
because after Xlib connects our child watch may not be called soon because after Xlib connects our child watch may not be called soon
enough, and therefore we won't crash when X exits (and most important enough, and therefore we won't crash when X exits (and most important
@ -657,6 +686,9 @@ meta_xwayland_complete_init (MetaDisplay *display)
g_signal_connect (display, "x11-display-closing", g_signal_connect (display, "x11-display-closing",
G_CALLBACK (on_x11_display_closing), NULL); G_CALLBACK (on_x11_display_closing), NULL);
meta_xwayland_init_dnd (); meta_xwayland_init_dnd ();
g_signal_connect (meta_get_display (), "window-created",
G_CALLBACK (window_created_cb), manager);
} }
void void
@ -664,6 +696,10 @@ meta_xwayland_shutdown (MetaXWaylandManager *manager)
{ {
char path[256]; char path[256];
g_signal_handlers_disconnect_by_func (meta_get_display (),
window_created_cb,
manager);
g_cancellable_cancel (manager->xserver_died_cancellable); g_cancellable_cancel (manager->xserver_died_cancellable);
g_clear_object (&manager->proc); g_clear_object (&manager->proc);
g_clear_object (&manager->xserver_died_cancellable); g_clear_object (&manager->xserver_died_cancellable);