diff src/xfns.c @ 52095:a2208fe45c36

* xfns.c (xg_set_icon): Rewrite to compile with GTK 2.0 and 2.2. * xterm.c (x_bitmap_icon): Return if xg_set_icon succeeds.
author Jan Djärv <jan.h.d@swipnet.se>
date Thu, 31 Jul 2003 16:10:53 +0000
parents c3f9f23be6a8
children 1a4bd2bec861
line wrap: on
line diff
--- a/src/xfns.c	Thu Jul 31 01:24:44 2003 +0000
+++ b/src/xfns.c	Thu Jul 31 16:10:53 2003 +0000
@@ -1092,36 +1092,51 @@
 
 #ifdef USE_GTK
 
-/* Wrapper for gtk_window_icon_from_file() */
+static Lisp_Object x_find_image_file P_ ((Lisp_Object file));
+
+/* Set icon from FILE for frame F.  By using GTK functions the icon
+   may be any format that GdkPixbuf knows about, i.e. not just bitmaps.  */
 
 int
 xg_set_icon(f, file)
-    struct frame *f;
+    FRAME_PTR f;
     Lisp_Object file;
 {
-    struct gcpro gcpro1, gcpro2, gcpro3;
-    int fd;
-    int result = 1;
-    Lisp_Object found, search_path;
-    char *filename;
-
-    search_path = Fcons (Vdata_directory, Vx_bitmap_file_path);
-
-    GCPRO3 (found, search_path, file);
-    fd = openp (search_path, file, Qnil, &found, Qnil);
-    if (fd > 0)
-      {
-	filename = (char *) SDATA (found);
-	BLOCK_INPUT;
-	result =
-	  gtk_window_set_icon_from_file (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
-					 filename,
-					 NULL);
-	UNBLOCK_INPUT;
-      }
-    emacs_close (fd);
-    UNGCPRO;
-    return result;
+  struct gcpro gcpro1;
+  int result = 0;
+  Lisp_Object found;
+
+  GCPRO1 (found);
+
+  found = x_find_image_file (file);
+
+  if (! NILP (found))
+    {
+      GdkPixbuf *pixbuf;
+      GError *err = NULL;
+      char *filename;
+
+      filename = SDATA (found);
+      BLOCK_INPUT;
+
+      pixbuf = gdk_pixbuf_new_from_file (filename, &err);
+
+      if (pixbuf)
+	{
+	  gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
+			       pixbuf);
+	  g_object_unref (pixbuf);
+
+	  result = 1;
+	}
+      else
+	g_error_free (err);
+
+      UNBLOCK_INPUT;
+    }
+
+  UNGCPRO;
+  return result;
 }
 #endif /* USE_GTK */