screen: Don't use monitor indices in check_fullscreen_func

Rewrite check_fullscreen_func to not use indexes (and
offset-index-as-pointer) tricks. This also removes the usage of an API
constructing temporary logical monitor arrays carrying indices.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
Jonas Ådahl 2016-12-02 15:38:08 +08:00
parent c98bab8327
commit 410bad88a8
3 changed files with 29 additions and 18 deletions

View File

@ -2633,30 +2633,31 @@ check_fullscreen_func (gpointer data)
else if (window->maximized_horizontally && else if (window->maximized_horizontally &&
window->maximized_vertically) window->maximized_vertically)
{ {
int monitor_index = meta_window_get_monitor (window); MetaLogicalMonitor *logical_monitor;
/* + 1 to avoid NULL */
gpointer monitor_p = GINT_TO_POINTER(monitor_index + 1); logical_monitor = meta_window_get_main_logical_monitor (window);
if (!g_slist_find (obscured_monitors, monitor_p)) if (!g_slist_find (obscured_monitors, logical_monitor))
obscured_monitors = g_slist_prepend (obscured_monitors, monitor_p); obscured_monitors = g_slist_prepend (obscured_monitors,
logical_monitor);
} }
if (covers_monitors) if (covers_monitors)
{ {
int *monitors; MetaRectangle window_rect;
gsize n_monitors;
gsize j;
monitors = meta_window_get_all_monitors (window, &n_monitors); meta_window_get_frame_rect (window, &window_rect);
for (j = 0; j < n_monitors; j++)
for (i = 0; i < n_logical_monitors; i++)
{ {
/* + 1 to avoid NULL */ MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
gpointer monitor_p = GINT_TO_POINTER(monitors[j] + 1);
if (!g_slist_find (fullscreen_monitors, monitor_p) &&
!g_slist_find (obscured_monitors, monitor_p))
fullscreen_monitors = g_slist_prepend (fullscreen_monitors, monitor_p);
}
g_free (monitors); if (meta_rectangle_overlap (&window_rect,
&logical_monitor->rect) &&
!g_slist_find (fullscreen_monitors, logical_monitor) &&
!g_slist_find (obscured_monitors, logical_monitor))
fullscreen_monitors = g_slist_prepend (fullscreen_monitors,
logical_monitor);
}
} }
} }
@ -2665,7 +2666,10 @@ check_fullscreen_func (gpointer data)
for (i = 0; i < n_logical_monitors; i++) for (i = 0; i < n_logical_monitors; i++)
{ {
MetaLogicalMonitor *logical_monitor = &logical_monitors[i]; MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
gboolean in_fullscreen = g_slist_find (fullscreen_monitors, GINT_TO_POINTER (i + 1)) != NULL; gboolean in_fullscreen;
in_fullscreen = g_slist_find (fullscreen_monitors,
logical_monitor) != NULL;
if (in_fullscreen != logical_monitor->in_fullscreen) if (in_fullscreen != logical_monitor->in_fullscreen)
{ {
logical_monitor->in_fullscreen = in_fullscreen; logical_monitor->in_fullscreen = in_fullscreen;

View File

@ -731,6 +731,7 @@ void meta_window_activate_full (MetaWindow *window,
MetaLogicalMonitor * meta_window_calculate_main_logical_monitor (MetaWindow *window); MetaLogicalMonitor * meta_window_calculate_main_logical_monitor (MetaWindow *window);
MetaLogicalMonitor * meta_window_get_main_logical_monitor (MetaWindow *window);
void meta_window_update_monitor (MetaWindow *window, void meta_window_update_monitor (MetaWindow *window,
gboolean user_op); gboolean user_op);

View File

@ -3548,6 +3548,12 @@ meta_window_get_monitor (MetaWindow *window)
return window->monitor->number; return window->monitor->number;
} }
MetaLogicalMonitor *
meta_window_get_main_logical_monitor (MetaWindow *window)
{
return window->monitor;
}
static MetaLogicalMonitor * static MetaLogicalMonitor *
find_monitor_by_winsys_id (MetaWindow *window, find_monitor_by_winsys_id (MetaWindow *window,
guint winsys_id) guint winsys_id)