classpath-patches
[Top][All Lists]
Advanced

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

[cp-patches] FYI: GtkFramePeer.setIconImage() implementation from gcj gu


From: Mark Wielaard
Subject: [cp-patches] FYI: GtkFramePeer.setIconImage() implementation from gcj gui-branch
Date: Sun, 08 Aug 2004 15:39:26 +0200

Hi,

This imports the GtkFramePeer.setIconImage() implementation that David
Jee made. See also http://gcc.gnu.org/PR16682
Now if you call Frame.setIconImage() your AWT window will get a nice
icon from the window manager.

Note that depending on timing and runtime used this will trigger bug 
http://gcc.gnu.org/PR16824 "GdkPixbufDecoder crashes with image loading
programs" when used early in your program.

2004-08-08  David Jee  <address@hidden>

        PR AWT/16682
        * gnu/java/awt/peer/gtk/GtkFramePeer.java
        (nativeSetIconImage): Rename to nativeSetIconImageFromDecoder.
        (nativeSetIconImageFromData): New native method declaration.
        (setIconImage): Handle images not produced from GdkPixbufDecoder.
        * gnu/java/awt/peer/gtk/GtkImage.java
        (getPixelCache): New method.
        (getColorModel): New method.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        (nativeSetIconImage): Rename to nativeSetIconImageFromDecoder.
        (free_pixbuf_data): New helper function.
        (nativeSetIconImageFromData): New function. 

Committed.

Cheers,

Mark
Index: gnu/java/awt/peer/gtk/GtkImage.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkImage.java,v
retrieving revision 1.12
diff -u -r1.12 GtkImage.java
--- gnu/java/awt/peer/gtk/GtkImage.java 22 Jul 2004 19:45:38 -0000      1.12
+++ gnu/java/awt/peer/gtk/GtkImage.java 8 Aug 2004 13:22:51 -0000
@@ -89,6 +89,18 @@
     this.observer = observer;
   }
 
+  public synchronized int[]
+  getPixelCache ()
+  {
+    return pixelCache;
+  }
+
+  public synchronized ColorModel
+  getColorModel ()
+  {
+    return model;
+  }
+
   public synchronized int 
   getWidth (ImageObserver observer)
   {
Index: gnu/java/awt/peer/gtk/GtkFramePeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java,v
retrieving revision 1.25
diff -u -r1.25 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java     30 Jul 2004 23:16:58 -0000      
1.25
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java     8 Aug 2004 13:22:51 -0000
@@ -47,6 +47,7 @@
 import java.awt.Rectangle;
 import java.awt.Window;
 import java.awt.event.PaintEvent;
+import java.awt.image.ColorModel;
 import java.awt.peer.FramePeer;
 import java.awt.peer.MenuBarPeer;
 
@@ -143,11 +144,39 @@
 
     setTitle (frame.getTitle ());
     setResizable (frame.isResizable ());
+    setIconImage(frame.getIconImage());
   }
 
+  native void nativeSetIconImageFromDecoder (GdkPixbufDecoder decoder);
+  native void nativeSetIconImageFromData (int[] pixels, int width, int height);
   public void setIconImage (Image image) 
   {
-      /* TODO: Waiting on Toolkit Image routines */
+      if (image != null)
+        {
+          GtkImage img = (GtkImage) image;
+          // FIXME: Image should be loaded, but if not, do image loading here.
+          if (img.isLoaded())
+            {
+              if (img.getSource() instanceof GdkPixbufDecoder)
+                {
+                  nativeSetIconImageFromDecoder((GdkPixbufDecoder) 
img.getSource());
+                }
+              else
+                {
+                  int[] pixels = img.getPixelCache();
+                  ColorModel model = img.getColorModel();
+                  int[] data = new int[pixels.length * 4];
+                  for (int i = 0; i < pixels.length; i++)
+                    {
+                      data[i * 4] = model.getRed(pixels[i]);
+                      data[i * 4 + 1] = model.getGreen(pixels[i]);
+                      data[i * 4 + 2] = model.getBlue(pixels[i]);
+                      data[i * 4 + 3] = model.getAlpha(pixels[i]);
+                    }
+                  nativeSetIconImageFromData(data, img.getWidth(null), 
img.getHeight(null));
+                }
+            }
+        }
   }
 
   public Graphics getGraphics ()
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.31
diff -u -r1.31 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   30 Jul 2004 
23:16:58 -0000      1.31
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   8 Aug 2004 
13:22:51 -0000
@@ -44,6 +44,8 @@
 #include <gdk/gdkx.h>
 #include <X11/Xatom.h>
 
+struct state_table *native_pixbufdecoder_state_table;
+
 /* FIXME: we're currently seeing the double-activation that occurs
    with metacity and GTK.  See
    http://bugzilla.gnome.org/show_bug.cgi?id=140977 for details. */
@@ -535,6 +537,72 @@
   gdk_threads_leave ();
 }
 
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder
+  (JNIEnv *env, jobject obj, jobject decoder)
+{
+  void *ptr;
+  GdkPixbufLoader *loader = NULL;
+  GdkPixbuf *pixbuf = NULL;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  loader = get_state (env, decoder, native_pixbufdecoder_state_table);
+  g_assert (loader != NULL);
+
+  gdk_threads_enter ();
+
+  pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+  g_assert (pixbuf != NULL);
+
+  gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf);
+
+  gdk_threads_leave ();
+}
+
+void free_pixbuf_data (guchar *pixels, gpointer data __attribute__((unused)))
+{
+  free(pixels);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromData
+  (JNIEnv *env, jobject obj, jintArray pixelArray, jint width, jint height)
+{
+  void *ptr;
+  GdkPixbuf *pixbuf;
+  jint *pixels;
+  int pixels_length, i;
+  guchar *data;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  pixels = (*env)->GetIntArrayElements (env, pixelArray, 0);
+  pixels_length = (*env)->GetArrayLength (env, pixelArray);
+
+  data = malloc (sizeof (guchar) * pixels_length);
+  for (i = 0; i < pixels_length; i++)
+    data[i] = (guchar) pixels[i];
+
+  gdk_threads_enter ();
+
+  pixbuf = gdk_pixbuf_new_from_data (data,
+                                     GDK_COLORSPACE_RGB,
+                                     TRUE,
+                                     8,
+                                     width,
+                                     height,
+                                     width*4,
+                                     free_pixbuf_data,
+                                     NULL);
+
+  gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf);
+
+  gdk_threads_leave ();
+
+  (*env)->ReleaseIntArrayElements(env, pixelArray, pixels, 0);
+}
+
 static void
 window_get_frame_extents (GtkWidget *window,
                           int *top, int *left, int *bottom, int *right)

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]