diff --git a/ChangeLog b/ChangeLog index 6a19a4052ead42322ae266a2c0204f8e94c8c926..5f2144b09e7216d5955ff8b34207337391d7e657 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ +2009-04-14 19:19 Ali aliov@xfce.org + * : Add option to inhibit backlight sleep in the context menu+updates on the battery code + 2009-04-14 9:49 Ali aliov@xfce.org * : Commit all changes for beta2 diff --git a/configure.ac.in b/configure.ac.in index 46cb8b1397dff6ae897a8edf935f1d70c078c04d..0e68fc9ab0e78d814a32896b186dae4a0cdc764d 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -3,7 +3,7 @@ m4_define([xfpm_version_major], [0]) m4_define([xfpm_version_minor], [8]) m4_define([xfpm_version_micro], [0]) m4_define([xfpm_version_build], []) -m4_define([xfpm_version_tag],[beta2]) +m4_define([xfpm_version_tag],[r@REVISION@]) m4_define([xfpm_version], [xfpm_version_major().xfpm_version_minor().xfpm_version_micro()ifelse(xfpm_version_tag(), [svn], [xfpm_version_tag().xfpm_version_build()], [xfpm_version_tag()])]) AC_INIT([xfce4-power-manager], [xfpm_version], [http://bugzilla.xfce.org/]) diff --git a/panel-plugins/inhibit/inhibit-plugin.c b/panel-plugins/inhibit/inhibit-plugin.c index afc8ebb9383d3029c60c9b16bf2aa425f4ae0363..3009d5a3ef608e91a8a9742f5d27ffbd16b09d92 100644 --- a/panel-plugins/inhibit/inhibit-plugin.c +++ b/panel-plugins/inhibit/inhibit-plugin.c @@ -555,14 +555,14 @@ inhibit_plugin_set_inhibit_screen_saver (inhibit_t *inhibit) if ( inhibit_plugin_inhibit_screen_saver (inhibit, "org.freedesktop.ScreenSaver", - "/org/freedesktop/ScreenSaver/Inhibit", + "/org/freedesktop/ScreenSaver", "org.freedesktop.ScreenSaver") ) { inhibit->saver_inhibited = TRUE; } else if ( inhibit_plugin_inhibit_screen_saver (inhibit, "org.gnome.ScreenSaver", - "/org/gnome/ScreenSaver/Inhibit", + "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver") ) { diff --git a/src/xfpm-battery.c b/src/xfpm-battery.c index ff36d10651c91bba778f8c522a41d409c165c887..cd5f2b1eae32963042e1d256a1566f3e16f469f1 100644 --- a/src/xfpm-battery.c +++ b/src/xfpm-battery.c @@ -155,15 +155,14 @@ xfpm_battery_refresh_visible_icon (XfpmBattery *battery) static void xfpm_battery_refresh_icon (XfpmBattery *battery, - gboolean is_present, - guint percentage - ) + XfpmBatteryState state, + guint percentage) { gchar *icon; XFPM_DEBUG_ENUM ("battery state", battery->priv->state, XFPM_TYPE_BATTERY_STATE) - if ( !is_present ) + if ( state == BATTERY_NOT_PRESENT ) { xfpm_tray_icon_set_icon (battery->priv->icon, battery->priv->type == HAL_DEVICE_TYPE_UPS ? "gpm-ups-missing" : "gpm-primary-missing"); @@ -171,7 +170,7 @@ xfpm_battery_refresh_icon (XfpmBattery *battery, } /* Battery full */ - if ( battery->priv->state == BATTERY_FULLY_CHARGED ) + if ( state == BATTERY_FULLY_CHARGED ) { if ( battery->priv->type == HAL_DEVICE_TYPE_PRIMARY) xfpm_tray_icon_set_icon (battery->priv->icon, battery->priv->adapter_present ? "gpm-primary-charged" : "gpm-primary-100"); @@ -184,7 +183,7 @@ xfpm_battery_refresh_icon (XfpmBattery *battery, g_free(icon); } } - else if ( battery->priv->state == BATTERY_NOT_FULLY_CHARGED ) + else if ( state == BATTERY_NOT_FULLY_CHARGED ) { if ( battery->priv->adapter_present ) { @@ -203,7 +202,7 @@ xfpm_battery_refresh_icon (XfpmBattery *battery, g_free(icon); } - else if ( battery->priv->state == BATTERY_IS_CHARGING ) + else if ( state == BATTERY_IS_CHARGING ) { icon = g_strdup_printf("%s%s-%s", battery->priv->icon_prefix, @@ -213,8 +212,8 @@ xfpm_battery_refresh_icon (XfpmBattery *battery, xfpm_tray_icon_set_icon (battery->priv->icon, icon); g_free(icon); } - else if ( battery->priv->state == BATTERY_IS_DISCHARGING || battery->priv->state == BATTERY_CHARGE_CRITICAL || - battery->priv->state == BATTERY_CHARGE_LOW ) + else if ( state == BATTERY_IS_DISCHARGING || state == BATTERY_CHARGE_CRITICAL || + state == BATTERY_CHARGE_LOW ) { icon = g_strdup_printf("%s%s", battery->priv->icon_prefix, @@ -227,23 +226,20 @@ xfpm_battery_refresh_icon (XfpmBattery *battery, } static void -xfpm_battery_refresh_state (XfpmBattery *battery, XfpmBatteryState state) +xfpm_battery_notify (XfpmBattery *battery) { const gchar *message; gboolean notify; notify = xfpm_xfconf_get_property_bool (battery->priv->conf, GENERAL_NOTIFICATION_CFG); - if ( battery->priv->state != state) + if ( notify ) { - battery->priv->state = state; - if ( notify ) - { - message = xfpm_battery_get_message_from_battery_state (state, battery->priv->adapter_present ); - if ( !message ) - goto signal; + message = xfpm_battery_get_message_from_battery_state (battery->priv->state, battery->priv->adapter_present); + if ( !message ) + return; - xfpm_notify_show_notification (battery->priv->notify, + xfpm_notify_show_notification (battery->priv->notify, _("Xfce power manager"), message, xfpm_tray_icon_get_icon_name (battery->priv->icon), @@ -251,10 +247,6 @@ xfpm_battery_refresh_state (XfpmBattery *battery, XfpmBatteryState state) battery->priv->type == HAL_DEVICE_TYPE_PRIMARY ? FALSE : TRUE, XFPM_NOTIFY_NORMAL, xfpm_tray_icon_get_tray_icon(battery->priv->icon)); - } -signal: - g_signal_emit (G_OBJECT(battery), signals[BATTERY_STATE_CHANGED], 0, state); - TRACE("Emitting signal battery state changed"); } } @@ -324,10 +316,24 @@ xfpm_battery_get_battery_state (XfpmBatteryState *state, } static void -xfpm_battery_refresh_tooltip_misc (XfpmBattery *battery, gboolean is_present, - gboolean is_charging, gboolean is_discharging, - guint32 last_full, guint32 current_charge, - guint percentage, guint time) +xfpm_battery_refresh_common (XfpmBattery *battery, guint percentage, XfpmBatteryState state) +{ + xfpm_battery_refresh_icon (battery, state, percentage); + + if ( battery->priv->state != state) + { + battery->priv->state = state; + TRACE("Emitting signal battery state changed"); + g_signal_emit (G_OBJECT(battery), signals[BATTERY_STATE_CHANGED], 0, state); + xfpm_battery_notify (battery); + } +} + +static void +xfpm_battery_refresh_misc (XfpmBattery *battery, gboolean is_present, + gboolean is_charging, gboolean is_discharging, + guint32 last_full, guint32 current_charge, + guint percentage, guint time) { gchar *tip; guint critical_level = xfpm_xfconf_get_property_int (battery->priv->conf, CRITICAL_POWER_LEVEL ); @@ -337,6 +343,7 @@ xfpm_battery_refresh_tooltip_misc (XfpmBattery *battery, gboolean is_present, tip = g_strdup_printf ("%s %s", _get_battery_name(battery->priv->type), _("is not present")); xfpm_tray_icon_set_tooltip (battery->priv->icon, tip); g_free(tip); + battery->priv->state = BATTERY_NOT_PRESENT; return; } @@ -348,14 +355,15 @@ xfpm_battery_refresh_tooltip_misc (XfpmBattery *battery, gboolean is_present, //FIXME: Time for misc batteries xfpm_tray_icon_set_tooltip (battery->priv->icon, tip); g_free (tip); - xfpm_battery_refresh_state (battery, state); + + xfpm_battery_refresh_common (battery, percentage, state); } static void -xfpm_battery_refresh_tooltip_primary (XfpmBattery *battery, gboolean is_present, - gboolean is_charging, gboolean is_discharging, - guint32 last_full, guint32 current_charge, - guint percentage, guint time) +xfpm_battery_refresh_primary (XfpmBattery *battery, gboolean is_present, + gboolean is_charging, gboolean is_discharging, + guint32 last_full, guint32 current_charge, + guint percentage, guint time) { gchar *tip; const gchar *str; @@ -366,6 +374,7 @@ xfpm_battery_refresh_tooltip_primary (XfpmBattery *battery, gboolean is_present, if ( !is_present ) { xfpm_tray_icon_set_tooltip(battery->priv->icon, _("Battery not present")); + battery->priv->state = BATTERY_NOT_PRESENT; return; } @@ -420,7 +429,8 @@ xfpm_battery_refresh_tooltip_primary (XfpmBattery *battery, gboolean is_present, xfpm_tray_icon_set_tooltip(battery->priv->icon, tip); g_free(tip); - xfpm_battery_refresh_state (battery, state); + + xfpm_battery_refresh_common (battery, percentage, state); } static void @@ -442,16 +452,15 @@ xfpm_battery_refresh (XfpmBattery *battery) NULL); battery->priv->type == HAL_DEVICE_TYPE_PRIMARY ? - xfpm_battery_refresh_tooltip_primary (battery, is_present, - is_charging, is_discharging, - last_full, current_charge, - percentage, time) + xfpm_battery_refresh_primary (battery, is_present, + is_charging, is_discharging, + last_full, current_charge, + percentage, time) : - xfpm_battery_refresh_tooltip_misc (battery, is_present, - is_charging, is_discharging, - last_full, current_charge, - percentage, time); - xfpm_battery_refresh_icon (battery, is_present, percentage); + xfpm_battery_refresh_misc (battery, is_present, + is_charging, is_discharging, + last_full, current_charge, + percentage, time); xfpm_battery_refresh_visible_icon (battery); } @@ -625,10 +634,9 @@ xfpm_battery_get_device (XfpmBattery *battery) return battery->priv->device; } -//FIXME: default g_return value XfpmBatteryState xfpm_battery_get_state (XfpmBattery *battery) { - g_return_val_if_fail (XFPM_IS_BATTERY(battery), 0); + g_return_val_if_fail (XFPM_IS_BATTERY(battery), BATTERY_NOT_PRESENT); return battery->priv->state; } diff --git a/src/xfpm-engine.c b/src/xfpm-engine.c index 45bf9ff702a613fbd3c83edadd873451ec73dbce..f9b941c3668a51cfb6d3bbd82b0b968d9ec0e524 100644 --- a/src/xfpm-engine.c +++ b/src/xfpm-engine.c @@ -47,6 +47,7 @@ #include "xfpm-button.h" #include "xfpm-inhibit.h" #include "xfpm-backlight.h" +#include "xfpm-screen-saver.h" #include "xfpm-shutdown.h" #include "xfpm-idle.h" #include "xfpm-errors.h" @@ -78,6 +79,7 @@ struct XfpmEnginePrivate XfpmShutdown *shutdown; XfpmButton *button; XfpmIdle *idle; + XfpmScreenSaver *srv; #ifdef HAVE_DPMS XfpmDpms *dpms; #endif @@ -352,6 +354,21 @@ xfpm_engine_alarm_timeout_cb (XfpmIdle *idle, guint id, XfpmEngine *engine) { TRACE ("Alarm inactivity timeout id %d", id); gboolean sleep_mode; + gboolean saver; + + if ( engine->priv->inhibited ) + { + TRACE ("Power manager is currently inhibited"); + return; + } + + saver = xfpm_screen_saver_get_inhibit (engine->priv->srv); + + if ( saver ) + { + TRACE ("User disabled sleep on the context menu"); + return; + } sleep_mode = xfpm_xfconf_get_property_bool (engine->priv->conf, INACTIVITY_SLEEP_MODE); @@ -399,7 +416,7 @@ xfpm_engine_init (XfpmEngine * engine) engine->priv->shutdown = xfpm_shutdown_new (); engine->priv->adapter = xfpm_adapter_new (); engine->priv->notify = xfpm_notify_new (); - + engine->priv->srv = xfpm_screen_saver_new (); engine->priv->inhibit = xfpm_inhibit_new (); engine->priv->inhibited = FALSE; @@ -466,6 +483,8 @@ xfpm_engine_finalize (GObject * object) g_object_unref (engine->priv->shutdown); g_object_unref (engine->priv->adapter); + + g_object_unref (engine->priv->srv); if (engine->priv->bk) g_object_unref (engine->priv->bk); diff --git a/src/xfpm-screen-saver.c b/src/xfpm-screen-saver.c index 0ed11d0450904f153142589197246a7f620de58c..ea843a6d34bec5319b96fc0ad4f9237014c456e3 100644 --- a/src/xfpm-screen-saver.c +++ b/src/xfpm-screen-saver.c @@ -37,6 +37,7 @@ #include "libxfpm/xfpm-dbus.h" #include "xfpm-screen-saver.h" +#include "xfpm-inhibit.h" #include "xfpm-dbus-monitor.h" /* Init */ @@ -47,15 +48,12 @@ static void xfpm_screen_saver_finalize (GObject *object); #define XFPM_SCREEN_SAVER_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), XFPM_TYPE_SCREEN_SAVER, XfpmScreenSaverPrivate)) -#define MAX_SCREEN_SAVER_INHIBITORS 10 - struct XfpmScreenSaverPrivate { - DBusConnection *bus; - XfpmDBusMonitor *monitor; - GPtrArray *array; + DBusGConnection *bus; + XfpmInhibit *inhibit; - guint inhibitors; + gboolean inhibited; }; enum @@ -70,83 +68,10 @@ static gpointer xfpm_screen_saver_object = NULL; G_DEFINE_TYPE(XfpmScreenSaver, xfpm_screen_saver, G_TYPE_OBJECT) -static gchar * -xfpm_screen_saver_find_unique_name (XfpmScreenSaver *srv, const gchar *unique_name) -{ - gint i; - gchar *name; - - for ( i = 0; i<srv->priv->array->len; i++) - { - name = g_ptr_array_index (srv->priv->array, i); - if ( g_strcmp0 (name, unique_name) == 0 ) - return name; - } - return NULL; -} - static void -xfpm_screen_saver_uninhibit_message (XfpmScreenSaver *srv, const gchar *unique_name) +xfpm_screen_saver_inhibit_changed_cb (XfpmInhibit *inhbit, gboolean inhibited, XfpmScreenSaver *srv) { - gchar *name; - - name = xfpm_screen_saver_find_unique_name (srv, unique_name); - - if ( name ) - { - TRACE ("%s", name); - xfpm_dbus_monitor_remove_match (srv->priv->monitor, name); - g_ptr_array_remove (srv->priv->array, name); - g_free (name); - - srv->priv->inhibitors--; - - if ( srv->priv->inhibitors == 0 ) - { - g_signal_emit (G_OBJECT(srv), signals[SCREEN_SAVER_INHIBITED], 0, FALSE); - } - } -} - -static void -xfpm_screen_saver_inhibit_message (XfpmScreenSaver *srv, const gchar *unique_name) -{ - if (xfpm_screen_saver_find_unique_name (srv, unique_name) ) - return /* We have it already!*/; - - TRACE ("%s", unique_name); - g_ptr_array_add (srv->priv->array, g_strdup (unique_name)); - xfpm_dbus_monitor_add_match (srv->priv->monitor, unique_name); - - if ( srv->priv->inhibitors == 0 ) - { - g_signal_emit (G_OBJECT(srv), signals[SCREEN_SAVER_INHIBITED], 0, TRUE); - } - - srv->priv->inhibitors++; -} - -static DBusHandlerResult -xfpm_screen_saver_filter (DBusConnection *connection, DBusMessage *message, void *data) -{ - XfpmScreenSaver *srv = ( XfpmScreenSaver *)data; - - if ( dbus_message_is_method_call (message, "org.gnome.ScreenSaver", "Inhibit") ) - xfpm_screen_saver_inhibit_message (srv, dbus_message_get_sender (message) ); - else if ( dbus_message_is_method_call (message, "org.gnome.ScreenSaver", "UnInhibit") ) - xfpm_screen_saver_uninhibit_message (srv, dbus_message_get_sender (message) ); - else if ( dbus_message_is_method_call (message, "org.freedesktop.ScreenSaver", "Inhibit") ) - xfpm_screen_saver_inhibit_message (srv, dbus_message_get_sender (message) ); - else if ( dbus_message_is_method_call (message, "org.freedesktop.ScreenSaver", "UnInhibit") ) - xfpm_screen_saver_uninhibit_message (srv, dbus_message_get_sender (message) ); - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* Keep on as we just want to spy */ -} - -static void -xfpm_screen_saver_connection_lost (XfpmDBusMonitor *monitor, gchar *unique_name, XfpmScreenSaver *srv) -{ - xfpm_screen_saver_uninhibit_message (srv, unique_name); + g_signal_emit (G_OBJECT (srv), signals [SCREEN_SAVER_INHIBITED], 0, inhibited); } static void @@ -171,87 +96,22 @@ xfpm_screen_saver_class_init(XfpmScreenSaverClass *klass) static void xfpm_screen_saver_init(XfpmScreenSaver *srv) { - DBusError error; - dbus_error_init (&error); - srv->priv = XFPM_SCREEN_SAVER_GET_PRIVATE(srv); - srv->priv->bus = dbus_bus_get (DBUS_BUS_SESSION, &error); - srv->priv->monitor = xfpm_dbus_monitor_new (); - g_signal_connect (srv->priv->monitor, "connection-lost", - G_CALLBACK (xfpm_screen_saver_connection_lost), srv); - - srv->priv->array = g_ptr_array_new (); - srv->priv->inhibitors = 0; - - if ( dbus_error_is_set (&error) ) - { - g_critical ("Unable to get session bus: %s", error.message); - dbus_error_free (&error); - goto out; - } - - dbus_bus_add_match (srv->priv->bus, - "type='method_call',interface='org.gnome.ScreenSaver'", - &error); - - if ( dbus_error_is_set (&error) ) - { - g_warning ("Failed to add match for interface org.gnome.ScreenSaver: %s", error.message); - dbus_error_free (&error); - } - - dbus_error_init (&error); - - dbus_bus_add_match (srv->priv->bus, - "type='method_call',interface='org.freedesktop.ScreenSaver'", - &error); - - if ( dbus_error_is_set (&error) ) - { - g_warning ("Failed to add match for interface org.freedesktop.ScreenSaver: %s", error.message); - dbus_error_free (&error); - } - - if (!dbus_connection_add_filter (srv->priv->bus, xfpm_screen_saver_filter, srv, NULL) ) - { - g_warning ("Couldn't add filter"); - } -out: - ; + srv->priv->inhibit = xfpm_inhibit_new (); + g_signal_connect (srv->priv->inhibit, "has-inhibit-changed", + G_CALLBACK (xfpm_screen_saver_inhibit_changed_cb), srv); } static void xfpm_screen_saver_finalize(GObject *object) { XfpmScreenSaver *srv; - gint i; - gchar *name; srv = XFPM_SCREEN_SAVER(object); - dbus_bus_remove_match (srv->priv->bus, - "type='method_call',interface='org.gnome.ScreenSaver'", - NULL); + g_object_unref (srv->priv->inhibit); - dbus_bus_remove_match (srv->priv->bus, - "type='method_call',interface='org.freedesktop.ScreenSaver'", - NULL); - - dbus_connection_unref (srv->priv->bus); - - g_object_unref (srv->priv->monitor); - - - for ( i = 0; i<srv->priv->array->len; i++) - { - name = g_ptr_array_index (srv->priv->array, i); - g_ptr_array_remove (srv->priv->array, name); - g_free (name); - } - - g_ptr_array_free (srv->priv->array, TRUE); - G_OBJECT_CLASS(xfpm_screen_saver_parent_class)->finalize(object); } @@ -269,3 +129,32 @@ xfpm_screen_saver_new(void) } return XFPM_SCREEN_SAVER (xfpm_screen_saver_object); } + +void xfpm_screen_saver_inhibit (XfpmScreenSaver *srv) +{ + g_return_if_fail (XFPM_IS_SCREEN_SAVER (srv)); + + if ( srv->priv->inhibited == FALSE ) + { + srv->priv->inhibited = TRUE; + g_signal_emit (G_OBJECT (srv), signals[SCREEN_SAVER_INHIBITED], 0, srv->priv->inhibited); + } +} + +void xfpm_screen_saver_uninhibit (XfpmScreenSaver *srv) +{ + g_return_if_fail (XFPM_IS_SCREEN_SAVER (srv)); + + if ( srv->priv->inhibited == TRUE ) + { + srv->priv->inhibited = FALSE; + g_signal_emit (G_OBJECT (srv), signals[SCREEN_SAVER_INHIBITED], 0, srv->priv->inhibited); + } +} + +gboolean xfpm_screen_saver_get_inhibit (XfpmScreenSaver *srv) +{ + g_return_val_if_fail (XFPM_IS_SCREEN_SAVER (srv), FALSE); + + return srv->priv->inhibited; +} diff --git a/src/xfpm-screen-saver.h b/src/xfpm-screen-saver.h index b9a5b1b2c7f4d41d5b51e0f436342b0882982a0d..021f2285b476e9d8daa1180184adf4e78b17cb69 100644 --- a/src/xfpm-screen-saver.h +++ b/src/xfpm-screen-saver.h @@ -48,8 +48,15 @@ typedef struct } XfpmScreenSaverClass; GType xfpm_screen_saver_get_type (void) G_GNUC_CONST; + XfpmScreenSaver *xfpm_screen_saver_new (void); +void xfpm_screen_saver_inhibit (XfpmScreenSaver *srv); + +void xfpm_screen_saver_uninhibit (XfpmScreenSaver *srv); + +gboolean xfpm_screen_saver_get_inhibit (XfpmScreenSaver *srv); + G_END_DECLS #endif /* __XFPM_SCREEN_SAVER_H */ diff --git a/src/xfpm-tray-icon.c b/src/xfpm-tray-icon.c index 0726b83b8f208218250f3c1febeb72c83e74f1d5..af1a972eb540d7a7aaa79f9252da195885b75447 100644 --- a/src/xfpm-tray-icon.c +++ b/src/xfpm-tray-icon.c @@ -39,6 +39,7 @@ #include "xfpm-tray-icon.h" #include "xfpm-shutdown.h" #include "xfpm-inhibit.h" +#include "xfpm-screen-saver.h" #include "xfpm-xfconf.h" #include "xfpm-config.h" @@ -52,10 +53,11 @@ static void xfpm_tray_icon_finalize (GObject *object); struct XfpmTrayIconPrivate { - XfpmShutdown *shutdown; - XfpmXfconf *conf; - XfpmNotify *notify; - XfpmInhibit *inhibit; + XfpmShutdown *shutdown; + XfpmXfconf *conf; + XfpmNotify *notify; + XfpmInhibit *inhibit; + XfpmScreenSaver *srv; GtkStatusIcon *icon; GQuark icon_quark; @@ -228,6 +230,16 @@ xfpm_tray_icon_menu_selection_done (GtkMenuShell *menu, gpointer data) gtk_widget_destroy (GTK_WIDGET (menu)); } +static void +xfpm_tray_icon_inhibit_active_cb (GtkWidget *mi, XfpmTrayIcon *tray) +{ + gboolean active; + active = xfpm_screen_saver_get_inhibit (tray->priv->srv); + + active == FALSE ? xfpm_screen_saver_inhibit (tray->priv->srv) : + xfpm_screen_saver_uninhibit (tray->priv->srv); +} + static void xfpm_tray_icon_popup_menu_cb (GtkStatusIcon *icon, guint button, guint activate_time, XfpmTrayIcon *tray) @@ -239,6 +251,8 @@ xfpm_tray_icon_popup_menu_cb (GtkStatusIcon *icon, guint button, gboolean can_hibernate = FALSE ; gboolean caller = FALSE; + gboolean saver_inhibited; + g_object_get (G_OBJECT (tray->priv->shutdown), "caller-privilege", &caller, "can-suspend", &can_suspend, @@ -274,6 +288,20 @@ xfpm_tray_icon_popup_menu_cb (GtkStatusIcon *icon, guint button, } gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi); + + saver_inhibited = xfpm_screen_saver_get_inhibit (tray->priv->srv); + mi = gtk_image_menu_item_new_with_label (saver_inhibited ? _("Clear inhibit") : _("Inhibit")); + + gtk_widget_set_tooltip_text (mi, _("Disable or enable automatic sleep, setting this will tell the power manager "\ + "to disable backlight sleep, for example you could active the inhibit if you are watching a movie.")); + + img = gtk_image_new_from_stock (saver_inhibited ? GTK_STOCK_CANCEL : GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi),img); + g_signal_connect (G_OBJECT (mi), "activate", + G_CALLBACK (xfpm_tray_icon_inhibit_active_cb), tray); + gtk_widget_set_sensitive (mi, TRUE); + gtk_widget_show(mi); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi); if ( tray->priv->info_menu ) { @@ -378,6 +406,7 @@ xfpm_tray_icon_init(XfpmTrayIcon *tray) tray->priv->notify = xfpm_notify_new (); tray->priv->inhibited = FALSE; tray->priv->inhibit = xfpm_inhibit_new (); + tray->priv->srv = xfpm_screen_saver_new (); tray->priv->info_menu = TRUE; tray->priv->icon_quark = 0; @@ -411,6 +440,8 @@ xfpm_tray_icon_finalize(GObject *object) g_object_unref (tray->priv->notify); g_object_unref (tray->priv->inhibit); + + g_object_unref (tray->priv->srv); G_OBJECT_CLASS(xfpm_tray_icon_parent_class)->finalize(object); }