[SYSDM] General page: Auto-update the system uptime (#4616)

- Also insert curly-brackets for switch-case in GeneralPageProc
- Use correct printf data type for the system uptime

Reviewed-by: Stanislav Motylkov <x86corez@gmail.com>
Reviewed-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
This commit is contained in:
Thamatip Chitpong 2022-08-28 17:20:17 +07:00 committed by GitHub
parent 5f16fbcd47
commit efe25648a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 109 additions and 67 deletions

View file

@ -18,6 +18,7 @@
#define ANIM_STEP 2
#define ANIM_TIME 50
#define ID_SYSUPTIME_UPDATE_TIMER 1
typedef struct _IMGINFO
{
@ -28,8 +29,13 @@ typedef struct _IMGINFO
INT iBits;
} IMGINFO, *PIMGINFO;
typedef ULONGLONG (WINAPI *PFGETTICKCOUNT64)(VOID);
static PIMGINFO pImgInfo;
static const BLENDFUNCTION BlendFunc = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
static HMODULE hKernel32Vista = NULL;
static PFGETTICKCOUNT64 pGetTickCount64 = NULL;
static WCHAR szUptimeFormat[64];
VOID ShowLastWin32Error(HWND hWndOwner)
{
@ -598,73 +604,85 @@ static VOID GetSystemVersion(HWND hwnd)
HeapFree(GetProcessHeap(), 0, pwszStr);
}
ULONGLONG GetSecondsQPC(VOID)
/**
* @brief
* An equivalent of GetTickCount64, implemented using QueryPerformanceCounter.
*
* @return
* The number of milliseconds that have elapsed since the system was started.
*/
static ULONGLONG GetTickCountQPC(VOID)
{
LARGE_INTEGER Counter, Frequency;
QueryPerformanceCounter(&Counter);
QueryPerformanceFrequency(&Frequency);
return Counter.QuadPart / Frequency.QuadPart;
return (Counter.QuadPart * 1000) / Frequency.QuadPart;
}
ULONGLONG GetSeconds(VOID)
static VOID GetSystemUptime(HWND hwndDlg)
{
ULONGLONG (WINAPI * pGetTickCount64)(VOID);
ULONGLONG Ticks64;
HMODULE hModule = GetModuleHandleW(L"kernel32.dll");
HWND hUptimeLabel;
ULONGLONG cMilliseconds;
ULONG cSeconds;
WCHAR szBuf[64];
pGetTickCount64 = (PVOID)GetProcAddress(hModule, "GetTickCount64");
if (pGetTickCount64)
hUptimeLabel = GetDlgItem(hwndDlg, IDC_UPTIME);
if (!hUptimeLabel)
{
return pGetTickCount64() / 1000;
return;
}
hModule = LoadLibraryW(L"kernel32_vista.dll");
if (!hModule)
{
return GetSecondsQPC();
}
pGetTickCount64 = (PVOID)GetProcAddress(hModule, "GetTickCount64");
if (pGetTickCount64)
{
Ticks64 = pGetTickCount64() / 1000;
cMilliseconds = pGetTickCount64();
}
else
{
Ticks64 = GetSecondsQPC();
cMilliseconds = GetTickCountQPC();
}
cSeconds = cMilliseconds / 1000;
StringCchPrintfW(szBuf, _countof(szBuf), szUptimeFormat,
cSeconds / (60*60*24), // Days
(cSeconds / (60*60)) % 24, // Hours
(cSeconds / 60) % 60, // Minutes
cSeconds % 60); // Seconds
SetWindowTextW(hUptimeLabel, szBuf);
FreeLibrary(hModule);
return Ticks64;
/* Set update timer (reset timeout if the timer exists) */
SetTimer(hwndDlg, ID_SYSUPTIME_UPDATE_TIMER, 1000 - (cMilliseconds % 1000), NULL);
}
VOID GetSystemUptime(HWND hwnd)
static VOID InitSystemUptime(HWND hwndDlg)
{
HWND hRosUptime;
WCHAR szBuf[64], szStr[64];
ULONG cSeconds;
HMODULE hKernel32;
hRosUptime = GetDlgItem(hwnd, IDC_UPTIME);
if (!hRosUptime)
/* Load time format string */
if (LoadStringW(hApplet, IDS_UPTIME_FORMAT, szUptimeFormat, _countof(szUptimeFormat)) == 0)
{
return;
}
if (!LoadStringW(hApplet, IDS_UPTIME_FORMAT, szStr, _countof(szStr)))
{
return;
}
cSeconds = GetSeconds();
StringCchPrintfW(szBuf, _countof(szBuf), szStr,
cSeconds / (60*60*24),
(cSeconds / (60*60)) % 24,
(cSeconds / 60) % 60,
cSeconds % 60);
SetWindowTextW(hRosUptime, szBuf);
/* Load required DLLs */
hKernel32 = GetModuleHandleW(L"kernel32.dll");
if (hKernel32)
{
pGetTickCount64 = (PFGETTICKCOUNT64)GetProcAddress(hKernel32, "GetTickCount64");
if (!pGetTickCount64)
{
hKernel32Vista = LoadLibraryW(L"kernel32_vista.dll");
if (hKernel32Vista)
{
pGetTickCount64 = (PFGETTICKCOUNT64)GetProcAddress(hKernel32Vista, "GetTickCount64");
}
}
}
/* Show system uptime and set update timer */
GetSystemUptime(hwndDlg);
}
/* Property page dialog callback */
@ -676,6 +694,7 @@ INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
switch (uMsg)
{
case WM_INITDIALOG:
{
pImgInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMGINFO));
if (pImgInfo == NULL)
{
@ -687,14 +706,36 @@ INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_ROSIMG), GWLP_WNDPROC, (LONG_PTR)RosImageProc);
GetSystemInformation(hwndDlg);
GetSystemVersion(hwndDlg);
GetSystemUptime(hwndDlg);
InitSystemUptime(hwndDlg);
break;
}
case WM_DESTROY:
{
KillTimer(hwndDlg, ID_SYSUPTIME_UPDATE_TIMER);
if (hKernel32Vista)
{
FreeLibrary(hKernel32Vista);
}
HeapFree(GetProcessHeap(), 0, pImgInfo);
break;
}
case WM_TIMER:
{
if (wParam == ID_SYSUPTIME_UPDATE_TIMER)
{
/* Update system uptime */
GetSystemUptime(hwndDlg);
}
break;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == IDC_LICENCE)
{
DialogBox(hApplet, MAKEINTRESOURCE(IDD_LICENCE), hwndDlg, LicenceDlgProc);
@ -702,6 +743,7 @@ INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
return TRUE;
}
break;
}
case WM_DRAWITEM:
{

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "ПБ памет"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Променлива"
IDS_VALUE "Стойност"
IDS_NO_DUMP "(Няма)"

View file

@ -338,7 +338,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Proměnná"
IDS_VALUE "Hodnota"
IDS_NO_DUMP "(Není)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB of RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variable"
IDS_VALUE "Value"
IDS_NO_DUMP "(None)"

View file

@ -342,7 +342,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Tage, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Tage, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variable"
IDS_VALUE "Wert"
IDS_NO_DUMP "(Keine)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB μνήμης RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Μεταβλητή"
IDS_VALUE "Τιμή"
IDS_NO_DUMP "(Κανένα)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB of RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variable"
IDS_VALUE "Value"
IDS_NO_DUMP "(None)"

View file

@ -335,7 +335,7 @@ BEGIN
IDS_PETABYTE "PB de RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variable"
IDS_VALUE "Valor"
IDS_NO_DUMP "(Ninguno)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "Po de RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u jours, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu jours, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variable"
IDS_VALUE "Valeur"
IDS_NO_DUMP "(Aucun)"

View file

@ -335,7 +335,7 @@ BEGIN
IDS_PETABYTE "PB זיכרון פיזי"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "משתנה"
IDS_VALUE "ערך"
IDS_NO_DUMP "(ללא)"

View file

@ -335,7 +335,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u nap, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu nap, %02lu:%02lu:%02lu"
IDS_VARIABLE "Változó"
IDS_VALUE "Érték"
IDS_NO_DUMP "(nincs)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Hari, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Hari, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variabel"
IDS_VALUE "Nilai"
IDS_NO_DUMP "(Tidak ada)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB di RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Giorno, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Giorno, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variabile"
IDS_VALUE "Valore"
IDS_NO_DUMP "(None)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "可変"
IDS_VALUE "値"
IDS_NO_DUMP "(なし)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB of RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variable"
IDS_VALUE "Value"
IDS_NO_DUMP "(None)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB Systemminne"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variabel"
IDS_VALUE "Verdi"
IDS_NO_DUMP "(Ingen)"

View file

@ -342,7 +342,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u dni, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu dni, %02lu:%02lu:%02lu"
IDS_VARIABLE "Zmienna"
IDS_VALUE "Wartość"
IDS_NO_DUMP "(Brak)"

View file

@ -337,7 +337,7 @@ BEGIN
IDS_PETABYTE "PB de RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Dias, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Dias, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variável"
IDS_VALUE "Valor"
IDS_NO_DUMP "(Nenhum)"

View file

@ -342,7 +342,7 @@ BEGIN
IDS_PETABYTE "Po de memorie"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u zile, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu zile, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variabilă"
IDS_VALUE "Valoare"
IDS_NO_DUMP "(Fără fișier de depanare)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "Пб ОЗУ"
IDS_MEGAHERTZ "МГц"
IDS_GIGAHERTZ "ГГц"
IDS_UPTIME_FORMAT "%u дней, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu дней, %02lu:%02lu:%02lu"
IDS_VARIABLE "Переменная"
IDS_VALUE "Значение"
IDS_NO_DUMP "(Нет)"

View file

@ -341,7 +341,7 @@ BEGIN
IDS_PETABYTE "PB pamäte RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Premenná"
IDS_VALUE "Hodnota"
IDS_NO_DUMP "(Žiadne)"

View file

@ -333,7 +333,7 @@ BEGIN
IDS_PETABYTE "PB e RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variablë"
IDS_VALUE "Vlera"
IDS_NO_DUMP "(Asnjë)"

View file

@ -335,7 +335,7 @@ BEGIN
IDS_PETABYTE "PB RAM"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Variabel"
IDS_VALUE "Värde"
IDS_NO_DUMP "(None)"

View file

@ -335,7 +335,7 @@ BEGIN
IDS_PETABYTE "PB Bellek"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u Gün, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Gün, %02lu:%02lu:%02lu"
IDS_VARIABLE "Değişken"
IDS_VALUE "Değer"
IDS_NO_DUMP "(Yok)"

View file

@ -341,7 +341,7 @@ BEGIN
IDS_PETABYTE "Пб ОЗП"
IDS_MEGAHERTZ "МГц"
IDS_GIGAHERTZ "ГГц"
IDS_UPTIME_FORMAT "%u Days, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu Days, %02lu:%02lu:%02lu"
IDS_VARIABLE "Змінна"
IDS_VALUE "Значення"
IDS_NO_DUMP "(Немає)"

View file

@ -342,7 +342,7 @@ BEGIN
IDS_PETABYTE "PB 内存"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u 天,%02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu 天,%02lu:%02lu:%02lu"
IDS_VARIABLE "变量"
IDS_VALUE "值"
IDS_NO_DUMP "(无)"

View file

@ -341,7 +341,7 @@ BEGIN
IDS_PETABYTE "PB 記憶體"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u 日, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu 日, %02lu:%02lu:%02lu"
IDS_VARIABLE "變量"
IDS_VALUE "值"
IDS_NO_DUMP "(無)"

View file

@ -342,7 +342,7 @@ BEGIN
IDS_PETABYTE "PB 記憶體"
IDS_MEGAHERTZ "MHz"
IDS_GIGAHERTZ "GHz"
IDS_UPTIME_FORMAT "%u 天, %02u:%02u:%02u"
IDS_UPTIME_FORMAT "%lu 天, %02lu:%02lu:%02lu"
IDS_VARIABLE "變量"
IDS_VALUE "值"
IDS_NO_DUMP "(無)"