summaryrefslogtreecommitdiffstats
path: root/tools/channel_changer
diff options
context:
space:
mode:
Diffstat (limited to 'tools/channel_changer')
-rw-r--r--tools/channel_changer/channel_changer.cc245
-rw-r--r--tools/channel_changer/channel_changer.icobin0 -> 34494 bytes
-rw-r--r--tools/channel_changer/channel_changer.rc124
-rw-r--r--tools/channel_changer/channel_changer.sln20
-rw-r--r--tools/channel_changer/channel_changer.vcproj237
-rw-r--r--tools/channel_changer/glasses.bmpbin0 -> 7958 bytes
-rw-r--r--tools/channel_changer/resource.h24
7 files changed, 650 insertions, 0 deletions
diff --git a/tools/channel_changer/channel_changer.cc b/tools/channel_changer/channel_changer.cc
new file mode 100644
index 0000000..89f1e37a
--- /dev/null
+++ b/tools/channel_changer/channel_changer.cc
@@ -0,0 +1,245 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <Windowsx.h>
+
+#include "base/registry.h"
+
+#include "Resource.h"
+
+// This enum needs to be in sync with the strings below.
+enum Branch {
+ UNKNOWN_BRANCH = 0,
+ DEV_BRANCH,
+ BETA_BRANCH,
+};
+
+// This vector of strings needs to be in sync with the Branch enum above.
+static const wchar_t* const kBranchStrings[] = {
+ L"",
+ L"1.1-dev",
+ L"1.1-beta"
+};
+
+// This vector of strings needs to be in sync with the Branch enum above.
+static const wchar_t* const kBranchStringsReadable[] = {
+ L"",
+ L"Dev",
+ L"Beta"
+};
+
+// The root key for Google Update.
+static const HKEY kGoogleUpdateRoot = HKEY_CURRENT_USER;
+
+// The Google Update key to read to find out which branch you are on.
+static const wchar_t* const kGoogleUpdateKey =
+ L"Software\\Google\\Update\\ClientState\\"
+ L"{8A69D345-D564-463C-AFF1-A69D9E530F96}";
+
+// The Google Update value that defines which branch you are on.
+static const wchar_t* const kBranchKey = L"ap";
+
+// The suffix Google Update sometimes adds to the channel name (channel names
+// are defined in kBranchStrings), indicating that a full install is needed. We
+// strip this out (if present) for the purpose of determining which channel you
+// are on.
+static const wchar_t* const kChannelSuffix = L"-full";
+
+// The icon to use.
+static HICON dlg_icon = NULL;
+
+void SetMainLabel(HWND dialog, Branch branch) {
+ std::wstring main_label = L"You are currently on ";
+ if (branch == DEV_BRANCH || branch == BETA_BRANCH)
+ main_label += std::wstring(L"the ") + kBranchStringsReadable[branch] +
+ std::wstring(L" channel");
+ else
+ main_label += L"NO UPDATE CHANNEL";
+
+ main_label += L". Choose a different channel and click Update, "
+ L"or click Close to stay on this channel.";
+
+ SetWindowText(GetDlgItem(dialog, IDC_LABEL_MAIN), main_label.c_str());
+}
+
+void OnInitDialog(HWND dialog) {
+ SendMessage(dialog, WM_SETICON, (WPARAM) false, (LPARAM) dlg_icon);
+
+ std::wstring branch_string;
+ RegKey google_update(kGoogleUpdateRoot, kGoogleUpdateKey, KEY_READ);
+ if (google_update.Valid() &&
+ !google_update.ReadValue(kBranchKey, &branch_string)) {
+ // If the 'ap' value is missing, we create it, unless the key is missing.
+ RegKey write_default(kGoogleUpdateRoot, kGoogleUpdateKey, KEY_WRITE);
+ branch_string = kBranchStrings[BETA_BRANCH];
+ if (!write_default.WriteValue(kBranchKey, branch_string.c_str()))
+ branch_string = L""; // Error, show disabled UI.
+ }
+
+ // We look for '1.1-beta' or '1.1-dev', but Google Update might have added
+ // '-full' to the channel name, which we need to strip out to determine what
+ // channel you are on.
+ std::wstring suffix = kChannelSuffix;
+ if (branch_string.length() > suffix.length()) {
+ size_t index = branch_string.rfind(suffix);
+ if (index != std::wstring::npos &&
+ index == branch_string.length() - suffix.length()) {
+ branch_string = branch_string.substr(0, index);
+ }
+ }
+
+ Branch branch = UNKNOWN_BRANCH;
+ if (branch_string == kBranchStrings[DEV_BRANCH]) {
+ branch = DEV_BRANCH;
+ } else if (branch_string == kBranchStrings[BETA_BRANCH]) {
+ branch = BETA_BRANCH;
+ } else {
+ // Hide the controls we can't use.
+ EnableWindow(GetDlgItem(dialog, IDOK), false);
+ EnableWindow(GetDlgItem(dialog, IDC_STABLE), false);
+ EnableWindow(GetDlgItem(dialog, IDC_CUTTING_EDGE), false);
+
+ MessageBox(dialog, L"KEY NOT FOUND\n\nChrome is not installed, or is not "
+ L"using GoogleUpdate for updates.",
+ L"Chrome Channel Changer",
+ MB_ICONEXCLAMATION | MB_OK);
+ }
+
+ SetMainLabel(dialog, branch);
+
+ CheckDlgButton(dialog, IDC_STABLE,
+ branch == BETA_BRANCH ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(dialog, IDC_CUTTING_EDGE,
+ branch == DEV_BRANCH ? BST_CHECKED : BST_UNCHECKED);
+}
+
+INT_PTR OnCtlColorStatic(HWND dialog, WPARAM wparam, LPARAM lparam) {
+ HDC hdc = reinterpret_cast<HDC>(wparam);
+ HWND control_wnd = reinterpret_cast<HWND>(lparam);
+
+ if (GetDlgItem(dialog, IDC_STABLE) == control_wnd ||
+ GetDlgItem(dialog, IDC_CUTTING_EDGE) == control_wnd ||
+ GetDlgItem(dialog, IDC_LABEL_MAIN) == control_wnd ||
+ GetDlgItem(dialog, IDC_SECONDARY_LABEL) == control_wnd) {
+ SetBkMode(hdc, TRANSPARENT);
+ SetTextColor(hdc, RGB(0, 0, 0));
+ return reinterpret_cast<INT_PTR>(GetSysColorBrush(COLOR_WINDOW));
+ }
+
+ return static_cast<INT_PTR>(FALSE);
+}
+
+void SaveChanges(HWND dialog) {
+ Branch branch = UNKNOWN_BRANCH;
+ if (IsDlgButtonChecked(dialog, IDC_STABLE))
+ branch = BETA_BRANCH;
+ else if (IsDlgButtonChecked(dialog, IDC_CUTTING_EDGE))
+ branch = DEV_BRANCH;
+
+ if (branch != UNKNOWN_BRANCH) {
+ RegKey google_update(kGoogleUpdateRoot, kGoogleUpdateKey, KEY_WRITE);
+ if (!google_update.WriteValue(kBranchKey, kBranchStrings[branch])) {
+ MessageBox(dialog, L"Unable to change value, please make sure you\n"
+ L"have permission to change registry keys under HKLM",
+ L"Unable to update branch info", MB_OK);
+ } else {
+ std::wstring save_msg = L"Your changes have been saved.\nYou are now "
+ L"on the " +
+ std::wstring(kBranchStringsReadable[branch]) +
+ L" branch.";
+ MessageBox(dialog, save_msg.c_str(), L"Changes were saved", MB_OK);
+
+ SetMainLabel(dialog, branch);
+ }
+ }
+}
+
+INT_PTR CALLBACK DialogWndProc(HWND dialog,
+ UINT message_id,
+ WPARAM wparam,
+ LPARAM lparam) {
+ UNREFERENCED_PARAMETER(lparam);
+
+ switch (message_id) {
+ case WM_INITDIALOG:
+ OnInitDialog(dialog);
+ return static_cast<INT_PTR>(TRUE);
+ case WM_CTLCOLORSTATIC:
+ return OnCtlColorStatic(dialog, wparam, lparam);
+ case WM_COMMAND:
+ // If the user presses the OK button.
+ if (LOWORD(wparam) == IDOK) {
+ SaveChanges(dialog);
+ return static_cast<INT_PTR>(TRUE);
+ }
+ // If the user presses the Cancel button.
+ if (LOWORD(wparam) == IDCANCEL) {
+ ::EndDialog(dialog, LOWORD(wparam));
+ return static_cast<INT_PTR>(TRUE);
+ }
+ break;
+ case WM_ERASEBKGND:
+ PAINTSTRUCT paint;
+ HDC hdc = BeginPaint(dialog, &paint);
+ if (!hdc)
+ return static_cast<INT_PTR>(FALSE); // We didn't handle it.
+
+ // Fill the background with White.
+ HBRUSH brush = GetStockBrush(WHITE_BRUSH);
+ HGDIOBJ old_brush = SelectObject(hdc, brush);
+ RECT rc;
+ GetClientRect(dialog, &rc);
+ FillRect(hdc, &rc, brush);
+
+ // Clean up.
+ SelectObject(hdc, old_brush);
+ EndPaint(dialog, &paint);
+ return static_cast<INT_PTR>(TRUE);
+ }
+
+ return static_cast<INT_PTR>(FALSE);
+}
+
+int APIENTRY _tWinMain(HINSTANCE instance,
+ HINSTANCE previous_instance,
+ LPTSTR cmd_line,
+ int cmd_show) {
+ UNREFERENCED_PARAMETER(previous_instance);
+ UNREFERENCED_PARAMETER(cmd_line);
+ UNREFERENCED_PARAMETER(cmd_show);
+
+ dlg_icon = ::LoadIcon(instance, MAKEINTRESOURCE(IDI_BRANCH_SWITCHER));
+
+ ::DialogBox(instance,
+ MAKEINTRESOURCE(IDD_MAIN_DIALOG),
+ GetDesktopWindow(),
+ DialogWndProc);
+
+ return TRUE;
+}
diff --git a/tools/channel_changer/channel_changer.ico b/tools/channel_changer/channel_changer.ico
new file mode 100644
index 0000000..401329f
--- /dev/null
+++ b/tools/channel_changer/channel_changer.ico
Binary files differ
diff --git a/tools/channel_changer/channel_changer.rc b/tools/channel_changer/channel_changer.rc
new file mode 100644
index 0000000..ba89a09
--- /dev/null
+++ b/tools/channel_changer/channel_changer.rc
@@ -0,0 +1,124 @@
+// 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
+
+/////////////////////////////////////////////////////////////////////////////
+// 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
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_BRANCH_SWITCHER ICON "channel_changer.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_MAIN_DIALOG DIALOGEX 0, 0, 419, 147
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Chrome Channel Switcher v1.1"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "Update",IDOK,156,127,50,14
+ PUSHBUTTON "Close",IDCANCEL,212,127,50,14
+ LTEXT "This label will be populated programmatically.",IDC_LABEL_MAIN,47,13,322,18
+ CONTROL "Beta: More stable releases, less frequently. You won't get bug fixes and new features as quickly, but what you get will have had more testing.",IDC_STABLE,
+ "Button",BS_AUTORADIOBUTTON | BS_MULTILINE,47,39,340,19
+ CONTROL "Dev: Get the latest features and bugfixes every week. You'll be helping us improve, iterate, and make Chrome great faster. We need Dev users, and we'll give your feedback and issues higher priority.",IDC_CUTTING_EDGE,
+ "Button",BS_AUTORADIOBUTTON | BS_MULTILINE,47,63,355,21
+ CONTROL 129,IDC_IMAGEVIEW,"Static",SS_BITMAP,7,7,35,23
+ LTEXT "Note: If you switch from Dev to Beta, you'll stay on the current Chrome version until the Beta channel gets a later update. Changing channels does not change the version of Chrome you are currently using.",IDC_SECONDARY_LABEL,47,97,340,21
+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
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_MAIN_DIALOG, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 412
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 140
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDB_PICTURE BITMAP "glasses.bmp"
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/tools/channel_changer/channel_changer.sln b/tools/channel_changer/channel_changer.sln
new file mode 100644
index 0000000..48eb35b
--- /dev/null
+++ b/tools/channel_changer/channel_changer.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "channel_changer", "channel_changer.vcproj", "{93D9CC27-A861-4430-A08B-AEB2FC223D78}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {93D9CC27-A861-4430-A08B-AEB2FC223D78}.Debug|Win32.ActiveCfg = Debug|Win32
+ {93D9CC27-A861-4430-A08B-AEB2FC223D78}.Debug|Win32.Build.0 = Debug|Win32
+ {93D9CC27-A861-4430-A08B-AEB2FC223D78}.Release|Win32.ActiveCfg = Release|Win32
+ {93D9CC27-A861-4430-A08B-AEB2FC223D78}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/tools/channel_changer/channel_changer.vcproj b/tools/channel_changer/channel_changer.vcproj
new file mode 100644
index 0000000..743dc5b
--- /dev/null
+++ b/tools/channel_changer/channel_changer.vcproj
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="channel_changer"
+ ProjectGUID="{93D9CC27-A861-4430-A08B-AEB2FC223D78}"
+ RootNamespace="channel_changer"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfATL="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../.."
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfATL="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../.."
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\channel_changer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\base\registry.cc"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\base\registry.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Resource.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\channel_changer.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\channel_changer.rc"
+ >
+ </File>
+ <File
+ RelativePath=".\glasses.bmp"
+ >
+ </File>
+ <File
+ RelativePath=".\switcher_icon.bmp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/channel_changer/glasses.bmp b/tools/channel_changer/glasses.bmp
new file mode 100644
index 0000000..ee80550
--- /dev/null
+++ b/tools/channel_changer/glasses.bmp
Binary files differ
diff --git a/tools/channel_changer/resource.h b/tools/channel_changer/resource.h
new file mode 100644
index 0000000..8da97a8
--- /dev/null
+++ b/tools/channel_changer/resource.h
@@ -0,0 +1,24 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by channel_changer.rc
+//
+#define IDI_BRANCH_SWITCHER 101
+#define IDD_MAIN_DIALOG 128
+#define IDB_PICTURE 129
+#define IDC_IMAGEVIEW 130
+#define IDC_LABEL_MAIN 1000
+#define IDC_STABLE 1001
+#define IDC_CUTTING_EDGE 1002
+#define IDC_SECONDARY_LABEL 1003
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC 1
+#define _APS_NEXT_RESOURCE_VALUE 131
+#define _APS_NEXT_COMMAND_VALUE 32771
+#define _APS_NEXT_CONTROL_VALUE 1004
+#define _APS_NEXT_SYMED_VALUE 102
+#endif
+#endif