*
*/
-#include <config.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <math.h>
+#include "demo-common.h"
+
#define FRAME_DELAY 50
-#define RELATIVE_BACKGROUND_NAME "background.jpg"
-#define INSTALLED_BACKGROUND_NAME DEMOCODEDIR"/background.jpg"
+#define BACKGROUND_NAME "background.jpg"
-static const char *relative_image_names[] = {
+static const char *image_names[] = {
"apple-red.png",
"gnome-applets.png",
"gnome-calendar.png",
"gnu-keys.png"
};
-static const char *installed_image_names[] = {
- DEMOCODEDIR"/apple-red.png",
- DEMOCODEDIR"/gnome-applets.png",
- DEMOCODEDIR"/gnome-calendar.png",
- DEMOCODEDIR"/gnome-foot.png",
- DEMOCODEDIR"/gnome-gmush.png",
- DEMOCODEDIR"/gnome-gimp.png",
- DEMOCODEDIR"/gnome-gsame.png",
- DEMOCODEDIR"/gnu-keys.png"
-};
-
-#define N_IMAGES G_N_ELEMENTS (relative_image_names)
+#define N_IMAGES G_N_ELEMENTS (image_names)
/* demo window */
static GtkWidget *window = NULL;
load_pixbufs (GError **error)
{
gint i;
- const gchar **image_names;
+ char *filename;
if (background)
return TRUE; /* already loaded earlier */
- background = gdk_pixbuf_new_from_file (RELATIVE_BACKGROUND_NAME, NULL);
-
- if (!background)
- background = gdk_pixbuf_new_from_file (INSTALLED_BACKGROUND_NAME, error);
+ /* demo_find_file() looks in the current directory first,
+ * so you can run gtk-demo without installing GTK, then looks
+ * in the location where the file is installed.
+ */
+ filename = demo_find_file (BACKGROUND_NAME, error);
+ if (!filename)
+ return FALSE; /* note that "error" was filled in and returned */
+ background = gdk_pixbuf_new_from_file (filename, error);
+ g_free (filename);
+
if (!background)
- return FALSE; /* note that "error" was filled in and returned */
+ return FALSE; /* Note that "error" was filled with a GError */
back_width = gdk_pixbuf_get_width (background);
back_height = gdk_pixbuf_get_height (background);
- if (g_file_test (relative_image_names[0], G_FILE_TEST_EXISTS))
- image_names = relative_image_names;
- else
- image_names = installed_image_names;
-
for (i = 0; i < N_IMAGES; i++)
{
- images[i] = gdk_pixbuf_new_from_file (image_names[i], error);
+ filename = demo_find_file (image_names[i], error);
+ if (!filename)
+ return FALSE; /* Note that "error" was filled with a GError */
+
+ images[i] = gdk_pixbuf_new_from_file (filename, error);
+ g_free (filename);
+
if (!images[i])
- return FALSE; /* Note that "error" was filled with a GError */
+ return FALSE; /* Note that "error" was filled with a GError */
}
return TRUE;
/* Expose callback for the drawing area */
static gint
-expose_cb (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer data)
+expose_cb (GtkWidget *widget,
+ GdkEventExpose *event,
+ gpointer data)
{
guchar *pixels;
int rowstride;
pixels = gdk_pixbuf_get_pixels (frame) + rowstride * event->area.y + event->area.x * 3;
gdk_draw_rgb_image_dithalign (widget->window,
- widget->style->black_gc,
- event->area.x, event->area.y,
- event->area.width, event->area.height,
- GDK_RGB_DITHER_NORMAL,
- pixels, rowstride,
- event->area.x, event->area.y);
+ widget->style->black_gc,
+ event->area.x, event->area.y,
+ event->area.width, event->area.height,
+ GDK_RGB_DITHER_NORMAL,
+ pixels, rowstride,
+ event->area.x, event->area.y);
return TRUE;
}
double radius;
gdk_pixbuf_copy_area (background, 0, 0, back_width, back_height,
- frame, 0, 0);
+ frame, 0, 0);
f = (double) (frame_num % CYCLE_LEN) / CYCLE_LEN;
GdkRectangle r1, r2, dest;
double k;
- ang = 2.0 * M_PI * (double) i / N_IMAGES - f * 2.0 * M_PI;
+ ang = 2.0 * G_PI * (double) i / N_IMAGES - f * 2.0 * G_PI;
iw = gdk_pixbuf_get_width (images[i]);
ih = gdk_pixbuf_get_height (images[i]);
- r = radius + (radius / 3.0) * sin (f * 2.0 * M_PI);
+ r = radius + (radius / 3.0) * sin (f * 2.0 * G_PI);
xpos = floor (xmid + r * cos (ang) - iw / 2.0 + 0.5);
ypos = floor (ymid + r * sin (ang) - ih / 2.0 + 0.5);
- k = (i & 1) ? sin (f * 2.0 * M_PI) : cos (f * 2.0 * M_PI);
+ k = (i & 1) ? sin (f * 2.0 * G_PI) : cos (f * 2.0 * G_PI);
k = 2.0 * k * k;
k = MAX (0.25, k);
r2.height = back_height;
if (gdk_rectangle_intersect (&r1, &r2, &dest))
- gdk_pixbuf_composite (images[i],
- frame,
- dest.x, dest.y,
- dest.width, dest.height,
- xpos, ypos,
- k, k,
- GDK_INTERP_NEAREST,
- ((i & 1)
- ? MAX (127, fabs (255 * sin (f * 2.0 * M_PI)))
- : MAX (127, fabs (255 * cos (f * 2.0 * M_PI)))));
+ gdk_pixbuf_composite (images[i],
+ frame,
+ dest.x, dest.y,
+ dest.width, dest.height,
+ xpos, ypos,
+ k, k,
+ GDK_INTERP_NEAREST,
+ ((i & 1)
+ ? MAX (127, fabs (255 * sin (f * 2.0 * G_PI)))
+ : MAX (127, fabs (255 * cos (f * 2.0 * G_PI)))));
}
+ GDK_THREADS_ENTER ();
gtk_widget_queue_draw (da);
+ GDK_THREADS_LEAVE ();
frame_num++;
return TRUE;
static void
cleanup_callback (GtkObject *object,
- gpointer data)
+ gpointer data)
{
g_source_remove (timeout_id);
timeout_id = 0;
}
GtkWidget *
-do_pixbufs (void)
+do_pixbufs (GtkWidget *do_widget)
{
if (!window)
{
GError *error;
-
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_screen (GTK_WINDOW (window),
+ gtk_widget_get_screen (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Pixbufs");
- gtk_window_set_resizeable (GTK_WINDOW (window), FALSE);
+ gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
- gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
- gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (cleanup_callback), NULL);
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed), &window);
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (cleanup_callback), NULL);
error = NULL;
if (!load_pixbufs (&error))
- {
- GtkWidget *dialog;
+ {
+ GtkWidget *dialog;
- dialog = gtk_message_dialog_new (GTK_WINDOW (window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- "Failed to load an image: %s",
- error->message);
+ dialog = gtk_message_dialog_new (GTK_WINDOW (window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "Failed to load an image: %s",
+ error->message);
- g_error_free (error);
+ g_error_free (error);
- gtk_signal_connect (GTK_OBJECT (dialog),
- "response",
- GTK_SIGNAL_FUNC (gtk_widget_destroy),
- NULL);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_widget_show (dialog);
- }
+ gtk_widget_show (dialog);
+ }
else
- {
- gtk_widget_set_usize (window, back_width, back_height);
+ {
+ gtk_widget_set_size_request (window, back_width, back_height);
- frame = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, back_width, back_height);
+ frame = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, back_width, back_height);
- da = gtk_drawing_area_new ();
+ da = gtk_drawing_area_new ();
- gtk_signal_connect (GTK_OBJECT (da), "expose_event",
- GTK_SIGNAL_FUNC (expose_cb), NULL);
+ g_signal_connect (da, "expose-event",
+ G_CALLBACK (expose_cb), NULL);
- gtk_container_add (GTK_CONTAINER (window), da);
+ gtk_container_add (GTK_CONTAINER (window), da);
- timeout_id = gtk_timeout_add (FRAME_DELAY, timeout, NULL);
- }
+ timeout_id = g_timeout_add (FRAME_DELAY, timeout, NULL);
+ }
}
- if (!GTK_WIDGET_VISIBLE (window))
+ if (!gtk_widget_get_visible (window))
{
gtk_widget_show_all (window);
}
{
gtk_widget_destroy (window);
window = NULL;
+ g_object_unref (frame);
}
return window;