From 1c3d20ad6f92f3b9d5141aa004454ce911ec6012 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Fri, 25 Feb 2011 11:10:36 +0900 Subject: [PATCH] Add command-line option to specify D-Bus type and address. --- src/client-main.c | 66 +++++++++++++++++++++++++++++++-------- src/desktop-client-main.c | 57 ++++++++++++++++++++++++++++----- src/server-main.c | 56 +++++++++++++++++++++++++++++---- 3 files changed, 152 insertions(+), 27 deletions(-) diff --git a/src/client-main.c b/src/client-main.c index 53646d5c..bdf39bb5 100644 --- a/src/client-main.c +++ b/src/client-main.c @@ -19,10 +19,15 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ +#include #include #include "eekboard/eekboard.h" +static gboolean opt_system = FALSE; +static gboolean opt_session = FALSE; +static gchar *opt_address = NULL; + static gchar *opt_set_keyboard = NULL; static gint opt_set_group = -1; static gboolean opt_show_keyboard = FALSE; @@ -32,6 +37,12 @@ static gint opt_release_key = -1; static gboolean opt_listen = FALSE; static const GOptionEntry options[] = { + {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, + N_("Connect to the system bus")}, + {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session, + N_("Connect to the session bus")}, + {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, + N_("Connect to the given D-Bus address")}, {"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard, N_("Upload keyboard description from an XML file")}, {"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group, @@ -66,6 +77,7 @@ main (int argc, char **argv) { EekboardEekboard *eekboard = NULL; EekboardContext *context = NULL; + GBusType bus_type; GDBusConnection *connection = NULL; GError *error; GOptionContext *option_context; @@ -80,26 +92,54 @@ main (int argc, char **argv) g_option_context_parse (option_context, &argc, &argv, NULL); g_option_context_free (option_context); - error = NULL; - connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - if (error) { - g_printerr ("%s\n", error->message); - retval = 1; - goto out; + if (opt_system) + bus_type = G_BUS_TYPE_SYSTEM; + else if (opt_address) + bus_type = G_BUS_TYPE_NONE; + else + bus_type = G_BUS_TYPE_SESSION; + + switch (bus_type) { + case G_BUS_TYPE_SYSTEM: + case G_BUS_TYPE_SESSION: + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (connection == NULL) { + g_printerr (_("Can't connect to the bus: %s\n"), error->message); + exit (1); + } + break; + case G_BUS_TYPE_NONE: + error = NULL; + connection = g_dbus_connection_new_for_address_sync (opt_address, + 0, + NULL, + NULL, + &error); + if (connection == NULL) { + g_printerr (_("Can't connect to the bus at %s: %s\n"), + opt_address, + error->message); + exit (1); + } + break; + default: + g_assert_not_reached (); + break; } eekboard = eekboard_eekboard_new (connection, NULL); - if (!eekboard) { - g_printerr ("Can't create eekboard\n"); + if (eekboard == NULL) { + g_printerr (_("Can't create eekboard proxy\n")); retval = 1; goto out; } context = eekboard_eekboard_create_context (eekboard, - "eekboard-client", - NULL); - if (!context) { - g_printerr ("Can't create context\n"); + "eekboard-client", + NULL); + if (context == NULL) { + g_printerr (_("Can't create context\n")); retval = 1; goto out; } @@ -117,7 +157,7 @@ main (int argc, char **argv) error = NULL; input = g_file_read (file, NULL, &error); if (error) { - g_printerr ("Can't read file %s: %s\n", + g_printerr (_("Can't read file %s: %s\n"), opt_set_keyboard, error->message); retval = 1; goto out; diff --git a/src/desktop-client-main.c b/src/desktop-client-main.c index 6e3cb54a..934732c7 100644 --- a/src/desktop-client-main.c +++ b/src/desktop-client-main.c @@ -27,12 +27,22 @@ #include "eekboard/eekboard.h" #include "desktop-client.h" +static gboolean opt_system = FALSE; +static gboolean opt_session = FALSE; +static gchar *opt_address = NULL; + #ifdef HAVE_CSPI gboolean opt_focus = FALSE; gboolean opt_keystroke = FALSE; #endif /* HAVE_CSPI */ static const GOptionEntry options[] = { + {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, + N_("Connect to the system bus")}, + {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session, + N_("Connect to the session bus")}, + {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, + N_("Connect to the given D-Bus address")}, #ifdef HAVE_CSPI {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus, N_("Listen focus change events with AT-SPI")}, @@ -62,6 +72,7 @@ main (int argc, char **argv) { EekboardDesktopClient *client; EekboardContext *context; + GBusType bus_type; GDBusConnection *connection; GError *error; GConfClient *gconfc; @@ -78,12 +89,42 @@ main (int argc, char **argv) g_option_context_parse (option_context, &argc, &argv, NULL); g_option_context_free (option_context); - error = NULL; - connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - if (error) { - g_printerr ("%s\n", error->message); - exit (1); + if (opt_system) + bus_type = G_BUS_TYPE_SYSTEM; + else if (opt_address) + bus_type = G_BUS_TYPE_NONE; + else + bus_type = G_BUS_TYPE_SESSION; + + switch (bus_type) { + case G_BUS_TYPE_SYSTEM: + case G_BUS_TYPE_SESSION: + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (connection == NULL) { + g_printerr ("Can't connect to the bus: %s\n", error->message); + exit (1); + } + break; + case G_BUS_TYPE_NONE: + error = NULL; + connection = g_dbus_connection_new_for_address_sync (opt_address, + 0, + NULL, + NULL, + &error); + if (connection == NULL) { + g_printerr ("Can't connect to the bus at %s: %s\n", + opt_address, + error->message); + exit (1); + } + break; + default: + g_assert_not_reached (); + break; } + client = eekboard_desktop_client_new (connection); gconfc = gconf_client_get_default (); @@ -114,20 +155,20 @@ main (int argc, char **argv) exit (1); } } else { - g_printerr ("Desktop accessibility support is disabled"); + g_printerr ("Desktop accessibility support is disabled\n"); exit (1); } } #endif /* HAVE_CSPI */ if (!eekboard_desktop_client_enable_xkl (client)) { - g_printerr ("Can't register xklavier event listeners\n"); + g_printerr ("Can't register xklavier event listeners\n"); exit (1); } #ifdef HAVE_FAKEKEY if (!eekboard_desktop_client_enable_fakekey (client)) { - g_printerr ("Can't init fakekey\n"); + g_printerr ("Can't init fakekey\n"); exit (1); } #endif /* HAVE_FAKEKEY */ diff --git a/src/server-main.c b/src/server-main.c index 662daa87..ffb45ea3 100644 --- a/src/server-main.c +++ b/src/server-main.c @@ -31,6 +31,20 @@ #include "server-server.h" #include "eek/eek.h" +static gboolean opt_system = FALSE; +static gboolean opt_session = FALSE; +static gchar *opt_address = NULL; + +static const GOptionEntry options[] = { + {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, + N_("Connect to the system bus")}, + {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session, + N_("Connect to the session bus")}, + {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, + N_("Connect to the given D-Bus address")}, + {NULL} +}; + static void on_name_acquired (GDBusConnection *connection, const gchar *name, @@ -50,6 +64,7 @@ int main (int argc, char **argv) { ServerServer *server; + GBusType bus_type; GDBusConnection *connection; GError *error; GMainLoop *loop; @@ -75,17 +90,46 @@ main (int argc, char **argv) g_type_class_ref (EEK_TYPE_SYMBOL); g_type_class_ref (EEK_TYPE_KEYSYM); - error = NULL; - connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - if (error) { - g_printerr ("%s\n", error->message); - exit (1); + if (opt_system) + bus_type = G_BUS_TYPE_SYSTEM; + else if (opt_address) + bus_type = G_BUS_TYPE_NONE; + else + bus_type = G_BUS_TYPE_SESSION; + + switch (bus_type) { + case G_BUS_TYPE_SYSTEM: + case G_BUS_TYPE_SESSION: + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (connection == NULL) { + g_printerr ("Can't connect to the bus: %s\n", error->message); + exit (1); + } + break; + case G_BUS_TYPE_NONE: + error = NULL; + connection = g_dbus_connection_new_for_address_sync (opt_address, + 0, + NULL, + NULL, + &error); + if (connection == NULL) { + g_printerr ("Can't connect to the bus at %s: %s\n", + opt_address, + error->message); + exit (1); + } + break; + default: + g_assert_not_reached (); + break; } server = server_server_new (SERVER_SERVER_PATH, connection); if (server == NULL) { - g_printerr ("Can't create server server\n"); + g_printerr ("Can't create server\n"); exit (1); }