[gnome-flashback] display-config: add confirm dialog



commit 79d003923c29d20389d12d7d4bafe3fe6576d52f
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Mon Mar 30 22:56:51 2015 +0300

    display-config: add confirm dialog

 gnome-flashback/flashback.gresource.xml            |    1 +
 gnome-flashback/libdisplay-config/Makefile.am      |    2 +
 .../libdisplay-config/flashback-confirm-dialog.c   |  242 ++++++++++++++++++++
 .../libdisplay-config/flashback-confirm-dialog.h   |   51 ++++
 .../libdisplay-config/flashback-confirm-dialog.ui  |  140 +++++++++++
 .../libdisplay-config/flashback-display-config.c   |   60 +++++-
 .../libdisplay-config/flashback-monitor-config.c   |   14 +-
 .../libdisplay-config/flashback-monitor-manager.c  |   29 ++-
 .../libdisplay-config/flashback-monitor-manager.h  |    5 +-
 9 files changed, 525 insertions(+), 19 deletions(-)
---
diff --git a/gnome-flashback/flashback.gresource.xml b/gnome-flashback/flashback.gresource.xml
index 363697a..46520ef 100644
--- a/gnome-flashback/flashback.gresource.xml
+++ b/gnome-flashback/flashback.gresource.xml
@@ -3,6 +3,7 @@
   <gresource prefix="/org/gnome/gnome-flashback">
     <file>Adwaita.css</file>
     <file>HighContrast.css</file>
+    <file alias="flashback-confirm-dialog.ui" 
compressed="true">libdisplay-config/flashback-confirm-dialog.ui</file>
     <file alias="flashback-inhibit-dialog.ui" 
compressed="true">libend-session-dialog/flashback-inhibit-dialog.ui</file>
   </gresource>
 </gresources>
diff --git a/gnome-flashback/libdisplay-config/Makefile.am b/gnome-flashback/libdisplay-config/Makefile.am
index 640ce05..eb12671 100644
--- a/gnome-flashback/libdisplay-config/Makefile.am
+++ b/gnome-flashback/libdisplay-config/Makefile.am
@@ -12,6 +12,8 @@ libdisplay_config_la_SOURCES = \
        meta-dbus-display-config.c \
        meta-dbus-display-config.h \
        meta-display-config-shared.h \
+       flashback-confirm-dialog.c \
+       flashback-confirm-dialog.h \
        flashback-display-config.c \
        flashback-display-config.h \
        flashback-monitor-config.c \
diff --git a/gnome-flashback/libdisplay-config/flashback-confirm-dialog.c 
b/gnome-flashback/libdisplay-config/flashback-confirm-dialog.c
new file mode 100644
index 0000000..54b9c99
--- /dev/null
+++ b/gnome-flashback/libdisplay-config/flashback-confirm-dialog.c
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2015 Alberts Muktupāvels
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include "flashback-confirm-dialog.h"
+
+typedef struct _FlashbackConfirmDialogPrivate FlashbackConfirmDialogPrivate;
+
+struct _FlashbackConfirmDialogPrivate
+{
+  GtkWidget *title;
+  GtkWidget *description;
+
+  GtkWidget *revert_settings;
+  GtkWidget *keep_changes;
+
+  gint       timeout;
+  guint      timeout_id;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (FlashbackConfirmDialog, flashback_confirm_dialog, GTK_TYPE_WINDOW)
+
+enum
+{
+  SIGNAL_RESPONSE,
+  SIGNAL_CLOSE,
+  SIGNAL_LAST
+};
+
+static guint signals[SIGNAL_LAST] = { 0, };
+
+static void
+update_text (FlashbackConfirmDialog *dialog)
+{
+  FlashbackConfirmDialogPrivate *priv;
+  const gchar *text;
+  gchar *description;
+
+  priv = flashback_confirm_dialog_get_instance_private (dialog);
+  text = ngettext ("Settings changes will revert in %d second",
+                   "Settings changes will revert in %d seconds",
+                   priv->timeout);
+
+  description = g_strdup_printf (text, priv->timeout);
+  gtk_label_set_text (GTK_LABEL (priv->description), description);
+  g_free (description);
+}
+
+static gboolean
+timeout_cb (gpointer user_data)
+{
+  FlashbackConfirmDialog *dialog;
+  FlashbackConfirmDialogPrivate *priv;
+
+  dialog = FLASHBACK_CONFIRM_DIALOG (user_data);
+  priv = flashback_confirm_dialog_get_instance_private (dialog);
+
+  if (priv->timeout == 0)
+    {
+      priv->timeout_id = 0;
+      g_signal_emit (dialog, signals[SIGNAL_RESPONSE], 0,
+                     FLASHBACK_CONFIRM_DIALOG_RESPONSE_REVERT_SETTINGS);
+      return FALSE;
+    }
+
+  priv->timeout--;
+  update_text (dialog);
+
+  return TRUE;
+}
+
+static void
+revert_settings_clicked_cb (FlashbackConfirmDialog *dialog,
+                            GtkButton              *button)
+{
+  g_signal_emit (dialog, signals[SIGNAL_RESPONSE], 0,
+                 FLASHBACK_CONFIRM_DIALOG_RESPONSE_REVERT_SETTINGS);
+}
+
+static void
+keep_changes_clicked_cb (FlashbackConfirmDialog *dialog,
+                         GtkButton              *button)
+{
+  g_signal_emit (dialog, signals[SIGNAL_RESPONSE], 0,
+                 FLASHBACK_CONFIRM_DIALOG_RESPONSE_KEEP_CHANGES);
+}
+
+static void
+flashback_confirm_dialog_close (FlashbackConfirmDialog *dialog)
+{
+  g_signal_emit (dialog, signals[SIGNAL_RESPONSE], 0,
+                 FLASHBACK_CONFIRM_DIALOG_RESPONSE_REVERT_SETTINGS);
+}
+
+static void
+flashback_confirm_dialog_finalize (GObject *object)
+{
+  FlashbackConfirmDialog *dialog;
+  FlashbackConfirmDialogPrivate *priv;
+
+  dialog = FLASHBACK_CONFIRM_DIALOG (object);
+  priv = flashback_confirm_dialog_get_instance_private (dialog);
+
+  if (priv->timeout_id > 0)
+    {
+      g_source_remove (priv->timeout_id);
+      priv->timeout_id = 0;
+    }
+
+  G_OBJECT_CLASS (flashback_confirm_dialog_parent_class)->finalize (object);
+}
+
+static void
+flashback_confirm_dialog_destroy (GtkWidget *widget)
+{
+  FlashbackConfirmDialog *dialog;
+  FlashbackConfirmDialogPrivate *priv;
+
+  dialog = FLASHBACK_CONFIRM_DIALOG (widget);
+  priv = flashback_confirm_dialog_get_instance_private (dialog);
+
+  if (priv->timeout_id > 0)
+    {
+      g_source_remove (priv->timeout_id);
+      priv->timeout_id = 0;
+    }
+
+  GTK_WIDGET_CLASS (flashback_confirm_dialog_parent_class)->destroy (widget);
+}
+
+static void
+flashback_confirm_dialog_show (GtkWidget *widget)
+{
+  FlashbackConfirmDialog *dialog;
+  FlashbackConfirmDialogPrivate *priv;
+
+  dialog = FLASHBACK_CONFIRM_DIALOG (widget);
+  priv = flashback_confirm_dialog_get_instance_private (dialog);
+
+  GTK_WIDGET_CLASS (flashback_confirm_dialog_parent_class)->show (widget);
+
+  if (priv->timeout_id == 0)
+    priv->timeout_id = g_timeout_add (1000, (GSourceFunc) timeout_cb, dialog);
+}
+
+static void
+flashback_confirm_dialog_class_init (FlashbackConfirmDialogClass *dialog_class)
+{
+  GObjectClass *object_class;
+  GtkWidgetClass *widget_class;
+  GtkBindingSet *binding_set;
+
+  widget_class = GTK_WIDGET_CLASS (dialog_class);
+
+  dialog_class->close = flashback_confirm_dialog_close;
+
+  object_class->finalize = flashback_confirm_dialog_finalize;
+
+  widget_class->destroy = flashback_confirm_dialog_destroy;
+  widget_class->show = flashback_confirm_dialog_show;
+
+  signals[SIGNAL_RESPONSE] =
+    g_signal_new ("response",
+                  G_OBJECT_CLASS_TYPE (dialog_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (FlashbackConfirmDialogClass, response),
+                  NULL,
+                  NULL,
+                  g_cclosure_marshal_VOID__INT,
+                  G_TYPE_NONE,
+                  1,
+                  G_TYPE_INT);
+  signals[SIGNAL_CLOSE] =
+    g_signal_new ("close",
+                  G_OBJECT_CLASS_TYPE (dialog_class),
+                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (FlashbackConfirmDialogClass, close),
+                  NULL,
+                  NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE,
+                  0);
+
+  binding_set = gtk_binding_set_by_class (dialog_class);
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
+
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/gnome-flashback/flashback-confirm-dialog.ui");
+
+  gtk_widget_class_bind_template_child_private (widget_class, FlashbackConfirmDialog, title);
+  gtk_widget_class_bind_template_child_private (widget_class, FlashbackConfirmDialog, description);
+  gtk_widget_class_bind_template_child_private (widget_class, FlashbackConfirmDialog, revert_settings);
+  gtk_widget_class_bind_template_child_private (widget_class, FlashbackConfirmDialog, keep_changes);
+
+  gtk_widget_class_bind_template_callback (widget_class, revert_settings_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, keep_changes_clicked_cb);
+}
+
+static void
+flashback_confirm_dialog_init (FlashbackConfirmDialog *dialog)
+{
+  GtkWindow *window;
+  GtkWidget *widget;
+
+  widget = GTK_WIDGET (dialog);
+  window = GTK_WINDOW (dialog);
+
+  gtk_widget_init_template (widget);
+
+  gtk_window_set_keep_above (window, TRUE);
+  gtk_window_set_skip_taskbar_hint (window, TRUE);
+  gtk_window_set_skip_pager_hint (window, TRUE);
+}
+
+GtkWidget *
+flashback_confirm_dialog_new (gint timeout)
+{
+  FlashbackConfirmDialog *dialog;
+  FlashbackConfirmDialogPrivate *priv;
+
+  dialog = g_object_new (FLASHBACK_TYPE_CONFIRM_DIALOG, NULL);
+  priv = flashback_confirm_dialog_get_instance_private (dialog);
+
+  priv->timeout = timeout;
+  update_text (dialog);
+
+  return GTK_WIDGET (dialog);
+}
diff --git a/gnome-flashback/libdisplay-config/flashback-confirm-dialog.h 
b/gnome-flashback/libdisplay-config/flashback-confirm-dialog.h
new file mode 100644
index 0000000..a4a71dc
--- /dev/null
+++ b/gnome-flashback/libdisplay-config/flashback-confirm-dialog.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 Alberts Muktupāvels
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef FLASHBACK_CONFIRM_DIALOG_H
+#define FLASHBACK_CONFIRM_DIALOG_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef enum _FlashbackConfirmDialogResponseType FlashbackConfirmDialogResponseType;
+
+#define FLASHBACK_TYPE_CONFIRM_DIALOG flashback_confirm_dialog_get_type ()
+G_DECLARE_DERIVABLE_TYPE (FlashbackConfirmDialog, flashback_confirm_dialog,
+                          FLASHBACK, CONFIRM_DIALOG,
+                          GtkWindow)
+
+enum FlashbackConfirmDialogResponseType
+{
+  FLASHBACK_CONFIRM_DIALOG_RESPONSE_REVERT_SETTINGS,
+  FLASHBACK_CONFIRM_DIALOG_RESPONSE_KEEP_CHANGES,
+};
+
+struct _FlashbackConfirmDialogClass
+{
+  GtkWindowClass parent_class;
+
+  void (* response) (FlashbackConfirmDialog *dialog,
+                     gint                    response_id);
+  void (* close)    (FlashbackConfirmDialog *dialog);
+};
+
+GtkWidget *flashback_confirm_dialog_new (gint timeout);
+
+G_END_DECLS
+
+#endif
diff --git a/gnome-flashback/libdisplay-config/flashback-confirm-dialog.ui 
b/gnome-flashback/libdisplay-config/flashback-confirm-dialog.ui
new file mode 100644
index 0000000..789bc71
--- /dev/null
+++ b/gnome-flashback/libdisplay-config/flashback-confirm-dialog.ui
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <template class="FlashbackConfirmDialog" parent="GtkWindow">
+    <property name="can_focus">False</property>
+    <property name="border_width">12</property>
+    <property name="title" translatable="yes">Confirm</property>
+    <property name="resizable">False</property>
+    <property name="window_position">center</property>
+    <property name="type_hint">dialog</property>
+    <property name="urgency_hint">True</property>
+    <child>
+      <object class="GtkBox" id="content_box">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <child>
+          <object class="GtkBox" id="main_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="vexpand">True</property>
+            <property name="border_width">0</property>
+            <property name="baseline_position">top</property>
+            <child>
+              <object class="GtkImage" id="image1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xpad">12</property>
+                <property name="ypad">12</property>
+                <property name="icon_name">preferences-desktop-display</property>
+                <property name="icon_size">6</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox" id="box1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="valign">center</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkLabel" id="title">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="halign">start</property>
+                    <property name="label" translatable="yes">Do you want to keep these display 
settings?</property>
+                    <property name="single_line_mode">True</property>
+                    <property name="lines">1</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="description">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="halign">start</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="buttons_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkButton" id="keep_changes">
+                <property name="label" translatable="yes">_Keep Changes</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="has_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="halign">end</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="keep_changes_clicked_cb" swapped="yes"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="revert_settings">
+                <property name="label" translatable="yes">_Revert Settings</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="halign">start</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="revert_settings_clicked_cb" swapped="yes"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/gnome-flashback/libdisplay-config/flashback-display-config.c 
b/gnome-flashback/libdisplay-config/flashback-display-config.c
index dc25a2b..5161ea7 100644
--- a/gnome-flashback/libdisplay-config/flashback-display-config.c
+++ b/gnome-flashback/libdisplay-config/flashback-display-config.c
@@ -29,6 +29,7 @@
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <math.h>
+#include "flashback-confirm-dialog.h"
 #include "flashback-display-config.h"
 #include "flashback-monitor-config.h"
 #include "flashback-monitor-manager.h"
@@ -39,6 +40,7 @@ struct _FlashbackDisplayConfig
   gint                     bus_name;
   MetaDBusDisplayConfig   *skeleton;
   FlashbackMonitorManager *manager;
+  GtkWidget               *confirm_dialog;
 };
 
 G_DEFINE_TYPE (FlashbackDisplayConfig, flashback_display_config, G_TYPE_OBJECT)
@@ -73,19 +75,57 @@ power_save_mode_changed (MetaDBusDisplayConfig *skeleton,
   manager->power_save_mode = mode;
 }
 
+static void
+destroy_confirm_dialog (FlashbackDisplayConfig *dialog)
+{
+  if (dialog->confirm_dialog != NULL)
+    {
+      gtk_widget_destroy (GTK_WIDGET (dialog->confirm_dialog));
+      dialog->confirm_dialog = NULL;
+    }
+}
+
 static gboolean
 save_config_timeout (gpointer user_data)
 {
-  FlashbackMonitorManager *manager;
+  FlashbackDisplayConfig *dispay_config;
+
+  dispay_config = FLASHBACK_DISPLAY_CONFIG (user_data);
 
-  manager = FLASHBACK_MONITOR_MANAGER (user_data);
+  destroy_confirm_dialog (dispay_config);
 
-  flashback_monitor_config_restore_previous (manager->config);
+  flashback_monitor_config_restore_previous (dispay_config->manager->monitor_config);
 
-  manager->persistent_timeout_id = 0;
+  dispay_config->manager->persistent_timeout_id = 0;
   return G_SOURCE_REMOVE;
 }
 
+static void
+confirm_dialog_response_cb (FlashbackConfirmDialog *dialog,
+                            gint                    response_id,
+                            gpointer                user_data)
+{
+  FlashbackDisplayConfig *config;
+  gboolean ok;
+
+  config = FLASHBACK_DISPLAY_CONFIG (user_data);
+
+  switch (response_id)
+    {
+      case FLASHBACK_CONFIRM_DIALOG_RESPONSE_KEEP_CHANGES:
+        ok = TRUE;
+        break;
+      case FLASHBACK_CONFIRM_DIALOG_RESPONSE_REVERT_SETTINGS:
+      default:
+        ok = FALSE;
+        break;
+    }
+
+  destroy_confirm_dialog (config);
+
+  flashback_monitor_manager_confirm_configuration (config->manager, ok);
+}
+
 static gboolean
 output_can_config (MetaOutput      *output,
                    MetaCRTC        *crtc,
@@ -629,12 +669,18 @@ handle_apply_configuration (MetaDBusDisplayConfig *skeleton,
      appropriate UI. Then wait 20 seconds and if not confirmed, revert the
      configuration.
   */
-  flashback_monitor_config_update_current (manager->config);
+  flashback_monitor_config_update_current (manager->monitor_config);
 
   if (persistent)
     {
-      manager->persistent_timeout_id = g_timeout_add_seconds (20, save_config_timeout, manager);
+      manager->persistent_timeout_id = g_timeout_add_seconds (20, save_config_timeout, config);
       g_source_set_name_by_id (manager->persistent_timeout_id, "[gnome-flashback] save_config_timeout");
+
+      config->confirm_dialog = flashback_confirm_dialog_new (20);
+      g_signal_connect (config->confirm_dialog, "response",
+                        G_CALLBACK (confirm_dialog_response_cb), config);
+
+      gtk_window_present (GTK_WINDOW (config->confirm_dialog));
     }
 
   meta_dbus_display_config_complete_apply_configuration (skeleton,
@@ -902,6 +948,8 @@ flashback_display_config_finalize (GObject *object)
       config->bus_name = 0;
     }
 
+  destroy_confirm_dialog (config);
+
   g_clear_object (&config->manager);
 
   G_OBJECT_CLASS (flashback_display_config_parent_class)->finalize (object);
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-config.c 
b/gnome-flashback/libdisplay-config/flashback-monitor-config.c
index 4340e2a..15ee979 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-config.c
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-config.c
@@ -1923,6 +1923,13 @@ flashback_monitor_config_update_current (FlashbackMonitorConfig *config)
 void
 flashback_monitor_config_make_persistent (FlashbackMonitorConfig *config)
 {
+  g_hash_table_replace (config->configs, config->current, config_ref (config->current));
+  meta_monitor_config_save (config);
+}
+
+void
+flashback_monitor_config_restore_previous (FlashbackMonitorConfig *config)
+{
   if (config->previous)
     {
       /* The user chose to restore the previous configuration. In this
@@ -1942,13 +1949,6 @@ flashback_monitor_config_make_persistent (FlashbackMonitorConfig *config)
     }
 }
 
-void
-flashback_monitor_config_restore_previous (FlashbackMonitorConfig *config)
-{
-  g_hash_table_replace (config->configs, config->current, config_ref (config->current));
-  meta_monitor_config_save (config);
-}
-
 gboolean
 flashback_monitor_manager_has_hotplug_mode_update (FlashbackMonitorManager *manager)
 {
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-manager.c 
b/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
index b039bc1..e662ab0 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
@@ -1053,12 +1053,12 @@ flashback_monitor_manager_constructed (GObject *object)
 
   manager->in_init = TRUE;
 
-  manager->config = flashback_monitor_config_new (manager);
+  manager->monitor_config = flashback_monitor_config_new (manager);
 
   flashback_monitor_manager_read_current_config (manager);
 
-  if (!flashback_monitor_config_apply_stored (manager->config))
-    flashback_monitor_config_make_default (manager->config);
+  if (!flashback_monitor_config_apply_stored (manager->monitor_config))
+    flashback_monitor_config_make_default (manager->monitor_config);
 
   /* Under XRandR, we don't rebuild our data structures until we see
      the RRScreenNotify event, but at least at startup we want to have
@@ -1416,6 +1416,25 @@ flashback_monitor_manager_apply_configuration (FlashbackMonitorManager  *manager
 }
 
 void
+flashback_monitor_manager_confirm_configuration (FlashbackMonitorManager *manager,
+                                                 gboolean                 ok)
+{
+  if (!manager->persistent_timeout_id)
+    {
+      /* too late */
+      return;
+    }
+
+  g_source_remove (manager->persistent_timeout_id);
+  manager->persistent_timeout_id = 0;
+
+  if (ok)
+    flashback_monitor_config_make_persistent (manager->monitor_config);
+  else
+    flashback_monitor_config_restore_previous (manager->monitor_config);
+}
+
+void
 flashback_monitor_manager_change_backlight (FlashbackMonitorManager *manager,
                                                                          MetaOutput              *output,
                                                                          gint                     value)
@@ -1587,13 +1606,13 @@ flashback_monitor_manager_on_hotplug (FlashbackMonitorManager *manager)
    */
   if (!flashback_monitor_manager_has_hotplug_mode_update (manager))
     {
-      if (flashback_monitor_config_apply_stored (manager->config))
+      if (flashback_monitor_config_apply_stored (manager->monitor_config))
         applied_config = TRUE;
     }
 
   /* If we haven't applied any configuration, apply the default configuration. */
   if (!applied_config)
-    flashback_monitor_config_make_default (manager->config);
+    flashback_monitor_config_make_default (manager->monitor_config);
 }
 
 MetaOutput *
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-manager.h 
b/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
index bc64172..4ea3db0 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
@@ -252,7 +252,7 @@ struct _FlashbackMonitorManager
   int                             primary_monitor_index;
 
   int                             persistent_timeout_id;
-  FlashbackMonitorConfig         *config;
+  FlashbackMonitorConfig         *monitor_config;
 
   GnomePnpIds                    *pnp_ids;
 
@@ -267,6 +267,9 @@ void                     flashback_monitor_manager_apply_configuration     (Flas
                                                                             MetaOutputInfo          
**outputs,
                                                                             unsigned int              
n_outputs);
 
+void                     flashback_monitor_manager_confirm_configuration   (FlashbackMonitorManager  
*manager,
+                                                                            gboolean                  ok);
+
 void                     flashback_monitor_manager_change_backlight        (FlashbackMonitorManager  
*manager,
                                                                             MetaOutput               *output,
                                                                             gint                      value);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]