00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include "precomp.h"
00012
#pragma hdrstop
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 PWND xxxSetCapture(
00024
PWND pwnd)
00025 {
00026
PQ pq;
00027
PWND pwndCaptureOld;
00028 HWND hwndCaptureOld;
00029
PTHREADINFO ptiCurrent =
PtiCurrent();
00030
00031 pq = (
PQ)
PtiCurrent()->pq;
00032
00033
00034
00035
00036
if (pq->
QF_flags &
QF_CAPTURELOCKED) {
00037 RIPMSG2(RIP_WARNING,
"xxxSetCapture(%#p): Capture is locked. pq:%#p", pwnd, pq);
00038
return NULL;
00039 }
00040
00041
00042
00043
00044
00045
if ((pwnd !=
NULL) &&
GETPTI(pwnd)->pq != pq)
00046
return NULL;
00047
00048
00049
00050
00051
if (
gspwndScreenCapture)
00052
return NULL;
00053
00054 pwndCaptureOld = pq->
spwndCapture;
00055 hwndCaptureOld =
HW(pwndCaptureOld);
00056
00057
xxxCapture(ptiCurrent, pwnd,
CLIENT_CAPTURE);
00058
00059
if (hwndCaptureOld !=
NULL) {
00060
00061
if (
RevalidateHwnd(hwndCaptureOld))
00062
return pwndCaptureOld;
00063 }
00064
00065
return NULL;
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 BOOL xxxReleaseCapture(VOID)
00079 {
00080
PTHREADINFO ptiCurrent =
PtiCurrent();
00081
00082
00083
00084
if (ptiCurrent->
pq->
QF_flags &
QF_CAPTURELOCKED) {
00085 RIPMSG0(RIP_WARNING,
"xxxReleaseCapture: Capture is locked");
00086
return FALSE;
00087 }
00088
00089
00090
00091
00092
00093
if (ptiCurrent->
pmsd !=
NULL) {
00094
00095
00096
00097
00098
00099
if (ptiCurrent->
TIF_flags &
TIF_TRACKRECTVISIBLE) {
00100
00101 bSetDevDragRect(
gpDispInfo->
hDev,
NULL,
NULL);
00102
00103
if (!(ptiCurrent->
pmsd->
fDragFullWindows))
00104
xxxDrawDragRect(ptiCurrent->
pmsd,
NULL,
DDR_ENDCANCEL);
00105
00106 ptiCurrent->
TIF_flags &= ~(
TIF_TRACKRECTVISIBLE |
TIF_MOVESIZETRACKING);
00107 }
00108 }
00109
00110
xxxCapture(ptiCurrent,
NULL,
NO_CAP_CLIENT);
00111
00112
return TRUE;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 VOID xxxCapture(
00125
PTHREADINFO pti,
00126
PWND pwnd,
00127 UINT code)
00128 {
00129
CheckLock(pwnd);
00130 UserAssert(
IsWinEventNotifyDeferredOK());
00131
00132
if ((
gspwndScreenCapture ==
NULL) ||
00133 (code ==
FULLSCREEN_CAPTURE) ||
00134 ((pwnd ==
NULL) && (code ==
NO_CAP_CLIENT) && (pti->
pq !=
GETPTI(
gspwndScreenCapture)->pq))) {
00135
00136
PQ pq;
00137
PWND pwndCaptureOld =
NULL;
00138
00139
if (code ==
FULLSCREEN_CAPTURE) {
00140
if (pwnd) {
00141
00142
Lock(&
gspwndScreenCapture, pwnd);
00143
00144
00145
00146
00147
Unlock(&
gspwndMouseOwner);
00148
00149 }
else {
00150
00151
Unlock(&
gspwndScreenCapture);
00152 }
00153 }
00154
00155
00156
00157
00158
00159
if (code ==
CLIENT_CAPTURE_INTERNAL) {
00160
Lock(&
gspwndInternalCapture, pwnd);
00161 code =
CLIENT_CAPTURE;
00162 }
00163
00164
00165
00166
00167
00168
if ((code ==
NO_CAP_CLIENT) &&
00169
gspwndInternalCapture &&
00170 (pti ==
GETPTI(
gspwndInternalCapture))) {
00171
00172
Unlock(&
gspwndInternalCapture);
00173 }
00174
00175
if ((pq = pti->pq) !=
NULL) {
00176
PDESKTOP pdesk = pti->rpdesk;
00177
00178 UserAssert(!(pq->
QF_flags &
QF_CAPTURELOCKED));
00179
00180
00181
00182
00183
00184
00185
00186
if ((pdesk->
dwDTFlags &
DF_TRACKMOUSEEVENT)
00187 && (pdesk->
htEx == HTCLIENT)
00188 && ((pdesk->
spwndTrack == pwnd)
00189 && (code !=
CLIENT_CAPTURE)
00190 || ((pdesk->
spwndTrack == pq->
spwndCapture)
00191 && (pq->
codeCapture !=
CLIENT_CAPTURE)))) {
00192
00193
BEGINATOMICCHECK();
00194
xxxCancelMouseMoveTracking(pdesk->
dwDTFlags, pdesk->
spwndTrack,
00195 pdesk->
htEx,
DF_TRACKMOUSEEVENT);
00196
ENDATOMICCHECK();
00197
00198 }
00199
00200 pwndCaptureOld = pq->
spwndCapture;
00201
LockCaptureWindow(pq, pwnd);
00202 pq->
codeCapture = code;
00203 }
else {
00204
00205
00206
00207 UserAssert(pti->pq !=
NULL);
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
DeferWinEventNotify();
00217
00218
if (pwnd ==
NULL && pwndCaptureOld !=
NULL) {
00219
#ifdef REDIRECTION
00220
if (!
IsGlobalHooked(pti,
WHF_FROM_WH(WH_HITTEST)))
00221
#endif
00222
zzzSetFMouseMoved();
00223 }
00224
00225
if (
FWINABLE()) {
00226
if (pwndCaptureOld) {
00227
zzzWindowEvent(EVENT_SYSTEM_CAPTUREEND, pwndCaptureOld, OBJID_WINDOW,
00228 INDEXID_CONTAINER,
WEF_USEPWNDTHREAD);
00229 }
00230
00231
if (pwnd) {
00232
zzzWindowEvent(EVENT_SYSTEM_CAPTURESTART, pwnd, OBJID_WINDOW,
00233 INDEXID_CONTAINER,
WEF_USEPWNDTHREAD);
00234 }
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
if (pwndCaptureOld &&
00244
TestWF(pwndCaptureOld,
WFWIN40COMPAT) &&
00245 !(pwndCaptureOld->fnid &
FNID_DELETED_BIT)) {
00246
00247
TL tlpwnd;
00248
00249
00250
00251
00252
00253
00254
if ((pti->pMenuState !=
NULL) && (pwnd !=
NULL)) {
00255 pq->
QF_flags |=
QF_CAPTURELOCKED;
00256 }
00257
00258
ThreadLockAlways(pwndCaptureOld, &tlpwnd);
00259
zzzEndDeferWinEventNotify();
00260
xxxSendMessageCallback(pwndCaptureOld,
00261 WM_CAPTURECHANGED,
00262
FALSE,
00263 (LPARAM)
HW(pwnd),
00264
NULL,
00265 0,
00266
FALSE);
00267
00268
00269
00270 pq = pti->pq;
00271 UserAssert(pq !=
NULL);
00272
ThreadUnlock(&tlpwnd);
00273
00274
00275
00276
00277 pq->
QF_flags &= ~
QF_CAPTURELOCKED;
00278 }
else {
00279
zzzEndDeferWinEventNotify();
00280 }
00281 }
00282 }