NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)