display: prevent the built-in display being turned on if the lid is closed

https://bugzilla.gnome.org/show_bug.cgi?id=704487
This commit is contained in:
Thomas Wood 2013-07-19 17:07:56 +01:00
parent 48789d617e
commit 32a00a066a
2 changed files with 57 additions and 2 deletions

View file

@ -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

View file

@ -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;
}