summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/native/jni/gtk-peer
diff options
context:
space:
mode:
authormark <mark@138bc75d-0d04-0410-961f-82ee72b054a4>2006-05-18 17:29:21 +0000
committermark <mark@138bc75d-0d04-0410-961f-82ee72b054a4>2006-05-18 17:29:21 +0000
commit64089cc9f030d8ef7972adb5d117e0b23f47d62b (patch)
tree9f9c470de62ee62fba1331a396450d728d2b1fad /libjava/classpath/native/jni/gtk-peer
parent96034e28360d660d7a7708807fcbc4b519574d8e (diff)
downloadppe42-gcc-64089cc9f030d8ef7972adb5d117e0b23f47d62b.tar.gz
ppe42-gcc-64089cc9f030d8ef7972adb5d117e0b23f47d62b.zip
Imported GNU Classpath 0.90
* scripts/makemake.tcl: LocaleData.java moved to gnu/java/locale. * sources.am: Regenerated. * gcj/javaprims.h: Regenerated. * Makefile.in: Regenerated. * gcj/Makefile.in: Regenerated. * include/Makefile.in: Regenerated. * testsuite/Makefile.in: Regenerated. * gnu/java/lang/VMInstrumentationImpl.java: New override. * gnu/java/net/local/LocalSocketImpl.java: Likewise. * gnu/classpath/jdwp/VMMethod.java: Likewise. * gnu/classpath/jdwp/VMVirtualMachine.java: Update to latest interface. * java/lang/Thread.java: Add UncaughtExceptionHandler. * java/lang/reflect/Method.java: Implements GenericDeclaration and isSynthetic(), * java/lang/reflect/Field.java: Likewise. * java/lang/reflect/Constructor.java * java/lang/Class.java: Implements Type, GenericDeclaration, getSimpleName() and getEnclosing*() methods. * java/lang/Class.h: Add new public methods. * java/lang/Math.java: Add signum(), ulp() and log10(). * java/lang/natMath.cc (log10): New function. * java/security/VMSecureRandom.java: New override. * java/util/logging/Logger.java: Updated to latest classpath version. * java/util/logging/LogManager.java: New override. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113887 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/classpath/native/jni/gtk-peer')
-rw-r--r--libjava/classpath/native/jni/gtk-peer/Makefile.in19
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c70
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c102
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c4
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c25
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c14
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c12
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c58
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c71
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c166
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c148
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c40
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c55
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c37
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c54
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkSelection.c59
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c75
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c21
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gtkpeer.h8
19 files changed, 699 insertions, 339 deletions
diff --git a/libjava/classpath/native/jni/gtk-peer/Makefile.in b/libjava/classpath/native/jni/gtk-peer/Makefile.in
index 9f4f3321b24..a90bf483bc5 100644
--- a/libjava/classpath/native/jni/gtk-peer/Makefile.in
+++ b/libjava/classpath/native/jni/gtk-peer/Makefile.in
@@ -167,6 +167,7 @@ CAIRO_LIBS = @CAIRO_LIBS@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CLASSPATH_CONVENIENCE = @CLASSPATH_CONVENIENCE@
CLASSPATH_INCLUDES = @CLASSPATH_INCLUDES@
CLASSPATH_MODULE = @CLASSPATH_MODULE@
COLLECTIONS_PREFIX = @COLLECTIONS_PREFIX@
@@ -206,6 +207,8 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
ECJ = @ECJ@
EGREP = @EGREP@
+ENABLE_LOCAL_SOCKETS_FALSE = @ENABLE_LOCAL_SOCKETS_FALSE@
+ENABLE_LOCAL_SOCKETS_TRUE = @ENABLE_LOCAL_SOCKETS_TRUE@
ERROR_CFLAGS = @ERROR_CFLAGS@
EXAMPLESDIR = @EXAMPLESDIR@
EXEEXT = @EXEEXT@
@@ -226,6 +229,7 @@ FREETYPE2_LIBS = @FREETYPE2_LIBS@
GCJ = @GCJ@
GCJX = @GCJX@
GJDOC = @GJDOC@
+GREP = @GREP@
GTK_CAIRO_ENABLED = @GTK_CAIRO_ENABLED@
GTK_CAIRO_FALSE = @GTK_CAIRO_FALSE@
GTK_CAIRO_TRUE = @GTK_CAIRO_TRUE@
@@ -273,6 +277,7 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
PANGOFT2_LIBS = @PANGOFT2_LIBS@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PATH_TO_GLIBJ_ZIP = @PATH_TO_GLIBJ_ZIP@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
QT_CFLAGS = @QT_CFLAGS@
@@ -291,8 +296,11 @@ USER_SPECIFIED_CLASSLIB_FALSE = @USER_SPECIFIED_CLASSLIB_FALSE@
USER_SPECIFIED_CLASSLIB_TRUE = @USER_SPECIFIED_CLASSLIB_TRUE@
USER_SPECIFIED_JAVAH_FALSE = @USER_SPECIFIED_JAVAH_FALSE@
USER_SPECIFIED_JAVAH_TRUE = @USER_SPECIFIED_JAVAH_TRUE@
+USE_PREBUILT_GLIBJ_ZIP_FALSE = @USE_PREBUILT_GLIBJ_ZIP_FALSE@
+USE_PREBUILT_GLIBJ_ZIP_TRUE = @USE_PREBUILT_GLIBJ_ZIP_TRUE@
VERSION = @VERSION@
WARNING_CFLAGS = @WARNING_CFLAGS@
+XMKMF = @XMKMF@
XML_CFLAGS = @XML_CFLAGS@
XML_LIBS = @XML_LIBS@
XSLT_CFLAGS = @XSLT_CFLAGS@
@@ -304,8 +312,6 @@ X_PRE_LIBS = @X_PRE_LIBS@
ZIP = @ZIP@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
@@ -322,7 +328,10 @@ build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
+datarootdir = @datarootdir@
default_toolkit = @default_toolkit@
+docdir = @docdir@
+dvidir = @dvidir@
exec_prefix = @exec_prefix@
glibjdir = @glibjdir@
host = @host@
@@ -330,18 +339,22 @@ host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
+htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
+localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
-nativelibdir = @nativelibdir@
+nativeexeclibdir = @nativeexeclibdir@
oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
+psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
index 30f2d5e24cd..0726fb531bb 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
@@ -217,10 +217,10 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector
}
(*env)->ReleaseStringUTFChars (env, chars, str);
-
+
for (i = g_list_first (items); i != NULL; i = g_list_next (i))
- g_free (i->data);
-
+ pango_item_free(i->data);
+
g_list_free (items);
gdk_threads_leave ();
@@ -239,6 +239,17 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics
struct peerfont *pfont = NULL;
jdouble *native_metrics = NULL;
PangoFontMetrics *pango_metrics = NULL;
+ PangoLayout* layout = NULL;
+ PangoRectangle ink_rect;
+ PangoRectangle logical_rect;
+ PangoLayoutIter* iter = NULL;
+ int pango_ascent = 0;
+ int pango_descent = 0;
+ int pango_ink_ascent = 0;
+ int pango_ink_descent = 0;
+ int baseline = 0;
+ int java_ascent = 0;
+ int java_descent = 0;
gdk_threads_enter();
@@ -254,21 +265,52 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics
g_assert (native_metrics != NULL);
- native_metrics[FONT_METRICS_ASCENT]
- = PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics));
+ pango_ascent = PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics));
+ pango_descent = PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics));
+
+ layout = pango_layout_new (pfont->ctx);
+
+ /* Pango seems to produce ascent and descent values larger than
+ those that Sun produces for the same-sized font. It turns out
+ that an average of the "ink ascent" and "logical ascent" closely
+ approximates Sun's ascent values. Likewise for descent values.
+ This is expensive but we cache GdkFontMetrics so this should only
+ run once per Font instance. */
+ pango_layout_set_text (layout, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL"
+ "MNOPQRSTUVWXYZ0123456789", -1);
+ pango_layout_set_font_description (layout, pfont->desc);
+
+ pango_layout_get_pixel_extents (layout, &ink_rect, &logical_rect);
- native_metrics[FONT_METRICS_MAX_ASCENT]
- = native_metrics[FONT_METRICS_ASCENT];
+ iter = pango_layout_get_iter (layout);
+
+ baseline = PANGO_PIXELS (pango_layout_iter_get_baseline (iter));
+
+ pango_ink_ascent = baseline - ink_rect.y;
+ pango_ink_descent = ink_rect.y + ink_rect.height - baseline;
+
+ java_ascent = (pango_ascent + pango_ink_ascent) >> 1;
+ java_descent = (pango_descent + pango_ink_descent) >> 1;
+
+ java_ascent = MAX(0, java_ascent);
+ java_descent = MAX(0, java_descent);
+
+ pango_ascent = MAX(0, pango_ascent);
+ pango_descent = MAX(0, pango_descent);
+
+ /* Pango monospaced fonts have smaller ascent metrics than Sun's so
+ we return the logical ascent for monospaced fonts. */
+ if (!strcmp (pango_font_description_get_family (pfont->desc),
+ "Courier"))
+ native_metrics[FONT_METRICS_ASCENT] = pango_ascent;
+ else
+ native_metrics[FONT_METRICS_ASCENT] = java_ascent;
- native_metrics[FONT_METRICS_DESCENT]
- = PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics));
+ native_metrics[FONT_METRICS_MAX_ASCENT] = pango_ascent;
- if (native_metrics[FONT_METRICS_DESCENT] < 0)
- native_metrics[FONT_METRICS_DESCENT]
- = - native_metrics[FONT_METRICS_DESCENT];
+ native_metrics[FONT_METRICS_DESCENT] = java_descent;
- native_metrics[FONT_METRICS_MAX_DESCENT]
- = native_metrics[FONT_METRICS_DESCENT];
+ native_metrics[FONT_METRICS_MAX_DESCENT] = pango_descent;
native_metrics[FONT_METRICS_MAX_ADVANCE]
= PANGO_PIXELS (pango_font_metrics_get_approximate_char_width
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
index f6e0e6bda15..29bc1855bbf 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
@@ -43,6 +43,46 @@ exception statement from your version. */
static jmethodID initComponentGraphicsUnlockedID;
+/*
+ * AWT applications may call Graphics methods from threads other than
+ * the GDK main thread, so we must call XFlush after each batch of
+ * drawing operations, otherwise animations flicker. Flushing after
+ * every graphics operation is excessive and negatively affects
+ * performance (PR 26486). We set the maximum frequency to 50 times
+ * per second, or a minimum period of 20 milliseconds between calls to
+ * XFlush. See gnu.classpath.examples.awt.AnimationApplet for an
+ * example applet that requires these XFlush calls.
+ */
+
+static short flush_scheduled = 0;
+
+static gboolean flush (gpointer data __attribute__((unused)))
+{
+ gdk_threads_enter ();
+
+ XFlush (GDK_DISPLAY ());
+ flush_scheduled = 0;
+
+ gdk_threads_leave ();
+
+ return FALSE;
+}
+
+/* The minimum time period between calls to XFlush, in
+ milliseconds. */
+#define MINIMUM_FLUSH_PERIOD 20
+
+/* schedule_flush must be called with the GDK lock held. */
+static void
+schedule_flush ()
+{
+ if (!flush_scheduled)
+ {
+ g_timeout_add (MINIMUM_FLUSH_PERIOD, flush, NULL);
+ flush_scheduled = 1;
+ }
+}
+
void
cp_gtk_graphics_init_jni (void)
{
@@ -120,7 +160,8 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_nativeCopyState
else /* GDK_IS_WINDOW (g->drawable) */
g_object_ref (g->drawable);
- g_object_ref (g->cm);
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
NSA_SET_G_PTR (env, obj, g);
@@ -141,7 +182,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II
g->drawable = (GdkDrawable *) gdk_pixmap_new (NULL, width, height,
gdk_rgb_get_visual ()->depth);
g->cm = gdk_rgb_get_colormap ();
- g_object_ref (g->cm);
+
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
g->gc = gdk_gc_new (g->drawable);
NSA_SET_G_PTR (env, obj, g);
@@ -168,7 +211,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initFromImage
g->drawable = (GdkDrawable *)pixmap;
g->cm = gdk_drawable_get_colormap (g->drawable);
- g_object_ref (g->cm);
+
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
g->gc = gdk_gc_new (g->drawable);
NSA_SET_G_PTR (env, obj, g);
@@ -195,7 +240,10 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initStateUnlocked
g_object_ref (g->drawable);
g->cm = gtk_widget_get_colormap (widget);
- g_object_ref (g->cm);
+
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
+
g->gc = gdk_gc_new (g->drawable);
gdk_gc_copy (g->gc, widget->style->fg_gc[GTK_STATE_NORMAL]);
color = widget->style->fg[GTK_STATE_NORMAL];
@@ -253,15 +301,17 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_nativeDispose
}
XFlush (GDK_DISPLAY ());
-
- g_object_unref (g->gc);
+
+ if (g->gc != NULL)
+ g_object_unref (g->gc);
if (GDK_STABLE_IS_PIXMAP (g->drawable))
g_object_unref (g->drawable);
- else /* GDK_IS_WINDOW (g->drawable) */
+ else if (g->drawable != NULL)
g_object_unref (g->drawable);
- g_object_unref (g->cm);
+ if (g->cm != NULL)
+ g_object_unref (g->cm);
g_free (g);
@@ -343,7 +393,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString
pango_layout_iter_free (iter);
pango_layout_set_text (pfont->layout, "", -1);
- gdk_flush ();
+ schedule_flush ();
(*env)->ReleaseStringUTFChars (env, str, cstr);
@@ -363,7 +413,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawLine
gdk_draw_line (g->drawable, g->gc,
x + g->x_offset, y + g->y_offset,
x2 + g->x_offset, y2 + g->y_offset);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -380,7 +430,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_fillRect
gdk_draw_rectangle (g->drawable, g->gc, TRUE,
x + g->x_offset, y + g->y_offset, width, height);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -397,7 +447,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawRect
gdk_draw_rectangle (g->drawable, g->gc, FALSE,
x + g->x_offset, y + g->y_offset, width, height);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -419,7 +469,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_copyArea
x + g->x_offset, y + g->y_offset,
x + g->x_offset + dx, y + g->y_offset + dy,
width, height);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -455,13 +505,13 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect
else
{
gdk_gc_get_values (g->gc, &saved);
- gdk_gc_set_foreground (g->gc, &(saved.background));
+ gdk_gc_set_background (g->gc, &(saved.background));
gdk_draw_rectangle (g->drawable, g->gc, TRUE,
x + g->x_offset, y + g->y_offset, width, height);
gdk_gc_set_foreground (g->gc, &(saved.foreground));
}
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -496,10 +546,12 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_setFGColor
color.blue = blue << 8;
g = (struct graphics *) NSA_GET_G_PTR (env, obj);
-
- gdk_colormap_alloc_color (g->cm, &color, TRUE, TRUE);
+
+ if (g->cm != NULL)
+ gdk_colormap_alloc_color (g->cm, &color, TRUE, TRUE);
+
gdk_gc_set_foreground (g->gc, &color);
-
+
gdk_threads_leave ();
}
@@ -517,7 +569,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawArc
gdk_draw_arc (g->drawable, g->gc, FALSE,
x + g->x_offset, y + g->y_offset,
width, height, angle1 << 6, angle2 << 6);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -564,7 +616,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolyline
g->x_offset, g->y_offset);
gdk_draw_lines (g->drawable, g->gc, points, npoints);
- gdk_flush ();
+ schedule_flush ();
g_free (points);
@@ -591,7 +643,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolygon
points[npoints++] = points[0];
gdk_draw_lines (g->drawable, g->gc, points, npoints);
- gdk_flush ();
+ schedule_flush ();
g_free (points);
@@ -612,7 +664,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_fillPolygon
points = translate_points (env, xpoints, ypoints, npoints,
g->x_offset, g->y_offset);
gdk_draw_polygon (g->drawable, g->gc, TRUE, points, npoints);
- gdk_flush ();
+ schedule_flush ();
g_free (points);
@@ -633,7 +685,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_fillArc
gdk_draw_arc (g->drawable, g->gc, TRUE,
x + g->x_offset, y + g->y_offset,
width, height, angle1 << 6, angle2 << 6);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -651,7 +703,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_drawOval
gdk_draw_arc (g->drawable, g->gc, FALSE,
x + g->x_offset, y + g->y_offset,
width, height, 0, 23040);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
@@ -669,7 +721,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_fillOval
gdk_draw_arc (g->drawable, g->gc, TRUE,
x + g->x_offset, y + g->y_offset,
width, height, 0, 23040);
- gdk_flush ();
+ schedule_flush ();
gdk_threads_leave ();
}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
index c95ea614b7a..b42f649a15a 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
@@ -1992,6 +1992,10 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilterUnlocked
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
+
+ if (gr->pattern == NULL)
+ return;
+
if (gr->debug) printf ("cairo_pattern_set_filter %d\n", filter);
switch ((enum java_awt_rendering_hints_filter) filter)
{
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
index 4d6169b85e5..eba00fb6827 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
@@ -1,5 +1,5 @@
/* gdkpixbufdecoder.c
- Copyright (C) 1999, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -191,8 +191,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState
GdkPixbufLoader *loader = NULL;
jobject *decoder = NULL;
- gdk_threads_enter ();
-
decoder = (jobject *) g_malloc (sizeof (jobject));
g_assert (decoder != NULL);
*decoder = (*env)->NewGlobalRef (env, obj);
@@ -204,8 +202,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState
g_signal_connect (loader, "closed", G_CALLBACK (closed_cb), decoder);
NSA_SET_PB_PTR (env, obj, loader);
-
- gdk_threads_leave ();
}
static void
@@ -317,8 +313,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish
{
GdkPixbufLoader *loader = NULL;
- gdk_threads_enter ();
-
loader = (GdkPixbufLoader *)NSA_DEL_PB_PTR (env, obj);
if (loader == NULL)
return;
@@ -326,8 +320,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish
if (needs_close)
gdk_pixbuf_loader_close (loader, NULL);
g_object_unref (loader);
-
- gdk_threads_leave ();
}
JNIEXPORT void JNICALL
@@ -337,8 +329,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpDone
GError *err = NULL;
GdkPixbufLoader *loader = NULL;
- gdk_threads_enter ();
-
loader = (GdkPixbufLoader *)NSA_GET_PB_PTR (env, obj);
g_assert (loader != NULL);
@@ -349,8 +339,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpDone
JCL_ThrowException (env, "java/io/IOException", err->message);
g_error_free (err);
}
-
- gdk_threads_leave ();
}
struct stream_save_request
@@ -370,6 +358,9 @@ save_to_stream(const gchar *buf,
jbyteArray jbuf;
jbyte *cbuf;
+ /* FIXME. Don't call user code directly on this thread.
+ Store bytes and signal a "pump" thread to deliver to user code.
+ Then we don't have to drop/acquire any locks. */
gdk_threads_leave ();
jbuf = (*(ssr->env))->NewByteArray ((ssr->env), count);
@@ -400,8 +391,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage
int i;
struct stream_save_request ssr;
- gdk_threads_enter ();
-
ssr.stream = &stream;
ssr.env = env;
@@ -465,8 +454,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage
(*env)->ReleaseStringUTFChars (env, jenctype, enctype);
(*env)->ReleaseIntArrayElements (env, jarr, ints, 0);
-
- gdk_threads_leave ();
}
@@ -478,8 +465,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes
jbyte *bytes = NULL;
GError *err = NULL;
- gdk_threads_enter ();
-
g_assert (len >= 1);
g_assert (jarr != NULL);
@@ -497,6 +482,4 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes
JCL_ThrowException (env, "java/io/IOException", err->message);
g_error_free (err);
}
-
- gdk_threads_leave ();
}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
index ef9ac12076a..f44361972ec 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
@@ -56,3 +56,17 @@ Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create
gdk_threads_leave ();
}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_realize (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+
+ gdk_threads_enter ();
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gtk_widget_realize (GTK_WIDGET (ptr));
+
+ gdk_threads_leave ();
+}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c
index 5ba300b7e20..16ef43c40ff 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c
@@ -39,6 +39,8 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h"
+static GtkWidget *comboboxgroup_get_widget (GtkWidget *widget);
+
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose
(JNIEnv *env, jobject obj)
@@ -59,7 +61,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, checkbox);
- button = GTK_RADIO_BUTTON (ptr);
+ button = GTK_RADIO_BUTTON (comboboxgroup_get_widget (GTK_WIDGET (ptr)));
/* Update the group to point to some other widget in the group. We
have to do this because Gtk doesn't have a separate object to
@@ -75,3 +77,11 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove
gdk_threads_leave ();
}
+
+static GtkWidget *
+comboboxgroup_get_widget (GtkWidget *widget)
+{
+ if (GTK_IS_EVENT_BOX (widget))
+ return gtk_bin_get_child (GTK_BIN(widget));
+ return widget;
+}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
index 297b4f853da..191cdda8fcc 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
@@ -42,6 +42,7 @@ exception statement from your version. */
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
static jmethodID postItemEventID;
+static GtkWidget *combobox_get_widget (GtkWidget *widget);
void
cp_gtk_checkbox_init_jni (void)
@@ -63,26 +64,35 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_create
(JNIEnv *env, jobject obj, jobject group)
{
GtkWidget *button;
+ GtkWidget *eventbox;
gdk_threads_enter ();
NSA_SET_GLOBAL_REF (env, obj);
-
+ eventbox = gtk_event_box_new ();
+
if (group == NULL)
+ {
button = gtk_check_button_new_with_label ("");
+ gtk_container_add (GTK_CONTAINER (eventbox), button);
+ gtk_widget_show (button);
+ }
else
{
void *native_group = NSA_GET_PTR (env, group);
button = gtk_radio_button_new_with_label_from_widget (native_group, "");
+ gtk_container_add (GTK_CONTAINER (eventbox), button);
+ gtk_widget_show (button);
+
if (native_group == NULL)
- {
- /* Set the native group so we can use the correct value the
- next time around. FIXME: this doesn't work! */
- NSA_SET_PTR (env, group, button);
- }
+ {
+ /* Set the native group so we can use the correct value the
+ next time around. FIXME: this doesn't work! */
+ NSA_SET_PTR (env, group, button);
+ }
}
- NSA_SET_PTR (env, obj, button);
+ NSA_SET_PTR (env, obj, eventbox);
gdk_threads_leave ();
}
@@ -93,18 +103,20 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals
{
void *ptr = NULL;
jobject *gref = NULL;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
gref = NSA_GET_GLOBAL_REF (env, obj);
+ bin = combobox_get_widget (GTK_WIDGET (ptr));
/* Checkbox signals */
- g_signal_connect (G_OBJECT (ptr), "toggled",
+ g_signal_connect (G_OBJECT (bin), "toggled",
G_CALLBACK (item_toggled_cb), *gref);
/* Component signals */
- cp_gtk_component_connect_signals (G_OBJECT (ptr), gref);
+ cp_gtk_component_connect_signals (G_OBJECT (bin), gref);
gdk_threads_leave ();
}
@@ -115,16 +127,18 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup
{
GtkRadioButton *button;
void *native_group, *ptr;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
+ bin = combobox_get_widget (GTK_WIDGET (ptr));
+
/* FIXME: we can't yet switch between a checkbutton and a
radiobutton. However, AWT requires this. For now we just
crash. */
- button = GTK_RADIO_BUTTON (ptr);
+ button = GTK_RADIO_BUTTON (bin);
native_group = NSA_GET_PTR (env, group);
if (native_group == NULL)
@@ -152,12 +166,14 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive
(JNIEnv *env, jobject obj, jboolean is_active)
{
void *ptr;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptr), is_active);
+ bin = combobox_get_widget (GTK_WIDGET (ptr));
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bin), is_active);
gdk_threads_leave ();
}
@@ -176,7 +192,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkWidgetModifyFont
ptr = NSA_GET_PTR (env, obj);
- button = GTK_WIDGET (ptr);
+ button = combobox_get_widget (GTK_WIDGET (ptr));
label = gtk_bin_get_child (GTK_BIN(button));
if (!label)
@@ -217,7 +233,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel
c_label = (*env)->GetStringUTFChars (env, label, NULL);
- label_widget = gtk_bin_get_child (GTK_BIN (ptr));
+ label_widget = gtk_bin_get_child (GTK_BIN (combobox_get_widget (GTK_WIDGET (ptr))));
gtk_label_set_text (GTK_LABEL (label_widget), c_label);
(*env)->ReleaseStringUTFChars (env, label, c_label);
@@ -233,3 +249,15 @@ item_toggled_cb (GtkToggleButton *item, jobject peer)
peer,
item->active);
}
+
+static GtkWidget *
+combobox_get_widget (GtkWidget *widget)
+{
+ GtkWidget *wid;
+
+ g_assert (GTK_IS_EVENT_BOX (widget));
+ wid = gtk_bin_get_child (GTK_BIN(widget));
+
+ return wid;
+}
+
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
index e9a0f693e1a..46949d99a84 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
@@ -40,6 +40,7 @@ exception statement from your version. */
#include "gnu_java_awt_peer_gtk_GtkChoicePeer.h"
static jmethodID postChoiceItemEventID;
+static GtkWidget *choice_get_widget (GtkWidget *widget);
void
cp_gtk_choice_init_jni (void)
@@ -61,16 +62,20 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create
(JNIEnv *env, jobject obj)
{
GtkWidget *combobox;
+ GtkWidget *eventbox;
jobject *gref;
gdk_threads_enter ();
NSA_SET_GLOBAL_REF (env, obj);
gref = NSA_GET_GLOBAL_REF (env, obj);
-
+
+ eventbox = gtk_event_box_new ();
combobox = gtk_combo_box_new_text ();
+ gtk_container_add (GTK_CONTAINER (eventbox), combobox);
+ gtk_widget_show (combobox);
- NSA_SET_PTR (env, obj, combobox);
+ NSA_SET_PTR (env, obj, eventbox);
gdk_threads_leave ();
}
@@ -81,18 +86,21 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_connectSignals
{
void *ptr = NULL;
jobject *gref = NULL;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
gref = NSA_GET_GLOBAL_REF (env, obj);
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
/* Choice signals */
- g_signal_connect (G_OBJECT (ptr), "changed",
+ g_signal_connect (G_OBJECT (bin), "changed",
G_CALLBACK (selection_changed_cb), *gref);
/* Component signals */
- cp_gtk_component_connect_signals (G_OBJECT (ptr), gref);
+ cp_gtk_component_connect_signals (G_OBJECT (bin), gref);
gdk_threads_leave ();
}
@@ -103,11 +111,13 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append
{
gpointer ptr;
jsize count, i;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
count = (*env)->GetArrayLength (env, items);
for (i = 0; i < count; i++)
@@ -118,7 +128,7 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_append
item = (*env)->GetObjectArrayElement (env, items, i);
label = (*env)->GetStringUTFChars (env, item, NULL);
- gtk_combo_box_append_text (GTK_COMBO_BOX (ptr), label);
+ gtk_combo_box_append_text (GTK_COMBO_BOX (bin), label);
(*env)->ReleaseStringUTFChars (env, item, label);
(*env)->DeleteLocalRef(env, item);
@@ -133,14 +143,16 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeAdd
{
void *ptr;
const char *label;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
label = (*env)->GetStringUTFChars (env, item, 0);
- gtk_combo_box_insert_text (GTK_COMBO_BOX (ptr), index, label);
+ gtk_combo_box_insert_text (GTK_COMBO_BOX (bin), index, label);
(*env)->ReleaseStringUTFChars (env, item, label);
@@ -152,12 +164,14 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemove
(JNIEnv *env, jobject obj, jint index)
{
void *ptr;
-
+ GtkWidget *bin;
+
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), index);
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
+ gtk_combo_box_remove_text (GTK_COMBO_BOX (bin), index);
gdk_threads_leave ();
}
@@ -168,20 +182,22 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll
{
void *ptr;
GtkTreeModel *model;
+ GtkWidget *bin;
gint count, i;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (ptr));
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (bin));
count = gtk_tree_model_iter_n_children (model, NULL);
/* First, unselect everything, to avoid problems when removing items. */
- gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), -1);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (bin), -1);
for (i = count - 1; i >= 0; i--) {
- gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), i);
+ gtk_combo_box_remove_text (GTK_COMBO_BOX (bin), i);
}
gdk_threads_leave ();
@@ -204,10 +220,12 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_selectNativeUnlocked
(JNIEnv *env, jobject obj, jint index)
{
void *ptr;
-
+ GtkWidget *bin;
+
ptr = NSA_GET_PTR (env, obj);
-
- gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), index);
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (bin), index);
}
JNIEXPORT jint JNICALL
@@ -216,12 +234,14 @@ Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected
{
void *ptr;
int index;
+ GtkWidget *bin;
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- index = gtk_combo_box_get_active (GTK_COMBO_BOX (ptr));
+ bin = choice_get_widget (GTK_WIDGET (ptr));
+
+ index = gtk_combo_box_get_active (GTK_COMBO_BOX (bin));
gdk_threads_leave ();
@@ -252,3 +272,14 @@ selection_changed_cb (GtkComboBox *combobox, jobject peer)
(jint) AWT_ITEM_SELECTED);
}
}
+
+static GtkWidget *
+choice_get_widget (GtkWidget *widget)
+{
+ GtkWidget *wid;
+
+ g_assert (GTK_IS_EVENT_BOX (widget));
+ wid = gtk_bin_get_child (GTK_BIN(widget));
+
+ return wid;
+}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
index 3b62dc3357f..cb2c87238b2 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
@@ -1,5 +1,5 @@
/* gtkclipboard.c
- Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,23 +45,21 @@ exception statement from your version. */
#define IMAGE_TARGET 3
#define URI_TARGET 4
-/* The clipboard and standard (string targets) shared with GtkSelection. */
+/* The clipboard and selection plus corresponding GtkClipboard objects. */
GtkClipboard *cp_gtk_clipboard;
+GtkClipboard *cp_gtk_selection;
+jobject cp_gtk_clipboard_instance;
+jobject cp_gtk_selection_instance;
+
+/* Standard (string targets) shared with GtkSelection. */
jstring cp_gtk_stringTarget;
jstring cp_gtk_imageTarget;
jstring cp_gtk_filesTarget;
-/* Simple id to keep track of the selection we are currently managing. */
-static gint current_selection = 0;
-
-/* Whether we "own" the clipboard. And may clear it. */
-static int owner = 0;
-
static jclass gtk_clipboard_class;
-static jmethodID setSystemContentsID;
-static jobject gtk_clipboard_instance = NULL;
+static jmethodID setSystemContentsID;
static jmethodID provideContentID;
static jmethodID provideTextID;
static jmethodID provideImageID;
@@ -70,22 +68,26 @@ static jmethodID provideURIsID;
/* Called when clipboard owner changes. Used to update available targets. */
#if GTK_MINOR_VERSION > 4
static void
-clipboard_owner_change_cb (GtkClipboard *clipboard __attribute__((unused)),
+clipboard_owner_change_cb (GtkClipboard *clipboard,
GdkEvent *event __attribute__((unused)),
gpointer user_data __attribute__((unused)))
{
- /* These are only interesting when we are not the owner. Otherwise
- we will have the set and clear functions doing the updating. */
JNIEnv *env = cp_gtk_gdk_env ();
- if (!owner)
- (*env)->CallStaticVoidMethod (env, gtk_clipboard_class,
- setSystemContentsID);
+ if (clipboard == cp_gtk_clipboard)
+ (*env)->CallVoidMethod (env, cp_gtk_clipboard_instance,
+ setSystemContentsID, JNI_FALSE);
+ else
+ (*env)->CallVoidMethod (env, cp_gtk_selection_instance,
+ setSystemContentsID, JNI_FALSE);
+
}
#endif
JNIEXPORT jboolean JNICALL
Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env,
- jclass gtkclipboard,
+ jclass clz,
+ jobject gtkclipboard,
+ jobject gtkselection,
jstring string,
jstring image,
jstring files)
@@ -93,19 +95,47 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env,
GdkDisplay* display;
jboolean can_cache;
- gtk_clipboard_class = gtkclipboard;
- setSystemContentsID = (*env)->GetStaticMethodID (env, gtk_clipboard_class,
- "setSystemContents",
- "()V");
+ gtk_clipboard_class = clz;
+ setSystemContentsID = (*env)->GetMethodID (env, gtk_clipboard_class,
+ "setSystemContents",
+ "(Z)V");
if (setSystemContentsID == NULL)
return JNI_FALSE;
+ provideContentID = (*env)->GetMethodID (env, gtk_clipboard_class,
+ "provideContent",
+ "(Ljava/lang/String;)[B");
+ if (provideContentID == NULL)
+ return JNI_FALSE;
+
+ provideTextID = (*env)->GetMethodID (env, gtk_clipboard_class,
+ "provideText",
+ "()Ljava/lang/String;");
+ if (provideTextID == NULL)
+ return JNI_FALSE;
+
+ provideImageID = (*env)->GetMethodID (env, gtk_clipboard_class,
+ "provideImage",
+ "()Lgnu/java/awt/peer/gtk/GtkImage;");
+ if (provideImageID == NULL)
+ return JNI_FALSE;
+
+ provideURIsID = (*env)->GetMethodID (env, gtk_clipboard_class,
+ "provideURIs",
+ "()[Ljava/lang/String;");
+ if (provideURIsID == NULL)
+ return JNI_FALSE;
+
+ cp_gtk_clipboard_instance = (*env)->NewGlobalRef(env, gtkclipboard);
+ cp_gtk_selection_instance = (*env)->NewGlobalRef(env, gtkselection);
+
cp_gtk_stringTarget = (*env)->NewGlobalRef(env, string);
cp_gtk_imageTarget = (*env)->NewGlobalRef(env, image);
cp_gtk_filesTarget = (*env)->NewGlobalRef(env, files);
gdk_threads_enter ();
cp_gtk_clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+ cp_gtk_selection = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
display = gtk_clipboard_get_display (cp_gtk_clipboard);
/* Check for support for clipboard owner changes. */
@@ -114,26 +144,37 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_initNativeState (JNIEnv *env,
{
g_signal_connect (cp_gtk_clipboard, "owner-change",
G_CALLBACK (clipboard_owner_change_cb), NULL);
+ g_signal_connect (cp_gtk_selection, "owner-change",
+ G_CALLBACK (clipboard_owner_change_cb), NULL);
gdk_display_request_selection_notification (display,
GDK_SELECTION_CLIPBOARD);
+ gdk_display_request_selection_notification (display,
+ GDK_SELECTION_PRIMARY);
can_cache = JNI_TRUE;
}
else
#endif
can_cache = JNI_FALSE;
+
gdk_threads_leave ();
return can_cache;
}
static void
-clipboard_get_func (GtkClipboard *clipboard __attribute__((unused)),
+clipboard_get_func (GtkClipboard *clipboard,
GtkSelectionData *selection,
guint info,
gpointer user_data __attribute__((unused)))
{
+ jobject gtk_clipboard_instance;
JNIEnv *env = cp_gtk_gdk_env ();
+ if (clipboard == cp_gtk_clipboard)
+ gtk_clipboard_instance = cp_gtk_clipboard_instance;
+ else
+ gtk_clipboard_instance = cp_gtk_selection_instance;
+
if (info == OBJECT_TARGET)
{
const gchar *target_name;
@@ -258,16 +299,17 @@ clipboard_get_func (GtkClipboard *clipboard __attribute__((unused)),
}
static void
-clipboard_clear_func (GtkClipboard *clipboard __attribute__((unused)),
- gpointer user_data)
+clipboard_clear_func (GtkClipboard *clipboard,
+ gpointer user_data __attribute__((unused)))
{
- if (owner && GPOINTER_TO_INT(user_data) == current_selection)
- {
- JNIEnv *env = cp_gtk_gdk_env();
- owner = 0;
- (*env)->CallStaticVoidMethod (env, gtk_clipboard_class,
- setSystemContentsID);
- }
+ JNIEnv *env = cp_gtk_gdk_env();
+ if (clipboard == cp_gtk_clipboard)
+ (*env)->CallVoidMethod (env, cp_gtk_clipboard_instance,
+ setSystemContentsID, JNI_TRUE);
+ else
+ (*env)->CallVoidMethod (env, cp_gtk_selection_instance,
+ setSystemContentsID, JNI_TRUE);
+
}
JNIEXPORT void JNICALL
@@ -347,65 +389,35 @@ Java_gnu_java_awt_peer_gtk_GtkClipboard_advertiseContent
/* Set the targets plus callback functions and ask for the clipboard
to be stored when the application exists if supported. */
- current_selection++;
- if (gtk_clipboard_set_with_data (cp_gtk_clipboard, targets, n,
- clipboard_get_func,
- clipboard_clear_func,
- GINT_TO_POINTER(current_selection)))
+ if ((*env)->IsSameObject(env, instance, cp_gtk_clipboard_instance))
{
- owner = 1;
- if (gtk_clipboard_instance == NULL)
+ if (gtk_clipboard_set_with_data (cp_gtk_clipboard, targets, n,
+ clipboard_get_func,
+ clipboard_clear_func,
+ NULL))
{
- JNIEnv *env = cp_gtk_gdk_env ();
- gtk_clipboard_instance = (*env)->NewGlobalRef(env, instance);
-
- provideContentID
- = (*env)->GetMethodID (env, gtk_clipboard_class,
- "provideContent",
- "(Ljava/lang/String;)[B");
- if (provideContentID == NULL)
- return;
-
- provideTextID
- = (*env)->GetMethodID (env, gtk_clipboard_class,
- "provideText", "()Ljava/lang/String;");
- if (provideTextID == NULL)
- return;
-
- provideImageID
- = (*env)->GetMethodID (env, gtk_clipboard_class,
- "provideImage",
- "()Lgnu/java/awt/peer/gtk/GtkImage;");
- if (provideImageID == NULL)
- return;
-
- provideURIsID
- = (*env)->GetMethodID (env, gtk_clipboard_class,
- "provideURIs",
- "()[Ljava/lang/String;");
- if (provideURIsID == NULL)
- return;
- }
#if GTK_MINOR_VERSION > 4
- gtk_clipboard_set_can_store (cp_gtk_clipboard, NULL, 0);
+ gtk_clipboard_set_can_store (cp_gtk_clipboard, NULL, 0);
#endif
+ }
}
else
{
- owner = 0;
- (*env)->CallStaticVoidMethod (env, gtk_clipboard_class,
- setSystemContentsID);
+ if (gtk_clipboard_set_with_data (cp_gtk_selection, targets, n,
+ clipboard_get_func,
+ clipboard_clear_func,
+ NULL))
+ {
+#if GTK_MINOR_VERSION > 4
+ gtk_clipboard_set_can_store (cp_gtk_selection, NULL, 0);
+#endif
+ }
}
for (i = 0; i < n; i++)
g_free (targets[i].target);
g_free (targets);
}
- else if (owner)
- {
- gtk_clipboard_clear (cp_gtk_clipboard);
- owner = 0;
- }
gtk_target_list_unref (target_list);
gdk_threads_leave ();
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
index 6de7b61b8e9..b0d4ab9b019 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
@@ -1,5 +1,5 @@
/* gtkcomponentpeer.c -- Native implementation of GtkComponentPeer
- Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -67,15 +67,19 @@ exception statement from your version. */
#define AWT_MOUSE_ENTERED 504
#define AWT_MOUSE_EXITED 505
#define AWT_MOUSE_DRAGGED 506
+#define AWT_MOUSE_WHEEL 507
+
+#define AWT_WHEEL_UNIT_SCROLL 0
#define AWT_FOCUS_GAINED 1004
#define AWT_FOCUS_LOST 1005
static GtkWidget *find_fg_color_widget (GtkWidget *widget);
static GtkWidget *find_bg_color_widget (GtkWidget *widget);
+static GtkWidget *get_widget (GtkWidget *widget);
static jmethodID postMouseEventID;
-static jmethodID setCursorID;
+static jmethodID postMouseWheelEventID;
static jmethodID postExposeEventID;
static jmethodID postFocusEventID;
@@ -90,8 +94,10 @@ cp_gtk_component_init_jni (void)
postMouseEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
"postMouseEvent", "(IJIIIIZ)V");
- setCursorID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
- "setCursor", "()V");
+ postMouseWheelEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+ gtkcomponentpeer,
+ "postMouseWheelEvent",
+ "(IJIIIIZIII)V");
postExposeEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
"postExposeEvent", "(IIII)V");
@@ -109,6 +115,9 @@ static gboolean component_button_release_cb (GtkWidget *widget,
static gboolean component_motion_notify_cb (GtkWidget *widget,
GdkEventMotion *event,
jobject peer);
+static gboolean component_scroll_cb (GtkWidget *widget,
+ GdkEventScroll *event,
+ jobject peer);
static gboolean component_enter_notify_cb (GtkWidget *widget,
GdkEventCrossing *event,
jobject peer);
@@ -179,19 +188,19 @@ state_to_awt_mods_with_button_states (guint state)
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor
- (JNIEnv *env, jobject obj, jint type)
+ (JNIEnv *env, jobject obj, jint type, jobject image, jint x, jint y)
{
gdk_threads_enter ();
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
- (env, obj, type);
+ (env, obj, type, image, x, y);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
- (JNIEnv *env, jobject obj, jint type)
+ (JNIEnv *env, jobject obj, jint type, jobject image, jint x, jint y)
{
void *ptr;
GtkWidget *widget;
@@ -245,11 +254,21 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
gdk_cursor_type = GDK_LEFT_PTR;
}
- widget = GTK_WIDGET(ptr);
+ widget = get_widget(GTK_WIDGET(ptr));
+
+ if (image == NULL)
+ gdk_cursor = gdk_cursor_new (gdk_cursor_type);
+ else
+ gdk_cursor
+ = gdk_cursor_new_from_pixbuf (gdk_drawable_get_display (widget->window),
+ cp_gtk_image_get_pixbuf (env, image),
+ x, y);
- gdk_cursor = gdk_cursor_new (gdk_cursor_type);
gdk_window_set_cursor (widget->window, gdk_cursor);
gdk_cursor_unref (gdk_cursor);
+
+ /* Make sure the cursor is replaced on screen. */
+ gdk_flush();
}
JNIEXPORT void JNICALL
@@ -265,9 +284,9 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent
ptr = NSA_GET_PTR (env, obj);
parent_ptr = NSA_GET_PTR (env, parent);
-
+
widget = GTK_WIDGET (ptr);
- parent_widget = GTK_WIDGET (parent_ptr);
+ parent_widget = get_widget(GTK_WIDGET (parent_ptr));
if (widget->parent == NULL)
{
@@ -310,7 +329,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive
ptr = NSA_GET_PTR (env, obj);
- gtk_widget_set_sensitive (GTK_WIDGET (ptr), sensitive);
+ gtk_widget_set_sensitive (get_widget(GTK_WIDGET (ptr)), sensitive);
gdk_threads_leave ();
}
@@ -325,7 +344,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus
ptr = NSA_GET_PTR (env, obj);
- gtk_widget_grab_focus (GTK_WIDGET (ptr));
+ gtk_widget_grab_focus (get_widget(GTK_WIDGET (ptr)));
gdk_threads_leave ();
}
@@ -361,11 +380,11 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent
}
if (GTK_IS_BUTTON (ptr))
- event->key.window = GTK_BUTTON (ptr)->event_window;
- else if (GTK_IS_SCROLLED_WINDOW (ptr))
- event->key.window = GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child)->window;
+ event->key.window = GTK_BUTTON (get_widget(GTK_WIDGET (ptr)))->event_window;
+ else if (GTK_IS_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr))))
+ event->key.window = GTK_WIDGET (GTK_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr)))->container.child)->window;
else
- event->key.window = GTK_WIDGET (ptr)->window;
+ event->key.window = get_widget(GTK_WIDGET (ptr))->window;
event->key.send_event = 0;
event->key.time = (guint32) when;
@@ -441,10 +460,10 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent
so we don't want to resend it. */
if (!GTK_IS_WINDOW (ptr))
{
- if (GTK_IS_SCROLLED_WINDOW (ptr))
- gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child), event);
+ if (GTK_IS_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr))))
+ gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr)))->container.child), event);
else
- gtk_widget_event (GTK_WIDGET (ptr), event);
+ gtk_widget_event (get_widget(GTK_WIDGET (ptr)), event);
}
gdk_threads_leave ();
@@ -465,7 +484,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWindowGetLocationOnScreen
ptr = NSA_GET_PTR (env, obj);
point = (*env)->GetIntArrayElements (env, jpoint, 0);
- gdk_window_get_root_origin (GTK_WIDGET (ptr)->window, point, point+1);
+ gdk_window_get_root_origin (get_widget(GTK_WIDGET (ptr))->window, point, point+1);
(*env)->ReleaseIntArrayElements(env, jpoint, point, 0);
@@ -488,7 +507,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen
ptr = NSA_GET_PTR (env, obj);
point = (*env)->GetIntArrayElements (env, jpoint, 0);
- widget = GTK_WIDGET(ptr);
+ widget = get_widget(GTK_WIDGET (ptr));
while(gtk_widget_get_parent(widget) != NULL)
widget = gtk_widget_get_parent(widget);
gdk_window_get_position (GTK_WIDGET(widget)->window, point, point+1);
@@ -519,7 +538,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions
dims = (*env)->GetIntArrayElements (env, jdims, 0);
dims[0] = dims[1] = 0;
- gtk_widget_size_request (GTK_WIDGET (ptr), &requisition);
+ gtk_widget_size_request (get_widget(GTK_WIDGET (ptr)), &requisition);
dims[0] = requisition.width;
dims[1] = requisition.height;
@@ -551,10 +570,10 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions
/* Widgets that extend GtkWindow such as GtkFileChooserDialog may have
a default size. These values seem more useful then the natural
requisition values, particularly for GtkFileChooserDialog. */
- if (GTK_IS_WINDOW (ptr))
+ if (GTK_IS_WINDOW (get_widget(GTK_WIDGET (ptr))))
{
gint width, height;
- gtk_window_get_default_size (GTK_WINDOW (ptr), &width, &height);
+ gtk_window_get_default_size (GTK_WINDOW (get_widget(GTK_WIDGET (ptr))), &width, &height);
dims[0] = width;
dims[1] = height;
@@ -562,14 +581,14 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions
else
{
/* Save the widget's current size request. */
- gtk_widget_size_request (GTK_WIDGET (ptr), &current_req);
+ gtk_widget_size_request (get_widget(GTK_WIDGET (ptr)), &current_req);
/* Get the widget's "natural" size request. */
- gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
- gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
+ gtk_widget_set_size_request (get_widget(GTK_WIDGET (ptr)), -1, -1);
+ gtk_widget_size_request (get_widget(GTK_WIDGET (ptr)), &natural_req);
/* Reset the widget's size request. */
- gtk_widget_set_size_request (GTK_WIDGET (ptr),
+ gtk_widget_set_size_request (get_widget(GTK_WIDGET (ptr)),
current_req.width, current_req.height);
dims[0] = natural_req.width;
@@ -656,7 +675,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetForeground
ptr = NSA_GET_PTR (env, obj);
- fg = GTK_WIDGET (ptr)->style->fg[GTK_STATE_NORMAL];
+ fg = get_widget(GTK_WIDGET (ptr))->style->fg[GTK_STATE_NORMAL];
array = (*env)->NewIntArray (env, 3);
@@ -766,7 +785,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled
ptr = NSA_GET_PTR (env, obj);
- ret_val = GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (ptr));
+ ret_val = GTK_WIDGET_IS_SENSITIVE (get_widget(GTK_WIDGET (ptr)));
gdk_threads_leave ();
@@ -790,7 +809,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isRealized
return FALSE;
}
- ret_val = GTK_WIDGET_REALIZED (GTK_WIDGET (ptr));
+ ret_val = GTK_WIDGET_REALIZED (get_widget(GTK_WIDGET (ptr)));
gdk_threads_leave ();
@@ -841,7 +860,7 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeEventMask
ptr = NSA_GET_PTR (env, obj);
- gtk_widget_add_events (GTK_WIDGET (ptr),
+ gtk_widget_add_events (get_widget(GTK_WIDGET (ptr)),
GDK_POINTER_MOTION_MASK
| GDK_BUTTON_MOTION_MASK
| GDK_BUTTON_PRESS_MASK
@@ -857,6 +876,19 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeEventMask
gdk_threads_leave ();
}
+static GtkWidget *
+get_widget (GtkWidget *widget)
+{
+ GtkWidget *w;
+
+ if (GTK_IS_EVENT_BOX (widget))
+ w = gtk_bin_get_child (GTK_BIN(widget));
+ else
+ w = widget;
+
+ return w;
+}
+
/* FIXME: these functions should be implemented by overridding the
appropriate GtkComponentPeer methods. */
static GtkWidget *
@@ -918,6 +950,9 @@ cp_gtk_component_connect_mouse_signals (GObject *ptr, jobject *gref)
g_signal_connect (G_OBJECT (ptr), "motion-notify-event",
G_CALLBACK (component_motion_notify_cb), *gref);
+
+ g_signal_connect (G_OBJECT (ptr), "scroll-event",
+ G_CALLBACK (component_scroll_cb), *gref);
}
void
@@ -930,11 +965,11 @@ cp_gtk_component_connect_signals (GObject *ptr, jobject *gref)
/* These variables are used to keep track of click counts. The AWT
allows more than a triple click to occur but GTK doesn't report
- more-than-triple clicks. */
+ more-than-triple clicks. Also used for keeping track of scroll events.*/
static jint click_count = 1;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
-static guint button_number = -1;
+static guint button_number_direction = -1;
static int hasBeenDragged;
static gboolean
@@ -949,14 +984,14 @@ component_button_press_cb (GtkWidget *widget __attribute__((unused)),
if ((event->time < (button_click_time + MULTI_CLICK_TIME))
&& (event->window == button_window)
- && (event->button == button_number))
+ && (event->button == button_number_direction))
click_count++;
else
click_count = 1;
button_click_time = event->time;
button_window = event->window;
- button_number = event->button;
+ button_number_direction = event->button;
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
postMouseEventID,
@@ -1055,6 +1090,45 @@ component_motion_notify_cb (GtkWidget *widget __attribute__((unused)),
}
static gboolean
+component_scroll_cb (GtkWidget *widget __attribute__((unused)),
+ GdkEventScroll *event,
+ jobject peer)
+{
+ int rotation;
+ /** Record click count for specific direction. */
+ if ((event->time < (button_click_time + MULTI_CLICK_TIME))
+ && (event->window == button_window)
+ && (event->direction == button_number_direction))
+ click_count++;
+ else
+ click_count = 1;
+
+ button_click_time = event->time;
+ button_window = event->window;
+ button_number_direction = event->direction;
+
+ if (event->direction == GDK_SCROLL_UP
+ || event->direction == GDK_SCROLL_LEFT)
+ rotation = -1;
+ else
+ rotation = 1;
+
+ (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
+ postMouseWheelEventID,
+ AWT_MOUSE_WHEEL,
+ (jlong)event->time,
+ cp_gtk_state_to_awt_mods (event->state),
+ (jint)event->x,
+ (jint)event->y,
+ click_count,
+ JNI_FALSE,
+ AWT_WHEEL_UNIT_SCROLL,
+ 1 /* amount */,
+ rotation);
+ return FALSE;
+}
+
+static gboolean
component_enter_notify_cb (GtkWidget *widget __attribute__((unused)),
GdkEventCrossing *event,
jobject peer)
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
index ae065763688..92bc09edde7 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
@@ -1,5 +1,5 @@
/* gtkimage.c
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -65,23 +65,17 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf
int width, height;
GdkPixbuf *pixbuf;
- gdk_threads_enter ();
-
/* Don't use the JCL convert function because it throws an exception
on failure */
filename = (*env)->GetStringUTFChars (env, name, 0);
if (filename == NULL)
- {
- gdk_threads_leave ();
- return JNI_FALSE;
- }
+ return JNI_FALSE;
pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
if (pixbuf == NULL)
{
(*env)->ReleaseStringUTFChars (env, name, filename);
- gdk_threads_leave ();
return JNI_FALSE;
}
@@ -92,8 +86,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf
setWidthHeight(env, obj, width, height);
(*env)->ReleaseStringUTFChars (env, name, filename);
- gdk_threads_leave ();
-
return JNI_TRUE;
}
@@ -111,8 +103,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
int width;
int height;
- gdk_threads_enter ();
-
src = (*env)->GetByteArrayElements (env, data, NULL);
len = (*env)->GetArrayLength (env, data);
@@ -128,9 +118,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
if (pixbuf == NULL)
{
createRawData (env, obj, NULL);
-
- gdk_threads_leave ();
-
return JNI_FALSE;
}
@@ -140,8 +127,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
createRawData (env, obj, pixbuf);
setWidthHeight(env, obj, width, height);
- gdk_threads_leave ();
-
return JNI_TRUE;
}
@@ -151,10 +136,8 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createFromPixbuf
{
int width, heigth;
GdkPixbuf *pixbuf = (GdkPixbuf *) getData (env, obj);
- gdk_threads_enter ();
width = gdk_pixbuf_get_width (pixbuf);
heigth = gdk_pixbuf_get_height (pixbuf);
- gdk_threads_leave ();
setWidthHeight(env, obj, width, heigth);
}
@@ -171,8 +154,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj)
jint *result_array_iter, *dst;
int i,j;
- gdk_threads_enter ();
-
pixbuf = cp_gtk_image_get_pixbuf (env, obj);
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
@@ -214,8 +195,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj)
(*env)->ReleaseIntArrayElements (env, result_array, result_array_iter, 0);
- gdk_threads_leave ();
-
return result_array;
}
@@ -233,8 +212,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_setPixels(JNIEnv *env, jobject obj,
jint *src_array_iter, *src;
int i;
- gdk_threads_enter ();
-
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
@@ -251,8 +228,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_setPixels(JNIEnv *env, jobject obj,
}
(*env)->ReleaseIntArrayElements (env, pixels, src_array_iter, 0);
-
- gdk_threads_leave ();
}
/**
@@ -265,8 +240,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap(JNIEnv *env, jobject obj)
jclass cls;
jfieldID field;
- gdk_threads_enter ();
-
cls = (*env)->GetObjectClass (env, obj);
field = (*env)->GetFieldID (env, cls, "width", "I");
g_assert (field != 0);
@@ -285,8 +258,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap(JNIEnv *env, jobject obj)
else
createRawData (env, obj, gdk_pixmap_new (NULL, width, height,
gdk_rgb_get_visual ()->depth));
-
- gdk_threads_leave ();
}
/**
@@ -295,13 +266,10 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap(JNIEnv *env, jobject obj)
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkImage_freePixmap(JNIEnv *env, jobject obj)
{
- gdk_threads_enter ();
if (offScreen (env, obj) == JNI_FALSE)
gdk_pixbuf_unref ((GdkPixbuf *)getData (env, obj));
else
g_object_unref ((GdkPixmap *)getData (env, obj));
-
- gdk_threads_leave ();
}
/**
@@ -321,8 +289,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap(JNIEnv *env,
GdkPixbuf *pixbuf;
- gdk_threads_enter ();
-
cls = (*env)->GetObjectClass (env, destination);
field = (*env)->GetFieldID (env, cls, "width", "I");
g_assert (field != 0);
@@ -342,8 +308,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap(JNIEnv *env,
gdk_pixbuf_unref (pixbuf);
createRawData (env, destination, (void *)dst);
-
- gdk_threads_leave ();
}
/**
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
index 6da42cec6c3..54ef31a4fed 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
@@ -39,6 +39,7 @@
#include "gnu_java_awt_peer_gtk_GtkListPeer.h"
static jmethodID postListItemEventID;
+static GtkWidget *list_get_widget (GtkWidget *widget);
void
cp_gtk_list_init_jni (void)
@@ -72,6 +73,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create
{
GtkWidget *sw;
GtkWidget *list;
+ GtkWidget *eventbox;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkListStore *list_store;
@@ -102,11 +104,13 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create
COLUMN_STRING,
NULL);
+ eventbox = gtk_event_box_new ();
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
-
+ gtk_container_add (GTK_CONTAINER (eventbox), sw);
+
gtk_tree_view_append_column (GTK_TREE_VIEW (list), column);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (list), FALSE);
@@ -123,7 +127,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create
gtk_widget_show (list);
gtk_widget_show (sw);
- NSA_SET_PTR (env, obj, sw);
+ NSA_SET_PTR (env, obj, eventbox);
gdk_threads_leave ();
}
@@ -142,7 +146,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
ptr = NSA_GET_PTR (env, obj);
gref = NSA_GET_GLOBAL_REF (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
gtk_tree_selection_set_select_function (selection, item_highlighted_cb,
@@ -166,7 +170,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkWidgetModifyFont
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
font_name = (*env)->GetStringUTFChars (env, name, NULL);
@@ -200,7 +204,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkWidgetRequestFocus
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
gtk_widget_grab_focus (list);
gdk_threads_leave ();
@@ -223,7 +227,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_append
count = (*env)->GetArrayLength (env, items);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
list_store = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
for (i = 0; i < count; i++)
@@ -260,7 +264,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_add
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, text, NULL);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
list_store = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
if (index == -1)
@@ -292,7 +296,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
list_store = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
/* Special case: remove all rows. */
@@ -325,7 +329,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_select
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
path = gtk_tree_path_new_from_indices (index, -1);
gtk_tree_view_set_cursor (GTK_TREE_VIEW (list), path, NULL, FALSE);
@@ -345,7 +349,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_deselect
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
path = gtk_tree_path_new_from_indices (index, -1);
gtk_tree_selection_unselect_path (selection, path);
@@ -361,6 +365,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize
jint *dims;
GtkRequisition current_req;
GtkRequisition natural_req;
+ GtkWidget* bin;
gdk_threads_enter ();
@@ -368,16 +373,17 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize
dims[0] = dims[1] = 0;
ptr = NSA_GET_PTR (env, obj);
-
+ bin = list_get_widget (GTK_WIDGET (ptr));
+
/* Save the widget's current size request. */
- gtk_widget_size_request (GTK_WIDGET (ptr), &current_req);
+ gtk_widget_size_request (bin, &current_req);
/* Get the widget's "natural" size request. */
gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
- gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
+ gtk_widget_size_request (bin, &natural_req);
/* Reset the widget's size request. */
- gtk_widget_set_size_request (GTK_WIDGET (ptr),
+ gtk_widget_set_size_request (bin,
current_req.width, current_req.height);
dims[0] = natural_req.width;
@@ -417,7 +423,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_getSelectedIndexes
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
count = gtk_tree_selection_count_selected_rows (selection);
if (count > 0)
@@ -463,7 +469,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_makeVisible
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
path = gtk_tree_path_new_from_indices (index, -1);
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (list), path,
NULL, FALSE, 0.0, 0.0);
@@ -483,7 +489,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_setMultipleMode
ptr = NSA_GET_PTR (env, obj);
- list = gtk_bin_get_child (GTK_BIN (ptr));
+ list = list_get_widget (GTK_WIDGET (ptr));
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
gtk_tree_selection_set_mode (selection,
mode ? GTK_SELECTION_MULTIPLE
@@ -526,3 +532,18 @@ item_highlighted_cb (GtkTreeSelection *selection __attribute__((unused)),
return TRUE;
}
+
+static GtkWidget *
+list_get_widget (GtkWidget *widget)
+{
+ GtkWidget *wid;
+ g_assert (GTK_IS_EVENT_BOX (widget));
+
+ wid = gtk_bin_get_child (GTK_BIN (widget));
+ g_assert (GTK_IS_SCROLLED_WINDOW (wid));
+
+ wid = gtk_bin_get_child (GTK_BIN (wid));
+
+ return wid;
+}
+
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
index 1445cec5577..a4690deeda3 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
@@ -43,22 +43,27 @@ exception statement from your version. */
#define AWT_SCROLLPANE_SCROLLBARS_ALWAYS 1
#define AWT_SCROLLPANE_SCROLLBARS_NEVER 2
+static GtkWidget *scrollpane_get_widget (GtkWidget *widget);
+
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create
(JNIEnv *env, jobject obj, int width, int height)
{
GtkWidget *sw;
-
+ GtkWidget *eventbox;
+
gdk_threads_enter ();
/* Create global reference and save it for future use */
NSA_SET_GLOBAL_REF (env, obj);
sw = gtk_scrolled_window_new (NULL, NULL);
-
gtk_widget_set_size_request (sw, width, height);
+ eventbox = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (eventbox), sw);
+ gtk_widget_show (sw);
- NSA_SET_PTR (env, obj, sw);
+ NSA_SET_PTR (env, obj, eventbox);
gdk_threads_leave ();
}
@@ -75,7 +80,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_setScrollPosition
ptr = NSA_GET_PTR (env, obj);
- sw = GTK_SCROLLED_WINDOW (ptr);
+ sw = GTK_SCROLLED_WINDOW (scrollpane_get_widget (GTK_WIDGET (ptr)));
hadj = gtk_scrolled_window_get_hadjustment (sw);
vadj = gtk_scrolled_window_get_vadjustment (sw);
@@ -98,7 +103,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetHScrollIncremen
ptr = NSA_GET_PTR (env, obj);
- sw = GTK_SCROLLED_WINDOW(ptr);
+ sw = GTK_SCROLLED_WINDOW (scrollpane_get_widget (GTK_WIDGET (ptr)));
hadj = gtk_scrolled_window_get_hadjustment (sw);
hadj->step_increment = u;
@@ -118,7 +123,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetVScrollIncremen
ptr = NSA_GET_PTR (env, obj);
- sw = GTK_SCROLLED_WINDOW(ptr);
+ sw = GTK_SCROLLED_WINDOW (scrollpane_get_widget (GTK_WIDGET (ptr)));
vadj = gtk_scrolled_window_get_hadjustment (sw);
vadj->step_increment = u;
@@ -140,7 +145,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getHScrollbarHeight
ptr = NSA_GET_PTR (env, obj);
- sw = GTK_SCROLLED_WINDOW (ptr);
+ sw = GTK_SCROLLED_WINDOW (scrollpane_get_widget (GTK_WIDGET (ptr)));
gtk_widget_size_request (sw->hscrollbar, &requisition);
gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
@@ -165,7 +170,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getVScrollbarWidth
ptr = NSA_GET_PTR (env, obj);
- sw = GTK_SCROLLED_WINDOW (ptr);
+ sw = GTK_SCROLLED_WINDOW (scrollpane_get_widget (GTK_WIDGET (ptr)));
gtk_widget_size_request (sw->vscrollbar, &requisition);
gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
@@ -181,7 +186,8 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_setPolicy
(JNIEnv *env, jobject obj, jint policy)
{
void *ptr;
-
+ GtkWidget *sw;
+
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
@@ -199,7 +205,18 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_setPolicy
break;
}
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (ptr), policy, policy);
+ sw = scrollpane_get_widget (GTK_WIDGET (ptr));
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), policy, policy);
gdk_threads_leave ();
}
+
+static GtkWidget *
+scrollpane_get_widget (GtkWidget *widget)
+{
+ GtkWidget *wid;
+ g_assert (GTK_IS_EVENT_BOX (widget));
+ wid = gtk_bin_get_child (GTK_BIN(widget));
+
+ return wid;
+}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
index bec1e63c429..a90501968b6 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollbarPeer.c
@@ -48,6 +48,7 @@ exception statement from your version. */
#define AWT_ADJUSTMENT_TRACK 5
static jmethodID postAdjustmentEventID;
+static GtkWidget *scrollbar_get_widget (GtkWidget *widget);
void
cp_gtk_scrollbar_init_jni (void)
@@ -79,6 +80,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create
jint min, jint max, jint step_incr, jint page_incr, jint visible_amount)
{
GtkWidget *scrollbar;
+ GtkWidget *eventbox;
GtkObject *adj;
/* Create global reference and save it for future use */
@@ -104,7 +106,10 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create
scrollbar = orientation
? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj))
: gtk_hscrollbar_new (GTK_ADJUSTMENT (adj));
-
+ eventbox = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (eventbox), scrollbar);
+ gtk_widget_show (scrollbar);
+
GTK_RANGE (scrollbar)->round_digits = 0;
/* These calls seem redundant but they are not. They clamp values
so that the slider's entirety is always between the two
@@ -114,7 +119,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create
gdk_threads_leave ();
- NSA_SET_PTR (env, obj, scrollbar);
+ NSA_SET_PTR (env, obj, eventbox);
}
JNIEXPORT void JNICALL
@@ -122,6 +127,7 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
+ GtkWidget *wid = scrollbar_get_widget (GTK_WIDGET (ptr));
jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
g_assert (gref);
@@ -129,15 +135,15 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
/* Scrollbar signals */
#if GTK_MINOR_VERSION > 4
- g_signal_connect (G_OBJECT (ptr), "change-value",
+ g_signal_connect (G_OBJECT (wid), "change-value",
G_CALLBACK (slider_moved_cb), *gref);
#else
- g_signal_connect (G_OBJECT (ptr), "value-changed",
+ g_signal_connect (G_OBJECT (wid), "value-changed",
G_CALLBACK (post_change_event_cb), *gref);
#endif
/* Component signals */
- cp_gtk_component_connect_signals (G_OBJECT (ptr), gref);
+ cp_gtk_component_connect_signals (G_OBJECT (wid), gref);
gdk_threads_leave ();
}
@@ -148,12 +154,14 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setLineIncrement
{
void *ptr;
GtkAdjustment *adj;
+ GtkWidget *wid;
ptr = NSA_GET_PTR (env, obj);
-
+ wid = scrollbar_get_widget (GTK_WIDGET (ptr));
+
gdk_threads_enter ();
- adj = gtk_range_get_adjustment (GTK_RANGE (ptr));
+ adj = gtk_range_get_adjustment (GTK_RANGE (wid));
adj->step_increment = (gdouble) amount;
gtk_adjustment_changed (adj);
@@ -166,12 +174,14 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setPageIncrement
{
void *ptr;
GtkAdjustment *adj;
-
+ GtkWidget *wid;
+
ptr = NSA_GET_PTR (env, obj);
-
+ wid = scrollbar_get_widget (GTK_WIDGET (ptr));
+
gdk_threads_enter ();
- adj = gtk_range_get_adjustment (GTK_RANGE (ptr));
+ adj = gtk_range_get_adjustment (GTK_RANGE (wid));
adj->page_increment = (gdouble) amount;
gtk_adjustment_changed (adj);
@@ -184,9 +194,11 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setBarValues
{
void *ptr;
GtkAdjustment *adj;
-
+ GtkWidget *wid;
+
ptr = NSA_GET_PTR (env, obj);
-
+ wid = scrollbar_get_widget (GTK_WIDGET (ptr));
+
gdk_threads_enter ();
/* A little hack because gtk_range_set_range() doesn't allow min == max. */
@@ -197,11 +209,11 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setBarValues
max++;
}
- adj = gtk_range_get_adjustment (GTK_RANGE (ptr));
+ adj = gtk_range_get_adjustment (GTK_RANGE (wid));
adj->page_size = (gdouble) visible;
- gtk_range_set_range (GTK_RANGE (ptr), (gdouble) min, (gdouble) max);
- gtk_range_set_value (GTK_RANGE (ptr), (gdouble) value);
+ gtk_range_set_range (GTK_RANGE (wid), (gdouble) min, (gdouble) max);
+ gtk_range_set_value (GTK_RANGE (wid), (gdouble) value);
gdk_threads_leave ();
}
@@ -214,7 +226,7 @@ slider_moved_cb (GtkRange *range,
jobject obj)
{
GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (range));
-
+
value = CLAMP (value, adj->lower,
(adj->upper - adj->page_size));
@@ -272,3 +284,13 @@ post_change_event_cb (GtkRange *range, jobject peer)
AWT_ADJUSTMENT_TRACK, (jint) adj->value);
}
#endif
+
+static GtkWidget *
+scrollbar_get_widget (GtkWidget *widget)
+{
+ GtkWidget *wid;
+ g_assert (GTK_IS_EVENT_BOX (widget));
+ wid = gtk_bin_get_child (GTK_BIN(widget));
+
+ return wid;
+}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkSelection.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkSelection.c
index 3244d236422..be03c45254e 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkSelection.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkSelection.c
@@ -1,5 +1,5 @@
/* gtkselection.c -- Native C functions for GtkSelection class using gtk+.
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -149,9 +149,10 @@ clipboard_targets_received (GtkClipboard *clipboard
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkSelection_requestMimeTypes
-(JNIEnv *env, jobject selection)
+(JNIEnv *env, jobject selection, jboolean clipboard)
{
jobject selection_obj;
+ GtkClipboard *gtk_clipboard;
selection_obj = (*env)->NewGlobalRef(env, selection);
if (selection_obj == NULL)
return;
@@ -167,13 +168,18 @@ Java_gnu_java_awt_peer_gtk_GtkSelection_requestMimeTypes
return;
}
+ if (clipboard)
+ gtk_clipboard = cp_gtk_clipboard;
+ else
+ gtk_clipboard = cp_gtk_selection;
+
/* We would have liked to call gtk_clipboard_request_targets ()
since that is more general. But the result of that, an array of
GdkAtoms, cannot be used with the
gtk_selection_data_targets_include_<x> functions (despite what
the name suggests). */
gdk_threads_enter ();
- gtk_clipboard_request_contents (cp_gtk_clipboard,
+ gtk_clipboard_request_contents (gtk_clipboard,
gdk_atom_intern ("TARGETS", FALSE),
clipboard_targets_received,
(gpointer) selection_obj);
@@ -210,9 +216,10 @@ clipboard_text_received (GtkClipboard *clipboard
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkSelection_requestText
-(JNIEnv *env, jobject selection)
+(JNIEnv *env, jobject selection, jboolean clipboard)
{
jobject selection_obj;
+ GtkClipboard *gtk_clipboard;
selection_obj = (*env)->NewGlobalRef(env, selection);
if (selection_obj == NULL)
return;
@@ -228,8 +235,13 @@ Java_gnu_java_awt_peer_gtk_GtkSelection_requestText
return;
}
+ if (clipboard)
+ gtk_clipboard = cp_gtk_clipboard;
+ else
+ gtk_clipboard = cp_gtk_selection;
+
gdk_threads_enter ();
- gtk_clipboard_request_text (cp_gtk_clipboard,
+ gtk_clipboard_request_text (gtk_clipboard,
clipboard_text_received,
(gpointer) selection_obj);
gdk_threads_leave ();
@@ -260,9 +272,12 @@ clipboard_image_received (GtkClipboard *clipboard
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkSelection_requestImage (JNIEnv *env, jobject obj)
+Java_gnu_java_awt_peer_gtk_GtkSelection_requestImage (JNIEnv *env,
+ jobject obj,
+ jboolean clipboard)
{
jobject selection_obj;
+ GtkClipboard *gtk_clipboard;
selection_obj = (*env)->NewGlobalRef(env, obj);
if (selection_obj == NULL)
return;
@@ -278,14 +293,19 @@ Java_gnu_java_awt_peer_gtk_GtkSelection_requestImage (JNIEnv *env, jobject obj)
return;
}
+ if (clipboard)
+ gtk_clipboard = cp_gtk_clipboard;
+ else
+ gtk_clipboard = cp_gtk_selection;
+
#if GTK_MINOR_VERSION > 4
gdk_threads_enter ();
- gtk_clipboard_request_image (cp_gtk_clipboard,
+ gtk_clipboard_request_image (gtk_clipboard,
clipboard_image_received,
(gpointer) selection_obj);
gdk_threads_leave ();
#else
- clipboard_image_received (cp_gtk_clipboard, NULL, (gpointer) selection_obj);
+ clipboard_image_received (gtk_clipboard, NULL, (gpointer) selection_obj);
#endif
}
@@ -342,12 +362,15 @@ clipboard_uris_received (GtkClipboard *clipboard
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkSelection_requestURIs (JNIEnv *env, jobject obj)
+Java_gnu_java_awt_peer_gtk_GtkSelection_requestURIs (JNIEnv *env,
+ jobject obj,
+ jboolean clipboard)
{
#if GTK_MINOR_VERSION > 4
GdkAtom uri_atom;
#endif
jobject selection_obj;
+ GtkClipboard *gtk_clipboard;
selection_obj = (*env)->NewGlobalRef(env, obj);
if (selection_obj == NULL)
return;
@@ -363,17 +386,22 @@ Java_gnu_java_awt_peer_gtk_GtkSelection_requestURIs (JNIEnv *env, jobject obj)
return;
}
+ if (clipboard)
+ gtk_clipboard = cp_gtk_clipboard;
+ else
+ gtk_clipboard = cp_gtk_selection;
+
#if GTK_MINOR_VERSION > 4
/* There is no real request_uris so we have to make one ourselves. */
gdk_threads_enter ();
uri_atom = gdk_atom_intern ("text/uri-list", FALSE);
- gtk_clipboard_request_contents (cp_gtk_clipboard,
+ gtk_clipboard_request_contents (gtk_clipboard,
uri_atom,
clipboard_uris_received,
(gpointer) selection_obj);
gdk_threads_leave ();
#else
- clipboard_uris_received (cp_gtk_clipboard, NULL, (gpointer) selection_obj);
+ clipboard_uris_received (gtk_clipboard, NULL, (gpointer) selection_obj);
#endif
}
@@ -406,12 +434,14 @@ clipboard_bytes_received (GtkClipboard *clipboard
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkSelection_requestBytes (JNIEnv *env,
jobject obj,
+ jboolean clipboard,
jstring target_string)
{
int len;
const gchar *target_text;
GdkAtom target_atom;
jobject selection_obj;
+ GtkClipboard *gtk_clipboard;
selection_obj = (*env)->NewGlobalRef(env, obj);
if (selection_obj == NULL)
return;
@@ -434,9 +464,14 @@ Java_gnu_java_awt_peer_gtk_GtkSelection_requestBytes (JNIEnv *env,
if (target_text == NULL)
return;
+ if (clipboard)
+ gtk_clipboard = cp_gtk_clipboard;
+ else
+ gtk_clipboard = cp_gtk_selection;
+
gdk_threads_enter ();
target_atom = gdk_atom_intern (target_text, FALSE);
- gtk_clipboard_request_contents (cp_gtk_clipboard,
+ gtk_clipboard_request_contents (gtk_clipboard,
target_atom,
clipboard_bytes_received,
(gpointer) selection_obj);
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
index 9af88a026ee..bd6e14d7650 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
@@ -43,12 +43,16 @@ exception statement from your version. */
#define AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY 1
#define AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY 2
+static GtkWidget *textarea_get_widget (GtkWidget *widget);
+
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create
(JNIEnv *env, jobject obj,
jint textview_width, jint textview_height, jint scroll)
{
- GtkWidget *text, *sw;
+ GtkWidget *text;
+ GtkWidget *sw;
+ GtkWidget *eventbox;
gdk_threads_enter ();
@@ -61,9 +65,12 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create
gtk_widget_show (text);
+ eventbox = gtk_event_box_new ();
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_container_add (GTK_CONTAINER (sw), text);
-
+ gtk_container_add (GTK_CONTAINER (eventbox), sw);
+ gtk_widget_show (sw);
+
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
/* horizontal scrollbar */
(scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
@@ -79,7 +86,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create
|| scroll == AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY)
? GTK_WRAP_NONE : GTK_WRAP_WORD);
- NSA_SET_PTR (env, obj, sw);
+ NSA_SET_PTR (env, obj, eventbox);
gdk_threads_leave ();
}
@@ -99,7 +106,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_connectSignals
gref = NSA_GET_GLOBAL_REF (env, obj);
/* Unwrap the text view from the scrolled window */
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
@@ -127,7 +134,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_insert
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, contents, NULL);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
gtk_text_buffer_get_iter_at_offset (buf, &iter, position);
@@ -155,8 +162,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, contents, NULL);
- text = gtk_bin_get_child (GTK_BIN (ptr));
-
+ text = textarea_get_widget (GTK_WIDGET (ptr));
+
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
gtk_text_buffer_get_iter_at_offset (buf, &startIter, mystart);
@@ -183,8 +190,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetModifyFont
gdk_threads_enter();
ptr = NSA_GET_PTR (env, obj);
-
- text = gtk_bin_get_child (GTK_BIN (ptr));
+
+ text = textarea_get_widget (GTK_WIDGET (ptr));
font_name = (*env)->GetStringUTFChars (env, name, NULL);
@@ -218,7 +225,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetRequestFocus
ptr = NSA_GET_PTR (env, obj);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
gtk_widget_grab_focus (text);
@@ -230,6 +237,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getHScrollbarHeight
(JNIEnv *env, jobject obj)
{
void *ptr;
+ GtkWidget *bin;
GtkScrolledWindow *sw;
GtkRequisition requisition;
jint height = 0;
@@ -239,7 +247,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getHScrollbarHeight
ptr = NSA_GET_PTR (env, obj);
- sw = GTK_SCROLLED_WINDOW (ptr);
+ bin = gtk_bin_get_child (GTK_BIN (ptr));
+ sw = GTK_SCROLLED_WINDOW (bin);
if (sw)
{
@@ -258,6 +267,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getVScrollbarWidth
(JNIEnv *env, jobject obj)
{
void *ptr;
+ GtkWidget *bin;
GtkScrolledWindow *sw;
GtkRequisition requisition;
jint width = 0;
@@ -266,8 +276,9 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getVScrollbarWidth
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- sw = GTK_SCROLLED_WINDOW (ptr);
+
+ bin = gtk_bin_get_child (GTK_BIN (ptr));
+ sw = GTK_SCROLLED_WINDOW (bin);
if (sw)
{
@@ -295,8 +306,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getCaretPosition
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- text = gtk_bin_get_child (GTK_BIN (ptr));
+
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
mark = gtk_text_buffer_get_insert (buf);
@@ -323,8 +334,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setCaretPosition
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- text = gtk_bin_get_child (GTK_BIN (ptr));
+
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
@@ -366,7 +377,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getSelectionStart
ptr = NSA_GET_PTR (env, obj);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
@@ -403,7 +414,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getSelectionEnd
ptr = NSA_GET_PTR (env, obj);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
@@ -436,7 +447,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_select
ptr = NSA_GET_PTR (env, obj);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
gtk_text_buffer_get_iter_at_offset (buf, &iter, start);
@@ -460,7 +471,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setEditable
ptr = NSA_GET_PTR (env, obj);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
gtk_text_view_set_editable (GTK_TEXT_VIEW (text), state);
@@ -481,8 +492,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getText
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
-
- text = gtk_bin_get_child (GTK_BIN (ptr));
+
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
gtk_text_buffer_get_start_iter (buf, &start);
@@ -505,13 +516,13 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setText
const char *str;
GtkWidget *text = NULL;
GtkTextBuffer *buf;
-
+
gdk_threads_enter ();
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, contents, NULL);
- text = gtk_bin_get_child (GTK_BIN (ptr));
+ text = textarea_get_widget (GTK_WIDGET (ptr));
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
gtk_text_buffer_set_text (buf, str, strlen (str));
@@ -520,3 +531,17 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_setText
gdk_threads_leave ();
}
+
+static GtkWidget *
+textarea_get_widget (GtkWidget *widget)
+{
+ GtkWidget *wid;
+ g_assert (GTK_IS_EVENT_BOX (widget));
+
+ wid = gtk_bin_get_child (GTK_BIN (widget));
+ g_assert (GTK_IS_SCROLLED_WINDOW (wid));
+
+ wid = gtk_bin_get_child (GTK_BIN (wid));
+
+ return wid;
+}
diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
index a3cea8c4ab9..1c858faf540 100644
--- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
+++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
@@ -1424,6 +1424,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked
(JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
{
void *ptr;
+ gint current_width;
+ gint current_height;
ptr = NSA_GET_PTR (env, obj);
@@ -1447,12 +1449,19 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked
if (GTK_WIDGET (ptr)->window != NULL)
gdk_window_move (GTK_WIDGET (ptr)->window, x, y);
- /* Need to change the widget's request size. */
- gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
- /* Also need to call gtk_window_resize. If the resize is requested
- by the program and the window's "resizable" property is true then
- the size request will not be honoured. */
- gtk_window_resize (GTK_WINDOW (ptr), width, height);
+ /* Only request resizing if the actual width or height change, otherwise
+ * we get unnecessary flickers because resizing causes GTK to clear the
+ * window content, even if the actual size doesn't change. */
+ gtk_window_get_size(GTK_WINDOW(ptr), &current_width, &current_height);
+ if (current_width != width || current_height != height)
+ {
+ /* Need to change the widget's request size. */
+ gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
+ /* Also need to call gtk_window_resize. If the resize is requested
+ by the program and the window's "resizable" property is true then
+ the size request will not be honoured. */
+ gtk_window_resize (GTK_WINDOW (ptr), width, height);
+ }
}
static void
diff --git a/libjava/classpath/native/jni/gtk-peer/gtkpeer.h b/libjava/classpath/native/jni/gtk-peer/gtkpeer.h
index f332b62a156..9a1590b81d3 100644
--- a/libjava/classpath/native/jni/gtk-peer/gtkpeer.h
+++ b/libjava/classpath/native/jni/gtk-peer/gtkpeer.h
@@ -1,5 +1,5 @@
/* gtkpeer.h -- Some global variables and #defines
- Copyright (C) 1998, 1999, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -167,8 +167,12 @@ JNIEnv *cp_gtk_gdk_env(void);
extern double cp_gtk_dpi_conversion_factor;
extern GtkWindowGroup *cp_gtk_global_window_group;
-/* Shared global clipboard for GtkClipboard and GtkSelection. */
+/* Shared global clipboard and selection for GtkClipboard and GtkSelection. */
extern GtkClipboard *cp_gtk_clipboard;
+extern GtkClipboard *cp_gtk_selection;
+
+extern jobject cp_gtk_clipboard_instance;
+extern jobject cp_gtk_selection_instance;
/* Standard target (strings) for GtkClipboard and GtkSelection. */
extern jstring cp_gtk_stringTarget;
OpenPOWER on IntegriCloud