This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gui][patch] switch GTK peers to extract JNIEnv from JavaVM


hi,

this patch, which I've committed to java-gui-branch, "fixes" a problem which may or may not be present, depending on the behavior of client programs, choice of VM, and choices made in threading elsewhere in the AWT implementation: we used to cache a JNIEnv in an extern variable, and reuse it in callbacks from GTK.

this patch replaces the extern JNIEnv variable with a JavaVM variable and a helper function which fetches the current JNIEnv from the JavaVM. this is important only if the callback thread differs from the thread which set up the cached value, but it's already caused a couple people to trip in the real world, there's little cost to making the change (I profiled it; the penalty is 0.001% of runtime), and it makes the GTK side more robust against future changes in thread organization.

-graydon


2005-01-18 Graydon Hoare <graydon@redhat.com>


	* jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c:
	Rewrite uses of extern variable to be function calls.
	* jni/gtk-peer/gtkpeer.h (gdk_env): Change declaration to
	function, from extern variable.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
	(gdk_env): Remove variable, add new function.
	(java_vm): Add new variable.
	(Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit): Initialize
	java_vm rather than old gdk_env variable.
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c	7 Nov 2004 00:04:27 -0000	1.1.2.4
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c	18 Jan 2005 23:28:21 -0000
@@ -49,7 +49,7 @@
  */
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_nativeRun
-  (JNIEnv *gdk_env __attribute__((unused)),
+  (JNIEnv *env __attribute__((unused)),
    jobject lcl_obj __attribute__((unused)),
    jlong funcAddr, jlong funcArg)
 {
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c	7 Nov 2004 00:04:27 -0000	1.2.12.7
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c	18 Jan 2005 23:28:21 -0000
@@ -266,7 +266,7 @@
   g_assert (vec->desc != NULL);
   g_assert (vec->ctx != NULL);
   
-  len = (*gdk_env)->GetStringUTFLength (env, chars);
+  len = (*gdk_env())->GetStringUTFLength (env, chars);
   str = (gchar *)(*env)->GetStringUTFChars (env, chars, NULL);
   g_assert (str != NULL);
 
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c	9 Dec 2004 21:36:47 -0000	1.5.2.15
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c	18 Jan 2005 23:28:21 -0000
@@ -680,7 +680,7 @@
 {
   gdk_threads_leave ();
 
-  (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphicsID);
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer, initComponentGraphicsID);
 
   gdk_threads_enter ();
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c	7 Dec 2004 00:30:11 -0000	1.5.8.14
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c	18 Jan 2005 23:28:21 -0000
@@ -360,7 +360,7 @@
 {
   gdk_threads_leave ();
 
-  (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphics2DID);
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer, initComponentGraphics2DID);
 
   gdk_threads_enter ();
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c	21 Oct 2004 21:45:05 -0000	1.8.2.9
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c	18 Jan 2005 23:28:21 -0000
@@ -315,7 +315,7 @@
              GdkEventFocus *event __attribute((unused)),
              jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postFocusEventID,
                               AWT_FOCUS_GAINED,
                               JNI_FALSE);
@@ -327,7 +327,7 @@
               GdkEventFocus *event __attribute((unused)),
               jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postFocusEventID,
                               AWT_FOCUS_LOST,
                               JNI_FALSE);
@@ -337,11 +337,11 @@
 static void
 block_expose_events_cb (GtkWidget *widget, jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               beginNativeRepaintID);
 
   gdk_window_process_updates (widget->window, TRUE);
 
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               endNativeRepaintID);
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c	2 Sep 2004 21:26:26 -0000	1.4.8.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c	18 Jan 2005 23:28:21 -0000
@@ -208,7 +208,7 @@
 static void
 item_toggled (GtkToggleButton *item, jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			      postItemEventID,
 			      peer,
 			      item->active ?
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c	21 Oct 2004 21:45:05 -0000	1.6.8.4
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c	18 Jan 2005 23:28:21 -0000
@@ -195,8 +195,8 @@
 
       gdk_threads_leave ();
 
-      label = (*gdk_env)->NewStringUTF (gdk_env, selected);
-      (*gdk_env)->CallVoidMethod (gdk_env, peer,
+      label = (*gdk_env())->NewStringUTF (gdk_env(), selected);
+      (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			          choicePostItemEventID,
 			          label,
 			          (jint) AWT_ITEM_SELECTED);
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c	21 Oct 2004 21:45:05 -0000	1.3.8.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c	18 Jan 2005 23:28:21 -0000
@@ -110,15 +110,15 @@
   if (selection_data->length < 0
       || selection_data->type != GDK_SELECTION_TYPE_STRING)
     {
-      (*gdk_env)->CallVoidMethod (gdk_env, cb_obj, stringSelectionReceivedID,
-				  NULL);
+      (*gdk_env())->CallVoidMethod (gdk_env(), cb_obj, stringSelectionReceivedID,
+				    NULL);
     }
   else
     {
       char *str = (char *) selection_data->data;
       
-      (*gdk_env)->CallVoidMethod (gdk_env, cb_obj, stringSelectionReceivedID,
-				  (*gdk_env)->NewStringUTF (gdk_env, str));
+      (*gdk_env())->CallVoidMethod (gdk_env(), cb_obj, stringSelectionReceivedID,
+				    (*gdk_env())->NewStringUTF (gdk_env(), str));
     }
 
   return;
@@ -135,7 +135,7 @@
   const char *utf;
   jsize utflen;
 
-  jstr = (*gdk_env)->CallObjectMethod (gdk_env, cb_obj, 
+  jstr = (*gdk_env())->CallObjectMethod (gdk_env(), cb_obj, 
 				       stringSelectionHandlerID);
 
   if (!jstr)
@@ -145,13 +145,13 @@
       return;
     }
 
-  utflen = (*gdk_env)->GetStringUTFLength (gdk_env, jstr);
-  utf = (*gdk_env)->GetStringUTFChars (gdk_env, jstr, NULL);
+  utflen = (*gdk_env())->GetStringUTFLength (gdk_env(), jstr);
+  utf = (*gdk_env())->GetStringUTFChars (gdk_env(), jstr, NULL);
 
   gtk_selection_data_set (selection_data, GDK_TARGET_STRING, 8,
 			  (const unsigned char*)utf, utflen);
 
-  (*gdk_env)->ReleaseStringUTFChars (gdk_env, jstr, utf);
+  (*gdk_env())->ReleaseStringUTFChars (gdk_env(), jstr, utf);
 }
 
 JNIEXPORT void JNICALL
@@ -177,7 +177,7 @@
 selection_clear (GtkWidget *widget __attribute__((unused)),
 		 GdkEventSelection *event __attribute__((unused)))
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, cb_obj, selectionClearID);
+  (*gdk_env())->CallVoidMethod (gdk_env(), cb_obj, selectionClearID);
 
   return TRUE;
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c	31 Dec 2004 18:36:06 -0000	1.15.2.27
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c	18 Jan 2005 23:28:21 -0000
@@ -1054,7 +1054,7 @@
              GdkEventFocus *event __attribute((unused)),
              jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postFocusEventID,
                               AWT_FOCUS_GAINED,
                               JNI_FALSE);
@@ -1066,7 +1066,7 @@
               GdkEventFocus *event __attribute((unused)),
               jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postFocusEventID,
                               AWT_FOCUS_LOST,
                               JNI_FALSE);
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c	25 Oct 2004 21:14:24 -0000	1.19.2.14
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c	18 Jan 2005 23:28:21 -0000
@@ -883,7 +883,7 @@
   switch (event->type)
     {
     case GDK_BUTTON_PRESS:
-      (*gdk_env)->CallVoidMethod (gdk_env, peer,
+      (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                   postMouseEventID,
 				  AWT_MOUSE_PRESSED, 
 				  (jlong)event->button.time,
@@ -900,7 +900,7 @@
       {
 	int width, height;
 
-	(*gdk_env)->CallVoidMethod (gdk_env, peer,
+	(*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				    postMouseEventID,
 				    AWT_MOUSE_RELEASED, 
 				    (jlong)event->button.time,
@@ -921,7 +921,7 @@
 	    && event->button.x <= width 
 	    && event->button.y <= height)
           {
-	    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+	    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				        postMouseEventID,
 				        AWT_MOUSE_CLICKED, 
 				        (jlong)event->button.time,
@@ -941,7 +941,7 @@
 				 | GDK_BUTTON4_MASK
 				 | GDK_BUTTON5_MASK))
 	{
-	  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+	  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			              postMouseEventID,
 				      AWT_MOUSE_DRAGGED,
 				      (jlong)event->motion.time,
@@ -953,7 +953,7 @@
 	  hasBeenDragged = TRUE;
 	}
       else
-        (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
+        (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID,
 				    AWT_MOUSE_MOVED,
 				    (jlong)event->motion.time,
 				    state_to_awt_mods (event->motion.state),
@@ -966,7 +966,7 @@
       /* We are not interested in enter events that are due to
          grab/ungrab and not to actually crossing boundaries */
       if (event->crossing.mode == GDK_CROSSING_NORMAL)
-        (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
+        (*gdk_env())->CallVoidMethod (gdk_env(), peer, postMouseEventID,
 				    AWT_MOUSE_ENTERED, 
 				    (jlong)event->crossing.time,
 				    state_to_awt_mods_with_button_states (event->crossing.state), 
@@ -979,7 +979,7 @@
       /* We are not interested in leave events that are due to
          grab/ungrab and not to actually crossing boundaries */
       if (event->crossing.mode == GDK_CROSSING_NORMAL)
-	(*gdk_env)->CallVoidMethod (gdk_env, peer,
+	(*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				    postMouseEventID,
 				    AWT_MOUSE_EXITED, 
 				    (jlong)event->crossing.time,
@@ -1001,7 +1001,7 @@
 	       returns. */
 	    gdk_threads_leave ();
 
- 	    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ 	    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 					postConfigureEventID,
 					(jint) event->configure.x,
 					(jint) event->configure.y,
@@ -1012,7 +1012,7 @@
       }
       break;
     case GDK_EXPOSE:
-      (*gdk_env)->CallVoidMethod (gdk_env, peer,
+      (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                   postExposeEventID,
                                   (jint)event->expose.area.x,
                                   (jint)event->expose.area.y,
@@ -1021,7 +1021,7 @@
       break;
 
     case GDK_FOCUS_CHANGE:
-      (*gdk_env)->CallVoidMethod (gdk_env, peer,
+      (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				  postFocusEventID,
 				  (jint) (event->focus_change.in) ?
 				  AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
@@ -1033,7 +1033,7 @@
             /*            GdkEventKey *keyevent = (GdkEventKey *) event; */
             /*            g_printerr ("key press event: sent: %d  time: %d  state: %d  keyval: %d  length: %d  string: %s  hardware_keycode: %d  group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */
 
-            (*gdk_env)->CallVoidMethod (gdk_env, peer,
+            (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                         postKeyEventID,
                                         (jint) AWT_KEY_PRESSED,
                                         (jlong) event->key.time,
@@ -1054,7 +1054,7 @@
     case GDK_KEY_RELEASE:
       if (GTK_IS_WINDOW (widget))
         {
-            (*gdk_env)->CallVoidMethod (gdk_env, peer,
+            (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                         postKeyEventID,
                                         (jint) AWT_KEY_RELEASED,
                                         (jlong) event->key.time,
@@ -1135,13 +1135,13 @@
 {
   void *ptr;
 
-  ptr = NSA_GET_PTR (gdk_env, peer);
+  ptr = NSA_GET_PTR (gdk_env(), peer);
 
-  connect_awt_hook (gdk_env, peer, 1, GTK_WIDGET (ptr)->window);
+  connect_awt_hook (gdk_env(), peer, 1, GTK_WIDGET (ptr)->window);
 
   gdk_threads_leave ();
 
-  (*gdk_env)->CallVoidMethod (gdk_env, peer, setCursorID);
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer, setCursorID);
 
   gdk_threads_enter ();
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c	7 Nov 2004 15:06:42 -0000	1.4.8.9
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c	18 Jan 2005 23:28:21 -0000
@@ -135,14 +135,14 @@
   jstring *filename;
   gboolean accepted;
 
-  cx = (*gdk_env)->GetObjectClass (gdk_env, (jobject) obj);
-  id = (*gdk_env)->GetMethodID (gdk_env, cx, "filenameFilterCallback",
+  cx = (*gdk_env())->GetObjectClass (gdk_env(), (jobject) obj);
+  id = (*gdk_env())->GetMethodID (gdk_env(), cx, "filenameFilterCallback",
                                              "(Ljava/lang/String;)Z");
 
-  filename = (*gdk_env)->NewStringUTF(gdk_env, filter_info->filename);
+  filename = (*gdk_env())->NewStringUTF(gdk_env(), filter_info->filename);
 
   gdk_threads_leave();
-  accepted = (*gdk_env)->CallBooleanMethod(gdk_env, obj, id, filename);
+  accepted = (*gdk_env())->CallBooleanMethod(gdk_env(), obj, id, filename);
   gdk_threads_enter();
 
   return accepted;
@@ -225,21 +225,21 @@
       && responseId != GTK_RESPONSE_CANCEL)
     return;
 
-  ptr = NSA_GET_PTR (gdk_env, peer_obj);
+  ptr = NSA_GET_PTR (gdk_env(), peer_obj);
 
   if (responseId == GTK_RESPONSE_DELETE_EVENT)
   {
     if (!isDisposeIDSet)
       {
-        jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);
-        disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V");
+        jclass cx = (*gdk_env())->GetObjectClass (gdk_env(), peer_obj);
+        disposeID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkDisposeFileDialog", "()V");
         isDisposeIDSet = 1;
       }
   
     gdk_threads_leave ();
 
     /* We can dispose of the dialog now (and unblock show) */
-    (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID);
+    (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, disposeID);
 
     gdk_threads_enter ();
     return;
@@ -247,14 +247,14 @@
 
   if (responseId == GTK_RESPONSE_OK) {
     fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr)));
-    str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName);
+    str_fileName = (*gdk_env())->NewStringUTF (gdk_env(), fileName);
   }
 
   if (!isIDSet)
     {
-      jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj);
-      hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V");
-      gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx,
+      jclass cx = (*gdk_env())->GetObjectClass (gdk_env(), peer_obj);
+      hideID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkHideFileDialog", "()V");
+      gtkSetFilenameID = (*gdk_env())->GetMethodID (gdk_env(), cx,
                                    "gtkSetFilename", "(Ljava.lang.String;)V");
       isIDSet = 1;
     }
@@ -262,10 +262,10 @@
   gdk_threads_leave ();
   
   /* Set the Java object field 'file' with this value. */
-  (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName);
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, gtkSetFilenameID, str_fileName);
 
   /* We can hide the dialog now (and unblock show) */
-  (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID);
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, hideID);
 
   gdk_threads_enter ();
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	7 Oct 2004 22:11:59 -0000	1.7.8.7
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c	18 Jan 2005 23:28:21 -0000
@@ -498,12 +498,12 @@
       row = indices ? indices[0] : -1;
 
       if (!path_currently_selected)
-        (*gdk_env)->CallVoidMethod (gdk_env, peer,
+        (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                     postListItemEventID,
                                     row,
                                     (jint) AWT_ITEM_SELECTED);
       else
-        (*gdk_env)->CallVoidMethod (gdk_env, peer,
+        (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                     postListItemEventID,
                                     row,
                                     (jint) AWT_ITEM_DESELECTED);
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c	7 Nov 2004 00:04:27 -0000	1.4.8.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c	18 Jan 2005 23:28:21 -0000
@@ -165,6 +165,6 @@
 static void
 item_activate (GtkMenuItem *item __attribute__((unused)), jobject peer_obj)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj,
 			      postMenuActionEventID);
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c	7 Oct 2004 22:11:59 -0000	1.7.2.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c	18 Jan 2005 23:28:21 -0000
@@ -160,6 +160,6 @@
 {
   GtkAdjustment *adj;
   adj = gtk_range_get_adjustment (range);
-  (*gdk_env)->CallVoidMethod (gdk_env, peer, postAdjustmentEventID,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer, postAdjustmentEventID,
                               AWT_ADJUSTMENT_TRACK, (jint) adj->value);
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c	30 Jul 2004 19:48:35 -0000	1.11.8.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c	18 Jan 2005 23:28:21 -0000
@@ -492,5 +492,5 @@
 textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)),
 			  jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer, postTextEventID);
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer, postTextEventID);
 }
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c	18 Jan 2005 03:30:27 -0000	1.2.16.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c	18 Jan 2005 23:28:21 -0000
@@ -70,7 +70,16 @@
 jmethodID initComponentGraphics2DID;
 jmethodID setCursorID;
 
-JNIEnv *gdk_env;
+JavaVM *java_vm;
+
+JNIEnv *
+gdk_env()
+{
+  JNIEnv *tmp;
+  g_assert((*java_vm)->GetEnv(java_vm, (void **)&tmp, JNI_VERSION_1_2) == JNI_OK);
+  return tmp;
+}
+
 
 GtkWindowGroup *global_gtk_window_group;
 
@@ -109,7 +118,8 @@
   gtkgenericpeer = (*env)->FindClass(env, "gnu/java/awt/peer/gtk/GtkGenericPeer");
 
   NSA_INIT (env, gtkgenericpeer);
-  gdk_env = env;
+
+  g_assert((*env)->GetJavaVM(env, &java_vm) == 0);
 
   /* GTK requires a program's argc and argv variables, and requires that they
      be valid.   Set it up. */
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	25 Oct 2004 21:14:24 -0000	1.24.2.18
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	18 Jan 2005 23:28:21 -0000
@@ -320,7 +320,7 @@
 {
   /* Circumvent package-private access to call Window's
      setBoundsCallback method. */
-  (*gdk_env)->CallVoidMethod (gdk_env, window, setBoundsCallbackID,
+  (*gdk_env())->CallVoidMethod (gdk_env(), window, setBoundsCallbackID,
 			      x, y, width, height);
 }
 
@@ -493,7 +493,7 @@
 		  GdkEvent *event __attribute__((unused)),
 		  jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			      postWindowEventID,
 			      (jint) AWT_WINDOW_CLOSING,
 			      (jobject) NULL, (jint) 0);
@@ -504,7 +504,7 @@
 		   GdkEvent *event __attribute__((unused)),
 		   jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			      postWindowEventID,
 			      (jint) AWT_WINDOW_CLOSED,
 			      (jobject) NULL, (jint) 0);
@@ -514,7 +514,7 @@
 window_show_cb (GtkWidget *widget __attribute__((unused)),
 		jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			      postWindowEventID,
 			      (jint) AWT_WINDOW_OPENED,
 			      (jobject) NULL, (jint) 0);
@@ -529,12 +529,12 @@
   /* Remove the unused attributes if you fix the below.  */
 #if 0
   if (GTK_WINDOW (widget)->is_active)
-    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                 postWindowEventID,
                                 (jint) AWT_WINDOW_GAINED_FOCUS,
                                 (jobject) NULL, (jint) 0);
   else
-    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                 postWindowEventID,
                                 (jint) AWT_WINDOW_DEACTIVATED,
                                 (jobject) NULL, (jint) 0);
@@ -547,12 +547,12 @@
 			      jobject peer)
 {
   if (GTK_WINDOW (widget)->has_toplevel_focus)
-    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                 postWindowEventID,
                                 (jint) AWT_WINDOW_ACTIVATED,
                                 (jobject) NULL, (jint) 0);
   else
-    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                                 postWindowEventID,
                                 (jint) AWT_WINDOW_DEACTIVATED,
                                 (jobject) NULL, (jint) 0);
@@ -563,7 +563,7 @@
 		    GdkEventFocus *event  __attribute__((unused)),
 		    jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postWindowEventID,
                               (jint) AWT_WINDOW_GAINED_FOCUS,
                               (jobject) NULL, (jint) 0);
@@ -577,7 +577,7 @@
 		     GdkEventFocus *event __attribute__((unused)),
 		     jobject peer)
 {
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postWindowEventID,
                               (jint) AWT_WINDOW_LOST_FOCUS,
                               (jobject) NULL, (jint) 0);
@@ -600,7 +600,7 @@
       if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED)
 	{
 	  /* We've been iconified. */
-	  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+	  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				      postWindowEventID,
 				      (jint) AWT_WINDOW_ICONIFIED,
 				      (jobject) NULL, (jint) 0);
@@ -608,7 +608,7 @@
       else
 	{
 	  /* We've been deiconified. */
-	  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+	  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				      postWindowEventID,
 				      (jint) AWT_WINDOW_DEICONIFIED,
 				      (jobject) NULL, (jint) 0);
@@ -624,7 +624,7 @@
 
   new_state |= window_get_new_state (widget);
 
-  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+  (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 			      postWindowEventID,
 			      (jint) AWT_WINDOW_STATE_CHANGED,
 			      (jobject) NULL, new_state);
@@ -685,9 +685,9 @@
 
   if (!id_set)
     {
-      jclass gtkwindowpeer = (*gdk_env)->FindClass (gdk_env,
+      jclass gtkwindowpeer = (*gdk_env())->FindClass (gdk_env(),
 				 "gnu/java/awt/peer/gtk/GtkWindowPeer");
-      postInsetsChangedEventID = (*gdk_env)->GetMethodID (gdk_env,
+      postInsetsChangedEventID = (*gdk_env())->GetMethodID (gdk_env(),
 						      gtkwindowpeer,
 						      "postInsetsChangedEvent",
 						      "(IIII)V");
@@ -705,7 +705,7 @@
                            NULL,
                            NULL,
                            gu_ex.gu_extents))
-    (*gdk_env)->CallVoidMethod (gdk_env, peer,
+    (*gdk_env())->CallVoidMethod (gdk_env(), peer,
 				postInsetsChangedEventID,
 				(jint) extents[2],  /* top */
 				(jint) extents[0],  /* left */
--- jni/gtk-peer/gtkpeer.h	31 Dec 2004 18:36:06 -0000	1.12.8.14
+++ jni/gtk-peer/gtkpeer.h	18 Jan 2005 23:28:21 -0000
@@ -464,7 +464,8 @@
 extern jmethodID syncAttrsID;
 extern jclass gdkColor;
 extern jmethodID gdkColorID;
-extern JNIEnv *gdk_env;
+
+JNIEnv *gdk_env();
 
 extern double dpi_conversion_factor;
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]