From 499c91ec9719e22f5f30f9eadac0f228533f99ad Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 9 Nov 2017 11:34:59 -0700 Subject: [PATCH] Use connector_type from mutter to fix detection of builtin display on NVIDIA --- libgnome-desktop/gnome-rr-config.c | 6 +++--- libgnome-desktop/gnome-rr-output-info.c | 2 ++ libgnome-desktop/gnome-rr-private.h | 5 +++-- libgnome-desktop/gnome-rr.c | 27 ++++++++++++++++++--------- 4 files changed, 26 insertions(+), 14 deletions(-) Index: gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr-config.c =================================================================== --- gnome-desktop3-3.28.1.orig/libgnome-desktop/gnome-rr-config.c +++ gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr-config.c @@ -163,6 +163,7 @@ gnome_rr_config_load_current (GnomeRRCon output->priv->name = g_strdup (gnome_rr_output_get_name (rr_output)); output->priv->connected = TRUE; output->priv->display_name = g_strdup (gnome_rr_output_get_display_name (rr_output)); + output->priv->connector_type = g_strdup (_gnome_rr_output_get_connector_type (rr_output)); output->priv->config = config; output->priv->is_tiled = _gnome_rr_output_get_tile_info (rr_output, &output->priv->tile); @@ -438,6 +439,7 @@ make_outputs (GnomeRRConfig *config) new->priv->name = g_strdup (old->priv->name); new->priv->display_name = g_strdup (old->priv->display_name); + new->priv->connector_type = g_strdup (old->priv->connector_type); new->priv->vendor = g_strdup (old->priv->vendor); new->priv->product = g_strdup (old->priv->product); new->priv->serial = g_strdup (old->priv->serial); @@ -592,9 +594,7 @@ gnome_rr_config_ensure_primary (GnomeRRC top_left = info; } if (builtin_display == NULL - && _gnome_rr_output_name_is_builtin_display (info->priv->name)) { - /* shame we can't find the connector type - as with gnome_rr_output_is_builtin_display */ + && _gnome_rr_output_connector_type_is_builtin_display (info->priv->connector_type)) { builtin_display = info; } } Index: gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr-output-info.c =================================================================== --- gnome-desktop3-3.28.1.orig/libgnome-desktop/gnome-rr-output-info.c +++ gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr-output-info.c @@ -40,6 +40,7 @@ gnome_rr_output_info_init (GnomeRROutput self->priv->on = FALSE; self->priv->rotation = GNOME_RR_ROTATION_0; self->priv->display_name = NULL; + self->priv->connector_type = NULL; } static void @@ -49,6 +50,7 @@ gnome_rr_output_info_finalize (GObject * g_free (self->priv->name); g_free (self->priv->display_name); + g_free (self->priv->connector_type); g_free (self->priv->product); g_free (self->priv->serial); g_free (self->priv->vendor); Index: gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr-private.h =================================================================== --- gnome-desktop3-3.28.1.orig/libgnome-desktop/gnome-rr-private.h +++ gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr-private.h @@ -86,6 +86,7 @@ struct _GnomeRROutputInfoPrivate int pref_width; int pref_height; char * display_name; + char * connector_type; gboolean primary; gboolean underscanning; @@ -105,7 +106,7 @@ struct _GnomeRRConfigPrivate GnomeRROutputInfo **outputs; }; -gboolean _gnome_rr_output_name_is_builtin_display (const char *name); +gboolean _gnome_rr_output_connector_type_is_builtin_display (const char *connector_type); gboolean _gnome_rr_screen_apply_configuration (GnomeRRScreen *screen, gboolean persistent, @@ -113,7 +114,7 @@ gboolean _gnome_rr_screen_apply_configur GVariant *outputs, GError **error); - +const char * _gnome_rr_output_get_connector_type (GnomeRROutput *output); gboolean _gnome_rr_output_get_tile_info (GnomeRROutput *output, GnomeRRTile *tile); gboolean _gnome_rr_output_get_tiled_display_size (GnomeRROutput *output, Index: gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr.c =================================================================== --- gnome-desktop3-3.28.1.orig/libgnome-desktop/gnome-rr.c +++ gnome-desktop3-3.28.1/libgnome-desktop/gnome-rr.c @@ -64,6 +64,7 @@ struct GnomeRROutput char * name; char * display_name; + char * connector_type; GnomeRRCrtc * current_crtc; GnomeRRCrtc ** possible_crtcs; GnomeRROutput ** clones; @@ -1391,6 +1392,7 @@ output_initialize (GnomeRROutput *output g_variant_lookup (properties, "width-mm", "i", &output->width_mm); g_variant_lookup (properties, "height-mm", "i", &output->height_mm); g_variant_lookup (properties, "display-name", "s", &output->display_name); + g_variant_lookup (properties, "connector-type", "s", &output->connector_type); g_variant_lookup (properties, "backlight", "i", &output->backlight); g_variant_lookup (properties, "min-backlight-step", "i", &output->min_backlight_step); g_variant_lookup (properties, "primary", "b", &output->is_primary); @@ -1435,6 +1437,7 @@ output_copy (const GnomeRROutput *from) output->info = from->info; output->name = g_strdup (from->name); output->display_name = g_strdup (from->display_name); + output->connector_type = g_strdup (from->connector_type); output->vendor = g_strdup (from->vendor); output->product = g_strdup (from->product); output->serial = g_strdup (from->serial); @@ -1482,6 +1485,7 @@ output_free (GnomeRROutput *output) g_free (output->product); g_free (output->serial); g_free (output->display_name); + g_free (output->connector_type); g_free (output->edid_file); if (output->edid) g_bytes_unref (output->edid); @@ -1665,17 +1669,14 @@ gnome_rr_output_get_possible_crtcs (Gnom } gboolean -_gnome_rr_output_name_is_builtin_display (const char *name) +_gnome_rr_output_connector_type_is_builtin_display (const char *connector_type) { - if (!name) + if (!connector_type) return FALSE; - if (strstr (name, "lvds") || /* Most drivers use an "LVDS" prefix... */ - strstr (name, "LVDS") || - strstr (name, "Lvds") || - strstr (name, "LCD") || /* ... but fglrx uses "LCD" in some versions. Shoot me now, kthxbye. */ - strstr (name, "eDP") || /* eDP is for internal built-in panel connections */ - strstr (name, "DSI")) + if (strcmp (connector_type, "LVDS") == 0 || + strcmp (connector_type, "eDP") == 0 || + strcmp (connector_type, "DSI") == 0) return TRUE; return FALSE; @@ -1686,7 +1687,7 @@ gnome_rr_output_is_builtin_display (Gnom { g_return_val_if_fail (output != NULL, FALSE); - return _gnome_rr_output_name_is_builtin_display (output->name); + return _gnome_rr_output_connector_type_is_builtin_display (output->connector_type); } /** @@ -2230,6 +2231,14 @@ gnome_rr_output_supports_underscanning ( return output->supports_underscanning; } +const char * +_gnome_rr_output_get_connector_type (GnomeRROutput *output) +{ + g_return_val_if_fail (output != NULL, NULL); + + return output->connector_type; +} + gboolean _gnome_rr_output_get_tile_info (GnomeRROutput *output, GnomeRRTile *tile)