mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[SYSSETUP][TIMEDATE] Use exact setTimer() timeouts, to stay in sync (#3355)
CORE-13121
This commit is contained in:
parent
53005587f4
commit
4cd92f0d01
5 changed files with 42 additions and 27 deletions
|
@ -429,15 +429,6 @@ UINT CTrayClockWnd::CalculateDueTime()
|
||||||
if (!g_TaskbarSettings.bShowSeconds)
|
if (!g_TaskbarSettings.bShowSeconds)
|
||||||
uiDueTime += (59 - (UINT) LocalTime.wSecond) * 1000;
|
uiDueTime += (59 - (UINT) LocalTime.wSecond) * 1000;
|
||||||
|
|
||||||
if (uiDueTime < USER_TIMER_MINIMUM || uiDueTime > USER_TIMER_MAXIMUM)
|
|
||||||
uiDueTime = 1000;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Add an artificial delay of 0.05 seconds to make sure the timer
|
|
||||||
doesn't fire too early*/
|
|
||||||
uiDueTime += 50;
|
|
||||||
}
|
|
||||||
|
|
||||||
return uiDueTime;
|
return uiDueTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,10 +152,10 @@ ClockWndProc(HWND hwnd,
|
||||||
pClockData->hGreyPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
|
pClockData->hGreyPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
|
||||||
pClockData->hGreyBrush = CreateSolidBrush(RGB(128, 128, 128));
|
pClockData->hGreyBrush = CreateSolidBrush(RGB(128, 128, 128));
|
||||||
|
|
||||||
SetTimer(hwnd, ID_TIMER, 1000, NULL);
|
|
||||||
pClockData->bTimer = TRUE;
|
|
||||||
GetLocalTime(&pClockData->stCurrent);
|
GetLocalTime(&pClockData->stCurrent);
|
||||||
pClockData->stPrevious = pClockData->stCurrent;
|
pClockData->stPrevious = pClockData->stCurrent;
|
||||||
|
|
||||||
|
pClockData->bTimer = (SetTimer(hwnd, ID_TIMER, 1000 - pClockData->stCurrent.wMilliseconds, NULL) != 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
|
@ -168,6 +168,12 @@ ClockWndProc(HWND hwnd,
|
||||||
GetLocalTime(&pClockData->stCurrent);
|
GetLocalTime(&pClockData->stCurrent);
|
||||||
InvalidateRect(hwnd, NULL, FALSE);
|
InvalidateRect(hwnd, NULL, FALSE);
|
||||||
pClockData->stPrevious = pClockData->stCurrent;
|
pClockData->stPrevious = pClockData->stCurrent;
|
||||||
|
|
||||||
|
// Reset timeout.
|
||||||
|
if (pClockData->bTimer)
|
||||||
|
{
|
||||||
|
SetTimer(hwnd, ID_TIMER, 1000 - pClockData->stCurrent.wMilliseconds, NULL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
@ -255,8 +261,10 @@ ClockWndProc(HWND hwnd,
|
||||||
case CLM_STARTCLOCK:
|
case CLM_STARTCLOCK:
|
||||||
if (!pClockData->bTimer)
|
if (!pClockData->bTimer)
|
||||||
{
|
{
|
||||||
SetTimer(hwnd, ID_TIMER, 1000, NULL);
|
SYSTEMTIME LocalTime;
|
||||||
pClockData->bTimer = TRUE;
|
|
||||||
|
GetLocalTime(&LocalTime);
|
||||||
|
pClockData->bTimer = (SetTimer(hwnd, ID_TIMER, 1000 - LocalTime.wMilliseconds, NULL) != 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -276,17 +276,20 @@ DateTimePageProc(HWND hwndDlg,
|
||||||
FillMonthsComboBox(GetDlgItem(hwndDlg,
|
FillMonthsComboBox(GetDlgItem(hwndDlg,
|
||||||
IDC_MONTHCB));
|
IDC_MONTHCB));
|
||||||
|
|
||||||
SetTimer(hwndDlg, ID_TIMER, 1000, NULL);
|
|
||||||
|
|
||||||
/* Set range and current year */
|
/* Set range and current year */
|
||||||
SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_SETRANGE, 0, MAKELONG ((short) 9999, (short) 1900));
|
SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_SETRANGE, 0, MAKELONG ((short) 9999, (short) 1900));
|
||||||
SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_SETPOS, 0, MAKELONG( (short) st.wYear, 0));
|
SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_SETPOS, 0, MAKELONG( (short) st.wYear, 0));
|
||||||
|
|
||||||
pOldWndProc = (WNDPROC)SetWindowLongPtrW(GetDlgItem(hwndDlg, IDC_TIMEPICKER), GWLP_WNDPROC, (LONG_PTR)DTPProc);
|
pOldWndProc = (WNDPROC)SetWindowLongPtrW(GetDlgItem(hwndDlg, IDC_TIMEPICKER), GWLP_WNDPROC, (LONG_PTR)DTPProc);
|
||||||
|
|
||||||
|
SetTimer(hwndDlg, ID_TIMER, 1000 - st.wMilliseconds, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPICKER), DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM) &st);
|
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPICKER), DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM) &st);
|
||||||
|
|
||||||
|
// Reset timeout.
|
||||||
|
SetTimer(hwndDlg, ID_TIMER, 1000 - st.wMilliseconds, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
|
@ -347,6 +350,8 @@ DateTimePageProc(HWND hwndDlg,
|
||||||
SendDlgItemMessageW(hwndDlg, IDC_CLOCKWND, CLM_STOPCLOCK,
|
SendDlgItemMessageW(hwndDlg, IDC_CLOCKWND, CLM_STOPCLOCK,
|
||||||
0, 0);
|
0, 0);
|
||||||
|
|
||||||
|
// TODO: Set the clock to the input time.
|
||||||
|
|
||||||
/* Enable the 'Apply' button */
|
/* Enable the 'Apply' button */
|
||||||
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
||||||
break;
|
break;
|
||||||
|
@ -377,11 +382,12 @@ DateTimePageProc(HWND hwndDlg,
|
||||||
|
|
||||||
case PSN_APPLY:
|
case PSN_APPLY:
|
||||||
SetLocalSystemTime(hwndDlg);
|
SetLocalSystemTime(hwndDlg);
|
||||||
SetTimer(hwndDlg, ID_TIMER, 1000, NULL);
|
|
||||||
|
|
||||||
/* Tell the clock to start ticking */
|
/* Tell the clock to start ticking */
|
||||||
SendDlgItemMessageW(hwndDlg, IDC_CLOCKWND, CLM_STARTCLOCK,
|
SendDlgItemMessageW(hwndDlg, IDC_CLOCKWND, CLM_STARTCLOCK,
|
||||||
0, 0);
|
0, 0);
|
||||||
|
|
||||||
|
SetTimer(hwndDlg, ID_TIMER, 1000 - st.wMilliseconds, NULL);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -238,11 +238,6 @@ MonthCalSetupDayTimer(IN PMONTHCALWND infoPtr)
|
||||||
uElapse += (59 - (UINT)LocalTime.wMinute) * 60 * 1000;
|
uElapse += (59 - (UINT)LocalTime.wMinute) * 60 * 1000;
|
||||||
uElapse += (23 - (UINT)LocalTime.wHour) * 60 * 60 * 1000;
|
uElapse += (23 - (UINT)LocalTime.wHour) * 60 * 60 * 1000;
|
||||||
|
|
||||||
if (uElapse < USER_TIMER_MINIMUM || uElapse > USER_TIMER_MAXIMUM)
|
|
||||||
uElapse = 1000;
|
|
||||||
else
|
|
||||||
uElapse += 100; /* Add a delay of 0.1 seconds */
|
|
||||||
|
|
||||||
/* Setup the new timer */
|
/* Setup the new timer */
|
||||||
if (SetTimer(infoPtr->hSelf,
|
if (SetTimer(infoPtr->hSelf,
|
||||||
ID_DAYTIMER,
|
ID_DAYTIMER,
|
||||||
|
|
|
@ -1542,11 +1542,8 @@ SetSystemLocalTime(HWND hwnd, PSETUPDATA SetupData)
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
UpdateLocalSystemTime(HWND hwnd)
|
UpdateLocalSystemTime(HWND hwnd, SYSTEMTIME LocalTime)
|
||||||
{
|
{
|
||||||
SYSTEMTIME LocalTime;
|
|
||||||
|
|
||||||
GetLocalTime(&LocalTime);
|
|
||||||
DateTime_SetSystemtime(GetDlgItem(hwnd, IDC_DATEPICKER), GDT_VALID, &LocalTime);
|
DateTime_SetSystemtime(GetDlgItem(hwnd, IDC_DATEPICKER), GDT_VALID, &LocalTime);
|
||||||
DateTime_SetSystemtime(GetDlgItem(hwnd, IDC_TIMEPICKER), GDT_VALID, &LocalTime);
|
DateTime_SetSystemtime(GetDlgItem(hwnd, IDC_TIMEPICKER), GDT_VALID, &LocalTime);
|
||||||
}
|
}
|
||||||
|
@ -1625,25 +1622,43 @@ DateTimePageDlgProc(HWND hwndDlg,
|
||||||
}
|
}
|
||||||
|
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
UpdateLocalSystemTime(hwndDlg);
|
{
|
||||||
|
SYSTEMTIME LocalTime;
|
||||||
|
|
||||||
|
GetLocalTime(&LocalTime);
|
||||||
|
UpdateLocalSystemTime(hwndDlg, LocalTime);
|
||||||
|
|
||||||
|
// Reset timeout.
|
||||||
|
SetTimer(hwndDlg, 1, 1000 - LocalTime.wMilliseconds, NULL);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_NOTIFY:
|
case WM_NOTIFY:
|
||||||
switch (((LPNMHDR)lParam)->code)
|
switch (((LPNMHDR)lParam)->code)
|
||||||
{
|
{
|
||||||
case PSN_SETACTIVE:
|
case PSN_SETACTIVE:
|
||||||
|
{
|
||||||
|
SYSTEMTIME LocalTime;
|
||||||
|
|
||||||
|
GetLocalTime(&LocalTime);
|
||||||
|
UpdateLocalSystemTime(hwndDlg, LocalTime);
|
||||||
|
|
||||||
/* Enable the Back and Next buttons */
|
/* Enable the Back and Next buttons */
|
||||||
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
||||||
|
|
||||||
if (SetupData->UnattendSetup && WriteDateTimeSettings(hwndDlg, SetupData))
|
if (SetupData->UnattendSetup && WriteDateTimeSettings(hwndDlg, SetupData))
|
||||||
{
|
{
|
||||||
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, SetupData->uFirstNetworkWizardPage);
|
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, SetupData->uFirstNetworkWizardPage);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
SetTimer(hwndDlg, 1, 1000, NULL);
|
|
||||||
|
SetTimer(hwndDlg, 1, 1000 - LocalTime.wMilliseconds, NULL);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case PSN_KILLACTIVE:
|
case PSN_KILLACTIVE:
|
||||||
case DTN_DATETIMECHANGE:
|
case DTN_DATETIMECHANGE:
|
||||||
|
// NB: Not re-set until changing page (PSN_SETACTIVE).
|
||||||
KillTimer(hwndDlg, 1);
|
KillTimer(hwndDlg, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue