monitor-manager: Store logical monitors in a GList
Instead of storing the logical monitors in an array and having users either look up them in the array given an index or iterate using indices, put it in a GList, and use GList iterators when iterating and alternative API where array indices were previously used. This allows for more liberty regarding the type of the logical monitor. https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
@ -344,9 +344,7 @@ meta_screen_ensure_xinerama_indices (MetaScreen *screen)
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
unsigned int n_logical_monitors;
|
||||
unsigned int i;
|
||||
GList *logical_monitors, *l;
|
||||
XineramaScreenInfo *infos;
|
||||
int n_infos, j;
|
||||
|
||||
@ -366,18 +364,19 @@ meta_screen_ensure_xinerama_indices (MetaScreen *screen)
|
||||
}
|
||||
|
||||
logical_monitors =
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
&n_logical_monitors);
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||
|
||||
for (i = 0; i < n_logical_monitors; ++i)
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
for (j = 0; j < n_infos; ++j)
|
||||
{
|
||||
if (logical_monitors[i].rect.x == infos[j].x_org &&
|
||||
logical_monitors[i].rect.y == infos[j].y_org &&
|
||||
logical_monitors[i].rect.width == infos[j].width &&
|
||||
logical_monitors[i].rect.height == infos[j].height)
|
||||
logical_monitors[i].xinerama_index = j;
|
||||
if (logical_monitor->rect.x == infos[j].x_org &&
|
||||
logical_monitor->rect.y == infos[j].y_org &&
|
||||
logical_monitor->rect.width == infos[j].width &&
|
||||
logical_monitor->rect.height == infos[j].height)
|
||||
logical_monitor->xinerama_index = j;
|
||||
}
|
||||
}
|
||||
|
||||
@ -402,19 +401,20 @@ meta_screen_xinerama_index_to_logical_monitor (MetaScreen *screen,
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
unsigned int n_logical_monitors;
|
||||
unsigned int i;
|
||||
GList *logical_monitors, *l;
|
||||
|
||||
meta_screen_ensure_xinerama_indices (screen);
|
||||
|
||||
logical_monitors =
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
&n_logical_monitors);
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
if (logical_monitors[i].xinerama_index == xinerama_index)
|
||||
return &logical_monitors[i];
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
if (logical_monitor->xinerama_index == xinerama_index)
|
||||
return logical_monitor;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -1520,7 +1520,7 @@ meta_screen_get_monitor_geometry (MetaScreen *screen,
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
#ifndef G_DISABLE_CHECKS
|
||||
int n_logical_monitors =
|
||||
meta_monitor_manager_get_num_logical_monitors (monitor_manager);
|
||||
@ -1530,10 +1530,10 @@ meta_screen_get_monitor_geometry (MetaScreen *screen,
|
||||
g_return_if_fail (monitor >= 0 && monitor < n_logical_monitors);
|
||||
g_return_if_fail (geometry != NULL);
|
||||
|
||||
logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
NULL);
|
||||
|
||||
*geometry = logical_monitors[monitor].rect;
|
||||
logical_monitor =
|
||||
meta_monitor_manager_get_logical_monitor_from_number (monitor_manager,
|
||||
monitor);
|
||||
*geometry = logical_monitor->rect;
|
||||
}
|
||||
|
||||
#define _NET_WM_ORIENTATION_HORZ 0
|
||||
@ -2589,9 +2589,7 @@ check_fullscreen_func (gpointer data)
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
unsigned int n_logical_monitors;
|
||||
unsigned int i;
|
||||
GList *logical_monitors, *l;
|
||||
MetaWindow *window;
|
||||
GSList *fullscreen_monitors = NULL;
|
||||
GSList *obscured_monitors = NULL;
|
||||
@ -2600,8 +2598,7 @@ check_fullscreen_func (gpointer data)
|
||||
screen->check_fullscreen_later = 0;
|
||||
|
||||
logical_monitors =
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
&n_logical_monitors);
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||
|
||||
/* We consider a monitor in fullscreen if it contains a fullscreen window;
|
||||
* however we make an exception for maximized windows above the fullscreen
|
||||
@ -2647,9 +2644,9 @@ check_fullscreen_func (gpointer data)
|
||||
|
||||
meta_window_get_frame_rect (window, &window_rect);
|
||||
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
if (meta_rectangle_overlap (&window_rect,
|
||||
&logical_monitor->rect) &&
|
||||
@ -2663,9 +2660,9 @@ check_fullscreen_func (gpointer data)
|
||||
|
||||
g_slist_free (obscured_monitors);
|
||||
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
gboolean in_fullscreen;
|
||||
|
||||
in_fullscreen = g_slist_find (fullscreen_monitors,
|
||||
@ -2723,7 +2720,7 @@ meta_screen_get_monitor_in_fullscreen (MetaScreen *screen,
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
#ifndef G_DISABLE_CHECKS
|
||||
int n_logical_monitors =
|
||||
meta_monitor_manager_get_num_logical_monitors (monitor_manager);
|
||||
@ -2733,11 +2730,12 @@ meta_screen_get_monitor_in_fullscreen (MetaScreen *screen,
|
||||
g_return_val_if_fail (monitor >= 0 &&
|
||||
monitor < n_logical_monitors, FALSE);
|
||||
|
||||
logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
NULL);
|
||||
logical_monitor =
|
||||
meta_monitor_manager_get_logical_monitor_from_number (monitor_manager,
|
||||
monitor);
|
||||
|
||||
/* We use -1 as a flag to mean "not known yet" for notification purposes */
|
||||
return logical_monitors[monitor].in_fullscreen == TRUE;
|
||||
return logical_monitor->in_fullscreen == TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -3517,17 +3517,14 @@ find_monitor_by_winsys_id (MetaWindow *window,
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
unsigned int n_logical_monitors;
|
||||
unsigned int i;
|
||||
GList *logical_monitors, *l;
|
||||
|
||||
logical_monitors =
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
&n_logical_monitors);
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = &logical_monitors[i];
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
if (logical_monitor->winsys_id == winsys_id)
|
||||
return logical_monitor;
|
||||
|
@ -56,6 +56,7 @@ struct _MetaWorkspace
|
||||
|
||||
MetaRectangle work_area_screen;
|
||||
MetaRectangle *work_area_monitor;
|
||||
gint n_work_area_monitor;
|
||||
GList *screen_region;
|
||||
GList **monitor_region;
|
||||
gint n_monitor_regions;
|
||||
|
@ -754,9 +754,8 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
GList *windows;
|
||||
GList *tmp;
|
||||
MetaLogicalMonitor *logical_monitors;
|
||||
unsigned int n_logical_monitors;
|
||||
unsigned int i;
|
||||
GList *logical_monitors, *l;
|
||||
int i;
|
||||
MetaRectangle work_area;
|
||||
|
||||
if (!workspace->work_areas_invalid)
|
||||
@ -792,18 +791,23 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
|
||||
g_assert (workspace->screen_region == NULL);
|
||||
|
||||
logical_monitors =
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager,
|
||||
&n_logical_monitors);
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||
|
||||
workspace->monitor_region = g_new (GList*, n_logical_monitors);
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
workspace->n_monitor_regions =
|
||||
(int) meta_monitor_manager_get_num_logical_monitors (monitor_manager);
|
||||
workspace->monitor_region = g_new (GList*, workspace->n_monitor_regions);
|
||||
i = 0;
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
workspace->monitor_region[i] =
|
||||
meta_rectangle_get_minimal_spanning_set_for_region (
|
||||
&logical_monitors[i].rect,
|
||||
&logical_monitor->rect,
|
||||
workspace->all_struts);
|
||||
|
||||
i++;
|
||||
}
|
||||
workspace->n_monitor_regions = (int) n_logical_monitors;
|
||||
|
||||
workspace->screen_region =
|
||||
meta_rectangle_get_minimal_spanning_set_for_region (
|
||||
@ -868,11 +872,17 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
|
||||
|
||||
/* Now find the work areas for each monitor */
|
||||
g_free (workspace->work_area_monitor);
|
||||
workspace->work_area_monitor = g_new (MetaRectangle, n_logical_monitors);
|
||||
workspace->n_work_area_monitor =
|
||||
meta_monitor_manager_get_num_logical_monitors (monitor_manager);
|
||||
workspace->work_area_monitor = g_new (MetaRectangle,
|
||||
workspace->n_work_area_monitor);
|
||||
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
i = 0;
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
work_area = logical_monitors[i].rect;
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
work_area = logical_monitor->rect;
|
||||
|
||||
if (workspace->monitor_region[i] == NULL)
|
||||
/* FIXME: constraints.c untested with this, but it might be nice for
|
||||
@ -894,6 +904,8 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
|
||||
workspace->work_area_monitor[i].y,
|
||||
workspace->work_area_monitor[i].width,
|
||||
workspace->work_area_monitor[i].height);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
/* STEP 4: Make sure the screen_region is nonempty (separate from step 2
|
||||
@ -914,8 +926,12 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
|
||||
meta_rectangle_find_onscreen_edges (&workspace->screen->rect,
|
||||
workspace->all_struts);
|
||||
tmp = NULL;
|
||||
for (i = 0; i < n_logical_monitors; i++)
|
||||
tmp = g_list_prepend (tmp, &logical_monitors[i].rect);
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
tmp = g_list_prepend (tmp, &logical_monitor->rect);
|
||||
}
|
||||
workspace->monitor_edges =
|
||||
meta_rectangle_find_nonintersected_monitor_edges (tmp,
|
||||
workspace->all_struts);
|
||||
|
Reference in New Issue
Block a user