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

Federic Zhang <[email protected]> Mon, 11 Jul 2005 13:41:17 +0800
Newsgroups gmane.comp.internationalization.input-methods
Message-ID <[email protected]>
Kasha,

Note capability has been added in IMATTRIBUTE, but you didn't export the
capability info to client framework. I just try to export with one patch
that hasn't been tested yet. Please review, update and commit if you
think it is good.

As IIIMCF_handle_rec is one opaque struct, probably new APIs should be
provided for various client framework such gcf and xcf etc to access
them.

In my opinion, the capability value set in IIIMP_IMState.cpp should
depend on whether the current LE has interest in KEY release. If the LE
doesn't support it, client via gcf or xcf doesn't need to send Key
Release Event to server, then the number of key event message exchanged
between client and server can be reduced. Do you think the logic is
good?

-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;
>
iiim-cf-capability.diff (text/x-patch, 1.5 KB)
Index: lib/iiimcf/iiimcf.c
===================================================================
--- lib/iiimcf/iiimcf.c	(revision 2750)
+++ lib/iiimcf/iiimcf.c	(working copy)
@@ -329,6 +329,28 @@
 }
 
 static IIIMF_status
+iiimcf_register_capability_list(
+    IIIMCF_handle_rec *ph,
+    IIIMP_card32_list *capability
+)
+{
+    int i;
+
+    for (i = 0; i < capability->count; ++i)
+      {
+	IIIMP_card32 p = *(capability->ptr + i);
+
+	if (p & IIIMP_CAPABILITY_KEY_RELEASE)
+	  ph->support_key_release = True;
+
+	if (p & IIIMP_CAPABILITY_FILE_OPERATION)
+	  ph->support_file_operation = True;
+      }
+
+    return IIIMF_STATUS_SUCCESS;
+}
+
+static IIIMF_status
 iiimcf_register_object_descriptor_list(
     IIIMCF_handle_rec *ph,
     IIIMP_object_descriptor *piiimp_objdesc
@@ -411,6 +433,9 @@
 	   st = iiimcf_register_object_descriptor_list(ph, pimattrs->value.object_descriptor);
 	   if (st != IIIMF_STATUS_SUCCESS) return st;
 	   break;
+	  case IIIMP_IMATTRIBUTE_CAPABILITY:
+	   st = iiimcf_register_capability_list (ph, pimattrs->value.capability);
+	   if (st != IIIMF_STATUS_SUCCESS) return st;
 
 	  default:
 	   /* simply ignore */
Index: lib/iiimcf/iiimcfint.h
===================================================================
--- lib/iiimcf/iiimcfint.h	(revision 2750)
+++ lib/iiimcf/iiimcfint.h	(working copy)
@@ -118,6 +118,9 @@
     THREAD_ID_OBJECT thread_owner_id;
     int thread_lock_count;
 #endif
+
+     Bool support_key_release;
+     Bool support_file_operation;
 };
 
 enum IIIMCF_CONTEXT_STATE_FLAGS {