@@ -197,10 +197,6 @@ func (s *Server) handleKeyEvent(payload []byte, clientID int) []byte {
197197 case ResponseTypeClearComposition :
198198 return s .codec .EncodeClearComposition ()
199199
200- case ResponseTypeModeChanged :
201- s .logger .Debug ("Returning ModeChanged response" , "clientID" , clientID , "chineseMode" , result .ChineseMode )
202- return s .codec .EncodeModeChanged (result .ChineseMode )
203-
204200 case ResponseTypeStatusUpdate :
205201 // 模式切换走这条:自包含 iconLabel,C++ 端 StatusUpdate handler 立刻
206202 // UpdateFullStatus → 刷新任务栏图标,不依赖 push pipe。
@@ -349,40 +345,53 @@ func (s *Server) handleCommitRequest(payload []byte, clientID int) []byte {
349345func (s * Server ) handleToggleMode (clientID int ) []byte {
350346 s .logger .Info ("Toggle mode request from UI" , "clientID" , clientID )
351347
352- // Call handler to toggle mode
353- commitText , chineseMode := s .handler .HandleToggleMode ()
348+ // 统一架构:Go 决定最终状态后以 StatusUpdate 回应,C++ 端走 UpdateFullStatus
349+ // 一并同步内部 mirror + TSF compartments + LangBar UI。
350+ status , commitText := s .handler .HandleToggleMode ()
354351
355352 s .logger .Debug ("Toggle mode result" , "clientID" , clientID ,
356- "chineseMode " , chineseMode , "commitText " , commitText )
353+ "hasCommit " , commitText != "" , "hasStatus " , status != nil )
357354
358- // Return ModeChanged response (with optional commit text if there was pending input)
355+ // commitText 路径仍走 CommitText(带 ModeChanged bit);后续 push pipe 会推送
356+ // 完整 status,C++ 端 LangBar 一致性由 push 路径保障。
359357 if commitText != "" {
358+ chineseMode := false
359+ if status != nil {
360+ chineseMode = status .ChineseMode
361+ }
360362 return s .codec .EncodeCommitText (commitText , "" , true , chineseMode , false )
361363 }
362- return s .codec .EncodeModeChanged (chineseMode )
364+ if status == nil {
365+ return s .codec .EncodeAck ()
366+ }
367+ return s .encodeStatusUpdate (status )
363368}
364369
365370func (s * Server ) handleSystemModeSwitch (payload []byte , clientID int ) []byte {
366371 if len (payload ) < 4 {
367372 s .logger .Error ("System mode switch payload too short" , "clientID" , clientID )
368- return s .codec .EncodeModeChanged ( false )
373+ return s .codec .EncodeAck ( )
369374 }
370375
371- // Parse flags (same format as StatusFlags)
376+ // Parse flags (same format as StatusFlags). 注意:这是系统已经决定好的目标模式,
377+ // Go 必须 follow 而非 toggle。
372378 flags := binary .LittleEndian .Uint32 (payload [0 :4 ])
373379 chineseMode := (flags & ipc .StatusChineseMode ) != 0
374380
375381 s .logger .Info ("System mode switch" , "clientID" , clientID , "targetMode" , chineseMode )
376382
377- commitText := s .handler .HandleSystemModeSwitch (chineseMode )
383+ status , commitText := s .handler .HandleSystemModeSwitch (chineseMode )
378384
379385 s .logger .Debug ("System mode switch result" , "clientID" , clientID ,
380- "chineseMode" , chineseMode , "commitText " , commitText )
386+ "chineseMode" , chineseMode , "hasCommit " , commitText != "" )
381387
382388 if commitText != "" {
383389 return s .codec .EncodeCommitText (commitText , "" , true , chineseMode , false )
384390 }
385- return s .codec .EncodeModeChanged (chineseMode )
391+ if status == nil {
392+ return s .codec .EncodeAck ()
393+ }
394+ return s .encodeStatusUpdate (status )
386395}
387396
388397func (s * Server ) handleMenuCommand (payload []byte , clientID int ) []byte {
0 commit comments