#ifdef GRAVITY #define MY_PLACEMENT (MON_APM | GRAVITY(8)) #else #define MY_PLACEMENT (MON_APM) #endifIf 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.
Final release check list (some details are below):
- Fix GK struct references - only xxx_tick and debug references are OK.
- Consider adding style_id support - use the new functions.
- Consider using gkrellm_load_image() to load custom #included images.
Details
New functions (see plugin programmers reference):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);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).Code references like these are a problem:
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.Fix them like this: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));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.Here's something that might help:
- Make your plugin compilable under 0.9.x or 0.10.x by doing this:
In a header or at the top of your source file:#if ((VERSION_MAJOR>0)||(VERSION_MINOR>9)) #define PLUGIN_STYLE style_id static gint style_id; #else #define PLUGIN_STYLE DEFAULT_STYLE #endifAccess styles and images by using PLUGIN_STYLE as an argument. And in the init_plugin() routine, add this:#if ((VERSION_MAJOR>0)||(VERSION_MINOR>9)) style_id = gkrellm_add_meter_style(&plugin_mon, "somename"); #endif- 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.
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 <b> for bold or <i> for bold italic in front of strings in a string array, like this:gchar *info_text[] = { "<b>The first ", "two words of this line are bold\n" "and the last two words of this line ", "<i>are italic\n" }; ... GtkWidget *text; ... text = gtk_text_new(NULL, NULL); gkrellm_add_info_text(text, info_text, sizeof(info_text) / sizeof(gchar *)); ...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:gchar *info_text[] = { N_("<b>The first "), N_("two words of this line are bold\n" "and the last two words of this line "), N_("<i>are italic\n") };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.
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);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:
gkrellm_create_pixmap_decal(p, pixmap, mask, depth, style); gkrellm_create_decal_pixmap(p, pixmap, mask, depth, style, -1, -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.