Leaked source code of windows server 2003
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.

144 lines
3.0 KiB

  1. //
  2. // mes.cpp
  3. //
  4. #include "private.h"
  5. #include "mes.h"
  6. //////////////////////////////////////////////////////////////////////////////
  7. //
  8. // CMouseSink
  9. //
  10. //////////////////////////////////////////////////////////////////////////////
  11. //+---------------------------------------------------------------------------
  12. //
  13. // IUnknown
  14. //
  15. //----------------------------------------------------------------------------
  16. STDAPI CMouseSink::QueryInterface(REFIID riid, void **ppvObj)
  17. {
  18. *ppvObj = NULL;
  19. if (IsEqualIID(riid, IID_IUnknown) ||
  20. IsEqualIID(riid, IID_ITfMouseSink))
  21. {
  22. *ppvObj = SAFECAST(this, CMouseSink *);
  23. }
  24. if (*ppvObj)
  25. {
  26. AddRef();
  27. return S_OK;
  28. }
  29. return E_NOINTERFACE;
  30. }
  31. STDAPI_(ULONG) CMouseSink::AddRef()
  32. {
  33. return ++_cRef;
  34. }
  35. STDAPI_(ULONG) CMouseSink::Release()
  36. {
  37. long cr;
  38. cr = --_cRef;
  39. Assert(cr >= 0);
  40. if (cr == 0)
  41. {
  42. delete this;
  43. }
  44. return cr;
  45. }
  46. //+---------------------------------------------------------------------------
  47. //
  48. // ctor
  49. //
  50. //----------------------------------------------------------------------------
  51. CMouseSink::CMouseSink(MOUSECALLBACK pfnCallback, void *pv)
  52. {
  53. Dbg_MemSetThisName(TEXT("CMouseSink"));
  54. _cRef = 1;
  55. _pfnCallback = pfnCallback;
  56. _pv = pv;
  57. Assert(_pic == NULL);
  58. }
  59. //+---------------------------------------------------------------------------
  60. //
  61. // OnMouseEvent
  62. //
  63. //----------------------------------------------------------------------------
  64. STDAPI CMouseSink::OnMouseEvent(ULONG uEdge, ULONG uQuadrant, DWORD dwBtnStatus, BOOL *pfEaten)
  65. {
  66. return _pfnCallback(uEdge, uQuadrant, dwBtnStatus, pfEaten, _pv);
  67. }
  68. //+---------------------------------------------------------------------------
  69. //
  70. // CMouseSink::Advise
  71. //
  72. //----------------------------------------------------------------------------
  73. HRESULT CMouseSink::_Advise(ITfRange *range, ITfContext *pic)
  74. {
  75. HRESULT hr;
  76. ITfMouseTracker *tracker = NULL;
  77. Assert(_pic == NULL);
  78. hr = E_FAIL;
  79. if (FAILED(pic->QueryInterface(IID_ITfMouseTracker, (void **)&tracker)))
  80. goto Exit;
  81. if (FAILED(tracker->AdviseMouseSink(range, this, &_dwCookie)))
  82. goto Exit;
  83. _pic = pic;
  84. _pic->AddRef();
  85. hr = S_OK;
  86. Exit:
  87. SafeRelease(tracker);
  88. return hr;
  89. }
  90. //+---------------------------------------------------------------------------
  91. //
  92. // CMouseSink::Unadvise
  93. //
  94. //----------------------------------------------------------------------------
  95. HRESULT CMouseSink::_Unadvise()
  96. {
  97. HRESULT hr;
  98. ITfMouseTracker *tracker = NULL;
  99. hr = E_FAIL;
  100. if (_pic == NULL)
  101. goto Exit;
  102. if (FAILED(_pic->QueryInterface(IID_ITfMouseTracker, (void **)&tracker)))
  103. goto Exit;
  104. if (FAILED(tracker->UnadviseMouseSink(_dwCookie)))
  105. goto Exit;
  106. hr = S_OK;
  107. Exit:
  108. SafeRelease(tracker);
  109. SafeReleaseClear(_pic);
  110. return hr;
  111. }