From ab14024d10c136a50348caf4faacfa655e57a9c1 Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Mon, 6 Aug 2012 01:35:53 +0200 Subject: forward port changes from maliit's glib-connection --- debian/changelog | 7 +++ main.c | 4 +- meego/meego-im-connector.c | 62 +++++++++++++++++++++- meego/qt-translate.cpp | 125 --------------------------------------------- 4 files changed, 70 insertions(+), 128 deletions(-) diff --git a/debian/changelog b/debian/changelog index ccbb47e..deb1599 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +xmimd (1.1) unstable; urgency=low + + * Make it partially compatible with PR1.3's Maliit "dynamic D-Bus + server address" feature. + + -- Javier Mon, 06 Aug 2012 01:34:37 +0200 + xmimd (1.0) unstable; urgency=low * Initial Release. diff --git a/main.c b/main.c index 433d0ce..d6b9f31 100644 --- a/main.c +++ b/main.c @@ -178,7 +178,9 @@ int main(int argc, char *argv[]) XFlush(x_dpy); // Flush X11 queue before blocking in the event loop - signal(SIGINT, ) + signal(SIGINT, signal_func); + signal(SIGTERM, signal_func); + g_debug("Server running"); g_main_loop_run(main_loop); diff --git a/meego/meego-im-connector.c b/meego/meego-im-connector.c index d316235..c1ca0de 100644 --- a/meego/meego-im-connector.c +++ b/meego/meego-im-connector.c @@ -18,8 +18,18 @@ #include +#define DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties" +#define DBUS_PROPERTIES_GET_METHOD "Get" + #define MEEGO_IM_SOCKET_PATH "unix:path=/tmp/meego-im-uiserver/imserver_dbus" +#define MALIIT_SERVER_ADDRESS_ENV "MALIIT_SERVER_ADDRESS" + +#define MALIIT_SERVER_NAME "org.maliit.server" +#define MALIIT_SERVER_OBJECT_PATH "/org/maliit/server/address" +#define MALIIT_SERVER_INTERFACE "org.maliit.Server.Address" +#define MALIIT_SERVER_ADDRESS_PROPERTY "address" + MeegoImConnector *meego_im_connector_new(); static gboolean @@ -39,6 +49,51 @@ connection_dropped(gpointer instance, MeegoImConnector *connector) try_reconnect(connector); } +static char * +get_dbus_address() +{ + const char *overridden_address = g_getenv(MALIIT_SERVER_ADDRESS_ENV); + + if (overridden_address && *overridden_address) { + return g_strdup(overridden_address); + } + + GValue value = { 0 }; + GError *error = NULL; + DBusGConnection *connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + + if (!connection) { + g_warning("%s: %s", __PRETTY_FUNCTION__, error->message); + g_error_free(error); + return NULL; + } + + DBusGProxy *proxy = dbus_g_proxy_new_for_name(connection, + MALIIT_SERVER_NAME, + MALIIT_SERVER_OBJECT_PATH, + DBUS_PROPERTIES_INTERFACE); + + if (!dbus_g_proxy_call(proxy, + DBUS_PROPERTIES_GET_METHOD, + &error, + G_TYPE_STRING, MALIIT_SERVER_INTERFACE, + G_TYPE_STRING, MALIIT_SERVER_ADDRESS_PROPERTY, + G_TYPE_INVALID, + G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + + g_warning("%s: %s", __PRETTY_FUNCTION__, error->message); + g_error_free(error); + // Let's try PR1.2 address if PR1.3/Maliit was not found. + return g_strdup(MEEGO_IM_SOCKET_PATH); + } + + gchar *result = g_value_dup_string(&value); + g_value_unset(&value); + g_object_unref(proxy); + + return result; +} + /** * MeegoImConnector: @@ -91,12 +146,15 @@ meego_im_connector_run(MeegoImConnector *self) { GError *error = NULL; DBusGConnection *connection = NULL; + gchar *address = get_dbus_address(); g_return_if_fail(self != NULL); - connection = dbus_g_connection_open(MEEGO_IM_SOCKET_PATH, &error); + connection = dbus_g_connection_open(address, &error); + + g_free(address); - if (error != NULL) { + if (!connection) { g_warning("Couldn't connect to Maliit server. Retrying..."); g_error_free(error); diff --git a/meego/qt-translate.cpp b/meego/qt-translate.cpp index 866610c..c091778 100644 --- a/meego/qt-translate.cpp +++ b/meego/qt-translate.cpp @@ -68,128 +68,3 @@ void meego_im_key_event_encode(const MeegoImKeyEvent *e, int *type, int *key, in *modifiers |= Qt::AltModifier; *text = e->text && strlen(e->text) > 0 ? e->text : NULL; } - -#if 0 -GdkEventKey * -compose_gdk_keyevent(GdkEventType type, guint keyval, guint state, GdkWindow *window) -{ - GdkEventKey *event = NULL; -#if GTK_CHECK_VERSION (3, 0, 0) - GdkDisplay *display; - GdkDeviceManager *device_manager; - GdkDevice *client_pointer; -#endif - if ((type != GDK_KEY_PRESS) && (type != GDK_KEY_RELEASE)) - return NULL; - - event = (GdkEventKey *)(gdk_event_new(type)); - event->length = 0; - event->string = 0; - event->is_modifier = 0; - event->time = GDK_CURRENT_TIME; - event->state = state; - -#if GTK_CHECK_VERSION (3, 0, 0) - display = gdk_window_get_display (window); - device_manager = gdk_display_get_device_manager (display); - client_pointer = gdk_device_manager_get_client_pointer (device_manager); - - gdk_event_set_device ((GdkEvent *)event, - gdk_device_get_associated_device (client_pointer)); -#endif - - if (type == GDK_KEY_RELEASE) - event->state |= GDK_RELEASE_MASK; - event->keyval = keyval; - event->window = window; - - if (event->window) { - GdkKeymap *key_map = gdk_keymap_get_default(); - GdkKeymapKey *keys; - gint n; - - g_object_ref(event->window); // seems when event is freed, the event->window will be unref - - if (gdk_keymap_get_entries_for_keyval(key_map, event->keyval, &keys, &n)) { - event->hardware_keycode = keys[0].keycode; - event->group = keys[0].group; - } else { - event->hardware_keycode = 0; - event->group = 0; - } - } - - DBG("event type=0x%x, state=0x%x, keyval=0x%x, keycode=0x%x, group=%d", - event->type, event->state, event->keyval, event->hardware_keycode, event->group); - - return event; -} - - - -GdkEventKey * -qt_key_event_to_gdk(int type, int key, int modifiers, char *text, GdkWindow *window) -{ - Q_UNUSED(text); - guint state = 0; - guint keyval; - - STEP(); - if ((type != QEvent::KeyPress) && (type != QEvent::KeyRelease)) - return NULL; - - if (modifiers & Qt::ShiftModifier) - state |= GDK_SHIFT_MASK; - if (modifiers & Qt::ControlModifier) - state |= GDK_CONTROL_MASK; - if (modifiers & Qt::AltModifier) - state |= GDK_MOD1_MASK; - - keyval = QtKeyToXKeySym(key); - - if (type == QEvent::KeyPress) { - return compose_gdk_keyevent(GDK_KEY_PRESS, keyval, state, window); - } else { - return compose_gdk_keyevent(GDK_KEY_RELEASE, keyval, state, window); - } - -} - - -gboolean -gdk_key_event_to_qt(GdkEventKey *event, int *type, int *key, int *modifier) -{ - - switch (event->type) { - case GDK_KEY_PRESS: - *type = QEvent::KeyPress; - break; - case GDK_KEY_RELEASE: - *type = QEvent::KeyRelease; - break; - default: - return FALSE; - } - - *key = XKeySymToQTKey(event->keyval); - if (*key == Qt::Key_unknown) { - qWarning("Unkonwn key"); - return FALSE; - } - - *modifier = Qt::NoModifier; - if (event->state & GDK_SHIFT_MASK) - *modifier |= Qt::ShiftModifier; - if (event->state & GDK_CONTROL_MASK) - *modifier |= Qt::ControlModifier; - if (event->state & GDK_MOD1_MASK) - *modifier |= Qt::AltModifier; - if (event->state & GDK_META_MASK) - *modifier |= Qt::MetaModifier; - - DBG("qtkey type =%d, qtkey=0x%x, modifier=0x%x", *type, *key, *modifier); - - return TRUE; -} - -#endif -- cgit v1.2.3