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);
 }
 

Reply via email to