From 8434cb67a98a5614c8da4448d10f14057bb43d78 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Mon, 14 Jul 2003 22:06:23 +0000 Subject: [PATCH] Added patch by Martain Fuchs for mulitple explorer instances. svn path=/trunk/; revision=5122 --- reactos/subsys/system/explorer/desktop.c | 102 +++++++++--------- reactos/subsys/system/explorer/explorer.dsp | 48 +++++---- .../subsys/system/explorer/include/explorer.h | 3 + .../subsys/system/explorer/include/winefile.h | 1 + reactos/subsys/system/explorer/winefile.c | 34 +++--- 5 files changed, 107 insertions(+), 81 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop.c b/reactos/subsys/system/explorer/desktop.c index 29d1277e5fd..dc4e7d439c1 100644 --- a/reactos/subsys/system/explorer/desktop.c +++ b/reactos/subsys/system/explorer/desktop.c @@ -75,68 +75,72 @@ int main(int argc, char *argv[]) { int Width, Height; WNDCLASSEX wc; - HWND Desktop; + HWND hwndDesktop = 0; STARTUPINFO startupinfo; int nCmdShow = SW_SHOWNORMAL; HINSTANCE hInstance = GetModuleHandle(NULL); - HWND hwndExplorerBar; - wc.cbSize = sizeof(WNDCLASSEX); - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = &DeskWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground= (HBRUSH) GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName= DesktopClassName; - wc.hIconSm = NULL; - - if (!RegisterClassEx(&wc)) - return 1; // error - - - Width = GetSystemMetrics(SM_CXSCREEN); - Height = GetSystemMetrics(SM_CYSCREEN); - - Desktop = CreateWindowEx(0, DesktopClassName, TEXT("Desktop"), - WS_VISIBLE | WS_POPUP | WS_CLIPCHILDREN, - 0, 0, Width, Height, - NULL, NULL, hInstance, NULL); - - if (! Desktop) + // create desktop window and task var only, if we are the first explorer instance + if (!find_window_class(DesktopClassName)) { - fprintf(stderr,"FATAL: Desktop window could not be initialized properly - Exiting.\n"); - return 1; // error - } + HWND hwndExplorerBar; - // call winefile startup routine - startupinfo.wShowWindow = SW_SHOWNORMAL; - GetStartupInfo(&startupinfo); + wc.cbSize = sizeof(WNDCLASSEX); + wc.style = CS_DBLCLKS; + wc.lpfnWndProc = &DeskWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground= (HBRUSH) GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName= DesktopClassName; + wc.hIconSm = NULL; - if (startupinfo.dwFlags & STARTF_USESHOWWINDOW) - nCmdShow = startupinfo.wShowWindow; + if (!RegisterClassEx(&wc)) + return 1; // error - // Initializing the Explorer Bar ! - if (!(hwndExplorerBar=InitializeExplorerBar(hInstance, nCmdShow))) - { - fprintf(stderr,"FATAL: Explorer bar could not be initialized properly ! Exiting !\n"); - return 1; - } - // Load plugins - if (!ExplorerLoadPlugins(hwndExplorerBar)) - { - fprintf(stderr,"WARNING: No plugin for desktop bar could be loaded.\n"); - } + Width = GetSystemMetrics(SM_CXSCREEN); + Height = GetSystemMetrics(SM_CYSCREEN); + + hwndDesktop = CreateWindowEx(0, DesktopClassName, TEXT("Desktop"), + WS_VISIBLE | WS_POPUP | WS_CLIPCHILDREN, + 0, 0, Width, Height, + NULL, NULL, hInstance, NULL); + + if (!hwndDesktop) + { + fprintf(stderr,"FATAL: Desktop window could not be initialized properly - Exiting.\n"); + return 1; // error + } + + // call winefile startup routine + GetStartupInfo(&startupinfo); + + if (startupinfo.dwFlags & STARTF_USESHOWWINDOW) + nCmdShow = startupinfo.wShowWindow; + + // Initializing the Explorer Bar + if (!(hwndExplorerBar=InitializeExplorerBar(hInstance, nCmdShow))) + { + fprintf(stderr,"FATAL: Explorer bar could not be initialized properly ! Exiting !\n"); + return 1; + } + + // Load plugins + if (!ExplorerLoadPlugins(hwndExplorerBar)) + { + fprintf(stderr,"WARNING: No plugin for desktop bar could be loaded.\n"); + } #ifndef _DEBUG //MF: disabled for debugging - startup(argc, argv); // invoke the startup groups + startup(argc, argv); // invoke the startup groups #endif + } - return winefile_main(hInstance, Desktop, nCmdShow); + return winefile_main(hInstance, hwndDesktop, nCmdShow); } diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 88c1286a54f..dfcc8517678 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -197,7 +197,7 @@ SOURCE=.\De.rc # End Source File # Begin Source File -SOURCE=.\drivebar.bmp +SOURCE=.\res\drivebar.bmp # End Source File # Begin Source File @@ -230,6 +230,14 @@ SOURCE=.\En.rc # End Source File # Begin Source File +SOURCE=.\res\images.bmp +# End Source File +# Begin Source File + +SOURCE=.\include\resource.h +# End Source File +# Begin Source File + SOURCE=.\resource.rc !IF "$(CFG)" == "explorer - Win32 Release" @@ -259,13 +267,33 @@ SOURCE=.\resource.rc # End Source File # Begin Source File -SOURCE=.\winefile.ico +SOURCE=.\res\toolbar.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\winefile.ico # End Source File # Begin Source File SOURCE=.\winefile.rc # End Source File # End Group +# Begin Group "include" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\include\explorer.h +# End Source File +# Begin Source File + +SOURCE=.\include\license.h +# End Source File +# Begin Source File + +SOURCE=.\include\winefile.h +# End Source File +# End Group # Begin Source File SOURCE=.\desktop.c @@ -276,18 +304,6 @@ SOURCE=.\ex_bar.c # End Source File # Begin Source File -SOURCE=.\explorer.h -# End Source File -# Begin Source File - -SOURCE=.\license.h -# End Source File -# Begin Source File - -SOURCE=.\resource.h -# End Source File -# Begin Source File - SOURCE=.\splitpath.c # End Source File # Begin Source File @@ -298,9 +314,5 @@ SOURCE=.\startup.c SOURCE=.\winefile.c # End Source File -# Begin Source File - -SOURCE=.\winefile.h -# End Source File # End Target # End Project diff --git a/reactos/subsys/system/explorer/include/explorer.h b/reactos/subsys/system/explorer/include/explorer.h index c2f5d3cf8a9..b25788b9bf9 100644 --- a/reactos/subsys/system/explorer/include/explorer.h +++ b/reactos/subsys/system/explorer/include/explorer.h @@ -5,6 +5,9 @@ extern int startup( int argc, char *argv[] ); // winefile main routine extern int winefile_main(HINSTANCE hinstance, HWND hwndParent, int cmdshow); + // search for windows of a specific clasname +extern int find_window_class(LPCTSTR classname); + // display file manager window extern void ShowFileMgr(HWND hWndParent, int cmdshow); diff --git a/reactos/subsys/system/explorer/include/winefile.h b/reactos/subsys/system/explorer/include/winefile.h index 049f2007612..51afba56230 100644 --- a/reactos/subsys/system/explorer/include/winefile.h +++ b/reactos/subsys/system/explorer/include/winefile.h @@ -114,6 +114,7 @@ typedef struct HANDLE hInstance; HACCEL haccel; ATOM hframeClass; + HWND hwndParent; HWND hMainWnd; HMENU hMenuFrame; diff --git a/reactos/subsys/system/explorer/winefile.c b/reactos/subsys/system/explorer/winefile.c index 6fc4b476487..cff853d7336 100644 --- a/reactos/subsys/system/explorer/winefile.c +++ b/reactos/subsys/system/explorer/winefile.c @@ -51,8 +51,8 @@ WINEFILE_GLOBALS Globals; -extern void WineLicense(HWND hWnd); -extern void WineWarranty(HWND hWnd); +extern void WineLicense(HWND hwnd); +extern void WineWarranty(HWND hwnd); typedef struct _Entry { struct _Entry* next; @@ -1068,9 +1068,9 @@ LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam break; case WM_DESTROY: -#ifndef _ROS_ // dont't exit desktop when closing file manager window - PostQuitMessage(0); -#endif + // dont't exit desktop when closing file manager window + if (!Globals.hwndParent) + PostQuitMessage(0); break; case WM_COMMAND: { @@ -2820,7 +2820,7 @@ static void InitInstance(HINSTANCE hinstance) } -void ShowFileMgr(HWND hWndParent, int cmdshow) +void ShowFileMgr(HWND hwndParent, int cmdshow) { TCHAR path[MAX_PATH]; ChildWnd* child; @@ -2831,6 +2831,8 @@ void ShowFileMgr(HWND hWndParent, int cmdshow) if (Globals.hMainWnd) return; + Globals.hwndParent = hwndParent; + hMenuFrame = LoadMenu(Globals.hInstance, MAKEINTRESOURCE(IDM_WINEFILE)); hMenuWindow = GetSubMenu(hMenuFrame, GetMenuItemCount(hMenuFrame)-2); @@ -2845,7 +2847,7 @@ void ShowFileMgr(HWND hWndParent, int cmdshow) /* create main window */ Globals.hMainWnd = CreateWindowEx(0, (LPCTSTR)(int)Globals.hframeClass, _T("Wine File"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - hWndParent, Globals.hMenuFrame, Globals.hInstance, 0/*lpParam*/); + hwndParent, Globals.hMenuFrame, Globals.hInstance, 0/*lpParam*/); Globals.hmdiclient = CreateWindowEx(0, _T("MDICLIENT"), NULL, @@ -2960,8 +2962,6 @@ void ExitInstance() } -#ifdef _NO_EXTENSIONS - /* search for already running win[e]files */ static int g_foundPrevInstance = 0; @@ -2980,7 +2980,16 @@ static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam) return TRUE; } -#endif +int find_window_class(LPCTSTR classname) +{ + /* allow only one running instance */ + EnumWindows(EnumWndProc, (LPARAM)classname); + + if (g_foundPrevInstance) + return 1; + + return 0; +} int winefile_main(HINSTANCE hinstance, HWND hwndParent, int cmdshow) @@ -3022,10 +3031,7 @@ int APIENTRY WinMain(HINSTANCE hinstance, int cmdshow) { #ifdef _NO_EXTENSIONS - /* allow only one running instance */ - EnumWindows(EnumWndProc, (LPARAM)WINEFILEFRAME); - - if (g_foundPrevInstance) + if (find_window_class(WINEFILEFRAME)) return 1; #endif