Hi!
I’m using the code below to make thumbnails. It is a modification to a widely used program using imlib2. Sorry about the formatting. I’ll explain the problem below.
#include <X11/Xlib.h>
#include <Imlib2.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define CREATE_SHADOWS 1
int main(int argc, char **argv) {
Display *display;
XWindowAttributes windowattr;
Imlib_Image image, shadow_image, icon;
int windowid, thumbwidth, thumbheight;
int scale_quality;
int shadow_direction;
int shadow_x_offset, shadow_y_offset;
int icon_width, icon_height;
if ( argc != 7 ) {
puts("Usage: thumb WindowId ThumbWidth ThumbFile IconFile ScaleQuality ShadowDirection");
return 1;
}
sscanf(argv[1], "%x", &windowid);
sscanf(argv[2], "%d", &thumbwidth);
sscanf(argv[5], "%d", &scale_quality);
sscanf(argv[6], "%d", &shadow_direction);
if ( (display = XOpenDisplay(NULL)) == NULL ) return 1;
XGetWindowAttributes(display, windowid, &windowattr);
thumbheight = windowattr.height * thumbwidth / windowattr.width;
imlib_context_set_anti_alias(1);
imlib_context_set_display(display);
imlib_context_set_visual(DefaultVisual(display, DefaultScreen(display)));
imlib_context_set_colormap(DefaultColormap(display, DefaultScreen(display)));
imlib_context_set_drawable(windowid);
if ( scale_quality*thumbwidth < windowattr.width || scale_quality*thumbheight < windowattr.height )
{
image = imlib_create_scaled_image_from_drawable((Pixmap)0, 0, 0,windowattr.width, windowattr.height, scale_quality*thumbwidth, scale_quality*thumbheight, 1, 1);
imlib_context_set_image(image);
image = imlib_create_cropped_scaled_image(0, 0, scale_quality*thumbwidth, scale_quality*thumbheight,thumbwidth, thumbheight);
}
else {
image = imlib_create_image_from_drawable((Pixmap)0, 0, 0, windowattr.width, windowattr.height, 1);
imlib_context_set_image(image);
image = imlib_create_cropped_scaled_image(0, 0, windowattr.width, windowattr.height,thumbwidth, thumbheight);
}
icon = imlib_load_image(argv[4]);
imlib_context_set_image(icon);
icon_width = imlib_image_get_width();
icon_height = imlib_image_get_height();
imlib_context_set_image(image);
imlib_blend_image_onto_image(icon, 1, 0, 0, icon_width, icon_height, 0, 0, icon_width, icon_height);
#if CREATE_SHADOWS
shadow_image = imlib_create_image(thumbwidth+20, thumbheight+20);
// shadow_image = imlib_create_image(thumbwidth+20, thumbheight+20);
imlib_context_set_image(shadow_image);
imlib_image_set_has_alpha(1);
imlib_context_set_color(0, 0, 0, 170);
shadow_x_offset = sin (2 * M_PI * (float)shadow_direction / 360) * 6 + 10;
shadow_y_offset = -cos (2 * M_PI * (float)shadow_direction / 360) * 6 + 10;
imlib_image_fill_rectangle(shadow_x_offset, shadow_y_offset, thumbwidth, thumbheight);
imlib_image_blur(3);
imlib_blend_image_onto_image(image, 1, 0, 0, thumbwidth, thumbheight, 10, 10, thumbwidth, thumbheight);
#endif
imlib_image_set_format(strrchr(argv[3], '.')+1);
imlib_save_image(argv[3]);
fprintf(stdout, "WindowStyle IconOverride, Icon %s\n", argv[3]);
return 0;
}
Here is the config which uses the above program:
SetEnv fvwm_icon_size 200
SetEnv fvwm_icon_scale_quality 1
SetEnv fvwm_icon_shadow_direction 145
DestroyFunc Thumbnail
AddToFunc Thumbnail
+ I Raise
+ I ThisWindow (!Shaded, Iconifiable, !Iconic) PipeRead "$[FVWM_USERDIR]/scripts/thumb $[w.id] $[fvwm_icon_size] $[FVWM_USERDIR]/temp/icon.tmp.$[w.id].png $[w.miniiconfile] $[fvwm_icon_scale_quality] $[fvwm_icon_shadow_direction]"
+ I Iconify
Everything should be OK, BUT there seems to be a problem somewhere. If my Firefox window size is about 1000x200 (WxH) and I iconify it, I get some very odd garbage to the upper portion of the icon. If I use regular window sizes, like 1000x600, it doesn’t happen. So what on earth is going on?? The oddest thing is that if I uncomment the line in the code the problem disappears!!! There must be a bug there but I can’t see it. Any ideas?
(Almost the same code can be found here with better formatting: viewtopic.php?t=650 )