- Added Manage dialog, which consolidates RainBrowser and RainThemes into a single UI

- Updated About dialog
- Removed RainBrowser and RainThemes from build
This commit is contained in:
Birunthan Mohanathas 2011-08-28 10:58:26 +00:00
parent 6debf4b780
commit 69f3ab1803
22 changed files with 3784 additions and 1220 deletions

View File

@ -1,611 +0,0 @@
/*
Copyright (C) 2000 Kimmo Pekkola
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "StdAfx.h"
#include "Rainmeter.h"
#include "System.h"
#include "MeterWindow.h"
#include "Measure.h"
#include "resource.h"
#include "AboutDialog.h"
#include "../Version.h"
#define LOGTIMER 1
#define WM_DELAYED_CLOSE WM_APP + 0
extern CRainmeter* Rainmeter;
INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
void UpdateWidgets();
BOOL OnInitAboutDialog(HWND window);
HWND g_DialogWin = NULL;
WINDOWPLACEMENT g_DialogPlacement = {0};
struct PLUGIN_INFO
{
std::wstring name;
UINT version;
std::wstring author;
};
std::vector<PLUGIN_INFO> g_Plugins;
HWND OpenAboutDialog(HWND hwndOwner, HINSTANCE instance)
{
if (g_DialogWin == NULL)
{
g_DialogWin = CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), hwndOwner, AboutProc);
if (g_DialogWin)
{
HICON hIcon = LoadIcon(instance, MAKEINTRESOURCE(IDI_TRAY));
SendMessage(g_DialogWin, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
if (g_DialogPlacement.length == 0)
{
g_DialogPlacement.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(g_DialogWin, &g_DialogPlacement);
}
SetWindowPlacement(g_DialogWin, &g_DialogPlacement);
}
}
else
{
if (!IsZoomed(g_DialogWin))
{
ShowWindow(g_DialogWin, SW_SHOWNORMAL);
}
}
UpdateAboutStatistics();
return g_DialogWin;
}
void UpdateAboutDialog()
{
if (g_DialogWin != NULL && IsWindowVisible(g_DialogWin))
{
WCHAR* selectedItemName = NULL;
HWND widget;
widget = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
int selected = (int)SendMessage(widget, LB_GETCURSEL, 0, 0);
// Get current selected entry
if (selected != 0 && selected != 1 && selected != LB_ERR)
{
int selectedItemLen = (int)SendMessage(widget, LB_GETTEXTLEN, selected, 0);
if (selectedItemLen != LB_ERR)
{
selectedItemName = new WCHAR[selectedItemLen + 1];
if (LB_ERR != SendMessage(widget, LB_GETTEXT, selected, (LPARAM)selectedItemName))
{
selectedItemName[selectedItemLen] = L'\0';
}
else
{
delete [] selectedItemName;
selectedItemName = NULL;
}
}
}
// Delete all entries
SendMessage(widget, LB_RESETCONTENT, 0, 0);
// Update all dialog widgets
OnInitAboutDialog(g_DialogWin);
// Re-select entry
if (selected == 0 || selected == 1)
{
SendMessage(widget, LB_SETCURSEL, selected, 0);
UpdateWidgets();
}
else if (selectedItemName != NULL)
{
int sel = 3;
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{
if (_wcsicmp(selectedItemName, (*iter).first.c_str()) == 0)
{
SendMessage(widget, LB_SETCURSEL, sel, 0);
break;
}
++sel;
}
delete [] selectedItemName;
}
}
}
void UpdateAboutStatistics(LPCTSTR entryName)
{
if (g_DialogWin != NULL && IsWindowVisible(g_DialogWin))
{
HWND widget;
widget = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
int selected = (int)SendMessage(widget, LB_GETCURSEL, NULL, NULL);
int count = (int)SendMessage(widget, LB_GETCOUNT, NULL, NULL);
if (selected != LB_ERR)
{
widget = GetDlgItem(g_DialogWin, IDC_STATISTICS);
SendMessage(widget, WM_SETREDRAW, 0, 0);
if (selected == 0)
{
if (entryName == NULL)
{
int count = ListView_GetItemCount(widget);
std::list<CRainmeter::LOG_INFO>::const_iterator iter = Rainmeter->GetAboutLogData().begin();
LVITEM vitem;
vitem.mask = LVIF_TEXT;
int i = 0;
for ( ; iter != Rainmeter->GetAboutLogData().end(); ++iter)
{
if (i < count)
{
ListView_SetItemText(widget, i, 0, (WCHAR*)(*iter).timestamp.c_str());
}
else
{
vitem.iItem = i;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)(*iter).timestamp.c_str();
ListView_InsertItem(widget, &vitem);
}
ListView_SetItemText(widget, i, 1, (WCHAR*)(*iter).type.c_str());
ListView_SetItemText(widget, i, 2, (WCHAR*)(*iter).message.c_str());
++i;
}
}
}
else if (selected == 2)
{
HWND widgetEnt;
widgetEnt = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
SendMessage(widgetEnt, LB_SETCURSEL, 1, NULL);
UpdateWidgets();
}
else
{
int current = 3;
const 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)
{
if (entryName == NULL || _wcsicmp(entryName, (*iter).first.c_str()) == 0)
{
int count = ListView_GetItemCount(widget);
CMeterWindow* meterWindow = (*iter).second;
const 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();
WCHAR buffer[256];
double minVal = (*i)->GetMinValue();
double maxVal = (*i)->GetMaxValue();
CMeasure::GetScaledValue(AUTOSCALE_ON, 1, minVal, buffer, _countof(buffer));
std::wstring range = buffer;
range += L" - ";
CMeasure::GetScaledValue(AUTOSCALE_ON, 1, maxVal, buffer, _countof(buffer));
range += buffer;
if (name && *name)
{
if (index < count)
{
ListView_SetItemText(widget, index, 0, (WCHAR*)name);
}
else
{
LVITEM vitem;
vitem.mask = LVIF_TEXT;
vitem.iItem = index;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)name;
ListView_InsertItem(widget, &vitem);
}
ListView_SetItemText(widget, index, 1, (WCHAR*)range.c_str());
if (val)
{
ListView_SetItemText(widget, index, 2, (WCHAR*)val);
}
++index;
}
}
if (count > index)
{
// Delete unnecessary items
for (int j = index; j < count; ++j)
{
ListView_DeleteItem(widget, index);
}
}
}
break;
}
++current;
}
}
SendMessage(widget, WM_SETREDRAW, 1, 0);
}
}
}
void UpdateWidgets()
{
HWND widget;
widget = GetDlgItem(g_DialogWin, IDC_ABOUT_ENTRIES);
int selected = (int)SendMessage(widget, LB_GETCURSEL, NULL, NULL);
widget = GetDlgItem(g_DialogWin, IDC_STATISTICS);
ListView_DeleteAllItems(widget);
if (selected == 0)
{
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = L"Time";
ListView_SetColumn(widget, 0, &lvc);
lvc.pszText = L"Type";
ListView_SetColumn(widget, 1, &lvc);
lvc.pszText = L"Message";
ListView_SetColumn(widget, 2, &lvc);
}
else if (selected == 1)
{
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = L"Plugin";
ListView_SetColumn(widget, 0, &lvc);
lvc.pszText = L"Version";
ListView_SetColumn(widget, 1, &lvc);
lvc.pszText = L"Author";
ListView_SetColumn(widget, 2, &lvc);
// Update the list of plugins
if (g_Plugins.empty())
{
ScanPlugins();
}
std::vector<PLUGIN_INFO>::const_iterator iter = g_Plugins.begin();
LVITEM vitem;
vitem.mask = LVIF_TEXT;
int i = 0;
for ( ; iter != g_Plugins.end(); ++iter)
{
if (!(*iter).name.empty())
{
vitem.iItem = i;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)(*iter).name.c_str();
ListView_InsertItem(widget, &vitem);
}
if ((*iter).version != 0)
{
WCHAR buffer[64];
_snwprintf_s(buffer, _TRUNCATE, L"%u.%u", (*iter).version / 1000, (*iter).version % 1000);
ListView_SetItemText(widget, i, 1, buffer);
}
ListView_SetItemText(widget, i, 2, (WCHAR*)(*iter).author.c_str());
++i;
}
if (!g_Plugins.empty())
{
ListView_SetItemState(widget, 0, LVIS_SELECTED, LVIS_SELECTED);
}
}
else
{
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = L"Measure";
ListView_SetColumn(widget, 0, &lvc);
lvc.pszText = L"Range";
ListView_SetColumn(widget, 1, &lvc);
lvc.pszText = L"Value";
ListView_SetColumn(widget, 2, &lvc);
}
}
typedef LPCTSTR (*GETPLUGINAUTHOR)();
typedef UINT (*GETPLUGINVERSION)();
void ScanPlugins()
{
WIN32_FIND_DATA fileData; // Data structure describes the file found
HANDLE hSearch; // Search handle returned by FindFirstFile
std::wstring files = Rainmeter->GetPluginPath() + L"*.dll";
// Start searching for .ini files in the given directory.
hSearch = FindFirstFile(files.c_str(), &fileData);
do
{
if (hSearch == INVALID_HANDLE_VALUE) break; // No more files found
PLUGIN_INFO info;
info.name = fileData.cFileName;
info.version = 0;
// Try to get the version and author
std::wstring tmpSz = Rainmeter->GetPluginPath() + fileData.cFileName;
DWORD err = 0;
HMODULE dll = CSystem::RmLoadLibrary(tmpSz.c_str(), &err, true);
if (dll)
{
GETPLUGINAUTHOR GetAuthorFunc = (GETPLUGINAUTHOR)GetProcAddress(dll, "GetPluginAuthor");
if (GetAuthorFunc)
{
LPCTSTR author = GetAuthorFunc();
if (author && *author)
{
info.author = author;
}
}
GETPLUGINVERSION GetVersionFunc = (GETPLUGINVERSION)GetProcAddress(dll, "GetPluginVersion");
if (GetVersionFunc)
{
info.version = GetVersionFunc();
}
FreeLibrary(dll);
}
else
{
LogWithArgs(LOG_WARNING, L"Unable to load plugin: \"%s\", ErrorCode=%u", tmpSz.c_str(), err);
}
g_Plugins.push_back(info);
}
while (FindNextFile(hSearch, &fileData));
FindClose(hSearch);
}
void RepositionControls(HWND hwndDlg)
{
RECT r, br, ar, sr, wr;
HWND widget;
GetClientRect(hwndDlg, &r);
GetClientRect(GetDlgItem(hwndDlg, IDOK), &br);
GetClientRect(GetDlgItem(hwndDlg, IDC_STATIC_ABOUT), &ar);
GetClientRect(GetDlgItem(hwndDlg, IDC_VERSION_STRING), &sr);
// Reposition the statistics widgets
widget = GetDlgItem(hwndDlg, IDC_STATIC_ABOUT);
SetWindowPos(widget, NULL, 0, 0, r.right - 22, ar.bottom, SWP_NOMOVE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDC_VERSION_STRING);
SetWindowPos(widget, NULL, 0, 0, r.right - 44, sr.bottom, SWP_NOMOVE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDC_BUILD_STRING);
SetWindowPos(widget, NULL, 0, 0, r.right - 44, sr.bottom, SWP_NOMOVE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDC_URL_STRING);
SetWindowPos(widget, NULL, 0, 0, r.right - 44, sr.bottom, SWP_NOMOVE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDC_DISABLE_VERSION_CHECK);
GetClientRect(widget, &wr);
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);
widget = GetDlgItem(hwndDlg, IDC_ABOUT_ENTRIES);
SetWindowPos(widget, NULL, 0, 0, (r.right < 800) ? ((r.right - 28) / 3) : 257, r.bottom - 170, SWP_NOMOVE | SWP_NOZORDER);
widget = GetDlgItem(hwndDlg, IDOK);
SetWindowPos(widget, NULL, (r.right - br.right) / 2, r.bottom - br.bottom - 9, br.right, br.bottom, SWP_NOZORDER);
// Set listbox width and adjust third column
widget = GetDlgItem(hwndDlg, IDC_STATISTICS);
SetWindowPos(widget, NULL, (r.right < 800) ? (18 + ((r.right - 28) / 3)) : 275, 130, (r.right < 800) ? (2 * ((r.right - 28) / 3)) : (r.right - 287), r.bottom - 170, SWP_NOZORDER);
LVCOLUMN lvc;
lvc.mask = LVCF_WIDTH;
lvc.cx = ((r.right < 800) ? (2 * ((r.right - 28) / 3)) : (r.right - 287)) - 200;
ListView_SetColumn(widget, 2, &lvc);
}
BOOL OnInitAboutDialog(HWND window)
{
WCHAR tmpSz[256];
HWND widget;
widget = GetDlgItem(window, IDC_VERSION_STRING);
_snwprintf_s(tmpSz, _TRUNCATE, L"%s %s%s rev %i %s", APPNAME, APPVERSION, revision_beta ? L" beta" : L"", revision_number, APPBITS);
SetWindowText(widget, tmpSz);
widget = GetDlgItem(window, IDC_BUILD_STRING);
_snwprintf_s(tmpSz, _TRUNCATE, L"Built on %s", ConvertToWide(__DATE__).c_str());
SetWindowText(widget, tmpSz);
CheckDlgButton(window, IDC_DISABLE_VERSION_CHECK, Rainmeter->GetDisableVersionCheck() ? BST_CHECKED : BST_UNCHECKED);
// Add entries for each config
widget = GetDlgItem(window, IDC_ABOUT_ENTRIES);
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{
CMeterWindow* meterWindow = (*iter).second;
const std::wstring& skinName = meterWindow->GetSkinName();
SendMessage(widget, LB_ADDSTRING, NULL, (LPARAM)skinName.c_str());
size_t namelength = skinName.length();
int currwidth = (int)SendMessage(widget, LB_GETHORIZONTALEXTENT, NULL, NULL);
if (6 * (int)namelength > currwidth)
{
SendMessage(widget, LB_SETHORIZONTALEXTENT, 6 * namelength, NULL);
}
}
SendMessage(widget, LB_INSERTSTRING, 0, (LPARAM) L"Log");
SendMessage(widget, LB_INSERTSTRING, 1, (LPARAM) L"Plugins");
SendMessage(widget, LB_INSERTSTRING, 2, (LPARAM) L"--------------------");
// Select Log entry
SendMessage(widget, LB_SETCURSEL, 0, 0);
SetTimer(window, LOGTIMER, 1000, NULL);
if (g_DialogWin == NULL)
{
// Add columns to the list view
widget = GetDlgItem(window, IDC_STATISTICS);
//ListView_SetExtendedListViewStyleEx(widget, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
ListView_SetExtendedListViewStyleEx(widget, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = L"Time";
lvc.cx = 110;
lvc.fmt = LVCFMT_LEFT; // left-aligned column
ListView_InsertColumn(widget, 0, &lvc);
lvc.iSubItem = 1;
lvc.cx = 85;
lvc.pszText = L"Type";
ListView_InsertColumn(widget, 1, &lvc);
lvc.iSubItem = 2;
lvc.cx = 170;
lvc.pszText = L"Message";
ListView_InsertColumn(widget, 2, &lvc);
}
UpdateWidgets();
RepositionControls(window);
return TRUE;
}
INT_PTR CALLBACK AboutProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return OnInitAboutDialog(hwndDlg);
case WM_WINDOWPOSCHANGING:
{
WINDOWPOS* pos = (WINDOWPOS*)lParam;
pos->cx = max(420, pos->cx);
pos->cy = max(340, pos->cy);
}
return TRUE;
case WM_SIZE:
RepositionControls(hwndDlg);
return TRUE;
case WM_CLOSE:
PostMessage(hwndDlg, WM_DELAYED_CLOSE, 0, 0);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_DISABLE_VERSION_CHECK:
if (IsDlgButtonChecked(hwndDlg, IDC_DISABLE_VERSION_CHECK))
{
Rainmeter->SetDisableVersionCheck(TRUE);
}
else
{
Rainmeter->SetDisableVersionCheck(FALSE);
}
return TRUE;
case IDOK:
PostMessage(hwndDlg, WM_DELAYED_CLOSE, 0, 0);
return TRUE;
case IDC_ABOUT_ENTRIES:
if (HIWORD(wParam) == LBN_SELCHANGE)
{
KillTimer(hwndDlg, LOGTIMER);
HWND widget = GetDlgItem(hwndDlg, IDC_ABOUT_ENTRIES);
if (widget != NULL)
{
if (0 == (int)SendMessage(widget, LB_GETCURSEL, 0, 0))
{
SetTimer(g_DialogWin, LOGTIMER, 1000, NULL);
}
}
UpdateWidgets();
UpdateAboutStatistics();
return TRUE;
}
break;
}
break;
case WM_DELAYED_CLOSE:
KillTimer(hwndDlg, LOGTIMER);
Rainmeter->SaveSettings();
GetWindowPlacement(hwndDlg, &g_DialogPlacement);
if (g_DialogPlacement.showCmd == SW_SHOWMINIMIZED)
{
g_DialogPlacement.showCmd = SW_SHOWNORMAL;
}
DestroyWindow(hwndDlg);
g_DialogWin = NULL;
g_Plugins.clear();
return TRUE;
case WM_TIMER:
if (wParam == LOGTIMER)
{
UpdateAboutStatistics();
return TRUE;
}
break;
}
return FALSE;
}

View File

@ -1,32 +0,0 @@
/*
Copyright (C) 2000 Kimmo Pekkola
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _ABOUTDIALOG_H_
#define _ABOUTDIALOG_H_
#include "MeterWindow.h"
#define MAXABOUTLOGLINES 20
HWND OpenAboutDialog(HWND hwndOwner, HINSTANCE instance);
void UpdateAboutDialog();
void UpdateAboutStatistics(LPCTSTR entryName = NULL);
void ScanPlugins();
#endif

123
Library/Dialog.cpp Normal file
View File

@ -0,0 +1,123 @@
/*
Copyright (C) 2011 Birunthan Mohanathas
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "StdAfx.h"
#include "Dialog.h"
/*
** CDialog
**
** Constructor.
**
*/
CDialog::CDialog(HWND wnd) :
m_Window(wnd),
m_Font(),
m_FontBold()
{
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
m_Font = CreateFontIndirect(&ncm.lfMenuFont);
ncm.lfMenuFont.lfWeight = FW_BOLD;
ncm.lfMenuFont.lfHeight -= 2;
m_FontBold = CreateFontIndirect(&ncm.lfMenuFont);
}
/*
** CDialog
**
** Destructor.
**
*/
CDialog::~CDialog()
{
DeleteObject(m_Font);
DeleteObject(m_FontBold);
}
/*
** SetDialogFont
**
** Sets dialog font to UI font.
**
*/
void CDialog::SetDialogFont()
{
EnumChildWindows(m_Window, SetFontProc, (WPARAM)m_Font);
}
/*
** SetFontProc
**
** Callback for EnumChildWindows().
**
*/
BOOL CALLBACK CDialog::SetFontProc(HWND hWnd, LPARAM lParam)
{
SendMessage(hWnd, WM_SETFONT, (WPARAM)lParam, 0);
return TRUE;
}
/*
** OnColorDialog
**
** Paints dialog background.
**
*/
INT_PTR CDialog::OnColorDialog(WPARAM wParam, LPARAM lParam)
{
return (INT_PTR)GetStockObject(WHITE_BRUSH);
}
/*
** OnColorStatic
**
** Paints control text and background.
**
*/
INT_PTR CDialog::OnColorStatic(WPARAM wParam, LPARAM lParam)
{
HDC hdc = (HDC)wParam;
SetTextColor(hdc, (COLORREF)GetSysColor(COLOR_WINDOWTEXT));
SetBkMode(hdc, TRANSPARENT);
return OnColorDialog(wParam, lParam);
}
/*
** CTab
**
** Constructor.
**
*/
CTab::CTab(HWND wnd) : CDialog(wnd),
m_Initialized(false)
{
}
/*
** CTab
**
** Destructor.
**
*/
CTab::~CTab()
{
DestroyWindow(m_Window);
}

59
Library/Dialog.h Normal file
View File

@ -0,0 +1,59 @@
/*
Copyright (C) 2011 Birunthan Mohanathas
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _DIALOG_H_
#define _DIALOG_H_
class CDialog
{
public:
HWND GetWindow() { return m_Window; }
protected:
CDialog(HWND wnd);
virtual ~CDialog();
void SetDialogFont();
static INT_PTR OnColorDialog(WPARAM wParam, LPARAM lParam);
static INT_PTR OnColorStatic(WPARAM wParam, LPARAM lParam);
HWND m_Window;
HFONT m_Font;
HFONT m_FontBold;
private:
static BOOL CALLBACK SetFontProc(HWND hWnd, LPARAM lParam);
};
class CTab : public CDialog
{
public:
bool IsInitialized() { return m_Initialized; }
virtual void Initialize() {}
virtual void Resize(int w, int h) {}
protected:
CTab(HWND wnd);
virtual ~CTab();
bool m_Initialized;
};
#endif

962
Library/DialogAbout.cpp Normal file
View File

@ -0,0 +1,962 @@
/*
Copyright (C) 2011 Birunthan Mohanathas, Kimmo Pekkola
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "StdAfx.h"
#include "Rainmeter.h"
#include "System.h"
#include "MeterWindow.h"
#include "Measure.h"
#include "resource.h"
#include "DialogAbout.h"
#include "../Version.h"
#define WM_DELAYED_CLOSE WM_APP + 0
extern CRainmeter* Rainmeter;
WINDOWPLACEMENT CDialogAbout::c_WindowPlacement = {0};
CDialogAbout* CDialogAbout::c_Dialog = NULL;
/*
** CDialogAbout
**
** Constructor.
**
*/
CDialogAbout::CDialogAbout(HWND wnd) : CDialog(wnd),
m_TabLog(),
m_TabMeasures(),
m_TabPlugins()
{
}
/*
** ~CDialogAbout
**
** Destructor.
**
*/
CDialogAbout::~CDialogAbout()
{
delete m_TabLog;
delete m_TabMeasures;
delete m_TabPlugins;
}
/*
** Open
**
** Opens the About dialog.
**
*/
void CDialogAbout::Open(int tab)
{
if (!c_Dialog)
{
HINSTANCE instance = Rainmeter->GetInstance();
HWND owner = Rainmeter->GetTrayWindow()->GetWindow();
if (!CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUT_DIALOG), owner, DlgProc)) return;
}
else
{
if (!IsZoomed(c_Dialog->m_Window))
{
ShowWindow(c_Dialog->m_Window, SW_SHOWNORMAL);
}
}
BringWindowToTop(c_Dialog->m_Window);
// Fake WM_NOTIFY to change tab
NMHDR nm;
nm.code = TCN_SELCHANGE;
nm.idFrom = IDC_ABOUT_TAB;
nm.hwndFrom = GetDlgItem(c_Dialog->m_Window, IDC_ABOUT_TAB);
TabCtrl_SetCurSel(nm.hwndFrom, tab);
c_Dialog->OnNotify(0, (LPARAM)&nm);
}
void CDialogAbout::AddLogItem(int level, LPCWSTR time, LPCWSTR message)
{
if (c_Dialog && c_Dialog->m_TabLog && c_Dialog->m_TabLog->IsInitialized())
{
c_Dialog->m_TabLog->AddItem(level, time, message);
}
}
void CDialogAbout::UpdateSkins()
{
if (c_Dialog && c_Dialog->m_TabMeasures && c_Dialog->m_TabMeasures->IsInitialized())
{
c_Dialog->m_TabMeasures->UpdateSkinList();
}
}
void CDialogAbout::UpdateMeasures(LPCTSTR entryName)
{
if (c_Dialog && c_Dialog->m_TabMeasures && c_Dialog->m_TabMeasures->IsInitialized())
{
c_Dialog->m_TabMeasures->UpdateMeasureList(entryName);
}
}
/*
** DlgProc
**
** Dialog procedure for the About dialog.
**
*/
INT_PTR CALLBACK CDialogAbout::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (!c_Dialog)
{
if (uMsg == WM_INITDIALOG)
{
c_Dialog = new CDialogAbout(hWnd);
return c_Dialog->OnInitDialog(wParam, lParam);
}
}
else
{
switch (uMsg)
{
case WM_COMMAND:
return c_Dialog->OnCommand(wParam, lParam);
case WM_NOTIFY:
return c_Dialog->OnNotify(wParam, lParam);
case WM_GETMINMAXINFO:
{
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
mmi->ptMinTrackSize.x = 400;
mmi->ptMinTrackSize.y = 250;
}
return TRUE;
case WM_SIZE:
{
if (wParam != SIZE_MINIMIZED)
{
int w = LOWORD(lParam);
int h = HIWORD(lParam);
RECT r;
HWND item = GetDlgItem(hWnd, IDC_ABOUT_TAB);
SetWindowPos(item, NULL, 0, 0, w - 18, h - 47, SWP_NOMOVE | SWP_NOZORDER);
item = GetDlgItem(hWnd, IDC_ABOUT_VERSION_TEXT);
GetClientRect(item, &r);
SetWindowPos(item, NULL, 8, h - r.bottom - 11, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
item = GetDlgItem(hWnd, IDCLOSE);
GetClientRect(item, &r);
SetWindowPos(item, NULL, w - r.right - 9, h - r.bottom - 8, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
c_Dialog->m_TabLog->Resize(w - 48, h - 100);
c_Dialog->m_TabMeasures->Resize(w - 48, h - 100);
c_Dialog->m_TabPlugins->Resize(w - 48, h - 100);
}
}
return TRUE;
case WM_CLOSE:
PostMessage(hWnd, WM_DELAYED_CLOSE, 0, 0);
return TRUE;
case WM_DESTROY:
delete c_Dialog;
c_Dialog = NULL;
return FALSE;
case WM_DELAYED_CLOSE:
GetWindowPlacement(hWnd, &c_WindowPlacement);
if (c_WindowPlacement.showCmd == SW_SHOWMINIMIZED)
{
c_WindowPlacement.showCmd = SW_SHOWNORMAL;
}
DestroyWindow(hWnd);
return TRUE;
}
}
return FALSE;
}
INT_PTR CDialogAbout::OnInitDialog(WPARAM wParam, LPARAM lParam)
{
HICON hIcon = LoadIcon(Rainmeter->GetInstance(), MAKEINTRESOURCE(IDI_TRAY));
SendMessage(m_Window, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
if (c_WindowPlacement.length == 0)
{
c_WindowPlacement.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(m_Window, &c_WindowPlacement);
}
SetWindowPlacement(m_Window, &c_WindowPlacement);
HWND item = GetDlgItem(m_Window, IDC_ABOUT_TAB);
TCITEM tci = {0};
tci.mask = TCIF_TEXT;
tci.pszText = L"Log";
TabCtrl_InsertItem(item, 0, &tci);
tci.pszText = L"Measures";
TabCtrl_InsertItem(item, 1, &tci);
tci.pszText = L"Plugins";
TabCtrl_InsertItem(item, 2, &tci);
item = GetDlgItem(m_Window, IDC_ABOUT_VERSION_TEXT);
WCHAR tmpSz[128];
_snwprintf_s(tmpSz, _TRUNCATE, L"%s %s%s r%i %s (%s)", APPNAME, APPVERSION, revision_beta ? L" beta" : L"", revision_number, APPBITS, APPDATE);
SetWindowText(item, tmpSz);
HINSTANCE instance = Rainmeter->GetInstance();
m_TabLog = new CTabLog(CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUTLOG_DIALOG), m_Window, CDialogAbout::CTabLog::DlgProc));
m_TabMeasures = new CTabMeasures(CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUTMEASURES_DIALOG), m_Window, CDialogAbout::CTabMeasures::DlgProc));
m_TabPlugins = new CTabPlugins(CreateDialog(instance, MAKEINTRESOURCE(IDD_ABOUTPLUGINS_DIALOG), m_Window, CDialogAbout::CTabPlugins::DlgProc));
if (CSystem::GetOSPlatform() >= OSPLATFORM_VISTA)
{
// Use UI font (Segoe UI) on Vista+
SetDialogFont();
}
return TRUE;
}
INT_PTR CDialogAbout::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDCLOSE:
PostMessage(m_Window, WM_DELAYED_CLOSE, 0, 0);
break;
default:
return FALSE;
}
return TRUE;
}
INT_PTR CDialogAbout::OnNotify(WPARAM wParam, LPARAM lParam)
{
LPNMHDR nm = (LPNMHDR)lParam;
switch (nm->idFrom)
{
case IDC_ABOUT_TAB:
if (nm->code == TCN_SELCHANGE)
{
CTab* tab;
int sel = TabCtrl_GetCurSel(nm->hwndFrom);
if (sel == 0)
{
tab = m_TabLog;
}
else if (sel == 1)
{
tab = m_TabMeasures;
}
else // if (sel == 2)
{
tab = m_TabPlugins;
}
if (tab)
{
if (!tab->IsInitialized())
{
tab->Initialize();
}
BringWindowToTop(tab->GetWindow());
}
}
break;
default:
return FALSE;
}
return TRUE;
}
// -----------------------------------------------------------------------------------------------
//
// Log tab
//
// -----------------------------------------------------------------------------------------------
/*
** CTabLog
**
** Constructor.
**
*/
CDialogAbout::CTabLog::CTabLog(HWND wnd) : CTab(wnd),
m_Error(true),
m_Warning(true),
m_Notice(true),
m_Debug(true)
{
}
/*
** Initialize
**
** Called when tab is displayed.
**
*/
void CDialogAbout::CTabLog::Initialize()
{
m_Initialized = true;
// Add columns to the list view
HWND item = GetDlgItem(m_Window, IDC_ABOUTLOG_ITEMS_LISTVIEW);
ListView_SetExtendedListViewStyleEx(item, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
// Set folder/.ini icons for tree list
HIMAGELIST hImageList = ImageList_Create(16, 16, ILC_COLOR32, 2, 10);
HMODULE hDLL = LoadLibrary(L"user32.dll");
HICON hIcon = (HICON)LoadImage(hDLL, MAKEINTRESOURCE(103), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
ImageList_AddIcon(hImageList, hIcon);
DeleteObject(hIcon);
hIcon = (HICON)LoadImage(hDLL, MAKEINTRESOURCE(101), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
ImageList_AddIcon(hImageList, hIcon);
DeleteObject(hIcon);
hIcon = (HICON)LoadImage(hDLL, MAKEINTRESOURCE(104), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
ImageList_AddIcon(hImageList, hIcon);
DeleteObject(hIcon);
FreeLibrary(hDLL);
ListView_SetImageList(item, (WPARAM)hImageList, LVSIL_SMALL);
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT; // left-aligned column
lvc.iSubItem = 0;
lvc.pszText = L"Type";
lvc.cx = 75;
ListView_InsertColumn(item, 0, &lvc);
lvc.iSubItem = 1;
lvc.cx = 85;
lvc.pszText = L"Time";
ListView_InsertColumn(item, 1, &lvc);
lvc.iSubItem = 2;
lvc.cx = 370;
lvc.pszText = L"Message";
ListView_InsertColumn(item, 2, &lvc);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_ERROR_CHECKBOX);
Button_SetCheck(item, BST_CHECKED);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_WARNING_CHECKBOX);
Button_SetCheck(item, BST_CHECKED);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_NOTICE_CHECKBOX);
Button_SetCheck(item, BST_CHECKED);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_DEBUG_CHECKBOX);
Button_SetCheck(item, BST_CHECKED);
}
/*
** Resize
**
** Resizes window and repositions controls.
**
*/
void CDialogAbout::CTabLog::Resize(int w, int h)
{
SetWindowPos(m_Window, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
HWND item = GetDlgItem(m_Window, IDC_ABOUTLOG_ITEMS_LISTVIEW);
SetWindowPos(item, NULL, 0, 0, w, h - 22, SWP_NOMOVE | SWP_NOZORDER);
// Adjust third colum
LVCOLUMN lvc;
lvc.mask = LVCF_WIDTH;
lvc.cx = w - 183;
ListView_SetColumn(item, 2, &lvc);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_ERROR_CHECKBOX);
SetWindowPos(item, NULL, 0, h - 15, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_WARNING_CHECKBOX);
SetWindowPos(item, NULL, 75, h - 15, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_NOTICE_CHECKBOX);
SetWindowPos(item, NULL, 150, h - 15, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
item = GetDlgItem(m_Window, IDC_ABOUTLOG_DEBUG_CHECKBOX);
SetWindowPos(item, NULL, 225, h - 15, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
/*
** AddItem
**
** Adds item to log.
**
*/
void CDialogAbout::CTabLog::AddItem(int level, LPCWSTR time, LPCWSTR message)
{
LVITEM vitem;
vitem.mask = LVIF_IMAGE | LVIF_TEXT;
vitem.iItem = 0;
vitem.iSubItem = 0;
switch (level)
{
case LOG_ERROR:
if (!m_Error) return;
vitem.pszText = L"Error";
vitem.iImage = 0;
break;
case LOG_WARNING:
if (!m_Error) return;
vitem.pszText = L"Warning";
vitem.iImage = 1;
break;
case LOG_NOTICE:
if (!m_Notice) return;
vitem.pszText = L"Notice";
vitem.iImage = 2;
break;
case LOG_DEBUG:
if (!m_Debug) return;
vitem.pszText = L"Debug";
vitem.iImage = -1;
break;
}
HWND item = GetDlgItem(m_Window, IDC_ABOUTLOG_ITEMS_LISTVIEW);
ListView_InsertItem(item, &vitem);
ListView_SetItemText(item, vitem.iItem, 1, (WCHAR*)time);
ListView_SetItemText(item, vitem.iItem, 2, (WCHAR*)message);
if (!ListView_IsItemVisible(item, 0))
{
ListView_Scroll(item, 0, 16);
}
}
/*
** DlgProc
**
** Dialog procedure for the log dialog.
**
*/
INT_PTR CALLBACK CDialogAbout::CTabLog::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
return c_Dialog->m_TabLog->OnCommand(wParam, lParam);
case WM_CTLCOLORDLG:
return OnColorDialog(wParam, lParam);
case WM_CTLCOLORBTN:
case WM_CTLCOLORSTATIC:
return OnColorStatic(wParam, lParam);
}
return FALSE;
}
INT_PTR CDialogAbout::CTabLog::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDC_ABOUTLOG_ERROR_CHECKBOX:
if (HIWORD(wParam) == BN_CLICKED)
{
m_Error = !m_Error;
}
break;
case IDC_ABOUTLOG_WARNING_CHECKBOX:
if (HIWORD(wParam) == BN_CLICKED)
{
m_Warning = !m_Warning;
}
break;
case IDC_ABOUTLOG_NOTICE_CHECKBOX:
if (HIWORD(wParam) == BN_CLICKED)
{
m_Notice = !m_Notice;
}
break;
case IDC_ABOUTLOG_DEBUG_CHECKBOX:
if (HIWORD(wParam) == BN_CLICKED)
{
m_Debug = !m_Debug;
}
break;
default:
return FALSE;
}
return TRUE;
}
// -----------------------------------------------------------------------------------------------
//
// Measures tab
//
// -----------------------------------------------------------------------------------------------
/*
** CTabMeasures
**
** Constructor.
**
*/
CDialogAbout::CTabMeasures::CTabMeasures(HWND wnd) : CTab(wnd)
{
}
/*
** Initialize
**
** Called when tab is displayed.
**
*/
void CDialogAbout::CTabMeasures::Initialize()
{
m_Initialized = true;
// Add columns to the list view
HWND item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTVIEW);
ListView_SetExtendedListViewStyleEx(item, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = L"Name";
lvc.cx = 120;
lvc.fmt = LVCFMT_LEFT; // left-aligned column
ListView_InsertColumn(item, 0, &lvc);
lvc.iSubItem = 1;
lvc.cx = 90;
lvc.pszText = L"Range";
ListView_InsertColumn(item, 1, &lvc);
lvc.iSubItem = 2;
lvc.cx = 160;
lvc.pszText = L"Value";
ListView_InsertColumn(item, 2, &lvc);
// Add entries for each config
item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTBOX);
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{
CMeterWindow* meterWindow = (*iter).second;
const std::wstring& skinName = meterWindow->GetSkinName();
SendMessage(item, LB_ADDSTRING, NULL, (LPARAM)skinName.c_str());
size_t namelength = skinName.length();
int currwidth = (int)SendMessage(item, LB_GETHORIZONTALEXTENT, NULL, NULL);
if (6 * (int)namelength > currwidth)
{
SendMessage(item, LB_SETHORIZONTALEXTENT, 6 * namelength, NULL);
}
}
// Select first item
SendMessage(item, LB_SETCURSEL, 0, 0);
}
/*
** Resize
**
** Resizes window and repositions controls.
**
*/
void CDialogAbout::CTabMeasures::Resize(int w, int h)
{
SetWindowPos(m_Window, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
HWND item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTVIEW);
SetWindowPos(item, NULL, 0, 0, w - 160, h, SWP_NOMOVE | SWP_NOZORDER);
// Adjust third colum
LVCOLUMN lvc;
lvc.mask = LVCF_WIDTH;
lvc.cx = w - 392;
ListView_SetColumn(item, 2, &lvc);
item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTBOX);
SetWindowPos(item, NULL, 0, 0, 150, h, SWP_NOMOVE | SWP_NOZORDER);
}
/*
** UpdateSkinList
**
** Updates the list of skins.
**
*/
void CDialogAbout::CTabMeasures::UpdateSkinList()
{
WCHAR* selectedItemName = NULL;
HWND item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTBOX);
int selected = (int)SendMessage(item, LB_GETCURSEL, 0, 0);
// Get current selected entry
if (selected != LB_ERR)
{
int selectedItemLen = (int)SendMessage(item, LB_GETTEXTLEN, selected, 0);
if (selectedItemLen != LB_ERR)
{
selectedItemName = new WCHAR[selectedItemLen + 1];
if (LB_ERR != SendMessage(item, LB_GETTEXT, selected, (LPARAM)selectedItemName))
{
selectedItemName[selectedItemLen] = L'\0';
}
else
{
delete [] selectedItemName;
selectedItemName = NULL;
}
}
}
// Delete all entries
SendMessage(item, LB_RESETCONTENT, 0, 0);
// TODO Move following to common
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{
CMeterWindow* meterWindow = (*iter).second;
const std::wstring& skinName = meterWindow->GetSkinName();
SendMessage(item, LB_ADDSTRING, NULL, (LPARAM)skinName.c_str());
size_t namelength = skinName.length();
int currwidth = (int)SendMessage(item, LB_GETHORIZONTALEXTENT, NULL, NULL);
if (6 * (int)namelength > currwidth)
{
SendMessage(item, LB_SETHORIZONTALEXTENT, 6 * namelength, NULL);
}
}
if (selectedItemName != NULL)
{
int sel = 0;
SendMessage(item, LB_SETCURSEL, sel, 0);
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for ( ; iter != windows.end(); ++iter)
{
if (_wcsicmp(selectedItemName, (*iter).first.c_str()) == 0)
{
SendMessage(item, LB_SETCURSEL, sel, 0);
break;
}
++sel;
}
delete [] selectedItemName;
}
}
/*
** UpdateSkinList
**
** Updates the list of measures and values.
**
*/
void CDialogAbout::CTabMeasures::UpdateMeasureList(LPCTSTR entryName)
{
HWND item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTBOX);
int selected = (int)SendMessage(item, LB_GETCURSEL, NULL, NULL);
const std::map<std::wstring, CMeterWindow*>& windows = Rainmeter->GetAllMeterWindows();
std::map<std::wstring, CMeterWindow*>::const_iterator iter = windows.begin();
for (int i = 0; iter != windows.end(); ++i, ++iter)
{
if (i == selected &&
(entryName == NULL || _wcsicmp(entryName, (*iter).first.c_str()) == 0))
{
item = GetDlgItem(m_Window, IDC_ABOUTMEASURES_ITEMS_LISTVIEW);
SendMessage(item, WM_SETREDRAW, 0, 0);
int count = ListView_GetItemCount(item);
int index = 0;
CMeterWindow* meterWindow = (*iter).second;
const std::list<CMeasure*>& measures = meterWindow->GetMeasures();
std::list<CMeasure*>::const_iterator j = measures.begin();
for ( ; j != measures.end(); ++j)
{
const WCHAR* name = (*j)->GetName();
const WCHAR* val = (*j)->GetStats();
WCHAR buffer[256];
double minVal = (*j)->GetMinValue();
double maxVal = (*j)->GetMaxValue();
CMeasure::GetScaledValue(AUTOSCALE_ON, 1, minVal, buffer, _countof(buffer));
std::wstring range = buffer;
range += L" - ";
CMeasure::GetScaledValue(AUTOSCALE_ON, 1, maxVal, buffer, _countof(buffer));
range += buffer;
if (name && *name)
{
if (index < count)
{
ListView_SetItemText(item, index, 0, (WCHAR*)name);
}
else
{
LVITEM vitem;
vitem.mask = LVIF_TEXT;
vitem.iItem = index;
vitem.iSubItem = 0;
vitem.pszText = (WCHAR*)name;
ListView_InsertItem(item, &vitem);
}
ListView_SetItemText(item, index, 1, (WCHAR*)range.c_str());
if (val)
{
ListView_SetItemText(item, index, 2, (WCHAR*)val);
}
++index;
}
}
if (count > index)
{
// Delete unnecessary items
for (int j = index; j < count; ++j)
{
ListView_DeleteItem(item, index);
}
}
SendMessage(item, WM_SETREDRAW, 1, 0);
break;
}
}
}
/*
** DlgProc
**
** Dialog procedure for the measures dialog.
**
*/
INT_PTR CALLBACK CDialogAbout::CTabMeasures::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
return c_Dialog->m_TabMeasures->OnCommand(wParam, lParam);
case WM_CTLCOLORDLG:
return OnColorDialog(wParam, lParam);
case WM_CTLCOLORBTN:
case WM_CTLCOLORSTATIC:
return OnColorStatic(wParam, lParam);
}
return FALSE;
}
INT_PTR CDialogAbout::CTabMeasures::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDC_ABOUTMEASURES_ITEMS_LISTBOX:
if (HIWORD(wParam) == LBN_SELCHANGE)
{
UpdateMeasureList(NULL);
}
break;
default:
return FALSE;
}
return TRUE;
}
// -----------------------------------------------------------------------------------------------
//
// Plugins tab
//
// -----------------------------------------------------------------------------------------------
/*
** CTabPlugins
**
** Constructor.
**
*/
CDialogAbout::CTabPlugins::CTabPlugins(HWND wnd) : CTab(wnd)
{
}
/*
** Initialize
**
** Called when tab is displayed.
**
*/
void CDialogAbout::CTabPlugins::Initialize()
{
m_Initialized = true;
// Add columns to the list view
HWND item = GetDlgItem(m_Window, IDC_ABOUTPLUGINS_ITEMS_LISTVIEW);
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = L"Name";
lvc.cx = 140;
lvc.fmt = LVCFMT_LEFT; // left-aligned column
ListView_InsertColumn(item, 0, &lvc);
lvc.iSubItem = 1;
lvc.cx = 80;
lvc.pszText = L"Version";
ListView_InsertColumn(item, 1, &lvc);
lvc.iSubItem = 2;
lvc.cx = 310;
lvc.pszText = L"Author";
ListView_InsertColumn(item, 2, &lvc);
LVITEM vitem;
vitem.mask = LVIF_TEXT;
vitem.iItem = 0;
vitem.iSubItem = 0;
// Scan for plugins
WIN32_FIND_DATA fileData; // Data structure describes the file found
HANDLE hSearch; // Search handle returned by FindFirstFile
std::wstring files = Rainmeter->GetPluginPath() + L"*.dll";
// Start searching for .ini files in the given directory.
hSearch = FindFirstFile(files.c_str(), &fileData);
int index = 0;
do
{
if (hSearch == INVALID_HANDLE_VALUE) break; // No more files found
// Try to get the version and author
std::wstring tmpSz = Rainmeter->GetPluginPath() + fileData.cFileName;
DWORD err = 0;
HMODULE dll = CSystem::RmLoadLibrary(tmpSz.c_str(), &err, true);
if (dll)
{
vitem.iItem = index;
vitem.pszText = fileData.cFileName;
ListView_InsertItem(item, &vitem);
GETPLUGINVERSION GetVersionFunc = (GETPLUGINVERSION)GetProcAddress(dll, "GetPluginVersion");
if (GetVersionFunc)
{
UINT version = GetVersionFunc();
WCHAR buffer[64];
_snwprintf_s(buffer, _TRUNCATE, L"%u.%u", version / 1000, version % 1000);
ListView_SetItemText(item, vitem.iItem, 1, buffer);
}
GETPLUGINAUTHOR GetAuthorFunc = (GETPLUGINAUTHOR)GetProcAddress(dll, "GetPluginAuthor");
if (GetAuthorFunc)
{
LPCTSTR author = GetAuthorFunc();
if (author && *author)
{
ListView_SetItemText(item, vitem.iItem, 2, (LPWSTR)author);
}
}
++index;
FreeLibrary(dll);
}
else
{
LogWithArgs(LOG_ERROR, L"Unable to load plugin: %s (%u)", tmpSz.c_str(), err);
}
}
while (FindNextFile(hSearch, &fileData));
FindClose(hSearch);
LSLog(LOG_ERROR, L"Rainmeter", L"here end");
}
/*
** Resize
**
** Resizes window and repositions controls.
**
*/
void CDialogAbout::CTabPlugins::Resize(int w, int h)
{
SetWindowPos(m_Window, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
HWND item = GetDlgItem(m_Window, IDC_ABOUTPLUGINS_ITEMS_LISTVIEW);
SetWindowPos(item, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
// Adjust third colum
LVCOLUMN lvc;
lvc.mask = LVCF_WIDTH;
lvc.cx = w - 242;
ListView_SetColumn(item, 2, &lvc);
}
/*
** DlgProc
**
** Dialog procedure for the Plugins tab.
**
*/
INT_PTR CALLBACK CDialogAbout::CTabPlugins::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CTLCOLORDLG:
return OnColorDialog(wParam, lParam);
case WM_CTLCOLORBTN:
case WM_CTLCOLORSTATIC:
return OnColorStatic(wParam, lParam);
}
return FALSE;
}

105
Library/DialogAbout.h Normal file
View File

@ -0,0 +1,105 @@
/*
Copyright (C) 2011 Birunthan Mohanathas
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _DIALOGABOUT_H_
#define _DIALOGABOUT_H_
#include "MeterWindow.h"
#include "TrayWindow.h"
#include "Dialog.h"
class CDialogAbout : public CDialog
{
public:
CDialogAbout(HWND window);
virtual ~CDialogAbout();
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnInitDialog(WPARAM wParam, LPARAM lParam);
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
static void Open(int tab = 0);
static void AddLogItem(int level, LPCWSTR time, LPCWSTR message);
static void UpdateSkins();
static void UpdateMeasures(LPCTSTR entryName = NULL);
static WINDOWPLACEMENT c_WindowPlacement;
static CDialogAbout* c_Dialog;
private:
// Log tab
class CTabLog : public CTab
{
public:
CTabLog(HWND window);
virtual void Initialize();
virtual void Resize(int w, int h);
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
void AddItem(int level, LPCWSTR time, LPCWSTR message);
private:
bool m_Error;
bool m_Warning;
bool m_Notice;
bool m_Debug;
};
// Measures tab
class CTabMeasures : public CTab
{
public:
CTabMeasures(HWND window);
virtual void Initialize();
virtual void Resize(int w, int h);
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
void UpdateSkinList();
void UpdateMeasureList(LPCTSTR entryName);
};
// Plugins tab
class CTabPlugins : public CTab
{
public:
CTabPlugins(HWND window);
virtual void Initialize();
virtual void Resize(int w, int h);
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
private:
typedef LPCTSTR (*GETPLUGINAUTHOR)();
typedef UINT (*GETPLUGINVERSION)();
};
CTabLog* m_TabLog;
CTabMeasures* m_TabMeasures;
CTabPlugins* m_TabPlugins;
};
#endif

1769
Library/DialogManage.cpp Normal file

File diff suppressed because it is too large Load Diff

115
Library/DialogManage.h Normal file
View File

@ -0,0 +1,115 @@
/*
Copyright (C) 2011 Birunthan Mohanathas
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _DIALOGMANAGE_H_
#define _DIALOGMANAGE_H_
#include "MeterWindow.h"
#include "Rainmeter.h"
#include "TrayWindow.h"
#include "Dialog.h"
class CDialogManage : public CDialog
{
public:
CDialogManage(HWND window);
virtual ~CDialogManage();
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnInitDialog(WPARAM wParam, LPARAM lParam);
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
static void Open(int tab = 0);
static void OpenSkin(CMeterWindow* meterWindow);
static void UpdateSkins(CMeterWindow* meterWindow, bool deleted = false);
static void UpdateThemes();
static WINDOWPLACEMENT c_WindowPlacement;
static CDialogManage* c_Dialog;
private:
// Skins tab
class CTabSkins : public CTab
{
public:
CTabSkins(HWND window);
virtual void Initialize();
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
void Update(CMeterWindow* meterWindow, bool deleted);
static void SelectTreeItem(HWND tree, HTREEITEM item, LPCWSTR name);
private:
void SetControls();
void DisableControls(bool clear = false);
void ReadSkin();
static void PopulateTree(HWND tree, TV_INSERTSTRUCT& tvi, const std::vector<CRainmeter::CONFIGMENU>& configMenuData);
std::wstring m_FileName;
std::wstring m_SkinName;
CMeterWindow* m_SkinWindow;
bool m_HandleCommands;
bool m_IgnoreUpdate;
};
// Themes tab
class CTabThemes : public CTab
{
public:
CTabThemes(HWND window);
virtual void Initialize();
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
void Update();
private:
bool m_LoadTheme;
};
// Settings tab
class CTabSettings : public CTab
{
public:
CTabSettings(HWND window);
virtual void Initialize();
static INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR OnNotify(WPARAM wParam, LPARAM lParam);
INT_PTR OnCommand(WPARAM wParam, LPARAM lParam);
};
CTabSkins* m_TabSkins;
CTabThemes* m_TabThemes;
CTabSettings* m_TabSettings;
};
#endif

View File

@ -1,5 +1,6 @@
// Microsoft Developer Studio generated resource script. // Microsoft Developer Studio generated resource script.
// //
#include <Windows.h>
#include "resource.h" #include "resource.h"
#include "../Version.h" #include "../Version.h"
@ -68,50 +69,49 @@ END
// Menu // Menu
// //
IDR_CONTEXT_MENU MENU DISCARDABLE IDR_CONTEXT_MENU MENU
BEGIN BEGIN
POPUP "Rainmeter Menu" POPUP "Rainmeter"
BEGIN BEGIN
MENUITEM "About...", ID_CONTEXT_ABOUT MENUITEM "Manage", ID_CONTEXT_MANAGE
MENUITEM "Downloads", ID_CONTEXT_DOWNLOADS MENUITEM "About", ID_CONTEXT_ABOUT
MENUITEM "Help", ID_CONTEXT_SHOW_HELP MENUITEM "Help", ID_CONTEXT_SHOW_HELP
MENUITEM SEPARATOR MENUITEM SEPARATOR
POPUP "Configs" POPUP "Skins"
BEGIN BEGIN
MENUITEM "No configs available", 0, GRAYED MENUITEM "No skins available", 0, GRAYED
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Open Skins' Folder", ID_CONTEXT_OPENSKINSFOLDER MENUITEM "Open folder", ID_CONTEXT_OPENSKINSFOLDER
MENUITEM "Disable Dragging", ID_CONTEXT_DISABLEDRAG MENUITEM "Disable dragging", ID_CONTEXT_DISABLEDRAG
MENUITEM "Manage Skins...", ID_CONTEXT_MANAGESKINS
END END
POPUP "Themes" POPUP "Themes"
BEGIN BEGIN
MENUITEM "Manage Themes...", ID_CONTEXT_MANAGETHEMES MENUITEM "No themes available", 0, GRAYED
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Edit Settings...", ID_CONTEXT_EDITCONFIG MENUITEM "Edit settings", ID_CONTEXT_EDITCONFIG
MENUITEM "Refresh All", ID_CONTEXT_REFRESH MENUITEM "Refresh all", ID_CONTEXT_REFRESH
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
BEGIN BEGIN
POPUP "Skin Menu" POPUP "Skin"
BEGIN BEGIN
MENUITEM " ", ID_CONTEXT_SKINMENU_OPENSKINSFOLDER MENUITEM "", ID_CONTEXT_SKINMENU_OPENSKINSFOLDER
MENUITEM SEPARATOR MENUITEM SEPARATOR
POPUP "Variants" POPUP "Variants"
BEGIN BEGIN
@ -122,7 +122,7 @@ BEGIN
BEGIN BEGIN
POPUP "Position" POPUP "Position"
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
@ -131,16 +131,16 @@ BEGIN
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
MENUITEM "Topmost", ID_CONTEXT_SKINMENU_TOPMOST MENUITEM "Topmost", ID_CONTEXT_SKINMENU_TOPMOST
MENUITEM "Normal", ID_CONTEXT_SKINMENU_NORMAL MENUITEM "Normal", ID_CONTEXT_SKINMENU_NORMAL
MENUITEM "Bottom", ID_CONTEXT_SKINMENU_BOTTOM MENUITEM "Bottom", ID_CONTEXT_SKINMENU_BOTTOM
MENUITEM "On Desktop", ID_CONTEXT_SKINMENU_ONDESKTOP MENUITEM "On desktop", ID_CONTEXT_SKINMENU_ONDESKTOP
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "From Right", ID_CONTEXT_SKINMENU_FROMRIGHT MENUITEM "From right", ID_CONTEXT_SKINMENU_FROMRIGHT
MENUITEM "From Bottom", ID_CONTEXT_SKINMENU_FROMBOTTOM MENUITEM "From bottom", ID_CONTEXT_SKINMENU_FROMBOTTOM
MENUITEM "X as Percentage", ID_CONTEXT_SKINMENU_XPERCENTAGE MENUITEM "X as percentage", ID_CONTEXT_SKINMENU_XPERCENTAGE
MENUITEM "Y as Percentage", ID_CONTEXT_SKINMENU_YPERCENTAGE MENUITEM "Y as percentage", ID_CONTEXT_SKINMENU_YPERCENTAGE
END END
POPUP "Transparency" POPUP "Transparency"
BEGIN BEGIN
@ -159,89 +159,178 @@ BEGIN
MENUITEM "Fade out", ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT MENUITEM "Fade out", ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Hide on Mouse Over", ID_CONTEXT_SKINMENU_HIDEONMOUSE MENUITEM "Hide on mouse over", ID_CONTEXT_SKINMENU_HIDEONMOUSE
MENUITEM "Draggable", ID_CONTEXT_SKINMENU_DRAGGABLE MENUITEM "Draggable", ID_CONTEXT_SKINMENU_DRAGGABLE
MENUITEM "Save Position", ID_CONTEXT_SKINMENU_REMEMBERPOSITION MENUITEM "Save position", ID_CONTEXT_SKINMENU_REMEMBERPOSITION
MENUITEM "Snap to Edges", ID_CONTEXT_SKINMENU_SNAPTOEDGES MENUITEM "Snap to edges", ID_CONTEXT_SKINMENU_SNAPTOEDGES
MENUITEM "Click Through", ID_CONTEXT_SKINMENU_CLICKTHROUGH MENUITEM "Click through", ID_CONTEXT_SKINMENU_CLICKTHROUGH
MENUITEM "Keep on Screen", ID_CONTEXT_SKINMENU_KEEPONSCREEN MENUITEM "Keep on screen", ID_CONTEXT_SKINMENU_KEEPONSCREEN
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Edit Skin...", ID_CONTEXT_SKINMENU_EDITSKIN MENUITEM "Manage skin", ID_CONTEXT_SKINMENU_MANAGESKIN
MENUITEM "Refresh Skin", ID_CONTEXT_SKINMENU_REFRESH MENUITEM "Edit skin", ID_CONTEXT_SKINMENU_EDITSKIN
MENUITEM "Refresh skin", ID_CONTEXT_SKINMENU_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Close Skin", ID_CONTEXT_CLOSESKIN MENUITEM "Close skin", ID_CONTEXT_CLOSESKIN
END END
END END
IDR_MANAGESKINS_MENU MENU
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN BEGIN
"resource.h\0" POPUP "Folder"
BEGIN
MENUITEM "Expand", ID_CONTEXT_MANAGESKINSMENU_EXPAND
MENUITEM "Open folder", ID_CONTEXT_MANAGESKINSMENU_OPENFOLDER
END
POPUP "Item"
BEGIN
MENUITEM "Load", ID_CONTEXT_MANAGESKINSMENU_LOAD
MENUITEM "Refresh", ID_CONTEXT_MANAGESKINSMENU_REFRESH
MENUITEM "Edit", ID_CONTEXT_MANAGESKINSMENU_EDIT
END
END END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Dialog // Dialog
// //
IDD_ABOUT_DIALOG DIALOGEX 0, 0, 400, 210
IDD_ABOUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 370, 240 STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | 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| WS_EX_CONTROLPARENT
EXSTYLE WS_EX_APPWINDOW
CAPTION "About Rainmeter" CAPTION "About Rainmeter"
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0 FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN BEGIN
GROUPBOX "About",IDC_STATIC_ABOUT,7,7,220,69 CONTROL "", IDC_ABOUT_TAB, "SysTabControl32", TCS_TABS | TCS_FIXEDWIDTH, 6, 6, 388, 181
CTEXT "Rainmeter version 0.0",IDC_VERSION_STRING,15,17,300,8 LTEXT "", IDC_ABOUT_VERSION_TEXT, 5, 194, 200, 9
CTEXT "(Built on ??? ?? ????)",IDC_BUILD_STRING,15,30,300,8 DEFPUSHBUTTON "Close", IDCLOSE, 344, 191, 50, 14
CTEXT "Get the latest version at www.rainmeter.net",IDC_URL_STRING,15,43,300,8
CONTROL "Disable check for updates",IDC_DISABLE_VERSION_CHECK,
"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
CONTROL "List1",IDC_STATISTICS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,118,80,211,100
DEFPUSHBUTTON "OK",IDOK,91,204,50,14
END END
IDD_ABOUTLOG_DIALOG DIALOGEX 15, 30, 370, 148
///////////////////////////////////////////////////////////////////////////// STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
// FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN BEGIN
IDD_ABOUT_DIALOG, DIALOG CONTROL "", IDC_ABOUTLOG_ITEMS_LISTVIEW, "SysListView32", LVS_ICON | LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 0, 0, 368, 135
BEGIN AUTOCHECKBOX "Error", IDC_ABOUTLOG_ERROR_CHECKBOX, 0, 139, 50, 9
LEFTMARGIN, 7 AUTOCHECKBOX "Warning", IDC_ABOUTLOG_WARNING_CHECKBOX, 50, 139, 50, 9
RIGHTMARGIN, 227 AUTOCHECKBOX "Notice", IDC_ABOUTLOG_NOTICE_CHECKBOX, 100, 139, 50, 9
TOPMARGIN, 7 AUTOCHECKBOX "Debug", IDC_ABOUTLOG_DEBUG_CHECKBOX, 150, 139, 50, 9
BOTTOMMARGIN, 218
END
END END
#endif // APSTUDIO_INVOKED
IDD_ABOUTMEASURES_DIALOG DIALOGEX 15, 30, 370, 148
STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN
LISTBOX IDC_ABOUTMEASURES_ITEMS_LISTBOX, 0, 0, 100, 148, LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
CONTROL "", IDC_ABOUTMEASURES_ITEMS_LISTVIEW, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 105, 0, 262, 148
END
IDD_ABOUTPLUGINS_DIALOG DIALOGEX 15, 30, 370, 148
STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN
CONTROL "", IDC_ABOUTPLUGINS_ITEMS_LISTVIEW, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 0, 0, 368, 148
END
IDD_MANAGE_DIALOG DIALOGEX 0, 0, 500, 322
STYLE DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW | WS_EX_CONTROLPARENT
CAPTION "Manage Rainmeter"
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN
CONTROL "", IDC_MANAGE_TAB, "SysTabControl32", TCS_TABS | TCS_FIXEDWIDTH, 6, 6, 488, 293
PUSHBUTTON "Refresh all", IDC_REFRESHALL_BUTTON, 5, 303, 70, 14
PUSHBUTTON "Edit settings", IDC_EDITSETTINGS_BUTTON, 79, 303, 70, 14
PUSHBUTTON "Open log", IDC_OPENLOG_BUTTON, 153, 303, 70, 14
PUSHBUTTON "Close", IDCLOSE, 444, 303, 50, 14
END
IDD_MANAGESKINS_DIALOG DIALOGEX 15, 30, 470, 260
STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN
PUSHBUTTON "", IDC_MANAGESKINS_ACTIVESKINS_BUTTON, 0, 0, 145, 14, WS_TABSTOP
CONTROL "", IDC_MANAGESKINS_SKINS_TREEVIEW, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | WS_BORDER | WS_VSCROLL, 0, 18, 145, 241
LTEXT "N/A", IDC_MANAGESKINS_FILE_TEXT, 165, 0, 130, 14, SS_ENDELLIPSIS | SS_NOPREFIX
LTEXT "N/A", IDC_MANAGESKINS_CONFIG_TEXT, 165, 15, 130, 9, SS_ENDELLIPSIS | SS_NOPREFIX
PUSHBUTTON "Load", IDC_MANAGESKINS_LOAD_BUTTON, 310, 0, 50, 14, WS_DISABLED | WS_TABSTOP
PUSHBUTTON "Refresh", IDC_MANAGESKINS_REFRESH_BUTTON, 364, 0, 50, 14, WS_DISABLED | WS_TABSTOP
PUSHBUTTON "Edit", IDC_MANAGESKINS_EDIT_BUTTON, 418, 0, 50, 14, WS_DISABLED | WS_TABSTOP
LTEXT "Author:", IDC_STATIC, 165, 30, 50, 9
LTEXT "", IDC_MANAGESKINS_AUTHOR_TEXT, 215, 30, 260, 9, SS_ENDELLIPSIS | SS_NOPREFIX
LTEXT "Version:", IDC_STATIC, 165, 43, 50, 9
LTEXT "", IDC_MANAGESKINS_VERSION_TEXT, 215, 43, 260, 9, SS_ENDELLIPSIS | SS_NOPREFIX
LTEXT "License:", IDC_STATIC, 165, 57, 50, 9
LTEXT "", IDC_MANAGESKINS_LICENSE_TEXT, 215, 57, 260, 9, SS_ENDELLIPSIS | SS_NOPREFIX
LTEXT "Description:", IDC_STATIC, 165, 71, 50, 9
EDITTEXT IDC_MANAGESKINS_DESCRIPTION_TEXT, 213, 71, 253, 64, ES_MULTILINE | ES_READONLY
CONTROL "<a>Add metadata</a>", IDC_MANAGESKINS_ADDMETADATA_LINK, "SysLink", 0x0, 410, 142, 50, 9
CONTROL "", IDC_STATIC, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 165, 156, 304, 1
LTEXT "Coordinates:", IDC_STATIC, 165, 169, 80, 9
EDITTEXT IDC_MANAGESKINS_X_TEXT, 230, 166, 33, 14, WS_BORDER | WS_TABSTOP | WS_DISABLED
EDITTEXT IDC_MANAGESKINS_Y_TEXT, 267, 166, 33, 14, ES_NUMBER | WS_BORDER | WS_TABSTOP | WS_DISABLED
LTEXT "Position:", IDC_STATIC, 165, 190, 80, 9
COMBOBOX IDC_MANAGESKINS_ZPOSITION_COMBOBOX, 230, 187, 70, 14, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
LTEXT "Load order:", IDC_STATIC, 165, 208, 80, 9
EDITTEXT IDC_MANAGESKINS_LOADORDER_TEXT, 230, 205, 70, 14, ES_NUMBER | WS_BORDER | WS_TABSTOP | WS_DISABLED
LTEXT "Transparency:", IDC_STATIC, 165, 229, 80, 9
COMBOBOX IDC_MANAGESKINS_TRANSPARENCY_COMBOBOX, 230, 226, 70, 14, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
LTEXT "On hover:", IDC_STATIC, 165, 247, 80, 9
COMBOBOX IDC_MANAGESKINS_ONHOVER_COMBOBOX, 230, 244, 70, 14, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
PUSHBUTTON "", IDC_MANAGESKINS_DISPLAYMONITOR_BUTTON, 330, 166, 90, 14, WS_DISABLED | WS_TABSTOP
AUTOCHECKBOX "Draggable", IDC_MANAGESKINS_DRAGGABLE_CHECKBOX, 330, 190, 70, 9, WS_DISABLED
AUTOCHECKBOX "Click through", IDC_MANAGESKINS_CLICKTHROUGH_CHECKBOX, 330, 203, 70, 9, WS_DISABLED
AUTOCHECKBOX "Keep on screen", IDC_MANAGESKINS_KEEPONSCREEN_CHECKBOX, 330, 216, 70, 9, WS_DISABLED
AUTOCHECKBOX "Save position", IDC_MANAGESKINS_SAVEPOSITION_CHECKBOX, 330, 229, 70, 9, WS_DISABLED
AUTOCHECKBOX "Snap to edges", IDC_MANAGESKINS_SNAPTOEDGES_CHECKBOX, 330, 242, 70, 9, WS_DISABLED
END
IDD_MANAGETHEMES_DIALOG DIALOGEX 15, 30, 470, 260
STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN
GROUPBOX "Save new theme", IDC_STATIC, 0, 0, 230, 150
LTEXT "A theme allows you to save the current layout of your Rainmeter skins and restore it at a later time. Themes remember your skins' positions and settings, but restoring an old theme will not undo edits or updates to your skins.", IDC_STATIC, 6, 16, 205, 44
AUTOCHECKBOX "Save as empty theme", IDC_MANAGETHEMES_EMPTYTHEME_CHECKBOX, 6, 70, 120, 9, WS_TABSTOP
AUTOCHECKBOX "Exclude unused skins", IDC_MANAGETHEMES_UNUSEDSKINS_CHECKBOX, 6, 83, 120, 9, WS_TABSTOP
AUTOCHECKBOX "Include current wallpaper", IDC_MANAGETHEMES_WALLPAPER_CHECKBOX, 6, 96, 120, 9, WS_TABSTOP
LTEXT "Name:", IDC_STATIC, 6, 115, 100, 9
EDITTEXT IDC_MANAGETHEMES_NAME_TEXT, 6, 128, 160, 14, WS_BORDER | WS_TABSTOP
PUSHBUTTON "Save", IDC_MANAGETHEMES_SAVE_BUTTON, 170, 128, 50, 14, WS_DISABLED | WS_TABSTOP
GROUPBOX "Saved themes", IDC_STATIC, 238, 0, 230, 150
LISTBOX IDC_MANAGETHEMES_LIST, 244, 16, 160, 125, LBS_STANDARD | LBS_NOINTEGRALHEIGHT
PUSHBUTTON "Load", IDC_MANAGETHEMES_LOAD_BUTTON, 410, 16, 50, 14, WS_DISABLED
PUSHBUTTON "Delete", IDC_MANAGETHEMES_DELETE_BUTTON, 410, 34, 50, 14, WS_DISABLED
PUSHBUTTON "Edit", IDC_MANAGETHEMES_EDIT_BUTTON, 410, 52, 50, 14, WS_DISABLED
GROUPBOX "Backup", IDC_STATIC, 0, 200, 468, 60
LTEXT "A backup allows you to save and fully restore Rainmeter to a prior state, including skins, themes, plugins, addons and statistics. Unlike a theme, installing a backup will replace all edits and updates to your skins since the backup was saved.", IDC_STATIC, 6, 216, 455, 24
PUSHBUTTON "Backup...", IDC_MANAGETHEMES_BACKUP_BUTTON, 410, 240, 50, 14
END
IDD_MANAGESETTINGS_DIALOG DIALOGEX 15, 30, 470, 260
STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg 2", 0, 0, 0x0
BEGIN
GROUPBOX "General", IDC_STATIC, 0, 0, 468, 68
//AUTOCHECKBOX "Run automatically at startup", IDC_MANAGESETTINGS_AUTOSTART_CHECKBOX, 6, 16, 140, 9, WS_DISABLED
AUTOCHECKBOX "Check for updates", IDC_MANAGESETTINGS_CHECKUPDATES_CHECKBOX, 6, 16, 140, 9
AUTOCHECKBOX "Lock skins into position", IDC_MANAGESETTINGS_LOCKSKINS_CHECKBOX, 6, 29, 140, 9
PUSHBUTTON "Reset statistics", IDC_MANAGESETTINGS_RESETSTATISTICS_BUTTON, 6, 47, 70, 14
GROUPBOX "Logging", IDC_STATIC, 0, 75, 468, 68
AUTOCHECKBOX "Log to file", IDC_MANAGESETTINGS_LOGTOFILE_CHECKBOX, 6, 91, 140, 9
AUTOCHECKBOX "Verbose logging (debug mode)", IDC_MANAGESETTINGS_VERBOSELOGGING_CHECKBOX, 6, 104, 140, 9
PUSHBUTTON "Show log file", IDC_MANAGESETTINGS_SHOWLOGFILE_BUTTON, 6, 122, 70, 14
PUSHBUTTON "Delete log file", IDC_MANAGESETTINGS_DELETELOGFILE_BUTTON, 80, 122, 70, 14
LTEXT "Rainmeter 2.1.0 beta r886 (64-bit). Built on Aug 1 2011.\r\n", IDC_MANAGESETTINGS_VERSION_LABEL, 0, 225, 300, 27
CONTROL "Get the latest version at <a href=""http://rainmeter.net"">rainmeter.net</a>.", IDC_STATIC, "SysLink", 0x0, 0, 238, 300, 9
CONTROL "Rainmeter is an open source project distributed under the <a href=""http://www.gnu.org/licenses"">GNU GPL v2</a> license.", IDC_STATIC, "SysLink", 0x0, 0, 251, 300, 9
END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //

View File

@ -115,7 +115,7 @@
<Culture>0x0409</Culture> <Culture>0x0409</Culture>
</ResourceCompile> </ResourceCompile>
<Link> <Link>
<AdditionalDependencies>comctl32.lib;Wininet.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>comctl32.lib;Wininet.lib;UxTheme.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../TestBench/x32/Debug/Rainmeter.dll</OutputFile> <OutputFile>../TestBench/x32/Debug/Rainmeter.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -158,7 +158,7 @@
<Culture>0x0409</Culture> <Culture>0x0409</Culture>
</ResourceCompile> </ResourceCompile>
<Link> <Link>
<AdditionalDependencies>comctl32.lib;Wininet.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>comctl32.lib;Wininet.lib;UxTheme.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../TestBench/x64/Debug/Rainmeter.dll</OutputFile> <OutputFile>../TestBench/x64/Debug/Rainmeter.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -204,7 +204,7 @@
<Culture>0x0409</Culture> <Culture>0x0409</Culture>
</ResourceCompile> </ResourceCompile>
<Link> <Link>
<AdditionalDependencies>comctl32.lib;Wininet.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>comctl32.lib;Wininet.lib;UxTheme.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../TestBench/x32/Release/Rainmeter.dll</OutputFile> <OutputFile>../TestBench/x32/Release/Rainmeter.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>lua/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>lua/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -252,7 +252,7 @@
</ResourceCompile> </ResourceCompile>
<Link> <Link>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>comctl32.lib;Wininet.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>comctl32.lib;Wininet.lib;UxTheme.lib;Winmm.lib;gdiplus.lib;Iphlpapi.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../TestBench/x64/Release/Rainmeter.dll</OutputFile> <OutputFile>../TestBench/x64/Release/Rainmeter.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -265,17 +265,6 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="AboutDialog.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Use</PrecompiledHeader>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
</ClCompile>
<ClCompile Include="ConfigParser.cpp"> <ClCompile Include="ConfigParser.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
@ -287,6 +276,8 @@
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
</ClCompile> </ClCompile>
<ClCompile Include="Dialog.cpp" />
<ClCompile Include="DialogAbout.cpp" />
<ClCompile Include="Error.cpp"> <ClCompile Include="Error.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
@ -320,6 +311,7 @@
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
</ClCompile> </ClCompile>
<ClCompile Include="DialogManage.cpp" />
<ClCompile Include="Measure.cpp"> <ClCompile Include="Measure.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
@ -833,13 +825,15 @@
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="AboutDialog.h" />
<ClInclude Include="ConfigParser.h" /> <ClInclude Include="ConfigParser.h" />
<ClInclude Include="Dialog.h" />
<ClInclude Include="DialogAbout.h" />
<ClInclude Include="DisableThreadLibraryCalls.h" /> <ClInclude Include="DisableThreadLibraryCalls.h" />
<ClInclude Include="Error.h" /> <ClInclude Include="Error.h" />
<ClInclude Include="Export.h" /> <ClInclude Include="Export.h" />
<ClInclude Include="Group.h" /> <ClInclude Include="Group.h" />
<ClInclude Include="Litestep.h" /> <ClInclude Include="Litestep.h" />
<ClInclude Include="DialogManage.h" />
<ClInclude Include="Measure.h" /> <ClInclude Include="Measure.h" />
<ClInclude Include="MeasureCalc.h" /> <ClInclude Include="MeasureCalc.h" />
<ClInclude Include="MeasureCPU.h" /> <ClInclude Include="MeasureCPU.h" />
@ -915,6 +909,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Res\tray.ico" /> <None Include="Res\tray.ico" />
<None Include="res\window.ico" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@ -36,9 +36,6 @@
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="AboutDialog.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ConfigParser.cpp"> <ClCompile Include="ConfigParser.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -354,6 +351,15 @@
<ClCompile Include="pcre-8.10\pcre_xclass.c"> <ClCompile Include="pcre-8.10\pcre_xclass.c">
<Filter>pcre</Filter> <Filter>pcre</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Dialog.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DialogAbout.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DialogManage.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="Library.rc"> <ResourceCompile Include="Library.rc">
@ -361,9 +367,6 @@
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="AboutDialog.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ConfigParser.h"> <ClInclude Include="ConfigParser.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -598,10 +601,22 @@
<ClInclude Include="pcre-8.10\ucp.h"> <ClInclude Include="pcre-8.10\ucp.h">
<Filter>pcre</Filter> <Filter>pcre</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Dialog.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DialogAbout.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DialogManage.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Res\tray.ico"> <None Include="Res\tray.ico">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</None> </None>
<None Include="res\window.ico">
<Filter>Resource Files</Filter>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -339,10 +339,10 @@ HINSTANCE ExecuteCommand(HWND Owner, LPCTSTR szCommand, int nShowCmd, LPCTSTR sz
command.erase(0, notwhite); command.erase(0, notwhite);
if (command.empty()) return NULL; if (command.empty()) return NULL;
size_t quotePos = command.find(L"\""); size_t quotePos = command.find(L'"');
if (quotePos == 0) if (quotePos == 0)
{ {
size_t quotePos2 = command.find(L"\"", quotePos + 1); size_t quotePos2 = command.find(L'"', quotePos + 1);
if (quotePos2 != std::wstring::npos) if (quotePos2 != std::wstring::npos)
{ {
args.assign(command, quotePos2 + 1, command.length() - (quotePos2 + 1)); args.assign(command, quotePos2 + 1, command.length() - (quotePos2 + 1));
@ -355,7 +355,7 @@ HINSTANCE ExecuteCommand(HWND Owner, LPCTSTR szCommand, int nShowCmd, LPCTSTR sz
} }
else else
{ {
size_t spacePos = command.find(L" "); size_t spacePos = command.find(L' ');
if (spacePos != std::wstring::npos) if (spacePos != std::wstring::npos)
{ {
args.assign(command, spacePos + 1, command.length() - (spacePos + 1)); args.assign(command, spacePos + 1, command.length() - (spacePos + 1));
@ -470,11 +470,8 @@ std::string ConvertToAscii(LPCTSTR str)
int bufLen = WideCharToMultiByte(CP_ACP, 0, str, strLen, NULL, 0, NULL, NULL); int bufLen = WideCharToMultiByte(CP_ACP, 0, str, strLen, NULL, 0, NULL, NULL);
if (bufLen > 0) if (bufLen > 0)
{ {
char* tmpSz = new char[bufLen]; szAscii.resize(bufLen - 1);
tmpSz[0] = 0; WideCharToMultiByte(CP_ACP, 0, str, strLen, &szAscii[0], bufLen, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, str, strLen, tmpSz, bufLen, NULL, NULL);
szAscii = tmpSz;
delete [] tmpSz;
} }
} }
return szAscii; return szAscii;
@ -490,11 +487,8 @@ std::wstring ConvertToWide(LPCSTR str)
int bufLen = MultiByteToWideChar(CP_ACP, 0, str, strLen, NULL, 0); int bufLen = MultiByteToWideChar(CP_ACP, 0, str, strLen, NULL, 0);
if (bufLen > 0) if (bufLen > 0)
{ {
WCHAR* wideSz = new WCHAR[bufLen]; szWide.resize(bufLen - 1);
wideSz[0] = 0; MultiByteToWideChar(CP_ACP, 0, str, strLen, &szWide[0], bufLen);
MultiByteToWideChar(CP_ACP, 0, str, strLen, wideSz, bufLen);
szWide = wideSz;
delete [] wideSz;
} }
} }
return szWide; return szWide;
@ -510,11 +504,8 @@ std::string ConvertToUTF8(LPCWSTR str)
int bufLen = WideCharToMultiByte(CP_UTF8, 0, str, strLen, NULL, 0, NULL, NULL); int bufLen = WideCharToMultiByte(CP_UTF8, 0, str, strLen, NULL, 0, NULL, NULL);
if (bufLen > 0) if (bufLen > 0)
{ {
char* tmpSz = new char[bufLen]; szAscii.resize(bufLen - 1);
tmpSz[0] = 0; WideCharToMultiByte(CP_UTF8, 0, str, strLen, &szAscii[0], bufLen, NULL, NULL);
WideCharToMultiByte(CP_UTF8, 0, str, strLen, tmpSz, bufLen, NULL, NULL);
szAscii = tmpSz;
delete [] tmpSz;
} }
} }
return szAscii; return szAscii;
@ -530,30 +521,30 @@ std::wstring ConvertUTF8ToWide(LPCSTR str)
int bufLen = MultiByteToWideChar(CP_UTF8, 0, str, strLen, NULL, 0); int bufLen = MultiByteToWideChar(CP_UTF8, 0, str, strLen, NULL, 0);
if (bufLen > 0) if (bufLen > 0)
{ {
WCHAR* wideSz = new WCHAR[bufLen]; szWide.resize(bufLen - 1);
wideSz[0] = 0; MultiByteToWideChar(CP_UTF8, 0, str, strLen, &szWide[0], bufLen);
MultiByteToWideChar(CP_UTF8, 0, str, strLen, wideSz, bufLen);
szWide = wideSz;
delete [] wideSz;
} }
} }
return szWide; return szWide;
} }
BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage) BOOL LogInternal(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
{ {
CRainmeter::LOG_INFO logInfo;
logInfo.message = pszMessage;
// Add timestamp // Add timestamp
static ULONGLONG startTime = CSystem::GetTickCount64(); static ULONGLONG startTime = CSystem::GetTickCount64();
ULONGLONG time = CSystem::GetTickCount64(); ULONGLONG time = CSystem::GetTickCount64();
WCHAR buffer[128]; WCHAR buffer[128];
_snwprintf_s(buffer, _TRUNCATE, L"(%02llu:%02llu:%02llu.%03llu) ", (time - startTime) / (1000 * 60* 60), ((time - startTime) / (1000 * 60)) % 60, ((time - startTime) / 1000) % 60, (time - startTime) % 1000); _snwprintf_s(buffer, _TRUNCATE, L"%02llu:%02llu:%02llu.%03llu", (time - startTime) / (1000 * 60* 60), ((time - startTime) / (1000 * 60)) % 60, ((time - startTime) / 1000) % 60, (time - startTime) % 1000);
std::wstring message(buffer); if (Rainmeter)
logInfo.timestamp = message; {
Rainmeter->AddAboutLogInfo(nLevel, buffer, pszMessage);
}
std::wstring message = L"(";
message += buffer;
message += L") ";
message += pszMessage; message += pszMessage;
#ifdef _DEBUG #ifdef _DEBUG
@ -561,27 +552,6 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
_RPT0(_CRT_WARN, "\n"); _RPT0(_CRT_WARN, "\n");
#endif #endif
switch(nLevel)
{
case LOG_ERROR:
logInfo.type = L"ERROR";
break;
case LOG_WARNING:
logInfo.type = L"WARNING";
break;
case LOG_NOTICE:
logInfo.type = L"NOTICE";
break;
case LOG_DEBUG:
logInfo.type = L"DEBUG";
break;
}
if (Rainmeter)
{
Rainmeter->AddAboutLogInfo(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)
{ {
@ -623,10 +593,29 @@ 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)
{ {
fputws(logInfo.type.c_str(), logFile); message.insert(0, L": ");
fputws(L": ", logFile);
switch (nLevel)
{
case LOG_ERROR:
message.insert(0, L"ERROR");
break;
case LOG_WARNING:
message.insert(0, L"WARNING");
break;
case LOG_NOTICE:
message.insert(0, L"NOTICE");
break;
case LOG_DEBUG:
message.insert(0, L"DEBUG");
break;
}
message += L"\n";
fputws(message.c_str(), logFile); fputws(message.c_str(), logFile);
fputws(L"\n", logFile);
fclose(logFile); fclose(logFile);
} }
} }
@ -635,14 +624,19 @@ BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
return TRUE; return TRUE;
} }
void RmNullCRTInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved) BOOL LSLog(int nLevel, LPCTSTR pszModule, LPCTSTR pszMessage)
{ {
// Do nothing. if (nLevel != LOG_DEBUG || Rainmeter->GetDebug())
{
return LogInternal(nLevel, pszModule, pszMessage);
}
return TRUE;
} }
void Log(int nLevel, const WCHAR* message) void Log(int nLevel, const WCHAR* message)
{ {
LSLog(nLevel, L"Rainmeter", message); LogInternal(nLevel, L"Rainmeter", message);
} }
void LogWithArgs(int nLevel, const WCHAR* format, ... ) void LogWithArgs(int nLevel, const WCHAR* format, ... )
@ -664,8 +658,13 @@ void LogWithArgs(int nLevel, const WCHAR* format, ... )
_set_invalid_parameter_handler(oldHandler); _set_invalid_parameter_handler(oldHandler);
LSLog(nLevel, L"Rainmeter", buffer); LogInternal(nLevel, L"Rainmeter", buffer);
va_end(args); va_end(args);
delete [] buffer; delete [] buffer;
} }
void RmNullCRTInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved)
{
// Do nothing.
}

View File

@ -24,7 +24,8 @@
#include "Error.h" #include "Error.h"
#include "Meter.h" #include "Meter.h"
#include "Measure.h" #include "Measure.h"
#include "AboutDialog.h" #include "DialogAbout.h"
#include "DialogManage.h"
#include "resource.h" #include "resource.h"
#include "Litestep.h" #include "Litestep.h"
#include "MeasureCalc.h" #include "MeasureCalc.h"
@ -200,7 +201,8 @@ CMeterWindow::~CMeterWindow()
{ {
BOOL Result; BOOL Result;
int counter = 0; int counter = 0;
do { do
{
// Wait for the window to die // Wait for the window to die
Result = UnregisterClass(METERWINDOW_CLASS_NAME, m_Rainmeter->GetInstance()); Result = UnregisterClass(METERWINDOW_CLASS_NAME, m_Rainmeter->GetInstance());
Sleep(100); Sleep(100);
@ -679,7 +681,7 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
if (!m_Window) return; if (!m_Window) return;
switch(bang) switch (bang)
{ {
case BANG_REFRESH: case BANG_REFRESH:
// Refresh needs to be delayed since it crashes if done during Update() // Refresh needs to be delayed since it crashes if done during Update()
@ -693,7 +695,7 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
case BANG_UPDATE: case BANG_UPDATE:
KillTimer(m_Window, METERTIMER); // Kill timer temporarily KillTimer(m_Window, METERTIMER); // Kill timer temporarily
Update(false); Update(false);
UpdateAboutStatistics(m_SkinName.c_str()); CDialogAbout::UpdateMeasures(m_SkinName.c_str());
if (m_WindowUpdate >= 0) if (m_WindowUpdate >= 0)
{ {
SetTimer(m_Window, METERTIMER, m_WindowUpdate, NULL); SetTimer(m_Window, METERTIMER, m_WindowUpdate, NULL);
@ -768,7 +770,7 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
case BANG_UPDATEMEASURE: case BANG_UPDATEMEASURE:
UpdateMeasure(arg); UpdateMeasure(arg);
UpdateAboutStatistics(m_SkinName.c_str()); CDialogAbout::UpdateMeasures(m_SkinName.c_str());
break; break;
case BANG_DISABLEMEASUREGROUP: case BANG_DISABLEMEASUREGROUP:
@ -785,7 +787,7 @@ void CMeterWindow::RunBang(BANGCOMMAND bang, const WCHAR* arg)
case BANG_UPDATEMEASUREGROUP: case BANG_UPDATEMEASUREGROUP:
UpdateMeasure(arg, true); UpdateMeasure(arg, true);
UpdateAboutStatistics(m_SkinName.c_str()); CDialogAbout::UpdateMeasures(m_SkinName.c_str());
break; break;
case BANG_SHOW: case BANG_SHOW:
@ -2007,6 +2009,11 @@ void CMeterWindow::WriteConfig(INT setting)
WCHAR buffer[32]; WCHAR buffer[32];
const WCHAR* section = m_SkinName.c_str(); const WCHAR* section = m_SkinName.c_str();
if (setting != SETTING_ALL)
{
CDialogManage::UpdateSkins(this);
}
if (setting & SETTING_WINDOWPOSITION) if (setting & SETTING_WINDOWPOSITION)
{ {
// If position needs to be save, do so. // If position needs to be save, do so.
@ -2074,7 +2081,6 @@ void CMeterWindow::WriteConfig(INT setting)
} }
} }
/* /*
** ReadSkin ** ReadSkin
** **
@ -3122,7 +3128,7 @@ LRESULT CMeterWindow::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam)
if (wParam == METERTIMER) if (wParam == METERTIMER)
{ {
Update(false); Update(false);
UpdateAboutStatistics(m_SkinName.c_str()); CDialogAbout::UpdateMeasures(m_SkinName.c_str());
//if (m_KeepOnScreen) //if (m_KeepOnScreen)
//{ //{
@ -3331,7 +3337,7 @@ void CMeterWindow::ShowWindowIfAppropriate()
{ {
if (!m_Hidden && !inside && !keyDown) if (!m_Hidden && !inside && !keyDown)
{ {
switch(m_WindowHide) switch (m_WindowHide)
{ {
case HIDEMODE_HIDE: case HIDEMODE_HIDE:
if (m_TransparencyValue == 0 || !IsWindowVisible(m_Window)) if (m_TransparencyValue == 0 || !IsWindowVisible(m_Window))
@ -3540,7 +3546,7 @@ LRESULT CMeterWindow::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam)
if (!m_Hidden) if (!m_Hidden)
{ {
// If Alt, shift or control is down, do not hide the window // If Alt, shift or control is down, do not hide the window
switch(m_WindowHide) switch (m_WindowHide)
{ {
case HIDEMODE_HIDE: case HIDEMODE_HIDE:
if (!m_NativeTransparency || m_TransparencyValue == m_AlphaValue) if (!m_NativeTransparency || m_TransparencyValue == m_AlphaValue)
@ -3655,6 +3661,10 @@ LRESULT CMeterWindow::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam)
LSExecute(NULL, command.c_str(), SW_SHOWNORMAL); LSExecute(NULL, command.c_str(), SW_SHOWNORMAL);
} }
} }
else if (wParam == ID_CONTEXT_SKINMENU_REFRESH)
{
Refresh(false);
}
else if (wParam == ID_CONTEXT_SKINMENU_OPENSKINSFOLDER) else if (wParam == ID_CONTEXT_SKINMENU_OPENSKINSFOLDER)
{ {
std::wstring command = L"\"" + m_SkinPath; std::wstring command = L"\"" + m_SkinPath;
@ -3662,9 +3672,9 @@ LRESULT CMeterWindow::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam)
command += L"\""; command += L"\"";
LSExecute(NULL, command.c_str(), SW_SHOWNORMAL); LSExecute(NULL, command.c_str(), SW_SHOWNORMAL);
} }
else if (wParam == ID_CONTEXT_SKINMENU_REFRESH) else if (wParam == ID_CONTEXT_SKINMENU_MANAGESKIN)
{ {
Refresh(false); CDialogManage::OpenSkin(this);
} }
else if (wParam == ID_CONTEXT_SKINMENU_VERYTOPMOST) else if (wParam == ID_CONTEXT_SKINMENU_VERYTOPMOST)
{ {
@ -3705,42 +3715,15 @@ LRESULT CMeterWindow::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
else if (wParam == ID_CONTEXT_SKINMENU_HIDEONMOUSE) else if (wParam == ID_CONTEXT_SKINMENU_HIDEONMOUSE)
{ {
if (m_WindowHide == HIDEMODE_NONE) SetWindowHide((m_WindowHide == HIDEMODE_NONE) ? HIDEMODE_HIDE : HIDEMODE_NONE);
{
m_WindowHide = HIDEMODE_HIDE;
}
else
{
m_WindowHide = HIDEMODE_NONE;
}
WriteConfig(SETTING_HIDEONMOUSEOVER);
UpdateTransparency(m_AlphaValue, false);
} }
else if (wParam == ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEIN) else if (wParam == ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEIN)
{ {
if (m_WindowHide == HIDEMODE_NONE) SetWindowHide((m_WindowHide == HIDEMODE_NONE) ? HIDEMODE_FADEIN : HIDEMODE_NONE);
{
m_WindowHide = HIDEMODE_FADEIN;
}
else
{
m_WindowHide = HIDEMODE_NONE;
}
WriteConfig(SETTING_HIDEONMOUSEOVER);
UpdateTransparency(m_AlphaValue, false);
} }
else if (wParam == ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT) else if (wParam == ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT)
{ {
if (m_WindowHide == HIDEMODE_NONE) SetWindowHide((m_WindowHide == HIDEMODE_NONE) ? HIDEMODE_FADEOUT : HIDEMODE_NONE);
{
m_WindowHide = HIDEMODE_FADEOUT;
}
else
{
m_WindowHide = HIDEMODE_NONE;
}
WriteConfig(SETTING_HIDEONMOUSEOVER);
UpdateTransparency(m_AlphaValue, false);
} }
else if (wParam == ID_CONTEXT_SKINMENU_REMEMBERPOSITION) else if (wParam == ID_CONTEXT_SKINMENU_REMEMBERPOSITION)
{ {
@ -3954,6 +3937,18 @@ void CMeterWindow::SetSnapEdges(bool b)
m_SnapEdges = b; m_SnapEdges = b;
WriteConfig(SETTING_SNAPEDGES); WriteConfig(SETTING_SNAPEDGES);
} }
/*
** SetWindowHide
**
** Helper function for setting WindowHide
**
*/
void CMeterWindow::SetWindowHide(HIDEMODE hide)
{
m_WindowHide = hide;
WriteConfig(SETTING_HIDEONMOUSEOVER);
UpdateTransparency(m_AlphaValue, false);
}
/* /*
** OnSysCommand ** OnSysCommand
@ -4908,7 +4903,6 @@ bool CMeterWindow::DoMoveAction(int x, int y, MOUSE mouse)
return false; return false;
} }
/* /*
** OnMove ** OnMove
** **
@ -5088,7 +5082,7 @@ LRESULT CMeterWindow::OnDelayedMove(UINT uMsg, WPARAM wParam, LPARAM lParam)
*/ */
LRESULT CMeterWindow::OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT CMeterWindow::OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
COPYDATASTRUCT* pCopyDataStruct = (COPYDATASTRUCT*) lParam; COPYDATASTRUCT* pCopyDataStruct = (COPYDATASTRUCT*)lParam;
if (pCopyDataStruct && (pCopyDataStruct->dwData == 1) && (pCopyDataStruct->cbData > 0)) if (pCopyDataStruct && (pCopyDataStruct->dwData == 1) && (pCopyDataStruct->cbData > 0))
{ {
@ -5246,7 +5240,6 @@ std::wstring CMeterWindow::GetSkinRootPath()
return path; return path;
} }
CMeter* CMeterWindow::GetMeter(const std::wstring& meterName) CMeter* CMeterWindow::GetMeter(const std::wstring& meterName)
{ {
std::list<CMeter*>::const_iterator j = m_Meters.begin(); std::list<CMeter*>::const_iterator j = m_Meters.begin();

View File

@ -27,7 +27,7 @@
#include "ConfigParser.h" #include "ConfigParser.h"
#include "Group.h" #include "Group.h"
#define BEGIN_MESSAGEPROC if (Window) { switch(uMsg) { #define BEGIN_MESSAGEPROC if (Window) { switch (uMsg) {
#define MESSAGE(handler, msg) case msg: return Window->handler(uMsg, wParam, lParam); #define MESSAGE(handler, msg) case msg: return Window->handler(uMsg, wParam, lParam);
#define REJECT_MESSAGE(msg) case msg: return 0; #define REJECT_MESSAGE(msg) case msg: return 0;
#define END_MESSAGEPROC } } return DefWindowProc(hWnd, uMsg, wParam, lParam); #define END_MESSAGEPROC } } return DefWindowProc(hWnd, uMsg, wParam, lParam);
@ -204,7 +204,7 @@ public:
const std::wstring& GetSkinName() { return m_SkinName; } const std::wstring& GetSkinName() { return m_SkinName; }
const std::wstring& GetSkinIniFile() { return m_SkinIniFile; } const std::wstring& GetSkinIniFile() { return m_SkinIniFile; }
std::wstring GetSkinRootPath(); std::wstring GetSkinRootPath();
std::list<CMeasure*>& GetMeasures() { return m_Measures; } std::list<CMeasure*>& GetMeasures() { return m_Measures; }
std::list<CMeter*>& GetMeters() { return m_Meters; } std::list<CMeter*>& GetMeters() { return m_Meters; }
@ -247,6 +247,8 @@ public:
CMeter* GetMeter(const std::wstring& meterName); CMeter* GetMeter(const std::wstring& meterName);
CMeasure* GetMeasure(const std::wstring& measureName); CMeasure* GetMeasure(const std::wstring& measureName);
friend class CDialogManage;
protected: protected:
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
@ -328,6 +330,7 @@ private:
void SetWindowDraggable(bool b); void SetWindowDraggable(bool b);
void SetSavePosition(bool b); void SetSavePosition(bool b);
void SetSnapEdges(bool b); void SetSnapEdges(bool b);
void SetWindowHide(HIDEMODE hide);
bool DoAction(int x, int y, MOUSE mouse, bool test); bool DoAction(int x, int y, MOUSE mouse, bool test);
bool DoMoveAction(int x, int y, MOUSE mouse); bool DoMoveAction(int x, int y, MOUSE mouse);
bool ResizeWindow(bool reset); bool ResizeWindow(bool reset);

View File

@ -21,7 +21,8 @@
#include "TrayWindow.h" #include "TrayWindow.h"
#include "System.h" #include "System.h"
#include "Error.h" #include "Error.h"
#include "AboutDialog.h" #include "DialogAbout.h"
#include "DialogManage.h"
#include "MeasureNet.h" #include "MeasureNet.h"
#include "MeterString.h" #include "MeterString.h"
#include "resource.h" #include "resource.h"
@ -1428,11 +1429,51 @@ void RainmeterRefreshAppWide()
** Callback for the !RainmeterAbout bang ** Callback for the !RainmeterAbout bang
** **
*/ */
void RainmeterAboutWide() void RainmeterAboutWide(const WCHAR* arg)
{ {
if (Rainmeter) if (Rainmeter)
{ {
OpenAboutDialog(Rainmeter->GetTrayWindow()->GetWindow(), Rainmeter->GetInstance()); int tab = 0;
if (arg)
{
if (_wcsnicmp(arg, L"Measures", 8) == 0)
{
tab = 1;
}
else if (_wcsnicmp(arg, L"Plugins", 7) == 0)
{
tab = 2;
}
}
CDialogAbout::Open(tab);
}
}
/*
** RainmeterManagerWide
**
** Callback for the !RainmeterAbout bang
**
*/
void RainmeterManageWide(const WCHAR* arg)
{
if (Rainmeter)
{
int tab = 0;
if (arg)
{
if (_wcsnicmp(arg, L"Themes", 6) == 0)
{
tab = 1;
}
else if (_wcsnicmp(arg, L"Settings", 8) == 0)
{
tab = 2;
}
}
CDialogManage::Open(tab);
} }
} }
@ -1668,8 +1709,8 @@ bool CRainmeter::c_Debug = false;
*/ */
CRainmeter::CRainmeter() : CRainmeter::CRainmeter() :
m_TrayWindow(), m_TrayWindow(),
m_DisableVersionCheck(FALSE), m_DisableVersionCheck(false),
m_NewVersion(FALSE), m_NewVersion(false),
m_DesktopWorkAreaChanged(false), m_DesktopWorkAreaChanged(false),
m_DesktopWorkAreaType(false), m_DesktopWorkAreaType(false),
m_MenuActive(false), m_MenuActive(false),
@ -1685,8 +1726,7 @@ CRainmeter::CRainmeter() :
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
INITCOMMONCONTROLSEX initCtrls = {sizeof(INITCOMMONCONTROLSEX), ICC_LISTVIEW_CLASSES}; InitCommonControls();
InitCommonControlsEx(&initCtrls);
// Initialize GDI+. // Initialize GDI+.
GdiplusStartupInput gdiplusStartupInput; GdiplusStartupInput gdiplusStartupInput;
@ -1950,7 +1990,6 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath)
LogWithArgs(LOG_NOTICE, L"Path: %s", m_Path.c_str()); LogWithArgs(LOG_NOTICE, L"Path: %s", m_Path.c_str());
LogWithArgs(LOG_NOTICE, L"IniFile: %s", m_IniFile.c_str()); LogWithArgs(LOG_NOTICE, L"IniFile: %s", m_IniFile.c_str());
LogWithArgs(LOG_NOTICE, L"SkinPath: %s", m_SkinPath.c_str()); LogWithArgs(LOG_NOTICE, L"SkinPath: %s", m_SkinPath.c_str());
LogWithArgs(LOG_NOTICE, L"PluginPath: %s", m_PluginPath.c_str());
// Extract volume path from program path // Extract volume path from program path
// E.g.: // E.g.:
@ -1978,12 +2017,6 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath)
// Test that the Rainmeter.ini file is writable // Test that the Rainmeter.ini file is writable
TestSettingsFile(bDefaultIniLocation); TestSettingsFile(bDefaultIniLocation);
// If the skin folder is somewhere else than in the program path
if (_wcsnicmp(m_Path.c_str(), m_SkinPath.c_str(), m_Path.size()) != 0)
{
CheckSkinVersions();
}
CSystem::Initialize(Instance); CSystem::Initialize(Instance);
CMeasureNet::InitializeNewApi(); CMeasureNet::InitializeNewApi();
@ -2116,174 +2149,6 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath)
return Result; // Alles OK return Result; // Alles OK
} }
/*
** CheckSkinVersions
**
** Checks if any of the skins in the program folder are newer than in the skin folder.
**
*/
void CRainmeter::CheckSkinVersions()
{
// List all skins in the program folder
std::wstring strMainSkinsPath = m_Path + L"Skins\\";
std::vector<CONFIGMENU> menu;
ScanForConfigsRecursive(strMainSkinsPath, L"", 0, menu, true);
for (size_t i = 0, isize = menu.size(); i < isize; ++i)
{
// LogWithArgs(LOG_DEBUG, L"%s", menu[i].name.c_str());
// Read the version files
std::wstring strNewVersionFile = strMainSkinsPath + menu[i].name;
strNewVersionFile += L"\\version";
std::wstring strCurrentVersionFile = m_SkinPath + menu[i].name;
strCurrentVersionFile += L"\\version";
std::string strVersion;
std::wstring strVersionNew;
std::wstring strVersionCurrent;
std::wstring strVersionInIni;
std::ifstream newFile(strNewVersionFile.c_str(), std::ios_base::in);
if (getline(newFile, strVersion))
{
strVersionNew = ConvertToWide(strVersion.c_str());
// LogWithArgs(LOG_DEBUG, L"New: %s", strVersionNew.c_str());
// Compare with the version entry in the Rainmeter.ini
WCHAR tmpSz[256] = {0};
GetPrivateProfileString(menu[i].name.c_str(), L"Version", L"", tmpSz, 256, m_IniFile.c_str());
strVersionInIni = tmpSz;
// LogWithArgs(LOG_DEBUG, L"In Ini: %s", strVersionInIni.c_str());
// Compare with the version file in the skin folder
std::ifstream currentFile(strCurrentVersionFile.c_str(), std::ios_base::in);
if (getline(currentFile, strVersion))
{
strVersionCurrent = ConvertToWide(strVersion.c_str());
// LogWithArgs(LOG_DEBUG, L"Current: %s", strVersionCurrent.c_str());
}
}
// If the skin doesn't define a version file no need to do anything
if (!strVersionNew.empty())
{
// Compare the version files
if (CompareVersions(strVersionNew, strVersionInIni) == 1 &&
CompareVersions(strVersionNew, strVersionCurrent) == 1)
{
// Check if the old skin exists at all
struct _stat64i32 s;
std::wstring strSkinPath = m_SkinPath + menu[i].name;
if (_wstat(strSkinPath.c_str(), &s) == 0)
{
std::wstring strMessage = L"A new version of config \"" + menu[i].name;
strMessage += L"\" is available.\n\nNew version: ";
strMessage += strVersionNew.empty() ? L"Unknown" : strVersionNew;
strMessage += L"\nCurrent version: ";
strMessage += strVersionCurrent.empty() ? L"Unknown" : strVersionCurrent;
strMessage += L"\n\nDo you want to upgrade?\n\n"
L"(If you select 'Yes' your current config\nwill be moved into the 'Backup' folder)";
if (IDYES == MessageBox(NULL, strMessage.c_str(), APPNAME, MB_YESNO | MB_ICONQUESTION))
{
// Make sure that the folder exists
CreateDirectory(std::wstring(m_SkinPath + L"Backup").c_str(), NULL);
// Check for illegal characters from the version number
if (strVersionCurrent.find_first_of(L"\\/\"*:?<>|") == std::wstring::npos)
{
std::wstring strTarget = m_SkinPath + L"Backup\\";
strTarget += menu[i].name;
strTarget += L"-";
strTarget += strVersionCurrent;
if (CSystem::CopyFiles(m_SkinPath + menu[i].name, strTarget, true)) // Move the folder to "backup"
{
// Upgrade the skin
CSystem::CopyFiles(strMainSkinsPath + menu[i].name, m_SkinPath);
// TODO: Temporary 'fix': If skin was illustro upgrade the themes too
if (!_wcsicmp(menu[i].name.c_str(), L"illustro"))
{
std::wstring strMainThemes = m_Path + L"Themes";
std::wstring strCurrentThemes = GetSettingsPath();
CSystem::CopyFiles(strMainThemes, strCurrentThemes);
}
// End of temporary 'fix'
}
else
{
std::wstring strMessage = L"Failed to upgrade the config.\nUnable to backup the current config.";
MessageBox(NULL, strMessage.c_str(), APPNAME, MB_OK | MB_TOPMOST | MB_ICONERROR);
}
}
else
{
std::wstring strMessage = L"Failed to upgrade the config.\nThe version number contains illegal characters.";
MessageBox(NULL, strMessage.c_str(), APPNAME, MB_OK | MB_TOPMOST | MB_ICONERROR);
}
}
}
else
{
std::wstring strMessage = L"A new version of config \"" + menu[i].name;
strMessage += L"\" is available\n"
L"Do you want to add it to your skin and themes libraries?";
if (IDYES == MessageBox(NULL, strMessage.c_str(), APPNAME, MB_YESNO | MB_ICONQUESTION))
{
CSystem::CopyFiles(strMainSkinsPath + menu[i].name, m_SkinPath);
std::wstring strMainThemes = m_Path + L"Themes";
std::wstring strCurrentThemes = GetSettingsPath();
CSystem::CopyFiles(strMainThemes, strCurrentThemes);
}
}
// Even if the user doesn't want to upgrade mark it to the Rainmeter.ini so we don't ask the upgrade question again
WritePrivateProfileString(menu[i].name.c_str(), L"Version", strVersionNew.c_str(), m_IniFile.c_str());
}
}
}
}
/*
** CompareVersions
**
** Compares two version strings. Returns 0 if they are equal, 1 if A > B and -1 if A < B.
**
*/
int CRainmeter::CompareVersions(const std::wstring& strA, const std::wstring& strB)
{
if (strA.empty() && strB.empty()) return 0;
if (strA.empty()) return -1;
if (strB.empty()) return 1;
std::vector<std::wstring> arrayA = CConfigParser::Tokenize(strA, L".");
std::vector<std::wstring> arrayB = CConfigParser::Tokenize(strB, L".");
size_t arrayASize = arrayA.size();
size_t arrayBSize = arrayB.size();
size_t len = max(arrayASize, arrayBSize);
for (size_t i = 0; i < len; ++i)
{
int a = 0;
int b = 0;
if (i < arrayASize)
{
a = _wtoi(arrayA[i].c_str());
}
if (i < arrayBSize)
{
b = _wtoi(arrayB[i].c_str());
}
if (a > b) return 1;
if (a < b) return -1;
}
return 0;
}
/* /*
** CreateDefaultConfigFile ** CreateDefaultConfigFile
** **
@ -2302,13 +2167,7 @@ void CRainmeter::CreateDefaultConfigFile(const std::wstring& strFile)
std::wstring defaultIni = GetPath() + L"Default.ini"; std::wstring defaultIni = GetPath() + L"Default.ini";
if (_waccess(defaultIni.c_str(), 0) == -1) if (_waccess(defaultIni.c_str(), 0) == -1)
{ {
// The default.ini wasn't found -> create new WritePrivateProfileString(L"Rainmeter", L"\r\n[illustro\\System]\r\nActive", L"1", strFile.c_str());
std::ofstream out(strFile.c_str(), std::ios::out);
if (out)
{
out << std::string("[Rainmeter]\n\n[illustro\\System]\nActive=1\n");
out.close();
}
} }
else else
{ {
@ -2318,6 +2177,9 @@ void CRainmeter::CreateDefaultConfigFile(const std::wstring& strFile)
void CRainmeter::ReloadSettings() void CRainmeter::ReloadSettings()
{ {
// TODO FIXME
// UpdateDialog();
ScanForConfigs(m_SkinPath); ScanForConfigs(m_SkinPath);
ScanForThemes(GetSettingsPath() + L"Themes"); ScanForThemes(GetSettingsPath() + L"Themes");
ReadGeneralSettings(m_IniFile); ReadGeneralSettings(m_IniFile);
@ -2377,7 +2239,7 @@ void CRainmeter::ActivateConfig(int configIndex, int iniIndex)
} }
} }
bool CRainmeter::DeactivateConfig(CMeterWindow* meterWindow, int configIndex) bool CRainmeter::DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bool save)
{ {
if (configIndex >= 0 && configIndex < (int)m_ConfigStrings.size()) if (configIndex >= 0 && configIndex < (int)m_ConfigStrings.size())
{ {
@ -2399,8 +2261,11 @@ bool CRainmeter::DeactivateConfig(CMeterWindow* meterWindow, int configIndex)
if (meterWindow) if (meterWindow)
{ {
// Disable the config in the ini-file if (save)
WriteActive(meterWindow->GetSkinName(), -1); {
// Disable the config in the ini-file
WriteActive(meterWindow->GetSkinName(), -1);
}
return DeleteMeterWindow(meterWindow, true); return DeleteMeterWindow(meterWindow, true);
} }
@ -2423,33 +2288,41 @@ void CRainmeter::CreateMeterWindow(const std::wstring& path, const std::wstring&
m_Meters[config] = mw; m_Meters[config] = mw;
mw->Initialize(*this); mw->Initialize(*this);
UpdateAboutDialog(); CDialogAbout::UpdateSkins();
CDialogManage::UpdateSkins(mw);
} }
} }
void CRainmeter::ClearDeleteLaterList() void CRainmeter::ClearDeleteLaterList()
{ {
while (!m_DelayDeleteList.empty()) if (!m_DelayDeleteList.empty())
{ {
CMeterWindow* meterWindow = m_DelayDeleteList.front(); do
// Remove from the delete later list
m_DelayDeleteList.remove(meterWindow);
// Remove from the meter window list if it is still there
std::map<std::wstring, CMeterWindow*>::iterator iter = m_Meters.begin();
for (; iter != m_Meters.end(); ++iter)
{ {
if ((*iter).second == meterWindow) CMeterWindow* meterWindow = m_DelayDeleteList.front();
// Remove from the delete later list
m_DelayDeleteList.remove(meterWindow);
// Remove from the meter window list if it is still there
std::map<std::wstring, CMeterWindow*>::iterator iter = m_Meters.begin();
for (; iter != m_Meters.end(); ++iter)
{ {
m_Meters.erase(iter); if ((*iter).second == meterWindow)
{
UpdateAboutDialog(); m_Meters.erase(iter);
break; CDialogManage::UpdateSkins(meterWindow, true);
break;
}
} }
}
delete meterWindow; delete meterWindow;
}
while (!m_DelayDeleteList.empty());
CDialogManage::UpdateThemes();
CDialogAbout::UpdateSkins();
} }
} }
@ -2483,7 +2356,6 @@ bool CRainmeter::DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater)
m_Meters.erase(iter); m_Meters.erase(iter);
delete meterWindow; delete meterWindow;
UpdateAboutDialog();
return true; return true;
} }
} }
@ -2492,8 +2364,6 @@ bool CRainmeter::DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater)
{ {
m_Meters.clear(); m_Meters.clear();
} }
UpdateAboutDialog();
} }
return false; return false;
@ -2835,12 +2705,6 @@ void CRainmeter::ScanForThemes(const std::wstring& path)
} }
} }
void CRainmeter::SaveSettings()
{
WritePrivateProfileString(L"Rainmeter", L"CheckUpdate", NULL , m_IniFile.c_str());
WritePrivateProfileString(L"Rainmeter", L"DisableVersionCheck", m_DisableVersionCheck ? L"1" : L"0" , m_IniFile.c_str());
}
BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg, CMeterWindow* meterWindow) BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg, CMeterWindow* meterWindow)
{ {
// Skip "!Rainmeter" or "!" // Skip "!Rainmeter" or "!"
@ -3101,7 +2965,11 @@ BOOL CRainmeter::ExecuteBang(const std::wstring& bang, const std::wstring& arg,
} }
else if (_wcsicmp(name, L"About") == 0) else if (_wcsicmp(name, L"About") == 0)
{ {
RainmeterAboutWide(); RainmeterAboutWide(arg.c_str());
}
else if (_wcsicmp(name, L"Manage") == 0)
{
RainmeterManageWide(arg.c_str());
} }
else if (_wcsicmp(name, L"SkinMenu") == 0) else if (_wcsicmp(name, L"SkinMenu") == 0)
{ {
@ -3865,6 +3733,8 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
HMENU subMenu = GetSubMenu(menu, 0); HMENU subMenu = GetSubMenu(menu, 0);
if (subMenu) if (subMenu)
{ {
SetMenuDefaultItem(subMenu, ID_CONTEXT_MANAGE, MF_BYCOMMAND);
if (!GetDummyLitestep()) if (!GetDummyLitestep())
{ {
// Disable Quit/Logging if ran as a Litestep plugin // Disable Quit/Logging if ran as a Litestep plugin
@ -3918,10 +3788,8 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
WCHAR buffer[256]; WCHAR buffer[256];
GetMenuString(menu, 0, buffer, 256, MF_BYPOSITION); GetMenuString(menu, 0, buffer, 256, MF_BYPOSITION);
InsertMenu(subMenu, 10, MF_BYPOSITION | MF_POPUP, (UINT_PTR)rainmeterMenu, buffer); InsertMenu(subMenu, 11, MF_BYPOSITION | MF_POPUP, (UINT_PTR)rainmeterMenu, buffer);
InsertMenu(subMenu, 11, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); InsertMenu(subMenu, 12, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
DeleteMenu(rainmeterMenu, ID_CONTEXT_DOWNLOADS, MF_BYCOMMAND);
} }
else else
{ {
@ -3942,9 +3810,9 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
// Put Update notifications in the Tray menu // Put Update notifications in the Tray menu
if (m_NewVersion) if (m_NewVersion)
{ {
InsertMenu(subMenu, 0, MF_BYPOSITION, ID_CONTEXT_NEW_VERSION, L"New Version Available"); InsertMenu(subMenu, 0, MF_BYPOSITION, ID_CONTEXT_NEW_VERSION, L"Update available");
HiliteMenuItem(Rainmeter->GetTrayWindow()->GetWindow(), subMenu, 0, MF_BYPOSITION | MF_HILITE);
InsertMenu(subMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); InsertMenu(subMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
SetMenuDefaultItem(subMenu, ID_CONTEXT_NEW_VERSION, MF_BYCOMMAND);
} }
} }
@ -3995,7 +3863,6 @@ void CRainmeter::ShowContextMenu(POINT pos, CMeterWindow* meterWindow)
} }
} }
HMENU CRainmeter::CreateConfigMenu(HMENU configMenu, std::vector<CONFIGMENU>& configMenuData) HMENU CRainmeter::CreateConfigMenu(HMENU configMenu, std::vector<CONFIGMENU>& configMenuData)
{ {
if (!configMenuData.empty()) if (!configMenuData.empty())
@ -4071,7 +3938,7 @@ HMENU CRainmeter::CreateSkinMenu(CMeterWindow* meterWindow, int index, HMENU con
HMENU posMenu = GetSubMenu(settingsMenu, 0); HMENU posMenu = GetSubMenu(settingsMenu, 0);
if (posMenu) if (posMenu)
{ {
switch(meterWindow->GetWindowZPosition()) switch (meterWindow->GetWindowZPosition())
{ {
case ZPOSITION_ONDESKTOP: case ZPOSITION_ONDESKTOP:
CheckMenuItem(posMenu, ID_CONTEXT_SKINMENU_ONDESKTOP, MF_BYCOMMAND | MF_CHECKED); CheckMenuItem(posMenu, ID_CONTEXT_SKINMENU_ONDESKTOP, MF_BYCOMMAND | MF_CHECKED);
@ -4387,16 +4254,12 @@ void CRainmeter::DeleteLogFile()
} }
} }
void CRainmeter::AddAboutLogInfo(const LOG_INFO& logInfo) void CRainmeter::AddAboutLogInfo(int level, LPCWSTR time, LPCWSTR message)
{ {
// TODO: Store items in vector
EnterCriticalSection(&m_CsLogData); EnterCriticalSection(&m_CsLogData);
CDialogAbout::AddLogItem(level, time, message);
m_LogData.push_front(logInfo);
if (m_LogData.size() > MAXABOUTLOGLINES)
{
m_LogData.pop_back();
}
LeaveCriticalSection(&m_CsLogData); LeaveCriticalSection(&m_CsLogData);
} }
@ -4418,6 +4281,12 @@ void CRainmeter::SetDisableDragging(bool dragging)
WritePrivateProfileString(L"Rainmeter", L"DisableDragging", dragging ? L"1" : L"0", m_IniFile.c_str()); WritePrivateProfileString(L"Rainmeter", L"DisableDragging", dragging ? L"1" : L"0", m_IniFile.c_str());
} }
void CRainmeter::SetDisableVersionCheck(bool check)
{
m_DisableVersionCheck = check;
WritePrivateProfileString(L"Rainmeter", L"DisableVersionCheck", check ? L"1" : L"0" , m_IniFile.c_str());
}
void CRainmeter::TestSettingsFile(bool bDefaultIniLocation) void CRainmeter::TestSettingsFile(bool bDefaultIniLocation)
{ {
WritePrivateProfileString(L"Rainmeter", L"WriteTest", L"TRUE", m_IniFile.c_str()); WritePrivateProfileString(L"Rainmeter", L"WriteTest", L"TRUE", m_IniFile.c_str());

View File

@ -31,10 +31,13 @@
#define APPNAME L"Rainmeter" #define APPNAME L"Rainmeter"
#ifdef _WIN64 #ifdef _WIN64
#define APPBITS L"(64-bit)" #define APPBITS L"64-bit"
#else #else
#define APPBITS L"(32-bit)" #define APPBITS L"32-bit"
#endif #endif
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define APPDATE WIDEN(__DATE__)
// Callbacks for Litestep // Callbacks for Litestep
void RainmeterRefresh(HWND, const char* arg); void RainmeterRefresh(HWND, const char* arg);
@ -117,7 +120,8 @@ void RainmeterDeactivateConfigWide(const WCHAR* arg);
void RainmeterToggleConfigWide(const WCHAR* arg); void RainmeterToggleConfigWide(const WCHAR* arg);
void RainmeterDeactivateConfigGroupWide(const WCHAR* arg); void RainmeterDeactivateConfigGroupWide(const WCHAR* arg);
void RainmeterRefreshAppWide(); void RainmeterRefreshAppWide();
void RainmeterAboutWide(); void RainmeterAboutWide(const WCHAR* arg = NULL);
void RainmeterManageWide(const WCHAR* arg = NULL);
void RainmeterSkinMenuWide(const WCHAR* arg); void RainmeterSkinMenuWide(const WCHAR* arg);
void RainmeterTrayMenuWide(); void RainmeterTrayMenuWide();
void RainmeterResetStatsWide(); void RainmeterResetStatsWide();
@ -156,7 +160,7 @@ public:
struct LOG_INFO struct LOG_INFO
{ {
std::wstring type; int level;
std::wstring timestamp; std::wstring timestamp;
std::wstring message; std::wstring message;
}; };
@ -182,7 +186,7 @@ public:
const std::vector<std::wstring>& GetAllThemes() { return m_Themes; } const std::vector<std::wstring>& GetAllThemes() { return m_Themes; }
void ActivateConfig(int configIndex, int iniIndex); void ActivateConfig(int configIndex, int iniIndex);
bool DeactivateConfig(CMeterWindow* meterWindow, int configIndex); bool DeactivateConfig(CMeterWindow* meterWindow, int configIndex, bool save = true);
const std::wstring& GetPath() { return m_Path; } const std::wstring& GetPath() { return m_Path; }
const std::wstring& GetIniFile() { return m_IniFile; } const std::wstring& GetIniFile() { return m_IniFile; }
@ -209,17 +213,16 @@ public:
static bool GetDebug() { return c_Debug; } static bool GetDebug() { return c_Debug; }
void ReloadSettings(); void ReloadSettings();
void SaveSettings();
void UpdateStats(); void UpdateStats();
void ReadStats(); void ReadStats();
void WriteStats(bool bForce); void WriteStats(bool bForce);
void ResetStats(); void ResetStats();
BOOL GetDisableVersionCheck() { return m_DisableVersionCheck; } bool GetDisableVersionCheck() { return m_DisableVersionCheck; }
BOOL GetNewVersion() { return m_NewVersion; } void SetDisableVersionCheck(bool check);
void SetDisableVersionCheck(BOOL check) { m_DisableVersionCheck = check; } bool GetNewVersion() { return m_NewVersion; }
void SetNewVersion(BOOL NewVer) { m_NewVersion = NewVer; } void SetNewVersion(bool newver) { m_NewVersion = newver; }
bool GetLogging() { return m_Logging; } bool GetLogging() { return m_Logging; }
void StartLogging(); void StartLogging();
@ -231,8 +234,7 @@ public:
bool GetDisableDragging() { return m_DisableDragging; } bool GetDisableDragging() { return m_DisableDragging; }
void SetDisableDragging(bool dragging); void SetDisableDragging(bool dragging);
void AddAboutLogInfo(const LOG_INFO& logInfo); void AddAboutLogInfo(int level, LPCWSTR time, LPCWSTR message);
const std::list<LOG_INFO>& GetAboutLogData() { return m_LogData; }
void SetDebug(bool debug); void SetDebug(bool debug);
@ -258,6 +260,8 @@ public:
static std::wstring ExtractPath(const std::wstring& strFilePath); static std::wstring ExtractPath(const std::wstring& strFilePath);
static void ExpandEnvironmentVariables(std::wstring& strPath); static void ExpandEnvironmentVariables(std::wstring& strPath);
friend class CDialogManage;
private: private:
void CreateMeterWindow(const std::wstring& path, const std::wstring& config, const std::wstring& iniFile); void CreateMeterWindow(const std::wstring& path, const std::wstring& config, const std::wstring& iniFile);
bool DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater); bool DeleteMeterWindow(CMeterWindow* meterWindow, bool bLater);
@ -278,8 +282,6 @@ private:
void CreateDefaultConfigFile(const std::wstring& strFile); void CreateDefaultConfigFile(const std::wstring& strFile);
void SetLogging(bool logging); void SetLogging(bool logging);
void TestSettingsFile(bool bDefaultIniLocation); void TestSettingsFile(bool bDefaultIniLocation);
void CheckSkinVersions();
int CompareVersions(const std::wstring& strA, const std::wstring& strB);
CTrayWindow* m_TrayWindow; CTrayWindow* m_TrayWindow;
@ -308,8 +310,8 @@ private:
std::wstring m_TrayExecuteDR; std::wstring m_TrayExecuteDR;
std::wstring m_TrayExecuteDM; std::wstring m_TrayExecuteDM;
BOOL m_DisableVersionCheck; bool m_DisableVersionCheck;
BOOL m_NewVersion; bool m_NewVersion;
bool m_DesktopWorkAreaChanged; bool m_DesktopWorkAreaChanged;
bool m_DesktopWorkAreaType; // If true, DesktopWorkArea is treated as "margin" bool m_DesktopWorkAreaType; // If true, DesktopWorkArea is treated as "margin"

View File

@ -29,6 +29,7 @@
#include <winsock2.h> #include <winsock2.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <windows.h> #include <windows.h>
#include <windowsx.h>
#include <gdiplus.h> #include <gdiplus.h>
#include <dwmapi.h> #include <dwmapi.h>
#include <comdef.h> #include <comdef.h>
@ -54,8 +55,6 @@
#include <sstream> #include <sstream>
#include <ctime> #include <ctime>
#include <cstdlib> #include <cstdlib>
#include <fstream>
#include <iostream>
#include <algorithm> #include <algorithm>
#include <cctype> #include <cctype>

View File

@ -1080,6 +1080,40 @@ void CSystem::ResetWorkingDirectory()
} }
} }
/*
** SetClipboardText
**
** Sets clipboard text to given string.
**
*/
void CSystem::SetClipboardText(const std::wstring& text)
{
if (OpenClipboard(NULL))
{
// Include terminating null char
size_t len = text.length() + 1;
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len * sizeof(WCHAR));
if (hMem)
{
LPVOID data = GlobalLock(hMem);
if (data)
{
memcpy(data, text.c_str(), len * sizeof(WCHAR));
GlobalUnlock(hMem);
EmptyClipboard();
if (!SetClipboardData(CF_UNICODETEXT, hMem))
{
GlobalFree(hMem);
}
}
}
CloseClipboard();
}
}
/* /*
** CopyFiles ** CopyFiles
** **
@ -1129,6 +1163,34 @@ bool CSystem::RemoveFile(const std::wstring& file)
return (DeleteFile(file.c_str()) != 0); return (DeleteFile(file.c_str()) != 0);
} }
/*
** RemoveFolder
**
** Recursively removes folder.
**
*/
bool CSystem::RemoveFolder(const std::wstring& strFolder)
{
std::wstring tmpFolder(strFolder);
// The strings must end with double nul
tmpFolder.append(L"0");
tmpFolder[tmpFolder.size() - 1] = L'\0';
SHFILEOPSTRUCT fo = {0};
fo.wFunc = FO_DELETE;
fo.pFrom = tmpFolder.c_str();
fo.fFlags = FOF_NO_UI | FOF_NOCONFIRMATION | FOF_ALLOWUNDO;
int result = SHFileOperation(&fo);
if (result != 0)
{
LogWithArgs(LOG_ERROR, L"Unable to delete folder %s (%i)", strFolder.c_str(), result);
return false;
}
return true;
}
/* /*
** GetIniFileMappingList ** GetIniFileMappingList
** **

View File

@ -75,8 +75,11 @@ public:
static HMODULE RmLoadLibrary(LPCWSTR lpLibFileName, DWORD* dwError = NULL, bool ignoreErrors = false); static HMODULE RmLoadLibrary(LPCWSTR lpLibFileName, DWORD* dwError = NULL, bool ignoreErrors = false);
static void ResetWorkingDirectory(); static void ResetWorkingDirectory();
static void SetClipboardText(const std::wstring& text);
static bool CopyFiles(const std::wstring& strFrom, const std::wstring& strTo, bool bMove = false); static bool CopyFiles(const std::wstring& strFrom, const std::wstring& strTo, bool bMove = false);
static bool RemoveFile(const std::wstring& file); static bool RemoveFile(const std::wstring& file);
static bool RemoveFolder(const std::wstring& strFolder);
static void GetIniFileMappingList(std::vector<std::wstring>& iniFileMappings); static void GetIniFileMappingList(std::vector<std::wstring>& iniFileMappings);
static std::wstring GetTemporaryFile(const std::vector<std::wstring>& iniFileMappings, const std::wstring& iniFile); static std::wstring GetTemporaryFile(const std::vector<std::wstring>& iniFileMappings, const std::wstring& iniFile);

View File

@ -22,7 +22,8 @@
#include "resource.h" #include "resource.h"
#include "Litestep.h" #include "Litestep.h"
#include "Rainmeter.h" #include "Rainmeter.h"
#include "AboutDialog.h" #include "DialogAbout.h"
#include "DialogManage.h"
#include "Error.h" #include "Error.h"
#include "RainmeterQuery.h" #include "RainmeterQuery.h"
#include "../Version.h" #include "../Version.h"
@ -411,18 +412,18 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
} }
} }
switch(uMsg) switch (uMsg)
{ {
case WM_COMMAND: case WM_COMMAND:
if (Rainmeter && tray) if (Rainmeter && tray)
{ {
if (wParam == ID_CONTEXT_ABOUT) if (wParam == ID_CONTEXT_MANAGE)
{ {
OpenAboutDialog(tray->GetWindow(), Rainmeter->GetInstance()); CDialogManage::Open();
} }
else if (wParam == ID_CONTEXT_DOWNLOADS) else if (wParam == ID_CONTEXT_ABOUT)
{ {
LSExecute(NULL, RAINMETER_DOWNLOADS, SW_SHOWNORMAL); CDialogAbout::Open();
} }
else if (wParam == ID_CONTEXT_SHOW_HELP) else if (wParam == ID_CONTEXT_SHOW_HELP)
{ {
@ -474,18 +475,6 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
command += L"\""; command += L"\"";
LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL); LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL);
} }
else if (wParam == ID_CONTEXT_MANAGETHEMES)
{
std::wstring command = L"\"" + Rainmeter->GetAddonPath();
command += L"RainThemes\\RainThemes.exe\"";
LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL);
}
else if (wParam == ID_CONTEXT_MANAGESKINS)
{
std::wstring command = L"\"" + Rainmeter->GetAddonPath();
command += L"RainBrowser\\RainBrowser.exe\"";
LSExecute(tray->GetWindow(), command.c_str(), SW_SHOWNORMAL);
}
else if (wParam == ID_CONTEXT_QUIT) else if (wParam == ID_CONTEXT_QUIT)
{ {
if (Rainmeter->GetDummyLitestep()) PostQuitMessage(0); if (Rainmeter->GetDummyLitestep()) PostQuitMessage(0);
@ -565,10 +554,9 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_TRAY_NOTIFYICON: case WM_TRAY_NOTIFYICON:
{ {
UINT uMouseMsg = (UINT)lParam; UINT uMouseMsg = (UINT)lParam;
std::wstring bang; std::wstring bang;
switch(uMouseMsg) switch (uMouseMsg)
{ {
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
bang = Rainmeter->GetTrayExecuteL(); bang = Rainmeter->GetTrayExecuteL();
@ -599,12 +587,16 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
{ {
Rainmeter->ExecuteCommand(bang.c_str(), NULL); Rainmeter->ExecuteCommand(bang.c_str(), NULL);
} }
else if (uMouseMsg == WM_RBUTTONDOWN) else if (uMouseMsg == WM_RBUTTONDOWN)
{ {
POINT point; POINT point;
GetCursorPos(&point); GetCursorPos(&point);
Rainmeter->ShowContextMenu(point, NULL); Rainmeter->ShowContextMenu(point, NULL);
} }
else if (uMouseMsg == WM_LBUTTONDOWN || uMouseMsg == WM_LBUTTONDBLCLK)
{
CDialogManage::Open();
}
} }
break; break;
@ -699,9 +691,9 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
} }
else if (wParam == RAINMETER_QUERY_ID_VERSION_CHECK) else if (wParam == RAINMETER_QUERY_ID_VERSION_CHECK)
{ {
UINT versioncheck = (Rainmeter->GetDisableVersionCheck() * (Rainmeter->GetDisableVersionCheck() + Rainmeter->GetNewVersion())); UINT versioncheck = ((int)Rainmeter->GetDisableVersionCheck() * ((int)Rainmeter->GetDisableVersionCheck() + (int)Rainmeter->GetNewVersion()));
SendMessage((HWND)lParam, WM_QUERY_RAINMETER_RETURN, (WPARAM)hWnd, (LPARAM) versioncheck); SendMessage((HWND)lParam, WM_QUERY_RAINMETER_RETURN, (WPARAM)hWnd, (LPARAM)versioncheck);
return 0; return 0;
} }
@ -709,7 +701,7 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
{ {
BOOL debug = Rainmeter->GetDebug(); BOOL debug = Rainmeter->GetDebug();
SendMessage((HWND)lParam, WM_QUERY_RAINMETER_RETURN, (WPARAM)hWnd, (LPARAM) debug); SendMessage((HWND)lParam, WM_QUERY_RAINMETER_RETURN, (WPARAM)hWnd, (LPARAM)debug);
return 0; return 0;
} }
@ -801,7 +793,7 @@ LRESULT CALLBACK CTrayWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
{ {
BOOL islitestep = !Rainmeter->GetDummyLitestep(); BOOL islitestep = !Rainmeter->GetDummyLitestep();
SendMessage((HWND)lParam, WM_QUERY_RAINMETER_RETURN, (WPARAM)hWnd, (LPARAM) islitestep); SendMessage((HWND)lParam, WM_QUERY_RAINMETER_RETURN, (WPARAM)hWnd, (LPARAM)islitestep);
return 0; return 0;
} }

View File

@ -71,12 +71,12 @@ void CheckVersion(void* dummy)
if (version > RAINMETER_VERSION) if (version > RAINMETER_VERSION)
{ {
Rainmeter->SetNewVersion(TRUE); Rainmeter->SetNewVersion(true);
Log(LOG_NOTICE, L"CheckUpdate: New version available.");
} }
else else
{ {
Rainmeter->SetNewVersion(FALSE); Rainmeter->SetNewVersion(false);
Log(LOG_NOTICE, L"CheckUpdate: No new version available.");
} }
} }
else else

View File

@ -2,86 +2,139 @@
// Microsoft Visual C++ generated include file. // Microsoft Visual C++ generated include file.
// Used by Library.rc // Used by Library.rc
// //
#define IDR_CONTEXT_MENU 101 #define IDC_STATIC -1
#define IDD_ABOUT_DIALOG 102 #define IDI_TRAY 100
#define IDR_SKIN_MENU 102 #define IDI_WINDOW 101
#define IDI_TRAY 108 #define IDR_CONTEXT_MENU 102
#define IDI_WINDOW 109 #define IDR_SKIN_MENU 103
#define IDC_STATISTICS 1000 #define IDR_MANAGESKINS_MENU 104
#define IDC_BUILD_STRING 1001 #define IDD_ABOUT_DIALOG 105
#define IDC_VERSION_STRING 1002 #define IDD_ABOUTLOG_DIALOG 106
#define IDC_STATISTICS_STRING 1003 #define IDD_ABOUTMEASURES_DIALOG 107
#define IDC_STATIC_ABOUT 1004 #define IDD_ABOUTPLUGINS_DIALOG 108
#define IDC_URL_STRING 1005 //#define IDD_ABOUTINFO_DIALOG 109
#define IDC_ABOUT_ENTRIES 1006 #define IDD_MANAGE_DIALOG 110
#define IDC_AUTHOR_STRING 1007 #define IDD_MANAGESKINS_DIALOG 111
#define IDC_DISABLE_VERSION_CHECK 1008 #define IDD_MANAGETHEMES_DIALOG 112
#define ID_CONTEXT_REFRESH 4001 #define IDD_MANAGESETTINGS_DIALOG 113
#define ID_CONTEXT_QUIT 4002
#define ID_CONTEXT_DISABLEDRAG 4003
#define ID_CONTEXT_ABOUT 4004
#define ID_CONTEXT_DOWNLOADS 4005
#define ID_CONTEXT_CONFIGS_DEFAULT 4006
#define ID_CONTEXT_EDITCONFIG 4008
#define ID_CONTEXT_CLOSESKIN 4009
#define ID_CONTEXT_SKINMENU_TOPMOST 4010
#define ID_CONTEXT_SKINMENU_NORMAL 4011
#define ID_CONTEXT_SKINMENU_BOTTOM 4012
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_0 4014
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_10 4015
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_20 4016
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_30 4017
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_40 4018
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_50 4019
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_60 4020
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_70 4021
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_80 4022
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_90 4023
#define ID_CONTEXT_SKINMENU_REFRESH 4024
#define ID_CONTEXT_SKINMENU_HIDEONMOUSE 4025
#define ID_CONTEXT_SKINMENU_DRAGGABLE 4026
#define ID_CONTEXT_SKINMENU_REMEMBERPOSITION 4027
#define ID_CONTEXT_SKINMENU_SNAPTOEDGES 4028
#define ID_CONTEXT_SKINMENU_CLICKTHROUGH 4029
#define ID_CONTEXT_SKINMENU_EDITSKIN 4030
#define ID_CONTEXT_SKINMENU_VERYTOPMOST 4031
#define ID_CONTEXT_SKINMENU_ONDESKTOP 4032
#define ID_CONTEXT_SHOW_HELP 4034
#define ID_CONTEXT_SHOWLOGFILE 4035
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEIN 4037
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT 4038
#define ID_CONTEXT_SKINMENU_KEEPONSCREEN 4039
#define ID_CONTEXT_SKINMENU_FROMRIGHT 4040
#define ID_CONTEXT_SKINMENU_FROMBOTTOM 4041
#define ID_CONTEXT_SKINMENU_XPERCENTAGE 4042
#define ID_CONTEXT_SKINMENU_YPERCENTAGE 4043
#define ID_CONTEXT_OPENSKINSFOLDER 4044
#define ID_CONTEXT_SKINMENU_OPENSKINSFOLDER 4045
#define ID_CONTEXT_MANAGETHEMES 4046
#define ID_CONTEXT_MANAGESKINS 4047
#define ID_CONTEXT_SKINMENU_MONITOR_PRIMARY 4048
#define ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT 4049
#define ID_CONTEXT_NEW_VERSION 4050
#define ID_CONTEXT_STARTLOG 4051
#define ID_CONTEXT_STOPLOG 4052
#define ID_CONTEXT_DEBUGLOG 4053
#define ID_CONTEXT_DELETELOGFILE 4054
#define ID_CONFIG_EDIT 30000 #define IDC_ABOUT_TAB 1000
#define ID_CONFIG_FIRST 30001 #define IDC_ABOUT_VERSION_TEXT 1001
#define ID_CONFIG_LAST 40000 #define IDC_ABOUTLOG_ITEMS_LISTVIEW 1002
#define ID_THEME_FIRST 40001 #define IDC_ABOUTLOG_ERROR_CHECKBOX 1003
#define ID_THEME_LAST 43000 #define IDC_ABOUTLOG_WARNING_CHECKBOX 1004
#define ID_MONITOR_FIRST 43001 #define IDC_ABOUTLOG_NOTICE_CHECKBOX 1005
#define ID_MONITOR_LAST 44000 #define IDC_ABOUTLOG_DEBUG_CHECKBOX 1006
#define IDC_ABOUTMEASURES_ITEMS_LISTBOX 1007
#define IDC_ABOUTMEASURES_ITEMS_LISTVIEW 1008
#define IDC_ABOUTPLUGINS_ITEMS_LISTVIEW 1009
// Next default values for new objects #define IDC_MANAGE_TAB 1017
// #define IDC_REFRESHALL_BUTTON 1018
#ifdef APSTUDIO_INVOKED #define IDC_EDITSETTINGS_BUTTON 1019
#ifndef APSTUDIO_READONLY_SYMBOLS #define IDC_OPENLOG_BUTTON 1020
#define _APS_NEXT_RESOURCE_VALUE 110 #define IDC_MANAGESKINS_ACTIVESKINS_BUTTON 1021
#define _APS_NEXT_COMMAND_VALUE 4040 #define IDC_MANAGESKINS_SKINS_TREEVIEW 1022
#define _APS_NEXT_CONTROL_VALUE 1013 #define IDC_MANAGESKINS_FILE_TEXT 1023
#define _APS_NEXT_SYMED_VALUE 101 #define IDC_MANAGESKINS_CONFIG_TEXT 1024
#endif #define IDC_MANAGESKINS_LOAD_BUTTON 4056 // ID_CONTEXT_MANAGESKINSMENU_LOAD
#endif #define IDC_MANAGESKINS_REFRESH_BUTTON 4057 // ID_CONTEXT_MANAGESKINSMENU_REFRESH
#define IDC_MANAGESKINS_EDIT_BUTTON 4058 // ID_CONTEXT_MANAGESKINSMENU_EDIT
#define IDC_MANAGESKINS_AUTHOR_TEXT 1025
#define IDC_MANAGESKINS_VERSION_TEXT 1026
#define IDC_MANAGESKINS_LICENSE_TEXT 1027
#define IDC_MANAGESKINS_DESCRIPTION_TEXT 1028
#define IDC_MANAGESKINS_ADDMETADATA_LINK 1029
#define IDC_MANAGESKINS_X_TEXT 1030
#define IDC_MANAGESKINS_Y_TEXT 1031
#define IDC_MANAGESKINS_ZPOSITION_COMBOBOX 1032
#define IDC_MANAGESKINS_LOADORDER_TEXT 1033
#define IDC_MANAGESKINS_ONHOVER_COMBOBOX 1034
#define IDC_MANAGESKINS_TRANSPARENCY_COMBOBOX 1035
#define IDC_MANAGESKINS_DISPLAYMONITOR_BUTTON 1036
#define IDC_MANAGESKINS_DRAGGABLE_CHECKBOX 1037
#define IDC_MANAGESKINS_CLICKTHROUGH_CHECKBOX 1038
#define IDC_MANAGESKINS_KEEPONSCREEN_CHECKBOX 1039
#define IDC_MANAGESKINS_SAVEPOSITION_CHECKBOX 1040
#define IDC_MANAGESKINS_SNAPTOEDGES_CHECKBOX 1041
#define IDC_MANAGETHEMES_LIST 1042
#define IDC_MANAGETHEMES_LOAD_BUTTON 1043
#define IDC_MANAGETHEMES_DELETE_BUTTON 1044
#define IDC_MANAGETHEMES_EDIT_BUTTON 1045
#define IDC_MANAGETHEMES_SAVE_BUTTON 1046
#define IDC_MANAGETHEMES_EMPTYTHEME_CHECKBOX 1047
#define IDC_MANAGETHEMES_UNUSEDSKINS_CHECKBOX 1048
#define IDC_MANAGETHEMES_WALLPAPER_CHECKBOX 1049
#define IDC_MANAGETHEMES_NAME_TEXT 1050
#define IDC_MANAGETHEMES_BACKUP_BUTTON 1051
#define IDC_MANAGESETTINGS_CHECKUPDATES_CHECKBOX 1052
#define IDC_MANAGESETTINGS_LOCKSKINS_CHECKBOX 1053
#define IDC_MANAGESETTINGS_RESETSTATISTICS_BUTTON 1054
#define IDC_MANAGESETTINGS_LOGTOFILE_CHECKBOX 1055
#define IDC_MANAGESETTINGS_VERBOSELOGGING_CHECKBOX 1056
#define IDC_MANAGESETTINGS_SHOWLOGFILE_BUTTON 1057
#define IDC_MANAGESETTINGS_DELETELOGFILE_BUTTON 1058
#define IDC_MANAGESETTINGS_VERSION_LABEL 1059
#define ID_CONTEXT_REFRESH 4001
#define ID_CONTEXT_QUIT 4002
#define ID_CONTEXT_DISABLEDRAG 4003
#define ID_CONTEXT_MANAGE 4004
#define ID_CONTEXT_ABOUT 4005
#define ID_CONTEXT_CONFIGS_DEFAULT 4006
#define ID_CONTEXT_EDITCONFIG 4008
#define ID_CONTEXT_CLOSESKIN 4009
#define ID_CONTEXT_SKINMENU_TOPMOST 4010
#define ID_CONTEXT_SKINMENU_NORMAL 4011
#define ID_CONTEXT_SKINMENU_BOTTOM 4012
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_0 4014
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_10 4015
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_20 4016
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_30 4017
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_40 4018
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_50 4019
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_60 4020
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_70 4021
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_80 4022
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_90 4023
#define ID_CONTEXT_SKINMENU_REFRESH 4024
#define ID_CONTEXT_SKINMENU_HIDEONMOUSE 4025
#define ID_CONTEXT_SKINMENU_DRAGGABLE 4026
#define ID_CONTEXT_SKINMENU_REMEMBERPOSITION 4027
#define ID_CONTEXT_SKINMENU_SNAPTOEDGES 4028
#define ID_CONTEXT_SKINMENU_CLICKTHROUGH 4029
#define ID_CONTEXT_SKINMENU_EDITSKIN 4030
#define ID_CONTEXT_SKINMENU_VERYTOPMOST 4031
#define ID_CONTEXT_SKINMENU_ONDESKTOP 4032
#define ID_CONTEXT_SHOW_HELP 4034
#define ID_CONTEXT_SHOWLOGFILE 4035
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEIN 4037
#define ID_CONTEXT_SKINMENU_TRANSPARENCY_FADEOUT 4038
#define ID_CONTEXT_SKINMENU_KEEPONSCREEN 4039
#define ID_CONTEXT_SKINMENU_FROMRIGHT 4040
#define ID_CONTEXT_SKINMENU_FROMBOTTOM 4041
#define ID_CONTEXT_SKINMENU_XPERCENTAGE 4042
#define ID_CONTEXT_SKINMENU_YPERCENTAGE 4043
#define ID_CONTEXT_OPENSKINSFOLDER 4044
#define ID_CONTEXT_SKINMENU_OPENSKINSFOLDER 4045
#define ID_CONTEXT_SKINMENU_MONITOR_PRIMARY 4046
#define ID_CONTEXT_SKINMENU_MONITOR_AUTOSELECT 4047
#define ID_CONTEXT_NEW_VERSION 4048
#define ID_CONTEXT_STARTLOG 4049
#define ID_CONTEXT_STOPLOG 4050
#define ID_CONTEXT_DEBUGLOG 4051
#define ID_CONTEXT_DELETELOGFILE 4052
#define ID_CONTEXT_SKINMENU_MANAGESKIN 4053
#define ID_CONTEXT_MANAGESKINSMENU_EXPAND 4054
#define ID_CONTEXT_MANAGESKINSMENU_OPENFOLDER 4055
#define ID_CONTEXT_MANAGESKINSMENU_LOAD 4056
#define ID_CONTEXT_MANAGESKINSMENU_REFRESH 4057
#define ID_CONTEXT_MANAGESKINSMENU_EDIT 4058
#define ID_CONFIG_EDIT 30000
#define ID_CONFIG_FIRST 30001
#define ID_CONFIG_LAST 40000
#define ID_THEME_FIRST 40001
#define ID_THEME_LAST 43000
#define ID_MONITOR_FIRST 43001
#define ID_MONITOR_LAST 44000