×
Namespaces

Variants
Actions
Revision as of 08:30, 14 June 2012 by hamishwillee (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Changing the active theme using Symbian C++

From Nokia Developer Wiki
Jump to: navigation, search



Article Metadata
Compatibility
Platform(s): S60 3rd Edition
S60 3rd Edition (initial release)
Article
Created: User:Technical writer 2 (19 Oct 2006)
Last edited: hamishwillee (14 Jun 2012)

Overview

Changing the active theme

Description

The S60 3rd Edition SDK does not provide a way to activate a specific theme from 3rd-party applications.
However, the required API (Skin Server API) is part of the Extensions plug-in package for S60 3rd Edition SDK.

Solution

To change the active theme:
1. Connect to Skin Server.  
    #include <AknSSrvClient.h> // link against aknskinsrv.lib
    RAknsSrvSession skinsSession;
    User::LeaveIfError( skinsSession.Connect( this ) );
    CleanupClosePushL( skinsSession );
2. Fetch the package ID of the current skin.
    #include <centralrepository.h> // link against centralrepository.lib
    #include <AknSkinsInternalCRKeys.h>
    void CMyThemeManager::StoreCurrentSkinIdL()
        {
        TAknsPkgIDBuf pidBuf;       
        CRepository* repository = CRepository::NewL(KCRUidPersonalisation );               
        TInt retVal = repository->Get( KPslnActiveSkinUid, pidBuf );
        delete repository;
        repository = NULL;
        iOriginalSkinPid.SetFromDesL( pidBuf ); // iOriginalSkinPid is of type TAknsPkgID
        }
3. Get a list of installed skin packages.
    CArrayPtr<CAknsSrvSkinInformationPkg>* skinInfoArray =
                skinsSession.EnumerateSkinPackagesL();
    CleanupStack::PushL( skinInfoArray );
4. Go through installed packages and switch to the first available new skin.
    TInt retValue( KErrNone );
    if ( skinInfoArray->Count() > 0 )
        {
        for ( TInt i = 0; i < skinInfoArray->Count(); i++ )
            {
            TAknsPkgID pkgId = skinInfoArray->At( i )->PID();
            if ( pkgId != iOriginalSkinPid )
                {
                // Activates a complete skin package
                retValue = skinsSession.SetAllDefinitionSets( pkgId );
                if ( retValue == KErrNone )
                    {
                    SetNewSkinIdL( pkgId );
                    }
                break;               
                }
            }       
        }
5. Save the new skin package ID in Central Repository.
    void CMyThemeManager::SetNewSkinIdL( TAknsPkgID aPkgId )
        {
        TAknsPkgIDBuf pidBuf;       
        aPkgId.CopyToDes( pidBuf );
        CRepository* repository = CRepository::NewL( KCRUidPersonalisation );               
        TInt retVal = repository->Set( KPslnActiveSkinUid, pidBuf );   
        // KPslnActiveSkinLocation value needs to be updated
        // if the new skin resides on memory card and the
        // previous one resided in phone memory (and vice versa)   
        delete repository;
        repository = NULL;
        }

This page was last modified on 14 June 2012, at 08:30.
64 page views in the last 30 days.