summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2008-08-18 10:01:36 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2008-08-18 10:01:36 +0800
commitf1390a784766ccfc5903d54e9ae03553dac5273f (patch)
tree375be018153fb0d32065551855eb84e88c3cdc20 /client
parent8b5edb3da30ec604d1de12ea7e2bff47c4b2f6b1 (diff)
downloadibus-f1390a784766ccfc5903d54e9ae03553dac5273f.tar.gz
ibus-f1390a784766ccfc5903d54e9ae03553dac5273f.tar.xz
ibus-f1390a784766ccfc5903d54e9ae03553dac5273f.zip
Fix some problems.
Diffstat (limited to 'client')
-rw-r--r--client/qt4/ibus-client.cpp36
-rw-r--r--client/qt4/ibus-client.h2
-rw-r--r--client/qt4/ibus-input-context.cpp16
-rw-r--r--client/qt4/ibus-input-context.h1
4 files changed, 36 insertions, 19 deletions
diff --git a/client/qt4/ibus-client.cpp b/client/qt4/ibus-client.cpp
index cb37b1b..53791b6 100644
--- a/client/qt4/ibus-client.cpp
+++ b/client/qt4/ibus-client.cpp
@@ -42,7 +42,7 @@
IBusClient::IBusClient ()
- : ibus (NULL), focused_context (NULL)
+ : ibus (NULL)
{
username = getlogin ();
if (username.isNull ())
@@ -220,10 +220,6 @@ IBusClient::x11FilterEvent (IBusInputContext *ctx, QWidget * /* keywidget */, XE
quint32 state;
bool is_press;
- if (focused_context != ctx) {
- focusIn (ctx);
- }
-
if (ibus == NULL || !ibus->isConnected () || ctx->getIC().isEmpty ())
return false;
@@ -261,10 +257,6 @@ IBusClient::setCursorLocation (IBusInputContext *ctx, QRect &rect)
{
Q_ASSERT (ctx);
- if (focused_context != ctx) {
- focusIn (ctx);
- }
-
if (ibus == NULL || !ibus->isConnected () || ctx->getIC().isEmpty ())
return;
@@ -307,9 +299,6 @@ void
IBusClient::focusIn (IBusInputContext *ctx)
{
Q_ASSERT (ctx);
- if (focused_context != ctx && focused_context != NULL)
- focusOut (focused_context);
- focused_context = ctx;
if (ibus == NULL || !ibus->isConnected () || ctx->getIC().isEmpty ())
return;
@@ -331,10 +320,25 @@ IBusClient::focusOut (IBusInputContext *ctx)
{
Q_ASSERT (ctx);
- if (focused_context != ctx)
+ if (ibus == NULL || !ibus->isConnected () || ctx->getIC().isEmpty ())
return;
- focused_context = NULL;
+ QDBusMessage message = QDBusMessage::createMethodCall (
+ IBUS_NAME,
+ IBUS_PATH,
+ IBUS_INTERFACE,
+ "FocusOut");
+ message << ctx->getIC ();
+ message = ibus->call (message);
+ if (message.type() == QDBusMessage::ErrorMessage) {
+ qWarning() << message.errorMessage ();
+ }
+}
+
+void
+IBusClient::setCapabilities (IBusInputContext *ctx, int caps)
+{
+ Q_ASSERT (ctx);
if (ibus == NULL || !ibus->isConnected () || ctx->getIC().isEmpty ())
return;
@@ -343,13 +347,15 @@ IBusClient::focusOut (IBusInputContext *ctx)
IBUS_NAME,
IBUS_PATH,
IBUS_INTERFACE,
- "FocusOut");
+ "SetCapabilities");
message << ctx->getIC ();
+ message << caps;
message = ibus->call (message);
if (message.type() == QDBusMessage::ErrorMessage) {
qWarning() << message.errorMessage ();
}
}
+
void
IBusClient::widgetDestroyed (IBusInputContext * /* ctx */, QWidget * /* widget */)
{
diff --git a/client/qt4/ibus-client.h b/client/qt4/ibus-client.h
index 285d633..ff21c07 100644
--- a/client/qt4/ibus-client.h
+++ b/client/qt4/ibus-client.h
@@ -58,6 +58,7 @@ public:
void focusIn (IBusInputContext *ctx);
void focusOut (IBusInputContext *ctx);
void reset (IBusInputContext *ctx);
+ void setCapabilities (IBusInputContext *ctx, int caps);
private slots:
void slotDirectoryChanged (const QString &path);
@@ -78,7 +79,6 @@ private:
QFileSystemWatcher watcher;
QList <IBusInputContext *> context_list;
QHash <QString, IBusInputContext *>context_dict;
- IBusInputContext *focused_context;
QString username;
QString session;
QString ibus_addr;
diff --git a/client/qt4/ibus-input-context.cpp b/client/qt4/ibus-input-context.cpp
index 44de61d..99d0cf0 100644
--- a/client/qt4/ibus-input-context.cpp
+++ b/client/qt4/ibus-input-context.cpp
@@ -28,7 +28,11 @@
typedef QInputMethodEvent::Attribute QAttribute;
IBusInputContext::IBusInputContext (QObject *parent, IBusClient *client, QString &ic)
- : QInputContext (parent), client (client), ic (ic), preedit_visible (false)
+ : QInputContext (parent),
+ client (client),
+ ic (ic),
+ preedit_visible (false),
+ has_focus (false)
{
}
@@ -132,9 +136,15 @@ IBusInputContext::setFocusWidget (QWidget *widget)
{
QInputContext::setFocusWidget (widget);
if (widget == NULL) {
+ has_focus = false;
client->focusOut (this);
}
else {
+ if (widget->inherits("KateViewInternal"))
+ client->setCapabilities (this, 0);
+ else
+ client->setCapabilities (this, 1);
+ has_focus = true;
client->focusIn (this);
update ();
}
@@ -151,8 +161,8 @@ IBusInputContext::widgetDestroyed (QWidget *widget)
bool
IBusInputContext::x11FilterEvent (QWidget *keywidget, XEvent *xevent)
{
- if (client->x11FilterEvent (this, keywidget, xevent))
- return true;
+ if (has_focus && client->x11FilterEvent (this, keywidget, xevent))
+ return true;
return QInputContext::x11FilterEvent (keywidget, xevent);
}
#endif
diff --git a/client/qt4/ibus-input-context.h b/client/qt4/ibus-input-context.h
index 317c876..2e20bb8 100644
--- a/client/qt4/ibus-input-context.h
+++ b/client/qt4/ibus-input-context.h
@@ -62,6 +62,7 @@ private:
QString preedit_string;
bool preedit_visible;
int preedit_cursor_pos;
+ bool has_focus;
QList <QList <quint32> > preedit_attrs;
QRect cursor_location;
};