[gnome-disk-utility] RAID Disks dialog: Add buttons to start/stop data scrubbing



commit b4886107489dae767f1f07829bf9bdfe67056219
Author: David Zeuthen <zeuthen gmail com>
Date:   Thu Dec 20 12:25:27 2012 -0500

    RAID Disks dialog: Add buttons to start/stop data scrubbing
    
    Signed-off-by: David Zeuthen <zeuthen gmail com>

 data/ui/md-raid-disks-dialog.ui  |   54 +++++++++++++++++++++-
 src/disks/gdumdraiddisksdialog.c |   96 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 148 insertions(+), 2 deletions(-)
---
diff --git a/data/ui/md-raid-disks-dialog.ui b/data/ui/md-raid-disks-dialog.ui
index a005e71..50da14c 100644
--- a/data/ui/md-raid-disks-dialog.ui
+++ b/data/ui/md-raid-disks-dialog.ui
@@ -12,7 +12,7 @@
       <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
+        <property name="spacing">12</property>
         <child internal-child="action_area">
           <object class="GtkButtonBox" id="dialog-action_area1">
             <property name="can_focus">False</property>
@@ -31,6 +31,37 @@
                 <property name="position">0</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkMenuButton" id="start-scrub-button">
+                <property name="popup">scrub-menu</property>
+                <property name="label" translatable="yes">Start Data _Scrubbing</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="stop-scrub-button">
+                <property name="label" translatable="yes">Stop Data _Scrubbing</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -318,6 +349,27 @@
     </child>
     <action-widgets>
       <action-widget response="-7">close-button</action-widget>
+      <action-widget response="1">stop-scrub-button</action-widget>
     </action-widgets>
   </object>
+  <object class="GtkMenu" id="scrub-menu">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="scrub-check-menuitem">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Check Only</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="scrub-repair-menuitem">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Check and Repair</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+  </object>
 </interface>
diff --git a/src/disks/gdumdraiddisksdialog.c b/src/disks/gdumdraiddisksdialog.c
index a7a08a5..00af46f 100644
--- a/src/disks/gdumdraiddisksdialog.c
+++ b/src/disks/gdumdraiddisksdialog.c
@@ -37,6 +37,11 @@ typedef struct
 
   GtkWidget *dialog;
 
+  GtkWidget *start_scrub_button;
+  GtkWidget *stop_scrub_button;
+  GtkWidget *scrub_check_menuitem;
+  GtkWidget *scrub_repair_menuitem;
+
   GtkWidget *close_button;
   GtkWidget *scrolledwindow;
   GtkWidget *treeview;
@@ -57,8 +62,12 @@ static const struct {
   goffset offset;
   const gchar *name;
 } widget_mapping[] = {
-  {G_STRUCT_OFFSET (DialogData, close_button), "close-button"},
+  {G_STRUCT_OFFSET (DialogData, start_scrub_button), "start-scrub-button"},
+  {G_STRUCT_OFFSET (DialogData, stop_scrub_button), "stop-scrub-button"},
+  {G_STRUCT_OFFSET (DialogData, scrub_check_menuitem), "scrub-check-menuitem"},
+  {G_STRUCT_OFFSET (DialogData, scrub_repair_menuitem), "scrub-repair-menuitem"},
 
+  {G_STRUCT_OFFSET (DialogData, close_button), "close-button"},
   {G_STRUCT_OFFSET (DialogData, scrolledwindow), "scrolledwindow"},
   {G_STRUCT_OFFSET (DialogData, treeview), "treeview"},
 
@@ -290,6 +299,31 @@ update_dialog_labels (DialogData *data)
 /* ---------------------------------------------------------------------------------------------------- */
 
 static void
+update_dialog_scrub_buttons (DialogData *data)
+{
+  gboolean show_start_scrub = FALSE;
+  gboolean show_stop_scrub = FALSE;
+  const gchar *sync_action;
+
+  sync_action = udisks_mdraid_get_sync_action (data->mdraid);
+
+  if (g_strcmp0 (sync_action, "idle") == 0)
+    {
+      show_start_scrub = TRUE;
+    }
+  else if (g_strcmp0 (sync_action, "check") == 0 ||
+           g_strcmp0 (sync_action, "repair") == 0)
+    {
+      show_stop_scrub = TRUE;
+    }
+
+  gtk_widget_set_visible (data->start_scrub_button, show_start_scrub);
+  gtk_widget_set_visible (data->stop_scrub_button, show_stop_scrub);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
 update_dialog (DialogData *data)
 {
   /* don't recurse */
@@ -299,6 +333,7 @@ update_dialog (DialogData *data)
   data->in_update = TRUE;
   update_dialog_treeview (data);
   update_dialog_labels (data);
+  update_dialog_scrub_buttons (data);
   data->in_update = FALSE;
 
  out:
@@ -868,6 +903,53 @@ on_tree_selection_changed (GtkTreeSelection *selection,
 /* ---------------------------------------------------------------------------------------------------- */
 
 
+static void
+request_sync_action_cb (GObject      *source_object,
+                        GAsyncResult *res,
+                        gpointer      user_data)
+{
+  DialogData *data = user_data;
+  GError *error = NULL;
+  if (!udisks_mdraid_call_request_sync_action_finish (UDISKS_MDRAID (source_object),
+                                                      res,
+                                                      &error))
+    {
+      gdu_utils_show_error (GTK_WINDOW (data->window),
+                            _("An error occurred when triggering data redundancy checks"),
+                            error);
+      g_clear_error (&error);
+    }
+  dialog_data_unref (data);
+}
+
+static void
+scrub_do (DialogData  *data,
+          const gchar *sync_action)
+{
+  udisks_mdraid_call_request_sync_action (data->mdraid,
+                                          sync_action,
+                                          g_variant_new ("a{sv}", NULL), /* options */
+                                          NULL, /* cancellable */
+                                          (GAsyncReadyCallback) request_sync_action_cb,
+                                          dialog_data_ref (data));
+}
+
+static void
+on_scrub_check (GtkMenuItem *menu_item,
+                gpointer     user_data)
+{
+  DialogData *data = user_data;
+  scrub_do (data, "check");
+}
+
+static void
+on_scrub_repair (GtkMenuItem *menu_item,
+                 gpointer     user_data)
+{
+  DialogData *data = user_data;
+  scrub_do (data, "repair");
+}
+
 void
 gdu_mdraid_disks_dialog_show (GduWindow    *window,
                               UDisksObject *object)
@@ -906,6 +988,9 @@ gdu_mdraid_disks_dialog_show (GduWindow    *window,
       *p = gtk_builder_get_object (data->builder, widget_mapping[n].name);
     }
 
+  g_signal_connect (data->scrub_check_menuitem, "activate", G_CALLBACK (on_scrub_check), data);
+  g_signal_connect (data->scrub_repair_menuitem, "activate", G_CALLBACK (on_scrub_repair), data);
+
   gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (window));
 
   init_dialog (data);
@@ -921,6 +1006,15 @@ gdu_mdraid_disks_dialog_show (GduWindow    *window,
           goto out;
           break;
 
+        case 0:
+          /* "Start Data Scrubbing" menu-button - do nothing, handled by menu */
+          break;
+
+        case 1:
+          /* "Stop Data Scrubbing" menu-button */
+          scrub_do (data, "idle");
+          break;
+
         default:
           goto out;
         }



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