Author: ekato
Date: Wed Dec 8 01:47:17 2004
New Revision: 13
Modified:
trunk/xim/ximic.cpp
trunk/xim/ximserver.cpp
trunk/xim/ximtrans.cpp
Log:
* xim/ximtrans.cpp (Connection::xim_open) : In full-synchronous
XIM event flow, don't use KeyRelease event.
* xim/ximic.cpp (XimIC::get_ic_atr) : Update comment.
* xim/ximserver.cpp (KeyState::check_key) : Check modifier keys
properly even when KeyRelease event is not available.
Modified: trunk/xim/ximic.cpp
==============================================================================
--- trunk/xim/ximic.cpp (original)
+++ trunk/xim/ximic.cpp Wed Dec 8 01:47:17 2004
@@ -502,10 +502,11 @@
break;
case ICA_FilterEvents:
if (g_option_mask & OPT_ON_DEMAND_SYNC)
- t->pushC32(KeyPressMask|KeyReleaseMask);
- else
- t->pushC32(KeyPressMask); // sending KeyReleaseMask causes problem
- // on some clients (mozilla)
+ t->pushC32(KeyPressMask|KeyReleaseMask);
+ else // Filtering KeyRelease event with full-synchronous method
+ // causes problem with mozilla (1.7.3) gtk2 on navigation
+ // toolbar's auto text completion...
+ t->pushC32(KeyPressMask);
break;
case ICA_InputStyle:
t->pushC32(m_xatr.input_style);
Modified: trunk/xim/ximserver.cpp
==============================================================================
--- trunk/xim/ximserver.cpp (original)
+++ trunk/xim/ximserver.cpp Wed Dec 8 01:47:17 2004
@@ -54,6 +54,7 @@
static int check_modifier(std::list<KeySym> list);
static int gShiftMask, gLockMask, gControlMask, gMod1Mask,
gMod2Mask, gMod3Mask, gMod4Mask, gMod5Mask;
+static int gXNumLockMask;
// tables
@@ -140,6 +141,10 @@
for (it = ic_list.begin(); it != ic_list.end(); it++) {
(*it)->changeContext(engine);
}
+ // make sure to update locale of focused context
+ InputContext *focusedContext = InputContext::focusedContext();
+ if (focusedContext)
+ focusedContext->focusIn();
}
struct input_style *
@@ -291,9 +296,9 @@
mServer = svr;
mEngineName = NULL;
mLocaleName = NULL;
+ mFocusedContext = this;
mUc = createUimContext(engine);
mCandwinActive = false;
- mFocusedContext = this;
mNumPage = 1;
mDisplayLimit = 0;
}
@@ -382,7 +387,8 @@
uim_set_prop_label_update_cb(uc,
InputContext::update_prop_label_cb);
- uim_prop_list_update(uc);
+ if (mFocusedContext == this)
+ uim_prop_list_update(uc);
return uc;
}
@@ -757,6 +763,62 @@
void keyState::check_key(keyEventX *x)
{
mModifier = 0;
+
+ if (x->press) {
+ m_bPush = true;
+
+ if (!(g_option_mask & OPT_ON_DEMAND_SYNC)) {
+ // Only KeyPress is forwarded with full-synchronous
+ // method. So reset modifiers here.
+ if (!(x->state) || x->state == LockMask || x->state ==
gXNumLockMask)
+ mAltOn = mMetaOn = mSuperOn = mHyperOn = false;
+ }
+
+ switch (x->key_sym) {
+ case XK_Alt_L:
+ case XK_Alt_R:
+ mAltOn = true;
+ break;
+ case XK_Meta_L:
+ case XK_Meta_R:
+ mMetaOn = true;
+ break;
+ case XK_Super_L:
+ case XK_Super_R:
+ mSuperOn = true;
+ break;
+ case XK_Hyper_L:
+ case XK_Hyper_R:
+ mHyperOn = true;
+ break;
+ default:
+ break;
+ }
+ } else {
+ m_bPush = false;
+
+ switch (x->key_sym) {
+ case XK_Alt_L:
+ case XK_Alt_R:
+ mAltOn = false;
+ break;
+ case XK_Meta_L:
+ case XK_Meta_R:
+ mMetaOn = false;
+ break;
+ case XK_Super_L:
+ case XK_Super_R:
+ mSuperOn = false;
+ break;
+ case XK_Hyper_L:
+ case XK_Hyper_R:
+ mHyperOn = false;
+ break;
+ default:
+ break;
+ }
+ }
+
if (x->state & ShiftMask)
mModifier |= gShiftMask;
if (x->state & LockMask)
@@ -814,54 +876,6 @@
default: mKey = UKey_Other;
}
}
-
- if (x->press) {
- m_bPush = true;
-
- switch (x->key_sym) {
- case XK_Alt_L:
- case XK_Alt_R:
- mAltOn = true;
- break;
- case XK_Meta_L:
- case XK_Meta_R:
- mMetaOn = true;
- break;
- case XK_Super_L:
- case XK_Super_R:
- mSuperOn = true;
- break;
- case XK_Hyper_L:
- case XK_Hyper_R:
- mHyperOn = true;
- break;
- default:
- break;
- }
- } else {
- m_bPush = false;
-
- switch (x->key_sym) {
- case XK_Alt_L:
- case XK_Alt_R:
- mAltOn = false;
- break;
- case XK_Meta_L:
- case XK_Meta_R:
- mMetaOn = false;
- break;
- case XK_Super_L:
- case XK_Super_R:
- mSuperOn = false;
- break;
- case XK_Hyper_L:
- case XK_Hyper_R:
- mHyperOn = false;
- break;
- default:
- break;
- }
- }
}
int keyState::key()
@@ -956,9 +970,9 @@
KeySym ks;
int index = 0;
do {
- ks = XKeycodeToKeysym(XimServer::gDpy,
- map->modifiermap[k], index);
- index++;
+ ks = XKeycodeToKeysym(XimServer::gDpy,
+ map->modifiermap[k], index);
+ index++;
} while (!ks && index < keysyms_per_keycode);
switch (i) {
@@ -972,7 +986,11 @@
case Mod5MapIndex: Mod5MaskSyms.push_back(ks); break;
default: break;
}
- }k++;
+ // Check NumLock key
+ if (ks == XK_Num_Lock)
+ gXNumLockMask |= (1 << i);
+ }
+ k++;
}
}
XFreeModifiermap(map);
Modified: trunk/xim/ximtrans.cpp
==============================================================================
--- trunk/xim/ximtrans.cpp (original)
+++ trunk/xim/ximtrans.cpp Wed Dec 8 01:47:17 2004
@@ -507,14 +507,16 @@
t = createTxPacket(XIM_SET_EVENT_MASK, 0);
t->pushC16(imid);
t->pushC16(0);
- t->pushC32(KeyPressMask|KeyReleaseMask);
- if (g_option_mask & OPT_ON_DEMAND_SYNC)
+ if (g_option_mask & OPT_ON_DEMAND_SYNC) {
+ t->pushC32(KeyPressMask|KeyReleaseMask);
t->pushC32(~(KeyPressMask|KeyReleaseMask)); // no need to send
// XIM_SYNC_REPLY from
// XIM server
- else
- t->pushC32(KeyPressMask|KeyReleaseMask); // need to send XIM_SYNC_REPLY
- // from XIM server
+ } else {
+ t->pushC32(KeyPressMask);
+ t->pushC32(KeyPressMask); // need to send XIM_SYNC_REPLY from XIM server
+ }
+
push_packet(t);
}