File: ibam-krell.cpp

package info (click to toggle)
ibam 1%3A0.4-5
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 156 kB
  • ctags: 91
  • sloc: cpp: 699; makefile: 104; sh: 33
file content (224 lines) | stat: -rw-r--r-- 7,727 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
/* demo2.c	- requires GKrellM 1.2.0 or better
|		gcc -fPIC `gtk-config --cflags` `imlib-config --cflags-gdk` -c demo2.c
|		gcc -shared -Wl -o demo2.so demo2.o
|		gkrellm -p demo2.so
*/

#include "ibam.hpp"

extern "C" {

#define private gkrell_private
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
#include <gkrellm2/gkrellm.h>

  /* CONFIG_NAME would be the name in the configuration tree, but this demo
  |  does not have a config.  See demo1.c for that.
  */
#define	CONFIG_NAME	"Ibam"

  /* STYLE_NAME will be the theme subdirectory for custom images for this
  |  plugin and it will be the gkrellmrc style name for custom settings.
  */
#define	STYLE_NAME	"ibam"

  /* This demo just makes up some data for the krell to show.
  */
#define	KRELL_FULL_SCALE	30

	static GkrellmMonitor	*monitor;
	static GkrellmPanel	*panel;
	static gint		style_id;
	static GkrellmKrell	*krell;
	static GkrellmDecal   *decal_text;

static void
update_plugin()
    {
	if (GK.second_tick)
		{
		   static ibam a;
		   static char buffer[80];
		   char *l;
		   static char *bat="batt";
		   static char *charge="chrg";
		   static char *full="full";
		   static long lasttime=time(NULL);
		   a.update();
		   if(a.valid())
		   {
		      int updateadd=0;
		      
		      if(time(NULL)<lasttime+20) 
   		      a.update_statistics();
   		   else
   		      a.ignore_statistics();
   		   
   		   lasttime=time(NULL);
   		   
		      a.save();
   		   gkrellm_update_krell(panel, krell, a.percent_battery()*KRELL_FULL_SCALE/100);
   		   int minutes;
   		   l=bat;
   		   if(a.onBattery())
   		      minutes=(a.seconds_left_battery_adaptive()
   		              +a.seconds_battery_correction()+30)/60;
   		   else if(a.charging())
   		   {
   		      minutes=(a.seconds_left_charge_adaptive()
   		              +a.seconds_charge_correction()+30)/60;
   		      l=charge;
   		      updateadd=10000;
   		   } else
   		   {
   		      minutes=a.seconds_left_battery()/60;
               l=full;
               updateadd=20000;
            }
            if(minutes<0)
               minutes=0;
   		   sprintf(buffer,"%s %2d:%02d",l,minutes/60,minutes%60);
   	      gkrellm_draw_decal_text(panel,decal_text,buffer,minutes+updateadd);


		   /* Updating a krell (or drawing a decal) draws only into local
		   |  pixmaps.  After all krells and decals are "drawn", they must be
		   |  really drawn to the screen with gkrellm_draw_panel_layers().
		   */
		      gkrellm_draw_panel_layers(panel);
		   } else
		   {
		      gkrellm_update_krell(panel, krell, 0);
		      gkrellm_draw_decal_text(panel,decal_text,"no data",99999);
		      gkrellm_draw_panel_layers(panel);
   		}   
		}
	}

static gint
panel_expose_event(GtkWidget *widget, GdkEventExpose *ev)
    {
    gdk_draw_pixmap(widget->window,
            widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
            panel->pixmap, ev->area.x, ev->area.y, ev->area.x, ev->area.y,
            ev->area.width, ev->area.height);
    return FALSE;
	}

static void
create_plugin(GtkWidget *vbox, gint first_create)
	{
		GkrellmStyle			*style;
		GkrellmTextstyle   *textstyle;
		GkrellmPiximage	*krell_image;

	/* This create_plugin() routine is a create event routine which
	|  will be called when GKrellM is re-built at every theme or horizontal
	|  size change.  The idea is to allocate data structures and do some
	|  initialization only once (at first_create) and do decal and krell
	|  creation and plugin local image loading each time so theme changes
	|  will be picked up.
	|  Before this routine is called during the re-build, all of the krells
	|  and decals you previously created will have been destroyed.  However,
	|  for cases where a plugin wants to manage the decal and krell lists,
	|  it is possible to prevent the automatic krell and decal destruction.
	*/
	if (first_create)
		panel = gkrellm_panel_new0();

	/* Each plugin that has obtained a style_id (in init_plugin()) can use
	|  a default krell that may have been custom themed.  Additional custom
	|  krells may be created, but here we just use the default krell.  To
	|  create a kell, use our style (which has information about the krell
	|  depth, hot spot, and y offset into the panel), and our krell image.
	*/
	style = gkrellm_meter_style(style_id);
	krell_image = gkrellm_krell_meter_piximage(style_id);
	krell = gkrellm_create_krell(panel, krell_image, style);
	
	textstyle = gkrellm_meter_textstyle(style_id);
	
	decal_text = gkrellm_create_decal_text(panel, "IBAM", textstyle, style, -1, -1, -1);

	/* The default for GKrellM data update routines is to expect monotonically
	|  increasing data values.  So the real data values stored for display are
	|  differences between successive data updates.  But the data this demo
	|  krell will measure will be values within a fixed range, so we must
	|  turn off the monotonic mode.
	*/
	gkrellm_monotonic_krell_values(krell, FALSE);

	/* Set the kell full scale value and a krell scaling factor.  The scaling
	|  factor should almost always be 1.  Only chart styled krells that have
	|  a small full scale value might need a scaling factor greater than 1.
	*/
	gkrellm_set_krell_full_scale(krell, KRELL_FULL_SCALE, 1);

	/* Configuring a panel means to determine the height needed to accomodate
	|  its label and all of the created decals and krells that it contains.
	|  This is where we set the label on the panel to be "Plugin".  Many
	|  plugins will have panels with changing text or pixmap decals and will
	|  not use a label at all.  In those cases, just pass NULL for the label.
	|  Some plugins may want to have a fixed panel height.  Those should
	|  call gkrellm_panel_configure_add_height() instead of this:
	*/
	gkrellm_panel_configure(panel, NULL , style);

	/* Finally create the panel.  It will have a background image which will
	|  be the theme default or plugin specific if created by the theme maker.
	*/
	gkrellm_panel_create(vbox, monitor, panel);
	
	gkrellm_draw_decal_text(panel,decal_text,"IBAM",-1);

	if (first_create)
	    gtk_signal_connect(GTK_OBJECT (panel->drawing_area), "expose_event",
    	        (GtkSignalFunc) panel_expose_event, NULL);
	}


/* The monitor structure tells GKrellM how to call the plugin routines.
*/
static GkrellmMonitor	plugin_mon	=
	{
	CONFIG_NAME,        /* Title for config clist.   */
	0,					/* Id,  0 if a plugin       */
	create_plugin,		/* The create function      */
	update_plugin,		/* The update function      */
	NULL,				/* The config tab create function   */
	NULL,				/* Apply the config function        */

	NULL,				/* Save user config			*/
	NULL,				/* Load user config			*/
	NULL,				/* config keyword			*/

	NULL,				/* Undefined 2	*/
	NULL,				/* Undefined 1	*/
	NULL,				/* private	*/

	MON_MAIL,			/* Insert plugin before this monitor			*/

	NULL,				/* Handle if a plugin, filled in by GKrellM     */
	NULL				/* path if a plugin, filled in by GKrellM       */
	};


  /* All GKrellM plugins must have one global routine named init_plugin()
  |  which returns a pointer to a filled in monitor structure.
  */
	GkrellmMonitor *gkrellm_init_plugin(void)
	{
	/* If this next call is made, the background and krell images for this
	|  plugin can be custom themed by putting bg_meter.png or krell.png in the
	|  subdirectory STYLE_NAME of the theme directory.  Text colors (and
	|  other things) can also be specified for the plugin with gkrellmrc
	|  lines like:  StyleMeter  STYLE_NAME.textcolor orange black shadow
	|  If no custom theming has been done, then all above calls using
	|  style_id will be equivalent to style_id = DEFAULT_STYLE_ID.
	*/
	style_id = gkrellm_add_meter_style(&plugin_mon, STYLE_NAME);
	monitor = &plugin_mon;
	return &plugin_mon;
	}
}