Changes by JamesAC and spx to the "About" dialog.

This commit is contained in:
jsmorley 2010-08-26 20:50:36 +00:00
parent 494a7c77ce
commit d9137c2413
8 changed files with 220 additions and 153 deletions

View File

@ -28,8 +28,8 @@ LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,3,0,515 FILEVERSION 1,3,0,520
PRODUCTVERSION 1,3,0,515 PRODUCTVERSION 1,3,0,520
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -45,12 +45,12 @@ BEGIN
BLOCK "040b04b0" BLOCK "040b04b0"
BEGIN BEGIN
VALUE "FileDescription", "Rainmeter - A Customizable Resource Meter" VALUE "FileDescription", "Rainmeter - A Customizable Resource Meter"
VALUE "FileVersion", "1, 3, 0, 515" VALUE "FileVersion", "1, 3, 0, 520"
VALUE "InternalName", "Rainmeter" VALUE "InternalName", "Rainmeter"
VALUE "LegalCopyright", "Copyright (C) 2010 - Rainy" VALUE "LegalCopyright", "Copyright (C) 2010 - Rainy"
VALUE "OriginalFilename", "Rainmeter.exe" VALUE "OriginalFilename", "Rainmeter.exe"
VALUE "ProductName", "Rainmeter" VALUE "ProductName", "Rainmeter"
VALUE "ProductVersion", "1, 3, 0, 515" VALUE "ProductVersion", "1, 3, 0, 520"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -29,6 +29,7 @@ extern CRainmeter* Rainmeter;
INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
HWND g_DialogWin = NULL; HWND g_DialogWin = NULL;
VOID UpdateWidgets(HWND window);
struct PLUGIN_INFO struct PLUGIN_INFO
{ {
@ -43,7 +44,7 @@ HWND OpenAboutDialog(HWND hwndOwner, HINSTANCE instance)
if (g_DialogWin == NULL) if (g_DialogWin == NULL)
{ {
g_DialogWin = CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hwndOwner, AboutProc); g_DialogWin = CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hwndOwner, AboutProc);
if (g_DialogWin) if (g_DialogWin)
{ {
HICON hIcon = LoadIcon(instance, MAKEINTRESOURCE(IDI_TRAY)); HICON hIcon = LoadIcon(instance, MAKEINTRESOURCE(IDI_TRAY));
@ -61,72 +62,109 @@ void UpdateAboutStatistics()
if (g_DialogWin != NULL && IsWindowVisible(g_DialogWin)) if (g_DialogWin != NULL && IsWindowVisible(g_DialogWin))
{ {
HWND widget; HWND widget;
widget = GetDlgItem(g_DialogWin, IDC_CONFIG_TAB); widget = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
int selected = TabCtrl_GetCurSel(widget); int selected = (int)SendMessage(widget, LB_GETCURSEL, NULL, NULL);
int count = (int)SendMessage(widget, LB_GETCOUNT, NULL, NULL);
int current = 0; int current = 0;
widget = GetDlgItem(g_DialogWin, IDC_STATISTICS); widget = GetDlgItem(g_DialogWin, IDC_STATISTICS);
SendMessage(widget, WM_SETREDRAW, 0, 0); SendMessage(widget, WM_SETREDRAW, 0, 0);
std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows(); if (selected == 0)
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for( ; iter != windows.end(); ++iter)
{ {
if (current == selected) int count = ListView_GetItemCount(widget);
std::list<CRainmeter::LOG_INFO>::const_iterator iter = Rainmeter->m_LogData.begin();
LVITEM vitem;
vitem.mask = LVIF_TEXT;
int i = 0;
for ( ; iter != Rainmeter->m_LogData.end(); ++iter)
{ {
int count = ListView_GetItemCount(widget); if (i < count)
CMeterWindow* meterWindow = (*iter).second;
std::list<CMeasure*>& measures = meterWindow->GetMeasures();
int index = 0;
std::list<CMeasure*>::const_iterator i = measures.begin();
for( ; i != measures.end(); ++i)
{ {
const WCHAR* name = (*i)->GetName(); ListView_SetItemText(widget, i, 0, (WCHAR*)(*iter).type.c_str());
const WCHAR* val = (*i)->GetStats();
std::wstring range;
WCHAR buffer[256];
double minVal = (*i)->GetMinValue();
double maxVal = (*i)->GetMaxValue();
CMeasure::GetScaledValue(1, minVal, buffer);
range = buffer;
range += L" - ";
CMeasure::GetScaledValue(1, maxVal, buffer);
range += buffer;
if (name && wcslen(name) > 0)
{
if (index < count)
{
ListView_SetItemText(widget, index, 0, (WCHAR*)name);
}
else
{
LVITEM vitem;
vitem.mask = LVIF_TEXT;
vitem.iItem = 0;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)name;
ListView_InsertItem(widget, &vitem);
}
if (val && wcslen(val) > 0)
{
ListView_SetItemText(widget, index, 1, (WCHAR*)val);
}
ListView_SetItemText(widget, index, 2, (WCHAR*)range.c_str());
++index;
}
} }
else
{
vitem.iItem = i;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)(*iter).type.c_str();
ListView_InsertItem(widget, &vitem);
}
ListView_SetItemText(widget, i, 1, (WCHAR*)(*iter).timestamp.c_str());
ListView_SetItemText(widget, i, 2, (WCHAR*)(*iter).message.c_str());
break; ++i;
} }
++current;
} }
else if (selected == 2)
{
widget = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
SendMessage(widget, LB_SETCURSEL, 1, NULL);
UpdateWidgets(g_DialogWin);
}
else if (selected > 2)
{
std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for( ; iter != windows.end(); ++iter)
{
if (current == selected - 3)
{
int count = ListView_GetItemCount(widget);
CMeterWindow* meterWindow = (*iter).second;
std::list<CMeasure*>& measures = meterWindow->GetMeasures();
int index = 0;
std::list<CMeasure*>::const_iterator i = measures.begin();
for( ; i != measures.end(); ++i)
{
const WCHAR* name = (*i)->GetName();
const WCHAR* val = (*i)->GetStats();
std::wstring range;
WCHAR buffer[256];
double minVal = (*i)->GetMinValue();
double maxVal = (*i)->GetMaxValue();
CMeasure::GetScaledValue(1, minVal, buffer);
range = buffer;
range += L" - ";
CMeasure::GetScaledValue(1, maxVal, buffer);
range += buffer;
if (name && wcslen(name) > 0)
{
if (index < count)
{
ListView_SetItemText(widget, index, 0, (WCHAR*)name);
}
else
{
LVITEM vitem;
vitem.mask = LVIF_TEXT;
vitem.iItem = 0;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)name;
ListView_InsertItem(widget, &vitem);
}
if (val && wcslen(val) > 0)
{
ListView_SetItemText(widget, index, 1, (WCHAR*)val);
}
ListView_SetItemText(widget, index, 2, (WCHAR*)range.c_str());
++index;
}
}
break;
}
++current;
}
}
SendMessage(widget, WM_SETREDRAW, 1, 0); SendMessage(widget, WM_SETREDRAW, 1, 0);
} }
} }
@ -134,14 +172,25 @@ void UpdateAboutStatistics()
void UpdateWidgets(HWND window) void UpdateWidgets(HWND window)
{ {
HWND widget; HWND widget;
widget = GetDlgItem(g_DialogWin, IDC_CONFIG_TAB); widget = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
int selected = TabCtrl_GetCurSel(widget); int selected = (int)SendMessage(widget, LB_GETCURSEL, NULL, NULL);
int count = TabCtrl_GetItemCount(widget); int count = (int)SendMessage(widget, LB_GETCOUNT, NULL, NULL);
widget = GetDlgItem(g_DialogWin, IDC_STATISTICS); widget = GetDlgItem(g_DialogWin, IDC_STATISTICS);
ListView_DeleteAllItems(widget); ListView_DeleteAllItems(widget);
if (count == selected + 1) if (selected == 0)
{
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = L"Log Type";
ListView_SetColumn(widget, 0, &lvc);
lvc.pszText = L"Time";
ListView_SetColumn(widget, 1, &lvc);
lvc.pszText = L"Message";
ListView_SetColumn(widget, 2, &lvc);
}
else if (selected == 1)
{ {
LVCOLUMN lvc; LVCOLUMN lvc;
lvc.mask = LVCF_TEXT; lvc.mask = LVCF_TEXT;
@ -185,7 +234,7 @@ void UpdateWidgets(HWND window)
ListView_SetItemState(widget, 0, LVIS_SELECTED, LVIS_SELECTED); ListView_SetItemState(widget, 0, LVIS_SELECTED, LVIS_SELECTED);
} }
} }
else else
{ {
LVCOLUMN lvc; LVCOLUMN lvc;
lvc.mask = LVCF_TEXT; lvc.mask = LVCF_TEXT;
@ -284,12 +333,12 @@ void RepositionControls(HWND hwndDlg)
MapWindowPoints(widget, hwndDlg, (LPPOINT)&wr, 2); MapWindowPoints(widget, hwndDlg, (LPPOINT)&wr, 2);
SetWindowPos(widget, NULL, ((r.right - (wr.right - wr.left)) / 2) + 9, wr.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); SetWindowPos(widget, NULL, ((r.right - (wr.right - wr.left)) / 2) + 9, wr.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDC_CONFIG_TAB); widget = GetDlgItem(hwndDlg, IDC_ABOUT_ENTRIES);
SetWindowPos(widget, NULL, 0, 0, r.right - 22, r.bottom - 175, SWP_NOMOVE | SWP_NOZORDER); SetWindowPos(widget, NULL, 0, 0, (r.right - 28) / 3, r.bottom - 170, SWP_NOMOVE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDC_STATISTICS); widget = GetDlgItem(hwndDlg, IDC_STATISTICS);
SetWindowPos(widget, NULL, 0, 0, r.right - 44, r.bottom - 210, SWP_NOMOVE | SWP_NOZORDER); SetWindowPos(widget, NULL, 18 + ((r.right - 28) / 3), 130, 2 * ((r.right - 28) / 3), r.bottom - 170, SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDOK); widget = GetDlgItem(hwndDlg, IDOK);
SetWindowPos(widget, NULL, (r.right - br.right) / 2, r.bottom - br.bottom - 11, br.right, br.bottom, SWP_NOZORDER); SetWindowPos(widget, NULL, (r.right - br.right) / 2, r.bottom - br.bottom - 9, br.right, br.bottom, SWP_NOZORDER);
} }
BOOL OnInitAboutDialog(HWND window) BOOL OnInitAboutDialog(HWND window)
@ -305,22 +354,27 @@ BOOL OnInitAboutDialog(HWND window)
swprintf(tmpSz, L"Built on %s", ConvertToWide(__DATE__).c_str()); swprintf(tmpSz, L"Built on %s", ConvertToWide(__DATE__).c_str());
SetWindowText(widget, tmpSz); SetWindowText(widget, tmpSz);
// Add tabs for each config // Add entries for each config
widget = GetDlgItem(window, IDC_CONFIG_TAB); widget = GetDlgItem(window, IDC_ABOUT_ENTRIES);
TCITEM tie;
tie.mask = TCIF_TEXT;
std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows(); std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin(); std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
int i = 0; int i = 0;
for( ; iter != windows.end(); ++iter) for( ; iter != windows.end(); ++iter)
{ {
CMeterWindow* meterWindow = (*iter).second; CMeterWindow* meterWindow = (*iter).second;
wchar_t* skinName = (WCHAR*)meterWindow->GetSkinName().c_str();
SendMessage(widget, LB_ADDSTRING, NULL, (LPARAM) skinName);
size_t namelength = wcslen(skinName);
tie.pszText = (WCHAR*)meterWindow->GetSkinName().c_str(); int currwidth = (INT)SendMessage(widget, LB_GETHORIZONTALEXTENT, NULL, NULL);
TabCtrl_InsertItem(widget, i++, &tie); if(6 * namelength > currwidth)
{
SendMessage(widget, LB_SETHORIZONTALEXTENT, 6 * namelength, NULL);
}
} }
tie.pszText = L"Plugins"; SendMessage(widget, LB_INSERTSTRING, 0, (LPARAM) L"Log");
TabCtrl_InsertItem(widget, i, &tie); SendMessage(widget, LB_INSERTSTRING, 1, (LPARAM) L"Plugins");
SendMessage(widget, LB_INSERTSTRING, 2, (LPARAM) L"--------------------");
// Add columns to the list view // Add columns to the list view
widget = GetDlgItem(window, IDC_STATISTICS); widget = GetDlgItem(window, IDC_STATISTICS);
@ -331,15 +385,15 @@ BOOL OnInitAboutDialog(HWND window)
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0; lvc.iSubItem = 0;
lvc.pszText = L"Measure"; lvc.pszText = L"Measure";
lvc.cx = 150; lvc.cx = 110;
lvc.fmt = LVCFMT_LEFT; // left-aligned column lvc.fmt = LVCFMT_LEFT; // left-aligned column
ListView_InsertColumn(widget, 0, &lvc); ListView_InsertColumn(widget, 0, &lvc);
lvc.iSubItem = 1; lvc.iSubItem = 1;
lvc.cx = 130; lvc.cx = 100;
lvc.pszText = L"Value"; lvc.pszText = L"Value";
ListView_InsertColumn(widget, 1, &lvc); ListView_InsertColumn(widget, 1, &lvc);
lvc.iSubItem = 1; lvc.iSubItem = 1;
lvc.cx = 130; lvc.cx = 150;
lvc.pszText = L"Range"; lvc.pszText = L"Range";
ListView_InsertColumn(widget, 2, &lvc); ListView_InsertColumn(widget, 2, &lvc);
@ -374,17 +428,6 @@ INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lPa
RepositionControls(hwndDlg); RepositionControls(hwndDlg);
break; break;
case WM_NOTIFY:
{
LPNMHDR lpnmhdr = (LPNMHDR)lParam;
if (lpnmhdr->code == TCN_SELCHANGE)
{
UpdateWidgets(hwndDlg);
UpdateAboutStatistics();
}
}
break;
case WM_CLOSE: case WM_CLOSE:
Rainmeter->SaveSettings(); Rainmeter->SaveSettings();
DestroyWindow(hwndDlg); DestroyWindow(hwndDlg);
@ -410,6 +453,14 @@ INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lPa
DestroyWindow(hwndDlg); DestroyWindow(hwndDlg);
g_DialogWin = NULL; g_DialogWin = NULL;
return TRUE; return TRUE;
case IDC_ABOUT_ENTRIES:
if (HIWORD(wParam) == LBN_SELCHANGE)
{
UpdateWidgets(hwndDlg);
UpdateAboutStatistics();
}
break;
} }
break; break;
} }

View File

@ -1,4 +1,4 @@
//Microsoft Developer Studio generated resource script. // Microsoft Developer Studio generated resource script.
// //
#include "resource.h" #include "resource.h"
@ -26,7 +26,7 @@ LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
// Menu // Menu
// //
IDR_CONTEXT_MENU MENU DISCARDABLE IDR_CONTEXT_MENU MENU DISCARDABLE
BEGIN BEGIN
POPUP "Context" POPUP "Context"
BEGIN BEGIN
@ -38,20 +38,20 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
POPUP "Logging" POPUP "Logging"
BEGIN BEGIN
MENUITEM "Show Log File...", ID_CONTEXT_SHOWLOGFILE MENUITEM "Show Log File...", ID_CONTEXT_SHOWLOGFILE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Start Logging", ID_CONTEXT_STARTLOG MENUITEM "Start Logging", ID_CONTEXT_STARTLOG
MENUITEM "Stop Logging", ID_CONTEXT_STOPLOG MENUITEM "Stop Logging", ID_CONTEXT_STOPLOG
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Delete Log File...", ID_CONTEXT_DELETELOGFILE MENUITEM "Delete Log File...", ID_CONTEXT_DELETELOGFILE
MENUITEM "Debug Mode", ID_CONTEXT_DEBUGLOG MENUITEM "Debug Mode", ID_CONTEXT_DEBUGLOG
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Exit", ID_CONTEXT_QUIT MENUITEM "Exit", ID_CONTEXT_QUIT
END END
END END
IDR_SKIN_MENU MENU DISCARDABLE IDR_SKIN_MENU MENU DISCARDABLE
BEGIN BEGIN
POPUP "Skin Menu" POPUP "Skin Menu"
BEGIN BEGIN
@ -61,11 +61,11 @@ BEGIN
BEGIN BEGIN
POPUP "Display Monitor" POPUP "Display Monitor"
BEGIN BEGIN
MENUITEM "Use default: Primary monitor", ID_CONTEXT_SKINMENU_MONITOR_PRIMARY MENUITEM "Use default: Primary monitor", ID_CONTEXT_SKINMENU_MONITOR_PRIMARY
MENUITEM "@0: Virtual screen", ID_MONITOR_FIRST MENUITEM "@0: Virtual screen", ID_MONITOR_FIRST
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Auto-select based on window position", ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT MENUITEM "Auto-select based on window position", ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Stay Topmost", ID_CONTEXT_SKINMENU_VERYTOPMOST MENUITEM "Stay Topmost", ID_CONTEXT_SKINMENU_VERYTOPMOST
@ -118,18 +118,18 @@ END
// TEXTINCLUDE // TEXTINCLUDE
// //
1 TEXTINCLUDE DISCARDABLE 1 TEXTINCLUDE DISCARDABLE
BEGIN BEGIN
"resource.h\0" "resource.h\0"
END END
2 TEXTINCLUDE DISCARDABLE 2 TEXTINCLUDE DISCARDABLE
BEGIN BEGIN
"#include ""afxres.h""\r\n" "#include ""afxres.h""\r\n"
"\0" "\0"
END END
3 TEXTINCLUDE DISCARDABLE 3 TEXTINCLUDE DISCARDABLE
BEGIN BEGIN
"\r\n" "\r\n"
"\0" "\0"
@ -143,23 +143,21 @@ END
// Dialog // Dialog
// //
IDD_ABOUT_DIALOG DIALOG DISCARDABLE 0, 0, 351, 225 IDD_ABOUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 370, 240
STYLE DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "About Rainmeter" CAPTION "About Rainmeter"
FONT 8, "MS Shell Dlg 2" FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN BEGIN
CONTROL "List1",IDC_STATISTICS,"SysListView32",LVS_REPORT | CONTROL "List1",IDC_STATISTICS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,118,80,211,100
LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | CTEXT "Get the latest version at: http://www.rainmeter.net",IDC_URL_STRING,15,43,300,8
WS_TABSTOP,14,98,309,98
CTEXT "Get the latest version at: http://www.rainmeter.net",
IDC_URL_STRING,15,43,300,8
CTEXT "Rainmeter version 0.0",IDC_VERSION_STRING,15,17,300,8 CTEXT "Rainmeter version 0.0",IDC_VERSION_STRING,15,17,300,8
CONTROL "Tab1",IDC_CONFIG_TAB,"SysTabControl32",0x0,7,81,220,120
GROUPBOX "About",IDC_STATIC_ABOUT,7,7,220,69 GROUPBOX "About",IDC_STATIC_ABOUT,7,7,220,69
CTEXT "(Built on ??? ?? ????)",IDC_BUILD_STRING,15,30,300,8 CTEXT "(Built on ??? ?? ????)",IDC_BUILD_STRING,15,30,300,8
DEFPUSHBUTTON "OK",IDOK,91,204,50,14 DEFPUSHBUTTON "OK",IDOK,91,204,50,14
CONTROL "Disable check for updates",IDC_DISABLE_VERSION_CHECK, CONTROL "Disable check for updates",IDC_DISABLE_VERSION_CHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,67,56,104,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,67,56,104,10
LISTBOX IDC_ABOUT_ENTRIES,7,80,130,100,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END END
@ -169,7 +167,7 @@ END
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE GUIDELINES DESIGNINFO DISCARDABLE
BEGIN BEGIN
IDD_ABOUT_DIALOG, DIALOG IDD_ABOUT_DIALOG, DIALOG
BEGIN BEGIN

View File

@ -508,6 +508,9 @@ std::wstring ConvertToWide(LPCSTR str)
BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage) BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
{ {
CRainmeter::LOG_INFO logInfo;
logInfo.message = pszMessage;
// Add timestamp // Add timestamp
static DWORD startTime = 0; static DWORD startTime = 0;
@ -520,6 +523,7 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
swprintf(buffer, L"(%02i:%02i:%02i.%03i) ", (time - startTime) / (1000 * 60* 60), ((time - startTime) / (1000 * 60)) % 60, ((time - startTime) / 1000) % 60, (time - startTime) % 1000); swprintf(buffer, L"(%02i:%02i:%02i.%03i) ", (time - startTime) / (1000 * 60* 60), ((time - startTime) / (1000 * 60)) % 60, ((time - startTime) / 1000) % 60, (time - startTime) % 1000);
std::wstring message(buffer); std::wstring message(buffer);
logInfo.timestamp = message;
message += pszMessage; message += pszMessage;
#ifdef _DEBUG #ifdef _DEBUG
@ -527,6 +531,23 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
_RPT0(_CRT_WARN, "\n"); _RPT0(_CRT_WARN, "\n");
#endif #endif
switch(nLevel)
{
case 1:
logInfo.type = L"ERROR";
break;
case 2:
logInfo.type = L"WARNING";
break;
case 3:
logInfo.type = L"NOTICE";
break;
case 4:
logInfo.type = L"DEBUG";
break;
}
Rainmeter->m_LogData.push_front(logInfo);
// Use the lsapi.dll version of the method if possible // Use the lsapi.dll version of the method if possible
if (fpLSLog) if (fpLSLog)
{ {
@ -568,21 +589,7 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
FILE* logFile = _wfopen(logfile.c_str(), L"a+, ccs=UTF-8"); FILE* logFile = _wfopen(logfile.c_str(), L"a+, ccs=UTF-8");
if (logFile) if (logFile)
{ {
switch(nLevel) fputws(logInfo.type.c_str(), logFile);
{
case 1:
fputws(L"ERROR: ", logFile);
break;
case 2:
fputws(L"WARNING: ", logFile);
break;
case 3:
fputws(L"NOTICE: ", logFile);
break;
case 4:
fputws(L"DEBUG: ", logFile);
break;
}
fputws(message.c_str(), logFile); fputws(message.c_str(), logFile);
fputws(L"\n", logFile); fputws(L"\n", logFile);
fclose(logFile); fclose(logFile);
@ -590,7 +597,10 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
} }
} }
} }
if (Rainmeter->m_LogData.size() > MAXABOUTLOGLINES)
{
Rainmeter->m_LogData.pop_back();
}
return TRUE; return TRUE;
} }

View File

@ -28,6 +28,7 @@
#define LM_GETREVID 9265 #define LM_GETREVID 9265
#define LM_REGISTERMESSAGE 9263 #define LM_REGISTERMESSAGE 9263
#define LM_UNREGISTERMESSAGE 9264 #define LM_UNREGISTERMESSAGE 9264
#define MAXABOUTLOGLINES 20
#ifdef _DEBUG #ifdef _DEBUG
#define DEBUGLOG DebugLog #define DEBUGLOG DebugLog

View File

@ -136,6 +136,13 @@ public:
std::vector<CONFIGMENU> children; std::vector<CONFIGMENU> children;
}; };
struct LOG_INFO
{
std::wstring type;
std::wstring timestamp;
std::wstring message;
};
CRainmeter(); CRainmeter();
~CRainmeter(); ~CRainmeter();
@ -196,6 +203,7 @@ public:
void StartLogging(); void StartLogging();
void StopLogging(); void StopLogging();
void DeleteLogFile(); void DeleteLogFile();
std::list<LOG_INFO> m_LogData;
void SetDebug(bool debug); void SetDebug(bool debug);

View File

@ -1,5 +1,5 @@
//{{NO_DEPENDENCIES}} //{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file. // Microsoft Visual C++ generated include file.
// Used by Library.rc // Used by Library.rc
// //
#define IDR_CONTEXT_MENU 101 #define IDR_CONTEXT_MENU 101
@ -13,9 +13,9 @@
#define IDC_STATISTICS_STRING 1003 #define IDC_STATISTICS_STRING 1003
#define IDC_STATIC_ABOUT 1004 #define IDC_STATIC_ABOUT 1004
#define IDC_URL_STRING 1005 #define IDC_URL_STRING 1005
#define IDC_CONFIG_TAB 1006 #define IDC_ABOUT_ENTRIES 1006
#define IDC_AUTHOR_STRING 1007 #define IDC_AUTHOR_STRING 1007
#define IDC_DISABLE_VERSION_CHECK 1008 #define IDC_DISABLE_VERSION_CHECK 1008
#define ID_CONTEXT_REFRESH 4001 #define ID_CONTEXT_REFRESH 4001
#define ID_CONTEXT_QUIT 4002 #define ID_CONTEXT_QUIT 4002
#define ID_CONTEXT_ABOUT 4004 #define ID_CONTEXT_ABOUT 4004
@ -49,29 +49,28 @@
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEIN 4037 #define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEIN 4037
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT 4038 #define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT 4038
#define ID_CONTEXT_SKINMENU_KEEPONSCREEN 4039 #define ID_CONTEXT_SKINMENU_KEEPONSCREEN 4039
#define ID_CONTEXT_SKINMENU_FROMRIGHT 4040 #define ID_CONTEXT_SKINMENU_FROMRIGHT 4040
#define ID_CONTEXT_SKINMENU_FROMBOTTOM 4041 #define ID_CONTEXT_SKINMENU_FROMBOTTOM 4041
#define ID_CONTEXT_SKINMENU_XPERCENTAGE 4042 #define ID_CONTEXT_SKINMENU_XPERCENTAGE 4042
#define ID_CONTEXT_SKINMENU_YPERCENTAGE 4043 #define ID_CONTEXT_SKINMENU_YPERCENTAGE 4043
#define ID_CONTEXT_OPENSKINSFOLDER 4044 #define ID_CONTEXT_OPENSKINSFOLDER 4044
#define ID_CONTEXT_SKINMENU_OPENSKINSFOLDER 4045 #define ID_CONTEXT_SKINMENU_OPENSKINSFOLDER 4045
#define ID_CONTEXT_MANAGETHEMES 4046 #define ID_CONTEXT_MANAGETHEMES 4046
#define ID_CONTEXT_MANAGESKINS 4047 #define ID_CONTEXT_MANAGESKINS 4047
#define ID_CONTEXT_SKINMENU_MONITOR_PRIMARY 4048 #define ID_CONTEXT_SKINMENU_MONITOR_PRIMARY 4048
#define ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT 4049 #define ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT 4049
#define ID_CONTEXT_NEW_VERSION 4050 #define ID_CONTEXT_NEW_VERSION 4050
#define ID_CONTEXT_STARTLOG 4051 #define ID_CONTEXT_STARTLOG 4051
#define ID_CONTEXT_STOPLOG 4052 #define ID_CONTEXT_STOPLOG 4052
#define ID_CONTEXT_DEBUGLOG 4053 #define ID_CONTEXT_DEBUGLOG 4053
#define ID_CONTEXT_DELETELOGFILE 4054 #define ID_CONTEXT_DELETELOGFILE 4054
#define ID_CONFIG_EDIT 30000 #define ID_CONFIG_EDIT 30000
#define ID_CONFIG_FIRST 30001 #define ID_CONFIG_FIRST 30001
#define ID_CONFIG_LAST 33000 #define ID_CONFIG_LAST 33000
#define ID_THEME_FIRST 33001 #define ID_THEME_FIRST 33001
#define ID_THEME_LAST 36000 #define ID_THEME_LAST 36000
#define ID_MONITOR_FIRST 36001 #define ID_MONITOR_FIRST 36001
#define ID_MONITOR_LAST 37000 #define ID_MONITOR_LAST 37000
// Next default values for new objects // Next default values for new objects
// //
@ -79,7 +78,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 110 #define _APS_NEXT_RESOURCE_VALUE 110
#define _APS_NEXT_COMMAND_VALUE 4040 #define _APS_NEXT_COMMAND_VALUE 4040
#define _APS_NEXT_CONTROL_VALUE 1010 #define _APS_NEXT_CONTROL_VALUE 1013
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif

View File

@ -1,3 +1,3 @@
#pragma once #pragma once
const int revision_number = 515; const int revision_number = 520;
const bool revision_beta = true; const bool revision_beta = true;