summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagn@redhat.com>2013-08-08 14:10:53 +0200
committerGiovanni Campagna <gcampagn@redhat.com>2013-08-08 14:13:39 +0200
commit7ebb99929446336b63aa18ce789c41b5fad0f0aa (patch)
tree50be057814689fe5a7179235dbed2c2f825264d0
parentb5f24c505cd8fc49873b26db25f06442788b1de3 (diff)
downloadgnome-settings-daemon-wip/wayland-display.tar.gz
xrandr: adapt to the new model for display configurationwip/wayland-display
Stop handling monitors.xml and the initial modeset for the session, as well as monitor hotplug and lid switches. All that is implemented in mutter now. What is left in the xrandr plugin is Fn-F7 (for lack of a better place) and Rotate. Both will go in mutter/gnome-shell at some point. https://bugzilla.gnome.org/show_bug.cgi?id=705507
-rw-r--r--plugins/xrandr/gsd-xrandr-manager.c725
1 files changed, 8 insertions, 717 deletions
diff --git a/plugins/xrandr/gsd-xrandr-manager.c b/plugins/xrandr/gsd-xrandr-manager.c
index 9703a3b0..29a639c0 100644
--- a/plugins/xrandr/gsd-xrandr-manager.c
+++ b/plugins/xrandr/gsd-xrandr-manager.c
@@ -62,7 +62,6 @@
#define CONF_SCHEMA "org.gnome.settings-daemon.plugins.xrandr"
#define CONF_KEY_DEFAULT_MONITORS_SETUP "default-monitors-setup"
-#define CONF_KEY_DEFAULT_CONFIGURATION_FILE "default-configuration-file"
/* Number of seconds that the confirmation dialog will last before it resets the
* RANDR configuration to its old state.
@@ -100,7 +99,6 @@ struct GsdXrandrManagerPrivate {
gboolean running;
UpClient *upower_client;
- gboolean laptop_lid_is_closed;
GSettings *settings;
GDBusNodeInfo *introspection_data;
@@ -112,9 +110,6 @@ struct GsdXrandrManagerPrivate {
int current_fn_f7_config; /* -1 if no configs */
GnomeRRConfig **fn_f7_configs; /* NULL terminated, NULL if there are no configs */
- /* Last time at which we got a "screen got reconfigured" event; see on_randr_event() */
- guint32 last_config_timestamp;
-
#ifdef HAVE_WACOM
WacomDeviceDatabase *wacom_db;
#endif /* HAVE_WACOM */
@@ -242,23 +237,11 @@ log_configuration (GnomeRRConfig *config)
log_msg (" no outputs!\n");
}
-static char
-timestamp_relationship (guint32 a, guint32 b)
-{
- if (a < b)
- return '<';
- else if (a > b)
- return '>';
- else
- return '=';
-}
-
static void
log_screen (GnomeRRScreen *screen)
{
GnomeRRConfig *config;
int min_w, min_h, max_w, max_h;
- guint32 change_timestamp, config_timestamp;
if (!log_file)
return;
@@ -266,14 +249,10 @@ log_screen (GnomeRRScreen *screen)
config = gnome_rr_config_new_current (screen, NULL);
gnome_rr_screen_get_ranges (screen, &min_w, &max_w, &min_h, &max_h);
- gnome_rr_screen_get_timestamps (screen, &change_timestamp, &config_timestamp);
- log_msg (" Screen min(%d, %d), max(%d, %d), change=%u %c config=%u\n",
+ log_msg (" Screen min(%d, %d), max(%d, %d)\n",
min_w, min_h,
- max_w, max_h,
- change_timestamp,
- timestamp_relationship (change_timestamp, config_timestamp),
- config_timestamp);
+ max_w, max_h);
log_configuration (config);
g_object_unref (config);
@@ -296,34 +275,6 @@ log_configurations (GnomeRRConfig **configs)
}
static void
-show_timestamps_dialog (GsdXrandrManager *manager, const char *msg)
-{
-#if 1
- return;
-#else
- struct GsdXrandrManagerPrivate *priv = manager->priv;
- GtkWidget *dialog;
- guint32 change_timestamp, config_timestamp;
- static int serial;
-
- gnome_rr_screen_get_timestamps (priv->rw_screen, &change_timestamp, &config_timestamp);
-
- dialog = gtk_message_dialog_new (NULL,
- 0,
- GTK_MESSAGE_INFO,
- GTK_BUTTONS_CLOSE,
- "RANDR timestamps (%d):\n%s\nchange: %u\nconfig: %u",
- serial++,
- msg,
- change_timestamp,
- config_timestamp);
- g_signal_connect (dialog, "response",
- G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_widget_show (dialog);
-#endif
-}
-
-static void
print_output (GnomeRROutputInfo *info)
{
int x, y, width, height;
@@ -382,96 +333,6 @@ get_laptop_output_info (GnomeRRScreen *screen, GnomeRRConfig *config)
return NULL;
}
-static gboolean
-non_laptop_outputs_are_active (GnomeRRConfig *config, GnomeRROutputInfo *laptop_info)
-{
- GnomeRROutputInfo **outputs;
- int i;
-
- outputs = gnome_rr_config_get_outputs (config);
- for (i = 0; outputs[i] != NULL; i++) {
- if (outputs[i] == laptop_info)
- continue;
-
- if (gnome_rr_output_info_is_active (outputs[i]))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-turn_off_laptop_display_in_configuration (GnomeRRScreen *screen, GnomeRRConfig *config)
-{
- GnomeRROutputInfo *laptop_info;
-
- laptop_info = get_laptop_output_info (screen, config);
- if (laptop_info) {
- /* Turn off the laptop's screen only if other displays are on. This is to avoid an all-black-screens scenario. */
- if (non_laptop_outputs_are_active (config, laptop_info))
- gnome_rr_output_info_set_active (laptop_info, FALSE);
- }
-
- /* Adjust the offsets of outputs so they start at (0, 0) */
- gnome_rr_config_sanitize (config);
-}
-
-/* This function effectively centralizes the use of gnome_rr_config_apply_from_filename_with_time().
- *
- * Optionally filters out GNOME_RR_ERROR_NO_MATCHING_CONFIG from the matching
- * process(), since that is not usually an error.
- */
-static gboolean
-apply_configuration_from_filename (GsdXrandrManager *manager,
- const char *filename,
- gboolean no_matching_config_is_an_error,
- guint32 timestamp,
- GError **error)
-{
- struct GsdXrandrManagerPrivate *priv = manager->priv;
- GnomeRRConfig *config;
- GError *my_error;
- gboolean success;
- char *str;
-
- str = g_strdup_printf ("Applying %s with timestamp %d", filename, timestamp);
- show_timestamps_dialog (manager, str);
- g_free (str);
-
- my_error = NULL;
-
- config = g_object_new (GNOME_TYPE_RR_CONFIG, "screen", priv->rw_screen, NULL);
- if (!gnome_rr_config_load_filename (config, filename, &my_error)) {
- g_object_unref (config);
-
- if (g_error_matches (my_error, GNOME_RR_ERROR, GNOME_RR_ERROR_NO_MATCHING_CONFIG)) {
- if (no_matching_config_is_an_error) {
- g_propagate_error (error, my_error);
- return FALSE;
- } else {
- /* This is not an error; the user probably changed his monitors
- * and so they don't match any of the stored configurations.
- */
- g_error_free (my_error);
- return TRUE;
- }
- } else {
- g_propagate_error (error, my_error);
- return FALSE;
- }
- }
-
- if (up_client_get_lid_is_closed (priv->upower_client))
- turn_off_laptop_display_in_configuration (priv->rw_screen, config);
-
- gnome_rr_config_ensure_primary (config);
- success = gnome_rr_config_apply_with_time (config, priv->rw_screen, timestamp, error);
-
- g_object_unref (config);
-
- return success;
-}
-
/* This function centralizes the use of gnome_rr_config_apply_with_time().
*
* Applies a configuration and displays an error message if an error happens.
@@ -489,11 +350,12 @@ apply_configuration (GsdXrandrManager *manager, GnomeRRConfig *config, guint32 t
print_configuration (config, "Applying Configuration");
error = NULL;
- success = gnome_rr_config_apply_with_time (config, priv->rw_screen, timestamp, &error);
- if (success) {
- if (save_configuration)
- gnome_rr_config_save (config, NULL); /* NULL-GError - there's not much we can do if this fails */
- } else {
+ if (save_configuration)
+ success = gnome_rr_config_apply_persistent (config, priv->rw_screen, &error);
+ else
+ success = gnome_rr_config_apply (config, priv->rw_screen, &error);
+
+ if (!success) {
log_msg ("Could not switch to the following configuration (timestamp %u): %s\n", timestamp, error->message);
log_configuration (config);
g_error_free (error);
@@ -502,227 +364,6 @@ apply_configuration (GsdXrandrManager *manager, GnomeRRConfig *config, guint32 t
return success;
}
-static void
-restore_backup_configuration_without_messages (const char *backup_filename, const char *intended_filename)
-{
- backup_filename = gnome_rr_config_get_backup_filename ();
- rename (backup_filename, intended_filename);
-}
-
-static void
-restore_backup_configuration (GsdXrandrManager *manager, const char *backup_filename, const char *intended_filename, guint32 timestamp)
-{
- int saved_errno;
-
- if (rename (backup_filename, intended_filename) == 0) {
- GError *error;
-
- error = NULL;
- if (!apply_configuration_from_filename (manager, intended_filename, FALSE, timestamp, &error)) {
- error_message (manager, _("Could not restore the display's configuration"), error, NULL);
-
- if (error)
- g_error_free (error);
- }
-
- return;
- }
-
- saved_errno = errno;
-
- /* ENOENT means the original file didn't exist. That is *not* an error;
- * the backup was not created because there wasn't even an original
- * monitors.xml (such as on a first-time login). Note that *here* there
- * is a "didn't work" monitors.xml, so we must delete that one.
- */
- if (saved_errno == ENOENT)
- unlink (intended_filename);
- else {
- char *msg;
-
- msg = g_strdup_printf ("Could not rename %s to %s: %s",
- backup_filename, intended_filename,
- g_strerror (saved_errno));
- error_message (manager,
- _("Could not restore the display's configuration from a backup"),
- NULL,
- msg);
- g_free (msg);
- }
-
- unlink (backup_filename);
-}
-
-typedef struct {
- GsdXrandrManager *manager;
- GtkWidget *dialog;
-
- int countdown;
- int response_id;
-} TimeoutDialog;
-
-static void
-print_countdown_text (TimeoutDialog *timeout)
-{
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (timeout->dialog),
- ngettext ("The display will be reset to its previous configuration in %d second",
- "The display will be reset to its previous configuration in %d seconds",
- timeout->countdown),
- timeout->countdown);
-}
-
-static gboolean
-timeout_cb (gpointer data)
-{
- TimeoutDialog *timeout = data;
-
- timeout->countdown--;
-
- if (timeout->countdown == 0) {
- timeout->response_id = GTK_RESPONSE_CANCEL;
- gtk_main_quit ();
- } else {
- print_countdown_text (timeout);
- }
-
- return TRUE;
-}
-
-static void
-timeout_response_cb (GtkDialog *dialog, int response_id, gpointer data)
-{
- TimeoutDialog *timeout = data;
-
- if (response_id == GTK_RESPONSE_DELETE_EVENT) {
- /* The user closed the dialog or pressed ESC, revert */
- timeout->response_id = GTK_RESPONSE_CANCEL;
- } else
- timeout->response_id = response_id;
-
- gtk_main_quit ();
-}
-
-static gboolean
-user_says_things_are_ok (GsdXrandrManager *manager, GdkWindow *parent_window)
-{
- TimeoutDialog timeout;
- guint timeout_id;
-
- timeout.manager = manager;
-
- timeout.dialog = gtk_message_dialog_new (NULL,
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- _("Does the display look OK?"));
-
- timeout.countdown = CONFIRMATION_DIALOG_SECONDS;
-
- print_countdown_text (&timeout);
-
- gtk_window_set_icon_name (GTK_WINDOW (timeout.dialog), "preferences-desktop-display");
- gtk_dialog_add_button (GTK_DIALOG (timeout.dialog), _("_Restore Previous Configuration"), GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button (GTK_DIALOG (timeout.dialog), _("_Keep This Configuration"), GTK_RESPONSE_ACCEPT);
- gtk_dialog_set_default_response (GTK_DIALOG (timeout.dialog), GTK_RESPONSE_ACCEPT); /* ah, the optimism */
-
- g_signal_connect (timeout.dialog, "response",
- G_CALLBACK (timeout_response_cb),
- &timeout);
-
- gtk_widget_realize (timeout.dialog);
-
- if (parent_window)
- gdk_window_set_transient_for (gtk_widget_get_window (timeout.dialog), parent_window);
-
- gtk_widget_show_all (timeout.dialog);
- /* We don't use g_timeout_add_seconds() since we actually care that the user sees "real" second ticks in the dialog */
- timeout_id = g_timeout_add (1000,
- timeout_cb,
- &timeout);
- gtk_main ();
-
- gtk_widget_destroy (timeout.dialog);
- g_source_remove (timeout_id);
-
- if (timeout.response_id == GTK_RESPONSE_ACCEPT)
- return TRUE;
- else
- return FALSE;
-}
-
-struct confirmation {
- GsdXrandrManager *manager;
- GdkWindow *parent_window;
- guint32 timestamp;
-};
-
-static gboolean
-confirm_with_user_idle_cb (gpointer data)
-{
- struct confirmation *confirmation = data;
- char *backup_filename;
- char *intended_filename;
-
- backup_filename = gnome_rr_config_get_backup_filename ();
- intended_filename = gnome_rr_config_get_intended_filename ();
-
- if (user_says_things_are_ok (confirmation->manager, confirmation->parent_window))
- unlink (backup_filename);
- else
- restore_backup_configuration (confirmation->manager, backup_filename, intended_filename, confirmation->timestamp);
-
- g_free (confirmation);
-
- return FALSE;
-}
-
-static void
-queue_confirmation_by_user (GsdXrandrManager *manager, GdkWindow *parent_window, guint32 timestamp)
-{
- struct confirmation *confirmation;
-
- confirmation = g_new (struct confirmation, 1);
- confirmation->manager = manager;
- confirmation->parent_window = parent_window;
- confirmation->timestamp = timestamp;
-
- g_idle_add (confirm_with_user_idle_cb, confirmation);
-}
-
-static gboolean
-try_to_apply_intended_configuration (GsdXrandrManager *manager, GdkWindow *parent_window, guint32 timestamp, GError **error)
-{
- char *backup_filename;
- char *intended_filename;
- gboolean result;
-
- /* Try to apply the intended configuration */
-
- backup_filename = gnome_rr_config_get_backup_filename ();
- intended_filename = gnome_rr_config_get_intended_filename ();
-
- result = apply_configuration_from_filename (manager, intended_filename, FALSE, timestamp, error);
- if (!result) {
- error_message (manager, _("The selected configuration for displays could not be applied"), error ? *error : NULL, NULL);
- restore_backup_configuration_without_messages (backup_filename, intended_filename);
- goto out;
- } else {
- /* We need to return as quickly as possible, so instead of
- * confirming with the user right here, we do it in an idle
- * handler. The caller only expects a status for "could you
- * change the RANDR configuration?", not "is the user OK with it
- * as well?".
- */
- queue_confirmation_by_user (manager, parent_window, timestamp);
- }
-
-out:
- g_free (backup_filename);
- g_free (intended_filename);
-
- return result;
-}
-
/* DBus method for org.gnome.SettingsDaemon.XRANDR_2 VideoModeSwitch; see gsd-xrandr-manager.xml for the interface definition */
static gboolean
gsd_xrandr_manager_2_video_mode_switch (GsdXrandrManager *manager,
@@ -1362,7 +1003,6 @@ handle_fn_f7 (GsdXrandrManager *mgr, guint32 timestamp)
g_object_unref (current);
if (priv->fn_f7_configs) {
- guint32 server_timestamp;
gboolean success;
mgr->priv->current_fn_f7_config++;
@@ -1376,22 +1016,6 @@ handle_fn_f7 (GsdXrandrManager *mgr, guint32 timestamp)
g_debug ("applying");
- /* See https://bugzilla.gnome.org/show_bug.cgi?id=610482
- *
- * Sometimes we'll get two rapid XF86Display keypress events,
- * but their timestamps will be out of order with respect to the
- * RANDR timestamps. This *may* be due to stupid BIOSes sending
- * out display-switch keystrokes "to make Windows work".
- *
- * The X server will error out if the timestamp provided is
- * older than a previous change configuration timestamp. We
- * assume here that we do want this event to go through still,
- * since kernel timestamps may be skewed wrt the X server.
- */
- gnome_rr_screen_get_timestamps (screen, NULL, &server_timestamp);
- if (timestamp < server_timestamp)
- timestamp = server_timestamp;
-
success = apply_configuration (mgr, priv->fn_f7_configs[mgr->priv->current_fn_f7_config], timestamp, TRUE);
if (success) {
@@ -1632,153 +1256,6 @@ out:
g_object_unref (current);
}
-static GnomeRRConfig *
-make_default_setup (GsdXrandrManager *manager)
-{
- GsdXrandrManagerPrivate *priv = manager->priv;
- GnomeRRConfig *config;
- GsdXrandrBootBehaviour boot;
-
- boot = g_settings_get_enum (priv->settings, CONF_KEY_DEFAULT_MONITORS_SETUP);
- g_debug ("xrandr default monitors setup: %d\n", boot);
-
- switch (boot) {
- case GSD_XRANDR_BOOT_BEHAVIOUR_DO_NOTHING:
- config = make_xinerama_setup (manager, priv->rw_screen);
- break;
- case GSD_XRANDR_BOOT_BEHAVIOUR_FOLLOW_LID:
- if (laptop_lid_is_closed (manager))
- config = make_other_setup (priv->rw_screen);
- else
- config = make_xinerama_setup (manager, priv->rw_screen);
- break;
- case GSD_XRANDR_BOOT_BEHAVIOUR_CLONE:
- config = make_clone_setup (manager, priv->rw_screen);
- break;
- case GSD_XRANDR_BOOT_BEHAVIOUR_DOCK:
- config = make_other_setup (priv->rw_screen);
- break;
- default:
- g_assert_not_reached ();
- }
-
- return config;
-}
-
-static void
-auto_configure_outputs (GsdXrandrManager *manager, guint32 timestamp)
-{
- GnomeRRConfig *config;
-
- g_debug ("xrandr auto-configure");
- config = make_default_setup (manager);
- if (config) {
- apply_configuration (manager, config, timestamp, TRUE);
- g_object_unref (config);
- } else {
- g_debug ("No applicable configuration found during auto-configure");
- }
-}
-
-static void
-use_stored_configuration_or_auto_configure_outputs (GsdXrandrManager *manager, guint32 timestamp)
-{
- GsdXrandrManagerPrivate *priv = manager->priv;
- char *intended_filename;
- GError *error;
- gboolean success;
-
- intended_filename = gnome_rr_config_get_intended_filename ();
-
- error = NULL;
- success = apply_configuration_from_filename (manager, intended_filename, TRUE, timestamp, &error);
- g_free (intended_filename);
-
- if (!success) {
- /* We don't bother checking the error type.
- *
- * Both G_FILE_ERROR_NOENT and
- * GNOME_RR_ERROR_NO_MATCHING_CONFIG would mean, "there
- * was no configuration to apply, or none that matched
- * the current outputs", and in that case we need to run
- * our fallback.
- *
- * Any other error means "we couldn't do the smart thing
- * of using a previously- saved configuration, anyway,
- * for some other reason. In that case, we also need to
- * run our fallback to avoid leaving the user with a
- * bogus configuration.
- */
-
- if (error)
- g_error_free (error);
-
- if (timestamp != priv->last_config_timestamp || timestamp == GDK_CURRENT_TIME) {
- priv->last_config_timestamp = timestamp;
- auto_configure_outputs (manager, timestamp);
- log_msg (" Automatically configured outputs\n");
- } else
- log_msg (" Ignored autoconfiguration as old and new config timestamps are the same\n");
- } else
- log_msg ("Applied stored configuration\n");
-}
-
-static void
-on_randr_event (GnomeRRScreen *screen, gpointer data)
-{
- GsdXrandrManager *manager = GSD_XRANDR_MANAGER (data);
- GsdXrandrManagerPrivate *priv = manager->priv;
- guint32 change_timestamp, config_timestamp;
-
- if (!priv->running)
- return;
-
- gnome_rr_screen_get_timestamps (screen, &change_timestamp, &config_timestamp);
-
- log_open ();
- log_msg ("Got RANDR event with timestamps change=%u %c config=%u\n",
- change_timestamp,
- timestamp_relationship (change_timestamp, config_timestamp),
- config_timestamp);
-
- if (change_timestamp >= config_timestamp) {
- GnomeRRConfig *rr_config;
-
- /* The event is due to an explicit configuration change.
- *
- * If the change was performed by us, then we need to do nothing.
- *
- * If the change was done by some other X client, we don't need
- * to do anything, either; the screen is already configured.
- */
-
- /* Check if we need to update the primary */
- rr_config = gnome_rr_config_new_current (priv->rw_screen, NULL);
- if (gnome_rr_config_ensure_primary (rr_config)) {
- if (gnome_rr_config_applicable (rr_config, priv->rw_screen, NULL)) {
- print_configuration (rr_config, "Updating for primary");
- priv->last_config_timestamp = config_timestamp;
- gnome_rr_config_apply_with_time (rr_config, priv->rw_screen, config_timestamp, NULL);
- }
- }
- g_object_unref (rr_config);
-
- show_timestamps_dialog (manager, "ignoring since change > config");
- log_msg (" Ignoring event since change >= config\n");
- } else {
- /* Here, config_timestamp > change_timestamp. This means that
- * the screen got reconfigured because of hotplug/unplug; the X
- * server is just notifying us, and we need to configure the
- * outputs in a sane way.
- */
-
- show_timestamps_dialog (manager, "need to deal with reconfiguration, as config > change");
- use_stored_configuration_or_auto_configure_outputs (manager, config_timestamp);
- }
-
- log_close ();
-}
-
static void
get_allowed_rotations_for_output (GnomeRRConfig *config,
GnomeRRScreen *rr_screen,
@@ -1818,179 +1295,6 @@ get_allowed_rotations_for_output (GnomeRRConfig *config,
}
}
-static gboolean
-apply_intended_configuration (GsdXrandrManager *manager, const char *intended_filename, guint32 timestamp)
-{
- GError *my_error;
- gboolean result;
-
- my_error = NULL;
- result = apply_configuration_from_filename (manager, intended_filename, TRUE, timestamp, &my_error);
- if (!result) {
- if (my_error) {
- if (!g_error_matches (my_error, G_FILE_ERROR, G_FILE_ERROR_NOENT) &&
- !g_error_matches (my_error, GNOME_RR_ERROR, GNOME_RR_ERROR_NO_MATCHING_CONFIG))
- error_message (manager, _("Could not apply the stored configuration for monitors"), my_error, NULL);
-
- g_error_free (my_error);
- }
- }
-
- return result;
-}
-
-static void
-apply_default_boot_configuration (GsdXrandrManager *mgr, guint32 timestamp)
-{
- GsdXrandrManagerPrivate *priv = mgr->priv;
- GnomeRRConfig *config;
- GsdXrandrBootBehaviour boot;
-
- boot = g_settings_get_enum (priv->settings, CONF_KEY_DEFAULT_MONITORS_SETUP);
-
- if (boot == GSD_XRANDR_BOOT_BEHAVIOUR_DO_NOTHING)
- return;
-
- config = make_default_setup (mgr);
- if (config) {
- /* We don't save the configuration (the "false" parameter to the following function) because we don't want to
- * install a user-side setting when *here* we are using a system-default setting.
- */
- apply_configuration (mgr, config, timestamp, TRUE);
- g_object_unref (config);
- }
-}
-
-static gboolean
-apply_stored_configuration_at_startup (GsdXrandrManager *manager, guint32 timestamp)
-{
- GError *my_error;
- gboolean success;
- char *backup_filename;
- char *intended_filename;
- GnomePnpIds *pnp_ids;
-
- /* This avoids the GnomePnpIds object being created multiple times.
- * See c9240e8b69c5833074508b46bc56307aac12ec19 */
- pnp_ids = gnome_pnp_ids_new ();
- backup_filename = gnome_rr_config_get_backup_filename ();
- intended_filename = gnome_rr_config_get_intended_filename ();
-
- /* 1. See if there was a "saved" configuration. If there is one, it means
- * that the user had selected to change the display configuration, but the
- * machine crashed. In that case, we'll apply *that* configuration and save it on top of the
- * "intended" one.
- */
-
- my_error = NULL;
-
- success = apply_configuration_from_filename (manager, backup_filename, FALSE, timestamp, &my_error);
- if (success) {
- /* The backup configuration existed, and could be applied
- * successfully, so we must restore it on top of the
- * failed/intended one.
- */
- restore_backup_configuration (manager, backup_filename, intended_filename, timestamp);
- goto out;
- }
-
- if (!g_error_matches (my_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) {
- /* Epic fail: there (probably) was a backup configuration, but
- * we could not apply it. The only thing we can do is delete
- * the backup configuration. Let's hope that the user doesn't
- * get left with an unusable display...
- */
-
- unlink (backup_filename);
- goto out;
- }
-
- /* 2. There was no backup configuration! This means we are
- * good. Apply the intended configuration instead.
- */
-
- success = apply_intended_configuration (manager, intended_filename, timestamp);
-
-out:
- g_object_unref (pnp_ids);
-
- if (my_error)
- g_error_free (my_error);
-
- g_free (backup_filename);
- g_free (intended_filename);
-
- return success;
-}
-
-static gboolean
-apply_default_configuration_from_file (GsdXrandrManager *manager, guint32 timestamp)
-{
- GsdXrandrManagerPrivate *priv = manager->priv;
- char *default_config_filename;
- gboolean result;
-
- default_config_filename = g_settings_get_string (priv->settings, CONF_KEY_DEFAULT_CONFIGURATION_FILE);
- if (!default_config_filename)
- return FALSE;
-
- result = apply_configuration_from_filename (manager, default_config_filename, TRUE, timestamp, NULL);
-
- g_free (default_config_filename);
- return result;
-}
-
-static void
-turn_off_laptop_display (GsdXrandrManager *manager, guint32 timestamp)
-{
- GsdXrandrManagerPrivate *priv = manager->priv;
- GnomeRRConfig *config;
-
- config = gnome_rr_config_new_current (priv->rw_screen, NULL);
-
- turn_off_laptop_display_in_configuration (priv->rw_screen, config);
-
- /* We don't turn the laptop's display off if it is the only display present. */
- if (!config_is_all_off (config)) {
- /* We don't save the configuration (the "false" parameter to the following function) because we
- * wouldn't want to restore a configuration with the laptop's display turned off, if at some
- * point later the user booted his laptop with the lid open.
- */
- apply_configuration (manager, config, timestamp, FALSE);
- }
-
- g_object_unref (config);
-}
-
-static void
-power_client_changed_cb (UpClient *client, gpointer data)
-{
- GsdXrandrManager *manager = data;
- GsdXrandrManagerPrivate *priv = manager->priv;
- gboolean is_closed;
-
- is_closed = up_client_get_lid_is_closed (priv->upower_client);
-
- if (is_closed != priv->laptop_lid_is_closed) {
- priv->laptop_lid_is_closed = is_closed;
- if (!follow_laptop_lid(manager))
- return;
-
- /* Refresh the RANDR state. The lid just got opened/closed, so we can afford to
- * probe the outputs right now. It will also help the case where we can't detect
- * hotplug/unplug, but the fact that the lid's state changed lets us know that the
- * user probably did something interesting.
- */
-
- gnome_rr_screen_refresh (priv->rw_screen, NULL); /* NULL-GError */
-
- if (is_closed)
- turn_off_laptop_display (manager, GDK_CURRENT_TIME); /* sucks not to have a timestamp for the notification */
- else
- use_stored_configuration_or_auto_configure_outputs (manager, GDK_CURRENT_TIME);
- }
-}
-
gboolean
gsd_xrandr_manager_start (GsdXrandrManager *manager,
GError **error)
@@ -2011,12 +1315,7 @@ gsd_xrandr_manager_start (GsdXrandrManager *manager,
return FALSE;
}
- g_signal_connect (manager->priv->rw_screen, "changed", G_CALLBACK (on_randr_event), manager);
-
manager->priv->upower_client = up_client_new ();
- manager->priv->laptop_lid_is_closed = up_client_get_lid_is_closed (manager->priv->upower_client);
- g_signal_connect (manager->priv->upower_client, "changed",
- G_CALLBACK (power_client_changed_cb), manager);
log_msg ("State of screen at startup:\n");
log_screen (manager->priv->rw_screen);
@@ -2024,14 +1323,6 @@ gsd_xrandr_manager_start (GsdXrandrManager *manager,
manager->priv->running = TRUE;
manager->priv->settings = g_settings_new (CONF_SCHEMA);
- show_timestamps_dialog (manager, "Startup");
- if (!apply_stored_configuration_at_startup (manager, GDK_CURRENT_TIME)) /* we don't have a real timestamp at startup anyway */
- if (!apply_default_configuration_from_file (manager, GDK_CURRENT_TIME))
- apply_default_boot_configuration (manager, GDK_CURRENT_TIME);
-
- log_msg ("State of screen after initial configuration:\n");
- log_screen (manager->priv->rw_screen);
-
log_close ();
gnome_settings_profile_end (NULL);