]> Pileus Git - ~andy/gtk/blob - demos/testpixbuf-drawable.c
- get rid of gtk_toggle_button_toggled FUD - start DND section - needs
[~andy/gtk] / demos / testpixbuf-drawable.c
1 #include <config.h>
2 #include <gtk/gtk.h>
3 #include <gdk/x11/gdkx.h>
4
5 int close_app(GtkWidget *widget, gpointer data)
6 {
7    gtk_main_quit();
8    return TRUE;
9 }
10
11 int expose_cb(GtkWidget *drawing_area, GdkEventExpose *evt, gpointer data)
12 {
13    GdkPixbuf *pixbuf;
14          
15    pixbuf = (GdkPixbuf *) gtk_object_get_data(GTK_OBJECT(drawing_area),
16                                               "pixbuf");
17    if(gdk_pixbuf_get_has_alpha (pixbuf))
18    {
19       gdk_draw_rgb_32_image(drawing_area->window,
20                             drawing_area->style->black_gc,
21                             evt->area.x, evt->area.y,
22                             evt->area.width,
23                             evt->area.height,
24                             GDK_RGB_DITHER_MAX,
25                             gdk_pixbuf_get_pixels (pixbuf) +
26                             (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
27                             (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
28                             gdk_pixbuf_get_rowstride (pixbuf));
29    }
30    else
31    {
32       gdk_draw_rgb_image(drawing_area->window, 
33                          drawing_area->style->black_gc, 
34                          evt->area.x, evt->area.y,
35                          evt->area.width,
36                          evt->area.height,  
37                          GDK_RGB_DITHER_NORMAL,
38                          gdk_pixbuf_get_pixels (pixbuf) +
39                          (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
40                          (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
41                          gdk_pixbuf_get_rowstride (pixbuf));
42    }
43    return FALSE;
44 }
45
46 int configure_cb(GtkWidget *drawing_area, GdkEventConfigure *evt, gpointer data)
47 {
48    GdkPixbuf *pixbuf;
49                            
50    pixbuf = (GdkPixbuf *) gtk_object_get_data(GTK_OBJECT(drawing_area),   
51                                               "pixbuf");
52     
53    g_print("X:%d Y:%d\n", evt->width, evt->height);
54    if(evt->width != gdk_pixbuf_get_width (pixbuf) || evt->height != gdk_pixbuf_get_height (pixbuf))
55    {
56       GdkWindow *root;
57       GdkPixbuf *new_pixbuf;
58
59       root = GDK_ROOT_PARENT();
60       new_pixbuf = gdk_pixbuf_get_from_drawable(NULL, root, NULL,
61                                                 0, 0, 0, 0, evt->width, evt->height);
62       gtk_object_set_data(GTK_OBJECT(drawing_area), "pixbuf", new_pixbuf);
63       gdk_pixbuf_unref(pixbuf);
64    }
65
66    return FALSE;
67 }
68
69 extern void pixbuf_init();
70
71 int main(int argc, char **argv)
72 {   
73    GdkWindow     *root;
74    GtkWidget     *window;
75    GtkWidget     *vbox;
76    GtkWidget     *drawing_area;
77    GdkPixbuf     *pixbuf;    
78    
79    pixbuf_init ();
80
81    gtk_init(&argc, &argv);   
82    gdk_rgb_set_verbose(TRUE);
83    gdk_rgb_init();
84
85    gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
86
87    root = GDK_ROOT_PARENT();
88    pixbuf = gdk_pixbuf_get_from_drawable(NULL, root, NULL,
89                                          0, 0, 0, 0, 150, 160);
90    
91    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
92    gtk_signal_connect(GTK_OBJECT(window), "delete_event",
93                       GTK_SIGNAL_FUNC(close_app), NULL);
94    gtk_signal_connect(GTK_OBJECT(window), "destroy",   
95                       GTK_SIGNAL_FUNC(close_app), NULL);
96    
97    vbox = gtk_vbox_new(FALSE, 0);
98    gtk_container_add(GTK_CONTAINER(window), vbox);  
99    
100    drawing_area = gtk_drawing_area_new();
101    gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area),
102                          gdk_pixbuf_get_width (pixbuf),
103                          gdk_pixbuf_get_height (pixbuf));
104    gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event",
105                       GTK_SIGNAL_FUNC(expose_cb), NULL);
106
107    gtk_signal_connect(GTK_OBJECT(drawing_area), "configure_event",
108                       GTK_SIGNAL_FUNC(configure_cb), NULL);
109    gtk_object_set_data(GTK_OBJECT(drawing_area), "pixbuf", pixbuf);
110    gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);
111    
112    gtk_widget_show_all(window);
113    gtk_main();
114    return 0;
115 }