[Goodies-commits] r3675 - xfce4-cpugraph-plugin/trunk/panel-plugin

ludovic mercier lidiriel at xfce.org
Fri Dec 7 09:55:00 CET 2007


Author: lidiriel
Date: 2007-12-07 08:55:00 +0000 (Fri, 07 Dec 2007)
New Revision: 3675

Added:
   xfce4-cpugraph-plugin/trunk/panel-plugin/os.c
   xfce4-cpugraph-plugin/trunk/panel-plugin/os.h
Modified:
   xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.c
   xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.h
   xfce4-cpugraph-plugin/trunk/panel-plugin/mode.c
   xfce4-cpugraph-plugin/trunk/panel-plugin/mode.h
Log:
prepare new version for replace last release (0.4.0)
following the mailling list discussion
add new merge code

Modified: xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.c
===================================================================
--- xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.c	2007-12-07 08:52:30 UTC (rev 3674)
+++ xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.c	2007-12-07 08:55:00 UTC (rev 3675)
@@ -1,35 +1,6 @@
-/*  cpu.c
- *  Part of xfce4-cpugraph-plugin
- *
- *  Copyright (c) Alexander Nordfelth <alex.nordfelth at telia.com>
- *  Copyright (c) gatopeich <gatoguan-os at yahoo.com>
- *  Copyright (c) 2007-2008 Angelo Arrifano <miknix at gmail.com>
- *  Copyright (c) 2007-2008 Lidiriel <lidiriel at coriolys.org>
- *
- *  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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- 
 #include "cpu.h"
 #include "mode.h"
-#include "option.h"
-#include "settings.h"
-#include "cpu_os.h"
 
-
-static GtkTooltips *tooltips = NULL;
-
 guint16
 _lerp (double t, guint16 a, guint16 b)
 {
@@ -69,33 +40,191 @@
 void
 Kill (XfcePanelPlugin * plugin, CPUGraph * base)
 {
-	gint i;
-	cpuLoadMon_free();
-	for(i=0; i<base->nrCores-1 ; i++)
-		gtk_widget_destroy(base->m_pBar[i]);
+  gint i;
+  cpuData_free();
+  base->m_CpuData = NULL;
 
-	gtk_widget_destroy(base->m_Box);
-	free(base->m_pBar);
-	if (base->m_TimeoutID)
-		g_source_remove (base->m_TimeoutID);
+  for(i=0; i<base->nrCores-1; i++)
+    gtk_widget_destroy(base->m_pBar[i]);
 
-	if (base->m_History)
-		g_free (base->m_History);
+  gtk_widget_destroy(base->m_Box);
 
-	g_object_unref (base->m_Tooltip);
+  if (base->m_TimeoutID)
+    g_source_remove (base->m_TimeoutID);
 
-	g_free (base);
+  if (base->m_History)
+    g_free (base->m_History);
+
+  g_object_unref (base->m_Tooltip);
+
+  g_free (base);
 }
 
+void
+ReadSettings (XfcePanelPlugin * plugin, CPUGraph * base)
+{
+    const char *value;
+    char *file;
+    XfceRc *rc;
+    int update;
 
+    base->m_Width = 70;
+
+    base->m_ForeGround1.red = 0;
+    base->m_ForeGround1.green = 65535;
+    base->m_ForeGround1.blue = 0;
+
+    base->m_ForeGround2.red = 65535;
+    base->m_ForeGround2.green = 0;
+    base->m_ForeGround2.blue = 0;
+
+    base->m_ForeGround3.red = 0;
+    base->m_ForeGround3.green = 0;
+    base->m_ForeGround3.blue = 65535;
+
+    base->m_BackGround.red = 65535;
+    base->m_BackGround.green = 65535;
+    base->m_BackGround.blue = 65535;
+
+    base->m_TimeScale = 0;
+    base->m_Frame = 0;
+    base->m_AssociateCommand = "xterm top";
+    base->m_ColorMode = 0;
+    base->m_Mode = 0;
+
+    if ((file = xfce_panel_plugin_lookup_rc_file (plugin)) != NULL)
+    {
+        rc = xfce_rc_simple_open (file, TRUE);
+        g_free (file);
+
+        if (rc)
+        {
+            base->m_UpdateInterval =
+                xfce_rc_read_int_entry (rc, "UpdateInterval",
+                                        base->m_UpdateInterval);
+
+            base->m_TimeScale =
+                xfce_rc_read_int_entry (rc, "TimeScale",
+                                        base->m_TimeScale);
+
+            base->m_Width =
+                xfce_rc_read_int_entry (rc, "Width", base->m_Width);
+
+            base->m_Mode = xfce_rc_read_int_entry (rc, "Mode", base->m_Mode);
+
+            base->m_Frame =
+                xfce_rc_read_int_entry (rc, "Frame", base->m_Frame);
+
+            if (value = xfce_rc_read_entry (rc, "AssociateCommand", base->m_AssociateCommand)) {
+              base->m_AssociateCommand = g_strdup(value);
+            }
+
+            base->m_ColorMode =
+                xfce_rc_read_int_entry (rc, "ColorMode", base->m_ColorMode);
+
+            if ((value = xfce_rc_read_entry (rc, "Foreground1", NULL)))
+            {
+                gdk_color_parse (value, &base->m_ForeGround1);
+            }
+            if ((value = xfce_rc_read_entry (rc, "Foreground2", NULL)))
+            {
+                gdk_color_parse (value, &base->m_ForeGround2);
+            }
+            if ((value = xfce_rc_read_entry (rc, "Background", NULL)))
+            {
+                gdk_color_parse (value, &base->m_BackGround);
+            }
+            if ((value = xfce_rc_read_entry (rc, "Foreground3", NULL)))
+            {
+                gdk_color_parse (value, &base->m_ForeGround3);
+            }
+
+            xfce_rc_close (rc);
+        }
+    }
+    SetHistorySize (base, base->m_Width);
+    if (base->m_TimeoutID)
+        g_source_remove (base->m_TimeoutID);
+    switch (base->m_UpdateInterval)
+    {
+        case 0:
+            update = 250;
+            break;
+        case 1:
+            update = 500;
+            break;
+        case 2:
+            update = 750;
+            break;
+        default:
+            update = 1000;
+    }
+    base->m_TimeoutID = g_timeout_add (update, (GtkFunction) UpdateCPU, base);
+    gtk_frame_set_shadow_type (GTK_FRAME (base->m_FrameWidget),
+            base->m_Frame ? GTK_SHADOW_IN : GTK_SHADOW_NONE);
+}
+
+void
+WriteSettings (XfcePanelPlugin *plugin, CPUGraph *base)
+{
+    char value[10];
+    XfceRc *rc;
+    char *file;
+
+    if (!(file = xfce_panel_plugin_save_location (plugin, TRUE)))
+        return;
+
+    rc = xfce_rc_simple_open (file, FALSE);
+    g_free (file);
+
+    if (!rc)
+        return;
+
+    xfce_rc_write_int_entry (rc, "UpdateInterval", base->m_UpdateInterval);
+
+    xfce_rc_write_int_entry (rc, "TimeScale", base->m_TimeScale);
+
+    xfce_rc_write_int_entry (rc, "Width", base->m_Width);
+
+    xfce_rc_write_int_entry (rc, "Mode", base->m_Mode);
+
+    xfce_rc_write_int_entry (rc, "Frame", base->m_Frame);
+
+    xfce_rc_write_entry (rc, "AssociateCommand", base->m_AssociateCommand ? base->m_AssociateCommand : "");
+
+    xfce_rc_write_int_entry (rc, "ColorMode", base->m_ColorMode);
+
+    g_snprintf (value, 8, "#%02X%02X%02X", base->m_ForeGround1.red >> 8,
+                                           base->m_ForeGround1.green >> 8,
+                                           base->m_ForeGround1.blue >> 8);
+    xfce_rc_write_entry (rc, "Foreground1", value);
+
+    g_snprintf (value, 8, "#%02X%02X%02X", base->m_ForeGround2.red >> 8,
+                                           base->m_ForeGround2.green >> 8,
+                                           base->m_ForeGround2.blue >> 8);
+    xfce_rc_write_entry (rc, "Foreground2", value);
+
+    g_snprintf (value, 8, "#%02X%02X%02X", base->m_BackGround.red >> 8,
+                                           base->m_BackGround.green >> 8,
+                                           base->m_BackGround.blue >> 8);
+    xfce_rc_write_entry (rc, "Background", value);
+
+    g_snprintf (value, 8, "#%02X%02X%02X", base->m_ForeGround3.red >> 8,
+                                           base->m_ForeGround3.green >> 8,
+                                           base->m_ForeGround3.blue >> 8);
+    xfce_rc_write_entry (rc, "Foreground3", value);
+
+    xfce_rc_close (rc);
+}
+
 CPUGraph *
 CreateControl (XfcePanelPlugin * plugin)
 {
+    gint i;
     GtkWidget *frame, *ebox;
     GtkOrientation orientation;
     GtkProgressBarOrientation barOrientation;
     CPUGraph *base = g_new0 (CPUGraph, 1);
-    gint i;
 
     base->plugin = plugin;
 
@@ -103,8 +232,6 @@
     gtk_widget_show (ebox);
     gtk_container_add (GTK_CONTAINER (plugin), ebox);
 
-    xfce_panel_plugin_add_action_widget (plugin, ebox);
-
     orientation = xfce_panel_plugin_get_orientation(plugin);
     if(orientation == GTK_ORIENTATION_HORIZONTAL)
       barOrientation = GTK_PROGRESS_BOTTOM_TO_TOP;
@@ -114,64 +241,61 @@
     base->m_Box = xfce_hvbox_new(orientation, FALSE, 0);
     gtk_widget_show(base->m_Box);
     gtk_container_add(GTK_CONTAINER(ebox), base->m_Box);
-    
+
     gtk_container_set_border_width(GTK_CONTAINER(frame), BORDER / 2);
- 
-    /* <-- Multicore stuff */
-    if((base->nrCores = cpuLoadMon_init() - 1) < 0)
-      DBG("Cannot init base monitor!\n");
 
-    base->m_pBar =
-        (GtkWidget **) malloc(sizeof(GtkWidget *) * base->nrCores);
 
+    /* Multicore stuff */
+    //fprintf(stderr,"Multicore stuff\n");
+    if((base->nrCores = cpuData_init() - 1) < 0)
+      fprintf(stderr,"Cannot init cpu data !\n");
+
+    base->m_pBar = (GtkWidget **) malloc(sizeof(GtkWidget *) * base->nrCores);
+
     for(i=0; i<base->nrCores; i++) {
       base->m_pBar[i] = GTK_WIDGET(gtk_progress_bar_new());
       gtk_progress_bar_set_orientation(
                                        GTK_PROGRESS_BAR(base->m_pBar[i]),
                                        barOrientation);
-     
+
       gtk_box_pack_start(
                          GTK_BOX(base->m_Box),
                          base->m_pBar[i],
                          FALSE,
                          FALSE,
                          0);
-     
-    
+
       gtk_widget_show(base->m_pBar[i]);
     }
 
-    /* <-- End of multicore stuff */
-
     base->m_FrameWidget = frame = gtk_frame_new (NULL);
     gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
- 
 
     gtk_box_pack_start(
-                  GTK_BOX(base->m_Box),
-                  frame,
-                  TRUE,
-                  TRUE,
-                  2);
+                       GTK_BOX(base->m_Box),
+                       frame,
+                       TRUE,
+                       TRUE,
+                       2);
+
     gtk_widget_show (frame);
 
+    xfce_panel_plugin_add_action_widget (plugin, ebox);
+    g_signal_connect (ebox, "button-press-event", G_CALLBACK (LaunchCommand), base);
 
-
-
-
-
     base->m_DrawArea = gtk_drawing_area_new ();
     gtk_widget_set_app_paintable (base->m_DrawArea, TRUE);
+    //gtk_container_add (GTK_CONTAINER (ebox), frame);
     gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (base->m_DrawArea));
     gtk_widget_show (base->m_DrawArea);
 
+
     xfce_panel_plugin_add_action_widget (plugin, base->m_DrawArea);
 
     base->m_Tooltip = gtk_tooltips_new ();
     g_object_ref (base->m_Tooltip);
     gtk_object_sink (GTK_OBJECT (base->m_Tooltip));
 
-    g_signal_connect (ebox, "button-press-event", G_CALLBACK (LaunchCommand), base);
     g_signal_connect_after (base->m_DrawArea, "expose-event",
                       G_CALLBACK (DrawAreaExposeEvent), base);
 
@@ -181,106 +305,97 @@
 void
 SetOrientation (XfcePanelPlugin * plugin, GtkOrientation orientation, CPUGraph *base)
 {
-  GtkProgressBarOrientation barOrientation;
-	gpointer p_pBar[base->nrCores];
-  gpointer p_FrameWidget;
-	gint i;
+    GtkProgressBarOrientation barOrientation;
+    gpointer p_pBar[base->nrCores];
+    gpointer p_FrameWidget;
+    gint i;
 
-  /* <-- Multicore stuff */
+    /* <-- Multicore stuff */
 
-	orientation = xfce_panel_plugin_get_orientation(plugin);
-	if(orientation == GTK_ORIENTATION_HORIZONTAL)
-		barOrientation = GTK_PROGRESS_BOTTOM_TO_TOP;
-	else
-		barOrientation = GTK_PROGRESS_LEFT_TO_RIGHT;
+    orientation = xfce_panel_plugin_get_orientation(plugin);
+    if(orientation == GTK_ORIENTATION_HORIZONTAL)
+      barOrientation = GTK_PROGRESS_BOTTOM_TO_TOP;
+    else
+      barOrientation = GTK_PROGRESS_LEFT_TO_RIGHT;
 
-  /* Unpack progress bars */
-	for(i=0; i<base->nrCores; i++)
-	{
-		/* reference progress bars to keep them alive */
-		p_pBar[i] = g_object_ref(base->m_pBar[i]);
-		gtk_container_remove(
+    /* Unpack progress bars */
+    for(i=0; i<base->nrCores; i++){
+      /* reference progress bars to keep them alive */
+      p_pBar[i] = g_object_ref(base->m_pBar[i]);
+      gtk_container_remove(
+                           GTK_CONTAINER(base->m_Box),
+                           GTK_WIDGET(base->m_pBar[i]));
+    }
+    p_FrameWidget = g_object_ref(base->m_FrameWidget);
+    gtk_container_remove(
                          GTK_CONTAINER(base->m_Box),
-                         GTK_WIDGET(base->m_pBar[i]));
-	}
-  p_FrameWidget = g_object_ref(base->m_FrameWidget);
-	gtk_container_remove(
-                       GTK_CONTAINER(base->m_Box),
-                       GTK_WIDGET(base->m_FrameWidget));
+                         GTK_WIDGET(base->m_FrameWidget));
 
-	
-	xfce_hvbox_set_orientation(XFCE_HVBOX(base->m_Box), orientation);
 
-	/* Pack progress bars again into hvbox */
-	for(i=0; i<base->nrCores; i++)
-	{
-		gtk_progress_bar_set_orientation(
-                                     GTK_PROGRESS_BAR(base->m_pBar[i]),
-                                     barOrientation);	
-		gtk_box_pack_start(
+    xfce_hvbox_set_orientation(XFCE_HVBOX(base->m_Box), orientation);
+
+    /* Pack progress bars again into hvbox */
+    for(i=0; i<base->nrCores; i++){
+      gtk_progress_bar_set_orientation(
+                                       GTK_PROGRESS_BAR(base->m_pBar[i]),
+                                       barOrientation);	
+      gtk_box_pack_start(
+                         GTK_BOX(base->m_Box),
+                         base->m_pBar[i],
+                         FALSE,
+                         FALSE,
+                         1);
+      /* We dont need anymore this reference */
+      g_object_unref(p_pBar[i]);
+    }
+    gtk_box_pack_start(
                        GTK_BOX(base->m_Box),
-                       base->m_pBar[i],
-                       FALSE,
-                       FALSE,
-                       1);
-		/* We dont need anymore this reference */
-		g_object_unref(p_pBar[i]);
-	}
-	gtk_box_pack_start(
-                     GTK_BOX(base->m_Box),
-                     base->m_FrameWidget,
-                     TRUE,
-                     TRUE,
-                     2);
-  g_object_unref(p_FrameWidget);
-  
-  UserSetSize (base);
-
-  gtk_widget_queue_draw (base->m_DrawArea);
+                       base->m_FrameWidget,
+                       TRUE,
+                       TRUE,
+                       2);
+    g_object_unref(p_FrameWidget);
+    UserSetSize (base);
+    gtk_widget_queue_draw (base->m_DrawArea);
 }
 
 void
 UpdateTooltip (CPUGraph * base)
 {
     char tooltip[32];
-    int pos = snprintf (tooltip, 32, "Usage: %d%%", base->m_CPUUsage);
-    if( scaling_cur_freq )
-        snprintf (tooltip+pos, 32-pos, " (%d MHz)", scaling_cur_freq/1000);
+    int pos = snprintf (tooltip, 32, "Usage: %d%%", base->m_CpuData[0].load*100/CPU_SCALE);
+    if( base->m_CpuData[0].scalCurFreq )
+      snprintf (tooltip+pos, 32-pos, " (%d MHz)", base->m_CpuData[0].scalCurFreq/1000);
     gtk_tooltips_set_tip (GTK_TOOLTIPS (base->m_Tooltip),
-                          base->m_Box->parent, tooltip, NULL);
+                          base->m_FrameWidget->parent, tooltip, NULL);
 }
 
-/**
- * size : size of pannel height/width
- * BORDER : use for size of bar
- */
 gboolean
 SetSize (XfcePanelPlugin *plugin, int size, CPUGraph *base)
 {
-    gint i, coreWidth;
-    gtk_container_set_border_width (GTK_CONTAINER (base->m_FrameWidget), 0);
+    gint i;
+    gtk_container_set_border_width (GTK_CONTAINER (base->m_FrameWidget),
+                                    size > 26 ? 2 : 0);
+
     if (xfce_panel_plugin_get_orientation (plugin) ==
             GTK_ORIENTATION_HORIZONTAL)
     {
-      for(i=0; i<base->nrCores; i++)
+        gtk_widget_set_size_request (GTK_WIDGET (plugin),
+                                     base->m_Width, size);
+        for(i=0; i<base->nrCores; i++)
           gtk_widget_set_size_request(
-                                GTK_WIDGET(base->m_pBar[i]),
-                                BORDER,
-                                size);
-
-      coreWidth = base->nrCores*BORDER;
-      gtk_widget_set_size_request (GTK_WIDGET (plugin),
-                                   base->m_Width+coreWidth, size);
+                                      GTK_WIDGET(base->m_pBar[i]),
+                                      BORDER,
+                                      size);
     }
     else
     {
         gtk_widget_set_size_request (GTK_WIDGET (plugin),
                                      size, base->m_Width);
-        for(i=0; i<base->nrCores; i++)
-          gtk_widget_set_size_request(
-                                GTK_WIDGET(base->m_pBar[i]),
-                                size,
-                                BORDER);
+        gtk_widget_set_size_request(
+                                    GTK_WIDGET(base->m_pBar[i]),
+                                    size,
+                                    BORDER);
     }
 
     return TRUE;
@@ -289,39 +404,436 @@
 void
 UserSetSize (CPUGraph * base)
 {
-  SetSize (base->plugin, xfce_panel_plugin_get_size (base->plugin), base);
+    SetSize (base->plugin, xfce_panel_plugin_get_size (base->plugin), base);
 }
 
+static void
+DialogResponse (GtkWidget *dlg, int response, CPUGraph *base)
+{
+    ApplyChanges (base);
+    gtk_widget_destroy (dlg);
+    xfce_panel_plugin_unblock_menu (base->plugin);
+    WriteSettings (base->plugin, base);
+}
 
-gboolean
-UpdateCPU (CPUGraph * base)
+void
+CreateOptions (XfcePanelPlugin *plugin, CPUGraph *base)
 {
-  gint i;
-  cpuLoadData *data = cpuLoadMon_read();
+    GtkWidget *dlg, *header;
+    GtkBox *vbox, *vbox2, *hbox;
+    GtkWidget *label;
+    GtkSizeGroup *sg;
+    SOptions *op = &base->m_Options;
 
-  base->m_CPUUsage = data[0].value * 100.0;
+    xfce_panel_plugin_block_menu (plugin);
 
-  for(i=0; i<base->nrCores; i++){
-    gtk_progress_bar_set_fraction(
-                                  GTK_PROGRESS_BAR(base->m_pBar[i]),
-                                  (gdouble)data[i+1].value);
-  }
+    dlg = gtk_dialog_new_with_buttons (_("Configure CPU Graph"),
+                GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))),
+                GTK_DIALOG_DESTROY_WITH_PARENT |
+                GTK_DIALOG_NO_SEPARATOR,
+                GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
+                NULL);
 
-  memmove (base->m_History + 1, base->m_History,
-           (base->m_Values-1)*sizeof(float));
-  base->m_History[0] = data[0].value;
+    base->m_OptionsDialog = dlg;
 
-  /* Tooltip */
-  UpdateTooltip (base);
+    g_signal_connect (dlg, "response", G_CALLBACK (DialogResponse), base);
 
-  //fprintf(stderr, "update cpu %f\n", base->m_History[0]);
+    gtk_container_set_border_width (GTK_CONTAINER (dlg), 2);
 
-  /* Draw the graph. */
-  gtk_widget_queue_draw (base->m_DrawArea);
+    header = xfce_create_header (NULL, _("CPU Graph"));
+    gtk_widget_set_size_request (GTK_BIN (header)->child, -1, 32);
+    gtk_container_set_border_width (GTK_CONTAINER (header), BORDER - 2);
+    gtk_widget_show (header);
+    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), header,
+                        FALSE, TRUE, 0);
 
-  return TRUE;
+    vbox = GTK_BOX (gtk_vbox_new(FALSE, BORDER));
+    gtk_container_set_border_width (GTK_CONTAINER (vbox), BORDER );
+    gtk_widget_show(GTK_WIDGET (vbox));
+
+    sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+    /* Update Interval */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+    label = gtk_label_new (_("Update Interval: "));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_UpdateOption = gtk_option_menu_new ();
+    gtk_widget_show (op->m_UpdateOption);
+    gtk_box_pack_start (GTK_BOX (hbox), op->m_UpdateOption, FALSE, FALSE, 0);
+
+    op->m_UpdateMenu = gtk_menu_new ();
+    gtk_option_menu_set_menu (GTK_OPTION_MENU (op->m_UpdateOption),
+                              op->m_UpdateMenu);
+
+    op->m_UpdateMenuItem =
+        gtk_menu_item_new_with_label (_("Fastest (~250ms)"));
+    gtk_widget_show (op->m_UpdateMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_UpdateMenu),
+                           op->m_UpdateMenuItem);
+
+    op->m_UpdateMenuItem = gtk_menu_item_new_with_label (_("Fast (~500ms)"));
+    gtk_widget_show (op->m_UpdateMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_UpdateMenu),
+                           op->m_UpdateMenuItem);
+
+    op->m_UpdateMenuItem =
+        gtk_menu_item_new_with_label (_("Normal (~750ms)"));
+    gtk_widget_show (op->m_UpdateMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_UpdateMenu),
+                           op->m_UpdateMenuItem);
+
+    op->m_UpdateMenuItem = gtk_menu_item_new_with_label (_("Slow (~1s)"));
+    gtk_widget_show (op->m_UpdateMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_UpdateMenu),
+                           op->m_UpdateMenuItem);
+
+    gtk_option_menu_set_history (GTK_OPTION_MENU (op->m_UpdateOption),
+                                 base->m_UpdateInterval);
+
+    g_signal_connect (op->m_UpdateOption, "changed",
+                      G_CALLBACK (UpdateChange), base);
+
+    /* Width */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    if (xfce_panel_plugin_get_orientation (plugin) ==
+            GTK_ORIENTATION_HORIZONTAL)
+        label = gtk_label_new (_("Width:"));
+    else
+        label = gtk_label_new (_("Height:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_Width =
+        gtk_spin_button_new_with_range (10, 128, 1);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->m_Width), base->m_Width);
+    gtk_widget_show (op->m_Width);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_Width), FALSE,
+                        FALSE, 0);
+    g_signal_connect (op->m_Width, "value-changed", G_CALLBACK (SpinChange),
+                      &base->m_Width);
+
+    /* TimeScale */
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    op->m_TimeScale = gtk_check_button_new_with_mnemonic (_("Non-linear time-scale"));
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->m_TimeScale),
+                                  base->m_TimeScale);
+    gtk_widget_show (op->m_TimeScale);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_TimeScale), FALSE,
+                        FALSE, 0);
+    g_signal_connect (op->m_TimeScale, "toggled", G_CALLBACK (TimeScaleChange),
+                      base);
+    gtk_size_group_add_widget (sg, op->m_TimeScale);
+
+    /* Frame */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    op->m_GraphFrame = gtk_check_button_new_with_mnemonic (_("Show frame"));
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->m_GraphFrame),
+                                  base->m_Frame);
+    gtk_widget_show (op->m_GraphFrame);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_GraphFrame), FALSE,
+                        FALSE, 0);
+    g_signal_connect (op->m_GraphFrame, "toggled", G_CALLBACK (FrameChange),
+                      base);
+    gtk_size_group_add_widget (sg, op->m_GraphFrame);
+
+    vbox2 = GTK_BOX (gtk_vbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (vbox2));
+    gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+
+    /* Associate Command */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+   	gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+    label = gtk_label_new (_("Associated command :"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+    op->m_AssociateCommand = gtk_entry_new ();
+    gtk_entry_set_max_length (GTK_ENTRY(op->m_AssociateCommand), 32);
+    gtk_entry_set_text (GTK_ENTRY(op->m_AssociateCommand), base->m_AssociateCommand);
+    gtk_widget_show (op->m_AssociateCommand);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_AssociateCommand), FALSE, FALSE, 0);
+    g_signal_connect (op->m_AssociateCommand, "changed", G_CALLBACK (AssociateCommandChange), base);
+
+    /* Foreground 1 */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox2), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    label = gtk_label_new (_("Color 1:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_FG1 = gtk_button_new ();
+    op->m_ColorDA = gtk_drawing_area_new ();
+
+    gtk_widget_modify_bg (op->m_ColorDA, GTK_STATE_NORMAL,
+                          &base->m_ForeGround1);
+    gtk_widget_set_size_request (op->m_ColorDA, 12, 12);
+    gtk_container_add (GTK_CONTAINER (op->m_FG1), op->m_ColorDA);
+    gtk_widget_show (GTK_WIDGET (op->m_FG1));
+    gtk_widget_show (GTK_WIDGET (op->m_ColorDA));
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_FG1), FALSE, FALSE,
+                        0);
+
+    g_signal_connect (op->m_FG1, "clicked", G_CALLBACK (ChangeColor1), base);
+
+    /* Foreground2 */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox2), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    label = gtk_label_new (_("Color 2:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_FG2 = gtk_button_new ();
+    op->m_ColorDA2 = gtk_drawing_area_new ();
+
+    gtk_widget_modify_bg (op->m_ColorDA2, GTK_STATE_NORMAL,
+                          &base->m_ForeGround2);
+    gtk_widget_set_size_request (op->m_ColorDA2, 12, 12);
+    gtk_container_add (GTK_CONTAINER (op->m_FG2), op->m_ColorDA2);
+    gtk_widget_show (GTK_WIDGET (op->m_FG2));
+    gtk_widget_show (GTK_WIDGET (op->m_ColorDA2));
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_FG2), FALSE, FALSE,
+                        0);
+
+    g_signal_connect (op->m_FG2, "clicked", G_CALLBACK (ChangeColor2), base);
+
+    if (base->m_Mode == 1)
+        gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG2), TRUE);
+
+    /* Foreground3 */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox2), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    label = gtk_label_new (_("Color 3:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+    op->m_FG3 = gtk_button_new ();
+    op->m_ColorDA5 = gtk_drawing_area_new ();
+    gtk_widget_modify_bg (op->m_ColorDA5, GTK_STATE_NORMAL,
+                          &base->m_ForeGround3);
+    gtk_widget_set_size_request (op->m_ColorDA5, 12, 12);
+    gtk_container_add (GTK_CONTAINER (op->m_FG3), op->m_ColorDA5);
+    gtk_widget_show (GTK_WIDGET (op->m_FG3));
+    gtk_widget_show (GTK_WIDGET (op->m_ColorDA5));
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_FG3), FALSE, FALSE,
+                        0);
+    g_signal_connect (op->m_FG3, "clicked", G_CALLBACK (ChangeColor4), base);
+
+    if (base->m_Mode == 0 || base->m_Mode == 2 || base->m_ColorMode == 0)
+        gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG3), FALSE);
+    else
+        gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG3), TRUE);
+
+
+    /* Background */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox2), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    label = gtk_label_new (_("Background:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_BG = gtk_button_new ();
+    op->m_ColorDA3 = gtk_drawing_area_new ();
+
+    gtk_widget_modify_bg (op->m_ColorDA3, GTK_STATE_NORMAL,
+                          &base->m_BackGround);
+    gtk_widget_set_size_request (op->m_ColorDA3, 12, 12);
+    gtk_container_add (GTK_CONTAINER (op->m_BG), op->m_ColorDA3);
+    gtk_widget_show (GTK_WIDGET (op->m_BG));
+    gtk_widget_show (GTK_WIDGET (op->m_ColorDA3));
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (op->m_BG), FALSE, FALSE,
+                        0);
+
+    g_signal_connect (op->m_BG, "clicked", G_CALLBACK (ChangeColor3), base);
+
+    /* Modes */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox2), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+
+    label = gtk_label_new (_("Mode:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_OptionMenu = gtk_option_menu_new ();
+    gtk_widget_show (op->m_OptionMenu);
+    gtk_box_pack_start (GTK_BOX (hbox), op->m_OptionMenu, FALSE, FALSE, 0);
+
+    op->m_Menu = gtk_menu_new ();
+    gtk_option_menu_set_menu (GTK_OPTION_MENU (op->m_OptionMenu), op->m_Menu);
+
+    op->m_MenuItem = gtk_menu_item_new_with_label (_("Normal"));
+    gtk_widget_show (op->m_MenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_Menu), op->m_MenuItem);
+
+    op->m_MenuItem = gtk_menu_item_new_with_label (_("LED"));
+    gtk_widget_show (op->m_MenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_Menu), op->m_MenuItem);
+
+    op->m_MenuItem = gtk_menu_item_new_with_label (_("No history"));
+    gtk_widget_show (op->m_MenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_Menu), op->m_MenuItem);
+
+    gtk_option_menu_set_history (GTK_OPTION_MENU (op->m_OptionMenu),
+                                 base->m_Mode);
+
+    g_signal_connect (op->m_OptionMenu, "changed", G_CALLBACK (ModeChange),
+                      base);
+
+    /* Color mode */
+
+    hbox = GTK_BOX (gtk_hbox_new (FALSE, BORDER));
+    gtk_widget_show (GTK_WIDGET (hbox));
+    gtk_box_pack_start (GTK_BOX (vbox2), GTK_WIDGET (hbox), FALSE, FALSE, 0);
+    label = gtk_label_new (_("Color mode: "));
+    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+    gtk_size_group_add_widget (sg, label);
+    gtk_widget_show (label);
+    gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+
+    op->m_ModeOption = gtk_option_menu_new ();
+    gtk_widget_show (op->m_ModeOption);
+    gtk_box_pack_start (GTK_BOX (hbox), op->m_ModeOption, FALSE, FALSE, 0);
+
+    op->m_ModeMenu = gtk_menu_new ();
+    gtk_option_menu_set_menu (GTK_OPTION_MENU (op->m_ModeOption),
+                              op->m_ModeMenu);
+
+    op->m_ModeMenuItem = gtk_menu_item_new_with_label (_("None"));
+    gtk_widget_show (op->m_ModeMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_ModeMenu),
+                           op->m_ModeMenuItem);
+
+    op->m_ModeMenuItem = gtk_menu_item_new_with_label (_("Gradient"));
+    gtk_widget_show (op->m_ModeMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_ModeMenu),
+                           op->m_ModeMenuItem);
+
+    op->m_ModeMenuItem = gtk_menu_item_new_with_label (_("Fire"));
+    gtk_widget_show (op->m_ModeMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_ModeMenu),
+                           op->m_ModeMenuItem);
+
+    op->m_ModeMenuItem = gtk_menu_item_new_with_label ("cpufreq");
+    gtk_widget_show (op->m_ModeMenuItem);
+    gtk_menu_shell_append (GTK_MENU_SHELL (op->m_ModeMenu),
+                            op->m_ModeMenuItem);
+
+    gtk_option_menu_set_history (GTK_OPTION_MENU (op->m_ModeOption),
+                                 base->m_ColorMode);
+
+    g_signal_connect (op->m_ModeOption, "changed",
+                      G_CALLBACK (ColorModeChange), base);
+
+    gtk_widget_show_all (GTK_WIDGET (hbox));
+
+    op->m_Notebook = gtk_notebook_new ();
+    gtk_container_set_border_width (GTK_CONTAINER (op->m_Notebook),
+                                    BORDER - 2);
+    label = gtk_label_new (_("Appearance"));
+    gtk_notebook_append_page (GTK_NOTEBOOK (op->m_Notebook),
+                              GTK_WIDGET (vbox2), GTK_WIDGET (label));
+    label = gtk_label_new (_("Advanced"));
+    gtk_notebook_append_page (GTK_NOTEBOOK (op->m_Notebook),
+                              GTK_WIDGET (vbox), GTK_WIDGET (label));
+    gtk_widget_show (op->m_Notebook);
+
+    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
+                        GTK_WIDGET (op->m_Notebook), TRUE, TRUE, 0);
+
+    gtk_widget_show (dlg);
 }
 
+gboolean
+UpdateCPU (CPUGraph * base)
+{
+    //fprintf(stderr,"update cpu\n");
+    gint i;
+    base->m_CpuData = cpuData_read();
+    for(i=0; i<base->nrCores; i++){
+      fprintf(stderr,"bar load = %f\n",(gdouble)base->m_CpuData[i+1].load);
+      gtk_progress_bar_set_fraction(
+                                    GTK_PROGRESS_BAR(base->m_pBar[i]),
+                                    (gdouble)base->m_CpuData[i+1].load/CPU_SCALE);
+    }
+
+    if(base->m_TimeScale)
+    {
+        int i = base->m_Values - 1;
+        int j = i + base->m_Values;
+        while(i > 0)
+        {
+            int a, b;
+
+            a = base->m_History[i], b = base->m_History[i-1];
+            if( a < b ) a++;
+            int factor = (i*2);
+            base->m_History[i--] = ( a*(factor-1) + b )/factor;
+
+            a = base->m_History[j], b = base->m_History[j-1];
+            if( a < b ) a++;
+            base->m_History[j--] = ( a*(factor-1) + b )/factor;
+        }
+    } else {
+        memmove (base->m_History + 1
+                , base->m_History
+                , (base->m_Values*2-1)*sizeof(int));
+    }
+    base->m_History[0] = base->m_CpuData[0].load;
+    base->m_History[base->m_Values] = base->m_CpuData[0].scalCurFreq;
+
+    /* Tooltip */
+    UpdateTooltip (base);
+
+    /* Draw the graph. */
+    gtk_widget_queue_draw (base->m_DrawArea);
+    return TRUE;
+}
+
 void
 DrawGraph (CPUGraph * base)
 {
@@ -339,22 +851,21 @@
 
     gdk_draw_rectangle (da->window, bg, TRUE, 0, 0, w, h);
 
-    /*fprintf(stderr, "mode selected %d\n", base->m_Mode);*/
-
     if (base->m_Mode == 0)
     {
-      drawGraphNormal(base, fg1, da, w, h);
+      drawGraphMode0(base, fg1, da, w, h);
     }
     else if (base->m_Mode == 1)
     {
-      drawGraphLED(base, fg1, fg2, da, w, h);
+      drawGraphMode1(base, fg1, fg2, da, w, h);
     }
     else if (base->m_Mode == 2)
     {
-      drawGraphNoHistory(base, fg1, fg2, da, w, h);
+      drawGraphMode2(base, fg1, fg2, da, w, h);
     }
-    else if (base->m_Mode == 3){
-      drawGraphGrid(base, fg1, fg2, da, w, h);
+    else if (base->m_Mode == 4)
+    {
+      drawGraphMode4(base, fg1, da, w, h);
     }
 
     g_object_unref (fg2);
@@ -400,8 +911,6 @@
     base->m_TimeoutID = g_timeout_add (update, (GtkFunction) UpdateCPU, base);
 
     UserSetSize (base);
-
-    fprintf(stderr, "m_Width %d\n", base->m_Width);
     SetHistorySize (base, base->m_Width);
 }
 
@@ -513,44 +1022,57 @@
 void
 SetHistorySize (CPUGraph * base, int size)
 {
-    gint i;
-    cpuLoadData *data = cpuLoadMon_read();
-    float usage = data[0].value;
-
+    int i;
     base->m_History =
-        (float *) realloc (base->m_History, size * sizeof (float));
+        (long *) realloc (base->m_History, 2 * size * sizeof (long));
 
-    for (i = size - 1; i >= 0; i--)
+    base->m_CpuData = cpuData_read();
+    base->m_CpuData[0].pUsed = 0;
+    base->m_CpuData[0].pTotal = 0;
+    int usage = base->m_CpuData[0].load;
+    for (i = size - 1; i >= base->m_Values; i--)
     {
-      base->m_History[i] = usage;
+        base->m_History[i] = usage;
+        base->m_History[i+size] = base->m_CpuData[0].scalCurFreq;
     }
     base->m_Values = size;
 
 }
 
 void
-SetSensitive(CPUGraph *base, GtkWidget *fgA, GtkWidget *fgB,
-             gboolean flag1, gboolean flag2){
-  if (base->m_ColorMode > 0)
-    gtk_widget_set_sensitive (GTK_WIDGET (fgA), flag1);
-  else
-    gtk_widget_set_sensitive (GTK_WIDGET (fgA), !flag1);
-  gtk_widget_set_sensitive (GTK_WIDGET (fgB), flag2);
-}
-
-void
 ModeChange (GtkOptionMenu * om, CPUGraph * base)
 {
-  base->m_Mode = gtk_option_menu_get_history (om);
-  if (base->m_Mode == 0){
-    SetSensitive(base, base->m_Options.m_FG2, base->m_Options.m_FG3, TRUE, FALSE);
-  }
-  else if (base->m_Mode == 1){
-    SetSensitive(base, base->m_Options.m_FG3, base->m_Options.m_FG2, TRUE, TRUE);
-  }
-  else if (base->m_Mode == 2){
-    SetSensitive(base, base->m_Options.m_FG2, base->m_Options.m_FG3, TRUE, FALSE);
-  }
+    base->m_Mode = gtk_option_menu_get_history (om);
+    if (base->m_Mode == 0)
+    {
+        if (base->m_ColorMode > 0)
+            gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG2),
+                                      TRUE);
+        else
+            gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG2),
+                                      FALSE);
+        gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG3), FALSE);
+    }
+    else if (base->m_Mode == 1)
+    {
+        if (base->m_ColorMode > 0)
+            gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG3),
+                                      TRUE);
+        else
+            gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG3),
+                                      FALSE);
+        gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG2), TRUE);
+    }
+    else if (base->m_Mode == 2)
+    {
+        if (base->m_ColorMode > 0)
+            gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG2),
+                                      TRUE);
+        else
+            gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG2),
+                                      FALSE);
+        gtk_widget_set_sensitive (GTK_WIDGET (base->m_Options.m_FG3), FALSE);
+    }
 }
 void
 UpdateChange (GtkOptionMenu * om, CPUGraph * base)

Modified: xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.h
===================================================================
--- xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.h	2007-12-07 08:52:30 UTC (rev 3674)
+++ xfce4-cpugraph-plugin/trunk/panel-plugin/cpu.h	2007-12-07 08:55:00 UTC (rev 3675)
@@ -1,26 +1,3 @@
-/*  cpu.h
- *  Part of xfce4-cpugraph-plugin
- *
- *  Copyright (c) Alexander Nordfelth <alex.nordfelth at telia.com>
- *  Copyright (c) gatopeich <gatoguan-os at yahoo.com>
- *  Copyright (c) 2007-2008 Angelo Arrifano <miknix at gmail.com>
- *  Copyright (c) 2007-2008 Lidiriel <lidiriel at coriolys.org>
- *
- *  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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- 
 #ifndef __XFCE_CPU_H__
 #define __XFCE_CPU_H__
 
@@ -39,7 +16,7 @@
 #include <libxfce4panel/xfce-panel-plugin.h>
 #include <libxfce4panel/xfce-hvbox.h>
 
-#include "cpu_os.h"
+#include "os.h"
 
 
 #define BORDER  8
@@ -92,34 +69,33 @@
 	GtkWidget *m_FrameWidget;
 	GtkWidget *m_DrawArea;
 	GtkWidget *m_OptionsDialog;
-	GtkWidget *m_Box;
-	GtkWidget **m_pBar;
+  GtkWidget *m_Box;
+  GtkWidget **m_pBar;
 	SOptions m_Options;
 
-	int m_UpdateInterval; // Number of ms between updates.
+  int m_UpdateInterval; // Number of ms between updates.
 	int m_TimeScale; // Wether to use non-linear time scale.
-	int m_Width; // The width of the plugin.
-	int m_Mode; // Eventual mode of the plugin.
+  int m_Width; // The width of the plugin.
+  int m_Mode; // Eventual mode of the plugin.
 	int m_ColorMode;
 	int m_Frame;
-	gchar * m_AssociateCommand;
-	guint nrCores; // Number of cores (not including total cpu)
+	gchar  *m_AssociateCommand;
+  guint nrCores; // Number of cores (not including total cpu)
 
-	GdkColor m_ForeGround1; // Inactive color.
-	GdkColor m_ForeGround2; // Active color.
+  GdkColor m_ForeGround1; // Inactive color.
+  GdkColor m_ForeGround2; // Active color.
 	GdkColor m_ForeGround3;
-	GdkColor m_BackGround; // Background color.
+  GdkColor m_BackGround; // Background color.
 
 	GtkTooltips *m_Tooltip; // Eventual tooltip.
 
 	guint m_TimeoutID; // Timeout ID for the tooltip;
-	long m_CPUUsage;
-	float *m_History;
+	//long m_CPUUsage;
+	long *m_History;
 	int m_Values;
-
 	int m_Orientation;
+  CpuData *m_CpuData;
 
-
 }CPUGraph;
 
 CPUGraph *CreateControl (XfcePanelPlugin *plugin);
@@ -145,7 +121,6 @@
 void ChangeColor5 (GtkButton *button, CPUGraph *base);
 void ChangeColor (int color, CPUGraph *base);
 void SpinChange (GtkSpinButton *sb, int *value);
-void SetSensitive (CPUGraph *base, GtkWidget *fgA, GtkWidget *fgB, gboolean flag1, gboolean flag2);
 void UpdateChange (GtkOptionMenu *om, CPUGraph *base);
 void ModeChange (GtkOptionMenu *om, CPUGraph *base);
 void ApplyChanges (CPUGraph *base);

Modified: xfce4-cpugraph-plugin/trunk/panel-plugin/mode.c
===================================================================
--- xfce4-cpugraph-plugin/trunk/panel-plugin/mode.c	2007-12-07 08:52:30 UTC (rev 3674)
+++ xfce4-cpugraph-plugin/trunk/panel-plugin/mode.c	2007-12-07 08:55:00 UTC (rev 3675)
@@ -1,60 +1,68 @@
-/*  mode.c
- *  Part of xfce4-cpugraph-plugin
- *
- *  Copyright (c) Alexander Nordfelth <alex.nordfelth at telia.com>
- *  Copyright (c) gatopeich <gatoguan-os at yahoo.com>
- *  Copyright (c) 2007-2008 Angelo Arrifano <miknix at gmail.com>
- *  Copyright (c) 2007-2008 Lidiriel <lidiriel at coriolys.org>
- *
- *  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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
 #include "mode.h"
 
-/*** MODE 0 : Normal ***/
-void drawGraphNormal (CPUGraph *base, GdkGC *fg1, GtkWidget *da, int w, int h){
+/*** MODE 0 ***/
+void drawGraphMode0 (CPUGraph *base, GdkGC *fg1, GtkWidget *da, int w, int h){
   int x, y;
 
-  //fprintf(stderr, "usage %f\n", base->m_History[0]);
   for (x = w; x >= 0; x--)
   {
-    long usage = h * base->m_History[w - x];
+    long usage = h * base->m_History[w - x] / CPU_SCALE;
 
     if(usage == 0) continue;
 
-    if (base->m_ColorMode == 0) { /* none color mode */
+    if (base->m_ColorMode == 0) {
       gdk_gc_set_rgb_fg_color (fg1, &base->m_ForeGround1);
-      gdk_draw_line (da->window, fg1, x, h-usage, x, h-1);
+
+      if(base->m_Frame)
+        gdk_draw_line (da->window, fg1, x+1, h+1-usage, x+1, h);
+      else
+        gdk_draw_line (da->window, fg1, x, h-usage, x, h-1);
     }
-    if(base->m_ColorMode == 1){ /* color mode == 1 : gradient */
+    else if (base->m_ColorMode == 3) /* cpu freq. based */
+    {
+      GdkColor color;
+      double t = (double) (base->m_History[base->m_Values+ w - x] - base->m_CpuData[0].scalMinFreq)
+        / (base->m_CpuData[0].scalMaxFreq - base->m_CpuData[0].scalMinFreq);
+
+      color.red = _lerp (t, base->m_ForeGround1.red,
+                         base->m_ForeGround2.red);
+      color.green = _lerp (t, base->m_ForeGround1.green,
+                           base->m_ForeGround2.green);
+      color.blue = _lerp (t, base->m_ForeGround1.blue,
+                          base->m_ForeGround2.blue);
+      gdk_gc_set_rgb_fg_color (fg1, &color);
+
+      if(base->m_Frame)
+        gdk_draw_line (da->window, fg1
+                       , x+1, h+1-usage, x+1, h);
+      else
+        gdk_draw_line (da->window, fg1
+                       , x, h-usage, x, h-1);
+
+    }
+    else /* 1 or 2 */
+    {
       int tmp = 0;
-      for (y = h; y >= h - usage; y--)
+      int length = h - (h - usage);
+      for (y = h; y >= h - usage; y--, tmp++)
       {
-        GdkColor color;
-        double t = tmp / (double) (h);
-        color.red =
-          _lerp (t, base->m_ForeGround1.red,
-                 base->m_ForeGround2.red);
-        color.green =
-          _lerp (t, base->m_ForeGround1.green,
-                 base->m_ForeGround2.green);
-        color.blue =
-          _lerp (t, base->m_ForeGround1.blue,
-                 base->m_ForeGround2.blue);
-        gdk_gc_set_rgb_fg_color (fg1, &color);
-        tmp++;
+        if (base->m_ColorMode > 0)
+        {
+          GdkColor color;
+          double t =
+            (base->m_ColorMode == 1) ? (tmp / (double) (h)) :
+            (tmp / (double) (length));
+          color.red =
+            _lerp (t, base->m_ForeGround1.red,
+                   base->m_ForeGround2.red);
+          color.green =
+            _lerp (t, base->m_ForeGround1.green,
+                   base->m_ForeGround2.green);
+          color.blue =
+            _lerp (t, base->m_ForeGround1.blue,
+                   base->m_ForeGround2.blue);
+          gdk_gc_set_rgb_fg_color (fg1, &color);
+        }
         gdk_draw_point (da->window, fg1, x, y);
       }
     }
@@ -62,25 +70,31 @@
 }
 
 
-/*** MODE 1 : LED ***/
-void drawGraphLED (CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h){
+/*** MODE 1 ***/
+void drawGraphMode1 (CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h){
   int nrx = (w + 1) / 3.0;
   int nry = (h + 1) / 2.0;
+  float tstep = nry / CPU_SCALE;
   int x, y;
 
-  gdk_gc_set_rgb_fg_color (fg1, &base->m_ForeGround1);
-  gdk_gc_set_rgb_fg_color (fg2, &base->m_ForeGround2);
-
   for (x = nrx ; x >= 0; x--)
   {
+    float usage = base->m_History[nrx - x] * tstep;
     int tmp = 0;
-    int limit = nry * (1 - base->m_History[nrx - x]);
+    int length = usage;
 
+    gdk_gc_set_rgb_fg_color (fg2, &base->m_ForeGround2);
     for (y = nry; y >= 0; y--)
     {
-      if (base->m_ColorMode == 1){// color mode == 1 gradient
+      GdkGC *draw = fg2;
+
+      if (base->m_ColorMode > 0)
+      {
         GdkColor color;
-        double t = tmp / (double) (nry);
+        double t =
+          (base->m_ColorMode == 1) ?
+          (tmp / (double) (nry)) :
+          (tmp / (double) (length));
         color.red =
           _lerp (t, base->m_ForeGround2.red,
                  base->m_ForeGround3.red);
@@ -90,31 +104,33 @@
         color.blue =
           _lerp (t, base->m_ForeGround2.blue,
                  base->m_ForeGround3.blue);
-        gdk_gc_set_rgb_fg_color (fg2, &color);
+        gdk_gc_set_rgb_fg_color (fg1, &color);
         tmp++;
+        draw = fg1;
       }
+
       gdk_draw_rectangle (da->window,
-                          (y > limit) ? fg1 : fg2,
+                          draw,
                           TRUE, x * 3, y * 2, 2, 1);
     }
   }
 }
 
-/*** MODE 2 : No History ***/
-void drawGraphNoHistory(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h){
-  int y, tmp, limit;
-  long usage = h * base->m_History[0];
+/*** MODE 2 ***/
+void drawGraphMode2(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h){
+  int y;
+  long usage = h * base->m_History[0] / CPU_SCALE;
+  int tmp = 0;
+  int length = usage;
 
-  if (base->m_ColorMode == 0) { /* none color mode */
-    gdk_gc_set_rgb_fg_color (fg1, &base->m_ForeGround1);
-    /* gdk_draw_rectangle(xMin, yMin, xLength, yLength) origin=top-left */
-    gdk_draw_rectangle (da->window, fg1, TRUE, 0, h-usage, w, usage);
-  }else if(base->m_ColorMode == 1){ /* color mode == 1 : gradient */
-    tmp = 0;
-    limit = h-1-usage;
-    for (y = h-1; y >= limit; y--){
+  for (y = h; y >= h - usage; y--)
+  {
+    if (base->m_ColorMode > 0)
+    {
       GdkColor color;
-      double t = tmp / (double) (h);
+      double t =
+        (base->m_ColorMode == 1) ? (tmp / (double) (h)) :
+        (tmp / (double) (length));
       color.red =
         _lerp (t, base->m_ForeGround1.red,
                base->m_ForeGround2.red);
@@ -124,39 +140,20 @@
       color.blue =
         _lerp (t, base->m_ForeGround1.blue,
                base->m_ForeGround2.blue);
-      gdk_gc_set_rgb_fg_color (fg1, &color);
+      gdk_gc_set_rgb_fg_color (fg2, &color);
       tmp++;
-      gdk_draw_line (da->window, fg1, 0, y, w-1, y);
     }
+    gdk_draw_line (da->window,
+                   (base->m_ColorMode > 0) ? fg2 : fg1,
+                   0, y, w, y);
   }
 }
 
-/*** MODE 3 : Grid ***/
-void drawGraphGrid (CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h){
-  int nrx = w / 6.0;
-  int nry = h / 4.0;
-  int x, y;
-
-  point last, current;
-  last.x = -1;
-
-  /* draw grid */
-  gdk_gc_set_rgb_fg_color (fg1, &base->m_ForeGround1);
-  for(x = nrx; x >= 0; x--){
-    gdk_draw_line (da->window, fg1, x*6, 0, x*6, h);
-  }
-  for(y = nry; y>=0; y--){
-    gdk_draw_line (da->window, fg1, 0, y*4, w, y*4);
-  }
-
-  /* draw data */
-  gdk_gc_set_rgb_fg_color (fg2, &base->m_ForeGround2);
-  for (x = w; x >= 0; x--)
-  {
-    current.x = x;
-    current.y = (h-1) * (1-base->m_History[w - x]);
-    if(last.x == -1) last = current;
-    gdk_draw_line (da->window, fg2, current.x, current.y, last.x, last.y);
-    last = current;
-    }
+/*** MODE 4 ***/
+void drawGraphMode4(CPUGraph *base, GdkGC *fg1, GtkWidget *da, int w, int h){
+  gdk_draw_rectangle (da->window,
+                      fg1,
+                      TRUE,
+                      0, (h - (base->m_History[0]*h/CPU_SCALE)),
+                      w, (base->m_History[0]*h/CPU_SCALE));
 }

Modified: xfce4-cpugraph-plugin/trunk/panel-plugin/mode.h
===================================================================
--- xfce4-cpugraph-plugin/trunk/panel-plugin/mode.h	2007-12-07 08:52:30 UTC (rev 3674)
+++ xfce4-cpugraph-plugin/trunk/panel-plugin/mode.h	2007-12-07 08:55:00 UTC (rev 3675)
@@ -1,40 +1,11 @@
-/*  mode.h
- *  Part of xfce4-cpugraph-plugin
- *
- *  Copyright (c) Alexander Nordfelth <alex.nordfelth at telia.com>
- *  Copyright (c) gatopeich <gatoguan-os at yahoo.com>
- *  Copyright (c) 2007-2008 Angelo Arrifano <miknix at gmail.com>
- *  Copyright (c) 2007-2008 Lidiriel <lidiriel at coriolys.org>
- *
- *  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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
 #ifndef __XFCE_MODE_H__
 #define __XFCE_MODE_H__
 
 #include "cpu.h"
 
-typedef struct {
-  long x;
-  long y;
-} point;
+void drawGraphMode0(CPUGraph *base, GdkGC *fg1, GtkWidget *da, int w, int h);
+void drawGraphMode1(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h);
+void drawGraphMode2(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h);
+void drawGraphMode4(CPUGraph *base, GdkGC *fg1, GtkWidget *da, int w, int h);
 
-
-void drawGraphNormal(CPUGraph *base, GdkGC *fg1, GtkWidget *da, int w, int h);
-void drawGraphLED(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h);
-void drawGraphNoHistory(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h);
-void drawGraphGrid(CPUGraph *base, GdkGC *fg1, GdkGC *fg2, GtkWidget *da, int w, int h);
-
 #endif

Added: xfce4-cpugraph-plugin/trunk/panel-plugin/os.c
===================================================================
--- xfce4-cpugraph-plugin/trunk/panel-plugin/os.c	                        (rev 0)
+++ xfce4-cpugraph-plugin/trunk/panel-plugin/os.c	2007-12-07 08:55:00 UTC (rev 3675)
@@ -0,0 +1,314 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "cpu.h"
+
+#if defined (__linux__)
+#define PROC_STAT "/proc/stat"
+#define SYS_DEVICE "/sys/devices/system/cpu/cpu"
+#define SCAL_CUR_FREQ "/cpufreq/scaling_cur_freq"
+#define SCAL_MIN_FREQ "/cpufreq/scaling_min_freq"
+#define SCAL_MAX_FREQ "/cpufreq/scaling_max_freq"
+#define PROCMAXLNLEN 256 /* should make it */
+#endif
+
+CpuData *cpudata = NULL;
+int nrCpus = 0;
+
+void cpuData_free(){
+  free(cpudata);
+  cpudata = NULL;
+  nrCpus = 0;
+}
+
+#if defined (__linux__)
+int cpuData_init(){
+  //fprintf(stderr,"cpuData_init\n");
+  FILE *fstat = NULL;
+  char cpuStr[PROCMAXLNLEN];
+  int i, cpuNr = -1;
+  /* Check if previously initalized */
+	if(cpudata != NULL) return(-2);
+
+	/* Open proc stat file */
+	if(!(fstat = fopen(PROC_STAT, "r"))) return(-1);
+
+	/* Read each cpu line at time */
+	do{
+    if(!fgets(cpuStr, PROCMAXLNLEN, fstat)) return(cpuNr);
+		cpuNr++;
+	}
+	while(strncmp(cpuStr, "cpu", 3) == 0);
+	/* Alloc storage for cpu data stuff */
+	cpudata = (CpuData *) calloc(cpuNr, sizeof(CpuData));
+	if(cpudata == NULL) return(-3);
+
+  /* init frequency */
+  for(i=cpuNr-1; i>=0; i--){
+    cpudata[i].scalCurFreq = 0;
+    cpudata[i].scalMinFreq = 0;
+    cpudata[i].scalMaxFreq = -1;
+  }
+
+	fclose(fstat);
+	return(nrCpus=cpuNr);
+}
+
+CpuData *cpuData_read(){
+  //fprintf(stderr,"cpuData_read\n");
+  FILE *fStat = NULL;
+	char cpuStr[PROCMAXLNLEN];
+	unsigned long user, nice, system, idle, used, total;
+  unsigned long iowait=0, irq=0, softirq=0;
+	int cpuNr = 0;
+
+  /* Check if callable */
+	if((cpudata == NULL) || (nrCpus == 0)) return(NULL);
+
+	/* Open proc stat file */
+	if(!(fStat = fopen(PROC_STAT, "r"))) return(NULL);
+
+  /* Read each cpu line at time */
+	do{
+		if(!fgets(cpuStr, PROCMAXLNLEN, fStat)) return(cpudata);
+		if(sscanf(cpuStr, "%*s %ld %ld %ld %ld %ld %ld %ld",
+              &user, &nice, &system, &idle, &iowait, &irq, &softirq) < 7)
+      iowait = irq = softirq = 0;
+    used = user + nice + system + irq + softirq;
+    total = used + idle + iowait;
+		if((total - cpudata[cpuNr].pTotal) != 0){
+			cpudata[cpuNr].load = CPU_SCALE * (float)(used - cpudata[cpuNr].pUsed)
+				/ (float)(total - cpudata[cpuNr].pTotal);
+		}
+		else
+		{
+			cpudata[cpuNr].load = 0;
+		}
+		cpudata[cpuNr].pUsed = used;
+		cpudata[cpuNr].pTotal = total;
+    setFrequencyScaling(cpuNr);
+		cpuNr++;
+  }
+	while((cpuNr < nrCpus) && (strncmp(cpuStr, "cpu", 3) == 0));
+
+	fclose(fStat);
+
+  return cpudata;
+}
+
+/* read frequency value for the cpu N (cpuId) */
+void setFrequencyScaling(int cpuId){
+  //fprintf(stderr,"set frequency scaling\n");
+  char *fileName;
+  if( -1 != cpudata[cpuId].scalMaxFreq){
+    //fprintf(stderr,"read current frequence\n");
+    FILE *fp;
+    if( cpudata[cpuId].scalMaxFreq ){
+      if(sscanf(fileName, "%s%i%s", SYS_DEVICE, cpuId, SCAL_CUR_FREQ)){
+        fp = fopen(fileName, "r");
+        if( NULL != fp ){
+          fscanf(fp, "%d", &cpudata[cpuId].scalCurFreq);
+          fclose(fp);
+        }
+      }
+    } else {
+      cpudata[cpuId].scalMaxFreq = -1;
+      if(sscanf(fileName, "%s%i%s", SYS_DEVICE, cpuId, SCAL_MIN_FREQ)){
+        FILE *fp;
+        fp = fopen(fileName, "r");
+        if( NULL != fp ){
+          if (1 == fscanf(fp, "%d", &cpudata[cpuId].scalMinFreq) ){
+            fclose(fp);
+            free(fileName);
+            if(sscanf(fileName, "%s%i%s", SYS_DEVICE, cpuId, SCAL_MAX_FREQ)){
+              fp = fopen(fileName, "r");
+              if( NULL != fp){
+                fscanf(fp, "%d", &cpudata[cpuId].scalMaxFreq);
+                if( cpudata[cpuId].scalMaxFreq < 1 ) cpudata[cpuId].scalMaxFreq = -1;
+                fclose(fp);
+              }
+            }
+          } else {
+            fclose(fp);
+          }
+        }
+      }
+    }
+    free(fileName);
+  }
+}
+
+
+#elif defined (__FreeBSD__)
+void cpuData_init(){
+  int i, cpuNr = -1;
+
+  /* Check if previously initalized */
+	if(cpudata != NULL) return(-2);
+
+  cpuNr = 1;
+
+	/* Alloc storage for cpu data stuff */
+	cpudata = (CpuData *) calloc(cpuNr, sizeof(CpuData));
+	if(cpudata == NULL) return(-3);
+
+  /* init frequency */
+  for(i=cpuNr-1; i>=0; i--){
+    cpudata[i].scalCurFreq = 0;
+    cpudata[i].scalMinFreq = 0;
+    cpudata[i].scalMaxFreq = -1;
+  }
+
+	fclose(fstat);
+	return(nrCpus=cpuNr);
+}
+
+CpuData *cpuData_read(){
+	unsigned long user, nice, sys, bsdidle, idle;
+	unsigned long used, total;
+	long cp_time[CPUSTATES];
+	size_t len = sizeof (cp_time);
+
+	long usage;
+
+	if (sysctlbyname ("kern.cp_time", &cp_time, &len, NULL, 0) < 0)
+	{
+		printf ("Cannot get kern.cp_time.\n");
+		return -1;
+	}
+
+	user = cp_time[CP_USER];
+	nice = cp_time[CP_NICE];
+	sys = cp_time[CP_SYS];
+	bsdidle = cp_time[CP_IDLE];
+	idle = cp_time[CP_IDLE];
+
+	used = user+nice+sys;
+	total = used+bsdidle;
+	if ((total - cpudata[0].pTotal) != 0)
+		cpudata[0].pTotal = (CPU_SCALE.0 * (used - cpudata[0].pTotal))/(total - cpudata[0].pTotal);
+	else
+		cpudata[0].pTotal = 0;
+
+	cpudata[0].pUsed = used;
+	cpudata[0].pTotal = total;
+
+  return cpudata;
+}
+
+#elif defined (__NetBSD__)
+void cpuData_init(){
+  int i, cpuNr = -1;
+
+  /* Check if previously initalized */
+	if(cpudata != NULL) return(-2);
+
+  cpuNr = 1;
+
+	/* Alloc storage for cpu data stuff */
+	cpudata = (CpuData *) calloc(cpuNr, sizeof(CpuData));
+	if(cpudata == NULL) return(-3);
+
+  /* init frequency */
+  for(i=cpuNr-1; i>=0; i--){
+    cpudata[i].scalCurFreq = 0;
+    cpudata[i].scalMinFreq = 0;
+    cpudata[i].scalMaxFreq = -1;
+  }
+
+	fclose(fstat);
+	return(nrCpus=cpuNr);
+}
+
+
+CpuData *cpuData_read(){
+	long user, nice, sys, bsdidle, idle;
+	long used, total, usage;
+	static int mib[] = {CTL_KERN, KERN_CP_TIME };
+	u_int64_t cp_time[CPUSTATES];
+	size_t len = sizeof (cp_time);
+
+	if (sysctl (mib, 2, &cp_time, &len, NULL, 0) < 0)
+	{
+		printf ("Cannot get kern.cp_time\n");
+		return -1;
+	}
+
+	user = cp_time[CP_USER];
+	nice = cp_time[CP_NICE];
+	sys = cp_time[CP_SYS];
+	bsdidle = cp_time[CP_IDLE];
+	idle = cp_time[CP_IDLE];
+
+	used = user+nice+sys;
+	total = used+bsdidle;
+
+	if (total - cpudata[0].pTotal != 0)
+		usage = (CPU_SCALE * (double)(used - cpudata[0].pTotal))/(double)(total - cpudata[0].pTotal);
+	else
+		usage = 0;
+
+	cpudata[0].pUsed = used;
+	cpudata[0].pTotal = total;
+
+  return cpudata;
+}
+
+#elif defined (__OpenBSD_)
+void cpuData_init(){
+  int i, cpuNr = -1;
+
+  /* Check if previously initalized */
+	if(cpudata != NULL) return(-2);
+
+  cpuNr = 1;
+
+	/* Alloc storage for cpu data stuff */
+	cpudata = (CpuData *) calloc(cpuNr, sizeof(CpuData));
+	if(cpudata == NULL) return(-3);
+
+  /* init frequency */
+  for(i=cpuNr-1; i>=0; i--){
+    cpudata[i].scalCurFreq = 0;
+    cpudata[i].scalMinFreq = 0;
+    cpudata[i].scalMaxFreq = -1;
+  }
+
+	fclose(fstat);
+	return(nrCpus=cpuNr);
+}
+
+
+CpuData *cpuData_read(){
+  unsigned long user, nice, sys, bsdidle, idle;
+  unsigned long used, total, usage;
+  static int mib[] = {CTL_KERN, KERN_CP_TIME };
+  u_int64_t cp_time[CPUSTATES];
+  size_t len = sizeof (cp_time);
+  if (sysctl (mib, 2, &cp_time, &len, NULL, 0) < 0){
+    printf ("Cannot get kern.cp_time\n");
+    return -1;
+  }
+
+	user = cp_time[CP_USER];
+	nice = cp_time[CP_NICE];
+  sys = cp_time[CP_SYS];
+  bsdidle = cp_time[CP_INTR];
+  idle = cp_time[CP_IDLE];
+
+  used = user+nice+sys;
+  total = used+bsdidle;
+
+  if (total - cpudata[0].pTotal != 0)
+		usage = (CPU_SCALE * (double)(used - cpudata[0].pTotal))/(double)(total - cpudata[0].pTotal);
+	else
+    usage = 0;
+  cpudata[0].pUsed = used;
+  cpudata[0].pTotal = total;
+
+  return cpudata;
+}
+#else
+#error "You're OS is not supported."
+#endif


Property changes on: xfce4-cpugraph-plugin/trunk/panel-plugin/os.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: xfce4-cpugraph-plugin/trunk/panel-plugin/os.h
===================================================================
--- xfce4-cpugraph-plugin/trunk/panel-plugin/os.h	                        (rev 0)
+++ xfce4-cpugraph-plugin/trunk/panel-plugin/os.h	2007-12-07 08:55:00 UTC (rev 3675)
@@ -0,0 +1,54 @@
+#ifndef __OS_H__
+#define __OS_H__
+
+#include <stdio.h>
+
+#if defined (__FreeBSD__)
+#include <osreldate.h>
+#include <sys/types.h>
+#if __FreeBSD_version < 500101
+#include <sys/dkstat.h>
+#else
+#include <sys/resource.h>
+#endif
+#include <sys/sysctl.h>
+#include <devstat.h>
+#include <fcntl.h>
+#include <nlist.h>
+#endif
+
+#if defined (__NetBSD__)
+#include <sys/param.h>
+#include <sys/sched.h>
+#include <sys/sysctl.h>
+#include <fcntl.h>
+#include <nlist.h>
+#endif
+
+#if defined (__OpenBSD__)
+#include <sys/param.h>
+#include <sys/sched.h>
+#include <sys/sysctl.h>
+#include <sys/dkstat.h>
+#include <fcntl.h>
+#include <nlist.h>
+#endif
+
+#define CPU_SCALE 100000
+
+typedef struct s_cpuData{
+  float         load; /* cpu utilization */
+  unsigned long pUsed; /* Previous value of used cpu time */
+	unsigned long pTotal; /* Previous value of total cpu time */
+  long scalCurFreq;
+  long scalMinFreq;
+  long scalMaxFreq;
+} CpuData;
+
+
+int cpuData_init();
+void cpuData_free();
+CpuData *cpuData_read();
+void setFrequencyScaling(int cpuId);
+
+#endif


Property changes on: xfce4-cpugraph-plugin/trunk/panel-plugin/os.h
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the Goodies-commits mailing list