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.

334 lines
13 KiB

  1. /**MOD+**********************************************************************/
  2. /* Module: or.cpp */
  3. /* */
  4. /* Purpose: Output Requestor API */
  5. /* */
  6. /* Copyright(C) Microsoft Corporation 1997 */
  7. /* */
  8. /****************************************************************************/
  9. #include <adcg.h>
  10. extern "C" {
  11. #define TRC_GROUP TRC_GROUP_CORE
  12. #define TRC_FILE "worapi"
  13. #include <atrcapi.h>
  14. }
  15. #include "or.h"
  16. COR::COR(CObjs* objs)
  17. {
  18. _pClientObjects = objs;
  19. }
  20. COR::~COR()
  21. {
  22. }
  23. /**PROC+*********************************************************************/
  24. /* Name: OR_Init */
  25. /* */
  26. /* Purpose: Initialize OR */
  27. /* */
  28. /* Returns: Nothing */
  29. /* */
  30. /* Params: None */
  31. /* */
  32. /**PROC-*********************************************************************/
  33. DCVOID DCAPI COR::OR_Init(DCVOID)
  34. {
  35. DC_BEGIN_FN("OR_Init");
  36. _pSl = _pClientObjects->_pSlObject;
  37. _pUt = _pClientObjects->_pUtObject;
  38. _pUi = _pClientObjects->_pUiObject;
  39. TRC_DBG((TB, _T("In OR_Init")));
  40. DC_MEMSET(&_OR, 0, sizeof(_OR));
  41. _OR.invalidRectEmpty = TRUE;
  42. _OR.pendingSendSuppressOutputPDU = FALSE;
  43. _OR.outputSuppressed = FALSE;
  44. _OR.enabled = FALSE;
  45. DC_END_FN();
  46. return;
  47. } /* OR_Init */
  48. /**PROC+*********************************************************************/
  49. /* Name: OR_Term */
  50. /* */
  51. /* Purpose: Terminates OR */
  52. /* */
  53. /* Returns: Nothing */
  54. /* */
  55. /* Params: None */
  56. /* */
  57. /**PROC-*********************************************************************/
  58. DCVOID DCAPI COR::OR_Term(DCVOID)
  59. {
  60. DC_BEGIN_FN("OR_Term");
  61. /************************************************************************/
  62. /* No action */
  63. /************************************************************************/
  64. DC_END_FN();
  65. return;
  66. } /* OR_Term */
  67. /**PROC+*********************************************************************/
  68. /* Name: OR_Enable */
  69. /* */
  70. /* Purpose: Enables OR */
  71. /* */
  72. /* Returns: Nothing */
  73. /* */
  74. /* Params: None */
  75. /* */
  76. /**PROC-*********************************************************************/
  77. DCVOID DCAPI COR::OR_Enable(DCVOID)
  78. {
  79. DC_BEGIN_FN("OR_Enable");
  80. _OR.enabled = TRUE;
  81. TRC_DBG((TB, _T("OR Enabled")));
  82. DC_END_FN();
  83. return;
  84. } /* OR_Enable */
  85. /**PROC+*********************************************************************/
  86. /* Name: OR_Disable */
  87. /* */
  88. /* Purpose: Disables OR */
  89. /* */
  90. /* Returns: Nothing */
  91. /* */
  92. /* Params: None */
  93. /* */
  94. /**PROC-*********************************************************************/
  95. DCVOID DCAPI COR::OR_Disable(DCVOID)
  96. {
  97. DC_BEGIN_FN("OR_Disable");
  98. _OR.enabled = FALSE;
  99. DC_MEMSET(&_OR.invalidRect, 0, sizeof(_OR.invalidRect));
  100. _OR.invalidRectEmpty = TRUE;
  101. _OR.pendingSendSuppressOutputPDU = FALSE;
  102. _OR.outputSuppressed = FALSE;
  103. TRC_DBG((TB, _T("OR disabled")));
  104. DC_END_FN();
  105. return;
  106. } /* OR_Disable */
  107. /**PROC+*********************************************************************/
  108. /* Name: OR_RequestUpdate */
  109. /* */
  110. /* Purpose: API to send a RefreshRectPDU */
  111. /* */
  112. /* Returns: Nothing */
  113. /* */
  114. /* Params: pRect - IN - pointer to the rectangle to be updated */
  115. /* unusedLen - not used */
  116. /* */
  117. /**PROC-*********************************************************************/
  118. DCVOID DCAPI COR::OR_RequestUpdate(PDCVOID pData, DCUINT unusedLen)
  119. {
  120. RECT * pRect = (RECT *) pData;
  121. DC_BEGIN_FN("OR_RequestUpdate");
  122. DC_IGNORE_PARAMETER(unusedLen);
  123. /************************************************************************/
  124. /* If OR is not enabled, don't do anything */
  125. /************************************************************************/
  126. if (!_OR.enabled)
  127. {
  128. TRC_DBG((TB, _T("Request Update quitting since not enabled")));
  129. DC_QUIT;
  130. }
  131. TRC_ASSERT((pRect != NULL), (TB,_T("Rect NULL")));
  132. TRC_ASSERT(( (pRect->left < pRect->right) &&
  133. (pRect->top < pRect->bottom) ),
  134. (TB,_T("Invalid RECT (%d, %d), (%d,%d)") , pRect->left,
  135. pRect->top, pRect->right, pRect->bottom));
  136. TRC_DBG((TB, _T("Add rectangle (%d, %d, %d, %d) to update area"),
  137. pRect->left,
  138. pRect->top,
  139. pRect->right,
  140. pRect->bottom));
  141. if (!_OR.invalidRectEmpty)
  142. {
  143. /********************************************************************/
  144. /* If we currently have a rect to be sent merge the two */
  145. /********************************************************************/
  146. TRC_DBG((TB, _T("Merging refresh rects")));
  147. _OR.invalidRect.left = DC_MIN(pRect->left,
  148. _OR.invalidRect.left);
  149. _OR.invalidRect.top = DC_MIN(pRect->top,
  150. _OR.invalidRect.top);
  151. _OR.invalidRect.right = DC_MAX(pRect->right,
  152. _OR.invalidRect.right);
  153. _OR.invalidRect.bottom = DC_MAX(pRect->bottom,
  154. _OR.invalidRect.bottom);
  155. }
  156. else
  157. {
  158. /********************************************************************/
  159. /* Else put the copy the rect into _OR.invalidRect */
  160. /********************************************************************/
  161. _OR.invalidRect = *pRect;
  162. _OR.invalidRectEmpty = FALSE;
  163. }
  164. TRC_DBG((TB, _T("New Update area (%d, %d, %d, %d)"), _OR.invalidRect.left,
  165. _OR.invalidRect.top,
  166. _OR.invalidRect.right,
  167. _OR.invalidRect.bottom));
  168. /************************************************************************/
  169. /* Attempt to send the PDU */
  170. /************************************************************************/
  171. TRC_NRM((TB, _T("Attempting to send RefreshRectPDU")));
  172. ORSendRefreshRectanglePDU();
  173. DC_EXIT_POINT:
  174. DC_END_FN();
  175. return;
  176. } /* OR_RequestUpdate */
  177. /**PROC+*********************************************************************/
  178. /* Name: OR_SetSuppressOutput */
  179. /* */
  180. /* Purpose: API to send a SuppressOutputPDU */
  181. /* */
  182. /* Returns: Nothing */
  183. /* */
  184. /* Params: newWindowState - IN - new window state passed from CO */
  185. /* */
  186. /**PROC-*********************************************************************/
  187. DCVOID DCAPI COR::OR_SetSuppressOutput(ULONG_PTR newWindowState)
  188. {
  189. DC_BEGIN_FN("OR_SetSuppressOutput");
  190. /************************************************************************/
  191. /* If OR is not enabled don't do anything */
  192. /************************************************************************/
  193. if (!_OR.enabled)
  194. {
  195. TRC_DBG((TB, _T("SetOuputRectangle quitting since OR not enabled")));
  196. DC_QUIT;
  197. }
  198. switch (newWindowState)
  199. {
  200. case SIZE_MAXIMIZED:
  201. case SIZE_RESTORED:
  202. {
  203. if (_OR.outputSuppressed == FALSE)
  204. {
  205. DC_QUIT;
  206. }
  207. _OR.outputSuppressed = FALSE;
  208. }
  209. break;
  210. case SIZE_MINIMIZED:
  211. {
  212. if (_OR.outputSuppressed == TRUE)
  213. {
  214. DC_QUIT;
  215. }
  216. _OR.outputSuppressed = TRUE;
  217. }
  218. break;
  219. default:
  220. {
  221. TRC_ABORT((TB,_T("Illegal window state passed to OR")));
  222. }
  223. break;
  224. }
  225. TRC_NRM((TB, _T("Attempting to send SuppressOutputPDU")));
  226. _OR.pendingSendSuppressOutputPDU = TRUE;
  227. ORSendSuppressOutputPDU();
  228. DC_EXIT_POINT:
  229. DC_END_FN();
  230. return;
  231. } /* OR_SetSuppressOutput */
  232. /**PROC+*********************************************************************/
  233. /* Name: OR_OnBufferAvailable */
  234. /* */
  235. /* Purpose: Retries to send SuppressOutputPDUs and RefreshRectPDUs if */
  236. /* necessary */
  237. /* */
  238. /* Returns: Nothing */
  239. /* */
  240. /* Params: None */
  241. /* */
  242. /**PROC-*********************************************************************/
  243. DCVOID DCAPI COR::OR_OnBufferAvailable(DCVOID)
  244. {
  245. DC_BEGIN_FN("OR_OnBufferAvailable");
  246. /************************************************************************/
  247. /* If Or is not enabled don't do anything */
  248. /************************************************************************/
  249. if (!_OR.enabled)
  250. {
  251. DC_QUIT;
  252. }
  253. /************************************************************************/
  254. /* If we are pending a SendSuppressOutputPDU then call it */
  255. /************************************************************************/
  256. if (_OR.pendingSendSuppressOutputPDU)
  257. {
  258. ORSendSuppressOutputPDU();
  259. }
  260. /************************************************************************/
  261. /* If there is a Update rectangle pending, try to send it again */
  262. /************************************************************************/
  263. if (!_OR.invalidRectEmpty)
  264. {
  265. ORSendRefreshRectanglePDU();
  266. }
  267. DC_EXIT_POINT:
  268. DC_END_FN();
  269. return;
  270. } /* OR_OnBufferAvailable */