⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sublcdhistory.c

📁 MTK手机平台的MMI部分的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    }
#endif /* __MMI_UI_SMALL_SCREEN_SUPPORT__ */ 

    MMI_TRACE((MMI_TRACE_G1_FRM, MMI_FRM_INFO_SUBHIST_DEL_SUBLCD_SCR_HDLR, ScrId));

    if (!IsSubLCDScreenPresent(ScrId))
    {
        return ST_FAILURE;
    }

    count = NodeIndex;

    /* Locating the screen */
    while (count)
    {
        if (SubLCDHistoryData[count].scrnID == ScrId)
        {
            /*
             * Not support for stop callback at this funciton 
             * Because the application want to delete the special screen in the history,
             * we don't need to check the return value of the delete callback function.
             * the behavior is the same with DeleteScreenIfPresent()
             */
            ExecHistoryScrnCallBackHandle_ex(count, 0);
            break;
        }
        --count;
    }

    if (Status)
    {
        /* Shifting All the nodes by one notch */
        for (i = count + 1; i <= NodeIndex; i++, count++)
        {
            memcpy(&SubLCDHistoryData[count], &SubLCDHistoryData[i], sizeof(SubLCDHistoryNode));
        }

        --NodeIndex;
        memset(&SubLCDHistoryData[NodeIndex + 1], 0, sizeof(SubLCDHistoryNode));
    }
#endif /* __MMI_SUBLCD__ */ 
    return Status;
}


/*****************************************************************************
 * FUNCTION
 *  DeleteNSubLCDHistory
 * DESCRIPTION
 *  Deletes 'n' history nodes from current Sub LCDhistory index
 *  
 *  This shall pop 'n' history nodes without invoking
 *  entry functions of the deleted nodes
 * PARAMETERS
 *  DeleteCount     [IN]        
 *  n(?)            [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
void DeleteNSubLCDHistory(U16 DeleteCount)
{
#ifdef __MMI_SUBLCD__
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    S16 Count = 0;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/

#ifdef __MMI_UI_SMALL_SCREEN_SUPPORT__
    if (redraw_in_small_screen_proceduer())
    {
        return ;
    }
#endif /* __MMI_UI_SMALL_SCREEN_SUPPORT__ */ 

    MMI_TRACE((MMI_TRACE_G1_FRM, MMI_FRM_INFO_SUBHIST_DEL_SUBLCD_SCR_NUM, DeleteCount));

    if (NodeIndex >= DeleteCount)
    {
        /* To make sure the callback will run at topist screen */
        ExecTopScrnCallbackHandler_ex(0);

        for (Count = DeleteCount; Count >= 1; --Count)
        {
            /* JL, if want to stop to run next decrement will return true. */
            if (ExecHistoryScrnCallBackHandle_ex(NodeIndex, 0) == MMI_HIST_STOP_DELETING)
            {
                break;
            }
            DecrementSubLCD();
        }
    }
#endif /* __MMI_SUBLCD__ */ 
}


/*****************************************************************************
 * FUNCTION
 *  DeleteBeyondSubLCDScrTillScr
 * DESCRIPTION
 *  To delete scrns beyond scrn A
 *  till scrn B
 * PARAMETERS
 *  beyondScrnid        [IN]        
 *  tillScrnid          [IN]        
 *  scrnid1(?)          [IN]        
 *  scrnid2(?)          [IN]        
 * RETURNS
 *  U16 - status
 *****************************************************************************/
U8 DeleteBeyondSubLCDScrTillScr(U16 beyondScrnid, U16 tillScrnid)
{
    U8 Status = ST_SUCCESS;

#ifdef __MMI_SUBLCD__
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    S16 count = 0, count1 = 0;
    S16 endScreenPresent = -1, startScreenPresent = -1;
    U16 screensDeleted = 0;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/

#ifdef __MMI_UI_SMALL_SCREEN_SUPPORT__
    if (redraw_in_small_screen_proceduer())
    {
        return ST_SUCCESS;
    }
#endif /* __MMI_UI_SMALL_SCREEN_SUPPORT__ */ 

    MMI_TRACE((MMI_TRACE_G1_FRM, MMI_FRM_INFO_SUBHIST_DEL_BEYOND_TILL_SUBLCD_SCR_HDLR, beyondScrnid, tillScrnid));

    if (!IsSubLCDScreenPresent(beyondScrnid) || !IsSubLCDScreenPresent(tillScrnid))
    {
        return ST_FAILURE;
    }

    if (NodeIndex > 0)
    {
        count = NodeIndex;
        count1 = NodeIndex;
    }

    while (count)
    {
        if (SubLCDHistoryData[count].scrnID == beyondScrnid)
        {
            startScreenPresent = count;
        }
        if (SubLCDHistoryData[count].scrnID == tillScrnid)
        {
            MMI_ASSERT(startScreenPresent != -1);
            endScreenPresent = count;
            break;
        }
        --count;
    }
    MMI_ASSERT((startScreenPresent != -1) && (endScreenPresent != -1));

    for (count = startScreenPresent - 1; count >= endScreenPresent; count--)
    {
        if (ExecHistoryScrnCallBackHandle_ex(count, 0) == MMI_HIST_STOP_DELETING)
        {
            /*
             * The screen won't want to delete. 
             * We stop continue to delete the screens.
             */
            endScreenPresent = count + 1;
            Status = ST_FAILURE;
            break;
        }
        if (SubLCDHistoryData[count].guiBuffer)
        {
            OslMfree(SubLCDHistoryData[count].guiBuffer);
        }
        memset(&SubLCDHistoryData[count], 0, sizeof(SubLCDHistoryNode));
        NodeIndex--;
        screensDeleted++;
    }

    memcpy(
        SubLCDHistoryData + endScreenPresent,
        SubLCDHistoryData + startScreenPresent,
        sizeof(SubLCDHistoryNode) * (count1 - startScreenPresent + 1));
    memset(SubLCDHistoryData + (NodeIndex + 1), 0, (sizeof(SubLCDHistoryNode) * screensDeleted));
#endif /* __MMI_SUBLCD__ */ 
    return Status;
}


/*****************************************************************************
 * FUNCTION
 *  DeleteBetweenSubLCDScreen
 * DESCRIPTION
 *  Deletes Between two Screens including the boundaries
 * PARAMETERS
 *  StartScrId      [IN]        
 *  EndScrId        [IN]        
 * RETURNS
 *  U16 - status
 *****************************************************************************/
U16 DeleteBetweenSubLCDScreen(U16 StartScrId, U16 EndScrId)
{
    U8 Status = ST_SUCCESS;

#ifdef __MMI_SUBLCD__
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    S16 count = 0, count1 = 0;
    S16 endScreenPresent = -1, startScreenPresent = -1;
    U16 screensDeleted = 0;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/

#ifdef __MMI_UI_SMALL_SCREEN_SUPPORT__
    if (redraw_in_small_screen_proceduer())
    {
        return ST_SUCCESS;
    }
#endif /* __MMI_UI_SMALL_SCREEN_SUPPORT__ */ 

    MMI_TRACE((MMI_TRACE_G1_FRM, MMI_FRM_INFO_SUBHIST_DEL_BETWEEN_SUBLCD_SCR_HDLR, StartScrId, EndScrId));

    if (!IsSubLCDScreenPresent(StartScrId) || !IsSubLCDScreenPresent(EndScrId))
    {
        return ST_FAILURE;
    }

    if (NodeIndex > 0)
    {
        count = NodeIndex;
        count1 = NodeIndex;
    }

    while (count >= 0)
    {
        if (SubLCDHistoryData[count].scrnID == EndScrId)
        {
            startScreenPresent = count;
        }
        if (SubLCDHistoryData[count].scrnID == StartScrId)
        {
            endScreenPresent = count;
            break;
        }
        --count;
    }
    MMI_ASSERT((startScreenPresent != -1) && (endScreenPresent != -1));
    for (count = startScreenPresent; count >= endScreenPresent; count--)
    {
        if (ExecHistoryScrnCallBackHandle_ex(count, 0) == MMI_HIST_STOP_DELETING)
        {
            /*
             * The screen won't want to delete. 
             * We stop continue to delete the screens.
             */
            endScreenPresent = count + 1;
            Status = ST_FAILURE;
            break;
        }
        if (SubLCDHistoryData[count].guiBuffer)
        {
            OslMfree(SubLCDHistoryData[count].guiBuffer);
        }
        memset(&SubLCDHistoryData[count], 0, sizeof(SubLCDHistoryNode));
        NodeIndex--;
        screensDeleted++;
    }

    memcpy(
        SubLCDHistoryData + endScreenPresent,
        SubLCDHistoryData + startScreenPresent + 1,
        sizeof(SubLCDHistoryNode) * (count1 - startScreenPresent + 1));
    memset(SubLCDHistoryData + (NodeIndex + 1), 0, (sizeof(SubLCDHistoryNode) * screensDeleted));

#endif /* __MMI_SUBLCD__ */ 
    return Status;
}


/*****************************************************************************
 * FUNCTION
 *  SubLCDHistoryReplace
 * DESCRIPTION
 *  To replace a specific history
 *  
 *  HistoryReplace will be used for a exist history
 * PARAMETERS
 *  out_scrn_id     [IN]        
 *  in_scrn_id      [IN]        
 *  in_src_func     [IN]        
 * RETURNS
 *  pBool
 *****************************************************************************/
pBOOL SubLCDHistoryReplace(U16 out_scrn_id, U16 in_scrn_id, FuncPtr in_src_func)
{
#ifdef __MMI_SUBLCD__

    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    S16 count = 0;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/

    MMI_TRACE((MMI_TRACE_G1_FRM, MMI_FRM_INFO_SUBHIST_REPLACE_SUBLCD_SCR_HDLR, out_scrn_id, in_scrn_id, in_src_func));

    for (count = 0; ((count < MAX_SUBLCD_HISTORY) && ((count <= NodeIndex) && (NodeIndex != -1))); count++)
    {
        /* Find the matched source history and then to write into destinate history */
        if (SubLCDHistoryData[count].scrnID == out_scrn_id)
        {
            ClearDelScrnIDCallbackHandler(out_scrn_id, NULL);
            SubLCDHistoryData[count].scrnID = in_scrn_id;
            SubLCDHistoryData[count].entryFuncPtr = in_src_func;
            if (SubLCDHistoryData[count].guiBuffer)
            {
                OslMfree(SubLCDHistoryData[count].guiBuffer);
            }
            SubLCDHistoryData[count].guiBuffer = NULL;
            SubLCDHistoryData[count].guiLen = 0;
            return MMI_TRUE;
        }
    }
#endif /* __MMI_SUBLCD__ */ 
    return MMI_FALSE;

}


/*****************************************************************************
 * FUNCTION
 *  IsSubLCDScreenPresent
 * DESCRIPTION
 *  Queries history for presence of a screen Id in sub-LCD history
 * PARAMETERS
 *  scrnId          [IN]        
 *  scrnid(?)       [IN]        
 * RETURNS
 *  pBOOL
 *****************************************************************************/
pBOOL IsSubLCDScreenPresent(U16 scrnId)
{
#ifdef __MMI_SUBLCD__
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    S16 count;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    for (count = 0; ((count < MAX_SUBLCD_HISTORY) && ((count <= NodeIndex) && (NodeIndex != -1))); count++)
    {
        if (SubLCDHistoryData[count].scrnID == scrnId)
        {
            return TRUE;
        }
    }
#endif /* __MMI_SUBLCD__ */ 

    return FALSE;
}


/*****************************************************************************
 * FUNCTION
 *  GetCurrSubLCDScreenExitFunc
 * DESCRIPTION
 *  Queries present screen exit function
 * PARAMETERS
 *  void
 * RETURNS
 *  FuncPtr
 *****************************************************************************/
FuncPtr GetCurrSubLCDScreenExitFunc(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
#ifdef __MMI_SUBLCD__
    return gCurrExitSubLCDFn;
#endif 
    return 0;
}


/*****************************************************************************
 * FUNCTION
 *  GetCurrSubLCDScreenEntryFunc
 * DESCRIPTION
 *  Queries current screen entry function
 * PARAMETERS
 *  void
 * RETURNS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -