In the past, a gtk button's do_action handler added an idle to invoke
the button and then returned, but now the idle has been removed, and the
do_action call activates the button directly, meaning that, if the
button invokes a dialogue, then atk_action_do_action will not return
until the dialog closes. So, to be safe, we need to send a reply before
invoking atk. This means that atk's return value gets ignored, although
it was somewhat meaningless in gtk's case anyhow. This required that
droute's behavior be changed so that, if a handler does not return a
message, droute will now assume that the handler already sent a reply,
rather than synthesizing a default empty reply. Thus, handlers are now
required to return a value DBusMessage.
Perhaps the API should really be asynchronous, with a callback to be
invoked when the action finishes.
AtkAction *action = (AtkAction *) user_data;
DBusError error;
dbus_int32_t index;
AtkAction *action = (AtkAction *) user_data;
DBusError error;
dbus_int32_t index;
DBusMessage *reply;
g_return_val_if_fail (ATK_IS_ACTION (user_data),
DBusMessage *reply;
g_return_val_if_fail (ATK_IS_ACTION (user_data),
{
return droute_invalid_arguments_error (message);
}
{
return droute_invalid_arguments_error (message);
}
- rv = atk_action_do_action (action, index);
reply = dbus_message_new_method_return (message);
if (reply)
{
dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
DBUS_TYPE_INVALID);
}
reply = dbus_message_new_method_return (message);
if (reply)
{
dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
DBUS_TYPE_INVALID);
}
+ dbus_connection_send (bus, reply, NULL);
+ dbus_message_unref (reply);
+ atk_action_do_action (action, index);
+ return NULL;
}
DRouteMethod methods[] = {
}
DRouteMethod methods[] = {
else
reply = (func) (bus, message, datum);
else
reply = (func) (bus, message, datum);
+ /* All D-Bus method calls must have a reply.
+ * If one is not provided presume that the caller has already
+ * sent one.
+ */
+ if (reply)
- /* All D-Bus method calls must have a reply.
- * If one is not provided presume that the call has a void
- * return and no error has occured.
- */
- reply = dbus_message_new_method_return (message);
+ dbus_connection_send (bus, reply, NULL);
+ dbus_message_unref (reply);
- dbus_connection_send (bus, reply, NULL);
- dbus_message_unref (reply);
result = DBUS_HANDLER_RESULT_HANDLED;
}
result = DBUS_HANDLER_RESULT_HANDLED;
}