📄 o_display.c
字号:
/* **************************************************************************************
* Copyright (c) 2005 ZORAN Corporation, All Rights Reserved
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
*
* File: $Workfile: o_display.c$
*
* Description:
* ========
* This component shows status information on the current disc. For a DVD, for example,
* the current title, chapter, audio selection, etc., will be displayed on the
* screen. This component is divided into 8 locations. The information
* displayed in each location depends on the disc type.
****************************************************************************************/
#include "Config.h" // Global Configuration - do not remove!
#ifdef D_GUI_COMPONENT_DISPLAY
#include "include\sysdefs.h" // Global definition - do not remove!
/****************************************************************************************************
* INCLUDE FILES
****************************************************************************************************/
// Include project specific
#include "CoreAPI\CoreAPI.h"
#include "GUI\Menu_system\ms_display.h"
#include "GUI\Menu_system\ms_component.h"
#include "GUI\Menu_system\ms_container.h"
#include "GUI\Menu_system\ms_menu.h"
#include "GUI\Menu_system\ms_screen.h"
#include "GUI\Menu_system\ms_object.h"
#include "Strings\Strings.h"
//#include "DispInfo\DisplayInfo.h"
#include "Library\String_generate.h"
#include "GUI\Object_class\Text\mso_text.h"
#include "GUI\Object_class\Message\mso_message.h"
#include "Components\Message\o_message_device.h"
#include "Components\Display\o_display.h"
#include "GUI\Resource\Bitmap\bitmap.h"
#include "Menu\menu_operation_def.h"
#include "Menu_config\menu_config_common.h"
#ifdef D_GINGER_I86
#include "decoder\osdlayou.h"
#endif //D_GINGER_I86
#ifdef D_GINGER_I96
#include "Osdlayou.h"
#endif //D_GINGER_I96
//#include "decoder\dec_defs.h"
//#include "drive\drv_api.h"
//#include "Version.h"
//#include "drive_setting\feversion.h"
//#include "Playcore\coremain\version.h"
//#include "Playcore\nav_dvd\header\version.h"
//#include "Drive\drv_api.h"
// Include configuration header file: named constants, macros and typedefs.
#include "Components\Display\o_display_config.h"
// Include custom header file: customer specific definitions, over-writing common ones.
#include "Components\Custom\Display\o_display_custom.h"
/****************************************************************************************************
* DECLARATION: Private (static) functions
****************************************************************************************************/
// The function to handle OPs at the container level:
static MS_OP _ComponentOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam);
static void _GetTimeStr(FORMATED_UNICODE_STRING __NEAR* pFormUniStr, UINT32 lParam);
static void _GetDiscTypeStr(FORMATED_UNICODE_STRING __NEAR* pFormUniStr, UINT32 lParam);
#ifdef DVD_VR_SUPPORT
static void _GetDiscNameStr(FORMATED_UNICODE_STRING __NEAR* pFormUniStr, UINT32 lParam);
static void _GetORGTitleStr(FORMATED_UNICODE_STRING __NEAR* pFormUniStr, UINT32 lParam);
static void _GetORGTitleValueStr(FORMATED_UNICODE_STRING __NEAR* pFormUniStr, UINT32 lParam);
#endif//DVD_VR_SUPPORT
static MS_OP _PPTextTickOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam);
// This function is used to display the bitmap used as the menu background:
static BOOL _ComponentFillOsdSeg(MSO_OBJECT __NEAR* pThis, MS_AREA __NEAR* pThisAbsArea);
static BOOL _IsDisplayRefreshAllowed(void);
BOOL _DisplayCurrInfo(MSO_OBJECT __NEAR* pThis);
#ifdef D_GUI_SINGLE_LINE_COMPONENT
void _GetAvailableIndex(MSO_OBJECT __NEAR* pThis);
BOOL _IsAudioEmpty(void);
BOOL _IsSubTitleEmpty(void);
BOOL _IsAngleEmpty(void);
#endif //D_GUI_SINGLE_LINE_COMPONENT
/**************************************************************************
* Display functions
***************************************************************************/
/***************************************************************************************
* Include customization file.
****************************************************************************************/
// Include custom code file: customer specific code, over-writing common one.
#include "Components\Custom\Display\o_display_custom.c"
// Include configuration file: constants.
#include "Components\Display\o_display_config.c"
/**************************************************************************
* Utility functions
***************************************************************************/
static BOOL _IsDisplayRefreshAllowed(void)
{
if (MEDIA_TYPE_CLIPS == CoreAPI_GetCurrentMediaType())
{
// When Mp3 track in play select Jpeg track to play, Display component will call CoreAPI_GetCurrentClipType()
// it will retrurn Mp3 type first, but CoreAPI_GetListActiveClipType will be jpeg, In single mode, will make display mess,
// so need to wait two funtion return same value, then make the display component visible.
if ((PST_STOP != CoreAPI_GetPlayState())
&& (CoreAPI_GetListActiveClipType() == CoreAPI_GetCurrentClipType())
&& !CoreAPI_IsFileLoading())
return TRUE;
else
return FALSE;
}
else
return TRUE;
}
/**************************************************************************
* Operation functions
***************************************************************************/
/**************************************************************************
* Function :
* In :
* Out :
* Desc :
***************************************************************************/
static MS_OP _ComponentOperation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
MSO_OBJECT __NEAR *pObject;
UINT16 wAttr;
MS_OP *pMsOp;
#ifdef D_GUI_SINGLE_LINE_COMPONENT
MSO_DISPLAY __NEAR* pDisObject = (MSO_DISPLAY __NEAR*)pThis;
MSO_OBJECT __NEAR* PPos1Object = MS_FindDescendant(pThis, &VALUE_OBJECT_DESCRIPTOR(1));
#endif //D_GUI_SINGLE_LINE_COMPONENT
MsOp = MS_ComponentBasicOperation(pThis, MsOp, lParam);
// Post-processing:
switch(MsOp)
{
case MS_OP_TICK:
if (!CoreAPI_IsMenuAllowedDisplay())
{
MS_SendOperation(pThis, MS_OP_CLOSE_PARENT, 0);
break;
}
if (MEDIA_TYPE_CLIPS == CoreAPI_GetCurrentMediaType())
{
if (_IsDisplayRefreshAllowed())
{
if (MS_IsInvisible(pThis))
{
#ifdef D_GUI_SINGLE_LINE_COMPONENT
if ( eClipType_JPEG == CoreAPI_GetCurrentClipType())
{
PPos1Object ->moArea.mwW = COL_JPEG_WIDTH;
pDisObject ->mParam.mwCurrItemNum = DIS_TITLE_CHAPTER;
}
else
{
PPos1Object ->moArea.mwW = COL_2_WIDTH;
pDisObject ->mParam.mwCurrItemNum = DIS_ELAPSED_TIME;
}
_DisplayCurrInfo(pThis);
#endif //D_GUI_SINGLE_LINE_COMPONENT
MS_ClearInvisible(pThis);
MS_DisplayAddObject(pThis);
}
}
else if(!(eListActive == CoreAPI_GetListPlayState() || eListTransitionToActive == CoreAPI_GetListPlayState())) // avoid jpeg blinking
{
// Such track type different switch. such as switch Mpeg to Jpeg.
if (!MS_IsInvisible(pThis))
{
MS_SetInvisible(pThis);
MS_DisplayAddObject(pThis);
}
}
}
break;
case MS_OP_ON_DEFROST:
if (MEDIA_TYPE_CLIPS == CoreAPI_GetCurrentMediaType())
{
if (!MS_IsInvisible(pThis))
{
MS_SetInvisible(pThis);
MS_DisplayAddObject(pThis);
}
}
break;
case MS_OP_INIT:
{
wAttr = MS_ATTR_UPDATE_TICK_START_COUNT;
for(pObject = ((MSO_COMPONENT __NEAR*)pThis)->mpOlist; pObject != NULL;pObject = pObject->mpNext)
{
pObject->mwAttr = ((pObject->mwAttr & ~MS_ATTR_TICK_MASK) | wAttr);
wAttr = (wAttr & ~MS_ATTR_TICK_MASK) |((wAttr & MS_ATTR_TICK_MASK) << 1);
if((wAttr & MS_ATTR_TICK_MASK) == NUMBER_OF_TICKS_PER_UPDATE)
{
wAttr = MS_ATTR_UPDATE_TICK_START_COUNT;
}
}
#ifdef D_GUI_SINGLE_LINE_COMPONENT
if ( eClipType_JPEG == CoreAPI_GetCurrentClipType())
{
PPos1Object ->moArea.mwW = COL_JPEG_WIDTH;
pDisObject ->mParam.mwCurrItemNum = DIS_TITLE_CHAPTER;
}
else
{
PPos1Object ->moArea.mwW = COL_2_WIDTH;
pDisObject ->mParam.mwCurrItemNum = DIS_ELAPSED_TIME;
}
_DisplayCurrInfo(pThis);
pDisObject->mParam.mwCurrItemNum++;
#endif //D_GUI_SINGLE_LINE_COMPONENT
}
break;
case MS_OP_DISPLAY:
{
#ifdef D_GUI_SINGLE_LINE_COMPONENT
_GetAvailableIndex(pThis);
#endif// D_GUI_SINGLE_LINE_COMPONENT
//If nothing else to display, then close component
if (_DisplayCurrInfo(pThis))
{
#ifdef D_GUI_SINGLE_LINE_COMPONENT
pDisObject->mParam.mwCurrItemNum++;
#endif //D_GUI_SINGLE_LINE_COMPONENT
MS_DisplayAddObject(pThis);
return MS_OP_NONE;
}
MS_SendOperation(pThis, MS_OP_CLOSE_PARENT, 0);
}
return MsOp;
case MS_OP_IS_MSG_DISPLAYED:
// Which message is being asked about?
pMsOp = (MS_OP*)lParam;
// The ones in this switch statement are the only
// ones the might be handled by this component.
switch(*pMsOp)
{
case MS_OP_MSG_SYS_AUDIO:
// This is displayed for DVD and AVI
switch(CoreAPI_GetCurrentMediaType())
{
case MEDIA_TYPE_DVD_VIDEO: // FALL THRU
#ifdef DVD_AUDIO_SUPPORT
case MEDIA_TYPE_DVD_AUDIO:
#endif
#ifdef DVD_VR_SUPPORT
case MEDIA_TYPE_DVDVR:
#endif
{
*pMsOp = MS_OP_NONE;
}
break;
case MEDIA_TYPE_CLIPS:
{
if ((eClipType_AVI == CoreAPI_GetCurrentClipType())
#ifdef IS_MP4_CAPABLE
|| (eClipType_MP4 == CoreAPI_GetCurrentClipType())
#endif
)
*pMsOp = MS_OP_NONE;
}
break;
}
break;
case MS_OP_MSG_SYS_SUBTITLE:
// This is displayed for DVD and AVI
switch(CoreAPI_GetCurrentMediaType())
{
case MEDIA_TYPE_DVD_VIDEO: // FALL THRU
#ifdef DVD_VR_SUPPORT
case MEDIA_TYPE_DVDVR:
#endif
{
*pMsOp = MS_OP_NONE;
}
break;
case MEDIA_TYPE_CLIPS:
{
if ((eClipType_AVI == CoreAPI_GetCurrentClipType())
#ifdef IS_MP4_CAPABLE
|| (eClipType_MP4 == CoreAPI_GetCurrentClipType())
#endif
)
*pMsOp = MS_OP_NONE;
}
break;
}
break;
case MS_OP_MSG_SYS_ANGLE:
// This is displayed for DVD and AVI
switch(CoreAPI_GetCurrentMediaType())
{
case MEDIA_TYPE_DVD_VIDEO: // FALL THRU
{
*pMsOp = MS_OP_NONE;
}
break;
case MEDIA_TYPE_CLIPS:
{
if ((eClipType_AVI == CoreAPI_GetCurrentClipType())
#ifdef IS_MP4_CAPABLE
|| (eClipType_MP4 == CoreAPI_GetCurrentClipType())
#endif
)
*pMsOp = MS_OP_NONE;
}
break;
}
break;
#ifdef DVD_AUDIO_SUPPORT
case MS_OP_MSG_SYS_DVDA_PAGE:
// This is displayed for DVDA
switch(CoreAPI_GetCurrentMediaType())
{
case MEDIA_TYPE_DVD_AUDIO:
*pMsOp = MS_OP_NONE;
break;
}
break;
#endif
}
break;
}
return(MsOp);
}
/**************************************************************************
* Function : _DisplayCurrInfo
* In :
* Out :
* Desc :
***************************************************************************/
#ifdef D_GUI_SINGLE_LINE_COMPONENT
void _GetAvailableIndex(MSO_OBJECT __NEAR* pThis)
{
MSO_DISPLAY __NEAR* pObject = (MSO_DISPLAY __NEAR*)pThis;
if (pObject->mParam.mwCurrItemNum == DIS_AUDIO_DISPLAY)
{
//If Audio no information no need to display.
if (_IsAudioEmpty())
pObject->mParam.mwCurrItemNum++;
}
if(pObject->mParam.mwCurrItemNum == DIS_SUBTITLE_DISPLAY)
{
//If subtitle and Angle empty no need to display.
if (_IsSubTitleEmpty())
pObject->mParam.mwCurrItemNum++;
}
if(pObject->mParam.mwCurrItemNum == DIS_ANGLE_DISPLAY)
{
//If subtitle and Angle empty no need to display.
if (_IsAngleEmpty())
pObject->mParam.mwCurrItemNum++;
}
}
#endif //D_GUI_SINGLE_LINE_COMPONENT
/**************************************************************************
* Function : _DisplayCurrInfo
* In :
* Out :
* Desc :
***************************************************************************/
#pragma argsused
BOOL _DisplayCurrInfo(MSO_OBJECT __NEAR* pThis)
{
#ifdef D_GUI_SINGLE_LINE_COMPONENT
MSO_DISPLAY __NEAR* pObject = (MSO_DISPLAY __NEAR*)pThis;
//TODO if current information is empty will check next, do (pObject->mParam.mwCurrItemNum++).
switch(pObject->mParam.mwCurrItemNum)
{
case DIS_ELAPSED_TIME:
{
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oCurrentTimeTxtDescriptor));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oElapseTimeTitleDescriptor));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(1)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(1)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(2)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(2)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(3)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(3)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(5)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(5)));
break;
}
case DIS_TITLE_CHAPTER:
{
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oCurrentTimeTxtDescriptor));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oElapseTimeTitleDescriptor));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(1)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(1)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(2)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(2)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(3)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(3)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(5)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(5)));
break;
}
case DIS_AUDIO_DISPLAY:
{
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oCurrentTimeTxtDescriptor));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oElapseTimeTitleDescriptor));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(1)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(1)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(2)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(2)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(3)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(3)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(5)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(5)));
break;
}
case DIS_SUBTITLE_DISPLAY:
{
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oCurrentTimeTxtDescriptor));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oElapseTimeTitleDescriptor));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(1)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(1)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(2)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(2)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(3)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(3)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(4)));
MS_ClearInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(4)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&TEXT_OBJECT_DESCRIPTOR(5)));
MS_SetInvisible(MS_FindObjectFromDescriptor( (MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&VALUE_OBJECT_DESCRIPTOR(5)));
break;
}
case DIS_ANGLE_DISPLAY:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -