Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > by-pkgid > b9e3436c1700dd65149a6f3a48878132 > files > 7

gkrellm-2.1.7a-2mdk.ppc.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>

<body background="paper1.gif">
<h3>Changelog for GKrellM Plugins</h3>
<hr size="4">

<h4>Changes for version 2.1.2 - 2.1.7</h4>
None

<h4>Changes for version 2.1.1</h4>
Users can set a theme scale.  Buttons made with
gkrellm_make_scaled_button() and krells are automatically theme scaled, but
plugins that have their own multi frame
decal images will need a code change if they want the decal image to be
user scalable.  This fragment shows a clean way to do it:
<pre>
	gkrellm_load_piximae("foo", foo_xpm, &foo_piximage, FOO_STYLE_NAME);
#if defined(GKRELLM_HAVE_THEME_SCALE)
	/* New function scales to multiple of frame height and does not require
	|  the plugin to maintain a pixmap and mask.
	*/
	foo_decal = gkrellm_make_scaled_decal_pixmap(panel, foo_piximage, style,
	              N_FOO_FRAMES, -1, -1, 0, 0);
#else
	gkrellm_scale_piximage_to_pixmap(foo_piximage, &foo_pixmap,
	              &foo_mask, 0, 0);
	foo_decal = gkrellm_create_decal_pixmap(p, foo_pixmap, foo_mask,
	              N_FOO_FRAMES, style, -1, -1);
#endif
</pre>
However, if the plugin needs to maintain the pixmap and mask, you can
handle things yourself by
scaling the decal frame height by the theme_scale value and
then creating the pixmap height to be a multiple of the frame height:
<pre>
#if defined(GKRELLM_HAVE_THEME_SCALE)
	h = gdk_pixbuf_get_height(foo_piximage->pixbuf) / N_FOO_FRAMES;
	h *= gkrellm_get_theme_scale();     /* New function */
	h *= N_FOO_FRAMES;
	w = -1;			/* Scales to drawn image size * theme_scale */
#else
	h = 0;             /* Will scale to drawn image size */
	w = 0;
#endif
	gkrellm_scale_piximage_to_pixmap(foo_piximage, &foo_pixmap,
	              &foo_mask, w, h);
	foo_decal = gkrellm_create_decal_pixmap(panel, foo_pixmap, foo_mask,
	              N_FOO_FRAMES, style, -1, -1);
</pre>
Code that places decals relative to margins or to other decal/krell
positions and sizes should be fine, but if you place at hardwired locations,
the x,y location values might need to be
scaled by gkrellm_get_theme_scale() for things to look right when the
user changes the theme scale.

<h4>Changes for version 2.1.0</h4>
There is an issue with the new theming features in 2.1.0.  There are
only two defined monitor types (chart and meter), but some monitors
are hybrids.  The new spacer and cap theme images are applied based
on monitor type, but for hybrid monitors there is no way for gkrellm
to determine which images should really be used.  So there is a
new function:
<pre>
gkrellm_spacers_set_types(GkrellmMonitor *mon, gint top, gint bottom);
</pre>
where top and bottom are GKRELLM_SPACER_CHART or GKRELLM_SPACER_METER.
Hybrid monitors can now make this call to let gkrellm know what it
is doing.  See the builtin mem.c and my plugin gkrellmss (version 2.1)
for examples of its usage.

<h4>Changes for version 2.0.4</h4>
None.

<h4>Changes for version 2.0.3</h4>
<ul>
<li> If a plugin implements instant apply (so no apply_config() and it
	is NULL in the GkrellmMonitor struct), then if the plugins config
	page is selected, there will be no "Apply" button shown since
	it, ...ummm...  doesn't apply.</li>
<li> For plugins which have an apply_config(), now there is an
	implied apply if the user leaves the plugins config page
	by selecting another monitor. </li>
</ul>

<h4>Changes for version 2.0.1 - 2.0.2</h4>
None.

<h4>Changes for version 2.0.0</h4>
See the gkrellm-2.0 porting guide.

<h4>Changes for version 1.2.10 - 1.2.11</h4>
None.

<h4>Changes for version 1.2.9</h4>
Some added functions (see the Plugin Programmers Reference for more functions):
	<pre><font size="-1">
Style   *gkrellm_meter_style_by_name(gchar *name);
Style   *gkrellm_panel_style_by_name(gchar *name);
Style   *gkrellm_chart_style_by_name(gchar *name);
	</font></pre>
which provide for using a custom style
with values set with
StyleMeter or StylePanel lines in the gkrellmrc.  If you have extra
krells you want to allow to be themed, this can clean up your code
by eliminating a bunch
of gkrellm_get_gkrellmrc_integer() or gkrellm_get_gkrellmrc_string()
calls.
See the Themes file and gkrellmss.c in GKrellMSS 0.4 (when I release it)
for a working example of this.
<p>
Style margin changes for more layout control.  Usually these will be set
by a theme author in the gkrellmrc:
	<ul>
		<li>There is now a left and right panel margin instead of the single
		"margin".  These are in a new Margin struct which also includes
		the top and bottom margin.  Use gkrellm_get_style_margins() to
		access the themed margin values.</li>
		<li>The Style struct has new krell_left_margin and krell_right_margin
		for setting krell margins independently of panel margins.</li>
	</ul>
<p>

<h4>Changes for version 1.2.6 - 1.2.8</h4>
None.

<h4>Changes for version 1.2.5</h4>
Added some functions.
	<pre><font size="-1">
void    gkrellm_set_krell_expand(Style *, gchar *);
void    gkrellm_insert_krell_nth(Panel *, Krell *, gint);
void    gkrellm_insert_decal_nth(Panel *, Decal *, gint);
gboolean gkrellm_in_decal(Decal *, GdkEventButton *);
void    gkrellm_decal_button_connect(DecalButton *, void (*func)(), void *);
void    gkrellm_decal_button_right_connect(DecalButton *, void (*func)(), void *);
void    gkrellm_set_button_sensitive(DecalButton *, gboolean);
void    gkrellm_hide_button(DecalButton *);
void    gkrellm_show_button(DecalButton *);
	</font></pre>

The DecalButton callback function prototype adds a "gpointer data" so
you don't have to reference button->data.

<h4>Changes for version 1.2.3 - 1.2.4</h4>
None.

<h4>Changes for version 1.2.2</h4>
Added some functions.  Some of them are (for controlling decals and krells):
	<pre><font size="-1">
void          gkrellm_set_krell_margins(Panel *, Krell *k, gint, gint);
void          gkrellm_move_krell_yoff(Panel *, Krell *, gint);
void          gkrellm_draw_decal_on_chart(Chart *, Decal *, gint, gint);
void          gkrellm_move_decal(Panel *, Decal *, gint, gint);
void          gkrellm_decal_on_top_layer(Decal *, gboolean);
	</font></pre>

<h4>Changes for version 1.2.1</h4>
None.

<h4>Changes for version 1.2.0</h4>
Any plugin using charts will require coding changes and a recompile.
Charts are now automatically user configurable with a right click on a chart.
There are too many new functions to cover here, so look over the updated
plugin programmers reference and especially the chart demo1.c program.
All of the "chartconfig" and "chartdata" functions are new.  The create
and destroy functions are changed to gkrellm_chart_create() and
gkrellm_chart_destroy().  You should no longer do awkward settings such
as chart->previous = blah (use gkrellm_monotonic_chartdata()) or
chart->scale_max = 0 (chart scaling is now handled properly)
A couple of key points to note are:
<ul>
	<li>Charts no longer automatically have two data sets.  There is a new
	ChartData struct which is added to Charts as needed.  To handle a
	variable number of data layers, the store data routine is changed
	to a varargs <br>
	&nbsp &nbsp &nbsp &nbsp gkrellm_store_chartdata(Chart *, gulong total, ...);
	</li>
	<li>There are several chart config options all handled automatically.  But
	you do need to save and load the config - see demo1.c
	</li>
</ul>

Plugins that use panels do not require a recompile, but I've made
the chart and panel coding styles cleaner and more consistent by adding
some functions you should migrate to.  When you do,
your plugin will depend on GKrellM version >= 1.2.0.
These are for coding cleanups and some new functions:
	<ul>
	<li>If you have a spare right click, you can have it call<br>
     &nbsp &nbsp &nbsp &nbsp gkrellm_open_config_window(Monitor *);<br>
	and the config window will be opened right to your plugin's config page.
	</li>
	<li>Use gkrellm_panel_create() instead of gkrellm_create_panel().
	Use gkrellm_panel_configure() instead of gkrellm_configure_panel().
	Use gkrellm_panel_enable_visibility() instead of
	gkrellm_enable_visibility()
	(or you could use gkrellm_hide_panel() and gkrellm_show_panel()).
	See the plugin programmers reference for usage.
	</li>
	<li> After you upgrade to using these new functions, there should
	be no need to worry about managing stuff that gkrellm should be
	handling.  ie, you should never have to make
	any gkrellm_monitor_height_adjust() or gkrellm_pack_side_frame() calls.
	Also, decal/krell lists will be automatically destroyed prior to
	create plugin calls (but you can override this) and you should no
	longer set krell->previous
	(use gkrellm_monotonic_krell_values()).  Also if you destroy a panel,
	you will no longer need to destroy lists, adjust monitor height,
	or g_free() the Panel struct storage.
	<p>
	Look at the revised demos in the programmers
	reference.  Also look at the bottom of gkrellm_public_proto.h for the
	list of functions that should be replaced.
	</li>
</ul>


<h4>Changes for version 1.0.8</h4>
None

<h4>Changes for version 1.0.7</h4>
None

<h4>Changes for version 1.0.6</h4>
/usr/lib/gkrellm/plugins and /usr/local/lib/gkrellm/plugins are now also
searched to comply with the FHS.

<h4>Changes for version 1.0.5</h4>
None

<h4>Changes for version 1.0.4</h4>
<blockquote>
Looking ahead a bit (some months?) when I get to 1.1.0
I want the gkrellm namespace to be cleaned up.  I'm defining
that to mean that if you do a "nm -u plugin.so" the undefined symbols
expected to link to gkrellm will be only GK and gkrellm_XXX symbols.
Starting with 1.0.4 gkrellm_private_proto.h is no longer included
by gkrellm.h and it is not installed in the include directory.  I 
have temporarily moved some symbols affecting a few plugins
from private to public proto.h.  I hope I moved enough so
that all current plugins I know of will still compile.  The plan is
when 1.1.0 arrives I will do the "Cut Here" at the bottom of
gkrellm_public_proto.h, so source will need to be in sync
by then.<br>
<b>To check if you need changes,
#ifdef out the part that will be cut and see if you get warnings
compiling with -Wall.</b><br>
If you have changes to make or want to use any new functions below,
make your source dependent on version 1.0.4 as described in the
changes for version 1.0.3.
<p>
Added some handy utility routines (most were already in
gkrellm_private_proto.h without a gkrellm_ prefix):
	<pre><font size="-1">
	GtkWidget *gkrellm_create_tab(GtkWidget *, gchar *);
	gchar   *gkrellm_entry_get_text(GtkWidget **);
	void    gkrellm_spin_button(GtkWidget *, GtkWidget **, gfloat, gfloat, gfloat,
	                gfloat, gfloat, gint, gint, void (*func)(), gpointer, gboolean, gchar *);
	void    gkrellm_check_button(GtkWidget *, GtkWidget **, gboolean, gboolean, gint, gchar *);
	gchar   *gkrellm_homedir(void);
	gboolean gkrellm_dup_string(gchar **, gchar *);
	gchar   *gkrellm_make_config_file_name(gchar *, gchar *);
	struct tm *gkrellm_get_current_time();
	</font></pre>
Other uninteresting changes are: Added some session manager plugin helper
functions so I could write the gkrellm-gnome plugin and exported sensor
reading functions for special purpose sensor monitoring plugins.
</blockquote>

<h4>Changes for version 1.0.3</h4>
<ul>
<li> You can run <b>gkrellm -p plugin-under-test.so</b> to load the plugin
	you are working on in the current directory.  Should be a development
	time saver.
</li>	
<li>
I am changing the way top and bottom margins are specified in panels.
Previously labels and decals were margined by using the top and
bottom borders of the background image.  Now there are new
<b>top_margin</b> and <b>bottom_margin</b> values in the Style struct to go
with the existing <b>margin</b> value (which is used for both
left and right margins).  Most
plugins probably don't care about this since the gkrellm create and
configure routines handle most placements, but if you were using
any <b>border.top</b> or <b>border.bottom</b> references for positioning,
you should use the new routine:
	<pre><font size="-1">
    void  gkrellm_get_top_bottom_margins(Style *s, gint *top, gint *bot)
	</font></pre>

This routine determines if a theme is using the new top_margin and
bottom_margin values and returns them, otherwise it will return the old
top and bottom border values so existing themes will not break.
</li>
<p>
<li>
Two new Style copying functions needed to fix a bad programming practice
I had promoted in my demo programs:
	<pre><font size="-1">
    Style     *gkrellm_copy_style(Style *src_style);
    TextStyle *gkrellm_copy_textstyle(TextStyle *src_style);
	</font></pre>

Previously I had suggested
copying a style to a plugin local style like so:
	<pre><font size="-1">
    Style *my_style, *style;

    style     = gkrellm_meter_style(DEFAULT_STYLE);
    my_style  = gkrellm_style_new0();
    *my_style = *style;
	</font></pre>

But I goofed and this is no good.  If you have such code please change it.
It should now be done like so:
	<pre><font size="-1">
    Style *my_style, *style;

    style    = gkrellm_meter_style(style_id);
    my_style = gkrellm_copy_style(style);
	</font></pre>

<b>NOTE:</b> Just to emphasize a point, you should never have a static
local Style or TextStyle declared.  You should use the above copy
function so the style can be initialized with a themes gkrellmrc settings.
</li>
<p>
<li>
If you do use the above new routines and don't want to clutter your code
with #ifdefs to make it compatible with old GKrellM versions, I suggest
making your plugin require version 1.0.3.  After all, I don't think it's
unreasonable to ask someone installing your latest plugin
version to also have installed a recent GKrellM version.  It's what I
would do and it can keep your code base clean.  You can enforce
this requirement in your header file after you include gkrellm.h:
	<pre><font size="-1">
    #include &lt;gkrellm/gkrellm.h&gt;
    #if  !defined(GKRELLM_VERSION_MAJOR) \
         || (GKRELLM_VERSION_MAJOR==1 && GKRELLM_VERSION_MINOR==0 && GKRELLM_VERSION_REV<3)
    #error This plugin requires GKrellM version >= 1.0.3
    #endif
	</font></pre>
	
Notice that in 1.0.3 you can now use GKRELLM_VERSION_MAJOR instead of just
VERSION_MAJOR.
Similarly, if you want to clean out ugly #ifdef'ed code sections
for previous versions of your plugin, just do it!
But if you want to conditional on a GKrellM version prior to 1.0.3, you
can't use the GKRELLM_VERSION_MAJOR.
Ie. if you #ifdef'ed in some of the new functions for 0.10.0, clean them
out and put in your header:
	<pre><font size="-1">
    #include &lt;gkrellm/gkrellm.h&gt;
    #if &nbsp (VERSION_MAJOR==0) && (VERSION_MINOR<10)
    #error This plugin requires GKrellM version >= 0.10.0
    #endif
	</font></pre>
But, if you are going to do this, why not just make a clean break?
Go ahead and use the first example using GKRELLM_VERSION_XXX defines,
and be done with it!
</li>
</ul>

<h4>Changes for version 1.0.0 - 1.0.2</h4>
None.

<h4>Changes for version 0.10.5</h4>
Added these routines:
<ul>
	<li>gkrellm_config_modified()</li>
	<li>gkrellm_chart_images_override()</li>
	<li>gkrellm_get_gkrellmrc_integer()</li>
	<li>gkrellm_get_gkrellmrc_string()</li>
</ul>
See the Plugins programmers reference for descriptions.

<h4>Changes for version 0.10.2 - 0.10.4</h4>
None.

<h4>Changes for version 0.10.1</h4>
<ul>
<li>There has been a loose end with controlling plugin placement when
multiple plugins are placing themselves before the same monitor.  So far
this placement has been determined by the order plugins are read from the
plugin directories and this in turn is a function of the order they
were written into the directory.  There is no alphabetical sorting
at all.  So to give some control, plugins can now specify a gravity value
from 0 to 15 in the placement parameter.  Think of it as higher gravity
pulling a plugin down in its placement slot.  If you see no reason your
plugin should care about this level of control then do nothing, no
code changes are required.  But if there is some reason you prefer your
plugin be biased downwards, then give it gravity like so:
<pre>
#ifdef GRAVITY
#define MY_PLACEMENT (MON_APM | GRAVITY(8))
#else
#define MY_PLACEMENT (MON_APM)
#endif
</pre>
If there is a very strong reason to bias it down, give it gravity 15.
If you want placement with respect to another plugin that has gravity,
then give yours a gravity value just above or below the gravity for the
other plugin.  Many plugins can just pass this by and be fine with the
default zero gravity.  
<p>
<li>Cleaned out all GK.debug usage from GKrellM source so it is now solely for
plugin use.   You can run "gkrellm -debug" or "gkrellm -debugN" where N is
an arbitrary integer you pick for your plugin specific use.  Basically,
use "if (GK.debug)" for general debugging, or use "if (GK.debug == N)"
for debugging isolated to your plugin.   I guess just rely on chance
and squatters rights and just pick an N that
you hope does not collide with some other plugin.
</ul>

<h4>Changes for version 0.10.0</h4>
<blockquote>
Final release check list (some details are below):
<ul>
	<li>Fix GK struct references - only xxx_tick and debug references are OK.
	<li>Consider adding style_id support - use the new functions.
	<li>Consider using gkrellm_load_image() to load custom #included images.
</ul>

<h5>Details</h5>
New functions (see plugin programmers reference):
<pre><font size="-1">
gboolean gkrellm_load_image(gchar *name, gchar **xpm, GdkImlibImage **im, gchar *subdir);
gboolean gkrellm_set_image_border(gchar *name, gchar **xpm, Style *style);
gint     gkrellm_add_chart_style(Monitor *mon, gchar *name);
gint     gkrellm_add_meter_style(Monitor *mon, gchar *name);
gint     gkrellm_lookup_chart_style_id(gchar *name);
gint     gkrellm_lookup_meter_style_id(gchar *name);
gchar    *gkrellm_get_theme_path(void);
void     gkrellm_add_info_text_string(GtkWidget *text, gchar *string);
</font></pre>

The GK structure is changing.
It has always been the case that the only safe parts of GK to
access are the debug and xxx_tick parts.
If any plugin directly accesses the structure (does not use the
gkrellm_XXX() helper functions) for image or style pointers
it's pretty certain it will break.
Also, even if you did use gkrellm_XXX() functions to access images or styles
for other monitors (not the DEFAULT_STYLE) you will now get unexpected
results (but should not crash).  Use the gkrellm_lookup_xxxx_style_id()
functions to get a style_id for other monitors.
Some other references are OK for now,
like GK.theme_path, but should be changed to the new gkrellm_get_theme_path()
under 0.10.0 (but consider using the new gkrellm_load_image() function
so you don't have to do any theme path processing at all).
<p>
Code references like these are a problem:
<pre>
    GK.XXX_style[id]      where XXX is chart, panel, or meter.
    GK.bg_XXX_image[id]   where XXX is chart, panel, meter, or grid.
    GK.krell_XXX_image[]  where XXX is panel or meter
    GK.monitor_height += p->h;
    UC.chart_width
    GK.decal_misc_pixmap
    some_function(XXX_STYLE) where XXX is APM, FS, CLOCK, CAL, etc.
</pre>
Fix them like this:
<pre>
    gkrellm_XXX_style(id);
    gkrellm_bg_XXX_image(id);
    gkrellm_krell_XXX_image(id);
    gkrellm_monitor_height_adjust(h);
    gkrellm_chart_width();
    gkrellm_decal_misc_pixmap();
    some_function(gkrellm_lookup_meter_style_id(XXX_STYLE_NAME));
</pre>
See the plugin programmers reference.  It has updated documentation on the
above new calls and the demo programs are updated as well.   The
short story is plugins can
now be themed at the same level as builtins.  Check the Styles and Themes
section.
<p>
Here's something that might help:
<ul>
	<li>Make your plugin compilable under 0.9.x or 0.10.x by doing this:<br>
		In a header or at the top of your source file:
<pre>
#if ((VERSION_MAJOR>0)||(VERSION_MINOR>9))
#define PLUGIN_STYLE style_id
static gint  style_id;
#else
    #define PLUGIN_STYLE DEFAULT_STYLE
#endif
</pre>
		Access styles and images by using PLUGIN_STYLE as an argument.
		And in the init_plugin() routine, add this:
<pre>
#if ((VERSION_MAJOR>0)||(VERSION_MINOR>9))
    style_id = gkrellm_add_meter_style(&plugin_mon, "somename");
#endif
</pre>
	<li>If you have custom images to load and want to use gkrellm_load_image(),
	it is more difficult to be compilable under 0.9.x and 0.10.x.  You
	could use #if around gkrellm_load_image() calls, or you could just
	not bother and have the requirement that the plugin needs 0.10.x.
</blockquote>


<h4>Changes for version 0.9.9</h4>
<blockquote>
Not much new for this release.  About the only thing is I have followed
the lead of several plugins and added a global function to get the nice
bold (and added italic) text into the Info/Help pages.   You can use it if
you want or keep doing it the way you have been, but one benefit is
that I have an alternate larger font size the user can select if he
wants.  Just insert &lt;b&gt; for bold or &lt;i&gt; for
bold italic in front of
strings in a string array, like this:
<pre><font size="-1">
gchar	*info_text[] =
    {
    "&lt;b&gt;The first ",
    "two words of this line are bold\n"
    "and the last two words of this line ",
    "&lt;i&gt;are italic\n"
    };
...
GtkWidget *text;

...
text = gtk_text_new(NULL, NULL);
gkrellm_add_info_text(text, info_text, sizeof(info_text) / sizeof(gchar *));
...
</font></pre>

If you look at the GKrellM source you will notice _( ) and N_( ) macros
around text strings.  There has been some interest in internationalizing
the program (Turbolinux Japan) and these macros support that.  I don't
know if this will extend to the plugins, so my suggestion is do whatever
you feel comfortable with (the macros are a no-op unless i18n is enabled).
If you choose to do this, then the above info_text declaration would look like:


<pre><font size="-1">
gchar	*info_text[] =
    {
    N_("&lt;b&gt;The first "),
    N_("two words of this line are bold\n"
    "and the last two words of this line "),
    N_("&lt;i&gt;are italic\n")
    };
</font></pre>


I'm giving some thought to a way for plugins to have custom theme images
(as do the builtins), but did not get to it for this release.  Maybe
next time.
</blockquote>

<h4>Changes for version 0.9.8</h4>
<ul>
<li>make install from source and package installation now installs the
	header files.  So, source for plugins can now<br>
	&nbsp &nbsp &nbsp <b>#include &lt;gkrellm/gkrellm.h&gt;</b>
	<br>as a default so people
	compiling plugins do not have to install them in the plugins source
	tree or edit the location of gkrellm.h.
<li>Fixed a bug where DecalButtons were not destroyed when
	gkrellm_destroy_panel() was called.
</ul>

<h4>Changes for version 0.9.7</h4>
<ul>
<li>IMPORTANT: init_plugin() returning NULL is now properly handled.
	Any plugin which
	finds it  cannot install itself because some resource is not available
	should not issue any error messages from the init_plugin() routine.
	If the resource deficiency is serious (some feature not compiled into
	the kernel, etc), the plugin should return NULL.  However, if the
	problem is resolvable (as in a permission problem or setup issue), then
	the plugin should return the address of the monitor structure as normal,
	but should then trap the problem and issue an error message in the
	create_plugin() routine.
	The reason
	for this is that there is now a system wide plugins directory where
	plugins for all users may be installed.  This means plugins may be
	loaded for users who do not want them enabled at all or
	who do not currently have
	permission to access resources needed by the plugin.
	A message in the init_plugin() routine will appear each time GKrellM
	is started and will probably just annoy the user.  The proper place
	for any messages, in the create_plugin() routine, will not be called
	unless the user has asked for the plugin to be enabled.  A message
	here could let the user know what is needed to make the plugin
	accessible, so you could issue the message and then return without
	creating your monitor.  And of course, your update routine needs
	to be aware if the plugin has actually been created.
<li>A flag can be or'ed into a placement value so a plugin can be placed
	after a builtin monitor instead of the default before the monitor.
	For example, to place a plugin after the file system monitors, use <br>
	(MON_FS | MON_INSERT_AFTER)<br>
	I think a good rule to follow would be
	to place a plugin before a particular
	monitor when you are doing it for appearance (ie that is where the
	plugin looks like it should go), but place the plugin "after" a monitor
	when there is a functional similarity between the builtin and plugin.
	Otherwise, a plugin which has a functional similarity and really should
	be placed right next to a builtin monitor may not end up in the right
	place if several plugins are asking to be placed in the same position.
	If I can use current plugins as an example, I think the Mailwatch
	would be a candidate to be placed after MON_MAIL because it has the
	similarity and it is likely to be enabled at the same time as the builtin
	mail monitor.
	The others are probably OK being placed before any particular monitor. 
	The powerbook_pmu plugin does
	not need to be placed after the builtin MON_APM because it will not
	be enabled at the same time the builtin apm monitor is enabled.
</ul>

<h4>Changes for version 0.9.6</h4>
As of 0.9.6 I want to make name changes (and one prototype change)
for these four routines.
But for several versions, I'll keep them around to avoid breaking plugins.
<pre><font size="-1">

Decal   *gkrellm_create_text_decal(Panel *p, gchar *, TextStyle *, Style *, gint, gint, gint);
Decal   *gkrellm_create_pixmap_decal(Panel *, GdkPixmap *, GdkBitmap *, gint, Style *);
void    gkrellm_draw_pixmap_decal(Panel *, Decal *, gint);
void    gkrellm_draw_text_decal(Panel *, Decal *, gchar *, gint);

They are changed to:

Decal   *gkrellm_create_decal_text(Panel *p, gchar *, TextStyle *, Style *, gint, gint, gint);
Decal   *gkrellm_create_decal_pixmap(Panel *, GdkPixmap *, GdkBitmap *, gint, Style *, gint, gint);
void    gkrellm_draw_decal_pixmap(Panel *, Decal *, gint);
void    gkrellm_draw_decal_text(Panel *, Decal *, gchar *, gint);
</font></pre>
Plugins writers should migrate these four routines at their convenience.
This is simply done by replacing
the names, and in the case of gkrellm_create_decal_pixmap(), the following
two calls are equivalent:
<pre><font size="-1">
    gkrellm_create_pixmap_decal(p, pixmap, mask, depth, style);
    gkrellm_create_decal_pixmap(p, pixmap, mask, depth, style, -1, -1);
</font></pre>


<hr size="4">
<h4>Changes for version 0.9.0</h4>

The API for plugins is changed for version 0.9.0.  There are a few
prototype changes and coding style changes.  One change is necessary
because GKrellM now resizes and changes themes without restarting.
This changes the create_plugin() routine from a one time create
function to a create event function which can be repeatedly called.

<pre><font size="-1">
-------------------------------------------------------------------
Coding style change: create_plugin() 

-------------The old style--------------:

static void
create_plugin(GtkWidget *vbox)
	{
	Chart	*chart;
	Panel	*p;

	chart = gkrellm_chart_new0();
	p = chart->panel = gkrellm_panel_new();
	...

	/* Create decals, krells. Configure panel, create panel, create chart */
	...

	gtk_signal_connect(GTK_OBJECT(p->drawing_area), "expose_event",
			(GtkSignalFunc) panel_expose_event, NULL);
	gtk_signal_connect(GTK_OBJECT(chart->drawing_area),"expose_event",
			(GtkSignalFunc) chart_expose_event, NULL);
	}

--------------The new style-------------:

static void
create_plugin(GtkWidget *vbox, gint first_create)
	{
	Chart	*chart;
	Panel	*p;

	if (first_create)
		{
		chart = gkrellm_chart_new0();
		p = chart->panel = gkrellm_panel_new();
		}
	else
		{
		gkrellm_destroy_krell_list(p);
		gkrellm_destroy_decal_list(p);
		}
	...

	/* Create decals, krells. Configure panel, create panel, create chart
	|  just as before.
	|
	| If you create any local pixmaps, widgets, etc you should destroy
	| them or not create them again if this is not the first_create to
	| avoid memory leaks.  You could test for first_create or objects != NULL.
	| See the plugin_example.c for code marked with MMM.
	*/
	...

	if (first_create)
		{
		gtk_signal_connect(GTK_OBJECT(p->drawing_area), "expose_event",
				(GtkSignalFunc) panel_expose_event, NULL);
		gtk_signal_connect(GTK_OBJECT(chart->drawing_area),"expose_event",
				(GtkSignalFunc) chart_expose_event, NULL);
		}
	}



================================================================
Coding style change: panel decal and krell lists are now a GList.

-------------The old style--------------:
Krell *k;

for (k = chart->panel->krell; k; k = k->next)
	{
	...
	}

-------------The new style--------------:
Krell   *k;
GList   *list;

for (list = chart->panel->krell; list; list = list->next)
	{
	k = (Krell *) list->data;
	...
	}

Same change for panel->decal.



================================================================
Coding style change: gkrellm_default_textstyle() function defunct:

-------------The old function--------------:
gkrellm_default_textstyle(p->textstyle, TEXTSTYLE_XXX, style);

-------------Is replaced with several functions--------------:
p->textstyle = gkrellm_panel_textstyle(DEFAULT_STYLE);
p->textstyle = gkrellm_chart_textstyle(DEFAULT_STYLE);
p->textstyle = gkrellm_meter_textstyle(DEFAULT_STYLE);
p->textstyle = gkrellm_chart_alt_textstyle(DEFAULT_STYLE);
p->textstyle = gkrellm_panel_alt_textstyle(DEFAULT_STYLE);
p->textstyle = gkrellm_meter_alt_textstyle(DEFAULT_STYLE);

Use these functions in context.  If you have created a chart with panel
and want to write text on the panel, use gkrellm_panel_textstyle().


================================================================
Function prototype changes (see gkrellm_public_proto.h):

Change gkrellm_create_krell() calls from:
	k = gkrellm_create_krell(krell_image, &p->krell, style);
to
	k = gkrellm_create_krell(p, krell_image, style);


Change gkrellm_create_xxx_decal() calls from:
	d = gkrellm_create_text_decal(label, TEXTSTYLE_XXX, &p->decal,
					style, x, y, w);
	d = gkrellm_create_pixmap_decal(pixmap, mask, n_decals, &p->decal, style);
to
	d = gkrellm_create_text_decal(p, label, textstyle, style, x, y, w);
	d = gkrellm_create_pixmap_decal(p, pixmap, mask, n_decals, style);


================================================================
Monitor structure change:
The pre-spacer and post-spacer members are gone.  There is no longer
a bg_spacer.



=================================================================
Notes:
If you create a krell you can reference it later in two ways (if
it is only a single krell in a panel or meter area):

1) save a pointer to the created krell, and reference that:
	my_krell = gkrellm_create_krell(p, krell_image, style);
	my_krell->full_scale = xx;

2) Don't save a pointer and reference the krell from the GList:
	gkrellm_create_krell(p, krell_image, style);
	KRELL(p)->full_scale = xx;

   Note that in this case you cannot use the old reference style:
	p->krell->full_scale = xx;

If you have more than one krell per panel or meter area, use the first
referencing method, save pointers to all the krells you create.

The same two referencing examples apply to decals as well.


=================================================================
New:
Decals can be converted to buttons.  The plugins_example.c now
creates two decal buttons, so look there.
</font>
</pre>
</body>
</html>