Changing the active theme using Symbian C++
Article Metadata
Compatibility
Article
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;
}


(no comments yet)