display: Handle lid being closed a bit better

If the lid is closed we shouldn't allow the builtin display to be
configured.
This commit is contained in:
Rui Matos 2017-08-23 17:06:57 +02:00
parent 088f35617c
commit 0a0ac31b51

View file

@ -437,6 +437,7 @@ paint_output (CcDisplayPanel *panel,
gint allocated_width, gint allocated_width,
gint allocated_height) gint allocated_height)
{ {
CcDisplayPanelPrivate *priv = panel->priv;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
gint x, y, width, height; gint x, y, width, height;
@ -462,14 +463,13 @@ paint_output (CcDisplayPanel *panel,
cairo_rectangle (cr, x, y, width, height); cairo_rectangle (cr, x, y, width, height);
cairo_fill (cr); cairo_fill (cr);
if (cc_display_monitor_is_active (output)) if (!cc_display_monitor_is_active (output) ||
{ (cc_display_monitor_is_builtin (output) && priv->lid_is_closed))
pixbuf = gnome_bg_create_thumbnail (panel->priv->background,
panel->priv->thumbnail_factory,
gdk_screen_get_default (), width, height);
}
else
pixbuf = NULL; pixbuf = NULL;
else
pixbuf = gnome_bg_create_thumbnail (priv->background,
priv->thumbnail_factory,
gdk_screen_get_default (), width, height);
if (cc_display_monitor_is_primary (output) if (cc_display_monitor_is_primary (output)
|| cc_display_config_is_cloning (configuration)) || cc_display_config_is_cloning (configuration))
@ -1536,14 +1536,20 @@ replace_current_output_ui (GtkWidget *frame,
} }
static guint static guint
count_active_outputs (GList *outputs) count_active_outputs (CcDisplayPanel *panel)
{ {
GList *l; CcDisplayPanelPrivate *priv = panel->priv;
GList *outputs, *l;
guint active = 0; guint active = 0;
outputs = cc_display_config_get_monitors (priv->current_config);
for (l = outputs; l != NULL; l = l->next) for (l = outputs; l != NULL; l = l->next)
{ {
CcDisplayMonitor *output = l->data; CcDisplayMonitor *output = l->data;
if (cc_display_monitor_is_active (output)) if (!cc_display_monitor_is_active (output) ||
(cc_display_monitor_is_builtin (output) && priv->lid_is_closed))
continue;
else
active++; active++;
} }
return active; return active;
@ -2021,7 +2027,7 @@ make_two_output_ui (CcDisplayPanel *panel)
if (cc_display_config_is_cloning (priv->current_config) && show_mirror) if (cc_display_config_is_cloning (priv->current_config) && show_mirror)
gtk_stack_set_visible_child_name (GTK_STACK (stack), "mirror"); gtk_stack_set_visible_child_name (GTK_STACK (stack), "mirror");
else if (count_active_outputs (cc_display_config_get_monitors (priv->current_config)) > 1) else if (count_active_outputs (panel) > 1)
gtk_stack_set_visible_child_name (GTK_STACK (stack), "join"); gtk_stack_set_visible_child_name (GTK_STACK (stack), "join");
else else
gtk_stack_set_visible_child_name (GTK_STACK (stack), "single"); gtk_stack_set_visible_child_name (GTK_STACK (stack), "single");
@ -2058,8 +2064,8 @@ make_output_switch (CcDisplayPanel *panel)
button, G_CONNECT_SWAPPED); button, G_CONNECT_SWAPPED);
output_switch_sync (button, priv->current_output); output_switch_sync (button, priv->current_output);
if (count_active_outputs (cc_display_config_get_monitors (priv->current_config)) < 2 && if ((count_active_outputs (panel) < 2 && cc_display_monitor_is_active (priv->current_output)) ||
cc_display_monitor_is_active (priv->current_output)) (cc_display_monitor_is_builtin (priv->current_output) && priv->lid_is_closed))
gtk_widget_set_sensitive (button, FALSE); gtk_widget_set_sensitive (button, FALSE);
return button; return button;
@ -2181,6 +2187,7 @@ on_screen_changed (CcDisplayPanel *panel)
CcDisplayConfig *current; CcDisplayConfig *current;
GList *outputs, *l; GList *outputs, *l;
GtkWidget *main_widget; GtkWidget *main_widget;
guint n_outputs;
if (!priv->manager) if (!priv->manager)
return; return;
@ -2206,30 +2213,38 @@ on_screen_changed (CcDisplayPanel *panel)
ensure_monitor_labels (panel); ensure_monitor_labels (panel);
priv->current_output = NULL; priv->current_output = NULL;
l = outputs = g_object_get_data (G_OBJECT (current), "ui-sorted-outputs"); outputs = g_object_get_data (G_OBJECT (current), "ui-sorted-outputs");
while (!priv->current_output && l != NULL) for (l = outputs; l; l = l->next)
{ {
CcDisplayMonitor *output = l->data; CcDisplayMonitor *output = l->data;
if (cc_display_monitor_is_active (output))
priv->current_output = output; if (!cc_display_monitor_is_active (output) ||
else (cc_display_monitor_is_builtin (output) && priv->lid_is_closed))
l = l->next; continue;
priv->current_output = output;
break;
} }
if (!priv->current_output) if (!priv->current_output)
goto show_error; goto show_error;
switch (g_list_length (outputs)) n_outputs = g_list_length (outputs);
if (priv->lid_is_closed)
{ {
case 1: if (n_outputs <= 2)
main_widget = make_single_output_ui (panel); main_widget = make_single_output_ui (panel);
break; else
case 2: main_widget = make_multi_output_ui (panel);
main_widget = make_two_output_ui (panel); }
break; else
default: {
main_widget = make_multi_output_ui (panel); if (n_outputs == 1)
break; main_widget = make_single_output_ui (panel);
else if (n_outputs == 2)
main_widget = make_two_output_ui (panel);
else
main_widget = make_multi_output_ui (panel);
} }
gtk_widget_show_all (main_widget); gtk_widget_show_all (main_widget);