]> Pileus Git - ~andy/gtk/blobdiff - demos/gtk-demo/pixbufs.c
Deprecate widget flag: GTK_WIDGET_VISIBLE
[~andy/gtk] / demos / gtk-demo / pixbufs.c
index 6c067098ac842e05c86fa982aeef74404eccc5a8..d7b7eef3e9cfe6bf81502098c4ea718c85e75424 100644 (file)
@@ -9,22 +9,20 @@
  * off how to use GtkDrawingArea to do a simple animation.
  *
  * Look at the Image demo for additional pixbuf usage examples.
- * 
+ *
  */
 
-#include <config.h>
 #include <stdlib.h>
 #include <gtk/gtk.h>
 #include <math.h>
 
-\f
+#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",
@@ -35,28 +33,17 @@ static const char *relative_image_names[] = {
   "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 GtkWindow *window = NULL;
+static GtkWidget *window = NULL;
 
 /* Current frame */
 static GdkPixbuf *frame;
 
 /* Background image */
 static GdkPixbuf *background;
-static int back_width, back_height;
+static gint back_width, back_height;
 
 /* Images */
 static GdkPixbuf *images[N_IMAGES];
@@ -64,37 +51,42 @@ static GdkPixbuf *images[N_IMAGES];
 /* Widgets */
 static GtkWidget *da;
 
-\f
-
 /* Loads the images for the demo and returns whether the operation succeeded */
 static gboolean
 load_pixbufs (GError **error)
 {
-  int i;
-  const char **image_names;
+  gint i;
+  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);
 
-  if (!background)
+  /* 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 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 */
     }
@@ -104,7 +96,9 @@ load_pixbufs (GError **error)
 
 /* 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;
@@ -112,7 +106,7 @@ expose_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data)
   rowstride = gdk_pixbuf_get_rowstride (frame);
 
   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,
@@ -156,17 +150,17 @@ timeout (gpointer data)
       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);
 
@@ -189,11 +183,13 @@ timeout (gpointer data)
                               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)))));
+                               ? 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;
@@ -203,67 +199,68 @@ static guint timeout_id;
 
 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_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);
+      gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
+
+      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;
-          
+
           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);
-          
-          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);
         }
       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);
-          
+
           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);
-          
-          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);
     }
@@ -271,6 +268,7 @@ do_pixbufs (void)
     {
       gtk_widget_destroy (window);
       window = NULL;
+      g_object_unref (frame);
     }
 
   return window;