[Top][All Lists]
[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)
signature.asc
Description: This is a digitally signed message part
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cp-patches] FYI: GtkFramePeer.setIconImage() implementation from gcj gui-branch,
Mark Wielaard <=