#include <stdio.h>
#include <gio/gio.h>
+#ifdef HAVE_X11
#include <X11/Xlib.h>
#include <X11/Xatom.h>
+#endif
+
+#define APP_CONTROL_OPERATION_SCREEN_READ "http://tizen.org/appcontrol/operation/read_screen"
+#include <appsvc.h>
+#include <vconf.h>
+#include <dlog.h>
+#include <aul.h>
typedef enum {
A11Y_BUS_STATE_IDLE = 0,
GSettings *a11y_schema;
GSettings *interface_schema;
+ gboolean screen_reader_needed;
+ int pid;
+
A11yBusState state;
+
/* -1 == error, 0 == pending, > 0 == running */
int a11y_bus_pid;
char *a11y_bus_address;
app->a11y_bus_address = g_strchomp (g_strdup (addr_buf));
g_debug ("a11y bus address: %s", app->a11y_bus_address);
+#ifdef HAVE_X11
{
Display *display = XOpenDisplay (NULL);
if (display)
XCloseDisplay (display);
}
}
+#endif
return TRUE;
handle_a11y_enabled_change (A11yBusLauncher *app, gboolean enabled,
gboolean notify_gsettings)
{
- GVariantBuilder *builder;
- GVariantBuilder *invalidated_builder;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
if (enabled == app->a11y_enabled)
return;
g_settings_sync ();
}
- builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
- invalidated_builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
- g_variant_builder_add (builder, "{sv}", "IsEnabled",
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ g_variant_builder_add (&builder, "{sv}", "IsEnabled",
g_variant_new_boolean (enabled));
g_dbus_connection_emit_signal (app->session_bus, NULL, "/org/a11y/bus",
- "org.freedesktop.DBus", "PropertiesChanged",
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
g_variant_new ("(sa{sv}as)", "org.a11y.Status",
- builder,
- invalidated_builder),
+ &builder,
+ &invalidated_builder),
NULL);
}
handle_screen_reader_enabled_change (A11yBusLauncher *app, gboolean enabled,
gboolean notify_gsettings)
{
- GVariantBuilder *builder;
- GVariantBuilder *invalidated_builder;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
if (enabled == app->screen_reader_enabled)
return;
g_settings_sync ();
}
- builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
- invalidated_builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
- g_variant_builder_add (builder, "{sv}", "ScreenReaderEnabled",
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ g_variant_builder_add (&builder, "{sv}", "ScreenReaderEnabled",
g_variant_new_boolean (enabled));
g_dbus_connection_emit_signal (app->session_bus, NULL, "/org/a11y/bus",
- "org.freedesktop.DBus", "PropertiesChanged",
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
g_variant_new ("(sa{sv}as)", "org.a11y.Status",
- builder,
- invalidated_builder),
+ &builder,
+ &invalidated_builder),
NULL);
}
NULL,
&error);
if (registration_id == 0)
- g_error ("%s", error->message);
+ {
+ g_error ("%s", error->message);
+ g_clear_error (&error);
+ }
g_dbus_connection_register_object (connection,
- "/org/a11y/bus",
- introspection_data->interfaces[1],
- &status_vtable,
- _global_app,
- NULL,
- &error);
+ "/org/a11y/bus",
+ introspection_data->interfaces[1],
+ &status_vtable,
+ _global_app,
+ NULL,
+ NULL);
}
static void
static gboolean
already_running ()
{
+#ifdef HAVE_X11
Atom AT_SPI_BUS;
Atom actual_type;
Display *bridge_display;
if (data)
{
GDBusConnection *bus;
- GError *error = NULL;
- const gchar *old_session = g_getenv ("DBUS_SESSION_BUS_ADDRESS");
- /* TODO: Is there a better way to connect? This is really hacky */
- g_setenv ("DBUS_SESSION_BUS_ADDRESS", data, TRUE);
- bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
- g_setenv ("DBUS_SESSION_BUS_ADDRESS", old_session, TRUE);
+ bus = g_dbus_connection_new_for_address_sync ((const gchar *)data, 0,
+ NULL, NULL, NULL);
if (bus != NULL)
{
result = TRUE;
XCloseDisplay (bridge_display);
return result;
+#else
+ return FALSE;
+#endif
}
static GSettings *
handle_screen_reader_enabled_change (_global_app, new_val, FALSE);
}
+static gboolean
+_launch_screen_reader(A11yBusLauncher *bl)
+{
+ bundle *kb = NULL;
+ gboolean ret = FALSE;
+
+ kb = bundle_create();
+ if (kb == NULL)
+ return FALSE;
+
+ bl->pid = aul_launch_app("org.tizen.screen-reader", kb);
+ if (bl->pid >= 0) {
+ ret = TRUE;
+ }
+
+ bundle_free(kb);
+ return ret;
+}
+
+static gboolean
+_terminate_screen_reader(A11yBusLauncher *bl)
+{
+ int ret;
+ if (bl->pid <= 0)
+ return FALSE;
+
+ LOGD("terminate process with pid %d", bl->pid);
+ if (!aul_terminate_pid(bl->pid))
+ {
+ bl->pid = 0;
+ return TRUE;
+ }
+
+ LOGD("Unable to terminate process using aul api. Sending SIGTERM signal");
+ ret = kill(bl->pid, SIGTERM);
+ if (!ret)
+ {
+ bl->pid = 0;
+ return TRUE;
+ }
+
+ LOGD("Unable to terminate process: %d with api or signal.", bl->pid);
+ return FALSE;
+}
+
+void screen_reader_cb(keynode_t *node, void *user_data)
+{
+ A11yBusLauncher *bl = user_data;
+ int ret;
+
+ ret = vconf_keynode_get_bool(node);
+ if (ret < 0)
+ return;
+
+ bl->screen_reader_needed = ret;
+
+ if (!bl->screen_reader_needed && (bl->pid > 0))
+ _terminate_screen_reader(bl);
+ else if (bl->screen_reader_needed && (bl->pid <= 0))
+ _launch_screen_reader(bl);
+}
+
int
main (int argc,
char **argv)
gboolean screen_reader_set = FALSE;
gint i;
- g_type_init ();
-
if (already_running ())
return 0;
if (_global_app->a11y_schema)
g_signal_connect (_global_app->a11y_schema,
- "screen-reader-enabled",
+ "changed::screen-reader-enabled",
G_CALLBACK (gsettings_key_changed), _global_app);
init_sigterm_handling (_global_app);
_global_app,
NULL);
+ int ret = vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &_global_app->screen_reader_needed);
+ if (ret != 0)
+ {
+ LOGD("Could not read VCONFKEY_SETAPPL_ACCESSIBILITY_TTS key value.\n");
+ return FALSE;
+ }
+ ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, screen_reader_cb, _global_app);
+ if(ret != 0)
+ {
+ LOGD("Could not add information level callback\n");
+ return FALSE;
+ }
+ if (_global_app->screen_reader_needed)
+ _launch_screen_reader(_global_app);
+
g_main_loop_run (_global_app->loop);
if (_global_app->a11y_bus_pid > 0)
* GDM is launching a login on an X server it was using before,
* we don't want early login processes to pick up the stale address.
*/
+#ifdef HAVE_X11
{
Display *display = XOpenDisplay (NULL);
if (display)
XCloseDisplay (display);
}
}
+#endif
if (_global_app->a11y_launch_error_message)
{