Use imlib2 for taking screenshot; if it fails, use Xlib (issue #574)

This commit is contained in:
o9000 2016-03-27 23:27:34 +02:00
parent dcc163ec0b
commit 955be3658b

View file

@ -567,30 +567,31 @@ void get_snapshot(const char *path)
XSync(server.display, False); XSync(server.display, False);
Imlib_Image img = NULL; imlib_context_set_drawable(panel->temp_pmap);
XImage *ximg = Imlib_Image img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 1);
XGetImage(server.display, panel->temp_pmap, 0, 0, panel->area.width, panel->area.height, AllPlanes, ZPixmap);
if (ximg) { if (!img) {
DATA32 *pixels = calloc(panel->area.width * panel->area.height, sizeof(DATA32)); XImage *ximg =
for (int x = 0; x < panel->area.width; x++) { XGetImage(server.display, panel->temp_pmap, 0, 0, panel->area.width, panel->area.height, AllPlanes, ZPixmap);
for (int y = 0; y < panel->area.height; y++) {
DATA32 xpixel = XGetPixel(ximg, x, y);
DATA32 r = (xpixel >> 16) & 0xff; if (ximg) {
DATA32 g = (xpixel >> 8) & 0xff; DATA32 *pixels = calloc(panel->area.width * panel->area.height, sizeof(DATA32));
DATA32 b = (xpixel >> 0) & 0xff; for (int x = 0; x < panel->area.width; x++) {
DATA32 a = 0x0; for (int y = 0; y < panel->area.height; y++) {
DATA32 xpixel = XGetPixel(ximg, x, y);
DATA32 argb = (a << 24) | (r << 16) | (g << 8) | b; DATA32 r = (xpixel >> 16) & 0xff;
pixels[y * panel->area.width + x] = argb; DATA32 g = (xpixel >> 8) & 0xff;
DATA32 b = (xpixel >> 0) & 0xff;
DATA32 a = 0x0;
DATA32 argb = (a << 24) | (r << 16) | (g << 8) | b;
pixels[y * panel->area.width + x] = argb;
}
} }
XDestroyImage(ximg);
img = imlib_create_image_using_data(panel->area.width, panel->area.height, pixels);
} }
XDestroyImage(ximg);
img = imlib_create_image_using_data(panel->area.width, panel->area.height, pixels);
} else {
imlib_context_set_drawable(panel->temp_pmap);
img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 1);
} }
if (img) { if (img) {