about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-07-27 14:48:43 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-07-27 14:48:43 +0200
commitc071e9b05144c0f372e4c375772e6887c032f7c0 (patch)
treea47376e7b788594c0ed5d01232a5b9796643a278 /src
parent1c1bab8d6b787756bd03baf958b9253dec6e56c3 (diff)
downloadbox64-c071e9b05144c0f372e4c375772e6887c032f7c0.tar.gz
box64-c071e9b05144c0f372e4c375772e6887c032f7c0.zip
Improved wrapping of libatk
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/gtkclass.h34
-rwxr-xr-xsrc/tools/gtkclass.c84
-rwxr-xr-xsrc/wrapped/wrappedatk.c9
-rwxr-xr-xsrc/wrapped/wrappedatk_private.h44
4 files changed, 149 insertions, 22 deletions
diff --git a/src/include/gtkclass.h b/src/include/gtkclass.h
index eb931ebf..0fe6dd30 100755
--- a/src/include/gtkclass.h
+++ b/src/include/gtkclass.h
@@ -471,6 +471,39 @@ typedef struct my_GDBusObjectManagerClientClass_s
   void* padding[8];
 } my_GDBusObjectManagerClientClass_t;
 
+typedef struct my_AtkObjectClass_s
+{
+  my_GObjectClass_t parent;
+  void* (* get_name)            (void* accessible);
+  void* (* get_description)     (void* accessible);
+  void* (*get_parent)           (void* accessible);
+  int   (* get_n_children)      (void* accessible);
+  void* (* ref_child)           (void* accessible, int i);
+  int   (* get_index_in_parent) (void* accessible);
+  void* (* ref_relation_set)    (void* accessible);
+  int   (* get_role)            (void* accessible);
+  int   (* get_layer)           (void* accessible);
+  int   (* get_mdi_zorder)      (void* accessible);
+  void* (* ref_state_set)       (void* accessible);
+  void  (* set_name)            (void* accessible, void* name);
+  void  (* set_description)     (void* accessible, void* description);
+  void  (* set_parent)          (void* accessible, void* parent);
+  void  (* set_role)            (void* accessible, int role);
+  uint32_t (* connect_property_change_handler)    (void* accessible, void* handler);
+  void  (* remove_property_change_handler)     (void* accessible, uint32_t handler_id);
+  void  (* initialize)          (void* accessible, void* data);
+  void  (* children_changed)    (void* accessible, uint32_t change_index, void* changed_child);
+  void  (* focus_event)         (void* accessible, int focus_in);
+  void  (* property_change)     (void* accessible, void* values);
+  void  (* state_change)        (void* accessible, void* name, int state_set);
+  void  (*visible_data_changed) (void* accessible);
+  void  (*active_descendant_changed) (void* accessible, void* child);
+  void* (*get_attributes)       (void* accessible);
+  void* (*get_object_locale)    (void* accessible);
+  void*  pad1;
+} my_AtkObjectClass_t;
+
+
 // GTypeValueTable
 typedef struct my_GTypeValueTable_s {
   void     (*value_init)         (void* value);
@@ -553,6 +586,7 @@ GTKCLASS(GtkMenuShell2)             \
 GTKCLASS(GtkMenuBar2)               \
 GTKCLASS(MetaFrames2)               \
 GTKCLASS(GDBusObjectManagerClient)  \
+GTKCLASS(AtkObject)                 \
 
 #define GTKCLASS(A) void Set##A##ID(size_t id);
 GTKCLASSES()
diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c
index 12c7797c..e271f87d 100755
--- a/src/tools/gtkclass.c
+++ b/src/tools/gtkclass.c
@@ -1415,6 +1415,90 @@ static void bridgeGtkMenuBar2Class(my_GtkMenuBar2Class_t* class)
 
 #undef SUPERGO
 
+// ----- AtkObjectClass ------
+// wrapper x86 -> natives of callbacks
+WRAPPER(AtkObject, get_name, void*, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_description, void*, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_parent, void*, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_n_children, int, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, ref_child, void*, (void* accessible, int i), 2, accessible, i);
+WRAPPER(AtkObject, get_index_in_parent, int, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, ref_relation_set, void*, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_role, int, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_layer, int, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_mdi_zorder, int, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, ref_state_set, void*, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, set_name, void, (void* accessible, void* name), 2, accessible, name);
+WRAPPER(AtkObject, set_description, void, (void* accessible, void* description), 2, accessible, description);
+WRAPPER(AtkObject, set_parent, void, (void* accessible, void* parent), 2, accessible, parent);
+WRAPPER(AtkObject, set_role, void, (void* accessible, int role), 2, accessible, role);
+WRAPPER(AtkObject, connect_property_change_handler, uint32_t, (void* accessible, void* handler), 2, accessible, AddCheckBridge(my_bridge, vFpp, handler, 0, NULL));
+WRAPPER(AtkObject, remove_property_change_handler, void, (void* accessible, uint32_t handler_id), 2, accessible, handler_id);
+WRAPPER(AtkObject, initialize, void, (void* accessible, void* data), 2, accessible, data);
+WRAPPER(AtkObject, children_changed, void, (void* accessible, uint32_t change_index, void* changed_child), 3, accessible, change_index, changed_child);
+WRAPPER(AtkObject, focus_event, void, (void* accessible, int focus_in), 2, accessible, focus_in);
+WRAPPER(AtkObject, property_change, void, (void* accessible, void* values), 2, accessible, values);
+WRAPPER(AtkObject, state_change, void, (void* accessible, void* name, int state_set), 3, accessible, name, state_set);
+WRAPPER(AtkObject, visible_data_changed, void, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, active_descendant_changed, void, (void* accessible, void* child), 2, accessible, child);
+WRAPPER(AtkObject, get_attributes, void*, (void* accessible), 1, accessible);
+WRAPPER(AtkObject, get_object_locale, void*, (void* accessible), 1, accessible);
+
+#define SUPERGO() \
+    GO(get_name, pFp);                          \
+    GO(get_description, pFp);                   \
+    GO(get_parent, pFp);                        \
+    GO(get_n_children, iFp);                    \
+    GO(ref_child, pFpi);                        \
+    GO(get_index_in_parent, iFp);               \
+    GO(ref_relation_set, pFp);                  \
+    GO(get_role, iFp);                          \
+    GO(get_layer, iFp);                         \
+    GO(get_mdi_zorder, iFp);                    \
+    GO(ref_state_set, pFp);                     \
+    GO(set_name, vFpp);                         \
+    GO(set_description, vFpp);                  \
+    GO(set_parent, vFpp);                       \
+    GO(set_role, vFpi);                         \
+    GO(connect_property_change_handler, uFpp);  \
+    GO(remove_property_change_handler, vFpu);   \
+    GO(initialize, vFpp);                       \
+    GO(children_changed, vFpup);                \
+    GO(focus_event, vFpi);                      \
+    GO(property_change, vFpp);                  \
+    GO(state_change, vFppi);                    \
+    GO(visible_data_changed, vFp);              \
+    GO(active_descendant_changed, vFpp);        \
+    GO(get_attributes, pFp);                    \
+    GO(get_object_locale, pFp);                 \
+
+// wrap (so bridge all calls, just in case)
+static void wrapAtkObjectClass(my_AtkObjectClass_t* class)
+{
+    wrapGObjectClass(&class->parent);
+    #define GO(A, W) class->A = reverse_##A##_AtkObject (W, class->A)
+    SUPERGO()
+    #undef GO
+}
+// unwrap (and use callback if not a native call anymore)
+static void unwrapAtkObjectClass(my_AtkObjectClass_t* class)
+{   
+    unwrapGObjectClass(&class->parent);
+    #define GO(A, W)   class->A = find_##A##_AtkObject (class->A)
+    SUPERGO()
+    #undef GO
+}
+// autobridge
+static void bridgeAtkObjectClass(my_AtkObjectClass_t* class)
+{
+    bridgeGObjectClass(&class->parent);
+    #define GO(A, W) autobridge_##A##_AtkObject (W, class->A)
+    SUPERGO()
+    #undef GO
+}
+
+#undef SUPERGO
+
 // No more wrap/unwrap
 #undef WRAPPER
 #undef FIND
diff --git a/src/wrapped/wrappedatk.c b/src/wrapped/wrappedatk.c
index d3fe8a78..f96beff0 100755
--- a/src/wrapped/wrappedatk.c
+++ b/src/wrapped/wrappedatk.c
@@ -17,10 +17,16 @@
 #include "box64context.h"
 #include "emu/x64emu_private.h"
 #include "myalign.h"
+#include "gtkclass.h"
 
 const char* atkName = "libatk-1.0.so.0";
 #define LIBNAME atk
 
+typedef size_t      (*LFv_t)  ();
+
+#define ADDED_FUNCTIONS()                   \
+GO(atk_object_get_type, LFv_t)              \
+
 #include "generated/wrappedatktypes.h"
 
 #include "wrappercallback.h"
@@ -121,7 +127,8 @@ EXPORT uint32_t my_atk_add_key_event_listener(x64emu_t* emu, void* f, void* p)
         return -1;
 
 #define CUSTOM_INIT \
-    getMy(lib);
+    getMy(lib);     \
+    SetAtkObjectID(my->atk_object_get_type());                 \
 
 #define CUSTOM_FINI \
     freeMy();
diff --git a/src/wrapped/wrappedatk_private.h b/src/wrapped/wrappedatk_private.h
index 855bba05..6bfd50ef 100755
--- a/src/wrapped/wrappedatk_private.h
+++ b/src/wrapped/wrappedatk_private.h
@@ -8,7 +8,7 @@ GO(atk_action_get_keybinding, pFpi)
 GO(atk_action_get_localized_name, pFpi)
 GO(atk_action_get_n_actions, iFp)
 GO(atk_action_get_name, pFpi)
-GO(atk_action_get_type, iFv)
+GO(atk_action_get_type, LFv)
 GO(atk_action_set_description, pFpi)
 GOM(atk_add_focus_tracker, uFEp)
 //GOM(atk_add_global_event_listener, uFEpp)
@@ -22,20 +22,21 @@ GO(atk_component_get_layer, iFp)
 GO(atk_component_get_mdi_zorder, iFp)
 GO(atk_component_get_position, vFpppi)
 GO(atk_component_get_size, vFppp)
-GO(atk_component_get_type, iFv)
+GO(atk_component_get_type, LFv)
 GO(atk_component_grab_focus, iFp)
 GO(atk_component_ref_accessible_at_point, pFpiii)
 GO(atk_component_remove_focus_handler, vFpu)
+GO(atk_component_scroll_to_point, iFpiii)
 GO(atk_component_set_extents, iFpiiiii)
 GO(atk_component_set_position, iFpiii)
 GO(atk_component_set_size, iFpii)
-GO(atk_coord_type_get_type, iFv)
+GO(atk_coord_type_get_type, LFv)
 //GO(atk_document_get_attributes, 
 //GO(atk_document_get_attribute_value, 
 //GO(atk_document_get_document, 
 //GO(atk_document_get_document_type, 
 //GO(atk_document_get_locale, 
-GO(atk_document_get_type, pFv)
+GO(atk_document_get_type, LFv)
 //GO(atk_document_set_attribute_value, 
 //GO(atk_editable_text_copy_text, 
 //GO(atk_editable_text_cut_text, 
@@ -68,7 +69,7 @@ GO(atk_get_version, pFv)
 //GO(atk_hyperlink_get_type, 
 //GO(atk_hyperlink_get_uri, 
 //GO(atk_hyperlink_impl_get_hyperlink, 
-GO(atk_hyperlink_impl_get_type, pFv)
+GO(atk_hyperlink_impl_get_type, LFv)
 //GO(atk_hyperlink_is_inline, 
 //GO(atk_hyperlink_is_selected_link, 
 //GO(atk_hyperlink_is_valid, 
@@ -76,35 +77,35 @@ GO(atk_hyperlink_impl_get_type, pFv)
 //GO(atk_hypertext_get_link, 
 //GO(atk_hypertext_get_link_index, 
 //GO(atk_hypertext_get_n_links, 
-GO(atk_hypertext_get_type, pFv)
+GO(atk_hypertext_get_type, LFv)
 //GO(atk_image_get_image_description, 
 //GO(atk_image_get_image_locale, 
 //GO(atk_image_get_image_position, 
 //GO(atk_image_get_image_size, 
-GO(atk_image_get_type, pFv)
+GO(atk_image_get_type, LFv)
 //GO(atk_image_set_image_description, 
-GO(atk_implementor_get_type, iFv)
+GO(atk_implementor_get_type, LFv)
 GO(atk_implementor_ref_accessible, pFp)
-GO(atk_key_event_type_get_type, pFv)
-GO(atk_layer_get_type, pFv)
+GO(atk_key_event_type_get_type, LFv)
+GO(atk_layer_get_type, LFv)
 //GO(atk_marshal_VOID__INT_INT, 
 //GO(atk_marshal_VOID__INT_INT_INT_STRING, 
 //GO(atk_marshal_VOID__INT_INT_STRING, 
 //GO(atk_marshal_VOID__STRING_BOOLEAN, 
 GO(atk_misc_get_instance, pFv)
-GO(atk_misc_get_type, iFv)
+GO(atk_misc_get_type, LFv)
 GO(atk_misc_threads_enter, vFp)
 GO(atk_misc_threads_leave, vFp)
 DATA(atk_misc_instance, sizeof(void*))
 //GO(atk_no_op_object_factory_get_type, 
 //GO(atk_no_op_object_factory_new, 
-GO(atk_no_op_object_get_type, pFv)
+GO(atk_no_op_object_get_type, LFv)
 //GO(atk_no_op_object_new, 
 GO(atk_object_add_relationship, iFpip)
 //GOM(atk_object_connect_property_change_handler, uFEpp)
 //GO(atk_object_factory_create_accessible, 
 GO(atk_object_factory_get_accessible_type, iFp)
-GO(atk_object_factory_get_type, iFv)
+GO(atk_object_factory_get_type, LFv)
 //GO(atk_object_factory_invalidate, 
 GO(atk_object_get_attributes, pFp)
 GO(atk_object_get_description, pFp)
@@ -116,7 +117,7 @@ GO(atk_object_get_name, pFp)
 GO(atk_object_get_object_locale, pFp)
 GO(atk_object_get_parent, pFp)
 GO(atk_object_get_role, iFp)
-GO(atk_object_get_type, iFv)
+GO(atk_object_get_type, LFv)
 GO(atk_object_initialize, vFpp)
 GO(atk_object_notify_state_change, vFpii)
 GO(atk_object_ref_accessible_child, pFpi)
@@ -162,12 +163,12 @@ GO(atk_remove_key_event_listener, vFu)
 GO(atk_role_for_name, iFp)
 GO(atk_role_get_localized_name, pFp)
 GO(atk_role_get_name, pFp)
-GO(atk_role_get_type, iFv)
+GO(atk_role_get_type, LFv)
 GO(atk_role_register, iFp)
 GO(atk_selection_add_selection, iFpi)
 GO(atk_selection_clear_selection, iFp)
 GO(atk_selection_get_selection_count, iFp)
-GO(atk_selection_get_type, iFv)
+GO(atk_selection_get_type, LFv)
 GO(atk_selection_is_child_selected, iFpi)
 GO(atk_selection_ref_selection, pFpi)
 GO(atk_selection_remove_selection, iFpi)
@@ -251,16 +252,17 @@ GO(atk_selection_select_all_selection, iFp)
 //GO(atk_text_get_text_after_offset, 
 //GO(atk_text_get_text_at_offset, 
 //GO(atk_text_get_text_before_offset, 
-GO(atk_text_get_type, pFv)
-GO(atk_text_range_get_type, pFv)
+GO(atk_text_get_type, LFv)
+GO(atk_text_range_get_type, LFv)
 //GO(atk_text_remove_selection, 
+GO(atk_text_scroll_substring_to_point, iFpiiiii)
 //GO(atk_text_set_caret_offset, 
 //GO(atk_text_set_selection, 
-GO(atk_util_get_type, iFv)
+GO(atk_util_get_type, LFv)
 //GO(atk_value_get_current_value, 
 //GO(atk_value_get_maximum_value, 
 //GO(atk_value_get_minimum_increment, 
 //GO(atk_value_get_minimum_value, 
-GO(atk_value_get_type, pFv)
+GO(atk_value_get_type, LFv)
 //GO(atk_value_set_current_value, 
-GO(atk_window_get_type, pFv)
+GO(atk_window_get_type, LFv)