[Xfce4-commits] <xfce4-weather-plugin:master> Power saving: Implement upower support.

Harald Judt noreply at xfce.org
Tue Feb 5 15:24:02 CET 2013


Updating branch refs/heads/master
         to 2189f6bf37f6f379c4c4d9478f5f76083e8cb08a (commit)
       from f622c1ad07bbb1f051a59bf798bdc5245d1147e0 (commit)

commit 2189f6bf37f6f379c4c4d9478f5f76083e8cb08a
Author: Harald Judt <h.judt at gmx.at>
Date:   Tue Feb 5 00:22:44 2013 +0100

    Power saving: Implement upower support.
    
    If the lid is closed, hide the scrollbox.
    
    If the machine is on battery,
    * decrease the regular update interval to 30 seconds,
    * stop the scrollbox animation and
    * update the summary window clock only every minute.

 panel-plugin/weather-config.c  |   10 ++++-
 panel-plugin/weather-debug.c   |    5 ++
 panel-plugin/weather-summary.c |   17 +++++++-
 panel-plugin/weather.c         |   82 +++++++++++++++++++++++++++++++++++++++-
 panel-plugin/weather.h         |    8 ++++
 5 files changed, 115 insertions(+), 7 deletions(-)

diff --git a/panel-plugin/weather-config.c b/panel-plugin/weather-config.c
index 2f0d337..61eea44 100644
--- a/panel-plugin/weather-config.c
+++ b/panel-plugin/weather-config.c
@@ -1706,8 +1706,14 @@ check_scrollbox_animate_toggled(GtkWidget *button,
     xfceweather_dialog *dialog = (xfceweather_dialog *) user_data;
     dialog->pd->scrollbox_animate =
         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-    gtk_scrollbox_set_animate(GTK_SCROLLBOX(dialog->pd->scrollbox),
-                              dialog->pd->scrollbox_animate);
+#ifdef HAVE_UPOWER_GLIB
+    if (dialog->pd->upower_on_battery)
+        gtk_scrollbox_set_animate(GTK_SCROLLBOX(dialog->pd->scrollbox),
+                                  FALSE);
+    else
+#endif
+        gtk_scrollbox_set_animate(GTK_SCROLLBOX(dialog->pd->scrollbox),
+                                  dialog->pd->scrollbox_animate);
 }
 
 
diff --git a/panel-plugin/weather-debug.c b/panel-plugin/weather-debug.c
index e9f7123..7e0392c 100644
--- a/panel-plugin/weather-debug.c
+++ b/panel-plugin/weather-debug.c
@@ -409,6 +409,9 @@ weather_dump_plugindata(const plugin_data *data)
                            "  panel orientation: %d\n"
                            "  plugin orientation: %d\n"
                            "  --------------------------------------------\n"
+                           "  upower on battery: %s\n"
+                           "  upower lid closed: %s\n"
+                           "  --------------------------------------------\n"
                            "  last astro update: %s\n"
                            "  next astro update: %s\n"
                            "  astro download attempts: %d\n"
@@ -447,6 +450,8 @@ weather_dump_plugindata(const plugin_data *data)
                            data->size,
                            data->panel_orientation,
                            data->orientation,
+                           YESNO(data->upower_on_battery),
+                           YESNO(data->upower_lid_closed),
                            last_astro_update,
                            next_astro_update,
                            data->astro_update->attempt,
diff --git a/panel-plugin/weather-summary.c b/panel-plugin/weather-summary.c
index a6483e1..1181543 100644
--- a/panel-plugin/weather-summary.c
+++ b/panel-plugin/weather-summary.c
@@ -990,7 +990,7 @@ update_summary_subtitle(plugin_data *data)
 {
     time_t now_t;
     GTimeVal now;
-    gchar *title, *date;
+    gchar *title, *date, *date_format;
     guint update_interval;
     gint64 now_ms;
 
@@ -1004,7 +1004,13 @@ update_summary_subtitle(plugin_data *data)
         return FALSE;
 
     time(&now_t);
-    date = format_date(now_t, "%Y-%m-%d %H:%M:%S %z (%Z)", TRUE);
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower_on_battery || data->upower_lid_closed)
+        date_format = "%Y-%m-%d %H:%M %z (%Z)";
+    else
+#endif
+        date_format = "%Y-%m-%d %H:%M:%S %z (%Z)";
+    date = format_date(now_t, date_format, TRUE);
     title = g_strdup_printf("%s\n%s", data->location_name, date);
     g_free(date);
     xfce_titled_dialog_set_subtitle(XFCE_TITLED_DIALOG(data->summary_window),
@@ -1014,7 +1020,12 @@ update_summary_subtitle(plugin_data *data)
     /* compute and schedule the next update */
     g_get_current_time(&now);
     now_ms = ((gint64) now.tv_sec * 1000) + ((gint64) now.tv_usec / 1000);
-    update_interval = 1000 - (now_ms % 1000) + 1;
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower_on_battery || data->upower_lid_closed)
+        update_interval = 60000 - (now_ms % 60000) + 1;
+    else
+#endif
+        update_interval = 1000 - (now_ms % 1000) + 1;
     data->summary_update_timer =
         g_timeout_add(update_interval, (GSourceFunc) update_summary_subtitle,
                       data);
diff --git a/panel-plugin/weather.c b/panel-plugin/weather.c
index 6085924..5a5ff8a 100644
--- a/panel-plugin/weather.c
+++ b/panel-plugin/weather.c
@@ -44,6 +44,12 @@
 #define CONN_MAX_ATTEMPTS (3)    /* max retry attempts using small interval */
 #define CONN_RETRY_INTERVAL_SMALL (10)
 #define CONN_RETRY_INTERVAL_LARGE (10 * 60)
+
+/* power saving update interval in seconds used as a precaution to
+   deal with suspend/resume events etc., when nothing needs to be
+   updated earlier: */
+#define POWERSAVE_UPDATE_INTERVAL (30)
+
 /* standard update interval in seconds used as a precaution to deal
    with suspend/resume events etc., when nothing needs to be updated
    earlier: */
@@ -312,6 +318,13 @@ update_icon(plugin_data *data)
 void
 scrollbox_set_visible(plugin_data *data)
 {
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower_lid_closed) {
+        gtk_widget_hide_all(GTK_WIDGET(data->vbox_center_scrollbox));
+        gtk_scrollbox_set_visible(GTK_SCROLLBOX(data->scrollbox), FALSE);
+        return;
+    }
+#endif
     if (data->show_scrollbox && data->labels->len > 0)
         gtk_widget_show_all(GTK_WIDGET(data->vbox_center_scrollbox));
     else
@@ -358,8 +371,13 @@ update_scrollbox(plugin_data *data,
         weather_debug("No weather data available, set single label '%s'.",
                       _("No Data"));
     }
-    gtk_scrollbox_set_animate(GTK_SCROLLBOX(data->scrollbox),
-                              data->scrollbox_animate);
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower_on_battery)
+        gtk_scrollbox_set_animate(GTK_SCROLLBOX(data->scrollbox), FALSE);
+    else
+#endif
+        gtk_scrollbox_set_animate(GTK_SCROLLBOX(data->scrollbox),
+                                  data->scrollbox_animate);
     /* update labels immediately (mainly used on config change) */
     if (immediately) {
         gtk_scrollbox_prev_label(GTK_SCROLLBOX(data->scrollbox));
@@ -695,6 +713,15 @@ schedule_next_wakeup(plugin_data *data)
                                     "sunset icon change");
     }
 
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower_on_battery && diff > POWERSAVE_UPDATE_INTERVAL) {
+        /* next wakeup time is greater than the power saving check
+           interval, so call the update handler earlier to deal with
+           cases like system resume events etc. */
+        diff = POWERSAVE_UPDATE_INTERVAL;
+        data->next_wakeup_reason = "regular check (power saving)";
+    } else
+#endif
     if (diff > UPDATE_INTERVAL) {
         /* next wakeup time is greater than the standard check
            interval, so call the update handler earlier to deal with
@@ -1451,6 +1478,39 @@ mi_click(GtkWidget *widget,
 }
 
 
+#ifdef HAVE_UPOWER_GLIB
+static void
+upower_changed_cb(UpClient *client,
+                  plugin_data *data)
+{
+    gboolean on_battery, lid_closed;
+
+    if (G_UNLIKELY(data->upower == NULL))
+        return;
+
+    on_battery = data->upower_on_battery;
+    lid_closed = data->upower_lid_closed;
+    weather_debug("upower old status: on_battery=%d, lid_closed=%d",
+                  on_battery, lid_closed);
+
+    data->upower_on_battery = up_client_get_on_battery(client);
+    data->upower_lid_closed = up_client_get_lid_is_closed(client);
+    weather_debug("upower new status: on_battery=%d, lid_closed=%d",
+                  data->upower_on_battery, data->upower_lid_closed);
+
+    if (data->upower_on_battery != on_battery ||
+        data->upower_lid_closed != lid_closed) {
+        if (data->summary_window)
+            update_summary_subtitle(data);
+
+        update_icon(data);
+        update_scrollbox(data, FALSE);
+        schedule_next_wakeup(data);
+    }
+}
+#endif
+
+
 static void
 xfceweather_dialog_response(GtkWidget *dlg,
                             gint response,
@@ -1684,6 +1744,13 @@ xfceweather_create_control(XfcePanelPlugin *plugin)
 
     /* Initialize with sane default values */
     data->plugin = plugin;
+#ifdef HAVE_UPOWER_GLIB
+    data->upower = up_client_new();
+    if (data->upower) {
+        data->upower_on_battery = up_client_get_on_battery(data->upower);
+        data->upower_lid_closed = up_client_get_lid_is_closed(data->upower);
+    }
+#endif
     data->units = g_slice_new0(units_config);
     data->weatherdata = make_weather_data();
     data->cache_file_max_age = CACHE_FILE_MAX_AGE;
@@ -1796,6 +1863,11 @@ xfceweather_free(XfcePanelPlugin *plugin,
         data->update_timer = 0;
     }
 
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower)
+        g_object_unref(data->upower);
+#endif
+
     if (data->weatherdata)
         xml_weather_free(data->weatherdata);
 
@@ -2013,6 +2085,12 @@ weather_construct(XfcePanelPlugin *plugin)
     g_signal_connect(G_OBJECT(plugin), "about",
                      G_CALLBACK(xfceweather_show_about), data);
 
+#ifdef HAVE_UPOWER_GLIB
+    if (data->upower)
+        g_signal_connect(data->upower, "changed",
+                         G_CALLBACK(upower_changed_cb), data);
+#endif
+
     /* call update handler updates */
     update_handler(data);
 
diff --git a/panel-plugin/weather.h b/panel-plugin/weather.h
index 60001f1..25d7a5a 100644
--- a/panel-plugin/weather.h
+++ b/panel-plugin/weather.h
@@ -22,6 +22,9 @@
 #include <libxfce4panel/libxfce4panel.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libsoup/soup.h>
+#ifdef HAVE_UPOWER_GLIB
+#include <upower.h>
+#endif
 #include "weather-icon.h"
 
 #define PLUGIN_WEBSITE "http://goodies.xfce.org/projects/panel-plugins/xfce4-weather-plugin"
@@ -59,6 +62,11 @@ typedef struct {
 typedef struct {
     XfcePanelPlugin *plugin;
 
+#ifdef HAVE_UPOWER_GLIB
+    UpClient *upower;
+    gboolean upower_on_battery;
+    gboolean upower_lid_closed;
+#endif
     SoupSession *session;
     gchar *geonames_username;
 


More information about the Xfce4-commits mailing list