[gnome-disk-utility] RAID Disks dialog: Add buttons to start/stop data scrubbing
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-disk-utility] RAID Disks dialog: Add buttons to start/stop data scrubbing
- Date: Thu, 20 Dec 2012 17:31:15 +0000 (UTC)
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]