[java-atk-wrapper] Fix getting object's locale



commit e7e79accfe5c5fbb8e7182b1970a2ebe80ccbd78
Author: Samuel Thibault <samuel thibault ens-lyon org>
Date:   Sun Jul 28 11:22:04 2019 +0200

    Fix getting object's locale

 jni/src/jawobject.c                            | 33 +++++++++++++++++++++-----
 jni/src/jawobject.h                            |  2 ++
 wrapper/org/GNOME/Accessibility/AtkObject.java | 20 ++++++++++++++--
 3 files changed, 47 insertions(+), 8 deletions(-)
---
diff --git a/jni/src/jawobject.c b/jni/src/jawobject.c
index 5f63b0b..f05091f 100644
--- a/jni/src/jawobject.c
+++ b/jni/src/jawobject.c
@@ -194,6 +194,14 @@ jaw_object_finalize (GObject *gobject)
     atk_obj->description = NULL;
   }
 
+  if (jaw_obj->locale != NULL)
+  {
+    (*jniEnv)->ReleaseStringUTFChars(jniEnv, jaw_obj->jstrLocale, jaw_obj->locale);
+    (*jniEnv)->DeleteGlobalRef(jniEnv, jaw_obj->jstrLocale);
+    jaw_obj->jstrLocale = NULL;
+    jaw_obj->locale = NULL;
+  }
+
   if (G_OBJECT(jaw_obj->state_set) != NULL)
   {
     g_object_unref(G_OBJECT(jaw_obj->state_set));
@@ -515,15 +523,28 @@ static const gchar *jaw_object_get_object_locale (AtkObject *atk_obj)
   }
 
   jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
-  jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getLocale", 
"(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/Locale;");
-  jobject locale = (*jniEnv)->CallStaticObjectMethod (jniEnv, atkObject, jmid, ac);
+  jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getLocale", 
"(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+  jobject jstr = (*jniEnv)->CallStaticObjectMethod (jniEnv, atkObject, jmid, ac);
 
   (*jniEnv)->DeleteGlobalRef(jniEnv, ac);
-  JawImpl *target_obj = jaw_impl_get_instance_from_jaw(jniEnv, locale);
-  if(target_obj == NULL)
-    return NULL;
 
-  return atk_object_get_object_locale((AtkObject*) target_obj);
+  if (jaw_obj->locale != NULL)
+  {
+    (*jniEnv)->ReleaseStringUTFChars(jniEnv, jaw_obj->jstrLocale, jaw_obj->locale);
+    (*jniEnv)->DeleteGlobalRef(jniEnv, jaw_obj->jstrLocale);
+    jaw_obj->jstrLocale = NULL;
+    jaw_obj->locale = NULL;
+  }
+
+  if (jstr != NULL)
+  {
+    jaw_obj->jstrLocale = (*jniEnv)->NewGlobalRef(jniEnv, jstr);
+    jaw_obj->locale = (gchar*)(*jniEnv)->GetStringUTFChars(jniEnv,
+                                                         jaw_obj->jstrLocale,
+                                                         NULL);
+  }
+
+  return jaw_obj->locale;
 }
 
 static AtkRelationSet*
diff --git a/jni/src/jawobject.h b/jni/src/jawobject.h
index ab13a56..158011f 100644
--- a/jni/src/jawobject.h
+++ b/jni/src/jawobject.h
@@ -42,6 +42,8 @@ struct _JawObject
        jobject acc_context;
        jstring jstrName;
        jstring jstrDescription;
+       jstring jstrLocale;
+       gchar *locale;
        AtkStateSet *state_set;
 
        GHashTable *storedData;
diff --git a/wrapper/org/GNOME/Accessibility/AtkObject.java b/wrapper/org/GNOME/Accessibility/AtkObject.java
index 5f5fd59..1ce61f6 100644
--- a/wrapper/org/GNOME/Accessibility/AtkObject.java
+++ b/wrapper/org/GNOME/Accessibility/AtkObject.java
@@ -153,8 +153,24 @@ public class AtkObject{
         }, null);
     }
 
-    public static Locale getLocale(AccessibleContext ac){
-        return AtkUtil.invokeInSwing( () -> { return ac.getLocale(); }, null);
+    public static String getLocale(AccessibleContext ac){
+        return AtkUtil.invokeInSwing( () -> {
+            Locale l = ac.getLocale();
+            String locale = l.getLanguage();
+            String country = l.getCountry();
+            String script = l.getScript();
+            String variant = l.getVariant();
+            if (country.length() != 0) {
+                locale += "_" + country;
+            }
+            if (script.length() != 0) {
+                locale += "@" + script;
+            }
+            if (variant.length() != 0) {
+                locale += "@" + variant;
+            }
+            return locale;
+        }, null);
     }
 
     public static class WrapKeyAndTarget{


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