[java-atk-wrapper] Delegate getAccessibleRelationSet call to EDT
- From: Samuel Thibault <sthibaul src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [java-atk-wrapper] Delegate getAccessibleRelationSet call to EDT
- Date: Wed, 19 Jun 2019 23:06:06 +0000 (UTC)
commit 136a7d47103c5dbfbba2ae53fa33d299ab71197f
Author: Giuseppe <giuseppecapaldo93 gmail com>
Date: Thu Jun 20 00:25:39 2019 +0200
Delegate getAccessibleRelationSet call to EDT
jni/src/jawobject.c | 64 ++++++++------------------
wrapper/org/GNOME/Accessibility/AtkObject.java | 36 +++++++++++++++
2 files changed, 54 insertions(+), 46 deletions(-)
---
diff --git a/jni/src/jawobject.c b/jni/src/jawobject.c
index cfa93f2..5806a00 100644
--- a/jni/src/jawobject.c
+++ b/jni/src/jawobject.c
@@ -521,65 +521,37 @@ jaw_object_ref_relation_set (AtkObject *atk_obj)
return NULL;
}
- jclass classAccessibleContext = (*jniEnv)->FindClass(jniEnv,
- "javax/accessibility/AccessibleContext" );
- jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
- classAccessibleContext,
- "getAccessibleRelationSet",
- "()Ljavax/accessibility/AccessibleRelationSet;" );
- jobject jrel_set = (*jniEnv)->CallObjectMethod( jniEnv, ac, jmid );
+ jclass atkObject = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject");
+ jmethodID jmid = (*jniEnv)->GetStaticMethodID (jniEnv, atkObject, "getArrayAccessibleRelation",
"(Ljavax/accessibility/AccessibleContext;)[Lorg/GNOME/Accessibility/AtkObject$WrapKeyAndTarget;");
+ jobject jwrap_key_target_arr = (*jniEnv)->CallStaticObjectMethod (jniEnv, atkObject, jmid, ac);
(*jniEnv)->DeleteGlobalRef(jniEnv, ac);
- jclass classAccessibleRelationSet = (*jniEnv)->FindClass( jniEnv,
- "javax/accessibility/AccessibleRelationSet");
- jmid = (*jniEnv)->GetMethodID(jniEnv,
- classAccessibleRelationSet,
- "toArray",
- "()[Ljavax/accessibility/AccessibleRelation;");
- jobjectArray jrel_arr = (*jniEnv)->CallObjectMethod(jniEnv, jrel_set, jmid);
- jsize jarr_size = (*jniEnv)->GetArrayLength(jniEnv, jrel_arr);
+ jsize jarr_size = (*jniEnv)->GetArrayLength(jniEnv, jwrap_key_target_arr);
+ jclass wrapKeyTarget = (*jniEnv)->FindClass (jniEnv, "org/GNOME/Accessibility/AtkObject$WrapKeyAndTarget");
+ jfieldID fIdRelations = (*jniEnv)->GetFieldID (jniEnv, wrapKeyTarget, "relations",
"[Ljavax/accessibility/AccessibleContext;");
+ jfieldID fIdKey = (*jniEnv)->GetFieldID (jniEnv, wrapKeyTarget, "key", "Ljava/lang/String;");
jsize i;
for (i = 0; i < jarr_size; i++)
{
- jobject jrel = (*jniEnv)->GetObjectArrayElement(jniEnv, jrel_arr, i);
- jclass classAccessibleRelation = (*jniEnv)->FindClass(jniEnv,
- "javax/accessibility/AccessibleRelation");
- jmid = (*jniEnv)->GetMethodID(jniEnv,
- classAccessibleRelation,
- "getKey",
- "()Ljava/lang/String;");
- jstring jrel_key = (*jniEnv)->CallObjectMethod( jniEnv, jrel, jmid );
- AtkRelationType rel_type = jaw_impl_get_atk_relation_type(jniEnv, jrel_key);
-
- jmid = (*jniEnv)->GetMethodID(jniEnv,
- classAccessibleRelation,
- "getTarget",
- "()[Ljava/lang/Object;");
- jobjectArray jtarget_arr = (*jniEnv)->CallObjectMethod(jniEnv, jrel, jmid);
- jsize jtarget_size = (*jniEnv)->GetArrayLength(jniEnv, jtarget_arr);
+ jobject jwrap_key_target = (*jniEnv)->GetObjectArrayElement (jniEnv, jwrap_key_target_arr, i);
+ jstring jrel_key = (*jniEnv)->GetObjectField (jniEnv, jwrap_key_target, fIdKey);
+ AtkRelationType rel_type = jaw_impl_get_atk_relation_type (jniEnv, jrel_key);
+ jobjectArray jtarget_arr = (*jniEnv)->GetObjectField (jniEnv, jwrap_key_target, fIdRelations);
+ jsize jtarget_size = (*jniEnv)->GetArrayLength (jniEnv, jtarget_arr);
jsize j;
for (j = 0; j < jtarget_size; j++)
{
jobject jtarget = (*jniEnv)->GetObjectArrayElement(jniEnv, jtarget_arr, j);
- jclass classAccessible = (*jniEnv)->FindClass( jniEnv,
- "javax/accessibility/Accessible");
- if ((*jniEnv)->IsInstanceOf(jniEnv, jtarget, classAccessible))
- {
- jmid = (*jniEnv)->GetMethodID(jniEnv,
- classAccessible,
- "getAccessibleContext",
- "()Ljavax/accessibility/AccessibleContext;");
- jobject target_ac = (*jniEnv)->CallObjectMethod(jniEnv, jtarget, jmid);
-
- JawImpl *target_obj = jaw_impl_get_instance_from_jaw(jniEnv, target_ac);
- if(target_obj == NULL)
- return NULL;
- atk_object_add_relationship(atk_obj, rel_type, ATK_OBJECT(target_obj));
- }
+ JawImpl *target_obj = jaw_impl_get_instance_from_jaw(jniEnv, jtarget);
+ if(target_obj == NULL)
+ g_warning("jaw_object_ref_relation_set: target_obj == NULL occurs\n");
+ else
+ atk_object_add_relationship(atk_obj, rel_type, ATK_OBJECT(target_obj));
}
}
+
if(atk_obj->relation_set == NULL)
return NULL;
if (G_OBJECT(atk_obj->relation_set) != NULL)
diff --git a/wrapper/org/GNOME/Accessibility/AtkObject.java b/wrapper/org/GNOME/Accessibility/AtkObject.java
index 99a48b5..d27ee06 100644
--- a/wrapper/org/GNOME/Accessibility/AtkObject.java
+++ b/wrapper/org/GNOME/Accessibility/AtkObject.java
@@ -103,6 +103,42 @@ public class AtkObject{
return AtkUtil.invokeInSwing( () -> { return ac.getLocale(); }, null);
}
+ public static class WrapKeyAndTarget{
+ private String key;
+ private AccessibleContext[] relations;
+
+ public WrapKeyAndTarget(String key, AccessibleContext[] relations){
+ this.key = key;
+ this.relations = relations;
+ }
+ }
+
+ public static WrapKeyAndTarget[] getArrayAccessibleRelation(AccessibleContext ac){
+ WrapKeyAndTarget[] d = new WrapKeyAndTarget[0];
+ return AtkUtil.invokeInSwing( () -> {
+ AccessibleRelationSet relationSet = ac.getAccessibleRelationSet();
+ if (relationSet == null)
+ return d;
+ else {
+ AccessibleRelation[] array = relationSet.toArray();
+ WrapKeyAndTarget[] result = new WrapKeyAndTarget[array.length];
+ for(int i = 0; i < array.length; i++) {
+ String key = array[i].getKey();
+ Object[] objs = array[i].getTarget();
+ AccessibleContext[] contexts = new AccessibleContext[objs.length];
+ for(int j = 0; j < objs.length; j++) {
+ if (objs[i] instanceof Accessible)
+ contexts[i] = ( (Accessible) objs[i]).getAccessibleContext();
+ else
+ contexts[i] = null;
+ }
+ result[i] = new WrapKeyAndTarget(key, contexts);
+ }
+ return result;
+ }
+ }, d);
+ }
+
public static AccessibleContext getAccessibleChild(AccessibleContext ac, int i){
return AtkUtil.invokeInSwing( () -> {
Accessible child = ac.getAccessibleChild(i);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]