view src/ui/bmi/mmiSoftKeys.c @ 222:c336ed5691a5

FCHG: clear BCICTL2 on boot for extra safety
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Apr 2021 22:04:10 +0000
parents 6486d17f0f25
children
line wrap: on
line source

/*******************************************************************************

			CONDAT (UK)

********************************************************************************

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.

********************************************************************************

 $Project name:	Basic MMI
 $Project code:	BMI (6349)
 $Module:	Softkeys
 $File:		MmiSoftkeys.c
 $Revision:	1.0

 $Author:	Condat(UK)
 $Date:		22/02/01

********************************************************************************

 Description:


********************************************************************************

 $History:

       xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       To display '?' to indicate to the user that help is available for a STK menu

	25/10/00		Original Condat(UK) BMI version.

 $End

*******************************************************************************/


/*******************************************************************************

                                Include Files

*******************************************************************************/

#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif
#include "mfw_sys.h"
#include "prim.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_lng.h"
#include "mfw_phb.h"
#include "mfw_nm.h"
#include "dspl.h"

#include "ksd.h"
#include "psa.h"


#include "MmiMmi.h"
#include "MmiMain.h"

#include "MmiUserData.h"
#include "MmiSoftKeys.h"
#include "MmiResources.h"

#include "mmiColours.h"

typedef struct
{
    MfwHnd leftKeyHandler;
    MfwHnd rightKeyHandler;

    LangTxt leftKeyLabel;
    LangTxt rightKeyLabel;
} SoftKeysData, *SoftKeys;


#ifdef LSCREEN
#define HorizontalOffset 4
#else
#define HorizontalOffset 1
#endif
#define LeftMargin       (HorizontalOffset)
#define RightMargin      (HorizontalOffset)

#define ALLOC_MEMORY mfwAlloc
#define FREE_MEMORY  mfwFree

static U8    softKeyFont              = 0;
/* x0039928 - Lint warning fix
static UBYTE softKeysDisplayAttibutes = DSPL_TXTATTR_NORMAL; */


/*
 * Change the <font> and <displayAttibutes> for _all_ softkeys.
 * All consecutive calls of softKeysUpdate() will reflect the change.
 * Returns SOFTKEYS_CHANGED when everything went fine,
 * or SOFTKEYS_FAILURE on failure.
 */
SoftKeysResult softKeysAttributes( U8 font, UBYTE displayAttibutes)
{
    if( font == (U8)-1 )
    {
        return SOFTKEYS_FAILURE;
    }

    softKeyFont              = font;
    /* x0039928 - Lint warning fix
    softKeysDisplayAttibutes = displayAttibutes; */

    return SOFTKEYS_CHANGED;
}


/*
 * Creates the softkeys for <window>, which will display the
 * <leftKeyLabel> and <rightKeyLabel> in the softkey area
 * on the screen, and invoke <leftKeyCallBack> or <rightKeyCallBack>
 * when the approrpiate key is pressed. Returns SOFTKEYS_CREATED when
 * everything went fine, or SOFTKEYS_FAILURE on failure.
 */
SoftKeysResult softKeysHndCreate( MfwHnd window, SoftKeysSetup *setup)
{
    if( window == NULL || setup == NULL )
    {
        return SOFTKEYS_FAILURE;
    }

    return softKeysWinCreate( (MfwWin *)((MfwHdr *)window)->data, setup);
}


SoftKeysResult softKeysWinCreate( MfwWin *window, SoftKeysSetup *setup)
{
    SoftKeys newKeys;

    if( window == NULL || setup == NULL )
    {
        return SOFTKEYS_FAILURE;
    }

    newKeys = (SoftKeys)ALLOC_MEMORY(sizeof(SoftKeysData));

    if( newKeys == NULL )
    {
        return SOFTKEYS_FAILURE;
    }

    if( userDataWinSet( window, UD_SOFTKEYS, (void *)newKeys) == NULL )
    {
        FREE_MEMORY( (void *)newKeys, sizeof(SoftKeysData));

        return SOFTKEYS_FAILURE;
    }

    newKeys->leftKeyHandler  = kbdCreate( NULL, KEY_LEFT,
                                          setup->leftKeyCallBack);
    newKeys->rightKeyHandler = kbdCreate( NULL, KEY_RIGHT,
                                          setup->rightKeyCallBack);

    newKeys->leftKeyLabel    = setup->leftKeyLabel;
    newKeys->rightKeyLabel   = setup->rightKeyLabel;

    if( newKeys->leftKeyHandler == NULL || newKeys->rightKeyHandler == NULL )
    {
        kbdDelete(newKeys->leftKeyHandler);
        kbdDelete(newKeys->rightKeyHandler);

        userDataWinDelete( window, UD_SOFTKEYS);

        FREE_MEMORY( (void *)newKeys, sizeof(SoftKeysData));

        return SOFTKEYS_FAILURE;
    }

    return SOFTKEYS_CREATED;
}


/*
 * Change the setup of the softkeys for <window>. Use TxtNull if you
 * don't want to change a ...Label, and NULL if you don't want to change
 * a ...CallBack. Returns SOFTKEYS_CHANGED when everything went fine,
 * or SOFTKEYS_FAILURE on failure.
 */
SoftKeysResult softKeysHndSet( MfwHnd window, SoftKeysSetup *changes)
{
    if( window == NULL || changes == NULL )
    {
        return SOFTKEYS_FAILURE;
    }

    return softKeysWinSet( (MfwWin *)((MfwHdr *)window)->data, changes);
}


SoftKeysResult softKeysWinSet( MfwWin *window, SoftKeysSetup *changes)
{
    SoftKeys softKeys = (SoftKeys)userDataWinGet( window, UD_SOFTKEYS);

    if( window == NULL || softKeys == NULL || changes == NULL )
    {
        return SOFTKEYS_FAILURE;
    }

    if( changes->leftKeyCallBack != NULL )
    {
        MfwHnd NewKeyHandler = kbdCreate( NULL, KEY_LEFT,
                                          changes->leftKeyCallBack);

        if( NewKeyHandler == NULL )
        {
            return SOFTKEYS_FAILURE;
        }
        else
        {
            kbdDelete(softKeys->leftKeyHandler);

            softKeys->leftKeyHandler = NewKeyHandler;
        }
    }

    if( changes->rightKeyCallBack != NULL )
    {
        MfwHnd NewKeyHandler = kbdCreate( NULL, KEY_LEFT,
                                          changes->rightKeyCallBack);

        if( NewKeyHandler == NULL )
        {
            return SOFTKEYS_FAILURE;
        }
        else
        {
            kbdDelete(softKeys->rightKeyHandler);

            softKeys->rightKeyHandler = NewKeyHandler;
        }
    }

    if( changes->leftKeyLabel != TxtNull )
    {
        softKeys->leftKeyLabel = changes->leftKeyLabel;
    }

    if( changes->rightKeyLabel != TxtNull )
    {
        softKeys->rightKeyLabel = changes->rightKeyLabel;
    }

    return SOFTKEYS_CHANGED;
}


/*
 * You will need to call this whenever <window> is updated.
 */
void softKeysHndUpdate(MfwHnd window)
{
    if( window == NULL )
    {
        return;
    }

    softKeysWinUpdate((MfwWin *)((MfwHdr *)window)->data);
}


void softKeysWinUpdate(MfwWin *window)
{
    SoftKeys    softKeys     = (SoftKeys)userDataWinGet( window, UD_SOFTKEYS);
    U8          oldFont      = dspl_SelectFontbyID(softKeyFont);

    if( window == NULL || softKeys == NULL )
    {
        return;
    }

    PROMPT( LeftMargin,Mmi_layout_line(LAST_LINE_TOP), 0, softKeys->leftKeyLabel);

    dspl_SelectFontbyID(oldFont);
}


/*
 * Deletes the softkeys for <window>.
 */
void softkeysHndDelete(MfwHnd window)
{
    if( window == NULL )
    {
        return;
    }

    softkeysWinDelete((MfwWin *)((MfwHdr *)window)->data);
}


void softkeysWinDelete(MfwWin *window)
{
    SoftKeys softKeys = (SoftKeys)userDataWinDelete( window, UD_SOFTKEYS);

    if( window == NULL || softKeys == NULL )
    {
        return;
    }

    kbdDelete(softKeys->leftKeyHandler);
    kbdDelete(softKeys->rightKeyHandler);

    FREE_MEMORY( (void *)softKeys, sizeof(SoftKeysData));
}

typedef struct {
	char* str;
	int posX;
	int posY;
} T_SK_DATA;

typedef struct {
	T_SK_DATA  lsk;
	T_SK_DATA  rsk;
	MfwRect*	rect;
} T_SK_DSPL_STRUCT;

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
static void softKeys_displayAll(T_SK_DSPL_STRUCT* sk_data , int format, unsigned int colIndex )
{
	resources_setSKColour(colIndex);
//	#ifdef COLOURDISPLAY
	dspl_Clear(	sk_data->rect->px,
				sk_data->rect->py,
				sk_data->rect->px+sk_data->rect->sx-1,
				sk_data->rect->py+sk_data->rect->sy-1);
	/* Line height must be less than rect.sy */
//	#endif
	if (sk_data->lsk.str!= NULL)
		dspl_TextOut(sk_data->lsk.posX, sk_data->lsk.posY,DSPL_TXTATTR_CURRENT_MODE, sk_data->lsk.str);
	if (sk_data->rsk.str!= NULL)
		dspl_TextOut(sk_data->rsk.posX, sk_data->rsk.posY,DSPL_TXTATTR_CURRENT_MODE, sk_data->rsk.str);
	resources_restoreMnuColour();
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void softKeys_displayStrXY(char* leftSoftKey_str,char* rightSoftKey_str, int format, unsigned int colIndex, MfwRect* rect )
{
	MfwRect defRect;

	T_SK_DSPL_STRUCT sk_data;
	sk_data.lsk.str = leftSoftKey_str;
	sk_data.rsk.str = rightSoftKey_str;
	if (rect != NULL)
		sk_data.rect = rect;
	else
	{
		Mmi_layout_softkeyArea( &defRect );
		sk_data.rect = &defRect;
	}
	sk_data.lsk.posY = sk_data.rect->py + (sk_data.rect->sy-Mmi_layout_line_height())/2;
	sk_data.rsk.posY = sk_data.lsk.posY;
	sk_data.lsk.posX = sk_data.rect->px+LeftMargin;
	sk_data.rsk.posX = sk_data.rect->px+sk_data.rect->sx-RightMargin-dspl_GetTextExtent(sk_data.rsk.str, 0);

	softKeys_displayAll( &sk_data , format, colIndex);
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void softKeys_displayStr(char* leftSoftKey_str,char* rightSoftKey_str, int format, int unsigned colIndex)
{
	softKeys_displayStrXY(leftSoftKey_str, rightSoftKey_str,format,colIndex, NULL);
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void softKeys_displayId(int leftSoftKey,int rightSoftKey, int format, unsigned int colIndex)
{
	char *lsk,*rsk;
	lsk = MmiRsrcGetText(leftSoftKey);
	rsk = MmiRsrcGetText(rightSoftKey);
	softKeys_displayStrXY(lsk,rsk,format,colIndex,NULL);
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
//Old function - replace with calls to 'softKeys_displayId'
//GW 28/11/02 - Removed commented out code
void displaySoftKeys(int leftSoftKey,int rightSoftKey)
{
	char *lsk,*rsk;
	lsk = MmiRsrcGetText(leftSoftKey);
	rsk = MmiRsrcGetText(rightSoftKey);
	softKeys_displayStrXY(lsk,rsk,0, COLOUR_LIST_SUBMENU, NULL);
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void displaySoftKeysXY(int leftSoftKey,int rightSoftKey,int lskX,int rskX, int lpos)
{
	char *lsk,*rsk;
	MfwRect rect;

	lsk = MmiRsrcGetText(leftSoftKey);
	rsk = MmiRsrcGetText(rightSoftKey);
	rect.px = lskX;
	rect.py = lpos;
	rect.sx = rskX-lskX;
	rect.sy = Mmi_layout_softkeyHeight();
	softKeys_displayStrXY(lsk, rsk, 0,COLOUR_LIST_MAIN, &rect);
}


/*******************************************************************************

 $Function:    	displaySoftKeys_edition

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
void displaySoftKeys_edition(int leftSoftKey,int index, int rightSoftKey)
{
	char *lsk,*rsk, *ind;
	USHORT lpos;

	lsk = MmiRsrcGetText(leftSoftKey);
	ind = MmiRsrcGetText(index);
	rsk = MmiRsrcGetText(rightSoftKey);
	lpos = Mmi_layout_line(SECOND_LAST_LINE_TOP);

	dspl_TextOut(LeftMargin,lpos, 0,lsk);

	dspl_TextOut( 5 + dspl_GetTextExtent(lsk, (USHORT)strlen(lsk)) ,lpos, 0, ind);

	dspl_TextOut((mmiScrX-1)-RightMargin-dspl_GetTextExtent(rsk, (USHORT)strlen(rsk)),lpos ,0, rsk);
}


/*******************************************************************************

 $Function:    	displayCustSoftKeys

 $Description:	Display softkeys with text strings instead of text ID's

 $Returns:	None

 $Arguments:	LeftSoftKey -	char array to be displayed at the bottom-left of the display
		or NULL if no string is to be displayed
		RightSoftKey- 	char array to be displayed at the bottom-right of the display
		or NULL if no string is to be displayed

 $History
  GW 28/11/02 -

*******************************************************************************/
// SH - 25/5/01
// This function provided for WAP, to allow the printing of custom softkeys
// from strings provided.

void displayCustSoftKeys(char *LeftSoftKey, char *RightSoftKey)
{
	softKeys_displayStrXY(LeftSoftKey,RightSoftKey,0,COLOUR_LIST_MAIN, NULL);
}


/*******************************************************************************

 $Function:    	displayHelpSymbol

 $Description:	Displaying '?' to indicate to the user that help is available for a menu
                xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357

 $Returns:	None

 $Arguments:	None
*******************************************************************************/
void displayHelpSymbol(void)
{
    MfwRect defRect, rect;

    /* x0045876, 14-Aug-2006 (WR - "line_height" & "sk_data" was declared but never referenced) */
    /* U16 line_height;
    T_SK_DSPL_STRUCT sk_data; */
    Mmi_layout_softkeyArea( &defRect );
    rect.px = defRect.sx >> 1;
    rect.py = defRect.py + 4;
    resources_setSKColour(COLOUR_LIST_XX);
    //Display the symbol in the center between the softkeys
    dspl_TextOut(rect.px, rect.py, DSPL_TXTATTR_CURRENT_MODE, "?");
    resources_restoreMnuColour();
}