- Get flash window ready for use. Still more testing is needed. Missing shell support.

svn path=/trunk/; revision=66133
This commit is contained in:
James Tabor 2015-01-31 22:41:34 +00:00
parent db9a74e7cc
commit 4c848e9a69
3 changed files with 139 additions and 10 deletions

View file

@ -942,23 +942,127 @@ BOOL
FASTCALL
IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
{
PPROPERTY pprop;
DWORD FlashState;
BOOL Ret = FALSE;
PFLASHDATA pfData;
BOOL Activate = FALSE, Ret = FALSE;
pprop = IntGetProp(pWnd, AtomFlashWndState);
if (!pprop)
pfData = UserGetProp(pWnd, AtomFlashWndState);
if (!pfData)
{
FlashState = pfwi->dwFlags;
IntSetProp(pWnd, AtomFlashWndState, (HANDLE) FlashState);
return TRUE;
pfData = ExAllocatePoolWithTag(NonPagedPool, sizeof(FLASHDATA), USERTAG_WINDOW);
pfData->FlashState = 0;
pfData->uCount = pfwi->uCount;
IntSetProp(pWnd, AtomFlashWndState, (HANDLE) pfData);
}
FlashState = (DWORD)pprop->Data;
if (pfData->FlashState == FLASHW_FINISHED)
{
// Cycle has finished, kill timer and set this to Stop.
pfData->FlashState |= FLASHW_KILLSYSTIMER;
pfwi->dwFlags = FLASHW_STOP;
}
else
{
if (pfData->FlashState)
{
if (pfwi->dwFlags == FLASHW_SYSTIMER)
{
// Called from system timer, restore flags.
pfwi->dwFlags = pfData->FlashState;
}
}
else
{ // First time in cycle, setup flash state.
if ( pWnd->state & WNDS_ACTIVEFRAME ||
(pfwi->dwFlags & FLASHW_CAPTION && pWnd->style & (WS_BORDER|WS_DLGFRAME)))
{
pfData->FlashState = FLASHW_STARTED|FLASHW_ACTIVE;
}
}
// Set previous window state.
Ret = !!(pfData->FlashState & FLASHW_ACTIVE);
if ( pfwi->dwFlags & FLASHW_TIMERNOFG &&
gpqForeground == pWnd->head.pti->MessageQueue )
{
// Flashing until foreground, set this to Stop.
pfwi->dwFlags = FLASHW_STOP;
}
}
// Toggle activate flag.
if ( pfwi->dwFlags == FLASHW_STOP )
{
if (gpqForeground && gpqForeground->spwndActive == pWnd)
Activate = TRUE;
else
Activate = FALSE;
}
else
{
Activate = (pfData->FlashState & FLASHW_ACTIVE) == 0;
}
if ( pfwi->dwFlags == FLASHW_STOP || pfwi->dwFlags & FLASHW_CAPTION )
{
co_IntSendMessage(UserHMGetHandle(pWnd), WM_NCACTIVATE, Activate, 0);
}
// FIXME: Check for a Stop Sign here.
if ( pfwi->dwFlags & FLASHW_TRAY )
{
// Need some shell work here too.
TRACE("FIXME: Flash window no Tray support!\n");
}
if ( pfwi->dwFlags == FLASHW_STOP )
{
if (pfData->FlashState & FLASHW_KILLSYSTIMER)
{
IntKillTimer(pWnd, ID_EVENT_SYSTIMER_FLASHWIN, TRUE);
}
IntRemoveProp(pWnd, AtomFlashWndState);
Ret = TRUE;
ExFreePoolWithTag(pfData, USERTAG_WINDOW);
}
else
{ // Have a count and started, set timer.
if ( pfData->uCount )
{
pfData->FlashState |= FLASHW_COUNT;
if (!(Activate ^ !!(pfData->FlashState & FLASHW_STARTED)))
pfData->uCount--;
if (!(pfData->FlashState & FLASHW_KILLSYSTIMER))
pfwi->dwFlags |= FLASHW_TIMER;
}
if (pfwi->dwFlags & FLASHW_TIMER)
{
pfData->FlashState |= FLASHW_KILLSYSTIMER;
IntSetTimer( pWnd,
ID_EVENT_SYSTIMER_FLASHWIN,
pfwi->dwTimeout ? pfwi->dwTimeout : gpsi->dtCaretBlink,
SystemTimerProc,
TMRF_SYSTEM );
}
if (pfData->FlashState & FLASHW_COUNT && pfData->uCount == 0)
{
// Keep spinning? Nothing else to do.
pfData->FlashState = FLASHW_FINISHED;
}
else
{
// Save state and flags so this can be restored next time through.
pfData->FlashState ^= (pfData->FlashState ^ -!!(Activate)) & FLASHW_ACTIVE;
pfData->FlashState ^= (pfData->FlashState ^ pfwi->dwFlags) & (FLASHW_MASK & ~FLASHW_TIMER);
}
}
return Ret;
}

View file

@ -1,5 +1,18 @@
#pragma once
#define FLASHW_MASK 0x0000000f
#define FLASHW_SYSTIMER 0x00000400
#define FLASHW_FINISHED 0x00000800
#define FLASHW_STARTED 0x00001000
#define FLASHW_COUNT 0x00002000
#define FLASHW_KILLSYSTIMER 0x00004000
#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);
VOID FASTCALL IntInvalidateWindows(PWND Window, PREGION Rgn, ULONG Flags);
BOOL FASTCALL IntGetPaintMessage(PWND Window, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread, MSG *Message, BOOL Remove);
@ -11,3 +24,4 @@ BOOL FASTCALL IntIsWindowDirty(PWND);
BOOL FASTCALL IntEndPaint(PWND,PPAINTSTRUCT);
HDC FASTCALL IntBeginPaint(PWND,PPAINTSTRUCT);
PCURICON_OBJECT FASTCALL NC_IconForWindow( PWND );
BOOL FASTCALL IntFlashWindowEx(PWND,PFLASHWINFO);

View file

@ -345,6 +345,17 @@ SystemTimerProc(HWND hwnd,
}
return; // Not this window so just return.
case ID_EVENT_SYSTIMER_FLASHWIN:
{
FLASHWINFO fwi =
{sizeof(FLASHWINFO),
UserHMGetHandle(pWnd),
FLASHW_SYSTIMER,0,0};
IntFlashWindowEx(pWnd, &fwi);
}
return;
default:
ERR("System Timer Proc invalid id %u!\n", idEvent);
break;