Skip to content

Commit

Permalink
meta-compositor-x11.c: Don't disable fractional scaling when
Browse files Browse the repository at this point in the history
unredirecting a fullscreen window.

Issue when unredirecting a screen-sized window (such as the
cinnamon-screensaver stage window):
- Fractional scaling is disabled, triggering a reconfigure due
  to the screen size changing.
- This means a screen-sized window is no longer screen-sized,
  resulting in muffin re-enabling unredirection on this window.
- Since there are now no unredirected windows, fractional scaling
  can be re-enabled, causing the screen and window sizes to match
  once more.
- Repeat the cycle.
  • Loading branch information
mtwebster committed Dec 19, 2023
1 parent a275589 commit bf23425
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 128 deletions.
4 changes: 0 additions & 4 deletions src/backends/meta-monitor-manager-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ struct _MetaMonitorManager
int screen_height;

GList *monitors;
GList *scale_override_monitors;

GList *logical_monitors;
MetaLogicalMonitor *primary_logical_monitor;
Expand Down Expand Up @@ -378,9 +377,6 @@ gboolean meta_monitor_manager_is_scale_supported (MetaMonitorManager

float meta_monitor_manager_get_maximum_crtc_scale (MetaMonitorManager *manager);

gboolean meta_monitor_manager_disable_scale_for_monitor (MetaMonitorManager *manager,
MetaLogicalMonitor *monitor);

MetaMonitorManagerCapability
meta_monitor_manager_get_capabilities (MetaMonitorManager *manager);

Expand Down
41 changes: 1 addition & 40 deletions src/backends/meta-monitor-manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,9 +561,6 @@ meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager
monitor,
monitor_mode);

if (g_list_find (manager->scale_override_monitors, monitor))
return ceilf (scale);

return scale;
}

Expand Down Expand Up @@ -678,8 +675,7 @@ static gboolean
should_use_stored_config (MetaMonitorManager *manager)
{
return (manager->in_init ||
(!manager->scale_override_monitors &&
!meta_monitor_manager_has_hotplug_mode_update (manager)));
!meta_monitor_manager_has_hotplug_mode_update (manager));
}

MetaMonitorsConfig *
Expand Down Expand Up @@ -1537,41 +1533,6 @@ request_persistent_confirmation (MetaMonitorManager *manager)
g_signal_emit (manager, signals[CONFIRM_DISPLAY_CHANGE], 0);
}

gboolean
meta_monitor_manager_disable_scale_for_monitor (MetaMonitorManager *manager,
MetaLogicalMonitor *monitor)
{
switch (manager->layout_mode)
{
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
case META_LOGICAL_MONITOR_LAYOUT_MODE_GLOBAL_UI_LOGICAL:
break;
default:
return FALSE;
}

if (monitor && fmodf (monitor->scale, 1.0) != 0.0f)
{
if (manager->scale_override_monitors)
{
g_clear_pointer (&manager->scale_override_monitors, g_list_free);
g_object_unref (meta_monitor_config_manager_pop_previous (manager->config_manager));
}

manager->scale_override_monitors = g_list_copy (monitor->monitors);
meta_monitor_manager_ensure_configured (manager);
return TRUE;
}

if (manager->scale_override_monitors)
{
g_clear_pointer (&manager->scale_override_monitors, g_list_free);
restore_previous_config (manager);
}

return FALSE;
}

#define META_DISPLAY_CONFIG_MODE_FLAGS_PREFERRED (1 << 0)
#define META_DISPLAY_CONFIG_MODE_FLAGS_CURRENT (1 << 1)

Expand Down
96 changes: 12 additions & 84 deletions src/compositor/meta-compositor-x11.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,91 +271,20 @@ shape_cow_for_window (MetaCompositorX11 *compositor_x11,
}
}

static void
on_redirected_monitor_changed (MetaWindow *window,
int old_monitor,
MetaCompositorX11 *compositor_x11)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);

if (old_monitor >= 0 && window->monitor &&
window->monitor->number != old_monitor)
{
g_signal_handlers_block_by_func (window,
on_redirected_monitor_changed,
compositor_x11);

if (!compositor_x11->randr_scale_disabled)
{
compositor_x11->randr_scale_disabled =
meta_monitor_manager_disable_scale_for_monitor (monitor_manager,
window->monitor);
}

g_signal_handlers_unblock_by_func (window,
on_redirected_monitor_changed,
compositor_x11);
}
else
shape_cow_for_window (META_COMPOSITOR_X11 (compositor_x11), window);
}

static MetaWindow *
get_unredirectable_window (MetaCompositorX11 *compositor_x11)
{
MetaCompositor *compositor = META_COMPOSITOR (compositor_x11);
MetaWindowActor *window_actor;
MetaWindowActorX11 *window_actor_x11;

window_actor = meta_compositor_get_top_window_actor (compositor);
if (!window_actor)
return NULL;

window_actor_x11 = META_WINDOW_ACTOR_X11 (window_actor);
if (!meta_window_actor_x11_should_unredirect (window_actor_x11))
return NULL;

return meta_window_actor_get_meta_window (window_actor);
}

static void
set_unredirected_window (MetaCompositorX11 *compositor_x11,
MetaWindow *window)
{
MetaBackend *backend;
MetaMonitorManager *monitor_manager;
MetaWindow *prev_unredirected_window = compositor_x11->unredirected_window;

if (prev_unredirected_window == window)
{
if (!window && compositor_x11->randr_scale_disabled &&
!get_unredirectable_window (compositor_x11))
{
backend = meta_get_backend ();
monitor_manager = meta_backend_get_monitor_manager (backend);

compositor_x11->randr_scale_disabled =
meta_monitor_manager_disable_scale_for_monitor (monitor_manager,
NULL);
}

return;
}

backend = meta_get_backend ();
monitor_manager = meta_backend_get_monitor_manager (backend);
return;

if (prev_unredirected_window)
{
MetaWindowActor *window_actor;
MetaWindowActorX11 *window_actor_x11;

g_signal_handlers_disconnect_by_func (prev_unredirected_window,
on_redirected_monitor_changed,
compositor_x11);

window_actor = meta_window_actor_from_window (prev_unredirected_window);
window_actor_x11 = META_WINDOW_ACTOR_X11 (window_actor);
meta_window_actor_x11_set_unredirected (window_actor_x11, FALSE);
Expand All @@ -369,17 +298,6 @@ set_unredirected_window (MetaCompositorX11 *compositor_x11,
MetaWindowActor *window_actor;
MetaWindowActorX11 *window_actor_x11;

if (!compositor_x11->randr_scale_disabled)
{
compositor_x11->randr_scale_disabled =
meta_monitor_manager_disable_scale_for_monitor (monitor_manager,
window->monitor);
}

g_signal_connect_object (window, "monitor-changed",
G_CALLBACK (on_redirected_monitor_changed),
compositor_x11, 0);

window_actor = meta_window_actor_from_window (window);
window_actor_x11 = META_WINDOW_ACTOR_X11 (window_actor);
meta_window_actor_x11_set_unredirected (window_actor_x11, TRUE);
Expand All @@ -391,11 +309,21 @@ maybe_unredirect_top_window (MetaCompositorX11 *compositor_x11)
{
MetaCompositor *compositor = META_COMPOSITOR (compositor_x11);
MetaWindow *window_to_unredirect = NULL;
MetaWindowActor *window_actor;
MetaWindowActorX11 *window_actor_x11;

if (meta_compositor_is_unredirect_inhibited (compositor))
goto out;

window_to_unredirect = get_unredirectable_window (compositor_x11);
window_actor = meta_compositor_get_top_window_actor (compositor);
if (!window_actor)
goto out;

window_actor_x11 = META_WINDOW_ACTOR_X11 (window_actor);
if (!meta_window_actor_x11_should_unredirect (window_actor_x11))
goto out;

window_to_unredirect = meta_window_actor_get_meta_window (window_actor);

out:
set_unredirected_window (compositor_x11, window_to_unredirect);
Expand Down

0 comments on commit bf23425

Please sign in to comment.