[at-spi2-atk: 1/2] Add atk_bridge_set_event_context



commit d8ab26841602933ea6d7e9190527ee73cdf05f4d
Author: Samuel Thibault <samuel thibault ens-lyon org>
Date:   Mon Apr 1 22:17:09 2019 +0200

    Add atk_bridge_set_event_context
    
    to allow java-atk-wrapper to control in which thread events are
    delivered.
    
    See https://bugzilla.gnome.org/show_bug.cgi?id=760058

 atk-adaptor/accessible-cache.c   |  5 +++--
 atk-adaptor/accessible-leasing.c |  5 +++--
 atk-adaptor/atk-bridge.h         |  1 +
 atk-adaptor/atkbridge.symbols    |  1 +
 atk-adaptor/bridge.c             |  4 ++--
 atk-adaptor/event.c              | 43 +++++++++++++++++++++++++++++++++++++---
 atk-adaptor/event.h              |  4 ++++
 7 files changed, 54 insertions(+), 9 deletions(-)
---
diff --git a/atk-adaptor/accessible-cache.c b/atk-adaptor/accessible-cache.c
index a52a8e5..5174dbd 100644
--- a/atk-adaptor/accessible-cache.c
+++ b/atk-adaptor/accessible-cache.c
@@ -26,6 +26,7 @@
 #include "accessible-cache.h"
 #include "accessible-register.h"
 #include "bridge.h"
+#include "event.h"
 
 SpiCache *spi_global_cache = NULL;
 
@@ -358,7 +359,7 @@ child_added_listener (GSignalInvocationHint * signal_hint,
           g_queue_push_tail (cache->add_traversal, child);
 
           if (cache->add_pending_idle == 0)
-            cache->add_pending_idle = g_idle_add (add_pending_items, cache);
+            cache->add_pending_idle = spi_idle_add (add_pending_items, cache);
         }
 #ifdef SPI_ATK_DEBUG
       recursion_check_unset ();
@@ -400,7 +401,7 @@ toplevel_added_listener (AtkObject * accessible,
       g_queue_push_tail (cache->add_traversal, child);
 
       if (cache->add_pending_idle == 0)
-        cache->add_pending_idle = g_idle_add (add_pending_items, cache);
+        cache->add_pending_idle = spi_idle_add (add_pending_items, cache);
 #ifdef SPI_ATK_DEBUG
       recursion_check_unset ();
 #endif
diff --git a/atk-adaptor/accessible-leasing.c b/atk-adaptor/accessible-leasing.c
index dcddb0b..27e4459 100644
--- a/atk-adaptor/accessible-leasing.c
+++ b/atk-adaptor/accessible-leasing.c
@@ -25,6 +25,7 @@
 #include <string.h>
 
 #include "accessible-leasing.h"
+#include "event.h"
 
 #ifdef SPI_ATK_DEBUG
 #include "accessible-cache.h"
@@ -161,8 +162,8 @@ add_expiry_timeout (SpiLeasing * leasing)
   /* The current time is implicitly rounded down here by ignoring the us */
   g_get_current_time (&t);
   next_expiry = elem->expiry_s - t.tv_sec;
-  leasing->expiry_func_id = g_timeout_add_seconds (next_expiry,
-                                                   expiry_func, leasing);
+  leasing->expiry_func_id = spi_timeout_add_seconds (next_expiry,
+                                                     expiry_func, leasing);
 }
 
 /*---------------------------------------------------------------------------*/
diff --git a/atk-adaptor/atk-bridge.h b/atk-adaptor/atk-bridge.h
index 9c0dd0d..9b6f91e 100644
--- a/atk-adaptor/atk-bridge.h
+++ b/atk-adaptor/atk-bridge.h
@@ -31,6 +31,7 @@ G_BEGIN_DECLS
 
 int atk_bridge_adaptor_init (int * argc, char ** argv[]);
 void atk_bridge_adaptor_cleanup (void);
+void atk_bridge_set_event_context(GMainContext *cnx);
 
 G_END_DECLS
 
diff --git a/atk-adaptor/atkbridge.symbols b/atk-adaptor/atkbridge.symbols
index d90cf94..cfaa509 100644
--- a/atk-adaptor/atkbridge.symbols
+++ b/atk-adaptor/atkbridge.symbols
@@ -1,2 +1,3 @@
 atk_bridge_adaptor_init
 atk_bridge_adaptor_cleanup
+atk_bridge_set_event_context
diff --git a/atk-adaptor/bridge.c b/atk-adaptor/bridge.c
index 0b2b736..2db4094 100644
--- a/atk-adaptor/bridge.c
+++ b/atk-adaptor/bridge.c
@@ -673,7 +673,7 @@ new_connection_cb (DBusServer *server, DBusConnection *con, void *data)
 {
   dbus_connection_set_unix_user_function (con, user_check, NULL, NULL);
   dbus_connection_ref(con);
-  atspi_dbus_connection_setup_with_g_main(con, NULL);
+  atspi_dbus_connection_setup_with_g_main(con, spi_context);
   droute_intercept_dbus (con);
   droute_context_register (spi_global_app_data->droute, con);
 
@@ -904,7 +904,7 @@ spi_atk_create_socket (SpiBridge *app)
     return -1;
   }
 
-  atspi_dbus_server_setup_with_g_main(server, NULL);
+  atspi_dbus_server_setup_with_g_main(server, spi_context);
   dbus_server_set_new_connection_function(server, new_connection_cb, NULL, NULL);
 
   spi_global_app_data->server = server;
diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c
index 739dc2c..7c3c3f9 100644
--- a/atk-adaptor/event.c
+++ b/atk-adaptor/event.c
@@ -42,6 +42,8 @@ static GArray *listener_ids = NULL;
 static gint atk_bridge_key_event_listener_id;
 static gint atk_bridge_focus_tracker_id;
 
+GMainContext *spi_context = NULL;
+
 /*---------------------------------------------------------------------------*/
 
 #define ITF_EVENT_OBJECT   "org.a11y.atspi.Event.Object"
@@ -72,6 +74,34 @@ switch_main_context (GMainContext *cnx)
     atspi_dbus_connection_setup_with_g_main (list->data, cnx);
 }
 
+guint
+spi_idle_add(GSourceFunc    function, gpointer       data)
+{
+  GSource *source;
+  guint id;
+
+  source = g_idle_source_new ();
+  g_source_set_callback (source, function, data, NULL);
+  id = g_source_attach (source, spi_context);
+  g_source_unref (source);
+
+  return id;
+}
+
+guint
+spi_timeout_add_seconds (gint interval, GSourceFunc function, gpointer    data)
+{
+  GSource *source;
+  guint id;
+
+  source = g_timeout_source_new_seconds (interval);
+  g_source_set_callback (source, function, data, NULL);
+  id = g_source_attach (source, spi_context);
+  g_source_unref (source);
+
+  return id;
+}
+
 static void
 set_reply (DBusPendingCall * pending, void *user_data)
 {
@@ -79,7 +109,7 @@ set_reply (DBusPendingCall * pending, void *user_data)
 
   closure->reply = dbus_pending_call_steal_reply (pending);
   dbus_pending_call_unref (pending);
-  switch_main_context (NULL);
+  switch_main_context (spi_context);
   g_main_loop_quit (closure->loop);
 }
 
@@ -88,7 +118,7 @@ timeout_reply (void *data)
 {
   SpiReentrantCallClosure *closure = data;
 
-  switch_main_context (NULL);
+  switch_main_context (spi_context);
   g_main_loop_quit (closure->loop);
   closure->timeout = -1;
   return FALSE;
@@ -108,7 +138,7 @@ send_and_allow_reentry (DBusConnection * bus, DBusMessage * message)
 
   if (!dbus_connection_send_with_reply (bus, message, &pending, 9000) || !pending)
     {
-      switch_main_context (NULL);
+      switch_main_context (spi_context);
       return NULL;
     }
   dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL);
@@ -126,6 +156,13 @@ send_and_allow_reentry (DBusConnection * bus, DBusMessage * message)
   return closure.reply;
 }
 
+void
+atk_bridge_set_event_context(GMainContext *cnx)
+{
+  spi_context = cnx;
+  switch_main_context(spi_context);
+}
+
 /*---------------------------------------------------------------------------*/
 
 /*
diff --git a/atk-adaptor/event.h b/atk-adaptor/event.h
index 1a9f9f3..f5d9758 100644
--- a/atk-adaptor/event.h
+++ b/atk-adaptor/event.h
@@ -30,4 +30,8 @@ void spi_atk_deregister_event_listeners (void);
 void spi_atk_tidy_windows (void);
 
 gboolean spi_event_is_subtype (gchar **needle, gchar **haystack);
+
+extern GMainContext *spi_context;
+guint spi_idle_add(GSourceFunc    function, gpointer       data);
+guint spi_timeout_add_seconds (gint interval, GSourceFunc function, gpointer    data);
 #endif /* EVENT_H */


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