Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentxthost.c
Go to the documentation of this file.
00001 /* 00002 * RichEdit - ITextHost implementation for windowed richedit controls 00003 * 00004 * Copyright 2009 by Dylan Smith 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #include "config.h" 00022 #include "wine/port.h" 00023 00024 #define NONAMELESSSTRUCT 00025 #define NONAMELESSUNION 00026 #define COBJMACROS 00027 00028 #include "editor.h" 00029 #include "ole2.h" 00030 #include "richole.h" 00031 #include "imm.h" 00032 #include "textserv.h" 00033 #include "wine/debug.h" 00034 #include "editstr.h" 00035 00036 WINE_DEFAULT_DEBUG_CHANNEL(richedit); 00037 00038 typedef struct ITextHostImpl { 00039 ITextHost ITextHost_iface; 00040 LONG ref; 00041 HWND hWnd; 00042 BOOL bEmulateVersion10; 00043 } ITextHostImpl; 00044 00045 static const ITextHostVtbl textHostVtbl; 00046 00047 ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10) 00048 { 00049 ITextHostImpl *texthost; 00050 texthost = CoTaskMemAlloc(sizeof(*texthost)); 00051 if (texthost) 00052 { 00053 ME_TextEditor *editor; 00054 00055 texthost->ITextHost_iface.lpVtbl = &textHostVtbl; 00056 texthost->ref = 1; 00057 texthost->hWnd = hwnd; 00058 texthost->bEmulateVersion10 = bEmulateVersion10; 00059 00060 editor = ME_MakeEditor(&texthost->ITextHost_iface, bEmulateVersion10); 00061 editor->exStyleFlags = GetWindowLongW(hwnd, GWL_EXSTYLE); 00062 editor->styleFlags |= GetWindowLongW(hwnd, GWL_STYLE) & ES_WANTRETURN; 00063 editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */ 00064 editor->hwndParent = cs->hwndParent; 00065 SetWindowLongPtrW(hwnd, 0, (LONG_PTR)editor); 00066 } 00067 00068 return &texthost->ITextHost_iface; 00069 } 00070 00071 static inline ITextHostImpl *impl_from_ITextHost(ITextHost *iface) 00072 { 00073 return CONTAINING_RECORD(iface, ITextHostImpl, ITextHost_iface); 00074 } 00075 00076 static HRESULT WINAPI ITextHostImpl_QueryInterface(ITextHost *iface, REFIID riid, void **ppvObject) 00077 { 00078 ITextHostImpl *This = impl_from_ITextHost(iface); 00079 00080 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_ITextHost)) { 00081 *ppvObject = This; 00082 ITextHost_AddRef((ITextHost *)*ppvObject); 00083 return S_OK; 00084 } 00085 00086 FIXME("Unknown interface: %s\n", debugstr_guid(riid)); 00087 return E_NOINTERFACE; 00088 } 00089 00090 static ULONG WINAPI ITextHostImpl_AddRef(ITextHost *iface) 00091 { 00092 ITextHostImpl *This = impl_from_ITextHost(iface); 00093 ULONG ref = InterlockedIncrement(&This->ref); 00094 return ref; 00095 } 00096 00097 static ULONG WINAPI ITextHostImpl_Release(ITextHost *iface) 00098 { 00099 ITextHostImpl *This = impl_from_ITextHost(iface); 00100 ULONG ref = InterlockedDecrement(&This->ref); 00101 00102 if (!ref) 00103 { 00104 SetWindowLongPtrW(This->hWnd, 0, 0); 00105 CoTaskMemFree(This); 00106 } 00107 return ref; 00108 } 00109 00110 DECLSPEC_HIDDEN HDC WINAPI ITextHostImpl_TxGetDC(ITextHost *iface) 00111 { 00112 ITextHostImpl *This = impl_from_ITextHost(iface); 00113 return GetDC(This->hWnd); 00114 } 00115 00116 DECLSPEC_HIDDEN INT WINAPI ITextHostImpl_TxReleaseDC(ITextHost *iface, HDC hdc) 00117 { 00118 ITextHostImpl *This = impl_from_ITextHost(iface); 00119 return ReleaseDC(This->hWnd, hdc); 00120 } 00121 00122 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxShowScrollBar(ITextHost *iface, INT fnBar, BOOL fShow) 00123 { 00124 ITextHostImpl *This = impl_from_ITextHost(iface); 00125 return ShowScrollBar(This->hWnd, fnBar, fShow); 00126 } 00127 00128 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxEnableScrollBar(ITextHost *iface, INT fuSBFlags, INT fuArrowflags) 00129 { 00130 ITextHostImpl *This = impl_from_ITextHost(iface); 00131 return EnableScrollBar(This->hWnd, fuSBFlags, fuArrowflags); 00132 } 00133 00134 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetScrollRange(ITextHost *iface, INT fnBar, LONG nMinPos, INT nMaxPos, 00135 BOOL fRedraw) 00136 { 00137 ITextHostImpl *This = impl_from_ITextHost(iface); 00138 return SetScrollRange(This->hWnd, fnBar, nMinPos, nMaxPos, fRedraw); 00139 } 00140 00141 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetScrollPos(ITextHost *iface, INT fnBar, INT nPos, BOOL fRedraw) 00142 { 00143 ITextHostImpl *This = impl_from_ITextHost(iface); 00144 int pos = SetScrollPos(This->hWnd, fnBar, nPos, fRedraw); 00145 return (pos ? TRUE : FALSE); 00146 } 00147 00148 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxInvalidateRect(ITextHost *iface, LPCRECT prc, BOOL fMode) 00149 { 00150 ITextHostImpl *This = impl_from_ITextHost(iface); 00151 InvalidateRect(This->hWnd, prc, fMode); 00152 } 00153 00154 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxViewChange(ITextHost *iface, BOOL fUpdate) 00155 { 00156 ITextHostImpl *This = impl_from_ITextHost(iface); 00157 if (fUpdate) 00158 UpdateWindow(This->hWnd); 00159 } 00160 00161 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxCreateCaret(ITextHost *iface, HBITMAP hbmp, INT xWidth, INT yHeight) 00162 { 00163 ITextHostImpl *This = impl_from_ITextHost(iface); 00164 return CreateCaret(This->hWnd, hbmp, xWidth, yHeight); 00165 } 00166 00167 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxShowCaret(ITextHost *iface, BOOL fShow) 00168 { 00169 ITextHostImpl *This = impl_from_ITextHost(iface); 00170 if (fShow) 00171 return ShowCaret(This->hWnd); 00172 else 00173 return HideCaret(This->hWnd); 00174 } 00175 00176 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetCaretPos(ITextHost *iface, 00177 INT x, INT y) 00178 { 00179 return SetCaretPos(x, y); 00180 } 00181 00182 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetTimer(ITextHost *iface, UINT idTimer, UINT uTimeout) 00183 { 00184 ITextHostImpl *This = impl_from_ITextHost(iface); 00185 return SetTimer(This->hWnd, idTimer, uTimeout, NULL) != 0; 00186 } 00187 00188 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxKillTimer(ITextHost *iface, UINT idTimer) 00189 { 00190 ITextHostImpl *This = impl_from_ITextHost(iface); 00191 KillTimer(This->hWnd, idTimer); 00192 } 00193 00194 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxScrollWindowEx(ITextHost *iface, INT dx, INT dy, LPCRECT lprcScroll, 00195 LPCRECT lprcClip, HRGN hRgnUpdate, LPRECT lprcUpdate, 00196 UINT fuScroll) 00197 { 00198 ITextHostImpl *This = impl_from_ITextHost(iface); 00199 ScrollWindowEx(This->hWnd, dx, dy, lprcScroll, lprcClip, 00200 hRgnUpdate, lprcUpdate, fuScroll); 00201 } 00202 00203 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxSetCapture(ITextHost *iface, BOOL fCapture) 00204 { 00205 ITextHostImpl *This = impl_from_ITextHost(iface); 00206 if (fCapture) 00207 SetCapture(This->hWnd); 00208 else 00209 ReleaseCapture(); 00210 } 00211 00212 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxSetFocus(ITextHost *iface) 00213 { 00214 ITextHostImpl *This = impl_from_ITextHost(iface); 00215 SetFocus(This->hWnd); 00216 } 00217 00218 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxSetCursor(ITextHost *iface, 00219 HCURSOR hcur, 00220 BOOL fText) 00221 { 00222 SetCursor(hcur); 00223 } 00224 00225 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxScreenToClient(ITextHost *iface, LPPOINT lppt) 00226 { 00227 ITextHostImpl *This = impl_from_ITextHost(iface); 00228 return ScreenToClient(This->hWnd, lppt); 00229 } 00230 00231 DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxClientToScreen(ITextHost *iface, LPPOINT lppt) 00232 { 00233 ITextHostImpl *This = impl_from_ITextHost(iface); 00234 return ClientToScreen(This->hWnd, lppt); 00235 } 00236 00237 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxActivate(ITextHost *iface, LONG *plOldState) 00238 { 00239 ITextHostImpl *This = impl_from_ITextHost(iface); 00240 *plOldState = HandleToLong(SetActiveWindow(This->hWnd)); 00241 return (*plOldState ? S_OK : E_FAIL); 00242 } 00243 00244 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxDeactivate(ITextHost *iface, 00245 LONG lNewState) 00246 { 00247 HWND ret = SetActiveWindow(LongToHandle(lNewState)); 00248 return (ret ? S_OK : E_FAIL); 00249 } 00250 00251 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetClientRect(ITextHost *iface, LPRECT prc) 00252 { 00253 ITextHostImpl *This = impl_from_ITextHost(iface); 00254 int ret = GetClientRect(This->hWnd, prc); 00255 return (ret ? S_OK : E_FAIL); 00256 } 00257 00258 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetViewInset(ITextHost *iface, 00259 LPRECT prc) 00260 { 00261 prc->top = 0; 00262 prc->left = 0; 00263 prc->bottom = 0; 00264 prc->right = 0; 00265 return S_OK; 00266 } 00267 00268 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetCharFormat(ITextHost *iface, 00269 const CHARFORMATW **ppCF) 00270 { 00271 return E_NOTIMPL; 00272 } 00273 00274 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetParaFormat(ITextHost *iface, 00275 const PARAFORMAT **ppPF) 00276 { 00277 return E_NOTIMPL; 00278 } 00279 00280 DECLSPEC_HIDDEN COLORREF WINAPI ITextHostImpl_TxGetSysColor(ITextHost *iface, 00281 int nIndex) 00282 { 00283 return GetSysColor(nIndex); 00284 } 00285 00286 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetBackStyle(ITextHost *iface, 00287 TXTBACKSTYLE *pStyle) 00288 { 00289 *pStyle = TXTBACK_OPAQUE; 00290 return S_OK; 00291 } 00292 00293 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetMaxLength(ITextHost *iface, 00294 DWORD *pLength) 00295 { 00296 *pLength = INFINITE; 00297 return S_OK; 00298 } 00299 00300 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetScrollBars(ITextHost *iface, DWORD *pdwScrollBar) 00301 { 00302 ITextHostImpl *This = impl_from_ITextHost(iface); 00303 ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0); 00304 const DWORD mask = WS_VSCROLL| 00305 WS_HSCROLL| 00306 ES_AUTOVSCROLL| 00307 ES_AUTOHSCROLL| 00308 ES_DISABLENOSCROLL; 00309 if (editor) 00310 { 00311 *pdwScrollBar = editor->styleFlags & mask; 00312 } else { 00313 DWORD style = GetWindowLongW(This->hWnd, GWL_STYLE); 00314 if (style & WS_VSCROLL) 00315 style |= ES_AUTOVSCROLL; 00316 if (!This->bEmulateVersion10 && (style & WS_HSCROLL)) 00317 style |= ES_AUTOHSCROLL; 00318 *pdwScrollBar = style & mask; 00319 } 00320 return S_OK; 00321 } 00322 00323 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetPasswordChar(ITextHost *iface, 00324 WCHAR *pch) 00325 { 00326 *pch = '*'; 00327 return S_OK; 00328 } 00329 00330 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetAcceleratorPos(ITextHost *iface, 00331 LONG *pch) 00332 { 00333 *pch = -1; 00334 return S_OK; 00335 } 00336 00337 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetExtent(ITextHost *iface, 00338 LPSIZEL lpExtent) 00339 { 00340 return E_NOTIMPL; 00341 } 00342 00343 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_OnTxCharFormatChange(ITextHost *iface, 00344 const CHARFORMATW *pcf) 00345 { 00346 return S_OK; 00347 } 00348 00349 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_OnTxParaFormatChange(ITextHost *iface, 00350 const PARAFORMAT *ppf) 00351 { 00352 return S_OK; 00353 } 00354 00355 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWORD dwMask, DWORD *pdwBits) 00356 { 00357 ITextHostImpl *This = impl_from_ITextHost(iface); 00358 ME_TextEditor *editor = (ME_TextEditor *)GetWindowLongPtrW(This->hWnd, 0); 00359 DWORD style; 00360 DWORD dwBits = 0; 00361 00362 if (editor) 00363 { 00364 style = editor->styleFlags; 00365 if (editor->mode & TM_RICHTEXT) 00366 dwBits |= TXTBIT_RICHTEXT; 00367 if (editor->bWordWrap) 00368 dwBits |= TXTBIT_WORDWRAP; 00369 if (style & ECO_AUTOWORDSELECTION) 00370 dwBits |= TXTBIT_AUTOWORDSEL; 00371 } else { 00372 DWORD dwScrollBar; 00373 00374 style = GetWindowLongW(This->hWnd, GWL_STYLE); 00375 ITextHostImpl_TxGetScrollBars(iface, &dwScrollBar); 00376 00377 dwBits |= TXTBIT_RICHTEXT|TXTBIT_AUTOWORDSEL; 00378 if (!(dwScrollBar & ES_AUTOHSCROLL)) 00379 dwBits |= TXTBIT_WORDWRAP; 00380 } 00381 00382 /* Bits that correspond to window styles. */ 00383 if (style & ES_MULTILINE) 00384 dwBits |= TXTBIT_MULTILINE; 00385 if (style & ES_READONLY) 00386 dwBits |= TXTBIT_READONLY; 00387 if (style & ES_PASSWORD) 00388 dwBits |= TXTBIT_USEPASSWORD; 00389 if (!(style & ES_NOHIDESEL)) 00390 dwBits |= TXTBIT_HIDESELECTION; 00391 if (style & ES_SAVESEL) 00392 dwBits |= TXTBIT_SAVESELECTION; 00393 if (style & ES_VERTICAL) 00394 dwBits |= TXTBIT_VERTICAL; 00395 if (style & ES_NOOLEDRAGDROP) 00396 dwBits |= TXTBIT_DISABLEDRAG; 00397 00398 dwBits |= TXTBIT_ALLOWBEEP; 00399 00400 /* The following bits are always FALSE because they are probably only 00401 * needed for ITextServices_OnTxPropertyBitsChange: 00402 * TXTBIT_VIEWINSETCHANGE 00403 * TXTBIT_BACKSTYLECHANGE 00404 * TXTBIT_MAXLENGTHCHANGE 00405 * TXTBIT_CHARFORMATCHANGE 00406 * TXTBIT_PARAFORMATCHANGE 00407 * TXTBIT_SHOWACCELERATOR 00408 * TXTBIT_EXTENTCHANGE 00409 * TXTBIT_SELBARCHANGE 00410 * TXTBIT_SCROLLBARCHANGE 00411 * TXTBIT_CLIENTRECTCHANGE 00412 * 00413 * Documented by MSDN as not supported: 00414 * TXTBIT_USECURRENTBKG 00415 */ 00416 00417 *pdwBits = dwBits & dwMask; 00418 return S_OK; 00419 } 00420 00421 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface, DWORD iNotify, void *pv) 00422 { 00423 ITextHostImpl *This = impl_from_ITextHost(iface); 00424 ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0); 00425 HWND hwnd = This->hWnd; 00426 UINT id; 00427 00428 if (!editor || !editor->hwndParent) return S_OK; 00429 00430 id = GetWindowLongW(hwnd, GWLP_ID); 00431 00432 switch (iNotify) 00433 { 00434 case EN_DROPFILES: 00435 case EN_LINK: 00436 case EN_OLEOPFAILED: 00437 case EN_PROTECTED: 00438 case EN_REQUESTRESIZE: 00439 case EN_SAVECLIPBOARD: 00440 case EN_SELCHANGE: 00441 case EN_STOPNOUNDO: 00442 { 00443 /* FIXME: Verify this assumption that pv starts with NMHDR. */ 00444 NMHDR *info = pv; 00445 if (!info) 00446 return E_FAIL; 00447 00448 info->hwndFrom = hwnd; 00449 info->idFrom = id; 00450 info->code = iNotify; 00451 SendMessageW(editor->hwndParent, WM_NOTIFY, id, (LPARAM)info); 00452 break; 00453 } 00454 00455 case EN_UPDATE: 00456 /* Only sent when the window is visible. */ 00457 if (!IsWindowVisible(hwnd)) 00458 break; 00459 /* Fall through */ 00460 case EN_CHANGE: 00461 case EN_ERRSPACE: 00462 case EN_HSCROLL: 00463 case EN_KILLFOCUS: 00464 case EN_MAXTEXT: 00465 case EN_SETFOCUS: 00466 case EN_VSCROLL: 00467 SendMessageW(editor->hwndParent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd); 00468 break; 00469 00470 case EN_MSGFILTER: 00471 FIXME("EN_MSGFILTER is documented as not being sent to TxNotify\n"); 00472 /* fall through */ 00473 default: 00474 return E_FAIL; 00475 } 00476 return S_OK; 00477 } 00478 00479 DECLSPEC_HIDDEN HIMC WINAPI ITextHostImpl_TxImmGetContext(ITextHost *iface) 00480 { 00481 ITextHostImpl *This = impl_from_ITextHost(iface); 00482 return ImmGetContext(This->hWnd); 00483 } 00484 00485 DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxImmReleaseContext(ITextHost *iface, HIMC himc) 00486 { 00487 ITextHostImpl *This = impl_from_ITextHost(iface); 00488 ImmReleaseContext(This->hWnd, himc); 00489 } 00490 00491 DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *iface, LONG *lSelBarWidth) 00492 { 00493 ITextHostImpl *This = impl_from_ITextHost(iface); 00494 ME_TextEditor *editor = (ME_TextEditor *)GetWindowLongPtrW(This->hWnd, 0); 00495 00496 DWORD style = editor ? editor->styleFlags 00497 : GetWindowLongW(This->hWnd, GWL_STYLE); 00498 *lSelBarWidth = (style & ES_SELECTIONBAR) ? 225 : 0; /* in HIMETRIC */ 00499 return S_OK; 00500 } 00501 00502 00503 #ifdef __i386__ /* thiscall functions are i386-specific */ 00504 00505 #define THISCALL(func) __thiscall_ ## func 00506 #define DEFINE_THISCALL_WRAPPER(func,args) \ 00507 extern typeof(func) THISCALL(func); \ 00508 __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \ 00509 "popl %eax\n\t" \ 00510 "pushl %ecx\n\t" \ 00511 "pushl %eax\n\t" \ 00512 "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) ) 00513 00514 #else /* __i386__ */ 00515 00516 #define THISCALL(func) func 00517 #define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */ 00518 00519 #endif /* __i386__ */ 00520 00521 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetDC,4) 00522 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxReleaseDC,8) 00523 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowScrollBar,12) 00524 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxEnableScrollBar,12) 00525 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollRange,20) 00526 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollPos,16) 00527 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxInvalidateRect,12) 00528 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxViewChange,8) 00529 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxCreateCaret,16) 00530 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowCaret,8) 00531 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCaretPos,12) 00532 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetTimer,12) 00533 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxKillTimer,8) 00534 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScrollWindowEx,32) 00535 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCapture,8) 00536 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetFocus,4) 00537 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCursor,12) 00538 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScreenToClient,8) 00539 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxClientToScreen,8) 00540 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxActivate,8) 00541 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxDeactivate,8) 00542 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetClientRect,8) 00543 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetViewInset,8) 00544 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetCharFormat,8) 00545 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetParaFormat,8) 00546 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSysColor,8) 00547 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetBackStyle,8) 00548 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetMaxLength,8) 00549 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetScrollBars,8) 00550 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPasswordChar,8) 00551 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetAcceleratorPos,8) 00552 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetExtent,8) 00553 DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxCharFormatChange,8) 00554 DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxParaFormatChange,8) 00555 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPropertyBits,12) 00556 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxNotify,12) 00557 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmGetContext,4) 00558 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmReleaseContext,8) 00559 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth,8) 00560 00561 #ifdef __i386__ /* thiscall functions are i386-specific */ 00562 00563 #define STDCALL(func) __stdcall_ ## func 00564 #define DEFINE_STDCALL_WRAPPER(num,func,args) \ 00565 extern typeof(func) __stdcall_ ## func; \ 00566 __ASM_STDCALL_FUNC(__stdcall_ ## func, args, \ 00567 "popl %eax\n\t" \ 00568 "popl %ecx\n\t" \ 00569 "pushl %eax\n\t" \ 00570 "movl (%ecx), %eax\n\t" \ 00571 "jmp *(4*(" #num "))(%eax)" ) 00572 00573 DEFINE_STDCALL_WRAPPER(3,ITextHostImpl_TxGetDC,4) 00574 DEFINE_STDCALL_WRAPPER(4,ITextHostImpl_TxReleaseDC,8) 00575 DEFINE_STDCALL_WRAPPER(5,ITextHostImpl_TxShowScrollBar,12) 00576 DEFINE_STDCALL_WRAPPER(6,ITextHostImpl_TxEnableScrollBar,12) 00577 DEFINE_STDCALL_WRAPPER(7,ITextHostImpl_TxSetScrollRange,20) 00578 DEFINE_STDCALL_WRAPPER(8,ITextHostImpl_TxSetScrollPos,16) 00579 DEFINE_STDCALL_WRAPPER(9,ITextHostImpl_TxInvalidateRect,12) 00580 DEFINE_STDCALL_WRAPPER(10,ITextHostImpl_TxViewChange,8) 00581 DEFINE_STDCALL_WRAPPER(11,ITextHostImpl_TxCreateCaret,16) 00582 DEFINE_STDCALL_WRAPPER(12,ITextHostImpl_TxShowCaret,8) 00583 DEFINE_STDCALL_WRAPPER(13,ITextHostImpl_TxSetCaretPos,12) 00584 DEFINE_STDCALL_WRAPPER(14,ITextHostImpl_TxSetTimer,12) 00585 DEFINE_STDCALL_WRAPPER(15,ITextHostImpl_TxKillTimer,8) 00586 DEFINE_STDCALL_WRAPPER(16,ITextHostImpl_TxScrollWindowEx,32) 00587 DEFINE_STDCALL_WRAPPER(17,ITextHostImpl_TxSetCapture,8) 00588 DEFINE_STDCALL_WRAPPER(18,ITextHostImpl_TxSetFocus,4) 00589 DEFINE_STDCALL_WRAPPER(19,ITextHostImpl_TxSetCursor,12) 00590 DEFINE_STDCALL_WRAPPER(20,ITextHostImpl_TxScreenToClient,8) 00591 DEFINE_STDCALL_WRAPPER(21,ITextHostImpl_TxClientToScreen,8) 00592 DEFINE_STDCALL_WRAPPER(22,ITextHostImpl_TxActivate,8) 00593 DEFINE_STDCALL_WRAPPER(23,ITextHostImpl_TxDeactivate,8) 00594 DEFINE_STDCALL_WRAPPER(24,ITextHostImpl_TxGetClientRect,8) 00595 DEFINE_STDCALL_WRAPPER(25,ITextHostImpl_TxGetViewInset,8) 00596 DEFINE_STDCALL_WRAPPER(26,ITextHostImpl_TxGetCharFormat,8) 00597 DEFINE_STDCALL_WRAPPER(27,ITextHostImpl_TxGetParaFormat,8) 00598 DEFINE_STDCALL_WRAPPER(28,ITextHostImpl_TxGetSysColor,8) 00599 DEFINE_STDCALL_WRAPPER(29,ITextHostImpl_TxGetBackStyle,8) 00600 DEFINE_STDCALL_WRAPPER(30,ITextHostImpl_TxGetMaxLength,8) 00601 DEFINE_STDCALL_WRAPPER(31,ITextHostImpl_TxGetScrollBars,8) 00602 DEFINE_STDCALL_WRAPPER(32,ITextHostImpl_TxGetPasswordChar,8) 00603 DEFINE_STDCALL_WRAPPER(33,ITextHostImpl_TxGetAcceleratorPos,8) 00604 DEFINE_STDCALL_WRAPPER(34,ITextHostImpl_TxGetExtent,8) 00605 DEFINE_STDCALL_WRAPPER(35,ITextHostImpl_OnTxCharFormatChange,8) 00606 DEFINE_STDCALL_WRAPPER(36,ITextHostImpl_OnTxParaFormatChange,8) 00607 DEFINE_STDCALL_WRAPPER(37,ITextHostImpl_TxGetPropertyBits,12) 00608 DEFINE_STDCALL_WRAPPER(38,ITextHostImpl_TxNotify,12) 00609 DEFINE_STDCALL_WRAPPER(39,ITextHostImpl_TxImmGetContext,4) 00610 DEFINE_STDCALL_WRAPPER(40,ITextHostImpl_TxImmReleaseContext,8) 00611 DEFINE_STDCALL_WRAPPER(41,ITextHostImpl_TxGetSelectionBarWidth,8) 00612 00613 const ITextHostVtbl itextHostStdcallVtbl = { 00614 NULL, 00615 NULL, 00616 NULL, 00617 __stdcall_ITextHostImpl_TxGetDC, 00618 __stdcall_ITextHostImpl_TxReleaseDC, 00619 __stdcall_ITextHostImpl_TxShowScrollBar, 00620 __stdcall_ITextHostImpl_TxEnableScrollBar, 00621 __stdcall_ITextHostImpl_TxSetScrollRange, 00622 __stdcall_ITextHostImpl_TxSetScrollPos, 00623 __stdcall_ITextHostImpl_TxInvalidateRect, 00624 __stdcall_ITextHostImpl_TxViewChange, 00625 __stdcall_ITextHostImpl_TxCreateCaret, 00626 __stdcall_ITextHostImpl_TxShowCaret, 00627 __stdcall_ITextHostImpl_TxSetCaretPos, 00628 __stdcall_ITextHostImpl_TxSetTimer, 00629 __stdcall_ITextHostImpl_TxKillTimer, 00630 __stdcall_ITextHostImpl_TxScrollWindowEx, 00631 __stdcall_ITextHostImpl_TxSetCapture, 00632 __stdcall_ITextHostImpl_TxSetFocus, 00633 __stdcall_ITextHostImpl_TxSetCursor, 00634 __stdcall_ITextHostImpl_TxScreenToClient, 00635 __stdcall_ITextHostImpl_TxClientToScreen, 00636 __stdcall_ITextHostImpl_TxActivate, 00637 __stdcall_ITextHostImpl_TxDeactivate, 00638 __stdcall_ITextHostImpl_TxGetClientRect, 00639 __stdcall_ITextHostImpl_TxGetViewInset, 00640 __stdcall_ITextHostImpl_TxGetCharFormat, 00641 __stdcall_ITextHostImpl_TxGetParaFormat, 00642 __stdcall_ITextHostImpl_TxGetSysColor, 00643 __stdcall_ITextHostImpl_TxGetBackStyle, 00644 __stdcall_ITextHostImpl_TxGetMaxLength, 00645 __stdcall_ITextHostImpl_TxGetScrollBars, 00646 __stdcall_ITextHostImpl_TxGetPasswordChar, 00647 __stdcall_ITextHostImpl_TxGetAcceleratorPos, 00648 __stdcall_ITextHostImpl_TxGetExtent, 00649 __stdcall_ITextHostImpl_OnTxCharFormatChange, 00650 __stdcall_ITextHostImpl_OnTxParaFormatChange, 00651 __stdcall_ITextHostImpl_TxGetPropertyBits, 00652 __stdcall_ITextHostImpl_TxNotify, 00653 __stdcall_ITextHostImpl_TxImmGetContext, 00654 __stdcall_ITextHostImpl_TxImmReleaseContext, 00655 __stdcall_ITextHostImpl_TxGetSelectionBarWidth, 00656 }; 00657 00658 #endif /* __i386__ */ 00659 00660 static const ITextHostVtbl textHostVtbl = { 00661 ITextHostImpl_QueryInterface, 00662 ITextHostImpl_AddRef, 00663 ITextHostImpl_Release, 00664 THISCALL(ITextHostImpl_TxGetDC), 00665 THISCALL(ITextHostImpl_TxReleaseDC), 00666 THISCALL(ITextHostImpl_TxShowScrollBar), 00667 THISCALL(ITextHostImpl_TxEnableScrollBar), 00668 THISCALL(ITextHostImpl_TxSetScrollRange), 00669 THISCALL(ITextHostImpl_TxSetScrollPos), 00670 THISCALL(ITextHostImpl_TxInvalidateRect), 00671 THISCALL(ITextHostImpl_TxViewChange), 00672 THISCALL(ITextHostImpl_TxCreateCaret), 00673 THISCALL(ITextHostImpl_TxShowCaret), 00674 THISCALL(ITextHostImpl_TxSetCaretPos), 00675 THISCALL(ITextHostImpl_TxSetTimer), 00676 THISCALL(ITextHostImpl_TxKillTimer), 00677 THISCALL(ITextHostImpl_TxScrollWindowEx), 00678 THISCALL(ITextHostImpl_TxSetCapture), 00679 THISCALL(ITextHostImpl_TxSetFocus), 00680 THISCALL(ITextHostImpl_TxSetCursor), 00681 THISCALL(ITextHostImpl_TxScreenToClient), 00682 THISCALL(ITextHostImpl_TxClientToScreen), 00683 THISCALL(ITextHostImpl_TxActivate), 00684 THISCALL(ITextHostImpl_TxDeactivate), 00685 THISCALL(ITextHostImpl_TxGetClientRect), 00686 THISCALL(ITextHostImpl_TxGetViewInset), 00687 THISCALL(ITextHostImpl_TxGetCharFormat), 00688 THISCALL(ITextHostImpl_TxGetParaFormat), 00689 THISCALL(ITextHostImpl_TxGetSysColor), 00690 THISCALL(ITextHostImpl_TxGetBackStyle), 00691 THISCALL(ITextHostImpl_TxGetMaxLength), 00692 THISCALL(ITextHostImpl_TxGetScrollBars), 00693 THISCALL(ITextHostImpl_TxGetPasswordChar), 00694 THISCALL(ITextHostImpl_TxGetAcceleratorPos), 00695 THISCALL(ITextHostImpl_TxGetExtent), 00696 THISCALL(ITextHostImpl_OnTxCharFormatChange), 00697 THISCALL(ITextHostImpl_OnTxParaFormatChange), 00698 THISCALL(ITextHostImpl_TxGetPropertyBits), 00699 THISCALL(ITextHostImpl_TxNotify), 00700 THISCALL(ITextHostImpl_TxImmGetContext), 00701 THISCALL(ITextHostImpl_TxImmReleaseContext), 00702 THISCALL(ITextHostImpl_TxGetSelectionBarWidth), 00703 }; Generated on Sat May 26 2012 04:24:32 for ReactOS by
1.7.6.1
|