1 /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
2 /* vim:set et sts=4: */
3 /* ibus - The Input Bus
4 * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
5 * Copyright (C) 2008-2010 Red Hat, Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
24 #include <sys/types.h>
27 #include <glib/gstdio.h>
29 #include "ibusmarshalers.h"
30 #include "ibusinternal.h"
31 #include "ibusshare.h"
32 #include "ibusenginedesc.h"
33 #include "ibusserializable.h"
34 #include "ibusconfig.h"
36 #define IBUS_BUS_GET_PRIVATE(o) \
37 (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_BUS, IBusBusPrivate))
42 GLOBAL_ENGINE_CHANGED,
53 struct _IBusBusPrivate {
54 GFileMonitor *monitor;
55 GDBusConnection *connection;
56 gboolean watch_dbus_signal;
57 guint watch_dbus_signal_id;
58 gboolean watch_ibus_signal;
59 guint watch_ibus_signal_id;
62 gboolean connect_async;
64 GCancellable *cancellable;
67 static guint bus_signals[LAST_SIGNAL] = { 0 };
69 static IBusBus *_bus = NULL;
71 /* functions prototype */
72 static GObject *ibus_bus_constructor (GType type,
74 GObjectConstructParam *params);
75 static void ibus_bus_destroy (IBusObject *object);
76 static void ibus_bus_watch_dbus_signal (IBusBus *bus);
77 static void ibus_bus_unwatch_dbus_signal (IBusBus *bus);
78 static void ibus_bus_watch_ibus_signal (IBusBus *bus);
79 static void ibus_bus_unwatch_ibus_signal (IBusBus *bus);
80 static GVariant *ibus_bus_call_sync (IBusBus *bus,
83 const gchar *interface,
86 const GVariantType *reply_type);
87 static void ibus_bus_call_async (IBusBus *bus,
90 const gchar *interface,
93 const GVariantType *reply_type,
96 GCancellable *cancellable,
97 GAsyncReadyCallback callback,
99 static void ibus_bus_set_property (IBusBus *bus,
103 static void ibus_bus_get_property (IBusBus *bus,
108 static void ibus_bus_close_connection (IBusBus *bus);
110 G_DEFINE_TYPE (IBusBus, ibus_bus, IBUS_TYPE_OBJECT)
113 ibus_bus_class_init (IBusBusClass *class)
115 GObjectClass *gobject_class = G_OBJECT_CLASS (class);
116 IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (class);
118 gobject_class->constructor = ibus_bus_constructor;
119 gobject_class->set_property = (GObjectSetPropertyFunc) ibus_bus_set_property;
120 gobject_class->get_property = (GObjectGetPropertyFunc) ibus_bus_get_property;
121 ibus_object_class->destroy = ibus_bus_destroy;
123 /* install properties */
125 * IBusBus:connect-async:
127 * Whether the #IBusBus object should connect asynchronously to the bus.
130 g_object_class_install_property (gobject_class,
132 g_param_spec_boolean ("connect-async",
134 "Connect asynchronously to the bus",
136 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
138 /* install signals */
140 * IBusBus::connected:
141 * @bus: The #IBusBus object which recevied the signal
143 * Emitted when #IBusBus is connected to ibus-daemon.
146 bus_signals[CONNECTED] =
147 g_signal_new (I_("connected"),
148 G_TYPE_FROM_CLASS (class),
152 _ibus_marshal_VOID__VOID,
157 * IBusBus::disconnected:
158 * @bus: The #IBusBus object which recevied the signal
160 * Emitted when #IBusBus is disconnected from ibus-daemon.
163 bus_signals[DISCONNECTED] =
164 g_signal_new (I_("disconnected"),
165 G_TYPE_FROM_CLASS (class),
169 _ibus_marshal_VOID__VOID,
174 * IBusBus::global-engine-changed:
175 * @bus: The #IBusBus object which recevied the signal
176 * @name: The name of the new global engine.
178 * Emitted when global engine is changed.
181 bus_signals[GLOBAL_ENGINE_CHANGED] =
182 g_signal_new (I_("global-engine-changed"),
183 G_TYPE_FROM_CLASS (class),
187 _ibus_marshal_VOID__STRING,
193 * IBusBus::name-owner-changed:
194 * @bus: The #IBusBus object which recevied the signal
195 * @name: The name which ower is changed.
196 * @old_owner: The unique bus name of the old owner.
197 * @new_owner: The unique bus name of the new owner.
199 * Emitted when D-Bus name owner is changed.
202 bus_signals[NAME_OWNER_CHANGED] =
203 g_signal_new (I_("name-owner-changed"),
204 G_TYPE_FROM_CLASS (class),
208 _ibus_marshal_VOID__STRING_STRING_STRING,
211 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
213 g_type_class_add_private (class, sizeof (IBusBusPrivate));
217 _connection_dbus_signal_cb (GDBusConnection *connection,
218 const gchar *sender_name,
219 const gchar *object_path,
220 const gchar *interface_name,
221 const gchar *signal_name,
222 GVariant *parameters,
225 g_return_if_fail (user_data != NULL);
226 g_return_if_fail (IBUS_IS_BUS (user_data));
228 if (g_strcmp0 (signal_name, "NameOwnerChanged") == 0) {
230 gchar *old_owner = NULL;
231 gchar *new_owner = NULL;
232 g_variant_get (parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
233 g_signal_emit (IBUS_BUS (user_data),
234 bus_signals[NAME_OWNER_CHANGED], 0,
235 name, old_owner, new_owner);
237 /* FIXME handle other D-Bus signals if needed */
241 _connection_ibus_signal_cb (GDBusConnection *connection,
242 const gchar *sender_name,
243 const gchar *object_path,
244 const gchar *interface_name,
245 const gchar *signal_name,
246 GVariant *parameters,
249 g_return_if_fail (user_data != NULL);
250 g_return_if_fail (IBUS_IS_BUS (user_data));
252 if (g_strcmp0 (signal_name, "GlobalEngineChanged") == 0) {
253 gchar *engine_name = NULL;
254 g_variant_get (parameters, "(&s)", &engine_name);
255 g_signal_emit (IBUS_BUS (user_data),
256 bus_signals[GLOBAL_ENGINE_CHANGED], 0,
259 /* FIXME handle org.freedesktop.IBus.RegistryChanged signal if needed */
263 _connection_closed_cb (GDBusConnection *connection,
264 gboolean remote_peer_vanished,
269 /* We replaced g_warning with g_debug here because
270 * currently when ibus-daemon restarts, GTK client calls this and
271 * _g_dbus_worker_do_read_cb() sets the error message:
272 * "Underlying GIOStream returned 0 bytes on an async read"
273 * http://git.gnome.org/browse/glib/tree/gio/gdbusprivate.c#n693
274 * However we think the error message is almost harmless. */
275 g_debug ("_connection_closed_cb: %s", error->message);
277 ibus_bus_close_connection (bus);
281 ibus_bus_close_connection (IBusBus *bus)
283 g_free (bus->priv->unique_name);
284 bus->priv->unique_name = NULL;
286 bus->priv->watch_dbus_signal_id = 0;
287 bus->priv->watch_ibus_signal_id = 0;
289 g_free (bus->priv->bus_address);
290 bus->priv->bus_address = NULL;
292 /* Cancel ongoing connect request. */
293 g_cancellable_cancel (bus->priv->cancellable);
294 g_cancellable_reset (bus->priv->cancellable);
296 /* unref the old connection at first */
297 if (bus->priv->connection != NULL) {
298 g_signal_handlers_disconnect_by_func (bus->priv->connection,
299 G_CALLBACK (_connection_closed_cb),
301 if (!g_dbus_connection_is_closed(bus->priv->connection))
302 g_dbus_connection_close(bus->priv->connection, NULL, NULL, NULL);
303 g_object_unref (bus->priv->connection);
304 bus->priv->connection = NULL;
305 g_signal_emit (bus, bus_signals[DISCONNECTED], 0);
310 ibus_bus_connect_completed (IBusBus *bus)
312 g_assert (bus->priv->connection);
314 ibus_bus_hello (bus);
316 g_signal_connect (bus->priv->connection,
318 (GCallback) _connection_closed_cb,
320 if (bus->priv->watch_dbus_signal) {
321 ibus_bus_watch_dbus_signal (bus);
323 if (bus->priv->watch_ibus_signal) {
324 ibus_bus_watch_ibus_signal (bus);
327 g_signal_emit (bus, bus_signals[CONNECTED], 0);
331 _bus_connect_async_cb (GObject *source_object,
335 g_return_if_fail (user_data != NULL);
336 g_return_if_fail (IBUS_IS_BUS (user_data));
338 IBusBus *bus = IBUS_BUS (user_data);
339 GError *error = NULL;
341 bus->priv->connection =
342 g_dbus_connection_new_for_address_finish (res, &error);
345 g_warning ("Unable to connect to ibus: %s", error->message);
346 g_error_free (error);
350 if (bus->priv->connection != NULL) {
351 ibus_bus_connect_completed (bus);
354 g_free (bus->priv->bus_address);
355 bus->priv->bus_address = NULL;
358 /* unref the ref from ibus_bus_connect */
359 g_object_unref (bus);
363 ibus_bus_connect_async (IBusBus *bus)
365 const gchar *bus_address = ibus_get_address ();
367 if (bus_address == NULL)
370 if (g_strcmp0 (bus->priv->bus_address, bus_address) == 0)
373 /* Close current connection and cancel ongoing connect request. */
374 ibus_bus_close_connection (bus);
376 bus->priv->bus_address = g_strdup (bus_address);
378 g_dbus_connection_new_for_address (
380 G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
381 G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
383 bus->priv->cancellable,
384 _bus_connect_async_cb, bus);
388 ibus_bus_connect (IBusBus *bus)
390 const gchar *bus_address = ibus_get_address ();
392 if (bus_address == NULL)
395 if (g_strcmp0 (bus_address, bus->priv->bus_address) == 0 &&
396 bus->priv->connection != NULL)
399 /* Close current connection and cancel ongoing connect request. */
400 ibus_bus_close_connection (bus);
402 bus->priv->connection = g_dbus_connection_new_for_address_sync (
404 G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
405 G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
407 if (bus->priv->connection) {
408 bus->priv->bus_address = g_strdup (bus_address);
409 ibus_bus_connect_completed (bus);
414 _changed_cb (GFileMonitor *monitor,
417 GFileMonitorEvent event_type,
420 if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
421 event_type != G_FILE_MONITOR_EVENT_CREATED &&
422 event_type != G_FILE_MONITOR_EVENT_DELETED)
425 ibus_bus_connect_async (bus);
429 ibus_bus_init (IBusBus *bus)
435 bus->priv = IBUS_BUS_GET_PRIVATE (bus);
437 bus->priv->config = NULL;
438 bus->priv->connection = NULL;
439 bus->priv->watch_dbus_signal = FALSE;
440 bus->priv->watch_dbus_signal_id = 0;
441 bus->priv->watch_ibus_signal = FALSE;
442 bus->priv->watch_ibus_signal_id = 0;
443 bus->priv->unique_name = NULL;
444 bus->priv->connect_async = FALSE;
445 bus->priv->bus_address = NULL;
446 bus->priv->cancellable = g_cancellable_new ();
448 path = g_path_get_dirname (ibus_get_socket_path ());
450 g_mkdir_with_parents (path, 0700);
451 g_chmod (path, 0700);
453 if (stat (path, &buf) == 0) {
454 if (buf.st_uid != getuid ()) {
455 g_warning ("The owner of %s is not %s!", path, ibus_get_user_name ());
460 file = g_file_new_for_path (ibus_get_socket_path ());
461 bus->priv->monitor = g_file_monitor_file (file, 0, NULL, NULL);
463 g_signal_connect (bus->priv->monitor, "changed", (GCallback) _changed_cb, bus);
465 g_object_unref (file);
470 ibus_bus_set_property (IBusBus *bus,
476 case PROP_CONNECT_ASYNC:
477 bus->priv->connect_async = g_value_get_boolean (value);
480 G_OBJECT_WARN_INVALID_PROPERTY_ID (bus, prop_id, pspec);
485 ibus_bus_get_property (IBusBus *bus,
491 case PROP_CONNECT_ASYNC:
492 g_value_set_boolean (value, bus->priv->connect_async);
495 G_OBJECT_WARN_INVALID_PROPERTY_ID (bus, prop_id, pspec);
500 ibus_bus_constructor (GType type,
502 GObjectConstructParam *params)
506 /* share one IBusBus instance in whole application */
508 object = G_OBJECT_CLASS (ibus_bus_parent_class)->constructor (type, n_params, params);
509 /* make bus object sink */
510 g_object_ref_sink (object);
511 _bus = IBUS_BUS (object);
513 if (_bus->priv->connect_async)
514 ibus_bus_connect_async (_bus);
516 ibus_bus_connect (_bus);
519 object = g_object_ref (_bus);
526 ibus_bus_destroy (IBusObject *object)
528 g_assert (_bus == (IBusBus *)object);
530 IBusBus * bus = _bus;
533 if (bus->priv->monitor) {
534 g_object_unref (bus->priv->monitor);
535 bus->priv->monitor = NULL;
538 if (bus->priv->config) {
539 ibus_proxy_destroy ((IBusProxy *) bus->priv->config);
540 bus->priv->config = NULL;
543 if (bus->priv->connection) {
544 g_signal_handlers_disconnect_by_func (bus->priv->connection,
545 G_CALLBACK (_connection_closed_cb),
547 /* FIXME should use async close function */
548 g_dbus_connection_close_sync (bus->priv->connection, NULL, NULL);
549 g_object_unref (bus->priv->connection);
550 bus->priv->connection = NULL;
553 g_free (bus->priv->unique_name);
554 bus->priv->unique_name = NULL;
556 g_free (bus->priv->bus_address);
557 bus->priv->bus_address = NULL;
559 g_cancellable_cancel (bus->priv->cancellable);
560 g_object_unref (bus->priv->cancellable);
561 bus->priv->cancellable = NULL;
563 IBUS_OBJECT_CLASS (ibus_bus_parent_class)->destroy (object);
567 _async_finish_void (GAsyncResult *res,
570 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
571 if (g_simple_async_result_propagate_error (simple, error))
577 _async_finish_object_path (GAsyncResult *res,
580 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
581 if (g_simple_async_result_propagate_error (simple, error))
583 GVariant *variant = g_simple_async_result_get_op_res_gpointer (simple);
584 g_return_val_if_fail (variant != NULL, NULL);
586 g_variant_get (variant, "(&o)", &path);
591 _async_finish_string (GAsyncResult *res,
594 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
595 if (g_simple_async_result_propagate_error (simple, error))
597 GVariant *variant = g_simple_async_result_get_op_res_gpointer (simple);
598 g_return_val_if_fail (variant != NULL, NULL);
600 g_variant_get (variant, "(&s)", &s);
605 _async_finish_gboolean (GAsyncResult *res,
608 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
609 if (g_simple_async_result_propagate_error (simple, error))
611 GVariant *variant = g_simple_async_result_get_op_res_gpointer (simple);
612 g_return_val_if_fail (variant != NULL, FALSE);
613 gboolean retval = FALSE;
614 g_variant_get (variant, "(b)", &retval);
619 _async_finish_guint (GAsyncResult *res,
622 static const guint bad_id = 0;
623 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
624 if (g_simple_async_result_propagate_error (simple, error))
626 GVariant *variant = g_simple_async_result_get_op_res_gpointer (simple);
627 g_return_val_if_fail (variant != NULL, bad_id);
630 g_variant_get (variant, "(u)", &id);
637 IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS,
638 "connect-async", FALSE,
645 ibus_bus_new_async (void)
647 IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS,
648 "connect-async", TRUE,
655 ibus_bus_is_connected (IBusBus *bus)
657 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
659 if (bus->priv->connection == NULL || g_dbus_connection_is_closed (bus->priv->connection))
666 ibus_bus_create_input_context (IBusBus *bus,
667 const gchar *client_name)
669 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
670 g_return_val_if_fail (client_name != NULL, NULL);
673 IBusInputContext *context = NULL;
675 result = ibus_bus_call_sync (bus,
679 "CreateInputContext",
680 g_variant_new ("(s)", client_name),
681 G_VARIANT_TYPE ("(o)"));
683 if (result != NULL) {
684 GError *error = NULL;
685 g_variant_get (result, "(&o)", &path);
686 context = ibus_input_context_new (path, bus->priv->connection, NULL, &error);
687 g_variant_unref (result);
688 if (context == NULL) {
689 g_warning ("ibus_bus_create_input_context: %s", error->message);
690 g_error_free (error);
698 _create_input_context_async_step_two_done (GObject *source_object,
700 GSimpleAsyncResult *simple)
702 GError *error = NULL;
703 IBusInputContext *context =
704 ibus_input_context_new_async_finish (res, &error);
705 if (context == NULL) {
706 g_simple_async_result_set_from_error (simple, error);
707 g_error_free (error);
710 g_simple_async_result_set_op_res_gpointer (simple, context, NULL);
712 g_simple_async_result_complete_in_idle (simple);
713 g_object_unref (simple);
717 _create_input_context_async_step_one_done (GDBusConnection *connection,
719 GSimpleAsyncResult *simple)
721 GError *error = NULL;
722 GVariant *variant = g_dbus_connection_call_finish (connection, res, &error);
724 if (variant == NULL) {
725 g_simple_async_result_set_from_error (simple, error);
726 g_error_free (error);
727 g_simple_async_result_complete_in_idle (simple);
728 g_object_unref (simple);
732 if (g_dbus_connection_is_closed (connection)) {
734 * The connection is closed, can not contine next steps, so complete
735 * the asynchronous request with error.
737 g_simple_async_result_set_error (simple,
738 G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Connection is closed.");
739 g_simple_async_result_complete_in_idle (simple);
743 const gchar *path = NULL;
744 g_variant_get (variant, "(&o)", &path);
747 IBusBus *bus = (IBusBus *)g_async_result_get_source_object (
748 (GAsyncResult *)simple);
749 g_assert (IBUS_IS_BUS (bus));
751 GCancellable *cancellable =
752 (GCancellable *)g_object_get_data ((GObject *)simple,
755 ibus_input_context_new_async (path,
756 bus->priv->connection,
758 (GAsyncReadyCallback)_create_input_context_async_step_two_done,
760 /* release the reference from g_async_result_get_source_object() */
761 g_object_unref (bus);
765 ibus_bus_create_input_context_async (IBusBus *bus,
766 const gchar *client_name,
768 GCancellable *cancellable,
769 GAsyncReadyCallback callback,
772 g_return_if_fail (IBUS_IS_BUS (bus));
773 g_return_if_fail (client_name != NULL);
774 g_return_if_fail (callback != NULL);
776 GSimpleAsyncResult *simple = g_simple_async_result_new ((GObject *)bus,
777 callback, user_data, ibus_bus_create_input_context_async);
779 if (cancellable != NULL) {
780 g_object_set_data_full ((GObject *)simple,
782 g_object_ref (cancellable),
783 (GDestroyNotify)g_object_unref);
786 /* do not use ibus_bus_call_async, instread use g_dbus_connection_call
787 * directly, because we need two async steps for create an IBusInputContext.
788 * 1. Call CreateInputContext to request ibus-daemon create a remote IC.
789 * 2. New local IBusInputContext proxy of the remote IC
791 g_dbus_connection_call (bus->priv->connection,
795 "CreateInputContext",
796 g_variant_new ("(s)", client_name),
797 G_VARIANT_TYPE("(o)"),
798 G_DBUS_CALL_FLAGS_NO_AUTO_START,
801 (GAsyncReadyCallback)_create_input_context_async_step_one_done,
806 ibus_bus_create_input_context_async_finish (IBusBus *bus,
810 g_assert (IBUS_IS_BUS (bus));
811 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
812 ibus_bus_create_input_context_async));
814 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
815 if (g_simple_async_result_propagate_error (simple, error))
817 IBusInputContext *context =
818 g_simple_async_result_get_op_res_gpointer (simple);
819 g_assert (IBUS_IS_INPUT_CONTEXT (context));
824 ibus_bus_current_input_context (IBusBus *bus)
826 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
830 result = ibus_bus_call_sync (bus,
834 "CurrentInputContext",
836 G_VARIANT_TYPE ("(o)"));
838 if (result != NULL) {
839 g_variant_get (result, "(o)", &path);
840 g_variant_unref (result);
847 ibus_bus_current_input_context_async (IBusBus *bus,
849 GCancellable *cancellable,
850 GAsyncReadyCallback callback,
853 g_return_if_fail (IBUS_IS_BUS (bus));
855 ibus_bus_call_async (bus,
859 "CurrentInputContext",
861 G_VARIANT_TYPE ("(o)"),
862 ibus_bus_current_input_context_async,
870 ibus_bus_current_input_context_async_finish (IBusBus *bus,
874 g_assert (IBUS_IS_BUS (bus));
875 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
876 ibus_bus_current_input_context_async));
877 return g_strdup (_async_finish_object_path (res, error));
881 ibus_bus_watch_dbus_signal (IBusBus *bus)
883 g_return_if_fail (bus->priv->connection != NULL);
884 g_return_if_fail (bus->priv->watch_dbus_signal_id == 0);
886 /* Subscribe to dbus signals such as NameOwnerChanged. */
887 bus->priv->watch_dbus_signal_id
888 = g_dbus_connection_signal_subscribe (bus->priv->connection,
894 (GDBusSignalFlags) 0,
895 _connection_dbus_signal_cb,
897 NULL /* user_data_free_func */);
898 /* FIXME handle other D-Bus signals if needed */
902 ibus_bus_unwatch_dbus_signal (IBusBus *bus)
904 g_return_if_fail (bus->priv->watch_dbus_signal_id != 0);
905 g_dbus_connection_signal_unsubscribe (bus->priv->connection,
906 bus->priv->watch_dbus_signal_id);
907 bus->priv->watch_dbus_signal_id = 0;
911 ibus_bus_set_watch_dbus_signal (IBusBus *bus,
914 g_return_if_fail (IBUS_IS_BUS (bus));
916 if (bus->priv->watch_dbus_signal == watch)
919 bus->priv->watch_dbus_signal = watch;
921 if (ibus_bus_is_connected (bus)) {
923 ibus_bus_watch_dbus_signal (bus);
926 ibus_bus_unwatch_dbus_signal (bus);
932 ibus_bus_watch_ibus_signal (IBusBus *bus)
934 g_return_if_fail (bus->priv->connection != NULL);
935 g_return_if_fail (bus->priv->watch_ibus_signal_id == 0);
937 /* Subscribe to ibus signals such as GlboalEngineChanged. */
938 bus->priv->watch_ibus_signal_id
939 = g_dbus_connection_signal_subscribe (bus->priv->connection,
940 "org.freedesktop.IBus",
942 "GlobalEngineChanged",
945 (GDBusSignalFlags) 0,
946 _connection_ibus_signal_cb,
948 NULL /* user_data_free_func */);
949 /* FIXME handle org.freedesktop.IBus.RegistryChanged signal if needed */
953 ibus_bus_unwatch_ibus_signal (IBusBus *bus)
955 g_return_if_fail (bus->priv->watch_ibus_signal_id != 0);
956 g_dbus_connection_signal_unsubscribe (bus->priv->connection,
957 bus->priv->watch_ibus_signal_id);
958 bus->priv->watch_ibus_signal_id = 0;
962 ibus_bus_set_watch_ibus_signal (IBusBus *bus,
965 g_return_if_fail (IBUS_IS_BUS (bus));
967 if (bus->priv->watch_ibus_signal == watch)
970 bus->priv->watch_ibus_signal = watch;
972 if (ibus_bus_is_connected (bus)) {
974 ibus_bus_watch_ibus_signal (bus);
977 ibus_bus_unwatch_ibus_signal (bus);
983 ibus_bus_hello (IBusBus *bus)
985 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
986 g_return_val_if_fail (ibus_bus_is_connected (bus), NULL);
988 /* gdbus connection will say hello by self. */
989 if (bus->priv->connection)
990 return g_dbus_connection_get_unique_name (bus->priv->connection);
995 ibus_bus_request_name (IBusBus *bus,
999 g_return_val_if_fail (IBUS_IS_BUS (bus), 0);
1000 g_return_val_if_fail (name != NULL, 0);
1004 result = ibus_bus_call_sync (bus,
1007 DBUS_INTERFACE_DBUS,
1009 g_variant_new ("(su)", name, flags),
1010 G_VARIANT_TYPE ("(u)"));
1013 g_variant_get (result, "(u)", &retval);
1014 g_variant_unref (result);
1021 ibus_bus_request_name_async (IBusBus *bus,
1025 GCancellable *cancellable,
1026 GAsyncReadyCallback callback,
1029 g_return_if_fail (IBUS_IS_BUS (bus));
1030 g_return_if_fail (name != NULL);
1032 ibus_bus_call_async (bus,
1035 DBUS_INTERFACE_DBUS,
1037 g_variant_new ("(su)", name, flags),
1038 G_VARIANT_TYPE ("(u)"),
1039 ibus_bus_request_name_async,
1047 ibus_bus_request_name_async_finish (IBusBus *bus,
1051 g_assert (IBUS_IS_BUS (bus));
1052 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1053 ibus_bus_request_name_async));
1054 return _async_finish_guint (res, error);
1058 ibus_bus_release_name (IBusBus *bus,
1061 g_return_val_if_fail (IBUS_IS_BUS (bus), 0);
1062 g_return_val_if_fail (name != NULL, 0);
1066 result = ibus_bus_call_sync (bus,
1069 DBUS_INTERFACE_DBUS,
1071 g_variant_new ("(s)", name),
1072 G_VARIANT_TYPE ("(u)"));
1075 g_variant_get (result, "(u)", &retval);
1076 g_variant_unref (result);
1083 ibus_bus_release_name_async (IBusBus *bus,
1086 GCancellable *cancellable,
1087 GAsyncReadyCallback callback,
1090 g_return_if_fail (IBUS_IS_BUS (bus));
1091 g_return_if_fail (name != NULL);
1093 ibus_bus_call_async (bus,
1096 DBUS_INTERFACE_DBUS,
1098 g_variant_new ("(s)", name),
1099 G_VARIANT_TYPE ("(u)"),
1100 ibus_bus_release_name_async,
1108 ibus_bus_release_name_async_finish (IBusBus *bus,
1112 g_assert (IBUS_IS_BUS (bus));
1113 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1114 ibus_bus_release_name_async));
1115 return _async_finish_guint (res, error);
1119 ibus_bus_list_queued_owners (IBusBus *bus,
1122 GList *retval = NULL;
1125 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1126 g_return_val_if_fail (name != NULL, NULL);
1128 result = ibus_bus_call_sync (bus,
1131 DBUS_INTERFACE_DBUS,
1133 g_variant_new ("(s)", name),
1134 G_VARIANT_TYPE ("(as)"));
1137 GVariantIter *iter = NULL;
1138 const gchar *name = NULL;
1139 g_variant_get (result, "(as)", &iter);
1140 while (g_variant_iter_loop (iter, "&s", &name)) {
1144 retval = g_list_append (retval, g_strdup (name));
1146 g_variant_iter_free (iter);
1147 g_variant_unref (result);
1154 ibus_bus_name_has_owner (IBusBus *bus,
1157 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1158 g_return_val_if_fail (name != NULL, FALSE);
1160 gboolean retval = FALSE;
1162 result = ibus_bus_call_sync (bus,
1165 DBUS_INTERFACE_DBUS,
1167 g_variant_new ("(s)", name),
1168 G_VARIANT_TYPE ("(b)"));
1171 g_variant_get (result, "(b)", &retval);
1172 g_variant_unref (result);
1179 ibus_bus_name_has_owner_async (IBusBus *bus,
1182 GCancellable *cancellable,
1183 GAsyncReadyCallback callback,
1186 g_return_if_fail (IBUS_IS_BUS (bus));
1187 g_return_if_fail (name != NULL);
1189 ibus_bus_call_async (bus,
1192 DBUS_INTERFACE_DBUS,
1194 g_variant_new ("(s)", name),
1195 G_VARIANT_TYPE ("(b)"),
1196 ibus_bus_name_has_owner_async,
1204 ibus_bus_name_has_owner_async_finish (IBusBus *bus,
1208 g_assert (IBUS_IS_BUS (bus));
1209 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1210 ibus_bus_name_has_owner_async));
1211 return _async_finish_gboolean (res, error);
1215 ibus_bus_list_names (IBusBus *bus)
1217 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1222 ibus_bus_add_match (IBusBus *bus,
1225 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1226 g_return_val_if_fail (rule != NULL, FALSE);
1229 result = ibus_bus_call_sync (bus,
1232 DBUS_INTERFACE_DBUS,
1234 g_variant_new ("(s)", rule),
1238 g_variant_unref (result);
1245 ibus_bus_add_match_async (IBusBus *bus,
1248 GCancellable *cancellable,
1249 GAsyncReadyCallback callback,
1252 g_return_if_fail (IBUS_IS_BUS (bus));
1253 g_return_if_fail (rule != NULL);
1255 ibus_bus_call_async (bus,
1258 DBUS_INTERFACE_DBUS,
1260 g_variant_new ("(s)", rule),
1262 ibus_bus_add_match_async,
1270 ibus_bus_add_match_async_finish (IBusBus *bus,
1274 g_assert (IBUS_IS_BUS (bus));
1275 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1276 ibus_bus_add_match_async));
1277 return _async_finish_void (res, error);
1281 ibus_bus_remove_match (IBusBus *bus,
1284 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1285 g_return_val_if_fail (rule != NULL, FALSE);
1288 result = ibus_bus_call_sync (bus,
1291 DBUS_INTERFACE_DBUS,
1293 g_variant_new ("(s)", rule),
1297 g_variant_unref (result);
1304 ibus_bus_remove_match_async (IBusBus *bus,
1307 GCancellable *cancellable,
1308 GAsyncReadyCallback callback,
1311 g_return_if_fail (IBUS_IS_BUS (bus));
1312 g_return_if_fail (rule != NULL);
1314 ibus_bus_call_async (bus,
1317 DBUS_INTERFACE_DBUS,
1319 g_variant_new ("(s)", rule),
1321 ibus_bus_remove_match_async,
1329 ibus_bus_remove_match_async_finish (IBusBus *bus,
1333 g_assert (IBUS_IS_BUS (bus));
1334 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1335 ibus_bus_remove_match_async));
1336 return _async_finish_void (res, error);
1340 ibus_bus_get_name_owner (IBusBus *bus,
1343 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1344 g_return_val_if_fail (name != NULL, NULL);
1346 gchar *retval = NULL;
1348 result = ibus_bus_call_sync (bus,
1351 DBUS_INTERFACE_DBUS,
1353 g_variant_new ("(s)", name),
1354 G_VARIANT_TYPE ("(s)"));
1357 g_variant_get (result, "(s)", &retval);
1358 g_variant_unref (result);
1365 ibus_bus_get_name_owner_async (IBusBus *bus,
1368 GCancellable *cancellable,
1369 GAsyncReadyCallback callback,
1372 g_return_if_fail (IBUS_IS_BUS (bus));
1373 g_return_if_fail (name != NULL);
1375 ibus_bus_call_async (bus,
1378 DBUS_INTERFACE_DBUS,
1380 g_variant_new ("(s)", name),
1381 G_VARIANT_TYPE ("(s)"),
1382 ibus_bus_get_name_owner_async,
1390 ibus_bus_get_name_owner_async_finish (IBusBus *bus,
1394 g_assert (IBUS_IS_BUS (bus));
1395 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1396 ibus_bus_get_name_owner_async));
1397 return g_strdup (_async_finish_string (res, error));
1401 ibus_bus_get_connection (IBusBus *bus)
1403 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1405 return bus->priv->connection;
1409 ibus_bus_exit (IBusBus *bus,
1412 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1415 result = ibus_bus_call_sync (bus,
1418 IBUS_INTERFACE_IBUS,
1420 g_variant_new ("(b)", restart),
1424 g_variant_unref (result);
1431 ibus_bus_exit_async (IBusBus *bus,
1434 GCancellable *cancellable,
1435 GAsyncReadyCallback callback,
1438 g_return_if_fail (IBUS_IS_BUS (bus));
1440 ibus_bus_call_async (bus,
1443 IBUS_INTERFACE_IBUS,
1445 g_variant_new ("(b)", restart),
1447 ibus_bus_exit_async,
1455 ibus_bus_exit_async_finish (IBusBus *bus,
1459 g_assert (IBUS_IS_BUS (bus));
1460 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1461 ibus_bus_exit_async));
1462 return _async_finish_void (res, error);
1466 ibus_bus_register_component (IBusBus *bus,
1467 IBusComponent *component)
1469 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1470 g_return_val_if_fail (IBUS_IS_COMPONENT (component), FALSE);
1472 GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)component);
1473 GVariant *result = ibus_bus_call_sync (bus,
1476 IBUS_INTERFACE_IBUS,
1477 "RegisterComponent",
1478 g_variant_new ("(v)", variant),
1481 g_variant_unref (result);
1488 ibus_bus_register_component_async (IBusBus *bus,
1489 IBusComponent *component,
1491 GCancellable *cancellable,
1492 GAsyncReadyCallback callback,
1495 g_return_if_fail (IBUS_IS_BUS (bus));
1496 g_return_if_fail (IBUS_IS_COMPONENT (component));
1498 GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)component);
1499 ibus_bus_call_async (bus,
1502 IBUS_INTERFACE_IBUS,
1503 "RegisterComponent",
1504 g_variant_new ("(v)", variant),
1506 ibus_bus_register_component_async,
1514 ibus_bus_register_component_async_finish (IBusBus *bus,
1518 g_assert (IBUS_IS_BUS (bus));
1519 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1520 ibus_bus_register_component_async));
1521 return _async_finish_void (res, error);
1525 ibus_bus_do_list_engines (IBusBus *bus, gboolean active_engines_only)
1527 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1529 GList *retval = NULL;
1531 result = ibus_bus_call_sync (bus,
1534 IBUS_INTERFACE_IBUS,
1535 active_engines_only ? "ListActiveEngines" : "ListEngines",
1537 G_VARIANT_TYPE ("(av)"));
1540 GVariantIter *iter = NULL;
1541 g_variant_get (result, "(av)", &iter);
1543 while (g_variant_iter_loop (iter, "v", &var)) {
1544 IBusSerializable *serializable = ibus_serializable_deserialize (var);
1545 g_object_ref_sink (serializable);
1546 retval = g_list_append (retval, serializable);
1548 g_variant_iter_free (iter);
1549 g_variant_unref (result);
1556 ibus_bus_list_engines (IBusBus *bus)
1558 return ibus_bus_do_list_engines (bus, FALSE);
1562 ibus_bus_list_engines_async (IBusBus *bus,
1564 GCancellable *cancellable,
1565 GAsyncReadyCallback callback,
1568 g_return_if_fail (IBUS_IS_BUS (bus));
1570 ibus_bus_call_async (bus,
1573 IBUS_INTERFACE_IBUS,
1576 G_VARIANT_TYPE ("(av)"),
1577 ibus_bus_list_engines_async,
1585 ibus_bus_list_engines_async_finish (IBusBus *bus,
1589 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
1590 if (g_simple_async_result_propagate_error (simple, error))
1592 GVariant *variant = g_simple_async_result_get_op_res_gpointer (simple);
1593 g_return_val_if_fail (variant != NULL, NULL);
1595 GList *retval = NULL;
1596 GVariantIter *iter = NULL;
1597 g_variant_get (variant, "(av)", &iter);
1599 while (g_variant_iter_loop (iter, "v", &var)) {
1600 IBusSerializable *serializable = ibus_serializable_deserialize (var);
1601 g_object_ref_sink (serializable);
1602 retval = g_list_append (retval, serializable);
1604 g_variant_iter_free (iter);
1609 ibus_bus_list_active_engines (IBusBus *bus)
1611 return ibus_bus_do_list_engines (bus, TRUE);
1615 ibus_bus_list_active_engines_async (IBusBus *bus,
1617 GCancellable *cancellable,
1618 GAsyncReadyCallback callback,
1621 g_return_if_fail (IBUS_IS_BUS (bus));
1623 ibus_bus_call_async (bus,
1626 IBUS_INTERFACE_IBUS,
1627 "ListActiveEngines",
1629 G_VARIANT_TYPE ("(av)"),
1630 ibus_bus_list_active_engines_async,
1638 ibus_bus_list_active_engines_async_finish (IBusBus *bus,
1642 return ibus_bus_list_engines_async_finish (bus, res, error);
1646 ibus_bus_get_engines_by_names (IBusBus *bus,
1647 const gchar * const *names)
1649 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1652 result = ibus_bus_call_sync (bus,
1655 IBUS_INTERFACE_IBUS,
1656 "GetEnginesByNames",
1657 g_variant_new("(^as)", names),
1658 G_VARIANT_TYPE ("(av)"));
1662 GArray *array = g_array_new (TRUE, TRUE, sizeof (IBusEngineDesc *));
1663 GVariantIter *iter = NULL;
1664 g_variant_get (result, "(av)", &iter);
1666 while (g_variant_iter_loop (iter, "v", &var)) {
1667 IBusEngineDesc *desc = (IBusEngineDesc *) ibus_serializable_deserialize (var);
1668 g_object_ref_sink (desc);
1669 g_array_append_val (array, desc);
1671 g_variant_iter_free (iter);
1672 g_variant_unref (result);
1674 return (IBusEngineDesc **)g_array_free (array, FALSE);
1678 _config_destroy_cb (IBusConfig *config,
1681 IBusBusPrivate *priv;
1682 priv = IBUS_BUS_GET_PRIVATE (bus);
1684 g_assert (priv->config == config);
1686 g_object_unref (config);
1687 priv->config = NULL;
1691 ibus_bus_get_config (IBusBus *bus)
1693 g_assert (IBUS_IS_BUS (bus));
1694 g_return_val_if_fail (ibus_bus_is_connected (bus), NULL);
1696 IBusBusPrivate *priv;
1697 priv = IBUS_BUS_GET_PRIVATE (bus);
1699 if (priv->config == NULL && priv->connection) {
1700 priv->config = ibus_config_new (priv->connection, NULL, NULL);
1702 g_signal_connect (priv->config, "destroy", G_CALLBACK (_config_destroy_cb), bus);
1706 return priv->config;
1710 ibus_bus_get_use_sys_layout (IBusBus *bus)
1712 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1714 gboolean retval = FALSE;
1716 result = ibus_bus_call_sync (bus,
1719 IBUS_INTERFACE_IBUS,
1722 G_VARIANT_TYPE ("(b)"));
1725 g_variant_get (result, "(b)", &retval);
1726 g_variant_unref (result);
1733 ibus_bus_get_use_sys_layout_async (IBusBus *bus,
1735 GCancellable *cancellable,
1736 GAsyncReadyCallback callback,
1739 g_return_if_fail (IBUS_IS_BUS (bus));
1741 ibus_bus_call_async (bus,
1744 IBUS_INTERFACE_IBUS,
1747 G_VARIANT_TYPE ("(b)"),
1748 ibus_bus_get_use_sys_layout_async,
1756 ibus_bus_get_use_sys_layout_async_finish (IBusBus *bus,
1760 g_assert (IBUS_IS_BUS (bus));
1761 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1762 ibus_bus_get_use_sys_layout_async));
1763 return _async_finish_gboolean (res, error);
1767 ibus_bus_get_use_global_engine (IBusBus *bus)
1769 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1771 gboolean retval = FALSE;
1773 result = ibus_bus_call_sync (bus,
1776 IBUS_INTERFACE_IBUS,
1777 "GetUseGlobalEngine",
1779 G_VARIANT_TYPE ("(b)"));
1782 g_variant_get (result, "(b)", &retval);
1783 g_variant_unref (result);
1790 ibus_bus_get_use_global_engine_async (IBusBus *bus,
1792 GCancellable *cancellable,
1793 GAsyncReadyCallback callback,
1796 g_return_if_fail (IBUS_IS_BUS (bus));
1798 ibus_bus_call_async (bus,
1801 IBUS_INTERFACE_IBUS,
1802 "GetUseGlobalEngine",
1804 G_VARIANT_TYPE ("(b)"),
1805 ibus_bus_get_use_global_engine_async,
1813 ibus_bus_get_use_global_engine_async_finish (IBusBus *bus,
1817 g_assert (IBUS_IS_BUS (bus));
1818 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1819 ibus_bus_get_use_global_engine_async));
1820 return _async_finish_gboolean (res, error);
1824 ibus_bus_is_global_engine_enabled (IBusBus *bus)
1826 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1828 gboolean retval = FALSE;
1830 result = ibus_bus_call_sync (bus,
1833 IBUS_INTERFACE_IBUS,
1834 "IsGlobalEngineEnabled",
1836 G_VARIANT_TYPE ("(b)"));
1839 g_variant_get (result, "(b)", &retval);
1840 g_variant_unref (result);
1846 void ibus_bus_is_global_engine_enabled_async (IBusBus *bus,
1848 GCancellable *cancellable,
1849 GAsyncReadyCallback callback,
1852 g_return_if_fail (IBUS_IS_BUS (bus));
1854 ibus_bus_call_async (bus,
1857 IBUS_INTERFACE_IBUS,
1858 "IsGlobalEngineEnabled",
1860 G_VARIANT_TYPE ("(b)"),
1861 ibus_bus_is_global_engine_enabled_async,
1868 gboolean ibus_bus_is_global_engine_enabled_async_finish (IBusBus *bus,
1872 g_assert (IBUS_IS_BUS (bus));
1873 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
1874 ibus_bus_is_global_engine_enabled_async));
1875 return _async_finish_gboolean (res, error);
1879 ibus_bus_get_global_engine (IBusBus *bus)
1881 g_return_val_if_fail (IBUS_IS_BUS (bus), NULL);
1884 IBusEngineDesc *engine = NULL;
1885 result = ibus_bus_call_sync (bus,
1888 IBUS_INTERFACE_IBUS,
1891 G_VARIANT_TYPE ("(v)"));
1894 GVariant *variant = NULL;
1895 g_variant_get (result, "(v)", &variant);
1897 engine = IBUS_ENGINE_DESC (ibus_serializable_deserialize (variant));
1898 g_variant_unref (variant);
1900 g_variant_unref (result);
1907 ibus_bus_get_global_engine_async (IBusBus *bus,
1909 GCancellable *cancellable,
1910 GAsyncReadyCallback callback,
1913 g_return_if_fail (IBUS_IS_BUS (bus));
1915 ibus_bus_call_async (bus,
1918 IBUS_INTERFACE_IBUS,
1921 G_VARIANT_TYPE ("(v)"),
1922 ibus_bus_get_global_engine_async,
1930 ibus_bus_get_global_engine_async_finish (IBusBus *bus,
1934 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) res;
1935 if (g_simple_async_result_propagate_error (simple, error))
1937 GVariant *variant = g_simple_async_result_get_op_res_gpointer (simple);
1938 g_return_val_if_fail (variant != NULL, NULL);
1939 GVariant *inner_variant = NULL;
1940 g_variant_get (variant, "(v)", &inner_variant);
1942 IBusEngineDesc *engine = NULL;
1943 if (inner_variant) {
1944 engine = IBUS_ENGINE_DESC (ibus_serializable_deserialize (inner_variant));
1945 g_variant_unref (inner_variant);
1951 ibus_bus_set_global_engine (IBusBus *bus,
1952 const gchar *global_engine)
1954 g_return_val_if_fail (IBUS_IS_BUS (bus), FALSE);
1955 g_return_val_if_fail (global_engine != NULL, FALSE);
1958 result = ibus_bus_call_sync (bus,
1961 IBUS_INTERFACE_IBUS,
1963 g_variant_new ("(s)", global_engine),
1967 g_variant_unref (result);
1974 ibus_bus_set_global_engine_async (IBusBus *bus,
1975 const gchar *global_engine,
1977 GCancellable *cancellable,
1978 GAsyncReadyCallback callback,
1981 g_return_if_fail (IBUS_IS_BUS (bus));
1982 g_return_if_fail (global_engine != NULL);
1984 ibus_bus_call_async (bus,
1987 IBUS_INTERFACE_IBUS,
1989 g_variant_new ("(s)", global_engine),
1990 NULL, /* no return value */
1991 ibus_bus_set_global_engine_async,
1999 ibus_bus_set_global_engine_async_finish (IBusBus *bus,
2003 g_assert (IBUS_IS_BUS (bus));
2004 g_assert (g_simple_async_result_is_valid (res, (GObject *) bus,
2005 ibus_bus_set_global_engine_async));
2006 return _async_finish_void (res, error);
2010 ibus_bus_call_sync (IBusBus *bus,
2011 const gchar *bus_name,
2013 const gchar *interface,
2014 const gchar *member,
2015 GVariant *parameters,
2016 const GVariantType *reply_type)
2018 g_assert (IBUS_IS_BUS (bus));
2019 g_assert (member != NULL);
2020 g_return_val_if_fail (ibus_bus_is_connected (bus), NULL);
2022 GError *error = NULL;
2024 result = g_dbus_connection_call_sync (bus->priv->connection,
2031 G_DBUS_CALL_FLAGS_NO_AUTO_START,
2032 ibus_get_timeout (),
2036 if (result == NULL) {
2037 g_warning ("ibus_bus_call_sync: %s.%s: %s", interface, member, error->message);
2038 g_error_free (error);
2046 ibus_bus_call_async_done (GDBusConnection *connection,
2050 g_assert (G_IS_DBUS_CONNECTION (connection));
2052 GSimpleAsyncResult *simple = (GSimpleAsyncResult *) user_data;
2053 GError *error = NULL;
2054 GVariant *variant = g_dbus_connection_call_finish (connection, res, &error);
2056 if (variant == NULL) {
2057 /* Replace with g_simple_async_result_take_error in glib 2.28 */
2058 g_simple_async_result_set_from_error (simple, error);
2059 g_error_free (error);
2062 g_simple_async_result_set_op_res_gpointer (simple, variant,
2063 (GDestroyNotify) g_variant_unref);
2065 g_simple_async_result_complete (simple);
2066 g_object_unref (simple);
2070 ibus_bus_call_async (IBusBus *bus,
2071 const gchar *bus_name,
2073 const gchar *interface,
2074 const gchar *member,
2075 GVariant *parameters,
2076 const GVariantType *reply_type,
2077 gpointer source_tag,
2079 GCancellable *cancellable,
2080 GAsyncReadyCallback callback,
2083 g_assert (IBUS_IS_BUS (bus));
2084 g_assert (member != NULL);
2085 g_return_if_fail (ibus_bus_is_connected (bus));
2087 GSimpleAsyncResult *simple = g_simple_async_result_new ((GObject*) bus,
2092 g_dbus_connection_call (bus->priv->connection,
2099 G_DBUS_CALL_FLAGS_NO_AUTO_START,
2102 (GAsyncReadyCallback) ibus_bus_call_async_done,