summaryrefslogtreecommitdiff
path: root/src/core/screen.c
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2016-12-02 16:00:03 +0800
committerJonas Ådahl <jadahl@gmail.com>2017-01-25 16:28:52 +0800
commit1fb0e8e9bbd8ca645c6b8752be9068ee8ca61fb5 (patch)
treebd7a96bb19b636d1dfbbd6365ccbfb3d7f0fc4f6 /src/core/screen.c
parent20b8743f210e690d45689691d7b0c1757921a7dd (diff)
downloadmutter-1fb0e8e9bbd8ca645c6b8752be9068ee8ca61fb5.tar.gz
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
Diffstat (limited to 'src/core/screen.c')
-rw-r--r--src/core/screen.c72
1 files changed, 35 insertions, 37 deletions
diff --git a/src/core/screen.c b/src/core/screen.c
index 4b6006551..16614368e 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -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 (l = logical_monitors; l; l = l->next)
+ {
+ MetaLogicalMonitor *logical_monitor = l->data;
- for (i = 0; i < n_logical_monitors; i++)
- if (logical_monitors[i].xinerama_index == xinerama_index)
- return &logical_monitors[i];
+ 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