windowshandler.py (5600B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\services\ime\windowshandler.py 2 import uthread 3 import trinity 4 from carbonui.services.ime.basehandler import BaseImeHandler 5 import carbonui.const as uiconst 6 from carbonui.uicore import uicore 7 from windowsutilities import windowsEvents 8 GCS_COMPSTR = 8 9 GCS_CURSORPOS = 128 10 GCS_RESULTSTR = 2048 11 NI_CLOSECANDIDATE = 17 12 NI_COMPOSITIONSTR = 21 13 CPS_CANCEL = 4 14 LANG_KOREAN = 18 15 16 class WindowsImeHandler(BaseImeHandler): 17 18 def __init__(self): 19 super(WindowsImeHandler, self).__init__() 20 self.currentLanguage = None 21 self._otherMessageProc = trinity.app.onWindowsMessage 22 self._otherFilter = trinity.app.GetWindowsMessageFilter() 23 messages = [windowsEvents.WM_ACTIVATEAPP, 24 windowsEvents.WM_INPUTLANGCHANGE, 25 windowsEvents.WM_IME_SETCONTEXT, 26 windowsEvents.WM_IME_STARTCOMPOSITION, 27 windowsEvents.WM_IME_COMPOSITION, 28 windowsEvents.WM_IME_ENDCOMPOSITION] 29 trinity.app.onWindowsMessage = self._OnWindowsMessage 30 trinity.app.SetWindowsMessageFilter(self._otherFilter[0], self._otherFilter[1] + messages) 31 self.ime.SetHWND(trinity.app.GetHwndAsLong()) 32 self._SetLanguage(self.ime.GetKeyboardLayout()) 33 34 def __del__(self): 35 super(WindowsImeHandler, self).__del__() 36 trinity.app.onWindowsMessage = self._otherMessageProc 37 trinity.app.SetWindowsMessageFilter(*self._otherFilter) 38 39 def _SetImeState(self, enable): 40 really_enable = super(WindowsImeHandler, self)._SetImeState(enable) 41 self.ime.AssociateContext(really_enable) 42 43 def _OnWindowsMessage(self, msg, wParam, lParam): 44 with uthread.BlockTrapSection(): 45 if msg == windowsEvents.WM_ACTIVATEAPP: 46 returnValue = self._OnActivateApp(wParam, lParam) 47 elif msg == windowsEvents.WM_INPUTLANGCHANGE: 48 returnValue = self._OnLanguageChange(wParam, lParam) 49 elif msg == windowsEvents.WM_IME_SETCONTEXT: 50 returnValue = self._OnSetContext(wParam, lParam) 51 elif msg == windowsEvents.WM_IME_STARTCOMPOSITION: 52 returnValue = self._OnStartComposition(wParam, lParam) 53 elif msg == windowsEvents.WM_IME_COMPOSITION: 54 returnValue = self._OnComposition(wParam, lParam) 55 elif msg == windowsEvents.WM_IME_ENDCOMPOSITION: 56 returnValue = self._OnEndComposition(wParam, lParam) 57 else: 58 if self._otherMessageProc: 59 return self._otherMessageProc(msg, wParam, lParam) 60 returnValue = None 61 if returnValue is None: 62 return (0, False) 63 else: 64 return (returnValue, True) 65 66 def _OnActivateApp(self, wp, lp): 67 self._SetImeState(wp) 68 return True 69 70 def _OnLanguageChange(self, wp, lp): 71 self.ime.SetHWND(trinity.app.GetHwndAsLong()) 72 self._SetLanguage(lp) 73 return True 74 75 def _OnSetContext(self, wp, lp): 76 return True 77 78 def _OnStartComposition(self, wp, lp): 79 self._ResetCompositionString() 80 return True 81 82 def _OnComposition(self, wp, lp): 83 if lp & GCS_CURSORPOS != 0: 84 self.compositionCaretPosition = max(0, self.ime.GetCursorPos()) 85 if lp & GCS_RESULTSTR != 0: 86 result = self.ime.GetCompositionString(GCS_RESULTSTR) 87 self._TruncateCompositionString(len(result)) 88 self.compositionString = result 89 self._SendCompositionString() 90 self._ResetCompositionString() 91 self._ShowCompositionWindow() 92 if lp & GCS_COMPSTR != 0: 93 result = self.ime.GetCompositionString(GCS_COMPSTR) 94 self._TruncateCompositionString(len(result)) 95 self.compositionString = result 96 if self._CheckFocusWidget() and self.insertOnType: 97 self._SendCompositionString() 98 nCount = len(self.compositionString) - self.compositionCaretPosition 99 _, handler = self.currentFocusWidget.FindEventHandler('OnKeyDown') 100 if handler: 101 for i in xrange(nCount): 102 handler(uiconst.VK_LEFT, 0) 103 104 self._ShowCompositionWindow() 105 return True 106 107 def _OnEndComposition(self, wp, lp): 108 if uicore.uilib.Key(uiconst.VK_RETURN): 109 uicore.registry.BlockConfirm() 110 self._TruncateCompositionString() 111 self._ResetCompositionString() 112 self._HideCompositionWindow() 113 return True 114 115 def _SplitLangIdentifier(self, code): 116 code = code & 2147483647 117 if code & 1073676288: 118 code = (code & 1073676288) >> 16 119 primaryLanguage = code & 1023 120 subLanguage = (code & 64512) >> 10 121 return (primaryLanguage, subLanguage) 122 123 def _SetLanguage(self, code): 124 self.currentLanguage, _ = self._SplitLangIdentifier(code) 125 self.insertOnType = self.currentLanguage == LANG_KOREAN 126 127 def _FinalizeCompositionString(self): 128 super(WindowsImeHandler, self)._FinalizeCompositionString() 129 self._ImmNotifyIME(NI_COMPOSITIONSTR, CPS_CANCEL, 0) 130 self._ImmNotifyIME(NI_CLOSECANDIDATE, 0, 0) 131 132 def _ImmNotifyIME(self, action, index, value): 133 self.ime.NotifyIME(action, index, value) 134 135 def _SimulateHotKey(self, hotkey): 136 return self.ime.SimulateHotKey(hotkey) 137 138 def _GetOpenStatus(self): 139 return self.ime.GetOpenStatus() 140 141 def _SetOpenStatus(self, open): 142 return self.ime.SetOpenStatus(open)