diff options
-rw-r--r-- | data/interfaces/xfpm-settings.ui | 54 | ||||
-rw-r--r-- | settings/xfpm-settings-main.c | 6 | ||||
-rw-r--r-- | settings/xfpm-settings.c | 94 | ||||
-rw-r--r-- | settings/xfpm-settings.h | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/xfpm-config.h | 42 | ||||
-rw-r--r-- | src/xfpm-disks.c | 276 | ||||
-rw-r--r-- | src/xfpm-disks.h | 57 | ||||
-rw-r--r-- | src/xfpm-main.c | 2 | ||||
-rw-r--r-- | src/xfpm-manager.c | 14 | ||||
-rw-r--r-- | src/xfpm-xfconf.c | 48 |
11 files changed, 543 insertions, 54 deletions
diff --git a/data/interfaces/xfpm-settings.ui b/data/interfaces/xfpm-settings.ui index bc1cdedd..b4175f46 100644 --- a/data/interfaces/xfpm-settings.ui +++ b/data/interfaces/xfpm-settings.ui @@ -464,6 +464,19 @@ <property name="position">1</property> </packing> </child> + <child> + <object class="GtkCheckButton" id="spin-down-on-ac"> + <property name="label" translatable="yes">Spin down hard disks</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_ac_spin_changed"/> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> </object> </child> </object> @@ -789,20 +802,6 @@ </packing> </child> <child> - <object class="GtkCheckButton" id="power-save"> - <property name="label" translatable="yes">Prefer power savings over performance</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="power_save_toggled_cb"/> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> <object class="GtkVBox" id="vbox4"> <property name="visible">True</property> <property name="orientation">vertical</property> @@ -833,9 +832,36 @@ </child> </object> <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="power-save"> + <property name="label" translatable="yes">Prefer power savings over performance</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="power_save_toggled_cb"/> + </object> + <packing> + <property name="expand">False</property> <property name="position">2</property> </packing> </child> + <child> + <object class="GtkCheckButton" id="spin-down-on-battery"> + <property name="label" translatable="yes">Spin down hard disks</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_battery_spin_changed"/> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> </object> </child> </object> diff --git a/settings/xfpm-settings-main.c b/settings/xfpm-settings-main.c index 9d751e7c..b228d7fb 100644 --- a/settings/xfpm-settings-main.c +++ b/settings/xfpm-settings-main.c @@ -61,6 +61,8 @@ int main (int argc, char **argv) gboolean has_hibernate_button; gboolean has_power_button; gboolean has_lid; + gboolean can_spin_down; + gboolean devkit_disk; gboolean start_xfpm_if_not_running; GdkNativeWindow socket_id = 0; @@ -159,11 +161,13 @@ int main (int argc, char **argv) has_power_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "power-button")); has_hibernate_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "hibernate-button")); can_shutdown = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-shutdown")); + can_spin_down = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-spin")); + devkit_disk = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "devkit-disk")); xfpm_settings_dialog_new (channel, has_battery, auth_hibernate, auth_suspend, can_shutdown, can_suspend, can_hibernate, has_lcd_brightness, has_lid, has_sleep_button, has_hibernate_button, has_power_button, - socket_id); + devkit_disk, can_spin_down, socket_id); gtk_main(); diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c index 0403c28a..81999953 100644 --- a/settings/xfpm-settings.c +++ b/settings/xfpm-settings.c @@ -148,7 +148,10 @@ void critical_level_value_changed_cb (GtkSpinButton *w, void lock_screen_toggled_cb (GtkWidget *w, XfconfChannel *channel); -void cpu_freq_control_changed_cb (GtkWidget *w, +void on_battery_spin_changed (GtkWidget *w, + XfconfChannel *channel); + +void on_ac_spin_changed (GtkWidget *w, XfconfChannel *channel); void _cursor_changed_cb (GtkTreeView *view, @@ -701,24 +704,33 @@ lock_screen_toggled_cb (GtkWidget *w, XfconfChannel *channel) } } -void -cpu_freq_control_changed_cb (GtkWidget *w, XfconfChannel *channel) +void on_battery_spin_changed (GtkWidget *w, XfconfChannel *channel) { -#ifdef SYSTEM_IS_LINUX - gboolean val = (gint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w)); + gboolean val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w)); - if ( !xfconf_channel_set_bool (channel, PROPERTIES_PREFIX CPU_FREQ_CONTROL, val) ) + if ( !xfconf_channel_set_bool (channel, SPIN_DOWN_ON_BATTERY, val) ) { - g_critical ("Unable to set value for property %s\n", CPU_FREQ_CONTROL); + g_critical ("Unable to set value for property %s\n", SPIN_DOWN_ON_BATTERY); } -#endif + } +void on_ac_spin_changed (GtkWidget *w, XfconfChannel *channel) +{ + gboolean val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w)); + + if ( !xfconf_channel_set_bool (channel, SPIN_DOWN_ON_AC, val) ) + { + g_critical ("Unable to set value for property %s\n", SPIN_DOWN_ON_AC); + } +} static void -xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_hibernate, gboolean auth_suspend, - gboolean can_shutdown, gboolean can_suspend, - gboolean can_hibernate, gboolean has_lcd_brightness, gboolean has_lid) +xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_hibernate, + gboolean auth_suspend, gboolean can_shutdown, + gboolean can_suspend, gboolean can_hibernate, + gboolean has_lcd_brightness, gboolean has_lid, + gboolean devkit_disk, gboolean can_spin_down) { gboolean valid; gint list_value; @@ -733,6 +745,7 @@ xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_hibernate, gbool GtkWidget *label; GtkWidget *brg; GtkWidget *frame; + GtkWidget *spin_down; #ifdef HAVE_DPMS GtkWidget *dpms_frame_on_battery; #endif @@ -891,17 +904,31 @@ xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_hibernate, gbool gtk_notebook_remove_page (GTK_NOTEBOOK (nt), 1); } #endif + + spin_down = GTK_WIDGET (gtk_builder_get_object (xml, "spin-down-on-battery")); + gtk_widget_set_sensitive (spin_down, can_spin_down); + + if ( !devkit_disk ) + { + gtk_widget_hide (spin_down); + } + else if ( !can_spin_down ) + { + gtk_widget_set_tooltip_text (spin_down, _("Spinning down hard disks permission denied")); + } } static void -xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_suspend, gboolean auth_hibernate, - gboolean can_suspend, gboolean can_hibernate, - gboolean has_lcd_brightness, gboolean has_lid) +xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_suspend, + gboolean auth_hibernate, gboolean can_suspend, + gboolean can_hibernate, gboolean has_lcd_brightness, + gboolean has_lid, gboolean devkit_disk, gboolean can_spin_down) { GtkWidget *inact; GtkWidget *lid; GtkWidget *frame; GtkWidget *brg; + GtkWidget *spin_down; GtkListStore *list_store; GtkTreeIter iter; guint val; @@ -1013,6 +1040,19 @@ xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_suspend, gboolean aut gtk_notebook_remove_page (GTK_NOTEBOOK (GTK_WIDGET (gtk_builder_get_object (xml, "on-ac-notebook"))), 1); } #endif + + spin_down = GTK_WIDGET (gtk_builder_get_object (xml, "spin-down-on-ac")); + gtk_widget_set_sensitive (spin_down, can_spin_down); + + if ( !devkit_disk ) + { + gtk_widget_hide (spin_down); + } + else if ( !can_spin_down ) + { + gtk_widget_set_tooltip_text (spin_down, _("Spinning down hard disks permission denied")); + } + } static void @@ -1535,6 +1575,7 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean system_laptop, gboolean can_hibernate, gboolean has_lcd_brightness, gboolean has_lid, gboolean has_sleep_button, gboolean has_hibernate_button, gboolean has_power_button, + gboolean devkit_disk, gboolean can_spin_down, GdkNativeWindow id) { GtkWidget *plug; @@ -1543,13 +1584,13 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean system_laptop, GError *error = NULL; g_debug ("system_laptop=%s auth_hibernate=%s auth_suspend=%s can_shutdown=%s can_suspend=%s can_hibernate=%s has_lcd_brightness=%s has_lid=%s "\ - "has_sleep_button=%s has_hibernate_button=%s has_power_button=%s", + "has_sleep_button=%s has_hibernate_button=%s has_power_button=%s can_spin_down=%s", xfpm_bool_to_string (system_laptop), xfpm_bool_to_string (auth_hibernate), xfpm_bool_to_string (can_shutdown), xfpm_bool_to_string (auth_suspend), xfpm_bool_to_string (can_suspend), xfpm_bool_to_string (can_hibernate), xfpm_bool_to_string (has_lcd_brightness), xfpm_bool_to_string (has_lid), xfpm_bool_to_string (has_sleep_button), xfpm_bool_to_string (has_hibernate_button), - xfpm_bool_to_string (has_power_button) ); + xfpm_bool_to_string (has_power_button), xfpm_bool_to_string (can_spin_down) ); xml = xfpm_builder_new_from_string (xfpm_settings_ui, &error); @@ -1571,10 +1612,27 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean system_laptop, dialog = GTK_WIDGET (gtk_builder_get_object (xml, "xfpm-settings-dialog")); nt = GTK_WIDGET (gtk_builder_get_object (xml, "main-notebook")); - xfpm_settings_on_ac (channel, auth_hibernate, auth_suspend, can_suspend, can_hibernate, has_lcd_brightness, has_lid ); + xfpm_settings_on_ac (channel, + auth_hibernate, + auth_suspend, + can_suspend, + can_hibernate, + has_lcd_brightness, + has_lid, + devkit_disk, + can_spin_down); if ( system_laptop ) - xfpm_settings_on_battery (channel, auth_hibernate, auth_suspend, can_shutdown, can_suspend, can_hibernate, has_lcd_brightness, has_lid); + xfpm_settings_on_battery (channel, + auth_hibernate, + auth_suspend, + can_shutdown, + can_suspend, + can_hibernate, + has_lcd_brightness, + has_lid, + devkit_disk, + can_spin_down); xfpm_settings_tree_view (channel, system_laptop); diff --git a/settings/xfpm-settings.h b/settings/xfpm-settings.h index 2b86d52c..0d398520 100644 --- a/settings/xfpm-settings.h +++ b/settings/xfpm-settings.h @@ -34,6 +34,8 @@ void xfpm_settings_dialog_new (XfconfChannel *channel, gboolean has_sleep_button, gboolean has_hibernate_button, gboolean has_power_button, + gboolean devkit_disk, + gboolean can_spin_down, GdkNativeWindow id); diff --git a/src/Makefile.am b/src/Makefile.am index dbf19cd6..d999efd3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,6 +15,8 @@ xfce4_power_manager_SOURCES = \ xfpm-battery-info.h \ xfpm-xfconf.c \ xfpm-xfconf.h \ + xfpm-disks.c \ + xfpm-disks.h \ xfpm-console-kit.c \ xfpm-console-kit.h \ xfpm-idle.c \ diff --git a/src/xfpm-config.h b/src/xfpm-config.h index 226402c5..39b5a75d 100644 --- a/src/xfpm-config.h +++ b/src/xfpm-config.h @@ -28,10 +28,6 @@ #include <glib.h> -#if defined(__linux__) -#define SYSTEM_IS_LINUX 1 -#endif - G_BEGIN_DECLS #define XFPM_CHANNEL_CFG "xfce4-power-manager" @@ -39,43 +35,49 @@ G_BEGIN_DECLS /* * Backward compatibility with old version. */ -#define PROPERTIES_PREFIX "/xfce4-power-manager/" +#define PROPERTIES_PREFIX "/xfce4-power-manager/" #define POWER_SAVE_ON_BATTERY "power-save-on-battery" -#define CPU_FREQ_CONTROL "enable-cpu-freq-control" -#define LOCK_SCREEN_ON_SLEEP "lock-screen-suspend-hibernate" +#define CPU_FREQ_CONTROL "enable-cpu-freq-control" +#define LOCK_SCREEN_ON_SLEEP "lock-screen-suspend-hibernate" #define DPMS_ENABLED_CFG "dpms-enabled" -#define ON_AC_DPMS_SLEEP "dpms-on-ac-sleep" +#define ON_AC_DPMS_SLEEP "dpms-on-ac-sleep" #define ON_AC_DPMS_OFF "dpms-on-ac-off" -#define ON_BATT_DPMS_SLEEP "dpms-on-battery-sleep" -#define ON_BATT_DPMS_OFF "dpms-on-battery-off" -#define DPMS_SLEEP_MODE "dpms-sleep-mode" +#define ON_BATT_DPMS_SLEEP "dpms-on-battery-sleep" +#define ON_BATT_DPMS_OFF "dpms-on-battery-off" +#define DPMS_SLEEP_MODE "dpms-sleep-mode" #define GENERAL_NOTIFICATION_CFG "general-notification" -#define ON_AC_INACTIVITY_TIMEOUT "inactivity-on-ac" -#define ON_BATTERY_INACTIVITY_TIMEOUT "inactivity-on-battery" -#define INACTIVITY_SLEEP_MODE "inactivity-sleep-mode" +#define ON_AC_INACTIVITY_TIMEOUT "inactivity-on-ac" +#define ON_BATTERY_INACTIVITY_TIMEOUT "inactivity-on-battery" +#define INACTIVITY_SLEEP_MODE "inactivity-sleep-mode" -#define BRIGHTNESS_ON_AC "brightness-on-ac" -#define BRIGHTNESS_ON_BATTERY "brightness-on-battery" +#define BRIGHTNESS_ON_AC "brightness-on-ac" +#define BRIGHTNESS_ON_BATTERY "brightness-on-battery" -#define CRITICAL_POWER_LEVEL "critical-power-level" -#define SHOW_BRIGHTNESS_POPUP "show-brightness-popup" -#define ENABLE_BRIGHTNESS_CONTROL "change-brightness-on-key-events" +#define CRITICAL_POWER_LEVEL "critical-power-level" +#define SHOW_BRIGHTNESS_POPUP "show-brightness-popup" +#define ENABLE_BRIGHTNESS_CONTROL "change-brightness-on-key-events" #define SHOW_TRAY_ICON_CFG "show-tray-icon" #define CRITICAL_BATT_ACTION_CFG "critical-power-action" #define POWER_SWITCH_CFG "power-button-action" -#define HIBERNATE_SWITCH_CFG "hibernate-button-action" +#define HIBERNATE_SWITCH_CFG "hibernate-button-action" #define SLEEP_SWITCH_CFG "sleep-button-action" #define LID_SWITCH_ON_AC_CFG "lid-action-on-ac" #define LID_SWITCH_ON_BATTERY_CFG "lid-action-on-battery" +#define SPIN_DOWN_ON_AC "spin-down-on-ac" +#define SPIN_DOWN_ON_BATTERY "spin-down-on-battery" + +#define SPIN_DOWN_ON_AC_TIMEOUT "spin-down-on-ac-timeout" +#define SPIN_DOWN_ON_BATTERY_TIMEOUT "spin-down-on-battery-timeout" + G_END_DECLS #endif /* __XFPM_CONFIG_H */ diff --git a/src/xfpm-disks.c b/src/xfpm-disks.c new file mode 100644 index 00000000..3f38012e --- /dev/null +++ b/src/xfpm-disks.c @@ -0,0 +1,276 @@ +/* + * * Copyright (C) 2009 Ali <aliov@xfce.org> + * + * Licensed under the GNU General Public License Version 2 + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <dbus/dbus-glib.h> + +#include "xfpm-disks.h" +#include "xfpm-polkit.h" +#include "xfpm-xfconf.h" +#include "xfpm-dkp.h" +#include "xfpm-config.h" + +static void xfpm_disks_finalize (GObject *object); + +#define XFPM_DISKS_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_DISKS, XfpmDisksPrivate)) + +struct XfpmDisksPrivate +{ + XfpmXfconf *conf; + XfpmDkp *dkp; + XfpmPolkit *polkit; + + DBusGConnection *bus; + DBusGProxy *proxy; + gchar *cookie; + gboolean set; + gboolean can_spin; +}; + +G_DEFINE_TYPE (XfpmDisks, xfpm_disks, G_TYPE_OBJECT) + +static void +xfpm_disks_class_init (XfpmDisksClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = xfpm_disks_finalize; + + g_type_class_add_private (klass, sizeof (XfpmDisksPrivate)); +} + +static void +xfpm_disks_disable_spin_down_timeouts (XfpmDisks *disks) +{ + GError *error = NULL; + + disks->priv->set = FALSE; + + g_debug ("Clearing spin down timeout"); + + dbus_g_proxy_call (disks->priv->proxy, "DriveUnsetAllSpindownTimeouts", &error, + G_TYPE_STRING, disks->priv->cookie, + G_TYPE_INVALID, + G_TYPE_INVALID); + + if ( error ) + { + g_warning ("Failed to unset spindown timeouts : %s", error->message); + g_error_free (error); + disks->priv->set = TRUE; + } + + g_free (disks->priv->cookie); + disks->priv->cookie = NULL; +} + +static void +xfpm_disks_enable_spin_down_timeouts (XfpmDisks *disks, gint timeout) +{ + GError *error = NULL; + const gchar **options = { NULL }; + + disks->priv->set = TRUE; + + g_debug ("Setting spin down timeout %d", timeout); + + dbus_g_proxy_call (disks->priv->proxy, "DriveSetAllSpindownTimeouts", &error, + G_TYPE_INT, timeout, + G_TYPE_STRING, options, + G_TYPE_STRING, disks->priv->cookie, + G_TYPE_INVALID); + + if ( error ) + { + g_warning ("Failed to unset spindown timeouts : %s", error->message); + g_error_free (error); + disks->priv->set = FALSE; + } +} + +static void +xfpm_disks_set_spin_timeouts (XfpmDisks *disks) +{ + gboolean enabled; + gboolean on_battery; + gint timeout = 0; + + if (!disks->priv->can_spin ) + return; + + g_object_get (G_OBJECT (disks), + "on-battery", &on_battery, + NULL); + + if ( !on_battery ) + { + g_object_get (G_OBJECT (disks->priv->conf), + SPIN_DOWN_ON_AC, &enabled, + SPIN_DOWN_ON_AC_TIMEOUT, &timeout, + NULL); + } + else + { + g_object_get (G_OBJECT (disks->priv->conf), + SPIN_DOWN_ON_BATTERY, &enabled, + SPIN_DOWN_ON_BATTERY_TIMEOUT, &timeout, + NULL); + } + + g_debug ("On Battery=%d spin_down_enabled=%d timeout=%d\n", on_battery, enabled, timeout); + + if ( !enabled && disks->priv->set && disks->priv->cookie) + { + xfpm_disks_disable_spin_down_timeouts (disks); + } + else if ( timeout != 0 && timeout > 120 && !disks->priv->set) + { + xfpm_disks_enable_spin_down_timeouts (disks, timeout); + } +} + +static void +xfpm_disks_get_is_auth_to_spin (XfpmDisks *disks) +{ + disks->priv->can_spin = xfpm_polkit_check_auth (disks->priv->polkit, + "org.freedesktop.devicekit.disks.drive-set-spindown"); + + g_debug ("Is auth to spin down disks : %d", disks->priv->can_spin); +} + +static void +xfpm_disks_init (XfpmDisks *disks) +{ + GError *error = NULL; + + disks->priv = XFPM_DISKS_GET_PRIVATE (disks); + + disks->priv->can_spin = FALSE; + disks->priv->bus = NULL; + disks->priv->proxy = NULL; + disks->priv->conf = NULL; + disks->priv->dkp = NULL; + disks->priv->cookie = NULL; + disks->priv->polkit = NULL; + + disks->priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + + if ( error ) + { + g_critical ("Unable to get system bus connection : %s", error->message); + g_error_free (error); + goto out; + } + + disks->priv->proxy = dbus_g_proxy_new_for_name (disks->priv->bus, + "org.freedesktop.DeviceKit.Disks", + "/org/freedesktop/DeviceKit/Disks", + "org.freedesktop.DeviceKit.Disks"); + + if ( !disks->priv->proxy ) + { + g_warning ("Unable to create proxy for 'org.freedesktop.DeviceKit.Disks'"); + goto out; + } + + disks->priv->conf = xfpm_xfconf_new (); + disks->priv->dkp = xfpm_dkp_get (); + disks->priv->polkit = xfpm_polkit_get (); + + xfpm_disks_get_is_auth_to_spin (disks); + + g_signal_connect_swapped (disks->priv->polkit, "auth-changed", + G_CALLBACK (xfpm_disks_get_is_auth_to_spin), disks); + + g_signal_connect_swapped (disks->priv->dkp, "on-battery-changed", + G_CALLBACK (xfpm_disks_set_spin_timeouts), disks); + + g_signal_connect_swapped (disks->priv->conf, "notify::" SPIN_DOWN_ON_AC, + G_CALLBACK (xfpm_disks_set_spin_timeouts), disks); + + g_signal_connect_swapped (disks->priv->conf, "notify::" SPIN_DOWN_ON_AC_TIMEOUT, + G_CALLBACK (xfpm_disks_set_spin_timeouts), disks); + + g_signal_connect_swapped (disks->priv->conf, "notify::" SPIN_DOWN_ON_BATTERY, + G_CALLBACK (xfpm_disks_set_spin_timeouts), disks); + + g_signal_connect_swapped (disks->priv->conf, "notify::" SPIN_DOWN_ON_BATTERY_TIMEOUT, + G_CALLBACK (xfpm_disks_set_spin_timeouts), disks); + + xfpm_disks_set_spin_timeouts (disks); + +out: + ; + +} + +static void +xfpm_disks_finalize (GObject *object) +{ + XfpmDisks *disks; + + disks = XFPM_DISKS (object); + + if (disks->priv->can_spin && disks->priv->set ) + xfpm_disks_disable_spin_down_timeouts (disks); + + if ( disks->priv->bus ) + dbus_g_connection_unref (disks->priv->bus); + + if ( disks->priv->proxy ) + g_object_unref (disks->priv->proxy); + + if ( disks->priv->polkit ) + g_object_unref (disks->priv->polkit); + + if ( disks->priv->conf ) + g_object_unref (disks->priv->conf); + + if ( disks->priv->dkp ) + g_object_unref (disks->priv->dkp ); + + G_OBJECT_CLASS (xfpm_disks_parent_class)->finalize (object); +} + +XfpmDisks * +xfpm_disks_new (void) +{ + XfpmDisks *disks = NULL; + disks = g_object_new (XFPM_TYPE_DISKS, NULL); + return disks; +} + +gboolean xfpm_disks_get_can_spin (XfpmDisks *disks) +{ + return disks->priv->can_spin; +} + +gboolean xfpm_disks_kit_is_running (XfpmDisks *disks) +{ + return disks->priv->proxy != NULL ? TRUE : FALSE; +} diff --git a/src/xfpm-disks.h b/src/xfpm-disks.h new file mode 100644 index 00000000..61a8080e --- /dev/null +++ b/src/xfpm-disks.h @@ -0,0 +1,57 @@ +/* + * * Copyright (C) 2009 Ali <aliov@xfce.org> + * + * Licensed under the GNU General Public License Version 2 + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFPM_DISKS_H +#define __XFPM_DISKS_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define XFPM_TYPE_DISKS (xfpm_disks_get_type () ) +#define XFPM_DISKS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), XFPM_TYPE_DISKS, XfpmDisks)) +#define XFPM_IS_DISKS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFPM_TYPE_DISKS)) + +typedef struct XfpmDisksPrivate XfpmDisksPrivate; + +typedef struct +{ + GObject parent; + XfpmDisksPrivate *priv; + +} XfpmDisks; + +typedef struct +{ + GObjectClass parent_class; + +} XfpmDisksClass; + +GType xfpm_disks_get_type (void) G_GNUC_CONST; + +XfpmDisks *xfpm_disks_new (void); + +gboolean xfpm_disks_get_can_spin (XfpmDisks *disks); + +gboolean xfpm_disks_kit_is_running (XfpmDisks *disks); + +G_END_DECLS + +#endif /* __XFPM_DISKS_H */ diff --git a/src/xfpm-main.c b/src/xfpm-main.c index 80c2f429..c45a1d82 100644 --- a/src/xfpm-main.c +++ b/src/xfpm-main.c @@ -137,6 +137,8 @@ int main (int argc, char **argv) xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8"); + g_set_application_name (PACKAGE_NAME); + if (!gtk_init_with_args (&argc, &argv, (gchar *)"", option_entries, (gchar *)PACKAGE, &error)) { if (G_LIKELY (error)) diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c index 596fe6f2..89b75172 100644 --- a/src/xfpm-manager.c +++ b/src/xfpm-manager.c @@ -40,6 +40,7 @@ #include "xfpm-dkp.h" #include "xfpm-dbus.h" +#include "xfpm-disks.h" #include "xfpm-dpms.h" #include "xfpm-manager.h" #include "xfpm-console-kit.h" @@ -79,6 +80,7 @@ struct XfpmManagerPrivate XfpmBacklight *backlight; XfpmConsoleKit *console; XfpmDBusMonitor *monitor; + XfpmDisks *disks; #ifdef HAVE_DPMS XfpmDpms *dpms; @@ -127,6 +129,8 @@ xfpm_manager_finalize (GObject *object) g_object_unref (manager->priv->client); g_object_unref (manager->priv->console); g_object_unref (manager->priv->monitor); + g_object_unref (manager->priv->disks); + g_timer_destroy (manager->priv->timer); #ifdef HAVE_DPMS @@ -358,7 +362,7 @@ xfpm_manager_new (DBusGConnection *bus, const gchar *client_id) client_id, current_dir, restart_command, - NULL); + PACKAGE_NAME ".desktop"); g_free (current_dir); @@ -395,6 +399,7 @@ void xfpm_manager_start (XfpmManager *manager) manager->priv->conf = xfpm_xfconf_new (); manager->priv->console = xfpm_console_kit_new (); manager->priv->monitor = xfpm_dbus_monitor_new (); + manager->priv->disks = xfpm_disks_new (); g_signal_connect (manager->priv->monitor, "system-bus-connection-changed", G_CALLBACK (xfpm_manager_system_bus_connection_changed_cb), manager); @@ -511,6 +516,8 @@ static gboolean xfpm_manager_dbus_get_config (XfpmManager *manager, gboolean has_lcd_brightness = TRUE; gboolean can_shutdown = TRUE; gboolean has_lid = FALSE; + gboolean can_spin = FALSE; + gboolean devkit_disk = FALSE; *OUT_config = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); @@ -525,6 +532,9 @@ static gboolean xfpm_manager_dbus_get_config (XfpmManager *manager, "can-hibernate", &can_hibernate, "has-lid", &has_lid, NULL); + + can_spin = xfpm_disks_get_can_spin (manager->priv->disks); + devkit_disk = xfpm_disks_kit_is_running (manager->priv->disks); has_battery = xfpm_dkp_has_battery (manager->priv->dkp); has_lcd_brightness = xfpm_backlight_has_hw (manager->priv->backlight); @@ -549,6 +559,8 @@ static gboolean xfpm_manager_dbus_get_config (XfpmManager *manager, g_hash_table_insert (*OUT_config, g_strdup ("has-battery"), g_strdup (xfpm_bool_to_string (has_battery))); g_hash_table_insert (*OUT_config, g_strdup ("has-lid"), g_strdup (xfpm_bool_to_string (has_lid))); + g_hash_table_insert (*OUT_config, g_strdup ("can-spin"), g_strdup (xfpm_bool_to_string (can_spin))); + g_hash_table_insert (*OUT_config, g_strdup ("devkit-disk"), g_strdup (xfpm_bool_to_string (devkit_disk))); g_hash_table_insert (*OUT_config, g_strdup ("has-brightness"), g_strdup (xfpm_bool_to_string (has_lcd_brightness))); diff --git a/src/xfpm-xfconf.c b/src/xfpm-xfconf.c index 359d0c60..fd562f04 100644 --- a/src/xfpm-xfconf.c +++ b/src/xfpm-xfconf.c @@ -78,6 +78,10 @@ enum PROP_IDLE_SLEEP_MODE, PROP_DIM_ON_AC_TIMEOUT, PROP_DIM_ON_BATTERY_TIMEOUT, + PROP_SPIN_DOWN_DISK_ON_AC, + PROP_SPIN_DOWN_DISK_ON_BATTERY, + PROP_SPIN_DOWN_DISK_ON_AC_TIMEOUT, + PROP_SPIN_DOWN_DISK_ON_BATTERY_TIMEOUT, N_PROPERTIES }; @@ -461,6 +465,50 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) 120, G_PARAM_READWRITE)); + /** + * XfpmXfconf::spin-down-on-ac + **/ + g_object_class_install_property (object_class, + PROP_SPIN_DOWN_DISK_ON_AC, + g_param_spec_boolean (SPIN_DOWN_ON_AC, + NULL, NULL, + FALSE, + G_PARAM_READWRITE)); + + /** + * XfpmXfconf::spin-down-on-battery + **/ + g_object_class_install_property (object_class, + PROP_SPIN_DOWN_DISK_ON_BATTERY, + g_param_spec_boolean (SPIN_DOWN_ON_BATTERY, + NULL, NULL, + FALSE, + G_PARAM_READWRITE)); + + /** + * XfpmXfconf::spin-down-on-ac-timeout + **/ + g_object_class_install_property (object_class, + PROP_SPIN_DOWN_DISK_ON_AC_TIMEOUT, + g_param_spec_uint (SPIN_DOWN_ON_AC_TIMEOUT, + NULL, NULL, + 800, + G_MAXUINT, + 800, + G_PARAM_READWRITE)); + + /** + * XfpmXfconf::spin-down-on-battery-timeout + **/ + g_object_class_install_property (object_class, + PROP_SPIN_DOWN_DISK_ON_BATTERY_TIMEOUT, + g_param_spec_uint (SPIN_DOWN_ON_BATTERY_TIMEOUT, + NULL, NULL, + 120, + G_MAXUINT, + 120, + G_PARAM_READWRITE)); + g_type_class_add_private (klass, sizeof (XfpmXfconfPrivate)); } |