Can't copy the right image from window



Hi, i tried to copy from the GdkWindow an image with the function gdk_drawable_copy_to_image() but everytime i get different images under Ubuntu with gnome, in KDE it allways copied the right image .  I tried to set USE_XFT = 0 to disable antialiasing, but it didn't help.

Please look at the attached file. Use this command to compile:
gcc `pkg-config --cflags gtk+-2.0 --libs gtk+-2.0 glib-2.0 gthread-2.0` copy_from_window.c

The image saved in window_image.jpg doesn't match with drawn on the window image.

--
Tigran Piloyan

Linux Verification Center, ISPRAS, RAU
web:    http://www.linuxtesting.org
e-mail: tigran piloyan linuxtesting org
#include <gtk/gtk.h>
#include <glib.h>
#include <stdio.h>

int main (int argc, char **argv)
{
	GdkWindow *window = NULL;
	GdkWindowAttr attr;
	GdkRectangle rectangle;
	GdkColormap *colormap = NULL;
	GdkImage *image = NULL;
	GdkGC *gc = NULL;
	GdkColor color;
	GError *err = NULL;
	gchar *buffer;
	gsize count;
	GdkPixbuf *pixbuf = NULL;
	
	gtk_init(&argc, &argv);
	
	colormap = gdk_colormap_get_system();
    if(colormap == NULL)
    {
        printf("Unable to create a GdkColormap,gdk_colormap_get_system returns NULL.");
		return 1;
    }
    
    rectangle.x = 0;
	rectangle.y = 0; 
	rectangle.width = 300;
	rectangle.height = 300;
	
	attr.title = "Window";
	attr.x = 0;
	attr.y = 0;
	attr.width = 500;
	attr.height = 600;
	attr.wclass = GDK_INPUT_OUTPUT;
	attr.window_type = GDK_WINDOW_TOPLEVEL;
	
	window = gdk_window_new(NULL, &attr, GDK_WA_X | GDK_WA_Y |GDK_WA_TITLE);
    if(window == NULL)
	{
		printf("The gdk_window_new function returned NULL, unable to create GdkWindow.");
		return 1;
	}
	
	gdk_window_show(window);
	gdk_flush();
	sleep(3);
	
	gc = gdk_gc_new(window);
    if(gc == NULL)
    {
        printf("Unable to create a GdkGC, gdk_gc_new returns NULL.");
		return 1;
    }    
    
    color.red = 100 * (65535 / 255);
    color.green = 50 * (65535 / 255);
    color.blue = 100 * (65535 / 255);
    
    gdk_gc_set_rgb_fg_color(gc, &color);
	
	gdk_window_begin_paint_rect(window, &rectangle);
	gdk_draw_rectangle(window, gc, TRUE, 0, 0, 200, 200);
	gdk_window_end_paint(window);
	
	image = gdk_drawable_copy_to_image(window, NULL, 0, 0, 0, 0, attr.width, attr.height);
	if(image == NULL)
	{
		printf("Unable to create a GdkImage, gdk_drawable_copy_to_image returns NULL.");
		return 1;
	}
	
	pixbuf = gdk_pixbuf_get_from_image (NULL, image, colormap, 0, 0, 0, 0, attr.width, attr.height);
	if(pixbuf == NULL)
	{
		printf("Unable to create a GdkPixbuf, gdk_pixbuf_get_from_image returns NULL.");
		return 1;
	}
		
	gdk_pixbuf_save_to_buffer (pixbuf, &buffer, &count, "jpeg", &err, "quality", "100", NULL);
												
	gdk_pixbuf_save(pixbuf, "window_image.jpg", "jpeg", &err, "quality", "100", NULL);
	
	sleep(3);
	
	return 0;
}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]