wayland/surface-role: Keep track of the surface main monitor
Toplevels get the main monitor from their MetaWindow and have no main monitor when the toplevel is not mapped. Subsurfaces get the main monitor from their parent surface. DnD and cursors get the main monitor from the current cursor position no matter if the cursor is actually being shown or not. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3941>
This commit is contained in:
parent
fe17e717c3
commit
757f8b6d69
5 changed files with 50 additions and 9 deletions
|
@ -223,6 +223,7 @@ enum
|
|||
PROP_EFFECT,
|
||||
PROP_SUSPEND_STATE,
|
||||
PROP_MAPPED,
|
||||
PROP_MAIN_MONITOR,
|
||||
|
||||
PROP_LAST,
|
||||
};
|
||||
|
@ -444,6 +445,9 @@ meta_window_get_property(GObject *object,
|
|||
case PROP_MAPPED:
|
||||
g_value_set_boolean (value, win->mapped);
|
||||
break;
|
||||
case PROP_MAIN_MONITOR:
|
||||
g_value_set_object (value, win->monitor);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
@ -614,6 +618,11 @@ meta_window_class_init (MetaWindowClass *klass)
|
|||
FALSE,
|
||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_MAIN_MONITOR] =
|
||||
g_param_spec_object ("main-monitor", NULL, NULL,
|
||||
META_TYPE_LOGICAL_MONITOR,
|
||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
|
||||
window_signals[WORKSPACE_CHANGED] =
|
||||
|
@ -965,6 +974,8 @@ meta_window_main_monitor_changed (MetaWindow *window,
|
|||
if (window->monitor)
|
||||
g_signal_emit_by_name (window->display, "window-entered-monitor",
|
||||
window->monitor->number, window);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_MAIN_MONITOR]);
|
||||
}
|
||||
|
||||
MetaLogicalMonitor *
|
||||
|
|
|
@ -92,18 +92,18 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite,
|
|||
{
|
||||
MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_surface);
|
||||
MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (role);
|
||||
MetaContext *context =
|
||||
meta_wayland_compositor_get_context (surface->compositor);
|
||||
MetaBackend *backend = meta_context_get_backend (context);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
logical_monitor =
|
||||
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
||||
|
||||
if (!meta_wayland_surface_is_xwayland (surface))
|
||||
{
|
||||
MetaContext *context =
|
||||
meta_wayland_compositor_get_context (surface->compositor);
|
||||
MetaBackend *backend = meta_context_get_backend (context);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
logical_monitor =
|
||||
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
||||
if (logical_monitor)
|
||||
{
|
||||
int surface_scale = surface->applied_state.scale;
|
||||
|
@ -121,6 +121,7 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite,
|
|||
}
|
||||
}
|
||||
|
||||
meta_wayland_surface_set_main_monitor (surface, logical_monitor);
|
||||
meta_wayland_surface_update_outputs (surface);
|
||||
}
|
||||
|
||||
|
|
|
@ -483,13 +483,24 @@ static void
|
|||
data_device_update_position (MetaWaylandDragGrab *drag_grab,
|
||||
graphene_point_t *point)
|
||||
{
|
||||
MetaWaylandCompositor *compositor =
|
||||
meta_wayland_seat_get_compositor (drag_grab->seat);
|
||||
MetaContext *context = meta_wayland_compositor_get_context (compositor);
|
||||
MetaBackend *backend = meta_context_get_backend (context);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaFeedbackActor *feedback_actor =
|
||||
META_FEEDBACK_ACTOR (drag_grab->feedback_actor);
|
||||
MetaLogicalMonitor *monitor;
|
||||
|
||||
if (!drag_grab->drag_surface)
|
||||
return;
|
||||
|
||||
meta_feedback_actor_set_position (feedback_actor, point->x, point->y);
|
||||
|
||||
monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager,
|
||||
point->x, point->y);
|
||||
meta_wayland_surface_set_main_monitor (drag_grab->drag_surface, monitor);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
|
@ -36,6 +36,7 @@ typedef struct _MetaWaylandShellSurfacePrivate
|
|||
|
||||
gulong unmanaging_handler_id;
|
||||
gulong highest_scale_monitor_handler_id;
|
||||
GBinding *main_monitor_binding;
|
||||
} MetaWaylandShellSurfacePrivate;
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaWaylandShellSurface,
|
||||
|
@ -114,6 +115,9 @@ clear_window (MetaWaylandShellSurface *shell_surface)
|
|||
clutter_actor_set_reactive (CLUTTER_ACTOR (surface_actor), FALSE);
|
||||
|
||||
meta_wayland_surface_notify_unmapped (surface);
|
||||
|
||||
meta_wayland_surface_set_main_monitor (surface, NULL);
|
||||
g_clear_object (&priv->main_monitor_binding);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -151,6 +155,11 @@ meta_wayland_shell_surface_set_window (MetaWaylandShellSurface *shell_surface,
|
|||
|
||||
meta_window_update_monitor (window, META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
|
||||
|
||||
priv->main_monitor_binding =
|
||||
g_object_bind_property (G_OBJECT (window), "main-monitor",
|
||||
G_OBJECT (surface), "main-monitor",
|
||||
G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
|
||||
|
||||
priv->highest_scale_monitor_handler_id =
|
||||
g_signal_connect_swapped (window, "highest-scale-monitor-changed",
|
||||
G_CALLBACK (meta_wayland_surface_notify_highest_scale_monitor),
|
||||
|
|
|
@ -707,6 +707,7 @@ meta_wayland_surface_apply_placement_ops (MetaWaylandSurface *parent,
|
|||
if (!op->sibling)
|
||||
{
|
||||
surface->applied_state.parent = NULL;
|
||||
meta_wayland_surface_set_main_monitor (surface, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -732,6 +733,8 @@ meta_wayland_surface_apply_placement_ops (MetaWaylandSurface *parent,
|
|||
surface->applied_state.subsurface_branch_node);
|
||||
break;
|
||||
}
|
||||
|
||||
meta_wayland_surface_set_main_monitor (surface, parent->main_monitor);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2559,6 +2562,8 @@ meta_wayland_surface_set_main_monitor_internal (MetaWaylandSurface *surface,
|
|||
MetaLogicalMonitor *logical_monitor,
|
||||
gconstpointer not_this_monitor)
|
||||
{
|
||||
MetaWaylandSurface *subsurface_surface;
|
||||
|
||||
if (surface->main_monitor == logical_monitor)
|
||||
return;
|
||||
|
||||
|
@ -2579,6 +2584,10 @@ meta_wayland_surface_set_main_monitor_internal (MetaWaylandSurface *surface,
|
|||
surface->main_monitor = logical_monitor;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (surface), obj_props[PROP_MAIN_MONITOR]);
|
||||
|
||||
META_WAYLAND_SURFACE_FOREACH_SUBSURFACE (&surface->committed_state,
|
||||
subsurface_surface)
|
||||
meta_wayland_surface_set_main_monitor (subsurface_surface, logical_monitor);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue