Overhaul repository structure to add config

I wish I didn't end up doing this all at once, but ah well. Quick rundown:

- CommonCfg contains config/registry functions shared between Grabby and GrbyCfg.
- GrbyCfg provides a dialog for configuring Grabby.

git-svn-id: svn://vcs.sdm.2ki.xyz/Grabby/trunk@16 27729192-006e-004d-b9b5-06fbd0ef7001
This commit is contained in:
snow flurry 2024-02-26 06:18:00 +00:00
parent be95698d10
commit 69476552e8
42 changed files with 2291 additions and 136 deletions

160
CommonCfg/CommonCfg.vcproj Normal file
View file

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="shift_jis"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="CommonCfg"
ProjectGUID="{61829180-05C1-4865-B9C3-FEB983AD6997}"
RootNamespace="CommonCfg"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="_WIN32_WINNT=0x0400;_WIN32_WINDOWS=0x0400;_DEBUG"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"
CompileAs="1"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CommonCfg.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="_WIN32_WINNT=0x0400;_WIN32_WINDOWS=0x0400"
RuntimeLibrary="4"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"
CompileAs="1"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CommonCfg.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\Config.c">
</File>
<File
RelativePath=".\MultiString.c">
</File>
<File
RelativePath=".\RegHelper.c">
</File>
<File
RelativePath=".\stdafx.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\UploadConfig.c">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\RegHelper.h">
</File>
<File
RelativePath=".\stdafx.h">
</File>
<Filter
Name="Export"
Filter="">
<File
RelativePath=".\Export\Config.h">
</File>
</Filter>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

141
CommonCfg/Config.c Normal file
View file

@ -0,0 +1,141 @@
#include "stdafx.h"
const Config DEFAULT_CONFIG = {
{0}, // Use default (My Documents/Screenshots)
FALSE, // Don't upload screenshots
TRUE, // Do keep screenshots
FALSE, // Don't start helper on startup
HSC_WIN10 // Emulate Win7+ "Snipping Tool" shortcut
};
#define OpenRootKey(hkey,access) \
RegCreateKeyEx(HKEY_CURRENT_USER, \
_T(ROOT_KEYNAME), \
0, \
NULL, \
REG_OPTION_NON_VOLATILE, \
access, \
NULL, \
hkey, \
NULL)
// Enumeration callback for GetConfig
static BOOL
ConfigCallback(HKEY hKey,
LPTSTR szValName,
DWORD dwValSize,
DWORD dwValType,
PVOID pData)
{
Config *cfg = pData;
if (!cfg) return FALSE;
CopyIfMatch(hKey, cfg,
ScreenshotDir, REG_PATH_SZ)
else CopyIfMatch(hKey, cfg,
Upload, REG_DWORD)
else CopyIfMatch(hKey, cfg,
KeepScreenshots, REG_DWORD)
else CopyIfMatch(hKey, cfg,
HelperStartup, REG_DWORD)
else CopyIfMatch(hKey, cfg,
HelperShortcut, REG_DWORD)
return TRUE;
}
Config *
GetConfig(void)
{
HKEY hkRootKey = NULL;
BOOL bRes;
DWORD dwErr;
HANDLE hHeap = GetProcessHeap();
Config *cfg = HeapAlloc(hHeap, 0, sizeof(Config));
if (!cfg) return NULL;
// Copy in the default config
CopyMemory(cfg, &DEFAULT_CONFIG, sizeof(Config));
if ((dwErr = OpenRootKey(&hkRootKey, KEY_READ))) {
HeapFree(hHeap, 0, cfg);
SetLastError(dwErr);
return NULL;
}
bRes = RegGetAllValues(hkRootKey, ConfigCallback, cfg);
dwErr = GetLastError();
RegCloseKey(hkRootKey);
if (!bRes) {
FreeConfig(cfg);
SetLastError(dwErr);
return NULL;
}
// If ScreenshotDir is NULL, set it to My Documents
if (!strlen(cfg->ScreenshotDir)) {
HRESULT hrRes;
// afaict, My Pictures isn't an easily accessible folder.
// There's CSIDL_MYPICTURES, but that's XP-only (and also
// points to a virtual folder???).
hrRes = SHGetFolderPath(NULL,
CSIDL_PERSONAL,
NULL,
SHGFP_TYPE_CURRENT,
cfg->ScreenshotDir);
if (FAILED(hrRes)) {
// TODO: error management
// For now, just empty the string
*cfg->ScreenshotDir = 0;
} else {
PathAppend(cfg->ScreenshotDir,
_T("Screenshots"));
}
}
// TODO: Detect startup
return cfg;
}
BOOL
SaveConfig(Config *cfg)
{
HKEY hkRootKey;
DWORD dwErr;
if (!cfg) return FALSE;
if ((dwErr = OpenRootKey(&hkRootKey, KEY_WRITE))) {
SetLastError(dwErr);
return FALSE;
}
StoreConfig(hkRootKey, cfg,
ScreenshotDir, REG_SZ)
StoreConfig(hkRootKey, cfg,
Upload, REG_DWORD)
StoreConfig(hkRootKey, cfg,
KeepScreenshots, REG_DWORD)
StoreConfig(hkRootKey, cfg,
HelperStartup, REG_DWORD)
StoreConfig(hkRootKey, cfg,
HelperShortcut, REG_DWORD)
RegCloseKey(hkRootKey);
return TRUE;
}
void
FreeConfig(Config *cfg)
{
HANDLE hHeap = GetProcessHeap();
if (!cfg) return;
HeapFree(hHeap, 0, cfg);
return;
}

86
CommonCfg/Export/Config.h Normal file
View file

@ -0,0 +1,86 @@
#pragma once
typedef struct _MultiString {
LPTSTR * Values; // Array of string values
size_t Count; // Length of Values
size_t TotalLength; // Used by registry helpers.
// NOTE: This length includes the NULL
// terminator characters of each string
DWORD Reserved[2]; // Used internally
} MultiString;
// Initializes an existing MultiString array, with the given length.
// If dwInitLen is 0, no entries are pre-allocated.
BOOL
MultiString_Init(MultiString *ms,
DWORD dwInitLen);
// Appends a copy of szNew to the end of the list.
//
// NOTE: A new string with the same length as szNew is allocated and
// stored in ms. This makes future internal freeing easier, but means
// the function caller is responsible for freeing the parameter.
BOOL
MultiString_Append(MultiString *ms,
LPCTSTR szNew);
// Removes the string at dwIdx, freeing the memory used.
BOOL
MultiString_Remove(MultiString *ms,
DWORD dwIdx);
// Replaces the string at dwIdx with szNew. Allocations are performed
// similar to MultiString_Append.
BOOL
MultiString_Replace(MultiString *ms,
DWORD dwIdx,
LPCTSTR szNew);
// Frees all memory in a MultiString structure.
void
MultiString_Dispose(MultiString *ms);
typedef enum _HelperShortcut {
HSC_MACOS, // Pretend to be like MacOS (Win+Shift+4)
HSC_WIN10, // Pretend to be like Windows (Win+Shift+S)
HSC_CUSTOM // Use a custom keyboard shortcut
} HlprKbd;
typedef struct _GlobalConfig {
TCHAR ScreenshotDir[MAX_PATH];
BOOL Upload;
BOOL KeepScreenshots;
BOOL HelperStartup;
HlprKbd HelperShortcut;
} Config;
typedef enum _AuthMethod {
CFG_NOAUTH, // Anonymous HTTP requests
CFG_BASICAUTH, // Use HTTP Basic auth
CFG_DIGESTAUTH, // Use HTTP Digest auth
CFG_TOKENAUTH // Use a custom Authorization header
} AuthMethod;
typedef struct _UploadConfig {
LPTSTR Name;
LPTSTR URL;
LPTSTR Method;
/*
* NOTE: If AuthType == CFG_TOKENAUTH, Username is blank/NULL and
* Password is the token.
*/
LPTSTR Username;
LPTSTR Password;
AuthMethod HTTPAuthMethod;
MultiString Headers;
MultiString Parameters;
} UploadConfig;
// Gets the current configuration from the registry.
Config *GetConfig(void);
// Saves the Config object to the registry.
BOOL SaveConfig(Config *cfg);
// Frees all memory associated with the Config object.
void FreeConfig(Config *cfg);

196
CommonCfg/MultiString.c Normal file
View file

@ -0,0 +1,196 @@
#include "stdafx.h"
#define STRSAFE_NO_DEPRECATE
#include <Strsafe.h>
#define CurAlloc Reserved[0]
BOOL
MultiString_Init(MultiString *ms,
DWORD dwInitLen)
{
HANDLE hHeap = GetProcessHeap();
if (!ms) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (dwInitLen) {
ms->CurAlloc = dwInitLen;
ms->Values = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY,
sizeof(LPTSTR) * dwInitLen);
if (!ms->Values) return FALSE;
ms->Count = 0;
} else {
// Otherwise, this amounts to a zero-out
ZeroMemory(ms, sizeof(MultiString));
}
return TRUE;
}
__inline static LPTSTR
CreateStrCopy(LPCTSTR szStr)
{
HRESULT hrRes;
LPTSTR szNewCopy;
// dwLen needs to include the NULL terminator
size_t dwLen = _tcslen(szStr) + 1;
HANDLE hHeap = GetProcessHeap();
// Allocate the new string
szNewCopy = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY,
sizeof(TCHAR) * dwLen);
if (!szNewCopy) return NULL;
// Copy the actual data over
hrRes = StringCchCopy(szNewCopy,
dwLen,
szStr);
if (FAILED(hrRes)) {
HeapFree(hHeap, 0, szNewCopy);
return NULL;
}
return szNewCopy;
}
BOOL
MultiString_Append(MultiString *ms,
LPCTSTR szNew)
{
LPTSTR szNewCopy = NULL;
DWORD dwNewLen;
HANDLE hHeap = GetProcessHeap();
if (!ms || !szNew) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
dwNewLen = (DWORD)_tcslen(szNew) + 1;
// Do we need to allocate more room for pointers?
if (ms->Values == NULL) {
// Oops, we have nothing! Let's allocate a couple
if (!MultiString_Init(ms, 3)) {
return FALSE;
}
} else if (ms->CurAlloc == ms->Count) {
DWORD dwNewAlloc = ms->CurAlloc + 3;
LPTSTR *pszNew = HeapReAlloc(hHeap,
0,
ms->Values,
sizeof(LPTSTR) * dwNewAlloc);
if (!pszNew) {
// ReAlloc failed :<
return FALSE;
}
ms->CurAlloc = dwNewAlloc;
ms->Values = pszNew;
}
szNewCopy = CreateStrCopy(szNew);
if (!szNewCopy) return FALSE;
// All set, append to the end and increment Count
ms->Values[ms->Count++] = szNewCopy;
ms->TotalLength += dwNewLen;
return TRUE;
}
BOOL
MultiString_Remove(MultiString *ms,
DWORD dwIdx)
{
DWORD dwLen = 0;
HANDLE hHeap = GetProcessHeap();
if (!ms) return FALSE;
if (dwIdx >= ms->Count) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
} else if (ms->Values[dwIdx] != NULL) {
dwLen = (DWORD)_tcslen(ms->Values[dwIdx]) + 1;
HeapFree(hHeap, 0, ms->Values[dwIdx]);
}
// Shift down the remaining strings
if (dwIdx < ms->Count - 1) {
size_t i;
for (i = dwIdx; i < ms->Count - 1; i++) {
ms->Values[i] = ms->Values[i + 1];
}
}
ms->Count--;
ms->TotalLength -= dwLen;
return TRUE;
}
BOOL
MultiString_Replace(MultiString *ms,
DWORD dwIdx,
LPCTSTR szNew)
{
DWORD dwOldLen = 0,
dwNewLen = 0;
LPTSTR szTmp;
HANDLE hHeap = GetProcessHeap();
if (!ms || !szNew) return FALSE;
if (dwIdx >= ms->Count) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
dwNewLen = (DWORD)_tcslen(szNew) + 1;
// Create the copied new string
szTmp = CreateStrCopy(szNew);
if (!szTmp) return FALSE;
// Perform the switcheroo
if (ms->Values[dwIdx] != NULL) {
dwOldLen = (DWORD)_tcslen(ms->Values[dwIdx]) + 1;
HeapFree(hHeap, 0, ms->Values[dwIdx]);
}
ms->Values[dwIdx] = szTmp;
ms->TotalLength = ms->TotalLength + dwNewLen - dwOldLen;
return TRUE;
}
void
MultiString_Dispose(MultiString *ms)
{
HANDLE hHeap = GetProcessHeap();
DWORD i;
if (!ms) return;
if (ms->Values != NULL) {
for (i = 0; i < ms->Count; i++) {
HeapFree(hHeap, 0, ms->Values[i]);
}
HeapFree(hHeap, 0, ms->Values);
ms->Values = NULL;
}
ms->Count = 0;
ms->CurAlloc = 0;
return;
}

29
CommonCfg/ReadMe.txt Normal file
View file

@ -0,0 +1,29 @@
========================================================================
STATIC LIBRARY : CommonCfg Project Overview
========================================================================
AppWizard has created this CommonCfg library project for you.
This file contains a summary of what you will find in each of the files that
make up your CommonCfg application.
CommonCfg.vcproj
This is the main project file for VC++ projects generated using an Application Wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
Application Wizard.
/////////////////////////////////////////////////////////////////////////////
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named CommonCfg.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" comments to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////

280
CommonCfg/RegHelper.c Normal file
View file

@ -0,0 +1,280 @@
#include "stdafx.h"
#define STRSAFE_NO_DEPRECATE
#include <Strsafe.h>
// Used by CopyRegValue specifically for copying
// REG_MULTI_SZ values, because those in particular are
// really funky.
static BOOL
CopyMultiValue(HKEY hKey,
PVOID pVal,
LPCTSTR szName,
DWORD dwSize)
{
int iStrCount = 0;
LPTSTR szMulti = NULL,
ptr;
BOOL bWasNull = FALSE;
LONG lRes;
MultiString *msData = (MultiString *)pVal;
HANDLE hHeap = GetProcessHeap();
szMulti = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY,
dwSize + sizeof(TCHAR));
if (!szMulti) return FALSE;
// Get the multi-string value
if (!(lRes = RegQueryValueEx(hKey,
szName,
0,
NULL,
szMulti,
&dwSize)))
{
HeapFree(hHeap, 0, szMulti);
SetLastError(lRes);
return FALSE;
}
for (ptr = szMulti; (ptr - szMulti) < (LONG)dwSize; ptr++) {
if (*ptr == 0) {
if (bWasNull) {
// Two NULLs in a row, we're done!
break;
} else {
// End of string, add to the list
bWasNull = TRUE;
iStrCount++;
}
}
bWasNull = FALSE;
}
if (!bWasNull) {
// Not properly NULL terminated, sigh...
// Make sure to count the last string.
iStrCount++;
}
if (!MultiString_Init(msData, iStrCount)) {
HeapFree(hHeap, 0, szMulti);
return FALSE;
} else {
int i;
for (i = 0, ptr = szMulti; i < iStrCount; i++, ptr += strlen(ptr) + 1) {
if (!MultiString_Append(msData, ptr)) {
DWORD err = GetLastError();
HeapFree(hHeap, 0, szMulti);
MultiString_Dispose(msData);
SetLastError(err);
return FALSE;
}
}
}
HeapFree(hHeap, 0, szMulti);
return TRUE;
}
BOOL
CopyRegValue(HKEY hKey,
PVOID pVal,
LPCTSTR szName,
DWORD dwType,
DWORD dwSize)
{
HANDLE hHeap = GetProcessHeap();
PVOID pData = pVal;
LONG lRes;
if (pVal == NULL ||
szName == NULL ||
hKey == NULL) {
return FALSE;
}
if (dwType == REG_BINARY ||
dwType == REG_SZ) {
pData = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize);
if (!pData) return FALSE;
*(PVOID *)pVal = pData;
} else if (dwType == REG_MULTI_SZ) {
// REG_MULTI_SZ is complex enough to warrant its own
// function
return CopyMultiValue(hKey, pVal, szName, dwSize);
}
if ((lRes = RegQueryValueEx(hKey,
szName,
NULL,
NULL,
pData,
&dwSize)) != ERROR_SUCCESS)
{
SetLastError(lRes);
return FALSE;
}
return TRUE;
}
// Enumerates across all values in a key, running the given
// RegEnumCallback. Use `pData` to pass application-defined
// data to your enumerator callback.
BOOL RegGetAllValues(HKEY hKey,
RegEnumCallback cb,
PVOID pData)
{
LONG lRes;
TCHAR szValName[512];
DWORD dwNameLen = 512,
dwIdx,
dwValType,
dwValSize;
if (!hKey || !cb) return FALSE;
for (dwIdx = 0;
dwNameLen = 512, // reset dwNameLen first
!(lRes = RegEnumValue(hKey,
dwIdx,
szValName,
&dwNameLen,
0,
&dwValType,
NULL,
&dwValSize));
dwIdx++) {
// Enforce null termination
szValName[min(511, dwNameLen)] = 0;
// pass to callback
if (!cb(hKey,
szValName,
dwValSize,
dwValType,
pData)) {
// Callback returned failure, bail out
return FALSE;
}
}
if (lRes != ERROR_NO_MORE_ITEMS) {
// Some enumeration error happened, store it
// and report the failure
SetLastError(lRes);
return FALSE;
}
return TRUE;
}
BOOL
RegStoreMultiString(HKEY hKey,
LPTSTR szValName,
MultiString *msData)
{
LPTSTR szMulti;
DWORD dwMultiSize;
LONG lRes;
HANDLE hHeap = GetProcessHeap();
if (!msData->TotalLength) return FALSE;
// Total size + second NULL terminator
dwMultiSize = (DWORD)msData->TotalLength + 1;
szMulti = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY,
dwMultiSize * sizeof(TCHAR));
if (!szMulti) return FALSE;
// Copy all the strings into one buffer, as per REG_MULTI_SZ
{
DWORD i, dwCurLen;
for (i = 0, dwCurLen = 0;
i < msData->Count && dwCurLen < dwMultiSize;
dwCurLen += (DWORD)_tcslen(msData->Values[i++]) + 1) {
HRESULT hrRes = StringCchCopy(&szMulti[dwCurLen],
_tcslen(msData->Values[i]) + 1,
msData->Values[i]);
if (FAILED(hrRes)) {
HeapFree(hHeap, 0, szMulti);
return FALSE;
}
}
}
lRes = RegSetValueEx(hKey,
szValName,
0,
REG_MULTI_SZ,
szMulti,
dwMultiSize);
HeapFree(hHeap, 0, szMulti);
if (lRes != ERROR_SUCCESS) {
SetLastError(lRes);
return FALSE;
}
return TRUE;
}
// Stores a value in the registry, making assumptions based on the
// key type.
BOOL
RegStoreValue(HKEY hKey,
LPTSTR szValName,
PVOID pData,
DWORD dwValType)
{
DWORD dwStoreSize;
LONG lRes;
if (!hKey || !szValName || !pData) return FALSE;
switch (dwValType) {
case REG_SZ:
case REG_EXPAND_SZ:
dwStoreSize = (DWORD)_tcslen((LPTSTR)pData) + sizeof(TCHAR);
break;
case REG_DWORD:
dwStoreSize = sizeof(DWORD);
break;
#ifdef QWORD
case REG_QWORD:
dwStoreSize = sizeof(QWORD);
break;
#endif
case REG_BINARY:
// TODO: handle REG_BINARY? will we ever use it?
OutputDebugString(_T("REG_BINARY attempted to be stored! Unsupported"));
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
case REG_MULTI_SZ:
return RegStoreMultiString(hKey,
szValName,
(MultiString *)pData);
default:
// ignore
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
lRes = RegSetValueEx(hKey,
szValName,
0,
dwValType,
pData,
dwStoreSize);
if (lRes != ERROR_SUCCESS) {
SetLastError(lRes);
return FALSE;
}
return TRUE;
}

68
CommonCfg/RegHelper.h Normal file
View file

@ -0,0 +1,68 @@
// Helper functions for handling the registry
#pragma once
// Used behind CopyIfMatch. Copies a given registry value to
// another location, regardless of type.
BOOL CopyRegValue(HKEY hKey,
PVOID pVal,
LPCTSTR szName,
DWORD dwType,
DWORD dwSize);
// Callback for RegGetAllValues
typedef BOOL (*RegEnumCallback)(HKEY hKey,
LPTSTR szValName,
DWORD dwValSize,
DWORD dwValType,
PVOID pData);
// Enumerates across all values in a key, running the given
// RegEnumCallback. Use `pData` to pass application-defined
// data to your enumerator callback.
BOOL RegGetAllValues(HKEY hKey,
RegEnumCallback cb,
PVOID pData);
// Wrapper function for storing reg values, regardless of type
BOOL RegStoreValue(HKEY hKey,
LPTSTR szValName,
PVOID pData,
DWORD dwValType);
// Used primarily by RegEnumCallback, hence the hardcoded
// var names.
// You might want to check out one of the Get*Config functions
// for more background on how to use this, but it should make the
// callback function as easy as:
//
// CopyIfMatch(hKey, myStruct,
// myField, REG_SZ) // or any type
// else CopyIfMatch(hKey, myStruct,
// myOtherField, REG_DWORD) // also note: no semicolons
// // ... and so on
#define CopyIfMatch(hk,x,name,type) \
if (!_tcsncmp(_T(#name), \
szValName, \
_tcslen(_T(#name))) \
&& (dwValType & 0xfff) == type) { \
if (!CopyRegValue(hk, \
&((x)->name), \
_T(#name), \
type, \
dwValSize)) { \
return FALSE; \
} \
}
// Helper macro for Save*Config functions. Assumes a BOOL-returning
// function in a vacuum.
#define StoreConfig(hk,x,name,type) \
if (!RegStoreValue(hk, _T(#name), &(x)->name, type)) { \
DWORD dwRegErr = GetLastError(); \
RegCloseKey(hk); \
return FALSE; \
}
#define ROOT_KEYNAME "SOFTWARE\\Grabby"
// Hack to handle REG_SZ values that are actually TCHAR[MAX_PATH].
#define REG_PATH_SZ (0xf000 & REG_SZ)

65
CommonCfg/UploadConfig.c Normal file
View file

@ -0,0 +1,65 @@
#include "stdafx.h"
static BOOL
UploadConfigCb(HKEY hKey,
LPTSTR szValName,
DWORD dwValSize,
DWORD dwValType,
PVOID pData)
{
UploadConfig *ucfg = pData;
if (!ucfg) return FALSE;
CopyIfMatch(hKey, ucfg,
Name, REG_SZ)
else CopyIfMatch(hKey, ucfg,
URL, REG_SZ)
else CopyIfMatch(hKey, ucfg,
Method, REG_SZ)
else CopyIfMatch(hKey, ucfg,
Username, REG_SZ)
else CopyIfMatch(hKey, ucfg,
Password, REG_SZ)
else CopyIfMatch(hKey, ucfg,
HTTPAuthMethod, REG_DWORD)
else CopyIfMatch(hKey, ucfg,
Headers, REG_MULTI_SZ)
else CopyIfMatch(hKey, ucfg,
Parameters, REG_MULTI_SZ)
return TRUE;
}
UploadConfig *
GetUploadConfig(void)
{
HKEY hkUploadKey = NULL;
HANDLE hHeap = GetProcessHeap();
LONG lRes;
UploadConfig *ucfg = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY,
sizeof(UploadConfig));
if (!ucfg) return NULL;
// TODO: defaults?
lRes = RegOpenKeyEx(HKEY_CURRENT_USER,
_T(ROOT_KEYNAME "\\Upload"),
0,
KEY_READ,
&hkUploadKey);
if (lRes) {
SetLastError(lRes);
HeapFree(hHeap, 0, ucfg);
return NULL;
}
if (!RegGetAllValues(hkUploadKey, UploadConfigCb, ucfg)) {
HeapFree(hHeap, 0, ucfg);
return NULL;
}
return ucfg;
}

1
CommonCfg/stdafx.c Normal file
View file

@ -0,0 +1 @@
#include "stdafx.h"

17
CommonCfg/stdafx.h Normal file
View file

@ -0,0 +1,17 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <Windows.h>
#include <tchar.h>
#include <ShlObj.h>
#include <shlwapi.h>
// TODO: reference additional headers your program requires here
#include "RegHelper.h"
#include "Export/Config.h"

View file

@ -1,5 +1,13 @@
Microsoft Visual Studio Solution File, Format Version 8.00 Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Grabby", "Grabby.vcproj", "{700E5DD7-DD00-46D9-92DF-2C132940F53D}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Grabby", "Grabby\Grabby.vcproj", "{700E5DD7-DD00-46D9-92DF-2C132940F53D}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GrbyCfg", "GrbyCfg\GrbyCfg.vcproj", "{BBB3E933-71CC-4EF7-BF56-52371B9AF938}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CommonCfg", "CommonCfg\CommonCfg.vcproj", "{61829180-05C1-4865-B9C3-FEB983AD6997}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
EndProjectSection EndProjectSection
EndProject EndProject
@ -13,6 +21,14 @@ Global
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Debug.Build.0 = Debug|Win32 {700E5DD7-DD00-46D9-92DF-2C132940F53D}.Debug.Build.0 = Debug|Win32
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.ActiveCfg = Release|Win32 {700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.ActiveCfg = Release|Win32
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.Build.0 = Release|Win32 {700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.Build.0 = Release|Win32
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Debug.ActiveCfg = Debug|Win32
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Debug.Build.0 = Debug|Win32
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Release.ActiveCfg = Release|Win32
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Release.Build.0 = Release|Win32
{61829180-05C1-4865-B9C3-FEB983AD6997}.Debug.ActiveCfg = Debug|Win32
{61829180-05C1-4865-B9C3-FEB983AD6997}.Debug.Build.0 = Debug|Win32
{61829180-05C1-4865-B9C3-FEB983AD6997}.Release.ActiveCfg = Release|Win32
{61829180-05C1-4865-B9C3-FEB983AD6997}.Release.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection EndGlobalSection

View file

@ -5,6 +5,7 @@
#include "Bitmap.h" #include "Bitmap.h"
#include "Overlay.h" #include "Overlay.h"
#include "Grabby.h" #include "Grabby.h"
#include <Config.h>
/** /**
* Print an error with a given context before bailing out * Print an error with a given context before bailing out
@ -43,7 +44,7 @@ void Die(LPTSTR lpContextMsg)
_T("Catastrophic Error"), _T("Catastrophic Error"),
MB_OK | MB_ICONERROR); MB_OK | MB_ICONERROR);
} else { } else {
_sntprintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError); StringCchPrintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
MessageBox(NULL, MessageBox(NULL,
lpszFullMsg, lpszFullMsg,
_T("Fatal Error"), _T("Fatal Error"),
@ -62,16 +63,24 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
SYSTEMTIME stNow = {0}; SYSTEMTIME stNow = {0};
RECT capRegion = {0}; RECT capRegion = {0};
Screen *scrn = CreateScreen(); Screen *scrn = CreateScreen();
#define OUTPUT_DIR_LEN 96 Config *cfg;
TCHAR szOutputDir[OUTPUT_DIR_LEN + 1]; TCHAR szFullOutPath[MAX_PATH];
#define FULL_OUT_PATH_LEN OUTPUT_DIR_LEN + 24
TCHAR szFullOutPath[FULL_OUT_PATH_LEN + 1];
HRESULT hRes; HRESULT hRes;
if (!scrn) { if (!scrn) {
Die("Couldn't get screen information"); Die("Couldn't get screen information");
} }
cfg = GetConfig();
if (!cfg) {
Die("Couldn't get config");
}
if (!PathFileExists(cfg->ScreenshotDir) &&
!CreateDirectory(cfg->ScreenshotDir, NULL)) {
Die("Couldn't create configured folder");
}
switch (CreateOverlay(hInstance, scrn)) { switch (CreateOverlay(hInstance, scrn)) {
case -1: case -1:
Die("Couldn't create overlay window"); Die("Couldn't create overlay window");
@ -86,16 +95,12 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
GetChosenRect(&capRegion); GetChosenRect(&capRegion);
if (!GetTempPath(OUTPUT_DIR_LEN, szOutputDir)) {
Die("Couldn't get temporary directory");
}
GetLocalTime(&stNow); GetLocalTime(&stNow);
hRes = StringCchPrintf(szFullOutPath, hRes = StringCchPrintf(szFullOutPath,
FULL_OUT_PATH_LEN, MAX_PATH,
"%s\\scrn_%04d%02d%02d_%02d%02d%02d.bmp", "%s\\Screenshot at %04d-%02d-%02d %02d.%02d.%02d.bmp",
szOutputDir, cfg->ScreenshotDir,
stNow.wYear, stNow.wYear,
stNow.wMonth, stNow.wMonth,
stNow.wDay, stNow.wDay,

View file

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -1,4 +1,4 @@
//Microsoft Visual C++ generated resource script. // Microsoft Visual C++ generated resource script.
// //
#include "resource.h" #include "resource.h"
@ -10,76 +10,25 @@
#define APSTUDIO_HIDDEN_SYMBOLS #define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h" #include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS #undef APSTUDIO_HIDDEN_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Japanese resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE 17, 1 #ifdef _WIN32
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932) #pragma code_page(932)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_GRABBY ICON "Grabby.ico"
IDI_SMALL ICON "small.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDC_GRABBY MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", IDM_EXIT
END
POPUP "&Help"
BEGIN
MENUITEM "&About ...", IDM_ABOUT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDC_GRABBY ACCELERATORS
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
END
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOG 22, 17, 230, 75
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 9, "System"
BEGIN
ICON IDI_GRABBY,IDC_MYICON,14,9,16,16
LTEXT "Grabby Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
LTEXT "Copyright (C) 2024",IDC_STATIC,49,20,119,8
DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP
END
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// TEXTINCLUDE // TEXTINCLUDE
// //
1 TEXTINCLUDE 1 TEXTINCLUDE
BEGIN BEGIN
"resource.h\0" "resource.h\0"
@ -101,18 +50,30 @@ END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
#endif // Japanese resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// String Table // Icon
// //
STRINGTABLE // Icon with lowest ID value placed first to ensure application icon
BEGIN // remains consistent on all systems.
IDC_GRABBY "GRABBY" IDI_GRABBY ICON "Grabby.ico"
IDS_APP_TITLE "Grabby" IDI_SMALL ICON "small.ico"
END IDI_ICON1 ICON "icon1.ico"
#endif // English (U.S.) resources
#endif
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -126,3 +87,4 @@ END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED #endif // not APSTUDIO_INVOKED

View file

@ -19,6 +19,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="D:\Projects\curl\include;..\CommonCfg\Export"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="TRUE" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@ -32,8 +33,10 @@
Name="VCCustomBuildTool"/> Name="VCCustomBuildTool"/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="libcurl_a.lib shlwapi.lib"
OutputFile="$(OutDir)/Grabby.exe" OutputFile="$(OutDir)/Grabby.exe"
LinkIncremental="2" LinkIncremental="2"
AdditionalLibraryDirectories="D:\Projects\curl\lib"
GenerateDebugInformation="TRUE" GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/Grabby.pdb" ProgramDatabaseFile="$(OutDir)/Grabby.pdb"
SubSystem="2" SubSystem="2"
@ -67,18 +70,22 @@
CharacterSet="2"> CharacterSet="2">
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="D:\Projects\curl\include;..\CommonCfg\Export"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="4" RuntimeLibrary="4"
UsePrecompiledHeader="3" UsePrecompiledHeader="3"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="TRUE" Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/> DebugInformationFormat="3"
CompileAs="1"/>
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCCustomBuildTool"/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="libcurl_a.lib shlwapi.lib"
OutputFile="$(OutDir)/Grabby.exe" OutputFile="$(OutDir)/Grabby.exe"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="D:\Projects\curl\lib"
GenerateDebugInformation="TRUE" GenerateDebugInformation="TRUE"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
@ -107,6 +114,9 @@
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
<ProjectReference
ReferencedProjectIdentifier="{61829180-05C1-4865-B9C3-FEB983AD6997}"
Name="CommonCfg"/>
</References> </References>
<Files> <Files>
<Filter <Filter
@ -159,12 +169,15 @@
<File <File
RelativePath=".\Grabby.rc"> RelativePath=".\Grabby.rc">
</File> </File>
<File
RelativePath=".\icon1.ico">
</File>
<File <File
RelativePath=".\small.ico"> RelativePath=".\small.ico">
</File> </File>
</Filter> </Filter>
<File <File
RelativePath=".\ReadMe.txt"> RelativePath="..\ReadMe.txt">
</File> </File>
</Files> </Files>
<Globals> <Globals>

BIN
Grabby/icon1.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

36
Grabby/resource.h Normal file
View file

@ -0,0 +1,36 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Grabby.rc
//
#define IDC_MYICON 2
#define IDD_GRABBY_DIALOG 102
#define IDS_APP_TITLE 103
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDI_GRABBY 107
#define IDI_SMALL 108
#define IDC_GRABBY 109
#define IDR_MAINFRAME 128
#define IDI_ICON1 129
#define IDC_TABVIEW 1000
#define IDC_APPLY 1001
#define IDC_EDIT1 1004
#define IDC_BUTTON1 1005
#define IDC_CHECK1 1006
#define IDC_URLINPUT 1007
#define IDC_ENCODEFILE 1008
#define IDC_COMBO1 1009
#define IDC_UPLOADMETHOD 1009
#define IDC_STATIC -1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 132
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1010
#define _APS_NEXT_SYMED_VALUE 110
#endif
#endif

View file

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -9,6 +9,7 @@
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files: // Windows Header Files:
#include <windows.h> #include <windows.h>
#include <shlwapi.h>
// C RunTime Header Files // C RunTime Header Files
#include <stdlib.h> #include <stdlib.h>
#include <malloc.h> #include <malloc.h>

11
GrbyCfg/Dialog.c Normal file
View file

@ -0,0 +1,11 @@
#define _IS_DIALOG_C_
#include "stdafx.h"
#include "Dialog.h"
void
InitUserMsgs(void)
{
DEFINE_USER_MSG(WMU_SAVE_CONFIG);
DEFINE_USER_MSG(WMU_SETTING_CHANGED);
}

25
GrbyCfg/Dialog.h Normal file
View file

@ -0,0 +1,25 @@
#pragma once
#define _DLG_MSG_SUFFIX "{990f4b34-579a-4fbc-a5b2-08f46ef5e9c5}"
#define USER_MSG_NAME(name) _T( #name _DLG_MSG_SUFFIX )
#define DEFINE_USER_MSG(name) {\
LPCTSTR name##_MSG = USER_MSG_NAME(name); \
name = RegisterWindowMessage(name##_MSG); \
}
#define DECLARE_USER_MSG(name) \
UINT name;
/* --- */
DECLARE_USER_MSG(WMU_SAVE_CONFIG)
DECLARE_USER_MSG(WMU_SETTING_CHANGED)
void InitUserMsgs(void);
#define ChangedSetting(hwnd) \
SendMessage(hwnd, \
WMU_SETTING_CHANGED, \
0, 0)
#define IsChecked(ref) \
(IsDlgButtonChecked(hDlg, ref) == BST_CHECKED)

4
GrbyCfg/General.h Normal file
View file

@ -0,0 +1,4 @@
#pragma once
// Define the dialog proc
DEF_DLGPROC(GeneralTab);

182
GrbyCfg/GeneralCfg.c Normal file
View file

@ -0,0 +1,182 @@
/* General configuration dialog */
#include "stdafx.h"
#include "GrbyCfg.h"
int CALLBACK
ScreenshotBrowseCallback(HWND hWnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED && lpData) {
// Set root dir
SendMessage(hWnd,
BFFM_SETSELECTION,
1,
lpData);
}
return 0;
}
INT_PTR CALLBACK
GeneralTab_DlgProc(HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
static Config *cfg = NULL;
static HWND hStoreDir = NULL,
hCustomShortcut = NULL,
hParentDlg = NULL;
switch (uMsg) {
case WM_INITDIALOG:
hParentDlg = GetParent(hDlg);
cfg = GetConfig();
if (!cfg) {
// TODO: better error management
// (probably SendMessage upstream)
MessageBox(hDlg,
_T("Can't get config! (TODO: error msg)"),
_T("Config Error"),
MB_OK | MB_ICONERROR);
DestroyWindow(hDlg);
}
hStoreDir = GetDlgItem(hDlg, IDC_SCRNDIR);
if (!hStoreDir) {
// TODO: error management x_x
return FALSE;
}
if (strlen(cfg->ScreenshotDir) > 0) {
// Set the screenshot dir, if we have it
SendMessage(hStoreDir,
EM_SETLIMITTEXT,
(WPARAM)MAX_PATH,
0);
SetWindowText(hStoreDir,
cfg->ScreenshotDir);
}
if (cfg->KeepScreenshots) {
// Keep screenshots after upload?
CheckDlgButton(hDlg,
IDC_KEEPIMGS,
BST_CHECKED);
}
if (cfg->HelperStartup) {
// Launch helper on startup?
CheckDlgButton(hDlg,
IDC_LAUNCHHELPER,
BST_CHECKED);
}
hCustomShortcut = GetDlgItem(hDlg,
IDC_CUSTOMKEY);
if (!hCustomShortcut) {
// TODO: error management orz
return FALSE;
}
// Enable the shortcut input if Custom is set
EnableWindow(hCustomShortcut,
(cfg->HelperShortcut == HSC_CUSTOM));
// Also, check the correct radio box. This is hacky and
// expects IDC_RDMAC/WIN/CUSTOM is not changed, so uhhhh
// please don't change that assumption? ^_^;;
CheckDlgButton(hDlg,
IDC_RDMAC + min(2, cfg->HelperShortcut),
BST_CHECKED);
break;
case WM_NOTIFY:
// TODO
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_LAUNCHHELPER:
cfg->HelperStartup =
(IsDlgButtonChecked(hDlg, IDC_LAUNCHHELPER) == BST_CHECKED);
ChangedSetting(hParentDlg);
break;
case IDC_KEEPIMGS:
cfg->KeepScreenshots =
(IsDlgButtonChecked(hDlg, IDC_KEEPIMGS) == BST_CHECKED);
ChangedSetting(hParentDlg);
break;
case IDC_RDMAC:
case IDC_RDWIN:
case IDC_RDCUSTOM:
// Generates the correct enum val a la GetConfig.
cfg->HelperShortcut = IsChecked(IDC_RDMAC) ? HSC_MACOS :
(IsChecked(IDC_RDWIN) ? HSC_WIN10 : HSC_CUSTOM);
// Enable/Disable the Custom Shortcut control as needed
EnableWindow(hCustomShortcut,
(cfg->HelperShortcut == HSC_CUSTOM));
ChangedSetting(hParentDlg);
break;
case IDC_SCRDIRBROWSE: {
LPITEMIDLIST lPidl;
BROWSEINFO bi = {0};
bi.hwndOwner = hDlg;
bi.lParam = (LPARAM)cfg->ScreenshotDir;
bi.lpfn = ScreenshotBrowseCallback;
bi.lpszTitle = _T("Select Screenshot Folder");
lPidl = SHBrowseForFolder(&bi);
if (lPidl == NULL) {
// Cancelled
break;
}
SHGetPathFromIDList(lPidl,
cfg->ScreenshotDir);
// We don't need the PIDL anymore, so free it
{
LPMALLOC pMalloc;
if (SHGetMalloc(&pMalloc) == NOERROR) {
IMalloc_Free(pMalloc, lPidl);
IMalloc_Release(pMalloc);
}
}
// Update the edit control
SetWindowText(hStoreDir,
cfg->ScreenshotDir);
ChangedSetting(hParentDlg);
}
break;
default:
return FALSE;
}
break;
default:
// User-defined messages
if (uMsg == WMU_SAVE_CONFIG) {
GetWindowText(hStoreDir,
cfg->ScreenshotDir,
MAX_PATH - 1);
if (!SaveConfig(cfg)) {
// TODO: error management
OutputDebugString(_T("no save x_x"));
}
} else {
// Not a message we care about
return FALSE;
}
}
return TRUE;
}

272
GrbyCfg/GrbyCfg.c Normal file
View file

@ -0,0 +1,272 @@
#include "stdafx.h"
#include "GrbyCfg.h"
#define MAX_LOADSTRING 100
#include <stdio.h>
INT_PTR CALLBACK ConfigDlgProc(HWND, UINT, WPARAM, LPARAM);
/**
* Print an error with a given context before bailing out
*/
void Die(LPTSTR lpContextMsg)
{
LPCTSTR lpszFmt = "%s: %s";
int iFullLen;
LPTSTR lpszError = NULL,
lpszFullMsg = NULL;
// The whole point of this is to print an actual message, so get the
// actual message
if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0,
(LPTSTR) &lpszError,
0,
NULL))
{
if (lpszError != NULL) LocalFree(lpszError);
lpszError = _T("unknown error");
}
// Create our WMU_* messages
InitUserMsgs();
iFullLen = _sctprintf(lpszFmt, lpContextMsg, lpszError);
lpszFullMsg = (LPTSTR) LocalAlloc(LPTR, sizeof(TCHAR) * (iFullLen + 1));
if (lpszFullMsg == NULL) {
// I'm honestly gonna guess if we get here, we're out of memory.
// So let's print what we have and bail
MessageBox(NULL,
lpContextMsg,
_T("Catastrophic Error"),
MB_OK | MB_ICONERROR);
} else {
_sntprintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
MessageBox(NULL,
lpszFullMsg,
_T("Fatal Error"),
MB_OK | MB_ICONERROR);
}
ExitProcess(1);
}
HINSTANCE g_hInstance = NULL;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
BOOL bRet;
MSG msg;
HWND hDlg;
INITCOMMONCONTROLSEX lpInitCtrls = {0};
HRESULT hrRet;
g_hInstance = hInstance;
// Required for tab control
lpInitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX);
lpInitCtrls.dwICC = ICC_WIN95_CLASSES;
if (!InitCommonControlsEx(&lpInitCtrls)) {
MessageBox(NULL,
_T("Couldn't initialize comctl32! Not sure why..."),
_T("Ooh, rare bug!"),
MB_OK | MB_ICONERROR);
return 1;
}
// Required for folder browse dialog
hrRet = CoInitializeEx(NULL,
COINIT_APARTMENTTHREADED);
if (hrRet != S_OK) {
MessageBox(NULL,
_T("Couldn't initialize COM!?"),
_T("dot com bust u_u"),
MB_OK | MB_ICONERROR);
return 1;
}
hDlg = CreateDialog(hInstance,
MAKEINTRESOURCE(IDD_CONFIGDIALOG),
NULL,
ConfigDlgProc);
if (!hDlg) {
Die("CreateDialog failed");
}
ShowWindow(hDlg, nCmdShow);
while ((bRet = GetMessage(&msg, hDlg, 0, 0)) != FALSE) {
if (bRet == -1) {
// TODO: error handling
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
// Helper macro to create a new text (i.e., no icon) tab for config
// items.
//
// NOTE: This is written to use <name>Tab_DlgProc for dlgProc. This
// assumes that tabs will always be valid (enough) for a function
// identifier.
#define NEW_TEXTTAB(name, res) {{ \
TCIF_TEXT, \
0, 0, \
_T(#name), \
sizeof(_T(#name)) / sizeof(TCHAR), \
0, 0 \
}, \
res, \
name##Tab_DlgProc, \
NULL \
}
INT_PTR CALLBACK
ConfigDlgProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// Define the tab metadata
static struct {
TCITEM tciTab;
int child;
DLGPROC dlgProc;
HWND hWnd;
} tabs[] = {
NEW_TEXTTAB(General,
IDD_GENCONFIG),
NEW_TEXTTAB(Upload,
IDD_UPLOADCONFIG)
};
BOOL bClose = FALSE;
const int tabCount = (sizeof(tabs) / sizeof(tabs[0]));
switch (uMsg) {
case WM_INITDIALOG: {
RECT rcTab;
int i;
HWND hTabCtrl = GetDlgItem(hWnd, IDC_TABVIEW);
if (!hTabCtrl) {
Die("Couldn't get tab control");
}
for (i = 0; i < tabCount; i++) {
int iResult = TabCtrl_InsertItem(
hTabCtrl,
i,
&tabs[i].tciTab);
if (iResult == -1) {
Die("Couldn't create tabs");
}
// Attach the child dialog
tabs[i].hWnd = CreateDialog(g_hInstance,
MAKEINTRESOURCE(tabs[i].child),
hWnd,
tabs[i].dlgProc);
if (!tabs[i].hWnd) {
Die("Couldn't create child tab");
}
}
// This has to happen after the tabs are inserted,
// or else we get the wrong client area (tabs don't
// exist yet!)
GetWindowRect(hTabCtrl, &rcTab);
MapWindowPoints(NULL, hWnd, (LPPOINT)&rcTab, 2);
TabCtrl_AdjustRect(hTabCtrl, FALSE, &rcTab);
for (i = 0; i < tabCount; i++) {
SetWindowPos(tabs[i].hWnd,
HWND_TOP,
rcTab.left,
rcTab.top,
rcTab.right - rcTab.left,
rcTab.bottom - rcTab.top,
(i == 0) ? SWP_SHOWWINDOW : 0);
}
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCANCEL:
DestroyWindow(hWnd);
break;
case IDOK:
bClose = TRUE;
/* PASSTHRU */
case IDC_APPLY: {
int i;
for (i = 0; i < tabCount; i++) {
SendMessage(tabs[i].hWnd,
WMU_SAVE_CONFIG,
0, 0);
}
EnableWindow(GetDlgItem(hWnd, IDC_APPLY), FALSE);
// Handle OK button (Apply + Close)
if (bClose) SendMessage(hWnd,
WM_CLOSE,
0,
0);
}
break;
default:
// TODO: other buttons
break;
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
if (pnmh->code == TCN_SELCHANGE) {
int idx = TabCtrl_GetCurSel(pnmh->hwndFrom);
if (idx < tabCount) {
int i;
for (i = 0; i < tabCount; i++) {
if (tabs[i].hWnd) {
// If it's the child we want, show it.
// If not, hide it.
ShowWindow(tabs[i].hWnd,
(i == idx) ? SW_SHOW : SW_HIDE);
}
}
}
// If idx >= tabCount, ignore the message
}
}
break;
default:
// User-defined messages
if (uMsg == WMU_SETTING_CHANGED) {
EnableWindow(GetDlgItem(hWnd, IDC_APPLY), TRUE);
} else {
// Not our message, ignore
return FALSE;
}
}
return TRUE;
}

16
GrbyCfg/GrbyCfg.h Normal file
View file

@ -0,0 +1,16 @@
#pragma once
#include "resource.h"
// Define the config tabs
INT_PTR CALLBACK
GeneralTab_DlgProc(HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
INT_PTR CALLBACK
UploadTab_DlgProc(HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);

BIN
GrbyCfg/GrbyCfg.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

270
GrbyCfg/GrbyCfg.rc Normal file
View file

@ -0,0 +1,270 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Japanese resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
#ifdef _WIN32
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_GRBYCFG ICON "GrbyCfg.ico"
IDI_SMALL ICON "small.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDC_GRBYCFG MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", IDM_EXIT
END
POPUP "&Help"
BEGIN
MENUITEM "&About ...", IDM_ABOUT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDC_GRBYCFG ACCELERATORS
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
END
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_APP_TITLE "GrbyCfg"
IDC_GRBYCFG "GRBYCFG"
END
#endif // Japanese resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_GENCONFIG DIALOGEX 0, 0, 210, 206
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_BORDER
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "Screenshot Folder",IDC_STATIC,7,7,196,52,WS_GROUP
EDITTEXT IDC_SCRNDIR,13,19,184,14,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",IDC_SCRDIRBROWSE,147,39,50,14
CONTROL "Keep screenshots after upload",IDC_KEEPIMGS,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,39,114,14
GROUPBOX "Launch Helper",IDC_STATIC,7,65,196,57
LTEXT "Grabby is intended to be launched via a keyboard shortcut using a separate helper program. A basic helper is bundled.",
IDC_STATIC,13,77,184,25
CONTROL "Launch Helper on Startup",IDC_LAUNCHHELPER,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,13,106,184,10
GROUPBOX "Keyboard Shortcut",IDC_STATIC,7,128,196,71
LTEXT "When the Launch Helper is running, take a screenshot with:",
IDC_STATIC,13,140,184,16
CONTROL "Win+Shift+4 (Mac)",IDC_RDMAC,"Button",
BS_AUTORADIOBUTTON | WS_GROUP,13,163,77,10
CONTROL "Win+Shift+S (Win10)",IDC_RDWIN,"Button",
BS_AUTORADIOBUTTON,96,163,101,10
CONTROL "Custom",IDC_RDCUSTOM,"Button",BS_AUTORADIOBUTTON,13,175,
77,14
EDITTEXT IDC_CUSTOMKEY,96,175,101,14,ES_AUTOHSCROLL | WS_GROUP
END
IDD_UPLOADCONFIG DIALOGEX 0, 0, 210, 154
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_BORDER
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "Uploader",IDC_STATIC,7,7,196,88
LTEXT "Enter the URL to use. Use ""%f"" to represent the filename, if it should be included in the URL.",
IDC_STATIC,11,19,186,17
EDITTEXT IDC_URLINPUT,13,43,184,12,ES_AUTOHSCROLL
CONTROL "Encode filename in URL (for query parameters)",
IDC_ENCODEFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,
61,166,10
LTEXT "HTTP method to use:",IDC_STATIC,13,77,68,12,
SS_CENTERIMAGE
COMBOBOX IDC_UPLOADMETHOD,87,77,110,30,CBS_DROPDOWNLIST |
CBS_SORT | CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Authentication",IDC_STATIC,7,101,196,40
END
IDD_CONFIGDIALOG DIALOGEX 0, 0, 234, 254
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Options"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,65,233,50,14
PUSHBUTTON "Cancel",IDCANCEL,121,233,50,14
CONTROL "",IDC_TABVIEW,"SysTabControl32",0x0,7,7,220,220
PUSHBUTTON "Apply",IDC_APPLY,177,233,50,14,WS_DISABLED
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_GENCONFIG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 203
VERTGUIDE, 13
VERTGUIDE, 90
VERTGUIDE, 96
VERTGUIDE, 197
TOPMARGIN, 7
BOTTOMMARGIN, 199
HORZGUIDE, 19
HORZGUIDE, 33
HORZGUIDE, 39
HORZGUIDE, 53
HORZGUIDE, 59
HORZGUIDE, 65
HORZGUIDE, 77
HORZGUIDE, 102
HORZGUIDE, 106
HORZGUIDE, 122
HORZGUIDE, 128
HORZGUIDE, 140
HORZGUIDE, 156
HORZGUIDE, 163
HORZGUIDE, 173
HORZGUIDE, 193
HORZGUIDE, 199
END
IDD_UPLOADCONFIG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 203
VERTGUIDE, 13
VERTGUIDE, 81
VERTGUIDE, 87
VERTGUIDE, 197
TOPMARGIN, 7
BOTTOMMARGIN, 147
HORZGUIDE, 19
HORZGUIDE, 36
HORZGUIDE, 43
HORZGUIDE, 61
HORZGUIDE, 71
HORZGUIDE, 77
HORZGUIDE, 89
HORZGUIDE, 95
HORZGUIDE, 101
END
IDD_CONFIGDIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 227
VERTGUIDE, 115
VERTGUIDE, 121
VERTGUIDE, 171
VERTGUIDE, 177
TOPMARGIN, 7
BOTTOMMARGIN, 247
HORZGUIDE, 227
HORZGUIDE, 233
END
END
#endif // APSTUDIO_INVOKED
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

188
GrbyCfg/GrbyCfg.vcproj Normal file
View file

@ -0,0 +1,188 @@
<?xml version="1.0" encoding="shift_jis"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="GrbyCfg"
ProjectGUID="{BBB3E933-71CC-4EF7-BF56-52371B9AF938}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CommonCfg\Export"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"
CompileAs="1"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib ole32.lib shell32.lib shlwapi.lib"
OutputFile="$(OutDir)/GrbyCfg.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/GrbyCfg.pdb"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;_WINDOWS"
RuntimeLibrary="4"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"
CompileAs="1"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib ole32.lib shell32.lib shlwapi.lib"
OutputFile="$(OutDir)/GrbyCfg.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
<ProjectReference
ReferencedProjectIdentifier="{61829180-05C1-4865-B9C3-FEB983AD6997}"
Name="CommonCfg"/>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\Dialog.c">
</File>
<File
RelativePath=".\GeneralCfg.c">
</File>
<File
RelativePath=".\GrbyCfg.c">
</File>
<File
RelativePath=".\stdafx.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\UploadCfg.c">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\Dialog.h">
</File>
<File
RelativePath=".\GrbyCfg.h">
</File>
<File
RelativePath=".\Resource.h">
</File>
<File
RelativePath=".\stdafx.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
<File
RelativePath=".\GrbyCfg.ico">
</File>
<File
RelativePath=".\GrbyCfg.rc">
</File>
<File
RelativePath=".\small.ico">
</File>
</Filter>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

53
GrbyCfg/ReadMe.txt Normal file
View file

@ -0,0 +1,53 @@
========================================================================
WIN32 APPLICATION : GrbyCfg Project Overview
========================================================================
AppWizard has created this GrbyCfg application for you.
This file contains a summary of what you will find in each of the files that
make up your GrbyCfg application.
GrbyCfg.vcproj
This is the main project file for VC++ projects generated using an Application Wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
Application Wizard.
GrbyCfg.cpp
This is the main application source file.
/////////////////////////////////////////////////////////////////////////////
AppWizard has created the following resources:
GrbyCfg.rc
This is a listing of all of the Microsoft Windows resources that the
program uses. It includes the icons, bitmaps, and cursors that are stored
in the RES subdirectory. This file can be directly edited in Microsoft
Visual C++.
Resource.h
This is the standard header file, which defines new resource IDs.
Microsoft Visual C++ reads and updates this file.
GrbyCfg.ico
This is an icon file, which is used as the application's icon (32x32).
This icon is included by the main resource file GrbyCfg.rc.
small.ico
This is an icon file, which contains a smaller version (16x16)
of the application's icon. This icon is included by the main resource
file GrbyCfg.rc.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named GrbyCfg.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" comments to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////

11
GrbyCfg/UploadCfg.c Normal file
View file

@ -0,0 +1,11 @@
#include "stdafx.h"
INT_PTR CALLBACK
UploadTab_DlgProc(HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// TODO: anything
return FALSE;
}

0
GrbyCfg/Uploader.h Normal file
View file

42
GrbyCfg/resource.h Normal file
View file

@ -0,0 +1,42 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by GrbyCfg.rc
//
#define IDC_MYICON 2
#define IDD_CONFIGDIALOG 9
#define IDD_GRBYCFG_DIALOG 102
#define IDS_APP_TITLE 103
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDD_GENCONFIG 106
#define IDI_GRBYCFG 107
#define IDI_SMALL 108
#define IDC_GRBYCFG 109
#define IDR_MAINFRAME 128
#define IDD_UPLOADCONFIG 130
#define IDC_TABVIEW 1000
#define IDC_APPLY 1001
#define IDC_SCRNDIR 1004
#define IDC_SCRDIRBROWSE 1005
#define IDC_KEEPIMGS 1006
#define IDC_URLINPUT 1007
#define IDC_LAUNCHHELPER 1007
#define IDC_ENCODEFILE 1008
#define IDC_RDMAC 1008
#define IDC_UPLOADMETHOD 1009
#define IDC_RDWIN 1009
#define IDC_RDCUSTOM 1010
#define IDC_CUSTOMKEY 1011
#define IDC_STATIC -1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1012
#define _APS_NEXT_SYMED_VALUE 110
#endif
#endif

BIN
GrbyCfg/small.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

8
GrbyCfg/stdafx.c Normal file
View file

@ -0,0 +1,8 @@
// stdafx.cpp : source file that includes just the standard includes
// GrbyCfg.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

26
GrbyCfg/stdafx.h Normal file
View file

@ -0,0 +1,26 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#define _WIN32_DCOM
#define COBJMACROS
#define CINTERFACE
#include <ShlObj.h>
#include <ObjBase.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <Config.h>
#include "Dialog.h"
#include "resource.h"

View file

@ -1,29 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Grabby.rc
//
#define IDS_APP_TITLE 103
#define IDR_MAINFRAME 128
#define IDD_GRABBY_DIALOG 102
#define IDD_ABOUTBOX 103
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDI_GRABBY 107
#define IDI_SMALL 108
#define IDC_GRABBY 109
#define IDC_MYICON 2
#define IDC_STATIC -1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 130
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 110
#endif
#endif