diff --git a/src/core/screen-private.h b/src/core/screen-private.h index 1d98a1810..acb826a85 100644 --- a/src/core/screen-private.h +++ b/src/core/screen-private.h @@ -99,6 +99,7 @@ struct _MetaScreen guint32 wm_sn_timestamp; MetaMonitorInfo *monitor_infos; + int primary_monitor_index; int n_monitor_infos; /* Cache the current monitor */ diff --git a/src/core/screen.c b/src/core/screen.c index b6abbe3b9..252c3e329 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -352,6 +352,18 @@ reload_monitor_infos (MetaScreen *screen) screen->n_monitor_infos = 0; screen->last_monitor_index = 0; + /* Xinerama doesn't have a concept of primary monitor, however XRandR + * does. However, the XRandR xinerama compat code always sorts the + * primary output first, so we rely on that here. We could use the + * native XRandR calls instead of xinerama, but that would be + * slightly problematic for _NET_WM_FULLSCREEN_MONITORS support, as + * that is defined in terms of xinerama monitor indexes. + * So, since we don't need anything in xrandr except the primary + * we can keep using xinerama and use the first monitor as the + * primary. + */ + screen->primary_monitor_index = 0; + screen->display->monitor_cache_invalidated = TRUE; if (g_getenv ("MUTTER_DEBUG_XINERAMA")) @@ -2140,6 +2152,22 @@ meta_screen_get_n_monitors (MetaScreen *screen) return screen->n_monitor_infos; } +/** + * meta_screen_get_primary_monitor: + * @screen: a #MetaScreen + * + * Gets the index of the primary monitor on this @screen. + * + * Return value: a monitor index + */ +int +meta_screen_get_primary_monitor (MetaScreen *screen) +{ + g_return_val_if_fail (META_IS_SCREEN (screen), 0); + + return screen->primary_monitor_index; +} + /** * meta_screen_get_monitor_geometry: * @screen: a #MetaScreen diff --git a/src/meta/screen.h b/src/meta/screen.h index ddb29a9e8..06297cc53 100644 --- a/src/meta/screen.h +++ b/src/meta/screen.h @@ -76,6 +76,7 @@ int meta_screen_get_active_workspace_index (MetaScreen *screen); MetaWorkspace * meta_screen_get_active_workspace (MetaScreen *screen); int meta_screen_get_n_monitors (MetaScreen *screen); +int meta_screen_get_primary_monitor (MetaScreen *screen); void meta_screen_get_monitor_geometry (MetaScreen *screen, int monitor, MetaRectangle *geometry);