diff options
author | Thomas Wood <thomas.wood@intel.com> | 2013-07-19 17:07:56 +0100 |
---|---|---|
committer | Thomas Wood <thomas.wood@intel.com> | 2013-07-19 17:14:56 +0100 |
commit | 32a00a066aea3a5987d8ca17896bca06b63e75f8 (patch) | |
tree | fbd1b5890fbcac2224f8e61f652d7a0cd050966e | |
parent | 48789d617e7eb7cc05bc786e47a0459a8f062b6c (diff) | |
download | gnome-control-center-32a00a066aea3a5987d8ca17896bca06b63e75f8.tar.gz |
display: prevent the built-in display being turned on if the lid is closed
https://bugzilla.gnome.org/show_bug.cgi?id=704487
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | panels/display/cc-display-panel.c | 56 |
2 files changed, 57 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index cc5fdb32f..e15609dff 100644 --- a/configure.ac +++ b/configure.ac @@ -122,7 +122,8 @@ PKG_CHECK_MODULES(DATETIME_PANEL, $COMMON_MODULES gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION) -PKG_CHECK_MODULES(DISPLAY_PANEL, $COMMON_MODULES gnome-desktop-3.0 >= 3.1.0) +PKG_CHECK_MODULES(DISPLAY_PANEL, $COMMON_MODULES gnome-desktop-3.0 >= 3.1.0 + upower-glib >= 0.9.1) PKG_CHECK_MODULES(INFO_PANEL, $COMMON_MODULES libgtop-2.0 gl polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION) PKG_CHECK_MODULES(KEYBOARD_PANEL, $COMMON_MODULES diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c index 94e92636b..7f0431c68 100644 --- a/panels/display/cc-display-panel.c +++ b/panels/display/cc-display-panel.c @@ -38,6 +38,7 @@ #include <gdesktop-enums.h> #include "cc-rr-labeler.h" +#include <libupower-glib/upower.h> CC_PANEL_REGISTER (CcDisplayPanel, cc_display_panel) @@ -97,6 +98,9 @@ struct _CcDisplayPanelPrivate /* These are used while we are waiting for the ApplyConfiguration method to be executed over D-bus */ GDBusProxy *proxy; + + UpClient *up_client; + gboolean lid_is_closed; }; typedef struct @@ -151,6 +155,10 @@ cc_display_panel_set_property (GObject *object, static void cc_display_panel_dispose (GObject *object) { + CcDisplayPanelPrivate *priv = CC_DISPLAY_PANEL (object)->priv; + + g_clear_object (&priv->up_client); + G_OBJECT_CLASS (cc_display_panel_parent_class)->dispose (object); } @@ -693,7 +701,20 @@ rebuild_on_off_radios (CcDisplayPanel *self) if (!gnome_rr_config_get_clone (self->priv->current_configuration) && self->priv->current_output) { - if (count_active_outputs (self) > 1 || !gnome_rr_output_info_is_active (self->priv->current_output)) + gboolean display_closed = FALSE; + + if (self->priv->lid_is_closed) + { + GnomeRROutput *output; + + output = gnome_rr_screen_get_output_by_name (self->priv->screen, + gnome_rr_output_info_get_name (self->priv->current_output)); + + display_closed = gnome_rr_output_is_builtin_display (output); + } + + if ((count_active_outputs (self) > 1 || !gnome_rr_output_info_is_active (self->priv->current_output)) + && !display_closed) sensitive = TRUE; else sensitive = FALSE; @@ -2599,6 +2620,23 @@ cc_display_panel_init (CcDisplayPanel *self) g_resources_register (cc_display_get_resource ()); } +static void +cc_display_panel_up_client_changed (UpClient *client, + CcDisplayPanel *self) +{ + CcDisplayPanelPrivate *priv = self->priv; + gboolean lid_is_closed; + + lid_is_closed = up_client_get_lid_is_closed (client); + + if (lid_is_closed != priv->lid_is_closed) + { + priv->lid_is_closed = lid_is_closed; + + rebuild_on_off_radios (self); + } +} + static GObject * cc_display_panel_constructor (GType gtype, guint n_properties, @@ -2703,5 +2741,21 @@ cc_display_panel_constructor (GType gtype, gtk_widget_show (self->priv->panel); gtk_container_add (GTK_CONTAINER (self), self->priv->panel); + self->priv->up_client = up_client_new (); + if (up_client_get_lid_is_present (self->priv->up_client)) + { + /* Connect to the "changed" signal to track changes to "lid-is-closed" + * property. Connecting to "notify::lid-is-closed" would be preferable, + * but currently doesn't work as expected: + * https://bugs.freedesktop.org/show_bug.cgi?id=43001 + */ + + g_signal_connect (self->priv->up_client, "changed", + G_CALLBACK (cc_display_panel_up_client_changed), self); + cc_display_panel_up_client_changed (self->priv->up_client, self); + } + else + g_clear_object (&self->priv->up_client); + return obj; } |