[openi18n-im:01466] Re: key release issue with iiimxcf

Federic Zhang <[email protected]> Mon, 11 Jul 2005 13:42:20 +0800
Newsgroups gmane.comp.internationalization.input-methods
Message-ID <[email protected]>
Yes, the name space conflict is one area we need to take into
consideration. Please commit.

-federic

> Date: Mon, 11 Jul 2005 11:46:29 +0800
> From: Federic Zhang <[email protected]>:
> > 
> > To help LE developer, it's better for us to define one convenient MACRO
> > in include/IMProtocolStruct.h to decide whether the key event is either
> > press or release. For example, we can write it as following:
> > 
> > #define IsKeyRelease(v) ((v)->modifier & IM_KEY_RELEASE_MASK) /* the
> > type of 'v' is IMKeyEventStruct */
> > 
> > How do you think the suggestion?
> 
> I think it's a good idea to have the macro.
> 
> By the way, I'd like to suggest to follow the current
> convention.  Macros defined in IMProtocolStruct.h start with
> "AM_" to avoid possible name space conflicts.  And uppercase.
> 
> #define IM_IS_KEY_RELEASE(v) ((v)->modifier & IM_KEY_RELEASE_MASK)
> 
> Regards,
> -- 
> kasha
> 
> > 
> > -federic
> > 
> > 
> > > Date: Fri, 08 Jul 2005 14:06:44 +0800
> > > From: Federic Zhang <[email protected]>:
> > > > 
> > > > Thanks for your commit. Can you post it in patch format? It would be
> > > > easier for me to take a look at it.
> > > 
> > > This mail includes diffs for r2748.
> > > 
> > > Thanks,
> > > -- 
> > > kasha
> > > 
> > > ------------------------------------------------------------------------
> > > r2748 | kasha | 2005-07-08 14:12:33 +0900 (Fri, 08 Jul 2005) | 3 lines
> > > 
> > > fix LE.cpp - AUX events
> > > fix libiiimp.so compatibility issue - KEYEVENT
> > > 
> > > ------------------------------------------------------------------------
> > > Index: iiimsf/src/LE.cpp
> > > ===================================================================
> > > --- iiimsf/src/LE.cpp	(revision 2747)
> > > +++ iiimsf/src/LE.cpp	(revision 2748)
> > > @@ -459,14 +459,16 @@
> > >      IMInputEvent* pimevent
> > >  )
> > >  {
> > > -    IMKeyEventStruct *pkey;
> > > +//    IMKeyEventStruct *pkey;
> > >  
> > >      bind_imlexec(pimlex);
> > >      IMLock lock(get_leif_sync_object(), need_thread_lock_p());
> > >      /* Assume that only one event will be sent at a time */
> > > -    pkey = ((IMKeyListEvent *)pimevent)->keylist;
> > > +//    pkey = ((IMKeyListEvent *)pimevent)->keylist;
> > >      /* if KeyRelease is interested, send the release event. Otherwise, send only the press event */
> > > -    if ((pkey && pkey->keyType == IM_KEY_PRESS) || pbase->iml_if->need_keyrelease)
> > > +//    if ((pkey && pkey->keyType == IM_KEY_PRESS) || pbase->iml_if->need_keyrelease)
> > > +    if ((IM_EventKeyList != pimevent->type) ||
> > > +	(0 == (IM_KEY_RELEASE_MASK & pimevent->keylist.keylist->modifier)))
> > >         if_SendEvent(s, pimevent);
> > >  
> > >      return true;
> > > Index: iiimsf/src/IIIMP_ICState.cpp
> > > ===================================================================
> > > --- iiimsf/src/IIIMP_ICState.cpp	(revision 2747)
> > > +++ iiimsf/src/IIIMP_ICState.cpp	(revision 2748)
> > > @@ -615,7 +615,6 @@
> > >  	      kev.keyChar = piiimpkey->keychar;
> > >  	      kev.modifier = piiimpkey->modifier;
> > >  	      kev.time_stamp = piiimpkey->time_stamp;
> > > -	      kev.keyType = piiimpkey->keytype;
> > >  	      keyvec.push_back(kev);
> > >  	  }
> > >  
> > > @@ -710,7 +709,6 @@
> > >      ikev.keychar = pkeyevent->keyChar;
> > >      ikev.modifier = pkeyevent->modifier;
> > >      ikev.time_stamp = pkeyevent->time_stamp;
> > > -    ikev.keytype = pkeyevent->keyType;
> > >  
> > >      IIIMP_keyevent_list *pikl = iiimp_keyevent_list_new(get_iiimptrans()->get_data_s(),
> > >  							1, &ikev);
> > > Index: iiimsf/src/IMKeyUtils.cpp
> > > ===================================================================
> > > --- iiimsf/src/IMKeyUtils.cpp	(revision 2747)
> > > +++ iiimsf/src/IMKeyUtils.cpp	(revision 2748)
> > > @@ -55,22 +55,8 @@
> > >  	keychar = x_keychar;
> > >  	modifier = x_modifier;
> > >  	timestamp = x_timestamp;
> > > -	keytype = 1;            /* set IM_KEY_PRESS by default */
> > >  }
> > >  
> > > -IMKeySpec::IMKeySpec(int x_keycode,
> > > -		     int x_keychar,
> > > -		     int x_modifier,
> > > -		     int x_timestamp,
> > > -		     int x_keytype)
> > > -{
> > > -	keycode = x_keycode;
> > > -	keychar = x_keychar;
> > > -	modifier = x_modifier;
> > > -	timestamp = x_timestamp;
> > > -	keytype = x_keytype;
> > > -}
> > > -
> > >  /*******************************************************************************
> > >                   IMKeyParser (helper object to parse key symbols
> > >  *******************************************************************************/
> > > Index: iiimsf/src/ChangeLog
> > > ===================================================================
> > > --- iiimsf/src/ChangeLog	(revision 2747)
> > > +++ iiimsf/src/ChangeLog	(revision 2748)
> > > @@ -1,3 +1,19 @@
> > > +2005-07-08  AShiZaWa KaZuNoRi  <[email protected]>
> > > +
> > > +	* IIIMP_hotkey_profile.cpp (get_super_hotkeys):  remove keytype for key release
> > > +	* IIIMP_IMState.cpp (send_trigger_keys):  remove keytype for key release
> > > +	(set_data_to_client): add capability
> > > +	* IIIMP_hotkey.cpp:  IIIMP_hotkey::forward_hotkey_to_LE()
> > > +	remove keytype for key release
> > > +	* IMKeyUtils.hh (class IMKeySpec): remove keytype for key release
> > > +	* IMKeyUtils.cpp (IMKeySpec): remove keytype for key release
> > > +	* IIIMP_ICState.cpp: remove keytype for key release
> > > +	* LE.cpp: LEContext::send_event()
> > > +	pkey = ((IMKeyListEvent *)pimevent)->keylist;
> > > +	if ((pkey && pkey->keyType == IM_KEY_PRESS) || pbase->iml_if->need_keyrelease)
> > > +	The code processes only key events, and ignores other events such
> > > +	as aux events.  Breaks AUX.
> > > +
> > >  2005-07-07  AShiZaWa KaZuNoRi  <[email protected]>
> > >  
> > >  	* IIIMP_IMState.cpp (create_input_method_descriptors): call
> > > Index: iiimsf/src/IMKeyUtils.hh
> > > ===================================================================
> > > --- iiimsf/src/IMKeyUtils.hh	(revision 2747)
> > > +++ iiimsf/src/IMKeyUtils.hh	(revision 2748)
> > > @@ -51,7 +51,6 @@
> > >  	int keychar;
> > >  	int modifier;
> > >  	int timestamp;
> > > -	int keytype;
> > >    public:
> > >  	int get_keycode() const
> > >  		{ return keycode; }
> > > @@ -61,21 +60,12 @@
> > >  		{ return modifier; }
> > >  	int get_timestamp() const
> > >  		{ return timestamp; }
> > > -	int get_keytype() const
> > > -		{ return keytype; }
> > >  	IMKeySpec(
> > >  		int keycode,
> > >  		int keychar,
> > >  		int modifier,
> > >  		int timestamp
> > >  		);
> > > -	IMKeySpec(
> > > -		int keycode,
> > > -		int keychar,
> > > -		int modifier,
> > > -		int timestamp,
> > > -		int keytype
> > > -		);
> > >  };
> > >  
> > >  typedef std::list<IMKeySpec> IMKeySpecList;
> > > Index: iiimsf/src/IIIMP_hotkey.cpp
> > > ===================================================================
> > > --- iiimsf/src/IIIMP_hotkey.cpp	(revision 2747)
> > > +++ iiimsf/src/IIIMP_hotkey.cpp	(revision 2748)
> > > @@ -110,7 +110,6 @@
> > >  			kev.keyChar = it3->get_keychar();
> > >  			kev.modifier = it3->get_modifier();
> > >  			kev.time_stamp = it3->get_timestamp();
> > > -			kev.keyType = it3->get_keytype();
> > >  			keyvec.push_back(kev);
> > >      
> > >  			IMKeyListEvent *pimkey = &ev.keylist;
> > > Index: iiimsf/src/IIIMP_IMState.cpp
> > > ===================================================================
> > > --- iiimsf/src/IIIMP_IMState.cpp	(revision 2747)
> > > +++ iiimsf/src/IIIMP_IMState.cpp	(revision 2748)
> > > @@ -114,7 +114,6 @@
> > >  	    keys[i].keychar = it->get_keychar();
> > >  	    keys[i].modifier = it->get_modifier();
> > >  	    keys[i].time_stamp = it->get_timestamp();
> > > -	    keys[i].keytype = it->get_keytype();
> > >  	}
> > >  	pion = iiimp_keyevent_list_new(pdata_s, i, keys);
> > >  	pioff = iiimp_keyevent_list_new(pdata_s, i, keys);
> > > @@ -614,7 +613,9 @@
> > >  IIIMP_IMState_Identified::
> > >  set_data_to_client()
> > >  {
> > > -    IIIMP_imattribute *pima, *pima_objdesc, *pima_imdesc;
> > > +    IIIMP_imattribute *pima, *pima_objdesc, *pima_imdesc, *pima_capability;
> > > +    IIIMP_card32_list * capability;
> > > +    IIIMP_card32 ca[1];
> > >  
> > >      pima_objdesc = create_object_descriptors();
> > >  
> > > @@ -631,6 +632,20 @@
> > >  	pima = pima_imdesc;
> > >      }
> > >  
> > > +    ca[0] = 0;
> > > +    ca[0] |= IIIMP_CAPABILITY_FILE_OPERATION;
> > > +    ca[0] |= IIIMP_CAPABILITY_KEY_RELEASE;
> > > +    capability = iiimp_card32_list_new(get_iiimptrans()->get_data_s(), 1, ca);
> > > +    pima_capability =
> > > +	iiimp_imattribute_capability_new(
> > > +	    get_iiimptrans()->get_data_s(), IIIMP_IMATTRIBUTE_CAPABILITY,
> > > +	    0, capability);
> > > +    if (NULL == pima) {
> > > +	pima = pima_capability;
> > > +    } else {
> > > +	pima->next = pima_capability;
> > > +    }
> > > +
> > >      if (!send(iiimp_setimvalues_new(get_iiimptrans()->get_data_s(),
> > >  				    get_im_id(), pima), true))
> > >  	return false;
> > > Index: iiimsf/src/IIIMP_hotkey_profile.cpp
> > > ===================================================================
> > > --- iiimsf/src/IIIMP_hotkey_profile.cpp	(revision 2747)
> > > +++ iiimsf/src/IIIMP_hotkey_profile.cpp	(revision 2748)
> > > @@ -79,13 +79,11 @@
> > >      kev[n_keys].keyChar = 0;
> > >      kev[n_keys].modifier = IM_CTRL_MASK|IM_ALT_MASK;
> > >      kev[n_keys].time_stamp = 0;
> > > -    kev[n_keys].keyType = IM_KEY_PRESS;
> > >      n_keys++;
> > >      kev[n_keys].keyCode = IM_VK_SPACE;
> > >      kev[n_keys].keyChar = 0;
> > >      kev[n_keys].modifier = IM_CTRL_MASK|IM_SHIFT_MASK;
> > >      kev[n_keys].time_stamp = 0;
> > > -    kev[n_keys].keyType = IM_KEY_PRESS;
> > >      n_keys++;
> > >  
> > >      hks[n_hotkeys].label = strdup("LE SWITCH");
> > > @@ -103,7 +101,6 @@
> > >  	kev[n_keys].keyChar = it->get_keychar();
> > >  	kev[n_keys].modifier = it->get_modifier();
> > >  	kev[n_keys].time_stamp = it->get_timestamp();
> > > -	kev[n_keys].keyType = it->get_keytype();
> > >      }
> > >  
> > >      hks[n_hotkeys].label = strdup("TRIGGER KEYS");
> > > @@ -120,7 +117,6 @@
> > >      kev[n_keys].keyChar = 0;
> > >      kev[n_keys].modifier = IM_SHIFT_MASK|IM_CTRL_MASK;
> > >      kev[n_keys].time_stamp = 0;
> > > -    kev[n_keys].keyType = IM_KEY_PRESS;
> > >      n_keys++;
> > >  
> > >      hks[n_hotkeys].label = strdup("CYCLE LE SWITCH");
> > > @@ -137,7 +133,6 @@
> > >      kev[n_keys].keyChar = 0;
> > >      kev[n_keys].modifier = IM_SHIFT_MASK|IM_CTRL_MASK;
> > >      kev[n_keys].time_stamp = 0;
> > > -    kev[n_keys].keyType = IM_KEY_PRESS;
> > >      n_keys++;
> > >  
> > >      hks[n_hotkeys].label = strdup("CYCLE LE SWITCH(reverse)");
> > > @@ -356,7 +351,6 @@
> > >  	    keys[j].keychar = it3->get_keychar();
> > >  	    keys[j].modifier = it3->get_modifier();
> > >  	    keys[j].time_stamp = it3->get_timestamp();
> > > -	    keys[j].keytype = it3->get_keytype();
> > >  	}
> > >  	hk[i].hotkeylist = iiimp_keyevent_list_new(pdata_s, keylist->size(), keys);
> > >  	delete[] keys;
> > > Index: include/IMProtocolStruct.h
> > > ===================================================================
> > > --- include/IMProtocolStruct.h	(revision 2747)
> > > +++ include/IMProtocolStruct.h	(revision 2748)
> > > @@ -197,12 +197,13 @@
> > >  #define IM_KEY_PRESS     1
> > >  #define IM_KEY_RELEASE   0
> > >  
> > > +#define IM_KEY_RELEASE_MASK	(0x80000000)
> > > +
> > >  typedef struct _IMKeyEventStruct {
> > >    int keyCode;
> > >    int keyChar;
> > >    int modifier;
> > >    int time_stamp;
> > > -  int keyType;      /* For Key Release Event Support */
> > >  } IMKeyEventStruct, *IMKeyList;
> > >  
> > >  /*
> > > Index: include/iiimcf.h
> > > ===================================================================
> > > --- include/iiimcf.h	(revision 2747)
> > > +++ include/iiimcf.h	(revision 2748)
> > > @@ -188,7 +188,6 @@
> > >      IIIMP_int32 keychar;
> > >      IIIMP_int32 modifier;
> > >      IIIMP_int32 time_stamp;
> > > -    IIIMP_int32 keytype;   /* For Key Release Event Support */
> > >  };
> > >  
> > >  /* Hotkeys */
> > > Index: include/ChangeLog
> > > ===================================================================
> > > --- include/ChangeLog	(revision 2747)
> > > +++ include/ChangeLog	(revision 2748)
> > > @@ -1,3 +1,17 @@
> > > +2005-07-08  AShiZaWa KaZuNoRi  <[email protected]>
> > > +
> > > +	* iiimp/iiimp-data.h (IIIMP_imattribute_value):  remove keytype for key release
> > > +	(IIIMP_keyevent):  remove keytype for key release
> > > +	(iiimp_imattribute_capability_new()): new
> > > +	(IIIMP_IMATTRIBUTE_CAPABILITY): new
> > > +	(IIIMP_CAPABILITY_ERROR): new
> > > +	(IIIMP_CAPABILITY_FILE_OPERATION): new
> > > +	(IIIMP_CAPABILITY_KEY_RELEASE): new
> > > +
> > > +	* iiimcf.h (IIIMCF_keyevent):  remove keytype for key release
> > > +	* IMProtocolStruct.h (IM_KEY_RELEASE_MASK): new
> > > +	(IMKeyEventStruct):  remove keytype for key release
> > > +
> > >  2005-07-07  AShiZaWa KaZuNoRi  <[email protected]>
> > >  
> > >  	* iiimp/iiimp-data.h: IIIMP_imeinfo - editorial change
> > > Index: include/iiimp/iiimp-data.h
> > > ===================================================================
> > > --- include/iiimp/iiimp-data.h	(revision 2747)
> > > +++ include/iiimp/iiimp-data.h	(revision 2748)
> > > @@ -216,6 +216,7 @@
> > >      IIIMP_ccdef *			ccdef;
> > >      IIIMP_jarfile_object *		jarfile_object;
> > >      IIIMP_binaryfile_object *		binaryfile_object;
> > > +    IIIMP_card32_list *			capability;
> > >  } IIIMP_imattribute_value;
> > >  
> > >  struct iiimp_imattribute {
> > > @@ -250,7 +251,6 @@
> > >      IIIMP_int32		keychar;
> > >      IIIMP_int32		modifier;
> > >      IIIMP_int32		time_stamp;
> > > -    IIIMP_int32		keytype;        /* For Key Release Event Support */
> > >  } IIIMP_keyevent;
> > >  
> > >  typedef struct {
> > > @@ -1754,6 +1754,13 @@
> > >      IIIMP_card16		id_dyn,
> > >      IIIMP_binaryfile_object *	value);
> > >  
> > > +extern IIIMP_imattribute *
> > > +iiimp_imattribute_capability_new(
> > > +    IIIMP_data_s *		data_s,
> > > +    IIIMP_card16		id,
> > > +    IIIMP_card16		id_dyn,
> > > +    IIIMP_card32_list *		value);
> > > +
> > >  extern IIIMP_icattribute *
> > >  iiimp_icattribute_input_language_new(
> > >      IIIMP_data_s *	data_s,
> > > @@ -2871,8 +2878,16 @@
> > >  #define IIIMP_IMATTRIBUTE_BINARY_LIGHT_WEIGHT_ENGINE_OBJECT	(0x1034)
> > >  #define IIIMP_IMATTRIBUTE_SCRIPT_GUI_OBJECT			(0x1035)
> > >  #define IIIMP_IMATTRIBUTE_SCRIPT_LIGHT_WEIGHT_ENGINE_OBJECT	(0x1036)
> > > +#define IIIMP_IMATTRIBUTE_CAPABILITY				(0x1051)
> > >  
> > > 
> > > +/* IIIMP capability */
> > > +
> > > +#define IIIMP_CAPABILITY_ERROR					(0x00000001)
> > > +#define IIIMP_CAPABILITY_FILE_OPERATION				(0x00000002)
> > > +#define IIIMP_CAPABILITY_KEY_RELEASE				(0x00000004)
> > > +
> > > +
> > >  /* IIIMP IM_LOOKUP_CHOICE_START */
> > >  
> > >  /* lookup choice master */
> > > Index: lib/iiimcf/iiimcf.c
> > > ===================================================================
> > > --- lib/iiimcf/iiimcf.c	(revision 2747)
> > > +++ lib/iiimcf/iiimcf.c	(revision 2748)
> > > @@ -235,7 +235,6 @@
> > >  	    pkev->keychar = pimk->keychar;
> > >  	    pkev->modifier = pimk->modifier;
> > >  	    pkev->time_stamp = pimk->time_stamp;
> > > -	    pkev->keytype = pimk->keytype;
> > >  	}
> > >  
> > >  	ph->num_on_keys = i;
> > > @@ -259,7 +258,6 @@
> > >  	    pkev->keychar = pimk->keychar;
> > >  	    pkev->modifier = pimk->modifier;
> > >  	    pkev->time_stamp = pimk->time_stamp;
> > > -	    pkev->keytype = pimk->keytype;
> > >  	}
> > >  
> > >  	ph->num_off_keys = i;
> > > Index: lib/iiimcf/ChangeLog
> > > ===================================================================
> > > --- lib/iiimcf/ChangeLog	(revision 2747)
> > > +++ lib/iiimcf/ChangeLog	(revision 2748)
> > > @@ -1,3 +1,9 @@
> > > +2005-07-08  AShiZaWa KaZuNoRi  <[email protected]>
> > > +
> > > +	* event.c (forward_keyevent()): remove keytype for key release
> > > +	(iiimcf_receive_forwarded_event()): remove keytype for key release
> > > +	* iiimcf.c (iiimcf_register_trigger_keys()): remove keytype for key release
> > > +
> > >  2005-06-30  Federic Zhang <[email protected]>
> > >  
> > >  	Enable Input Method Engine (IME) switching and display IME list in the language submenu of GIMLET
> > > Index: lib/iiimcf/event.c
> > > ===================================================================
> > > --- lib/iiimcf/event.c	(revision 2747)
> > > +++ lib/iiimcf/event.c	(revision 2748)
> > > @@ -405,7 +405,6 @@
> > >      ikev.keychar = pk->keychar;
> > >      ikev.modifier = pk->modifier;
> > >      ikev.time_stamp = pk->time_stamp;
> > > -    ikev.keytype = pk->keytype;
> > >  
> > >      pikl = iiimp_keyevent_list_new(pds, 1, &ikev);
> > >      if (!pikl) return IIIMF_STATUS_MALLOC;
> > > @@ -567,7 +566,6 @@
> > >  	      kev.keychar = pimkev->keychar;
> > >  	      kev.modifier = pimkev->modifier;
> > >  	      kev.time_stamp = pimkev->time_stamp;
> > > -	      kev.keytype = pimkev->keytype;
> > >  	      st = iiimcf_create_keyevent(&kev, (IIIMCF_event*) &pev);
> > >  	      if (st != IIIMF_STATUS_SUCCESS) return st;
> > >  	      st = iiimcf_store_event(pc, pev);
> > > Index: lib/iiimp/ChangeLog
> > > ===================================================================
> > > --- lib/iiimp/ChangeLog	(revision 2747)
> > > +++ lib/iiimp/ChangeLog	(revision 2748)
> > > @@ -1,3 +1,17 @@
> > > +2005-07-08  AShiZaWa KaZuNoRi  <[email protected]>
> > > +
> > > +	* data/comp-keyevent.c (iiimp_keyevent_list_new): revert keytype
> > > +	(iiimp_keyevent_list_pack): remove keytype for key release
> > > +	(iiimp_keyevent_list_unpack): remove keytype for key release
> > > +	* data/comp-imattribute.c (iiimp_imattribute_new): add capability
> > > +	(iiimp_imattribute_delete): add capability
> > > +	(iiimp_imattribute_capability_new): new
> > > +	(iiimp_imattribute_pack): add capability
> > > +	(iiimp_imattribute_unpack): add capability
> > > +	(iiimp_imattribute_print): add capability
> > > +	* data/iiimp-dataP.h (KEY_EVENT_OBJECT_SIZE): revert
> > > +	editorial change
> > > +
> > >  2005-07-07  AShiZaWa KaZuNoRi  <[email protected]>
> > >  
> > >  	* data/comp-inputmethod-descriptor.c
> > > Index: lib/iiimp/data/iiimp-dataP.h
> > > ===================================================================
> > > --- lib/iiimp/data/iiimp-dataP.h	(revision 2747)
> > > +++ lib/iiimp/data/iiimp-dataP.h	(revision 2748)
> > > @@ -367,7 +367,7 @@
> > >  } while(0)
> > >  
> > > 
> > > -#define KEY_EVENT_OBJECT_SIZE	(4 * 5)   /* Additional one for the new keytype member */
> > > +#define KEY_EVENT_OBJECT_SIZE	(4 * 4)
> > >  
> > > 
> > >  typedef struct iiimp_attribute_id {
> > > @@ -376,6 +376,7 @@
> > >      struct iiimp_attribute_id *	next;
> > >  } IIIMP_attribute_id;
> > >  
> > > +
> > >  struct iiimp_data_s {
> > >      int				byte_swap;
> > >      IIIMP_attribute_id *	attribute_id;
> > > Index: lib/iiimp/data/comp-imattribute.c
> > > ===================================================================
> > > --- lib/iiimp/data/comp-imattribute.c	(revision 2747)
> > > +++ lib/iiimp/data/comp-imattribute.c	(revision 2748)
> > > @@ -73,6 +73,9 @@
> > >      case IIIMP_IMATTRIBUTE_SCRIPT_LIGHT_WEIGHT_ENGINE_OBJECT:
> > >  	attr->value_nbyte = attr->value.binaryfile_object->nbyte;
> > >  	break;
> > > +    case IIIMP_IMATTRIBUTE_CAPABILITY:
> > > +	attr->value_nbyte = attr->value.capability->nbyte;
> > > +	break;
> > >      }
> > >  
> > >      attr->nbyte += (attr->value_nbyte + PAD(attr->value_nbyte));
> > > @@ -109,6 +112,9 @@
> > >      case IIIMP_IMATTRIBUTE_SCRIPT_LIGHT_WEIGHT_ENGINE_OBJECT:
> > >  	iiimp_binaryfile_object_delete(data_s, attr->value.binaryfile_object);
> > >  	break;
> > > +    case IIIMP_IMATTRIBUTE_CAPABILITY:
> > > +	iiimp_card32_list_delete(data_s, attr->value.capability);
> > > +	break;
> > >      }
> > >      free(attr);
> > >  
> > > @@ -258,6 +264,19 @@
> > >  }
> > >  
> > > 
> > > +IIIMP_imattribute *
> > > +iiimp_imattribute_capability_new(
> > > +    IIIMP_data_s *		data_s,
> > > +    IIIMP_card16		id,
> > > +    IIIMP_card16		id_dyn,
> > > +    IIIMP_card32_list *		value)
> > > +{
> > > +    return iiimp_imattribute_new(data_s, id,
> > > +				 IIIMP_IMATTRIBUTE_CAPABILITY,
> > > +				 id_dyn, (void *)value);
> > > +}
> > > +
> > > +
> > >  void
> > >  iiimp_imattribute_pack(
> > >      IIIMP_data_s *	data_s,
> > > @@ -304,6 +323,9 @@
> > >  	iiimp_binaryfile_object_pack(data_s, m->value.binaryfile_object,
> > >  				     &rest, &p);
> > >  	break;
> > > +    case IIIMP_IMATTRIBUTE_CAPABILITY:
> > > +	iiimp_card32_list_pack(data_s, m->value.capability, &rest, &p);
> > > +	break;
> > >      }
> > >  
> > >      *nbyte = rest;
> > > @@ -423,6 +445,10 @@
> > >  	attr->value.binaryfile_object =
> > >  	    iiimp_binaryfile_object_unpack(data_s, &rest2, &p, rest2);
> > >  	break;
> > > +    case IIIMP_IMATTRIBUTE_CAPABILITY:
> > > +	attr->value.capability = iiimp_card32_list_unpack(data_s, &rest2,
> > > +							  &p, rest2);
> > > +	break;
> > >      default:
> > >  	attr->value.any = NULL;
> > >  	data_s->status = IIIMP_DATA_INVALID;
> > > @@ -541,6 +567,10 @@
> > >  		      "\tSCRIPT Light Weight Engine Object:\n");
> > >  	iiimp_binaryfile_object_print(data_s, m->value.binaryfile_object);
> > >  	break;
> > > +    case IIIMP_IMATTRIBUTE_CAPABILITY:
> > > +	(void)fprintf(data_s->print_fp, "\tCapability:\n");
> > > +	iiimp_card32_list_print(data_s, m->value.capability);
> > > +	break;
> > >      }
> > >  }
> > >  
> > > Index: lib/iiimp/data/comp-keyevent.c
> > > ===================================================================
> > > --- lib/iiimp/data/comp-keyevent.c	(revision 2747)
> > > +++ lib/iiimp/data/comp-keyevent.c	(revision 2748)
> > > @@ -26,7 +26,7 @@
> > >  	return NULL;
> > >      }
> > >  
> > > -    nbyte = ((4 + 4 + 4 + 4 + 4) * count); /* keytype is expected */
> > > +    nbyte = ((4 + 4 + 4 + 4) * count);
> > >  
> > >      data->nbyte = nbyte;
> > >      data->count = count;
> > > @@ -81,7 +81,6 @@
> > >  	PUT32((m->keyevent + i)->keychar, rest, p, data_s->byte_swap);
> > >  	PUT32((m->keyevent + i)->modifier, rest, p, data_s->byte_swap);
> > >  	PUT32((m->keyevent + i)->time_stamp, rest, p, data_s->byte_swap);
> > > -	PUT32((m->keyevent + i)->keytype, rest, p, data_s->byte_swap);
> > >      }
> > >  
> > >      *nbyte = rest;
> > > @@ -143,7 +142,6 @@
> > >  	GET32((l->keyevent + i)->keychar, rest, p, data_s->byte_swap);
> > >  	GET32((l->keyevent + i)->modifier, rest, p, data_s->byte_swap);
> > >  	GET32((l->keyevent + i)->time_stamp, rest, p, data_s->byte_swap);
> > > -	GET32((l->keyevent + i)->keytype, rest, p, data_s->byte_swap);
> > >      }
> > >  
> > >      /* This failed for the scenario of having multiple HOTKEYS and each
> > > Index: iiimgcf/ChangeLog
> > > ===================================================================
> > > --- iiimgcf/ChangeLog	(revision 2747)
> > > +++ iiimgcf/ChangeLog	(revision 2748)
> > > @@ -1,3 +1,8 @@
> > > +2005-07-08  AShiZaWa KaZuNoRi  <[email protected]>
> > > +
> > > +	* IIIMGdkEventKey.c (convert_GdkEventKey_to_IIIMCF_keyevent):
> > > +	remove keytype for key release
> > > +
> > >  2005-06-30  Federic Zhang <[email protected]>
> > >  
> > >  	Enable Input Method Engine (IME) switching and display IME list in the language submenu of GIMLET.
> > > Index: iiimgcf/IIIMGdkEventKey.c
> > > ===================================================================
> > > --- iiimgcf/IIIMGdkEventKey.c	(revision 2747)
> > > +++ iiimgcf/IIIMGdkEventKey.c	(revision 2748)
> > > @@ -817,8 +817,9 @@
> > >  {
> > >    int c;
> > >    guint keyval;
> > > +  int key_release;
> > >  
> > > -  pkev->keytype = e->type == GDK_KEY_PRESS;
> > > +  key_release = ((e->type == GDK_KEY_PRESS) ? 0 : 0x80000000);
> > >  
> > >  #if	USE_KANA_TABLE
> > >    gint kanaflag;
> > > @@ -844,7 +845,7 @@
> > >                    pkev->keychar = kana_shift_keymapTable[i].iiimf_keychar;
> > >                    if (pkev->keycode)
> > >                      {
> > > -                      pkev->modifier = modifier (e->state);
> > > +                      pkev->modifier = (modifier (e->state) | key_release);
> > >                        pkev->time_stamp = e->time;
> > >                        return IIIMF_STATUS_SUCCESS;
> > >                      }
> > > @@ -861,7 +862,7 @@
> > >                pkev->keychar = kana_normal_keymapTable[i].iiimf_keychar;
> > >                if (pkev->keycode)
> > >                  {
> > > -                  pkev->modifier = modifier (e->state);
> > > +                  pkev->modifier = (modifier (e->state) | key_release);
> > >                    pkev->time_stamp = e->time;
> > >                    return IIIMF_STATUS_SUCCESS;
> > >                  }
> > > @@ -877,7 +878,7 @@
> > >                pkev->keychar = kana_shift_keymapTable[i].iiimf_keychar;
> > >                if (pkev->keycode)
> > >                  {
> > > -                  pkev->modifier = modifier (e->state);
> > > +                  pkev->modifier = (modifier (e->state) | key_release);
> > >                    pkev->time_stamp = e->time;
> > >                    return IIIMF_STATUS_SUCCESS;
> > >                  }
> > > @@ -895,7 +896,7 @@
> > >                pkev->keychar = kana_normal_keymapTable[i].iiimf_keychar;
> > >                if (pkev->keycode)
> > >                  {
> > > -                  pkev->modifier = modifier (e->state);
> > > +                  pkev->modifier = (modifier (e->state) | key_release);
> > >                    pkev->time_stamp = e->time;
> > >                    return IIIMF_STATUS_SUCCESS;
> > >                  }
> > > @@ -911,7 +912,7 @@
> > >                pkev->keychar = kana_normal_keymapTable[i].iiimf_keychar;
> > >                if (pkev->keycode)
> > >                  {
> > > -                  pkev->modifier = modifier (e->state);
> > > +                  pkev->modifier = (modifier (e->state) | key_release);
> > >                    pkev->time_stamp = e->time;
> > >                    return IIIMF_STATUS_SUCCESS;
> > >                  }
> > > @@ -958,7 +959,7 @@
> > >        pkev->keychar = gdk_keyval_to_unicode (e->keyval);
> > >        pkev->keycode = c;
> > >      }
> > > -  pkev->modifier = modifier (e->state);
> > > +  pkev->modifier = (modifier (e->state) | key_release);
> > >  
> > >    pkev->time_stamp = e->time;