[gnome-disk-utility/wip/mdraid] Make it possible to start/stop RAID arrays
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-disk-utility/wip/mdraid] Make it possible to start/stop RAID arrays
- Date: Tue, 11 Sep 2012 16:57:55 +0000 (UTC)
commit bdaaeb1ffa04349994b378f0bcf7833ccbb296df
Author: David Zeuthen <zeuthen gmail com>
Date: Tue Sep 11 12:57:27 2012 -0400
Make it possible to start/stop RAID arrays
Also use the 'linked' style class for the drive button box
http://people.freedesktop.org/~david/gnome-disks-mdraid-20120911-1.png
Signed-off-by: David Zeuthen <zeuthen gmail com>
data/ui/disks.ui | 79 +++++++++++++++++++--
src/disks/gduwindow.c | 183 +++++++++++++++++++++++++++++++++++++++----------
2 files changed, 217 insertions(+), 45 deletions(-)
---
diff --git a/data/ui/disks.ui b/data/ui/disks.ui
index 70c7321..b812260 100644
--- a/data/ui/disks.ui
+++ b/data/ui/disks.ui
@@ -21,7 +21,7 @@
</object>
</child>
<child>
- <object class="GtkAction" id="devtab-action-eject">
+ <object class="GtkAction" id="devtab-drive-action-eject">
<property name="tooltip" translatable="yes">Eject the media</property>
<property name="icon_name">media-eject-symbolic</property>
</object>
@@ -63,11 +63,23 @@
</object>
</child>
<child>
- <object class="GtkAction" id="devtab-action-generic-drive">
+ <object class="GtkAction" id="devtab-drive-action-generic">
<property name="tooltip" translatable="yes">More actions...</property>
<property name="icon_name">system-run-symbolic</property>
</object>
</child>
+ <child>
+ <object class="GtkAction" id="devtab-drive-action-raid-start">
+ <property name="tooltip" translatable="yes">Start RAID Array</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="devtab-drive-action-raid-stop">
+ <property name="tooltip" translatable="yes">Stop RAID Array</property>
+ <property name="icon_name">media-playback-stop-symbolic</property>
+ </object>
+ </child>
</object>
<object class="GtkWindow" id="disks-window">
<property name="can_focus">False</property>
@@ -535,17 +547,16 @@
</child>
<child>
<object class="GtkButtonBox" id="devtab-drive-buttonbox">
+ <style><class name="linked"/></style>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="spacing">12</property>
<child>
<object class="GtkButton" id="devtab-drive-eject-button">
<property name="use_action_appearance">False</property>
- <property name="related_action">devtab-action-eject</property>
+ <property name="related_action">devtab-drive-action-eject</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <property name="related_action">devtab-action-eject</property>
<property name="use_action_appearance">False</property>
<child>
<object class="GtkImage" id="image1">
@@ -565,13 +576,64 @@
</packing>
</child>
<child>
+ <object class="GtkButton" id="devtab-drive-raid-start-button">
+ <property name="use_action_appearance">False</property>
+ <property name="related_action">devtab-drive-action-raid-start</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <child>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Start RAID Array</property>
+ <property name="pixel_size">16</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ <property name="non_homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="devtab-drive-raid-stop-button">
+ <property name="use_action_appearance">False</property>
+ <property name="related_action">devtab-drive-action-raid-stop</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <child>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Stop RAID Array</property>
+ <property name="pixel_size">16</property>
+ <property name="icon_name">media-playback-stop-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ <property name="non_homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkButton" id="devtab-drive-generic-button">
<property name="use_action_appearance">False</property>
- <property name="related_action">devtab-action-generic-drive</property>
+ <property name="related_action">devtab-drive-action-generic</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <property name="related_action">devtab-action-generic-drive</property>
<property name="use_action_appearance">False</property>
<child>
<object class="GtkImage" id="image2">
@@ -586,7 +648,8 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">1</property>
+ <property name="pack_type">end</property>
+ <property name="position">10</property>
<property name="non_homogeneous">True</property>
</packing>
</child>
diff --git a/src/disks/gduwindow.c b/src/disks/gduwindow.c
index 1a9bc90..94107b3 100644
--- a/src/disks/gduwindow.c
+++ b/src/disks/gduwindow.c
@@ -72,6 +72,8 @@ struct _GduWindow
GtkWidget *devtab_drive_box;
GtkWidget *devtab_drive_vbox;
GtkWidget *devtab_drive_buttonbox;
+ GtkWidget *devtab_drive_raid_start_button;
+ GtkWidget *devtab_drive_raid_stop_button;
GtkWidget *devtab_drive_eject_button;
GtkWidget *devtab_drive_generic_button;
GtkWidget *devtab_drive_desc_label;
@@ -87,12 +89,15 @@ struct _GduWindow
GtkWidget *devtab_action_partition_delete;
GtkWidget *devtab_action_mount;
GtkWidget *devtab_action_unmount;
- GtkWidget *devtab_action_eject;
GtkWidget *devtab_action_unlock;
GtkWidget *devtab_action_lock;
GtkWidget *devtab_action_activate_swap;
GtkWidget *devtab_action_deactivate_swap;
- GtkWidget *devtab_action_generic_drive;
+
+ GtkWidget *devtab_drive_action_raid_start;
+ GtkWidget *devtab_drive_action_raid_stop;
+ GtkWidget *devtab_drive_action_eject;
+ GtkWidget *devtab_drive_action_generic;
GtkWidget *generic_drive_menu;
GtkWidget *generic_drive_menu_item_view_smart;
@@ -147,6 +152,8 @@ static const struct {
{G_STRUCT_OFFSET (GduWindow, devtab_drive_box), "devtab-drive-box"},
{G_STRUCT_OFFSET (GduWindow, devtab_drive_vbox), "devtab-drive-vbox"},
{G_STRUCT_OFFSET (GduWindow, devtab_drive_buttonbox), "devtab-drive-buttonbox"},
+ {G_STRUCT_OFFSET (GduWindow, devtab_drive_raid_start_button), "devtab-drive-raid-start-button"},
+ {G_STRUCT_OFFSET (GduWindow, devtab_drive_raid_stop_button), "devtab-drive-raid-stop-button"},
{G_STRUCT_OFFSET (GduWindow, devtab_drive_eject_button), "devtab-drive-eject-button"},
{G_STRUCT_OFFSET (GduWindow, devtab_drive_generic_button), "devtab-drive-generic-button"},
{G_STRUCT_OFFSET (GduWindow, devtab_drive_desc_label), "devtab-drive-desc-label"},
@@ -161,12 +168,15 @@ static const struct {
{G_STRUCT_OFFSET (GduWindow, devtab_action_partition_delete), "devtab-action-partition-delete"},
{G_STRUCT_OFFSET (GduWindow, devtab_action_mount), "devtab-action-mount"},
{G_STRUCT_OFFSET (GduWindow, devtab_action_unmount), "devtab-action-unmount"},
- {G_STRUCT_OFFSET (GduWindow, devtab_action_eject), "devtab-action-eject"},
{G_STRUCT_OFFSET (GduWindow, devtab_action_unlock), "devtab-action-unlock"},
{G_STRUCT_OFFSET (GduWindow, devtab_action_lock), "devtab-action-lock"},
{G_STRUCT_OFFSET (GduWindow, devtab_action_activate_swap), "devtab-action-activate-swap"},
{G_STRUCT_OFFSET (GduWindow, devtab_action_deactivate_swap), "devtab-action-deactivate-swap"},
- {G_STRUCT_OFFSET (GduWindow, devtab_action_generic_drive), "devtab-action-generic-drive"},
+
+ {G_STRUCT_OFFSET (GduWindow, devtab_drive_action_raid_start), "devtab-drive-action-raid-start"},
+ {G_STRUCT_OFFSET (GduWindow, devtab_drive_action_raid_stop), "devtab-drive-action-raid-stop"},
+ {G_STRUCT_OFFSET (GduWindow, devtab_drive_action_eject), "devtab-drive-action-eject"},
+ {G_STRUCT_OFFSET (GduWindow, devtab_drive_action_generic), "devtab-drive-action-generic"},
{G_STRUCT_OFFSET (GduWindow, devtab_loop_autoclear_switch), "devtab-loop-autoclear-switch"},
@@ -228,27 +238,29 @@ typedef enum
SHOW_FLAGS_DETACH_DISK_IMAGE = (1<<0),
/* drive buttonbox */
- SHOW_FLAGS_EJECT_BUTTON = (1<<1),
+ SHOW_FLAGS_RAID_START_BUTTON = (1<<1),
+ SHOW_FLAGS_RAID_STOP_BUTTON = (1<<2),
+ SHOW_FLAGS_EJECT_BUTTON = (1<<3),
/* volume toolbar */
- SHOW_FLAGS_PARTITION_CREATE_BUTTON = (1<<2),
- SHOW_FLAGS_PARTITION_DELETE_BUTTON = (1<<3),
- SHOW_FLAGS_MOUNT_BUTTON = (1<<4),
- SHOW_FLAGS_UNMOUNT_BUTTON = (1<<5),
- SHOW_FLAGS_ACTIVATE_SWAP_BUTTON = (1<<6),
- SHOW_FLAGS_DEACTIVATE_SWAP_BUTTON = (1<<7),
- SHOW_FLAGS_ENCRYPTED_UNLOCK_BUTTON = (1<<8),
- SHOW_FLAGS_ENCRYPTED_LOCK_BUTTON = (1<<9),
+ SHOW_FLAGS_PARTITION_CREATE_BUTTON = (1<<4),
+ SHOW_FLAGS_PARTITION_DELETE_BUTTON = (1<<5),
+ SHOW_FLAGS_MOUNT_BUTTON = (1<<6),
+ SHOW_FLAGS_UNMOUNT_BUTTON = (1<<7),
+ SHOW_FLAGS_ACTIVATE_SWAP_BUTTON = (1<<8),
+ SHOW_FLAGS_DEACTIVATE_SWAP_BUTTON = (1<<9),
+ SHOW_FLAGS_ENCRYPTED_UNLOCK_BUTTON = (1<<10),
+ SHOW_FLAGS_ENCRYPTED_LOCK_BUTTON = (1<<11),
/* generic drive menu */
- SHOW_FLAGS_DISK_POPUP_MENU_FORMAT_DISK = (1<<10),
- SHOW_FLAGS_DISK_POPUP_MENU_CREATE_DISK_IMAGE = (1<<11),
- SHOW_FLAGS_DISK_POPUP_MENU_RESTORE_DISK_IMAGE = (1<<12),
- SHOW_FLAGS_DISK_POPUP_MENU_BENCHMARK = (1<<13),
- SHOW_FLAGS_DISK_POPUP_MENU_VIEW_SMART = (1<<14),
- SHOW_FLAGS_DISK_POPUP_MENU_DISK_SETTINGS = (1<<15),
- SHOW_FLAGS_DISK_POPUP_MENU_STANDBY_NOW = (1<<16),
- SHOW_FLAGS_DISK_POPUP_MENU_RESUME_NOW = (1<<17),
+ SHOW_FLAGS_DISK_POPUP_MENU_FORMAT_DISK = (1<<12),
+ SHOW_FLAGS_DISK_POPUP_MENU_CREATE_DISK_IMAGE = (1<<13),
+ SHOW_FLAGS_DISK_POPUP_MENU_RESTORE_DISK_IMAGE = (1<<14),
+ SHOW_FLAGS_DISK_POPUP_MENU_BENCHMARK = (1<<15),
+ SHOW_FLAGS_DISK_POPUP_MENU_VIEW_SMART = (1<<16),
+ SHOW_FLAGS_DISK_POPUP_MENU_DISK_SETTINGS = (1<<17),
+ SHOW_FLAGS_DISK_POPUP_MENU_STANDBY_NOW = (1<<18),
+ SHOW_FLAGS_DISK_POPUP_MENU_RESUME_NOW = (1<<19),
/* generic volume menu */
SHOW_FLAGS_POPUP_MENU_CONFIGURE_FSTAB = (1<<20),
@@ -275,12 +287,15 @@ static void on_devtab_action_partition_create_activated (GtkAction *action, gpoi
static void on_devtab_action_partition_delete_activated (GtkAction *action, gpointer user_data);
static void on_devtab_action_mount_activated (GtkAction *action, gpointer user_data);
static void on_devtab_action_unmount_activated (GtkAction *action, gpointer user_data);
-static void on_devtab_action_eject_activated (GtkAction *action, gpointer user_data);
static void on_devtab_action_unlock_activated (GtkAction *action, gpointer user_data);
static void on_devtab_action_lock_activated (GtkAction *action, gpointer user_data);
static void on_devtab_action_activate_swap_activated (GtkAction *action, gpointer user_data);
static void on_devtab_action_deactivate_swap_activated (GtkAction *action, gpointer user_data);
-static void on_devtab_action_generic_drive_activated (GtkAction *action, gpointer user_data);
+
+static void on_devtab_drive_action_raid_start_activated (GtkAction *action, gpointer user_data);
+static void on_devtab_drive_action_raid_stop_activated (GtkAction *action, gpointer user_data);
+static void on_devtab_drive_action_eject_activated (GtkAction *action, gpointer user_data);
+static void on_devtab_drive_action_generic_activated (GtkAction *action, gpointer user_data);
static void on_generic_drive_menu_item_view_smart (GtkMenuItem *menu_item,
gpointer user_data);
@@ -406,11 +421,17 @@ update_for_show_flags (GduWindow *window,
gtk_widget_set_visible (GTK_WIDGET (window->device_toolbar_detach_disk_image_button),
show_flags & SHOW_FLAGS_DETACH_DISK_IMAGE);
- gtk_action_set_sensitive (GTK_ACTION (window->devtab_action_eject),
- show_flags & SHOW_FLAGS_EJECT_BUTTON);
- gtk_action_set_visible (GTK_ACTION (window->devtab_action_eject), TRUE);
- gtk_widget_set_visible (window->devtab_drive_eject_button,
- show_flags & SHOW_FLAGS_EJECT_BUTTON);
+ gtk_action_set_sensitive (GTK_ACTION (window->devtab_drive_action_raid_start), show_flags & SHOW_FLAGS_RAID_START_BUTTON);
+ gtk_action_set_visible (GTK_ACTION (window->devtab_drive_action_raid_start), TRUE);
+ gtk_widget_set_visible (window->devtab_drive_raid_start_button, show_flags & SHOW_FLAGS_RAID_START_BUTTON);
+
+ gtk_action_set_sensitive (GTK_ACTION (window->devtab_drive_action_raid_stop), show_flags & SHOW_FLAGS_RAID_STOP_BUTTON);
+ gtk_action_set_visible (GTK_ACTION (window->devtab_drive_action_raid_stop), TRUE);
+ gtk_widget_set_visible (window->devtab_drive_raid_stop_button, show_flags & SHOW_FLAGS_RAID_STOP_BUTTON);
+
+ gtk_action_set_sensitive (GTK_ACTION (window->devtab_drive_action_eject), show_flags & SHOW_FLAGS_EJECT_BUTTON);
+ gtk_action_set_visible (GTK_ACTION (window->devtab_drive_action_eject), TRUE);
+ gtk_widget_set_visible (window->devtab_drive_eject_button, show_flags & SHOW_FLAGS_EJECT_BUTTON);
gtk_action_set_visible (GTK_ACTION (window->devtab_action_partition_create),
show_flags & SHOW_FLAGS_PARTITION_CREATE_BUTTON);
@@ -1165,10 +1186,6 @@ gdu_window_constructed (GObject *object)
"activate",
G_CALLBACK (on_devtab_action_unmount_activated),
window);
- g_signal_connect (window->devtab_action_eject,
- "activate",
- G_CALLBACK (on_devtab_action_eject_activated),
- window);
g_signal_connect (window->devtab_action_unlock,
"activate",
G_CALLBACK (on_devtab_action_unlock_activated),
@@ -1185,9 +1202,23 @@ gdu_window_constructed (GObject *object)
"activate",
G_CALLBACK (on_devtab_action_deactivate_swap_activated),
window);
- g_signal_connect (window->devtab_action_generic_drive,
+ g_signal_connect (window->devtab_drive_action_generic,
"activate",
- G_CALLBACK (on_devtab_action_generic_drive_activated),
+ G_CALLBACK (on_devtab_drive_action_generic_activated),
+ window);
+
+ /* drive actions */
+ g_signal_connect (window->devtab_drive_action_raid_start,
+ "activate",
+ G_CALLBACK (on_devtab_drive_action_raid_start_activated),
+ window);
+ g_signal_connect (window->devtab_drive_action_raid_stop,
+ "activate",
+ G_CALLBACK (on_devtab_drive_action_raid_stop_activated),
+ window);
+ g_signal_connect (window->devtab_drive_action_eject,
+ "activate",
+ G_CALLBACK (on_devtab_drive_action_eject_activated),
window);
/* drive menu */
@@ -1800,11 +1831,13 @@ update_device_page_for_mdraid (GduWindow *window,
if (block != NULL)
{
device_desc = get_device_file_for_display (block);
+ *show_flags |= SHOW_FLAGS_RAID_STOP_BUTTON;
}
else
{
/* Translators: shown as the device for a RAID array that is not currently running */
device_desc = g_strdup (C_("mdraid", "Not Running"));
+ *show_flags |= SHOW_FLAGS_RAID_START_BUTTON;
}
gtk_image_set_from_gicon (GTK_IMAGE (window->devtab_drive_image), icon, GTK_ICON_SIZE_DIALOG);
@@ -3089,7 +3122,7 @@ on_devtab_action_generic_activated (GtkAction *action,
/* ---------------------------------------------------------------------------------------------------- */
static void
-on_devtab_action_generic_drive_activated (GtkAction *action,
+on_devtab_drive_action_generic_activated (GtkAction *action,
gpointer user_data)
{
GduWindow *window = GDU_WINDOW (user_data);
@@ -3188,8 +3221,8 @@ eject_cb (UDisksDrive *drive,
}
static void
-on_devtab_action_eject_activated (GtkAction *action,
- gpointer user_data)
+on_devtab_drive_action_eject_activated (GtkAction *action,
+ gpointer user_data)
{
GduWindow *window = GDU_WINDOW (user_data);
UDisksDrive *drive;
@@ -3205,6 +3238,82 @@ on_devtab_action_eject_activated (GtkAction *action,
/* ---------------------------------------------------------------------------------------------------- */
static void
+mdraid_start_cb (UDisksMDRaid *mdraid,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GduWindow *window = GDU_WINDOW (user_data);
+ GError *error;
+
+ error = NULL;
+ if (!udisks_mdraid_call_start_finish (mdraid,
+ res,
+ &error))
+ {
+ gdu_utils_show_error (GTK_WINDOW (window),
+ _("Error starting RAID Array"),
+ error);
+ g_error_free (error);
+ }
+ g_object_unref (window);
+}
+
+static void
+on_devtab_drive_action_raid_start_activated (GtkAction *action,
+ gpointer user_data)
+{
+ GduWindow *window = GDU_WINDOW (user_data);
+ UDisksMDRaid *mdraid;
+
+ mdraid = udisks_object_peek_mdraid (window->current_object);
+ udisks_mdraid_call_start (mdraid,
+ g_variant_new ("a{sv}", NULL), /* options */
+ NULL, /* cancellable */
+ (GAsyncReadyCallback) mdraid_start_cb,
+ g_object_ref (window));
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+mdraid_stop_cb (UDisksMDRaid *mdraid,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GduWindow *window = GDU_WINDOW (user_data);
+ GError *error;
+
+ error = NULL;
+ if (!udisks_mdraid_call_stop_finish (mdraid,
+ res,
+ &error))
+ {
+ gdu_utils_show_error (GTK_WINDOW (window),
+ _("Error stopping RAID Array"),
+ error);
+ g_error_free (error);
+ }
+ g_object_unref (window);
+}
+
+static void
+on_devtab_drive_action_raid_stop_activated (GtkAction *action,
+ gpointer user_data)
+{
+ GduWindow *window = GDU_WINDOW (user_data);
+ UDisksMDRaid *mdraid;
+
+ mdraid = udisks_object_peek_mdraid (window->current_object);
+ udisks_mdraid_call_stop (mdraid,
+ g_variant_new ("a{sv}", NULL), /* options */
+ NULL, /* cancellable */
+ (GAsyncReadyCallback) mdraid_stop_cb,
+ g_object_ref (window));
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
on_devtab_action_unlock_activated (GtkAction *action,
gpointer user_data)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]