You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
320 lines
7.9 KiB
320 lines
7.9 KiB
//
|
|
// immxutil.h
|
|
//
|
|
|
|
|
|
#ifndef TFMXUTIL_H
|
|
#define TFMXUTIL_H
|
|
|
|
typedef struct tag_LIBTHREAD
|
|
{
|
|
ITfCategoryMgr *_pcat;
|
|
ITfDisplayAttributeMgr *_pDAM;
|
|
} LIBTHREAD;
|
|
|
|
BOOL TFInitLib(void);
|
|
void TFUninitLib(void);
|
|
|
|
//
|
|
// TFUninitThread should not be called in DllMain(THREAD_DETACH).
|
|
// Because this calls COM.
|
|
//
|
|
void TFUninitLib_Thread(LIBTHREAD *plt);
|
|
|
|
//
|
|
// call ntldr function for determin DLL_PROCESS_DETACH.
|
|
//
|
|
BOOL DllShutdownInProgress();
|
|
|
|
DWORD AsciiToNum( char *pszAscii);
|
|
BOOL AsciiToNumDec(char *pszAscii, DWORD *pdw);
|
|
DWORD WToNum( WCHAR *psz);
|
|
void NumToW(DWORD dw, WCHAR *psz);
|
|
void NumToA(DWORD dw, char *psz);
|
|
BOOL GetTopIC(ITfDocumentMgr *pdim, ITfContext **ppic);
|
|
int CompareGUIDs(REFGUID guid1, REFGUID guid2);
|
|
BOOL IsDisabledTextServices(void);
|
|
BOOL NoTipsInstalled(BOOL *pfOnlyTranslationRunning);
|
|
BOOL RunningOnWow64();
|
|
HKL GetSystemDefaultHKL();
|
|
BOOL IsDisabledCUAS();
|
|
void SetDisableCUAS(BOOL bDisableCUAS);
|
|
void RebootTheSystem();
|
|
BOOL IsAdminPrivilege();
|
|
BOOL IsInteractiveUserLogon();
|
|
BOOL FullPathExec( LPCSTR pszAppName, LPCSTR pszCmdLine, WORD wShowWindow, BOOL fWinDir);
|
|
BOOL RunCPLSetting(LPTSTR pCmdLine);
|
|
|
|
#define CR_ERROR 0xffffffff
|
|
#define CR_EQUAL 0x00000000
|
|
#define CR_RIGHTMEET 0x00000001
|
|
#define CR_RIGHT 0x00010001
|
|
#define CR_LEFTMEET 0x00000002
|
|
#define CR_LEFT 0x00010002
|
|
#define CR_PARTIAL 0x00000003
|
|
#define CR_INCLUSION 0x00000004
|
|
|
|
inline ITfContextView *GetActiveView(ITfDocumentMgr *dim)
|
|
{
|
|
ITfContext *pic;
|
|
ITfContextView *pView = NULL;
|
|
|
|
if (dim->GetTop(&pic) == S_OK)
|
|
{
|
|
pic->GetActiveView(&pView);
|
|
pic->Release();
|
|
}
|
|
|
|
return pView;
|
|
}
|
|
|
|
BOOL IsActiveView(ITfContext *pic, ITfContextView *pView);
|
|
|
|
HRESULT GetTextExtInActiveView(TfEditCookie ec, ITfRange *pRange, RECT *prc, BOOL *pfClipped);
|
|
|
|
int CompareRanges(TfEditCookie ec, ITfRange *pRangeSrc, ITfRange *pRangeCmp);
|
|
|
|
LONG AdjustAnchor(LONG ichAdjStart, LONG ichAdjEnd, LONG cchNew, LONG ichAnchor, BOOL fGravityRight);
|
|
|
|
#ifdef __cplusplus // "C" files can't handle "inline"
|
|
|
|
inline LONG CompareAnchors(IAnchor *pa1, IAnchor *pa2)
|
|
{
|
|
LONG l;
|
|
|
|
return FAILED(pa1->Compare(pa2, &l)) ? 0 : l;
|
|
}
|
|
|
|
inline BOOL IsEqualAnchor(IAnchor *pa1, IAnchor *pa2)
|
|
{
|
|
BOOL fEqual;
|
|
|
|
if (pa1->IsEqual(pa2, &fEqual) != S_OK)
|
|
{
|
|
Assert(0);
|
|
// arbitrary: failure == not equal
|
|
fEqual = FALSE;
|
|
}
|
|
|
|
return fEqual;
|
|
}
|
|
|
|
BOOL ShiftToOrClone(IAnchor **ppaDst, IAnchor *paSrc);
|
|
|
|
inline HRESULT GetService(IUnknown *punkProvider, REFIID refiid, IUnknown **ppunk)
|
|
{
|
|
return punkProvider->QueryInterface(refiid, (void **)ppunk);
|
|
}
|
|
|
|
//
|
|
// GetSelectionSimple
|
|
//
|
|
// wrapper for GetSelection that throws out all style info, and ignores disjoint selections
|
|
//
|
|
inline HRESULT GetSelectionSimple(TfEditCookie ec, ITfContext *pic, ITfRange **ppSel)
|
|
{
|
|
TF_SELECTION sel;
|
|
ULONG cFetched;
|
|
HRESULT hr;
|
|
|
|
Assert(pic != NULL);
|
|
Assert(ppSel != NULL);
|
|
|
|
hr = pic->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &sel, &cFetched);
|
|
|
|
Assert(hr != S_OK || sel.range != NULL);
|
|
|
|
*ppSel = NULL;
|
|
if (hr == S_OK && cFetched > 0)
|
|
{
|
|
*ppSel = sel.range; // caller must Release
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// SetSelectionSimple
|
|
//
|
|
// Wrapper for SetSelection that takes only a single range and sets default style values.
|
|
//
|
|
inline HRESULT SetSelectionSimple(TfEditCookie ec, ITfContext *pic, ITfRange *range)
|
|
{
|
|
TF_SELECTION sel;
|
|
|
|
sel.range = range;
|
|
sel.style.ase = TF_AE_NONE;
|
|
sel.style.fInterimChar = FALSE;
|
|
|
|
return pic->SetSelection(ec, 1, &sel);
|
|
}
|
|
|
|
inline BOOL GetCurrentPos(IStream *pStream, LARGE_INTEGER *pli)
|
|
{
|
|
LARGE_INTEGER li;
|
|
|
|
li.QuadPart = 0;
|
|
|
|
return pStream->Seek(li, STREAM_SEEK_CUR, (ULARGE_INTEGER *)pli) == S_OK;
|
|
}
|
|
|
|
#endif // __cplusplus
|
|
|
|
HRESULT GetRangeForWholeDoc(TfEditCookie ec, ITfContext *pic, ITfRange **pprange);
|
|
|
|
#include "proputil.h"
|
|
|
|
#define LoadSmIcon(hinst, psz) (HICON)LoadImage(hinst, psz, IMAGE_ICON, 16,16, 0)
|
|
|
|
// NB: this is going away once we cleanup/separate the private/public libs
|
|
typedef HRESULT (STDAPICALLTYPE * PFNCOCREATE)(REFCLSID rclsid, LPUNKNOWN punkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);
|
|
BOOL TFInitLib_PrivateForCiceroOnly(PFNCOCREATE pfnCoCreate);
|
|
|
|
|
|
HMODULE GetSystemModuleHandle(LPCSTR lpModuleName);
|
|
HMODULE LoadSystemLibrary(LPCSTR lpModuleName);
|
|
HMODULE LoadSystemLibraryEx(LPCSTR lpModuleName, HANDLE hFile, DWORD dwFlags);
|
|
HMODULE GetSystemModuleHandleW(LPCWSTR lpModuleName);
|
|
HMODULE LoadSystemLibraryW(LPCWSTR lpModuleName);
|
|
HMODULE LoadSystemLibraryExW(LPCWSTR lpModuleName, HANDLE hFile, DWORD dwFlags);
|
|
|
|
|
|
#ifndef ARRAYSIZE
|
|
#define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))
|
|
#endif
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CicSystemModulePath
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CicSystemModulePath
|
|
{
|
|
public:
|
|
CicSystemModulePath()
|
|
{
|
|
m_szPath[0] = '\0';
|
|
m_uRet = 0;
|
|
}
|
|
|
|
UINT Init(LPCSTR lpModuleName, BOOL fWinDir = FALSE)
|
|
{
|
|
if (fWinDir)
|
|
m_uRet = GetSystemWindowsDirectoryA(m_szPath, ARRAYSIZE(m_szPath));
|
|
else
|
|
m_uRet = GetSystemDirectoryA(m_szPath, ARRAYSIZE(m_szPath));
|
|
|
|
if (m_uRet >= ARRAYSIZE(m_szPath))
|
|
{
|
|
m_uRet = 0;
|
|
m_szPath[0] = '\0';
|
|
}
|
|
else if (m_uRet)
|
|
{
|
|
if (m_szPath[m_uRet - 1] != '\\')
|
|
{
|
|
m_szPath[m_uRet] = '\\';
|
|
m_uRet++;
|
|
}
|
|
|
|
UINT uLength = lstrlenA(lpModuleName);
|
|
if (ARRAYSIZE(m_szPath) - m_uRet > uLength)
|
|
{
|
|
lstrcpynA(&m_szPath[m_uRet],
|
|
lpModuleName,
|
|
ARRAYSIZE(m_szPath) - m_uRet);
|
|
m_uRet += uLength;
|
|
}
|
|
else
|
|
{
|
|
m_uRet = 0;
|
|
m_szPath[0] = '\0';
|
|
}
|
|
}
|
|
return m_uRet;
|
|
}
|
|
|
|
LPSTR GetPath()
|
|
{
|
|
return m_szPath;
|
|
}
|
|
|
|
UINT GetLength()
|
|
{
|
|
return m_uRet;
|
|
}
|
|
|
|
private:
|
|
char m_szPath[MAX_PATH + 1];
|
|
UINT m_uRet;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CicSystemModulePathW
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CicSystemModulePathW
|
|
{
|
|
public:
|
|
CicSystemModulePathW()
|
|
{
|
|
m_szPath[0] = L'\0';
|
|
m_uRet = 0;
|
|
}
|
|
|
|
UINT Init(LPCWSTR lpModuleName, BOOL fWinDir = FALSE)
|
|
{
|
|
if (fWinDir)
|
|
m_uRet = GetSystemWindowsDirectoryW(m_szPath, ARRAYSIZE(m_szPath));
|
|
else
|
|
m_uRet = GetSystemDirectoryW(m_szPath, ARRAYSIZE(m_szPath));
|
|
|
|
if (m_uRet >= ARRAYSIZE(m_szPath))
|
|
{
|
|
m_uRet = 0;
|
|
m_szPath[0] = L'\0';
|
|
}
|
|
else if (m_uRet)
|
|
{
|
|
if (m_szPath[m_uRet - 1] != L'\\')
|
|
{
|
|
m_szPath[m_uRet] = L'\\';
|
|
m_uRet++;
|
|
}
|
|
|
|
UINT uLength = lstrlenW(lpModuleName);
|
|
if (ARRAYSIZE(m_szPath) - m_uRet > uLength)
|
|
{
|
|
wcsncpy(&m_szPath[m_uRet],
|
|
lpModuleName,
|
|
ARRAYSIZE(m_szPath) - m_uRet);
|
|
m_uRet += uLength;
|
|
}
|
|
else
|
|
{
|
|
m_uRet = 0;
|
|
m_szPath[0] = L'\0';
|
|
}
|
|
}
|
|
return m_uRet;
|
|
}
|
|
|
|
LPWSTR GetPath()
|
|
{
|
|
return m_szPath;
|
|
}
|
|
|
|
UINT GetLength()
|
|
{
|
|
return m_uRet;
|
|
}
|
|
|
|
private:
|
|
WCHAR m_szPath[MAX_PATH + 1];
|
|
UINT m_uRet;
|
|
};
|
|
|
|
#endif // TFMXUTIL_H
|