From 720c4fce5f31497d66444fb96af902d34148dd36 Mon Sep 17 00:00:00 2001 From: Lukasz Stanislawski Date: Wed, 1 Jul 2015 14:56:56 +0200 Subject: [PATCH] Set ScreenReaderEnabled property on initialization Change-Id: I285b65d591d9f565b80dec41eaafa95b0c195a96 --- include/screen_reader_switch.h | 32 +++++++++ src/main.c | 5 +- src/screen_reader_switch.c | 151 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 include/screen_reader_switch.h create mode 100644 src/screen_reader_switch.c diff --git a/include/screen_reader_switch.h b/include/screen_reader_switch.h new file mode 100644 index 0000000..67cadb3 --- /dev/null +++ b/include/screen_reader_switch.h @@ -0,0 +1,32 @@ +#ifndef _SCREEN_READER_SWITCH +#define _SCREEN_READER_SWITCH + +/** + * @brief Set "ScreenReaderEnabled" status of AT-SPI framework + * + * Function used to iniform applications that screen reader has been enabled in + * the system. + * + * ScreenReaderEnabled property refers to + * org.a11y.Bus bus at /org/a11y/bus object path in org.a11y.Status interface + * + * @param value EINA_TRUE if screen reader should be enabled, EINA_FALSE otherwise. + * @return EINA_TRUE if setting 'ScreenReaderEnabled' to value has successed, + * EINA_FALSE otherwise + */ +Eina_Bool screen_reader_switch_enabled_set(Eina_Bool value); + + +/** + * @brief Get "ScreenReaderEnabled" status of AT-SPI framework + * + * ScreenReaderEnabled property refers to + * org.a11y.Bus bus at /org/a11y/bus object path in org.a11y.Status interface + * + * @param value EINA_TRUE if screen reader is enabled, EINA_FALSE otherwise. + * @return EINA_TRUE if getting of value has successed, + * EINA_FALSE otherwise + */ +Eina_Bool screen_reader_switch_enabled_get(Eina_Bool *value); + +#endif diff --git a/src/main.c b/src/main.c index 2a1db94..5fe0717 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,7 @@ #include "logger.h" #include "screen_reader.h" #include "screen_reader_gestures.h" +#include "screen_reader_switch.h" #define MAX_STACK_FRAMES 64 static void *stack_traces[MAX_STACK_FRAMES]; @@ -200,8 +201,8 @@ static int app_create(void *data) elm_init(0, NULL); logger_init(); + screen_reader_switch_enabled_set(EINA_TRUE); screen_reader_create_service(data); - #ifndef SCREEN_READER_TV screen_reader_gestures_init(); navigator_init(); @@ -222,6 +223,8 @@ static int app_terminate(void *data) #endif DEBUG("terminate service"); screen_reader_terminate_service(data); + DEBUG("clear ScreenReaderEnabled property"); + screen_reader_switch_enabled_set(EINA_FALSE); DEBUG("terminate logger"); logger_shutdown(); DEBUG("screen reader terminated"); diff --git a/src/screen_reader_switch.c b/src/screen_reader_switch.c new file mode 100644 index 0000000..5afcae5 --- /dev/null +++ b/src/screen_reader_switch.c @@ -0,0 +1,151 @@ +#include "logger.h" +#include + +Eina_Bool screen_reader_switch_enabled_get(Eina_Bool *value) +{ + Eldbus_Connection *conn; + Eldbus_Object *dobj; + Eldbus_Proxy *proxy; + Eldbus_Message *req, *reply; + const char *errname = NULL, *errmsg = NULL; + Eina_Bool ret = EINA_FALSE; + Eldbus_Message_Iter *iter; + + eldbus_init(); + + if (!(conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION))) + { + ERROR("Connection to session bus failed"); + return EINA_FALSE; + } + if (!(dobj = eldbus_object_get(conn, "org.a11y.Bus", "/org/a11y/bus"))) + { + ERROR("Failed to create eldbus object for /org/a11y/bus"); + goto fail_obj; + } + if (!(proxy = eldbus_proxy_get(dobj, "org.freedesktop.DBus.Properties"))) + { + ERROR("Failed to create proxy object for 'org.freedesktop.DBus.Properties'"); + goto fail_proxy; + } + if (!(req = eldbus_proxy_method_call_new(proxy, "Get"))) + { + ERROR("Failed to create method call on org.freedesktop.DBus.Properties.Get"); + goto fail_proxy; + } + eldbus_message_ref(req); + + if (!eldbus_message_arguments_append(req, "ss", "org.a11y.Status", "ScreenReaderEnabled")) + { + ERROR("Failed to append message args"); + goto fail_msg; + } + + reply = eldbus_proxy_send_and_block(proxy, req, 100); + if (!reply || eldbus_message_error_get(reply, &errname, &errmsg)) + { + ERROR("Unable to call method org.freedesktop.DBus.Properties.Get: %s %s", errname, errmsg); + goto fail_msg; + } + + if (!eldbus_message_arguments_get(reply, "v", &iter)) + { + ERROR("Invalid answer signature"); + goto fail_msg; + } + else + { + if (!eldbus_message_iter_arguments_get(iter, "b", value)) + { + ERROR("Invalid variant signature"); + } + else + ret = EINA_TRUE; + } + +fail_msg: + eldbus_message_unref(req); +fail_proxy: + eldbus_object_unref(dobj); +fail_obj: + eldbus_connection_unref(conn); + + eldbus_shutdown(); + + return ret; +} + +Eina_Bool screen_reader_switch_enabled_set(Eina_Bool value) +{ + Eldbus_Connection *conn; + Eldbus_Object *dobj; + Eldbus_Proxy *proxy; + Eldbus_Message *req, *reply; + const char *errname = NULL, *errmsg = NULL; + Eina_Bool ret = EINA_FALSE; + Eldbus_Message_Iter *iter; + + eldbus_init(); + + if (!(conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION))) + { + ERROR("Connection to session bus failed"); + return EINA_FALSE; + } + if (!(dobj = eldbus_object_get(conn, "org.a11y.Bus", "/org/a11y/bus"))) + { + ERROR("Failed to create eldbus object"); + goto fail_obj; + } + if (!(proxy = eldbus_proxy_get(dobj, "org.freedesktop.DBus.Properties"))) + { + ERROR("Failed to create proxy object for 'org.freedesktop.DBus.Properties'"); + goto fail_proxy; + } + if (!(req = eldbus_proxy_method_call_new(proxy, "Set"))) + { + ERROR("Failed to create method call on org.freedesktop.DBus.Properties.Set"); + goto fail_proxy; + } + eldbus_message_ref(req); + + if (!eldbus_message_arguments_append(req, "ss", "org.a11y.Status", "ScreenReaderEnabled")) + { + ERROR("Failed to append message args"); + goto fail_msg; + } + if (!(iter = eldbus_message_iter_container_new(eldbus_message_iter_get(req), 'v', "b"))) + { + ERROR("Unable to create variant iterator"); + goto fail_msg; + } + if (!eldbus_message_iter_arguments_append(iter, "b", value)) + { + ERROR("Unable to append to variant iterator"); + goto fail_msg; + } + if (!eldbus_message_iter_container_close(eldbus_message_iter_get(req), iter)) + { + ERROR("Failed to close variant iterator"); + goto fail_msg; + } + reply = eldbus_proxy_send_and_block(proxy, req, 100.0); + if (!reply || eldbus_message_error_get(reply, &errname, &errmsg)) + { + ERROR("Send failed: %s %s\n", errname, errmsg); + goto fail_msg; + } + else + ret = EINA_TRUE; + +fail_msg: + eldbus_message_unref(req); +fail_proxy: + eldbus_object_unref(dobj); +fail_obj: + eldbus_connection_unref(conn); + + eldbus_shutdown(); + + return ret; +} -- 2.7.4