Fixed restoration of the panel divider position.
[psensor.git] / src / ui_status.c
index 49137e0..22ba5c0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 jeanfi@gmail.com
+ * Copyright (C) 2010-2016 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  * 02110-1301 USA
  */
+#include <plog.h>
+#include "ui_status.h"
 
-#include <gtk/gtk.h>
+static const char *ICON = "psensor_normal";
+static const char *ATTENTION_ICON = "psensor_hot";
 
-#include "log.h"
-#include "ui_status.h"
+static GtkStatusIcon *status;
+static unsigned int status_attention;
+
+static void cb_activate(GtkStatusIcon *icon,
+                       gpointer data)
+{
+       log_debug("cb_activate()");
+       ui_window_show((struct ui_psensor *)data);
+}
+
+static void cb_popup_menu(GtkStatusIcon *icon,
+                         guint button,
+                         guint activate_time,
+                         gpointer data)
+{
+       log_debug("cb_popup_menu()");
+}
+
+void ui_status_init(struct ui_psensor *ui)
+{
+       if (status)
+               return;
+
+       log_debug("ui_status_create()");
+
+       status = gtk_status_icon_new();
+       gtk_status_icon_set_from_icon_name(status, ICON);
+       ui_status_set_visible(0);
 
-GtkStatusIcon *status;
+       g_signal_connect(G_OBJECT(status),
+                        "popup-menu",
+                        G_CALLBACK(cb_popup_menu),
+                        NULL);
 
-void ui_status_init()
+       g_signal_connect(G_OBJECT(status),
+                        "activate",
+                        G_CALLBACK(cb_activate),
+                        ui);
+}
+
+int is_status_supported(void)
+{
+       return status && gtk_status_icon_is_embedded(status);
+}
+
+void ui_status_cleanup(void)
+{
+       log_debug("ui_status_cleanup()");
+
+       if (status) {
+               g_object_unref(G_OBJECT(status));
+               status = NULL;
+       }
+}
+
+void ui_status_update(struct ui_psensor *ui, unsigned int attention)
 {
-       log_printf(LOG_DEBUG, "ui_status_create()");
+       log_debug("ui_status_update()");
 
-        status = gtk_status_icon_new();
-        gtk_status_icon_set_from_icon_name(status, "psensor");
-        gtk_status_icon_set_tooltip(status, 
-                                    "Psensor - Hardware Sensors Monitoring");
-        gtk_status_icon_set_visible(status, TRUE);
+       if (status_attention && !attention)
+               gtk_status_icon_set_from_icon_name(status, ICON);
+       else if (!status_attention && attention)
+               gtk_status_icon_set_from_icon_name(status, ATTENTION_ICON);
+
+       status_attention = attention;
 }
 
-int is_status_supported()
+GtkStatusIcon *ui_status_get_icon(struct ui_psensor *ui)
 {
-       return gtk_status_icon_is_embedded(status);
+       if (!status)
+               ui_status_init(ui);
+
+       return status;
 }
 
-void ui_status_cleanup()
+void ui_status_set_visible(unsigned int visible)
 {
-       g_object_unref(G_OBJECT(status));
+       log_debug("ui_status_set_visible(%d)", visible);
+
+       if (status) {
+               if (visible)
+                       gtk_status_icon_set_visible(status, TRUE);
+               else
+                       gtk_status_icon_set_visible(status, FALSE);
+       }
 }