mirror of
https://github.com/reactos/reactos.git
synced 2025-05-19 17:14:32 +00:00
[EXPLORER-NEW]
* Fix a typo that broke tray notify icons. * Implement loading of Shell Service Objects. Works in win2003 but no idea if it works in ros since we don't have any SSO implemented yet ;P svn path=/branches/shell-experiments/; revision=63684
This commit is contained in:
parent
e362a0da43
commit
ca65a75bf4
4 changed files with 148 additions and 5 deletions
|
@ -9,6 +9,7 @@ list(APPEND SOURCE
|
||||||
explorer.c
|
explorer.c
|
||||||
rshell.c
|
rshell.c
|
||||||
settings.c
|
settings.c
|
||||||
|
shellservice.c
|
||||||
startmnu.c
|
startmnu.c
|
||||||
startup.c
|
startup.c
|
||||||
taskband.c
|
taskband.c
|
||||||
|
|
125
base/shell/explorer-new/shellservice.c
Normal file
125
base/shell/explorer-new/shellservice.c
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
* ReactOS Explorer
|
||||||
|
*
|
||||||
|
* Copyright 2014 - David Quintana
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
extern HRESULT InitShellServices(HDPA * phdpa);
|
||||||
|
extern HRESULT ShutdownShellServices(HDPA hdpa);
|
||||||
|
|
||||||
|
static int CALLBACK InitializeAllCallback(void* pItem, void* pData)
|
||||||
|
{
|
||||||
|
IOleCommandTarget * pOct = pItem;
|
||||||
|
HRESULT * phr = pData;
|
||||||
|
*phr = IOleCommandTarget_Exec(pOct, &CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
||||||
|
return SUCCEEDED(*phr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CALLBACK ShutdownAllCallback(void* pItem, void* pData)
|
||||||
|
{
|
||||||
|
IOleCommandTarget * pOct = pItem;
|
||||||
|
IOleCommandTarget_Exec(pOct, &CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CALLBACK DeleteAllEnumCallback(void* pItem, void* pData)
|
||||||
|
{
|
||||||
|
IOleCommandTarget * pOct = pItem;
|
||||||
|
IUnknown_Release(pOct);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT InitShellServices(HDPA * phdpa)
|
||||||
|
{
|
||||||
|
IOleCommandTarget * pOct;
|
||||||
|
HKEY hkey;
|
||||||
|
CLSID clsid;
|
||||||
|
WCHAR name[MAX_PATH];
|
||||||
|
WCHAR value[MAX_PATH];
|
||||||
|
DWORD type;
|
||||||
|
LONG ret;
|
||||||
|
HDPA hdpa;
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
hdpa = DPA_Create(5);
|
||||||
|
|
||||||
|
if (RegOpenKey(HKEY_LOCAL_MACHINE,
|
||||||
|
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad",
|
||||||
|
&hkey))
|
||||||
|
{
|
||||||
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enumerate */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
DWORD name_len = MAX_PATH;
|
||||||
|
DWORD value_len = sizeof(value); /* byte count! */
|
||||||
|
|
||||||
|
ret = RegEnumValueW(hkey, count, name, &name_len, 0, &type, (LPBYTE) &value, &value_len);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (type != REG_SZ)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hr = CLSIDFromString(value, &clsid);
|
||||||
|
if (FAILED(hr))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IOleCommandTarget, (VOID**) &pOct);
|
||||||
|
if (FAILED(hr))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
DPA_AppendPtr(hdpa, pOct);
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
|
||||||
|
if (ret != ERROR_NO_MORE_ITEMS)
|
||||||
|
{
|
||||||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
|
||||||
|
/* Initialize */
|
||||||
|
DPA_EnumCallback(hdpa, InitializeAllCallback, &hr);
|
||||||
|
if (FAILED(hr))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
*phdpa = hdpa;
|
||||||
|
return count > 0 ? S_OK : S_FALSE;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
*phdpa = NULL;
|
||||||
|
ShutdownShellServices(hdpa);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT ShutdownShellServices(HDPA hdpa)
|
||||||
|
{
|
||||||
|
DPA_EnumCallback(hdpa, ShutdownAllCallback, NULL);
|
||||||
|
DPA_EnumCallback(hdpa, DeleteAllEnumCallback, NULL);
|
||||||
|
DPA_Destroy(hdpa);
|
||||||
|
return S_OK;
|
||||||
|
}
|
|
@ -437,7 +437,7 @@ SysPagerWnd_NotifyMsg(IN HWND hwnd,
|
||||||
CopyMemory(
|
CopyMemory(
|
||||||
&data,
|
&data,
|
||||||
(PSYS_PAGER_COPY_DATA) cpData->lpData,
|
(PSYS_PAGER_COPY_DATA) cpData->lpData,
|
||||||
cpData->dwData);
|
cpData->cbData);
|
||||||
iconData = &data.nicon_data;
|
iconData = &data.nicon_data;
|
||||||
|
|
||||||
switch (data.notify_code)
|
switch (data.notify_code)
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
|
extern HRESULT InitShellServices(HDPA * phdpa);
|
||||||
|
extern HRESULT ShutdownShellServices(HDPA hdpa);
|
||||||
|
|
||||||
static const TRAYWINDOW_CTXMENU TrayWindowCtxMenu;
|
static const TRAYWINDOW_CTXMENU TrayWindowCtxMenu;
|
||||||
|
|
||||||
#define WM_APP_TRAYDESTROY (WM_APP + 0x100)
|
#define WM_APP_TRAYDESTROY (WM_APP + 0x100)
|
||||||
|
@ -94,6 +97,8 @@ typedef struct
|
||||||
|
|
||||||
HWND hwndTrayPropertiesOwner;
|
HWND hwndTrayPropertiesOwner;
|
||||||
HWND hwndRunFileDlgOwner;
|
HWND hwndRunFileDlgOwner;
|
||||||
|
|
||||||
|
HDPA hdpaShellServices;
|
||||||
} ITrayWindowImpl;
|
} ITrayWindowImpl;
|
||||||
|
|
||||||
BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet)
|
BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet)
|
||||||
|
@ -660,6 +665,8 @@ ITrayWindowImpl_ResizeWorkArea(IN OUT ITrayWindowImpl *This)
|
||||||
{
|
{
|
||||||
RECT rcTray,rcWorkArea;
|
RECT rcTray,rcWorkArea;
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
/* If monitor has changed then fix the previous monitors work area */
|
/* If monitor has changed then fix the previous monitors work area */
|
||||||
if (This->PreviousMonitor != This->Monitor)
|
if (This->PreviousMonitor != This->Monitor)
|
||||||
{
|
{
|
||||||
|
@ -768,10 +775,11 @@ ITrayWindowImpl_RegLoadSettings(IN OUT ITrayWindowImpl *This)
|
||||||
|
|
||||||
/* FIXME: Are there more flags? */
|
/* FIXME: Are there more flags? */
|
||||||
|
|
||||||
if (sr.Position > ABE_BOTTOM)
|
//if (sr.Position > ABE_BOTTOM)
|
||||||
This->Position = ABE_BOTTOM;
|
// This->Position = ABE_BOTTOM;
|
||||||
else
|
//else
|
||||||
This->Position = sr.Position;
|
// This->Position = sr.Position;
|
||||||
|
This->Position = ABE_LEFT;
|
||||||
|
|
||||||
/* Try to find out which monitor the tray window was located on last.
|
/* Try to find out which monitor the tray window was located on last.
|
||||||
Here we're only interested in the monitor screen that we think
|
Here we're only interested in the monitor screen that we think
|
||||||
|
@ -986,6 +994,13 @@ ITrayWindowImpl_Destroy(ITrayWindowImpl *This)
|
||||||
(void)InterlockedExchangePointer((PVOID*)&This->hWnd,
|
(void)InterlockedExchangePointer((PVOID*)&This->hWnd,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
|
||||||
|
if (This->hdpaShellServices != NULL)
|
||||||
|
{
|
||||||
|
ShutdownShellServices(This->hdpaShellServices);
|
||||||
|
This->hdpaShellServices = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (This->himlStartBtn != NULL)
|
if (This->himlStartBtn != NULL)
|
||||||
{
|
{
|
||||||
ImageList_Destroy(This->himlStartBtn);
|
ImageList_Destroy(This->himlStartBtn);
|
||||||
|
@ -1586,6 +1601,8 @@ SetStartBtnImage:
|
||||||
/* Align all controls on the tray window */
|
/* Align all controls on the tray window */
|
||||||
ITrayWindowImpl_AlignControls(This,
|
ITrayWindowImpl_AlignControls(This,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
InitShellServices(&(This->hdpaShellServices));
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
static HRESULT STDMETHODCALLTYPE
|
||||||
|
|
Loading…
Reference in a new issue