@@ -836,11 +836,17 @@ void xcb_im_destroy(xcb_im_t *im) {
836836
837837void xcb_im_forward_event (xcb_im_t * im , xcb_im_input_context_t * ic ,
838838 xcb_key_press_event_t * event ) {
839+ xcb_im_forward_event_full (im , ic , ic -> forward_event_sequence , event );
840+ }
841+
842+ void xcb_im_forward_event_full (xcb_im_t * im , xcb_im_input_context_t * ic ,
843+ uint16_t sequence ,
844+ xcb_key_press_event_t * event ) {
839845 xcb_im_client_t * client = ic -> client ;
840846 xcb_im_forward_event_fr_t frame ;
841847 frame .input_method_ID = ic -> client -> connect_id ;
842848 frame .input_context_ID = ic -> id ;
843- frame .sequence_number = event -> sequence ;
849+ frame .sequence_number = sequence ;
844850 if (im -> use_sync_mode ) {
845851 frame .flag = XCB_XIM_SYNCHRONOUS ;
846852 client -> sync = true;
@@ -891,22 +897,19 @@ void xcb_im_commit_string(xcb_im_t *im, xcb_im_input_context_t *ic,
891897}
892898
893899void xcb_im_preedit_start (xcb_im_t * im , xcb_im_input_context_t * ic ) {
894- if (im -> onKeys . nKeys == 0 && im -> offKeys . nKeys == 0 ) {
900+ if (! _xcb_im_has_trigger_key ( im ) ) {
895901 return ;
896902 }
897903
898- uint32_t sync_event_mask = im -> use_sync_event ? 0 : im -> event_mask ;
899- sync_event_mask = ~sync_event_mask ;
900- _xcb_im_set_event_mask (im , ic -> client , ic -> id , im -> event_mask ,
901- sync_event_mask );
904+ _xcb_im_set_ic_event_mask (im , ic );
902905}
903906
904907void xcb_im_preedit_end (xcb_im_t * im , xcb_im_input_context_t * ic ) {
905- if (im -> onKeys . nKeys == 0 && im -> offKeys . nKeys == 0 ) {
908+ if (! _xcb_im_has_trigger_key ( im ) ) {
906909 return ;
907910 }
908911
909- _xcb_im_set_event_mask (im , ic -> client , ic -> id , 0 , 0 );
912+ _xcb_im_send_set_event_mask (im , ic -> client , ic -> id , 0 , 0 );
910913}
911914
912915void xcb_im_sync_xlib (xcb_im_t * im , xcb_im_input_context_t * ic ) {
@@ -1019,9 +1022,9 @@ void _xcb_im_destroy_client(xcb_im_t *im, xcb_im_client_t *client) {
10191022 im -> free_list = client ;
10201023}
10211024
1022- void _xcb_im_set_event_mask (xcb_im_t * im , xcb_im_client_t * client ,
1023- uint32_t icid , uint32_t forward_event_mask ,
1024- uint32_t sync_mask ) {
1025+ void _xcb_im_send_set_event_mask (xcb_im_t * im , xcb_im_client_t * client ,
1026+ uint32_t icid , uint32_t forward_event_mask ,
1027+ uint32_t sync_mask ) {
10251028 xcb_im_set_event_mask_fr_t frame ;
10261029 frame .forward_event_mask = forward_event_mask ;
10271030 frame .synchronous_event_mask = sync_mask ;
@@ -1169,6 +1172,22 @@ bool xcb_im_support_extension(xcb_im_t *im, uint16_t major_code,
11691172 return false;
11701173}
11711174
1175+ void _xcb_im_set_ic_event_mask (xcb_im_t * im , xcb_im_input_context_t * ic ) {
1176+ DebugLog ("xcb_im_set_ic_event_mask" );
1177+ uint32_t sync_event_mask = im -> use_sync_event ? 0 : im -> event_mask ;
1178+ sync_event_mask = ~sync_event_mask ;
1179+ _xcb_im_send_set_event_mask (im , ic -> client , ic -> id , im -> event_mask ,
1180+ sync_event_mask );
1181+ }
1182+
1183+ void _xcb_im_set_im_event_mask (xcb_im_t * im , xcb_im_client_t * client ) {
1184+ DebugLog ("xcb_im_set_im_event_mask" );
1185+ uint32_t sync_event_mask = im -> use_sync_event ? 0 : im -> event_mask ;
1186+ sync_event_mask = ~sync_event_mask ;
1187+ // Zero id means set im forward mask.
1188+ _xcb_im_send_set_event_mask (im , client , 0 , im -> event_mask , sync_event_mask );
1189+ }
1190+
11721191void xcb_im_input_context_set_data (xcb_im_input_context_t * ic , void * data ,
11731192 xcb_im_free_function free_data_function ) {
11741193 if (ic -> free_data_function ) {
0 commit comments