00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "precomp.h"
00013
#pragma hdrstop
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 BOOL IsTopmostRealApp(
00026
PWND pwnd)
00027 {
00028
PTHREADINFO ptiCurrent =
PtiCurrent();
00029
PDESKTOPINFO pdeskinfo = pwnd->
head.rpdesk->pDeskInfo;
00030
if ((pdeskinfo->
spwndShell ==
NULL) ||
00031 (
GETPTI(pdeskinfo->
spwndShell)->pq !=
gpqForeground)) {
00032
00033
return FALSE;
00034 }
00035
00036
return (pwnd ==
NextTopWindow(ptiCurrent,
00037
NULL,
00038
NULL,
00039
NTW_IGNORETOOLWINDOW));
00040 }
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 HPALETTE
_SelectPalette(
00052 HDC hdc,
00053 HPALETTE hpal,
00054 BOOL fForceBackground)
00055 {
00056
PWND pwndTop;
00057
BOOL fBackgroundPalette =
TRUE;
00058
PWND pwnd =
NULL;
00059
00060
00061
00062
00063
00064
00065
00066
if (!fForceBackground &&
00067
TEST_PUSIF(
PUSIF_PALETTEDISPLAY) &&
00068 (hpal != GreGetStockObject(DEFAULT_PALETTE))) {
00069
00070
if (pwnd =
WindowFromCacheDC(hdc)) {
00071
00072
PWND pwndActive;
00073
00074
00075
00076
00077 pwndTop =
GetTopLevelWindow(pwnd);
00078
00079
if (!
TestWF(pwndTop,
WFHASPALETTE)) {
00080
00081
if (pwndTop !=
_GetDesktopWindow())
00082
GETPTI(pwndTop)->TIF_flags |=
TIF_PALETTEAWARE;
00083
00084
SetWF(pwndTop,
WFHASPALETTE);
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 pwndActive = (
gpqForeground ?
gpqForeground->
spwndActive :
NULL);
00110
00111
#if 0
00112
if (pwndActive &&
00113 (pwndTop != pwnd->
head.rpdesk->pDeskInfo->spwndShell) &&
00114 ((pwndActive == pwnd) ||
_IsChild(pwndActive, pwnd) ||
IsTopmostRealApp(pwnd)) &&
00115 !
TestWF(pwnd,
WEFTOOLWINDOW)) {
00116
00117 fBackgroundPalette =
FALSE;
00118 }
00119
#else
00120
if ((pwndTop != pwndTop->
head.rpdesk->pDeskInfo->spwnd) &&
00121 (pwndTop != pwndTop->
head.rpdesk->pDeskInfo->spwndShell) &&
00122 (pwndActive !=
NULL) &&
00123 ((pwndActive == pwnd) ||
00124
_IsChild(pwndActive, pwnd) ||
00125
IsTopmostRealApp(pwnd)) &&
00126 !
TestWF(pwnd,
WEFTOOLWINDOW)) {
00127
00128 fBackgroundPalette =
FALSE;
00129 }
00130
#endif
00131
}
00132 }
00133
00134
return GreSelectPalette(hdc, hpal, fBackgroundPalette);
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 int xxxRealizePalette(
00147 HDC hdc)
00148 {
00149
PWND pwnd;
00150
DWORD dwNumChanged;
00151
PWINDOWSTATION pwinsta;
00152
PDESKTOP pdesk;
00153
TL tlpwnd;
00154
00155 dwNumChanged = GreRealizePalette(hdc);
00156
00157
if (HIWORD(dwNumChanged) && IsDCCurrentPalette(hdc)) {
00158
00159 pwnd =
WindowFromCacheDC(hdc);
00160
00161
00162
00163
00164
00165
if (pwnd !=
NULL) {
00166
00167
00168
00169
00170
00171
00172
ThreadLock(pwnd, &tlpwnd);
00173
xxxBroadcastPaletteChanged(pwnd,
FALSE);
00174
ThreadUnlock(&tlpwnd);
00175
00176
00177
00178
00179
00180
00181 pwinsta =
grpWinStaList;
00182
00183
while (pwinsta !=
NULL) {
00184 pdesk = pwinsta->
rpdeskList;
00185
while (pdesk !=
NULL) {
00186
if (pdesk != pwnd->
head.rpdesk) {
00187 pdesk->
dwDTFlags |=
DTF_NEEDSPALETTECHANGED;
00188 }
00189 pdesk = pdesk->
rpdeskNext;
00190 }
00191 pwinsta = pwinsta->
rpwinstaNext;
00192 }
00193
00194 GreRealizePalette(hdc);
00195 }
00196 }
00197
00198
00199
00200
00201
00202
if (HIWORD(dwNumChanged)) {
00203
FreeAllSpbs();
00204 }
00205
00206
return LOWORD(dwNumChanged);
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 VOID xxxFlushPalette(
00221
PWND pwnd)
00222 {
00223
CheckLock(pwnd);
00224
00225
00226
00227 GreRealizeDefaultPalette(
gpDispInfo->
hdcScreen,
TRUE);
00228
xxxBroadcastPaletteChanged(pwnd,
TRUE);
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 VOID xxxBroadcastPaletteChanged(
PWND pwnd, BOOL fForceDesktop)
00244 {
00245
PWND pwndDesk;
00246 HWND hwnd =
HWq(pwnd);
00247
00248
CheckLock(pwnd);
00249
00250 pwndDesk =
PWNDDESKTOP(pwnd);
00251
if (fForceDesktop || pwnd != pwndDesk) {
00252
TL tlpwndDesk;
00253
ThreadLockAlways(pwndDesk, &tlpwndDesk);
00254
xxxRealizeDesktop(pwndDesk);
00255
ThreadUnlock(&tlpwndDesk);
00256 }
00257
00258
xxxSendNotifyMessage(
PWND_BROADCAST, WM_PALETTECHANGED, (WPARAM)hwnd, 0
L);
00259 }