1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
/*
 * ReactOS Explorer
 *
 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
 *
 * 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"

HRESULT
UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
                IN HBITMAP hbmBanner  OPTIONAL,
                IN BOOL bSmallIcons)
{
    CComPtr<IBanneredBar> pbb;
    HRESULT hRet;

    hRet = pMenuPopup->QueryInterface(IID_PPV_ARG(IBanneredBar, &pbb));
    if (SUCCEEDED(hRet))
    {
        hRet = pbb->SetBitmap(hbmBanner);<--- hRet is assigned

        /* Update the icon size */
        hRet = pbb->SetIconSize(bSmallIcons ? BMICON_SMALL : BMICON_LARGE);<--- hRet is overwritten
    }

    return hRet;
}

IMenuPopup*
CreateStartMenu(IN ITrayWindow *Tray,
                OUT IMenuBand **ppMenuBand,
                IN HBITMAP hbmBanner OPTIONAL,
                IN BOOL bSmallIcons)
{
    HRESULT hr;
    CComPtr<IMenuPopup> pMp;
    CComPtr<IUnknown> pSms;
    CComPtr<IMenuBand> pMb;
    CComPtr<IInitializeObject> pIo;
    CComPtr<IUnknown> pUnk;
    CComPtr<IBandSite> pBs;
    DWORD dwBandId = 0;

    hr = CStartMenuSite_CreateInstance(Tray, IID_PPV_ARG(IUnknown, &pSms));
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    hr = _CStartMenu_CreateInstance(IID_PPV_ARG(IMenuPopup, &pMp));
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    /* Set the menu site so we can handle messages */
    hr = IUnknown_SetSite(pMp, pSms);
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    /* Initialize the menu object */
    hr = pMp->QueryInterface(IID_PPV_ARG(IInitializeObject, &pIo));
    if (SUCCEEDED(hr))
        hr = pIo->Initialize();
    else
        hr = S_OK;

    /* Everything is initialized now. Let's get the IMenuBand interface. */
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    hr = pMp->GetClient(&pUnk);
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    hr = pUnk->QueryInterface(IID_PPV_ARG(IBandSite, &pBs));
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    /* Finally we have the IBandSite interface, there's only one
       band in it that apparently provides the IMenuBand interface */
    hr = pBs->EnumBands(0, &dwBandId);
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    hr = pBs->GetBandObject(dwBandId, IID_PPV_ARG(IMenuBand, &pMb));
    if (FAILED_UNEXPECTEDLY(hr))
        return NULL;

    UpdateStartMenu(pMp,
                    hbmBanner,
                    bSmallIcons);

    *ppMenuBand = pMb.Detach();

    return pMp.Detach();
}