mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 16:35:49 +00:00
[NtUser]
- Get flash window ready for use. Still more testing is needed. Missing shell support. svn path=/trunk/; revision=66133
This commit is contained in:
parent
db9a74e7cc
commit
4c848e9a69
3 changed files with 139 additions and 10 deletions
|
@ -942,23 +942,127 @@ BOOL
|
||||||
FASTCALL
|
FASTCALL
|
||||||
IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
|
||||||
{
|
{
|
||||||
PPROPERTY pprop;
|
PFLASHDATA pfData;
|
||||||
DWORD FlashState;
|
BOOL Activate = FALSE, Ret = FALSE;
|
||||||
BOOL Ret = FALSE;
|
|
||||||
|
|
||||||
pprop = IntGetProp(pWnd, AtomFlashWndState);
|
pfData = UserGetProp(pWnd, AtomFlashWndState);
|
||||||
if (!pprop)
|
if (!pfData)
|
||||||
{
|
{
|
||||||
FlashState = pfwi->dwFlags;
|
pfData = ExAllocatePoolWithTag(NonPagedPool, sizeof(FLASHDATA), USERTAG_WINDOW);
|
||||||
IntSetProp(pWnd, AtomFlashWndState, (HANDLE) FlashState);
|
|
||||||
return TRUE;
|
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 ( 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);
|
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;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,18 @@
|
||||||
#pragma once
|
#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);
|
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);
|
||||||
|
@ -11,3 +24,4 @@ BOOL FASTCALL IntIsWindowDirty(PWND);
|
||||||
BOOL FASTCALL IntEndPaint(PWND,PPAINTSTRUCT);
|
BOOL FASTCALL IntEndPaint(PWND,PPAINTSTRUCT);
|
||||||
HDC FASTCALL IntBeginPaint(PWND,PPAINTSTRUCT);
|
HDC FASTCALL IntBeginPaint(PWND,PPAINTSTRUCT);
|
||||||
PCURICON_OBJECT FASTCALL NC_IconForWindow( PWND );
|
PCURICON_OBJECT FASTCALL NC_IconForWindow( PWND );
|
||||||
|
BOOL FASTCALL IntFlashWindowEx(PWND,PFLASHWINFO);
|
||||||
|
|
|
@ -345,6 +345,17 @@ SystemTimerProc(HWND hwnd,
|
||||||
}
|
}
|
||||||
return; // Not this window so just return.
|
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:
|
default:
|
||||||
ERR("System Timer Proc invalid id %u!\n", idEvent);
|
ERR("System Timer Proc invalid id %u!\n", idEvent);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue