qt immdouel WIP.
authorHuang Peng <shawn.p.huang@gmail.com>
Sun, 15 Jun 2008 05:35:17 +0000 (13:35 +0800)
committerHuang Peng <shawn.p.huang@gmail.com>
Sun, 15 Jun 2008 05:35:17 +0000 (13:35 +0800)
qt/ibus-input-context.cpp
qt/ibus-input-context.h
qt/im-ibus-qt.cpp

index 69bfd4736c70b33e5afc07277c8d53440e59c2ea..165af54d1fbc08031de29bd479bf990965a25130 100644 (file)
@@ -1,14 +1,69 @@
-#include <QTextStream>
+#include <QtDebug>
 #include "ibus-input-context.h"
+#ifdef Q_WS_X11
+# include <QX11Info>
+# include <X11/Xlib.h>
+# include <X11/keysym.h>
+# include <X11/Xutil.h>
+#endif
+
+IBusClient *IBusInputContext::client = (IBusClient *)0;
+int IBusInputContext::client_ref = 0;
 
 IBusInputContext::IBusInputContext (QObject *parent)
        : QInputContext (parent)
 {
+       if (client == 0) {
+               client = new IBusClient ();
+               client_ref = 0;
+       }
+       client_ref ++;
 }
 
 IBusInputContext::~IBusInputContext ()
 {
+       client_ref --;
+       if (client_ref <= 0) {
+               delete client;
+               client = (IBusClient *) 0;
+               client_ref = 0;
+       }
+}
+
+#ifndef Q_WS_X11
+static void
+translate_key_event (const QKeyEvent *event, quint32 *keyval, bool *is_press, quint32 *state)
+{
+       Q_ASSERT (event);
+       Q_ASSERT (keyval);
+       Q_ASSERT (is_press);
+       Q_ASSERT (state);
+
+       *keyval = event->key ();
+       *is_press = (event->type() == QEvent::KeyPress);
+
+       Qt::KeyboardModifiers modifiers = event->modifiers ();
+       *state = 0;
+       if (modifiers & Qt::ShiftModifier) {
+               *state |= (1<< 0);
+       }
+       if (modifiers & Qt::ControlModifier) {
+               *state |= (1<< 2);
+       }
+       if (modifiers & Qt::AltModifier) {
+               *state |= (1<< 3);
+       }
+       if (modifiers & Qt::MetaModifier) {
+               *state |= (1<< 28);
+       }
+       if (modifiers & Qt::KeypadModifier) {
+               // *state |= (1<< 28);
+       }
+       if (modifiers & Qt::GroupSwitchModifier) {
+               // *state |= (1<< 28);
+       }
 }
+#endif
 
 bool
 IBusInputContext::filterEvent (const QEvent *event)
@@ -63,9 +118,49 @@ IBusInputContext::widgetDestroyed (QWidget *widget)
        QInputContext::widgetDestroyed (widget);
 }
 
+#ifdef Q_WS_X11
+static bool
+translate_x_key_event (XEvent *event, quint32 *keyval, bool *is_press, quint32 *state)
+{
+       Q_ASSERT (event);
+       Q_ASSERT (keyval);
+       Q_ASSERT (is_press);
+       Q_ASSERT (state);
+
+       if (event->type == KeyPress) {
+               *is_press = true;
+       }
+       else if (event->type == KeyRelease) {
+               *is_press = false;
+       }
+       else {
+               return false;
+       }
+       char key_str[64];
+       if (XLookupString (&event->xkey, key_str, sizeof (key_str), (KeySym *)keyval, 0) <= 0) {
+               *keyval = XLookupKeysym (&event->xkey, 0);
+       }
+       *state = event->xkey.state;
+       return true;
+}
+#endif
+
 bool
-IBusInputContext::x11FilterEvent (QWidget *keywidget, XEvent *event)
+IBusInputContext::x11FilterEvent (QWidget *keywidget, XEvent *xevent)
 {
-       return QInputContext::x11FilterEvent (keywidget, event);
+#ifdef Q_WS_X11
+       quint32 keyval;
+       bool is_press;
+       quint32 state;
+
+       if (translate_x_key_event (xevent, &keyval, &is_press, &state)) {
+               qDebug ("%c %d %d\n", keyval, is_press, state);
+
+               return false;
+       }
+       return QInputContext::x11FilterEvent (keywidget, xevent);
+#else
+       return QInputContext::x11FilterEvent (keywidget, xevent);
+#endif
 }
 
index 7a671680071647f2d4a16b2ae915796825fee747..df677ba3b673fc51e79ba19f14a1e37b7913d81c 100644 (file)
@@ -1,11 +1,13 @@
 #ifndef __IBUS_INPUT_CONTEXT_H_
 #define __IBUS_INPUT_CONTEXT_H_
 #include <QInputContext>
+#include "ibus-client.h"
 
 class IBusInputContext : public QInputContext  {
 public:
        IBusInputContext (QObject * parent = 0);
        ~IBusInputContext ();
+
 public:
        bool filterEvent (const QEvent *event);
        QFont font () const;
@@ -18,6 +20,9 @@ public:
        void widgetDestroyed (QWidget *widget);
        bool x11FilterEvent (QWidget *keywidget, XEvent *event);
 
+public:
+       static IBusClient *client;
+       static int client_ref;
 };
 
 #endif //__IBUS_INPUT_CONTEXT_H_
index 4a45bbca83fff2adbd7faff3ea4d6fa80f535510..56656141d9a5cf95bd6ec3beb2a5d3b04cb1fadf 100644 (file)
 #include <cassert>
 #include <Qt>
 #include <QInputContextPlugin>
-#include "ibus-client.h"
 #include "ibus-input-context.h"
 
 using namespace Qt;
 
 #define IBUS_IDENTIFIER_NAME "ibus"
 
-/* Static Variables */
-static IBusClient *client = NULL;
-
 /* The class Definition */
 class IBusInputContextPlugin: public QInputContextPlugin
 {
@@ -72,8 +68,6 @@ IBusInputContextPlugin::IBusInputContextPlugin (QObject *parent)
 
 IBusInputContextPlugin::~IBusInputContextPlugin ()
 {
-    delete client;
-    client = NULL;
 }
 
 QStringList 
@@ -118,7 +112,6 @@ IBusInputContextPlugin::create (const QString &key)
     if (key.toLower () != IBUS_IDENTIFIER_NAME) {
         return NULL;
     } else {
-        if (client == NULL) client = new IBusClient ();
         return new IBusInputContext (0);
     }
 }