#include <precomp.h>#include "resource.h"#include <locale.h>#include <io.h>#include <fcntl.h>#include "dialogs/settings.h"#include "services/shellservices.h"
Go to the source code of this file.
Classes | |
| struct | ExplorerAboutDlg |
| "About Explorer" Dialog More... | |
Functions | |
| int | initialize_gdb_stub () |
| void | _log_ (LPCTSTR txt) |
| HBITMAP | create_bitmap_from_icon (HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) |
| create a bitmap from an icon | |
| HBITMAP | create_small_bitmap_from_icon (HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) |
| int | ImageList_AddAlphaIcon (HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) |
| add icon with alpha channel to imagelist using the specified background color | |
| void | SetWindowIcon (HWND hwnd, UINT nid) |
| set big and small icons out of the resources for a window | |
| void | explorer_show_frame (int cmdShow, LPTSTR lpCmdLine) |
| void | explorer_about (HWND hwndParent) |
| int | explorer_main (HINSTANCE hInstance, LPTSTR lpCmdLine, int cmdShow) |
| int WINAPI | _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) |
Variables | |
| DynamicLoadLibFct< void(__stdcall *)(BOOL)> | g_SHDOCVW_ShellDDEInit (TEXT("SHDOCVW"), 118) |
| ExplorerGlobals | g_Globals |
| void _log_ | ( | LPCTSTR | txt ) |
Definition at line 143 of file explorer.cpp.
References ExplorerGlobals::_log, and TEXT.
| int WINAPI _tWinMain | ( | HINSTANCE | hInstance, |
| HINSTANCE | hPrevInstance, | ||
| LPTSTR | lpCmdLine, | ||
| int | nShowCmd | ||
| ) |
TODO launching autostart programs can be moved into a background thread.
Definition at line 1029 of file explorer.cpp.
References ExplorerGlobals::_desktop_mode, ExplorerGlobals::_desktops, ExplorerGlobals::_hwndDesktop, ExplorerGlobals::_log, _tcsstr, CONTEXT, COUNTOF, DesktopWindow::Create(), explorer_main(), g_SHDOCVW_ShellDDEInit, HWND, Desktops::init(), ExplorerGlobals::init(), initialize_gdb_stub(), IsAnyDesktopRunning(), LOG, ExplorerGlobals::read_persistent(), Thread::Start(), Thread::Stop(), TEXT, and ExplorerGlobals::write_persistent().
{
CONTEXT("WinMain()");
BOOL any_desktop_running = IsAnyDesktopRunning();
BOOL startup_desktop;
// strip extended options from the front of the command line
String ext_options;
while(*lpCmdLine == '-') {
while(*lpCmdLine && !_istspace((unsigned)*lpCmdLine))
ext_options += *lpCmdLine++;
while(_istspace((unsigned)*lpCmdLine))
++lpCmdLine;
}
// command line option "-install" to replace previous shell application with ROS Explorer
if (_tcsstr(ext_options,TEXT("-install"))) {
// install ROS Explorer into the registry
TCHAR path[MAX_PATH];
int l = GetModuleFileName(0, path, COUNTOF(path));
if (l) {
HKEY hkey;
if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) {
///@todo save previous shell application in config file
RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)path, l*sizeof(TCHAR));
RegCloseKey(hkey);
}
if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) {
///@todo save previous shell application in config file
RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)TEXT(""), l*sizeof(TCHAR));
RegCloseKey(hkey);
}
}
HWND shellWindow = GetShellWindow();
if (shellWindow) {
DWORD pid;
// terminate shell process for NT like systems
GetWindowThreadProcessId(shellWindow, &pid);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// On Win 9x it's sufficient to destroy the shell window.
DestroyWindow(shellWindow);
if (TerminateProcess(hProcess, 0))
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
}
startup_desktop = TRUE;
} else {
// create desktop window and task bar only, if there is no other shell and we are
// the first explorer instance
// MS Explorer looks additionally into the registry entry HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell,
// to decide wether it is currently configured as shell application.
startup_desktop = !any_desktop_running;
}
bool autostart = !any_desktop_running;
// disable autostart if the SHIFT key is pressed
if (GetAsyncKeyState(VK_SHIFT) < 0)
autostart = false;
#ifdef _DEBUG //MF: disabled for debugging
autostart = false;
#endif
// If there is given the command line option "-desktop", create desktop window anyways
if (_tcsstr(ext_options,TEXT("-desktop")))
startup_desktop = TRUE;
#ifndef ROSSHELL
else if (_tcsstr(ext_options,TEXT("-nodesktop")))
startup_desktop = FALSE;
// Don't display cabinet window in desktop mode
if (startup_desktop && !_tcsstr(ext_options,TEXT("-explorer")))
nShowCmd = SW_HIDE;
#endif
if (_tcsstr(ext_options,TEXT("-noautostart")))
autostart = false;
else if (_tcsstr(ext_options,TEXT("-autostart")))
autostart = true;
#ifndef __WINE__
if (_tcsstr(ext_options,TEXT("-console"))) {
AllocConsole();
_dup2(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_RDONLY), 0);
_dup2(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 0), 1);
_dup2(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), 0), 2);
g_Globals._log = _fdopen(1, "w");
setvbuf(g_Globals._log, 0, _IONBF, 0);
LOG(TEXT("starting explorer debug log\n"));
}
#endif
if (startup_desktop) {
// hide the XP login screen (Credit to Nicolas Escuder)
// another undocumented event: "Global\\msgina: ReturnToWelcome"
if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent")))
SetShellReadyEvent(TEXT("Global\\msgina: ShellReadyEvent"));
}
#ifdef ROSSHELL
else
return 0; // no shell to launch, so exit immediatelly
#endif
if (!any_desktop_running) {
// launch the shell DDE server
if (g_SHDOCVW_ShellDDEInit)
(*g_SHDOCVW_ShellDDEInit)(TRUE);
}
bool use_gdb_stub = false; // !IsDebuggerPresent();
if (_tcsstr(ext_options,TEXT("-debug")))
use_gdb_stub = true;
if (_tcsstr(ext_options,TEXT("-break"))) {
LOG(TEXT("debugger breakpoint"));
#ifdef _MSC_VER
__asm int 3
#else
asm("int3");
#endif
}
// activate GDB remote debugging stub if no other debugger is running
if (use_gdb_stub) {
LOG(TEXT("waiting for debugger connection...\n"));
initialize_gdb_stub();
}
g_Globals.init(hInstance);
// initialize COM and OLE before creating the desktop window
OleInit usingCOM;
// init common controls library
CommonControlInit usingCmnCtrl;
g_Globals.read_persistent();
if (startup_desktop) {
WaitCursor wait;
g_Globals._desktops.init();
g_Globals._hwndDesktop = DesktopWindow::Create();
#ifdef _USE_HDESK
g_Globals._desktops.get_current_Desktop()->_hwndDesktop = g_Globals._hwndDesktop;
#endif
}
if (_tcsstr(ext_options,TEXT("-?"))) {
MessageBoxA(g_Globals._hwndDesktop,
"/e open cabinet window in explorer mode\r\n"
"/root open cabinet window in rooted mode\r\n"
"/mdi open cabinet window in MDI mode\r\n"
"/sdi open cabinet window in SDI mode\r\n"
"\r\n"
"-? display command line options\r\n"
"\r\n"
"-desktop start in desktop mode regardless of an already running shell\r\n"
"-nodesktop disable desktop mode\r\n"
"-explorer display cabinet window regardless of enabled desktop mode\r\n"
"\r\n"
"-install replace previous shell application with ROS Explorer\r\n"
"\r\n"
"-noautostart disable autostarts\r\n"
"-autostart enable autostarts regardless of debug build\r\n"
"\r\n"
"-console open debug console\r\n"
"\r\n"
"-debug activate GDB remote debugging stub\r\n"
"-break activate debugger breakpoint\r\n",
"ROS Explorer - command line options", MB_OK);
}
Thread* pSSOThread = NULL;
if (startup_desktop) {
// launch SSO thread to allow message processing independent from the explorer main thread
pSSOThread = new SSOThread;
pSSOThread->Start();
}
/**TODO launching autostart programs can be moved into a background thread. */
if (autostart) {
const char* argv[] = {"", "s"}; // call startup routine in SESSION_START mode
startup(2, argv);
}
#ifndef ROSSHELL
if (g_Globals._hwndDesktop)
g_Globals._desktop_mode = true;
#endif
int ret = explorer_main(hInstance, lpCmdLine, nShowCmd);
// write configuration file
g_Globals.write_persistent();
if (pSSOThread) {
pSSOThread->Stop();
delete pSSOThread;
}
if (!any_desktop_running) {
// shutdown the shell DDE server
if (g_SHDOCVW_ShellDDEInit)
(*g_SHDOCVW_ShellDDEInit)(FALSE);
}
return ret;
}

| HBITMAP create_bitmap_from_icon | ( | HICON | hIcon, |
| HBRUSH | hbrush_bkgnd, | ||
| HDC | hdc_wnd | ||
| ) |
create a bitmap from an icon
Definition at line 336 of file explorer.cpp.
References ICON_SIZE_SMALL.
Referenced by Icon::create_bitmap(), TaskBar::EnumWndProc(), and ImageList_AddAlphaIcon().
{
int cx = ICON_SIZE_SMALL;
int cy = ICON_SIZE_SMALL;
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
MemCanvas canvas;
BitmapSelection sel(canvas, hbmp);
RECT rect = {0, 0, cx, cy};
FillRect(canvas, &rect, hbrush_bkgnd);
DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL);
return hbmp;
}

| HBITMAP create_small_bitmap_from_icon | ( | HICON | hIcon, |
| HBRUSH | hbrush_bkgnd, | ||
| HDC | hdc_wnd | ||
| ) |
Definition at line 353 of file explorer.cpp.
{
int cx = GetSystemMetrics(SM_CXSMICON);
int cy = GetSystemMetrics(SM_CYSMICON);
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
MemCanvas canvas;
BitmapSelection sel(canvas, hbmp);
RECT rect = {0, 0, cx, cy};
FillRect(canvas, &rect, hbrush_bkgnd);
DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL);
return hbmp;
}
| void explorer_about | ( | HWND | hwndParent ) |
Definition at line 927 of file explorer.cpp.
References Dialog::DoModal(), IDD_ABOUT_EXPLORER, and WINDOW_CREATOR.
Referenced by MainFrameBase::Command(), DesktopBar::Command(), and DesktopShellView::DoDesktopContextMenu().
{
Dialog::DoModal(IDD_ABOUT_EXPLORER, WINDOW_CREATOR(ExplorerAboutDlg), hwndParent);
}


| int explorer_main | ( | HINSTANCE | hInstance, |
| LPTSTR | lpCmdLine, | ||
| int | cmdShow | ||
| ) |
Definition at line 954 of file explorer.cpp.
References CONTEXT, explorer_show_frame(), HandleException(), and Window::MessageLoop().
Referenced by _tWinMain().
{
CONTEXT("explorer_main");
// initialize Common Controls library
CommonControlInit usingCmnCtrl;
try {
InitInstance(hInstance);
} catch(COMException& e) {
HandleException(e, GetDesktopWindow());
return -1;
}
#ifndef ROSSHELL
if (cmdShow != SW_HIDE) {
/* // don't maximize if being called from the ROS desktop
if (cmdShow == SW_SHOWNORMAL)
///@todo read window placement from registry
cmdShow = SW_MAXIMIZE;
*/
explorer_show_frame(cmdShow, lpCmdLine);
}
#endif
return Window::MessageLoop();
}


| void explorer_show_frame | ( | int | cmdShow, |
| LPTSTR | lpCmdLine | ||
| ) |
Definition at line 711 of file explorer.cpp.
References ExplorerCmd::_cmdShow, ExplorerGlobals::_hMainWnd, ExplorerGlobals::_hwndDesktop, ExplorerCmd::_mdi, ExplorerGlobals::_prescan_nodes, MainFrameBase::Create(), Dialog::DoModal(), ExplorerGlobals::get_cfg(), IDD_MDI_SDI, ExplorerCmd::ParseCmdLine(), and WINDOW_CREATOR.
Referenced by StartMenuHandler::Command(), DesktopBar::Command(), explorer_main(), DesktopBar::ProcessHotKey(), and DesktopWindow::WndProc().
{
ExplorerCmd cmd;
if (g_Globals._hMainWnd) {
if (IsIconic(g_Globals._hMainWnd))
ShowWindow(g_Globals._hMainWnd, SW_RESTORE);
else
SetForegroundWindow(g_Globals._hMainWnd);
return;
}
g_Globals._prescan_nodes = false;
XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
XS_String mdiStr = XMLString(explorer_options, "mdi");
// If there isn't yet the "mdi" setting in the configuration, display the MDI/SDI dialog.
if (mdiStr.empty())
Dialog::DoModal(IDD_MDI_SDI, WINDOW_CREATOR(MdiSdiDlg), g_Globals._hwndDesktop);
// Now read the MDI attribute again and interpret it as boolean value.
cmd._mdi = XMLBool(explorer_options, "mdi", true);
cmd._cmdShow = cmdShow;
// parse command line options, which may overwrite the MDI flag
if (lpCmdLine)
cmd.ParseCmdLine(lpCmdLine);
// create main window
MainFrameBase::Create(cmd);
}


| int ImageList_AddAlphaIcon | ( | HIMAGELIST | himl, |
| HICON | hIcon, | ||
| HBRUSH | hbrush_bkgnd, | ||
| HDC | hdc_wnd | ||
| ) |
add icon with alpha channel to imagelist using the specified background color
Definition at line 370 of file explorer.cpp.
References create_bitmap_from_icon().
Referenced by Icon::add_to_imagelist(), MainFrameBase::FillBookmarks(), TrayNotifyDlg::InsertItem(), and TrayNotifyDlg::TrayNotifyDlg().
{
HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd);
int ret = ImageList_Add(himl, hbmp, 0);
DeleteObject(hbmp);
return ret;
}


| int initialize_gdb_stub | ( | ) |
| void SetWindowIcon | ( | HWND | hwnd, |
| UINT | nid | ||
| ) |
set big and small icons out of the resources for a window
Definition at line 693 of file explorer.cpp.
References Window_SetIcon.
Referenced by DesktopBar::DesktopBar(), ExplorerAboutDlg::ExplorerAboutDlg(), FindProgramDlg::FindProgramDlg(), and TrayNotifyDlg::TrayNotifyDlg().
{
HICON hIcon = ResIcon(nid);
(void)Window_SetIcon(hwnd, ICON_BIG, hIcon);
HICON hIconSmall = SmallIcon(nid);
(void)Window_SetIcon(hwnd, ICON_SMALL, hIconSmall);
}

Definition at line 53 of file explorer.cpp.
Referenced by StartMenu::AddButton(), FavoritesMenu::AddEntries(), SearchMenu::AddEntries(), BrowseMenu::AddEntries(), SettingsMenu::AddEntries(), QuickLaunchBar::AddShortcuts(), StartMenuHandler::Command(), MdiSdiDlg::Command(), TaskbarSettingsDlg::Command(), DesktopSettingsDlg::Command(), MainFrameBase::Command(), DesktopBar::Command(), ChildWindow::create(), Window::Create(), SDIMainFrame::Create(), MDIMainFrame::Create(), MainFrameBase::Create(), FileChildWindow::create(), Pane::create_header(), DesktopSettingsDlg::DesktopSettingsDlg(), Dialog::DoModal(), Pane::draw_item(), Entry::extract_icon(), BookmarkList::fill_tree(), ShellDirectory::fill_w32fdata_shell(), MainFrameBase::FillBookmarks(), FindProgramDlg::FindProgramDlg(), ShellBrowser::get_image_idx(), StartMenuRoot::Init(), Pane::init(), DesktopBar::Init(), DesktopWindow::Init(), ShellBrowser::InsertSubitems(), ShellBrowser::invalidate_cache(), MainFrameBase::MainFrameBase(), MDIMainFrame::MDIMainFrame(), MdiSdiDlg::MdiSdiDlg(), TaskbarSettingsDlg::Notify(), DesktopSettingsDlg::Notify(), FindProgramDlg::Notify(), MainFrameBase::OpenShellFolders(), MainFrameBase::ProcessMessage(), PropertySheetDialog::PropertySheetDialog(), PropSheetPage::PropSheetPage(), Favorites::read(), NotifyArea::read_config(), WinDirectory::read_directory(), ShellDirectory::read_directory(), Entry::read_directory_base(), TrayNotifyDlg::RefreshProperties(), StartMenuRoot::StartMenuRoot(), Desktops::SwitchToDesktop(), TaskbarSettingsDlg::TaskbarSettingsDlg(), TrayNotifyDlg::TrayNotifyDlg(), MDIShellBrowserChild::update_shell_browser(), SDIMainFrame::update_shell_browser(), WindowClass::WindowClass(), DesktopWindow::WndProc(), BackgroundWindow::WndProc(), NotifyArea::write_config(), Entry::~Entry(), and MainFrameBase::~MainFrameBase().
| DynamicLoadLibFct<void(__stdcall*)(BOOL)> g_SHDOCVW_ShellDDEInit(TEXT("SHDOCVW"), 118) |
Definition at line 50 of file explorer.cpp.
Referenced by _tWinMain().
|
ROS Explorer Source Code Documentation
generated on 02.01.2013 by
|