[Xfce4-commits] <xfce4-settings:master> Add timed user confirmation (Xfce bug #867).

Nick Schermer noreply at xfce.org
Sat Aug 28 23:04:52 CEST 2010


Updating branch refs/heads/master
         to 34d0ee0162d761f7e06900dad387be192a7fe6bc (commit)
       from ab7735905b594e2532bdf68d5eee9ef9981f47da (commit)

commit 34d0ee0162d761f7e06900dad387be192a7fe6bc
Author: Jérôme Guelfucci <jeromeg at xfce.org>
Date:   Sun Jun 27 15:47:53 2010 +0200

    Add timed user confirmation (Xfce bug #867).
    
    Add a dialog to revert the changes. The dialog allows the user to
    validate the current configuration or to restore the previous one. If
    the user does not reply to the dialog within 5 seconds, it restores the
    previous configuration.

 dialogs/display-settings/Makefile.am               |    6 +
 ...play-dialog.glade => confirmation-dialog.glade} |   94 +++-----
 dialogs/display-settings/main.c                    |  244 +++++++++++++++++++-
 po/POTFILES.in                                     |    1 +
 4 files changed, 278 insertions(+), 67 deletions(-)

diff --git a/dialogs/display-settings/Makefile.am b/dialogs/display-settings/Makefile.am
index 987a2e6..c862306 100644
--- a/dialogs/display-settings/Makefile.am
+++ b/dialogs/display-settings/Makefile.am
@@ -18,6 +18,7 @@ xfce4_display_settings_SOURCES = \
 	xfce-randr.h \
 	xfce-randr-legacy.c \
 	xfce-randr-legacy.h \
+	confirmation-dialog_ui.h \
 	display-dialog_ui.h \
 	minimal-display-dialog_ui.h \
 	display-name.c \
@@ -46,9 +47,13 @@ xfce4_display_settings_LDADD = \
 if MAINTAINER_MODE
 
 BUILT_SOURCES = \
+	confirmation-dialog_ui.h
 	display-dialog_ui.h \
 	minimal-display-dialog_ui.h
 
+confirmation-dialog_ui.h: confirmation-dialog.glade
+	exo-csource --static --strip-comments --strip-content --name=confirmation_dialog_ui $< >$@
+
 display-dialog_ui.h: display-dialog.glade
 	exo-csource --static --strip-comments --strip-content --name=display_dialog_ui $< >$@
 
@@ -65,6 +70,7 @@ desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
 
 EXTRA_DIST = \
 	$(desktop_in_files) \
+	confirmation-dialog.glade \
 	display-dialog.glade \
 	minimal-display-dialog.glade
 
diff --git a/dialogs/display-settings/minimal-display-dialog.glade b/dialogs/display-settings/confirmation-dialog.glade
similarity index 51%
copy from dialogs/display-settings/minimal-display-dialog.glade
copy to dialogs/display-settings/confirmation-dialog.glade
index 218aff8..85b1910 100644
--- a/dialogs/display-settings/minimal-display-dialog.glade
+++ b/dialogs/display-settings/confirmation-dialog.glade
@@ -4,10 +4,10 @@
   <!-- interface-naming-policy project-wide -->
   <object class="GtkDialog" id="dialog1">
     <property name="border_width">5</property>
-    <property name="title" translatable="yes">Display settings</property>
+    <property name="title" translatable="yes">Confirmation</property>
     <property name="resizable">False</property>
     <property name="window_position">center</property>
-    <property name="icon_name">video-display</property>
+    <property name="icon_name">dialog-question</property>
     <property name="type_hint">normal</property>
     <property name="has_separator">False</property>
     <child internal-child="vbox">
@@ -16,28 +16,34 @@
         <property name="orientation">vertical</property>
         <property name="spacing">2</property>
         <child>
-          <object class="GtkVBox" id="vbox1">
+          <object class="GtkHBox" id="hbox1">
             <property name="visible">True</property>
-            <property name="orientation">vertical</property>
             <child>
-              <object class="GtkLabel" id="label1">
+              <object class="GtkImage" id="image1">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Several displays are available. Use:
-</property>
+                <property name="xalign">0.20000000298023224</property>
+                <property name="xpad">10</property>
+                <property name="stock">gtk-dialog-question</property>
+                <property name="icon-size">6</property>
               </object>
               <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox1">
+              <object class="GtkVBox" id="vbox1">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
-                  <object class="GtkImage" id="image1">
+                  <object class="GtkLabel" id="label1">
                     <property name="visible">True</property>
-                    <property name="xpad">20</property>
-                    <property name="pixel_size">64</property>
-                    <property name="icon_name">video-display</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="ypad">10</property>
+                    <property name="label" translatable="yes"><big><b>Would you like to keep this configuration?</b></big></property>
+                    <property name="use_markup">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -46,52 +52,17 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkVBox" id="vbox3">
+                  <object class="GtkLabel" id="label2">
                     <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
-                    <property name="spacing">4</property>
-                    <child>
-                      <object class="GtkRadioButton" id="radiobutton1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="active">True</property>
-                        <property name="draw_indicator">True</property>
-                      </object>
-                      <packing>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkRadioButton" id="radiobutton2">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="active">True</property>
-                        <property name="draw_indicator">True</property>
-                        <property name="group">radiobutton1</property>
-                      </object>
-                      <packing>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkRadioButton" id="radiobutton3">
-                        <property name="label" translatable="yes">Both displays cloned</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="tooltip_text" translatable="yes">Use both displays to show the same contents</property>
-                        <property name="active">True</property>
-                        <property name="draw_indicator">True</property>
-                        <property name="group">radiobutton1</property>
-                      </object>
-                      <packing>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="ypad">10</property>
+                    <property name="label" translatable="yes">The previous configuration will be restored in 5 seconds if you do not reply to this question.</property>
+                    <property name="wrap">True</property>
                   </object>
                   <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
@@ -102,7 +73,6 @@
             </child>
           </object>
           <packing>
-            <property name="padding">4</property>
             <property name="position">1</property>
           </packing>
         </child>
@@ -112,11 +82,12 @@
             <property name="layout_style">end</property>
             <child>
               <object class="GtkButton" id="button2">
-                <property name="label">gtk-cancel</property>
+                <property name="label" translatable="yes">Keep this configuration</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -126,13 +97,10 @@
             </child>
             <child>
               <object class="GtkButton" id="button1">
-                <property name="label">gtk-ok</property>
+                <property name="label" translatable="yes">Restore the previous configuration</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -150,7 +118,7 @@
       </object>
     </child>
     <action-widgets>
-      <action-widget response="0">button2</action-widget>
+      <action-widget response="2">button2</action-widget>
       <action-widget response="1">button1</action-widget>
     </action-widgets>
   </object>
diff --git a/dialogs/display-settings/main.c b/dialogs/display-settings/main.c
index 44bceb7..6612134 100644
--- a/dialogs/display-settings/main.c
+++ b/dialogs/display-settings/main.c
@@ -43,6 +43,7 @@
 #include "xfce-randr.h"
 #include "xfce-randr-legacy.h"
 #include "display-dialog_ui.h"
+#include "confirmation-dialog_ui.h"
 #ifdef HAS_RANDR_ONE_POINT_TWO
 #include "minimal-display-dialog_ui.h"
 #endif
@@ -88,6 +89,15 @@ static const XfceRotation reflection_names[] =
 
 
 
+/* confirmation dialog data */
+typedef struct
+{
+    GtkBuilder *builder;
+    gint count;
+} ConfirmationDialog;
+
+
+
 /* option entries */
 static gboolean opt_version = FALSE;
 #ifdef HAS_RANDR_ONE_POINT_TWO
@@ -135,6 +145,90 @@ display_setting_combo_box_get_value (GtkComboBox *combobox,
     return FALSE;
 }
 
+static gboolean
+display_settings_update_time_label (ConfirmationDialog *confirmation_dialog)
+{
+    GObject *dialog;
+
+    dialog = gtk_builder_get_object (confirmation_dialog->builder, "dialog1");
+    confirmation_dialog->count--;
+
+    if (confirmation_dialog->count <= 0)
+    {
+        gtk_dialog_response (GTK_DIALOG (dialog), 1);
+
+        return FALSE;
+    }
+    else
+    {
+        GObject *label;
+        gchar   *string;
+
+        string = g_strdup_printf (_("The previous configuration will be restored in %i"
+                                    " seconds if you do not reply to this question."),
+                                  confirmation_dialog->count);
+
+        label = gtk_builder_get_object (confirmation_dialog->builder, "label2");
+        gtk_label_set_text (GTK_LABEL (label), string);
+
+        return TRUE;
+    }
+
+    return TRUE;
+}
+
+
+/* Returns true if the configuration is to be kept or false if it is to
+ * be reverted */
+static gboolean
+display_setting_timed_confirmation (GtkBuilder *main_builder)
+{
+    GtkBuilder *builder;
+    GObject    *main_dialog;
+    GError     *error = NULL;
+    gint        response_id;
+    gint        source_id;
+
+    /* Lock the main UI */
+    main_dialog = gtk_builder_get_object (main_builder, "display-dialog");
+    gtk_widget_set_sensitive (GTK_WIDGET (main_dialog), FALSE);
+
+    builder = gtk_builder_new ();
+
+    if (gtk_builder_add_from_string (builder, confirmation_dialog_ui,
+                                     confirmation_dialog_ui_length, &error) != 0)
+    {
+        GObject *dialog;
+        ConfirmationDialog *confirmation_dialog;
+
+        confirmation_dialog = g_new0 (ConfirmationDialog, 1);
+        confirmation_dialog->builder = builder;
+        confirmation_dialog->count = 5;
+
+        dialog = gtk_builder_get_object (builder, "dialog1");
+        gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (main_dialog));
+        source_id = g_timeout_add_seconds (1, (GSourceFunc) display_settings_update_time_label,
+                                           confirmation_dialog);
+
+        response_id = gtk_dialog_run (GTK_DIALOG (dialog));
+        g_source_remove (source_id);
+        gtk_widget_destroy (GTK_WIDGET (dialog));
+    }
+    else
+    {
+        response_id = 2;
+        g_error ("Failed to load the UI file: %s.", error->message);
+        g_error_free (error);
+    }
+
+    g_object_unref (G_OBJECT (builder));
+
+    /* Unlock the main UI */
+    gtk_widget_set_sensitive (GTK_WIDGET (main_dialog), TRUE);
+
+    return ((response_id == 2) ? TRUE : FALSE);
+}
+
 
 
 #ifdef HAS_RANDR_ONE_POINT_TWO
@@ -149,12 +243,23 @@ display_setting_reflections_changed (GtkComboBox *combobox,
 
     if (xfce_randr)
     {
+        Rotation old_rotation;
+
+        old_rotation = XFCE_RANDR_ROTATION (xfce_randr);
+
         /* remove existing reflection */
         XFCE_RANDR_ROTATION (xfce_randr) &= ~XFCE_RANDR_REFLECTIONS_MASK;
         /* set the new one */
         XFCE_RANDR_ROTATION (xfce_randr) |= value;
         /* Apply the changes */
         xfce_randr_save (xfce_randr, "Default", display_channel);
+
+        /* Ask user confirmation */
+        if (!display_setting_timed_confirmation (builder))
+        {
+            XFCE_RANDR_ROTATION (xfce_randr) = old_rotation;
+            xfce_randr_save (xfce_randr, "Default", display_channel);
+        }
     }
 }
 
@@ -169,11 +274,19 @@ display_setting_reflections_populate (GtkBuilder *builder)
     guint         n;
     GtkTreeIter   iter;
 
-    /* get the combo box store and clear it */
     combobox = gtk_builder_get_object (builder, "randr-reflection");
+
+    /* Disconnect the "changed" signal to avoid triggering the confirmation
+     * dialog */
+    g_object_disconnect (combobox, "any_signal::changed",
+                         display_setting_reflections_changed,
+                         builder, NULL);
+
+    /* get the combo box store and clear it */
     model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
     gtk_list_store_clear (GTK_LIST_STORE (model));
 
+
     if (xfce_randr)
     {
         /* disable it if no mode is selected */
@@ -203,6 +316,9 @@ display_setting_reflections_populate (GtkBuilder *builder)
             }
         }
     }
+
+    /* Reconnect the signal */
+    g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (display_setting_reflections_changed), builder);
 }
 #endif
 
@@ -212,29 +328,56 @@ static void
 display_setting_rotations_changed (GtkComboBox *combobox,
                                    GtkBuilder  *builder)
 {
+    Rotation old_rotation;
     gint value;
 
     if (!display_setting_combo_box_get_value (combobox, &value))
         return;
 
+
     /* set new rotation */
 #ifdef HAS_RANDR_ONE_POINT_TWO
     if (xfce_randr)
     {
+        old_rotation = XFCE_RANDR_ROTATION (xfce_randr);
         XFCE_RANDR_ROTATION (xfce_randr) &= ~XFCE_RANDR_ROTATIONS_MASK;
         XFCE_RANDR_ROTATION (xfce_randr) |= value;
     }
     else
+    {
 #endif
+        old_rotation = XFCE_RANDR_LEGACY_ROTATION (xfce_randr_legacy);
         XFCE_RANDR_LEGACY_ROTATION (xfce_randr_legacy) = value;
+#ifdef HAS_RANDR_ONE_POINT_TWO
+    }
+#endif
 
     /* Apply the changes */
-    #ifdef HAS_RANDR_ONE_POINT_TWO
+#ifdef HAS_RANDR_ONE_POINT_TWO
     if (xfce_randr)
         xfce_randr_save (xfce_randr, "Default", display_channel);
     else
-    #endif
+#endif
         xfce_randr_legacy_save (xfce_randr_legacy, "Default", display_channel);
+
+    /* Ask user confirmation */
+    if (!display_setting_timed_confirmation (builder))
+    {
+#ifdef HAS_RANDR_ONE_POINT_TWO
+        if (xfce_randr)
+        {
+          XFCE_RANDR_ROTATION (xfce_randr) = old_rotation;
+          xfce_randr_save (xfce_randr, "Default", display_channel);
+        }
+        else
+        {
+#endif
+        XFCE_RANDR_LEGACY_ROTATION (xfce_randr_legacy) = old_rotation;
+        xfce_randr_legacy_save (xfce_randr_legacy, "Default", display_channel);
+#ifdef HAS_RANDR_ONE_POINT_TWO
+        }
+#endif
+    }
 }
 
 
@@ -251,6 +394,13 @@ display_setting_rotations_populate (GtkBuilder *builder)
 
     /* get the combo box store and clear it */
     combobox = gtk_builder_get_object (builder, "randr-rotation");
+
+    /* Disconnect the "changed" signal to avoid triggering the confirmation
+     * dialog */
+    g_object_disconnect (combobox, "any_signal::changed",
+                         display_setting_rotations_changed,
+                         builder, NULL);
+
     model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
     gtk_list_store_clear (GTK_LIST_STORE (model));
 
@@ -293,6 +443,9 @@ display_setting_rotations_populate (GtkBuilder *builder)
             }
         }
     }
+
+    /* Reconnect the signal */
+    g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (display_setting_rotations_changed), builder);
 }
 
 
@@ -301,6 +454,10 @@ static void
 display_setting_refresh_rates_changed (GtkComboBox *combobox,
                                        GtkBuilder  *builder)
 {
+#ifdef HAS_RANDR_ONE_POINT_TWO
+    RRMode old_mode;
+#endif
+    gshort old_rate;
     gint value;
 
     if (!display_setting_combo_box_get_value (combobox, &value))
@@ -309,10 +466,18 @@ display_setting_refresh_rates_changed (GtkComboBox *combobox,
     /* set new mode (1.2) or rate (1.1) */
 #ifdef HAS_RANDR_ONE_POINT_TWO
     if (xfce_randr)
+    {
+        old_mode = XFCE_RANDR_MODE (xfce_randr);
         XFCE_RANDR_MODE (xfce_randr) = value;
+    }
     else
+    {
 #endif
+        old_rate = XFCE_RANDR_LEGACY_RATE (xfce_randr_legacy);
         XFCE_RANDR_LEGACY_RATE (xfce_randr_legacy) = value;
+#ifdef HAS_RANDR_ONE_POINT_TWO
+    }
+#endif
 
     /* Apply the changes */
     #ifdef HAS_RANDR_ONE_POINT_TWO
@@ -321,6 +486,25 @@ display_setting_refresh_rates_changed (GtkComboBox *combobox,
     else
     #endif
         xfce_randr_legacy_save (xfce_randr_legacy, "Default", display_channel);
+
+    /* Ask user confirmation */
+    if (!display_setting_timed_confirmation (builder))
+    {
+#ifdef HAS_RANDR_ONE_POINT_TWO
+        if (xfce_randr)
+        {
+            XFCE_RANDR_MODE (xfce_randr) = old_mode;
+            xfce_randr_save (xfce_randr, "Default", display_channel);
+        }
+        else
+        {
+#endif
+        XFCE_RANDR_LEGACY_RATE (xfce_randr_legacy) = old_rate;
+        xfce_randr_legacy_save (xfce_randr_legacy, "Default", display_channel);
+#ifdef HAS_RANDR_ONE_POINT_TWO
+        }
+#endif
+    }
 }
 
 
@@ -343,6 +527,13 @@ display_setting_refresh_rates_populate (GtkBuilder *builder)
 
     /* get the combo box store and clear it */
     combobox = gtk_builder_get_object (builder, "randr-refresh-rate");
+
+    /* Disconnect the "changed" signal to avoid triggering the confirmation
+     * dialog */
+    g_object_disconnect (combobox, "any_signal::changed",
+                         display_setting_refresh_rates_changed,
+                         builder, NULL);
+
     model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
     gtk_list_store_clear (GTK_LIST_STORE (model));
 
@@ -419,6 +610,9 @@ display_setting_refresh_rates_populate (GtkBuilder *builder)
         if (G_LIKELY (active != -1))
             gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), active);
     }
+
+    /* Reconnect the signal */
+    g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (display_setting_refresh_rates_changed), builder);
 }
 
 
@@ -427,14 +621,27 @@ static void
 display_setting_resolutions_changed (GtkComboBox *combobox,
                                      GtkBuilder  *builder)
 {
+#ifdef HAS_RANDR_ONE_POINT_TWO
+    RRMode old_mode;
+#endif
+    SizeID old_resolution;
     gint value;
 
     if (!display_setting_combo_box_get_value (combobox, &value))
         return;
 
-    /* set new resolution */
+    /* Set new resolution */
+    if (xfce_randr)
+    {
+        old_mode = XFCE_RANDR_MODE (xfce_randr);
+        XFCE_RANDR_MODE (xfce_randr) = value;
+    }
+
     if (xfce_randr_legacy)
+    {
+        old_resolution = XFCE_RANDR_LEGACY_RESOLUTION (xfce_randr_legacy);
         XFCE_RANDR_LEGACY_RESOLUTION (xfce_randr_legacy) = value;
+    }
 
     /* update refresh rates */
     display_setting_refresh_rates_populate (builder);
@@ -446,6 +653,25 @@ display_setting_resolutions_changed (GtkComboBox *combobox,
     else
     #endif
         xfce_randr_legacy_save (xfce_randr_legacy, "Default", display_channel);
+
+    /* Ask user confirmation */
+    if (!display_setting_timed_confirmation (builder))
+    {
+#ifdef HAS_RANDR_ONE_POINT_TWO
+        if (xfce_randr)
+        {
+            XFCE_RANDR_MODE (xfce_randr) = old_mode;
+            xfce_randr_save (xfce_randr, "Default", display_channel);
+        }
+        else
+        {
+#endif
+        XFCE_RANDR_LEGACY_RESOLUTION (xfce_randr_legacy) = old_resolution;
+        xfce_randr_legacy_save (xfce_randr_legacy, "Default", display_channel);
+#ifdef HAS_RANDR_ONE_POINT_TWO
+        }
+#endif
+    }
 }
 
 
@@ -465,6 +691,13 @@ display_setting_resolutions_populate (GtkBuilder *builder)
 
     /* get the combo box store and clear it */
     combobox = gtk_builder_get_object (builder, "randr-resolution");
+
+    /* Disconnect the "changed" signal to avoid triggering the confirmation
+     * dialog */
+    g_object_disconnect (combobox, "any_signal::changed",
+                         display_setting_resolutions_changed,
+                         builder, NULL);
+
     model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
     gtk_list_store_clear (GTK_LIST_STORE (model));
 
@@ -517,6 +750,9 @@ display_setting_resolutions_populate (GtkBuilder *builder)
                 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
         }
     }
+
+    /* Reconnect the signal */
+    g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (display_setting_resolutions_changed), builder);
 }
 
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ec96522..6ed39c7 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -6,6 +6,7 @@ dialogs/appearance-settings/appearance-dialog.glade
 dialogs/appearance-settings/main.c
 dialogs/appearance-settings/xfce-ui-settings.desktop.in
 
+dialogs/display-settings/confirmation-dialog.glade
 dialogs/display-settings/display-dialog.glade
 dialogs/display-settings/minimal-display-dialog.glade
 dialogs/display-settings/main.c



More information about the Xfce4-commits mailing list