summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog7
-rw-r--r--main.c4
-rw-r--r--meego/meego-im-connector.c62
-rw-r--r--meego/qt-translate.cpp125
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 <maemo@javispedro.com> 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 <glib.h>
+#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