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

AShiZaWa KaZuNoRi <[email protected]> Mon, 11 Jul 2005 14:04:07 +0900
Newsgroups gmane.comp.internationalization.input-methods
Message-ID <[email protected]>
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;