mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
[Win32ss]
- Fix SeaMonkey crash while restarting the web browser. svn path=/trunk/; revision=66149
This commit is contained in:
parent
168427ac29
commit
be2a9b2e37
2 changed files with 34 additions and 37 deletions
|
@ -942,47 +942,49 @@ BOOL
|
||||||
FASTCALL
|
FASTCALL
|
||||||
IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
||||||
{
|
{
|
||||||
PFLASHDATA pfData;
|
DWORD FlashState;
|
||||||
|
UINT uCount = pfwi->uCount;
|
||||||
BOOL Activate = FALSE, Ret = FALSE;
|
BOOL Activate = FALSE, Ret = FALSE;
|
||||||
|
|
||||||
pfData = UserGetProp(pWnd, AtomFlashWndState);
|
ASSERT(pfwi);
|
||||||
if (!pfData)
|
|
||||||
{
|
|
||||||
pfData = ExAllocatePoolWithTag(NonPagedPool, sizeof(FLASHDATA), USERTAG_WINDOW);
|
|
||||||
|
|
||||||
pfData->FlashState = 0;
|
FlashState = (DWORD)UserGetProp(pWnd, AtomFlashWndState);
|
||||||
pfData->uCount = pfwi->uCount;
|
|
||||||
|
|
||||||
IntSetProp(pWnd, AtomFlashWndState, (HANDLE) pfData);
|
if (FlashState == FLASHW_FINISHED)
|
||||||
}
|
|
||||||
|
|
||||||
if (pfData->FlashState == FLASHW_FINISHED)
|
|
||||||
{
|
{
|
||||||
// Cycle has finished, kill timer and set this to Stop.
|
// Cycle has finished, kill timer and set this to Stop.
|
||||||
pfData->FlashState |= FLASHW_KILLSYSTIMER;
|
FlashState |= FLASHW_KILLSYSTIMER;
|
||||||
pfwi->dwFlags = FLASHW_STOP;
|
pfwi->dwFlags = FLASHW_STOP;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (pfData->FlashState)
|
if (FlashState)
|
||||||
{
|
{
|
||||||
if (pfwi->dwFlags == FLASHW_SYSTIMER)
|
if (pfwi->dwFlags == FLASHW_SYSTIMER)
|
||||||
{
|
{
|
||||||
// Called from system timer, restore flags.
|
// Called from system timer, restore flags, counts and state.
|
||||||
pfwi->dwFlags = pfData->FlashState;
|
pfwi->dwFlags = LOWORD(FlashState);
|
||||||
|
uCount = HIWORD(FlashState);
|
||||||
|
FlashState = MAKELONG(LOWORD(FlashState),0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Clean out the trash! Fix SeaMonkey crash after restart.
|
||||||
|
FlashState = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (FlashState == 0)
|
||||||
{ // First time in cycle, setup flash state.
|
{ // First time in cycle, setup flash state.
|
||||||
if ( pWnd->state & WNDS_ACTIVEFRAME ||
|
if ( pWnd->state & WNDS_ACTIVEFRAME ||
|
||||||
(pfwi->dwFlags & FLASHW_CAPTION && pWnd->style & (WS_BORDER|WS_DLGFRAME)))
|
(pfwi->dwFlags & FLASHW_CAPTION && pWnd->style & (WS_BORDER|WS_DLGFRAME)))
|
||||||
{
|
{
|
||||||
pfData->FlashState = FLASHW_STARTED|FLASHW_ACTIVE;
|
FlashState = FLASHW_STARTED|FLASHW_ACTIVE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set previous window state.
|
// Set previous window state.
|
||||||
Ret = !!(pfData->FlashState & FLASHW_ACTIVE);
|
Ret = !!(FlashState & FLASHW_ACTIVE);
|
||||||
|
|
||||||
if ( pfwi->dwFlags & FLASHW_TIMERNOFG &&
|
if ( pfwi->dwFlags & FLASHW_TIMERNOFG &&
|
||||||
gpqForeground == pWnd->head.pti->MessageQueue )
|
gpqForeground == pWnd->head.pti->MessageQueue )
|
||||||
|
@ -1002,7 +1004,7 @@ IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Activate = (pfData->FlashState & FLASHW_ACTIVE) == 0;
|
Activate = (FlashState & FLASHW_ACTIVE) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( pfwi->dwFlags == FLASHW_STOP || pfwi->dwFlags & FLASHW_CAPTION )
|
if ( pfwi->dwFlags == FLASHW_STOP || pfwi->dwFlags & FLASHW_CAPTION )
|
||||||
|
@ -1019,31 +1021,29 @@ IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
||||||
|
|
||||||
if ( pfwi->dwFlags == FLASHW_STOP )
|
if ( pfwi->dwFlags == FLASHW_STOP )
|
||||||
{
|
{
|
||||||
if (pfData->FlashState & FLASHW_KILLSYSTIMER)
|
if (FlashState & FLASHW_KILLSYSTIMER)
|
||||||
{
|
{
|
||||||
IntKillTimer(pWnd, ID_EVENT_SYSTIMER_FLASHWIN, TRUE);
|
IntKillTimer(pWnd, ID_EVENT_SYSTIMER_FLASHWIN, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
IntRemoveProp(pWnd, AtomFlashWndState);
|
IntRemoveProp(pWnd, AtomFlashWndState);
|
||||||
|
|
||||||
ExFreePoolWithTag(pfData, USERTAG_WINDOW);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // Have a count and started, set timer.
|
{ // Have a count and started, set timer.
|
||||||
if ( pfData->uCount )
|
if ( uCount )
|
||||||
{
|
{
|
||||||
pfData->FlashState |= FLASHW_COUNT;
|
FlashState |= FLASHW_COUNT;
|
||||||
|
|
||||||
if (!(Activate ^ !!(pfData->FlashState & FLASHW_STARTED)))
|
if (!(Activate ^ !!(FlashState & FLASHW_STARTED)))
|
||||||
pfData->uCount--;
|
uCount--;
|
||||||
|
|
||||||
if (!(pfData->FlashState & FLASHW_KILLSYSTIMER))
|
if (!(FlashState & FLASHW_KILLSYSTIMER))
|
||||||
pfwi->dwFlags |= FLASHW_TIMER;
|
pfwi->dwFlags |= FLASHW_TIMER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfwi->dwFlags & FLASHW_TIMER)
|
if (pfwi->dwFlags & FLASHW_TIMER)
|
||||||
{
|
{
|
||||||
pfData->FlashState |= FLASHW_KILLSYSTIMER;
|
FlashState |= FLASHW_KILLSYSTIMER;
|
||||||
|
|
||||||
IntSetTimer( pWnd,
|
IntSetTimer( pWnd,
|
||||||
ID_EVENT_SYSTIMER_FLASHWIN,
|
ID_EVENT_SYSTIMER_FLASHWIN,
|
||||||
|
@ -1052,17 +1052,19 @@ IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
||||||
TMRF_SYSTEM );
|
TMRF_SYSTEM );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfData->FlashState & FLASHW_COUNT && pfData->uCount == 0)
|
if (FlashState & FLASHW_COUNT && uCount == 0)
|
||||||
{
|
{
|
||||||
// Keep spinning? Nothing else to do.
|
// Keep spinning? Nothing else to do.
|
||||||
pfData->FlashState = FLASHW_FINISHED;
|
FlashState = FLASHW_FINISHED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Save state and flags so this can be restored next time through.
|
// Save state and flags so this can be restored next time through.
|
||||||
pfData->FlashState ^= (pfData->FlashState ^ -!!(Activate)) & FLASHW_ACTIVE;
|
FlashState ^= (FlashState ^ -!!(Activate)) & FLASHW_ACTIVE;
|
||||||
pfData->FlashState ^= (pfData->FlashState ^ pfwi->dwFlags) & (FLASHW_MASK & ~FLASHW_TIMER);
|
FlashState ^= (FlashState ^ pfwi->dwFlags) & (FLASHW_MASK & ~FLASHW_TIMER);
|
||||||
}
|
}
|
||||||
|
FlashState = MAKELONG(LOWORD(FlashState),uCount);
|
||||||
|
IntSetProp(pWnd, AtomFlashWndState, (HANDLE) FlashState);
|
||||||
}
|
}
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,11 +8,6 @@
|
||||||
#define FLASHW_KILLSYSTIMER 0x00004000
|
#define FLASHW_KILLSYSTIMER 0x00004000
|
||||||
#define FLASHW_ACTIVE 0x00008000
|
#define FLASHW_ACTIVE 0x00008000
|
||||||
|
|
||||||
typedef struct _FLASHDATA{
|
|
||||||
DWORD FlashState;
|
|
||||||
UINT uCount;
|
|
||||||
} FLASHDATA, *PFLASHDATA;
|
|
||||||
|
|
||||||
BOOL FASTCALL co_UserRedrawWindow(PWND Wnd, const RECTL* UpdateRect, PREGION UpdateRgn, ULONG Flags);
|
BOOL FASTCALL co_UserRedrawWindow(PWND Wnd, const RECTL* UpdateRect, PREGION UpdateRgn, ULONG Flags);
|
||||||
VOID FASTCALL IntInvalidateWindows(PWND Window, PREGION Rgn, ULONG Flags);
|
VOID FASTCALL IntInvalidateWindows(PWND Window, PREGION Rgn, ULONG Flags);
|
||||||
BOOL FASTCALL IntGetPaintMessage(PWND Window, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread, MSG *Message, BOOL Remove);
|
BOOL FASTCALL IntGetPaintMessage(PWND Window, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread, MSG *Message, BOOL Remove);
|
||||||
|
|
Loading…
Reference in a new issue