diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2016-12-02 16:00:03 +0800 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2017-01-25 16:28:52 +0800 |
commit | 1fb0e8e9bbd8ca645c6b8752be9068ee8ca61fb5 (patch) | |
tree | bd7a96bb19b636d1dfbbd6365ccbfb3d7f0fc4f6 /src/core/screen.c | |
parent | 20b8743f210e690d45689691d7b0c1757921a7dd (diff) | |
download | mutter-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.c | 72 |
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 |