From e77b6e64cafd4273e39424c5f2f3cc4cef32cc74 Mon Sep 17 00:00:00 2001 From: Shriraj Sawant Date: Sun, 4 Jun 2017 09:56:54 +0000 Subject: [PATCH] [QCKLNCH] -Added CQuickLaunchBand -Exposed required Interfaces -Stubbed the methods svn path=/branches/GSoC_2017/shellext/; revision=74899 --- reactos/dll/shellext/CMakeLists.txt | 1 + reactos/dll/shellext/qcklnch/CMakeLists.txt | 3 +- .../dll/shellext/qcklnch/CQuickLaunchBand.cpp | 269 ++++++++++++++++++ .../dll/shellext/qcklnch/CQuickLaunchBand.h | 163 +++++++++++ reactos/dll/shellext/qcklnch/precomp.h | 2 + reactos/dll/shellext/qcklnch/qcklnch.cpp | 4 +- 6 files changed, 439 insertions(+), 3 deletions(-) create mode 100644 reactos/dll/shellext/qcklnch/CQuickLaunchBand.cpp create mode 100644 reactos/dll/shellext/qcklnch/CQuickLaunchBand.h diff --git a/reactos/dll/shellext/CMakeLists.txt b/reactos/dll/shellext/CMakeLists.txt index 56fabe12999..2b5b3c6c652 100644 --- a/reactos/dll/shellext/CMakeLists.txt +++ b/reactos/dll/shellext/CMakeLists.txt @@ -6,5 +6,6 @@ add_subdirectory(devcpux) add_subdirectory(fontext) add_subdirectory(netshell) add_subdirectory(ntobjshex) +add_subdirectory(qcklnch) add_subdirectory(shellbtrfs) add_subdirectory(stobject) diff --git a/reactos/dll/shellext/qcklnch/CMakeLists.txt b/reactos/dll/shellext/qcklnch/CMakeLists.txt index 0f02b6f61fa..5068878cc7d 100644 --- a/reactos/dll/shellext/qcklnch/CMakeLists.txt +++ b/reactos/dll/shellext/qcklnch/CMakeLists.txt @@ -15,7 +15,8 @@ include_directories( spec2def(qcklnch.dll qcklnch.spec) add_library(qcklnch SHARED - qcklnch.cpp + qcklnch.cpp + CQuickLaunchBand.cpp ${CMAKE_CURRENT_BINARY_DIR}/qcklnch.def) set_module_type(qcklnch win32dll UNICODE) diff --git a/reactos/dll/shellext/qcklnch/CQuickLaunchBand.cpp b/reactos/dll/shellext/qcklnch/CQuickLaunchBand.cpp new file mode 100644 index 00000000000..f36d5a9d11a --- /dev/null +++ b/reactos/dll/shellext/qcklnch/CQuickLaunchBand.cpp @@ -0,0 +1,269 @@ +/* + * PROJECT: ReactOS shell extensions + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/shellext/qcklnch/CQuickLaunchBand.cpp + * PURPOSE: Quick Launch Toolbar (Taskbar Shell Extension) + * PROGRAMMERS: Shriraj Sawant a.k.a SR13 + */ + +#include "precomp.h" + +WINE_DEFAULT_DEBUG_CHANNEL(qcklnch); + +// {260CB95D-4544-44F6-A079-575BAA60B72F} +static const GUID CLSID_QuickLaunchBand = { 0x260cb95d, 0x4544, 0x44f6, { 0xa0, 0x79, 0x57, 0x5b, 0xaa, 0x60, 0xb7, 0x2f } }; + +//CQuickLaunchBand + + CQuickLaunchBand::CQuickLaunchBand() : + m_hWnd(NULL), + m_BandID(0) + { + + } + + CQuickLaunchBand::~CQuickLaunchBand() { } + +/*****************************************************************************/ +//IObjectWithSite + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::SetSite(IUnknown *pUnkSite) + { + /*HRESULT hRet; + HWND hwndSite; + + TRACE("CQuickLaunchBand::SetSite(0x%p)\n", pUnkSite); + + hRet = IUnknown_GetWindow(pUnkSite, &hwndSite); + if (FAILED(hRet)) + { + TRACE("Querying site window failed: 0x%x\n", hRet); + return hRet; + } + + TRACE("CreateTaskSwitchWnd(Parent: 0x%p)\n", hwndSite); + + HWND hwndTaskSwitch = CreateTaskSwitchWnd(hwndSite, m_Tray); + if (!hwndTaskSwitch) + { + ERR("CreateTaskSwitchWnd failed"); + return E_FAIL; + } + + m_Site = pUnkSite; + m_hWnd = hwndTaskSwitch;*/ + + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::GetSite( + IN REFIID riid, + OUT VOID **ppvSite) + { + /*TRACE("CQuickLaunchBand::GetSite(0x%p,0x%p)\n", riid, ppvSite); + + if (m_Site != NULL) + { + return m_Site->QueryInterface(riid, ppvSite); + } + + *ppvSite = NULL;*/ + return E_FAIL; + } + +/*****************************************************************************/ +//IDeskBand + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::GetWindow(OUT HWND *phwnd) + { + /*if (!m_hWnd) + return E_FAIL; + if (!phwnd) + return E_INVALIDARG; + *phwnd = m_hWnd;*/ + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::ContextSensitiveHelp( + IN BOOL fEnterMode) + { + /* FIXME: Implement */ + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::ShowDW( + IN BOOL bShow) + { + /* We don't do anything... */ + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::CloseDW( + IN DWORD dwReserved) + { + /* We don't do anything... */ + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::ResizeBorderDW( + LPCRECT prcBorder, + IUnknown *punkToolbarSite, + BOOL fReserved) + { + /* No need to implement this method */ + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::GetBandInfo( + IN DWORD dwBandID, + IN DWORD dwViewMode, + IN OUT DESKBANDINFO *pdbi) + { + //TRACE("CQuickLaunchBand::GetBandInfo(0x%x,0x%x,0x%p) hWnd=0x%p\n", dwBandID, dwViewMode, pdbi, m_hWnd); + + return E_FAIL; + } + + /*****************************************************************************/ + //IDeskBar + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::SetClient( + IN IUnknown *punkClient) + { + /*TRACE("IDeskBar::SetClient(0x%p)\n", punkClient);*/ + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::GetClient( + OUT IUnknown **ppunkClient) + { + /*TRACE("IDeskBar::GetClient(0x%p)\n", ppunkClient);*/ + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::OnPosRectChangeDB( + IN RECT *prc) + { + /*TRACE("IDeskBar::OnPosRectChangeDB(0x%p=(%d,%d,%d,%d))\n", prc, prc->left, prc->top, prc->right, prc->bottom); + if (prc->bottom - prc->top == 0) + return S_OK;*/ + + return S_FALSE; + } + +/*****************************************************************************/ +//IPersistStream + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::GetClassID( + OUT CLSID *pClassID) + { + TRACE("CQuickLaunchBand::GetClassID(0x%p)\n", pClassID); + /* We're going to return the (internal!) CLSID of the task band interface */ + //*pClassID = CLSID_ITaskBand; + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::IsDirty() + { + /* The object hasn't changed since the last save! */ + return S_FALSE; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::Load( + IN IStream *pStm) + { + //TRACE("CQuickLaunchBand::Load called\n"); + /* Nothing to do */ + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::Save( + IN IStream *pStm, + IN BOOL fClearDirty) + { + /* Nothing to do */ + return S_OK; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::GetSizeMax( + OUT ULARGE_INTEGER *pcbSize) + { + TRACE("CQuickLaunchBand::GetSizeMax called\n"); + /* We don't need any space for the task band */ + //pcbSize->QuadPart = 0; + return S_OK; + } + + +/*****************************************************************************/ +//IWinEventHandler + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::ProcessMessage( + IN HWND hWnd, + IN UINT uMsg, + IN WPARAM wParam, + IN LPARAM lParam, + OUT LRESULT *plrResult) + { + //TRACE("CQuickLaunchBand: IWinEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd, uMsg, wParam, lParam, plrResult); + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::ContainsWindow( + IN HWND hWnd) + { + /*if (hWnd == m_hWnd || + IsChild(m_hWnd, hWnd)) + { + TRACE("CQuickLaunchBand::ContainsWindow(0x%p) returns S_OK\n", hWnd); + return S_OK; + }*/ + + return S_FALSE; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) + { + UNIMPLEMENTED; + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::IsWindowOwner(HWND hWnd) + { + return (hWnd == m_hWnd) ? S_OK : S_FALSE; + } + +/*****************************************************************************/ +// *** IOleCommandTarget methods *** + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) + { + UNIMPLEMENTED; + return E_NOTIMPL; + } + + HRESULT STDMETHODCALLTYPE CQuickLaunchBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) + { + /*if (IsEqualIID(*pguidCmdGroup, IID_IBandSite)) + { + return S_OK; + } + + if (IsEqualIID(*pguidCmdGroup, IID_IDeskBand)) + { + return S_OK; + }*/ + + UNIMPLEMENTED; + return E_NOTIMPL; + } + + + + + + +/*****************************************************************************/ + + /* HRESULT STDMETHODCALLTYPE Initialize(IN OUT ITrayWindow *tray, HWND hWndStartButton) + { + m_Tray = tray; + m_BandID = (DWORD) -1; + m_hWndStartButton = hWndStartButton; + return S_OK; + } +*/ \ No newline at end of file diff --git a/reactos/dll/shellext/qcklnch/CQuickLaunchBand.h b/reactos/dll/shellext/qcklnch/CQuickLaunchBand.h new file mode 100644 index 00000000000..73d960258ec --- /dev/null +++ b/reactos/dll/shellext/qcklnch/CQuickLaunchBand.h @@ -0,0 +1,163 @@ +/* + * PROJECT: ReactOS shell extensions + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/shellext/qcklnch/CQuickLaunchBand.h + * PURPOSE: Quick Launch Toolbar (Taskbar Shell Extension) + * PROGRAMMERS: Shriraj Sawant a.k.a SR13 + */ +#pragma once + +extern const GUID CLSID_QuickLaunchBand; + +class CQuickLaunchBand : + public CComCoClass, + public CComObjectRootEx, + public IObjectWithSite, + public IDeskBand, + public IDeskBar, + public IPersistStream, + public IWinEventHandler, + public IOleCommandTarget +{ + HWND m_hWnd; + DWORD m_BandID; + +public: + + CQuickLaunchBand(); + virtual ~CQuickLaunchBand(); + +//IObjectWithSite + + virtual HRESULT STDMETHODCALLTYPE GetSite( + /*[in]*/ REFIID riid, + /*[out]*/ void **ppvSite + ); + + virtual HRESULT STDMETHODCALLTYPE SetSite( + /*[in]*/ IUnknown *pUnkSite + ); + +//IDeskBand + + virtual HRESULT STDMETHODCALLTYPE GetWindow( + OUT HWND *phwnd + ); + + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp( + IN BOOL fEnterMode + ); + + virtual HRESULT STDMETHODCALLTYPE ShowDW( + IN BOOL bShow + ); + + virtual HRESULT STDMETHODCALLTYPE CloseDW( + IN DWORD dwReserved + ); + + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW( + LPCRECT prcBorder, + IUnknown *punkToolbarSite, + BOOL fReserved + ); + + virtual HRESULT STDMETHODCALLTYPE GetBandInfo( + IN DWORD dwBandID, + IN DWORD dwViewMode, + IN OUT DESKBANDINFO *pdbi + ); + +//IDeskBar + + virtual HRESULT STDMETHODCALLTYPE GetClient( + /*[out]*/ IUnknown **ppunkClient + ); + + virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB( + /*[in]*/ LPRECT prc + ); + + virtual HRESULT STDMETHODCALLTYPE SetClient( + /*[in, optional]*/ IUnknown *punkClient + ); + +//IPersistStream + + virtual HRESULT STDMETHODCALLTYPE GetClassID( + /*[out]*/ OUT CLSID *pClassID + ); + + virtual HRESULT STDMETHODCALLTYPE GetSizeMax( + /*[out]*/ ULARGE_INTEGER *pcbSize + ); + + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + + virtual HRESULT STDMETHODCALLTYPE Load( + /*[in]*/ IStream *pStm + ); + + virtual HRESULT STDMETHODCALLTYPE Save( + /*[in]*/ IStream *pStm, + /*[in]*/ BOOL fClearDirty + ); + +//IWinEventHandler + + virtual HRESULT STDMETHODCALLTYPE ProcessMessage( + IN HWND hWnd, + IN UINT uMsg, + IN WPARAM wParam, + IN LPARAM lParam, + OUT LRESULT *plrResult + ); + + virtual HRESULT STDMETHODCALLTYPE ContainsWindow( + IN HWND hWnd + ); + + virtual HRESULT STDMETHODCALLTYPE OnWinEvent( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT *theResult + ); + + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner( + HWND hWnd + ); + +//IOleCommandTarget + + virtual HRESULT STDMETHODCALLTYPE Exec( + /*[in]*/ const GUID *pguidCmdGroup, + /*[in]*/ DWORD nCmdID, + /*[in]*/ DWORD nCmdexecopt, + /*[in]*/ VARIANT *pvaIn, + /*[in, out]*/ VARIANT *pvaOut + ); + + virtual HRESULT STDMETHODCALLTYPE QueryStatus( + /*[in]*/ const GUID *pguidCmdGroup, + /*[in]*/ ULONG cCmds, + /*[in, out]*/ OLECMD prgCmds[], + /*[in, out]*/ OLECMDTEXT *pCmdText + ); + +//***************************************************************************************************** + + DECLARE_NOT_AGGREGATABLE(CQuickLaunchBand) + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CQuickLaunchBand) + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + END_COM_MAP() +}; \ No newline at end of file diff --git a/reactos/dll/shellext/qcklnch/precomp.h b/reactos/dll/shellext/qcklnch/precomp.h index 50d6e2415ff..12dd2046621 100644 --- a/reactos/dll/shellext/qcklnch/precomp.h +++ b/reactos/dll/shellext/qcklnch/precomp.h @@ -38,6 +38,8 @@ #undef DbgPrint +#include "CQuickLaunchBand.h" + /*extern HINSTANCE g_hInstance; #define ID_ICON_VOLUME (WM_APP + 0x4CB) diff --git a/reactos/dll/shellext/qcklnch/qcklnch.cpp b/reactos/dll/shellext/qcklnch/qcklnch.cpp index ce6637e3934..93145f203e4 100644 --- a/reactos/dll/shellext/qcklnch/qcklnch.cpp +++ b/reactos/dll/shellext/qcklnch/qcklnch.cpp @@ -10,10 +10,10 @@ #include -WINE_DEFAULT_DEBUG_CHANNEL(ntobjshex); +WINE_DEFAULT_DEBUG_CHANNEL(qcklnch); BEGIN_OBJECT_MAP(ObjectMap) - //OBJECT_ENTRY(CLSID_RegistryFolder, CRegistryFolder) + //OBJECT_ENTRY(CLSID_QuickLaunchBand, CQuickLaunchBand) END_OBJECT_MAP() HINSTANCE g_hInstance;