Gerbview: fix a crash when trying to edit hotkeys. Add a few missing hotkeys.

Very minor coding style issue fix in hotkey code (pl_editor and gerbview).
Fix a compil error  using c++11 option for painstaking compilers
This commit is contained in:
jean-pierre charras 2015-04-19 20:41:57 +02:00
parent 016eef39e4
commit 1c6ae1eac7
15 changed files with 90 additions and 60 deletions

View File

@ -128,7 +128,7 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
case ID_NOCONN_BUTT:
if( ( item == NULL ) || ( item->GetFlags() == 0 ) )
{
if( false == GetScreen()->GetItem( gridPosition, 0, SCH_NO_CONNECT_T ) )
if( GetScreen()->GetItem( gridPosition, 0, SCH_NO_CONNECT_T ) == NULL )
{
SCH_NO_CONNECT* no_connect = AddNoConnect( aDC, gridPosition );
SetRepeatItem( no_connect );
@ -145,7 +145,7 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
case ID_JUNCTION_BUTT:
if( ( item == NULL ) || ( item->GetFlags() == 0 ) )
{
if( false == GetScreen()->GetItem( gridPosition, 0, SCH_JUNCTION_T ) )
if( GetScreen()->GetItem( gridPosition, 0, SCH_JUNCTION_T ) == NULL )
{
SCH_JUNCTION* junction = AddJunction( aDC, gridPosition, true );
SetRepeatItem( junction );

View File

@ -140,7 +140,7 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
// Must be called before creating the main frame in order to
// display the real hotkeys in menus or tool tips
ReadHotkeyConfig( GERBVIEW_FRAME_NAME, s_Gerbview_Hokeys_Descr );
ReadHotkeyConfig( GERBVIEW_FRAME_NAME, GerbviewHokeysDescr );
return true;
}

View File

@ -55,21 +55,21 @@ void GERBVIEW_FRAME::Process_Config( wxCommandEvent& event )
{
// Hotkey IDs
case ID_PREFERENCES_HOTKEY_EXPORT_CONFIG:
ExportHotkeyConfigToFile( s_Gerbview_Hokeys_Descr, wxT( "gerbview" ) );
ExportHotkeyConfigToFile( GerbviewHokeysDescr, wxT( "gerbview" ) );
break;
case ID_PREFERENCES_HOTKEY_IMPORT_CONFIG:
ImportHotkeyConfigFromFile( s_Gerbview_Hokeys_Descr, wxT( "gerbview" ) );
ImportHotkeyConfigFromFile( GerbviewHokeysDescr, wxT( "gerbview" ) );
break;
case ID_PREFERENCES_HOTKEY_SHOW_EDITOR:
InstallHotkeyFrame( this, s_Gerbview_Hokeys_Descr );
InstallHotkeyFrame( this, GerbviewHokeysDescr );
break;
case ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST:
// Display current hotkey list for GerbView.
DisplayHotkeyList( this, s_Gerbview_Hokeys_Descr );
DisplayHotkeyList( this, GerbviewHokeysDescr );
break;
default:

View File

@ -80,7 +80,7 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent ):
m_showAxis = true; // true to show X and Y axis on screen
m_showBorderAndTitleBlock = false; // true for reference drawings.
m_HotkeysZoomAndGridList = s_Gerbview_Hokeys_Descr;
m_HotkeysZoomAndGridList = GerbviewHokeysDescr;
m_SelLayerBox = NULL;
m_DCodeSelector = NULL;
m_displayMode = 0;
@ -874,7 +874,7 @@ void GERBVIEW_FRAME::UpdateStatusBar()
case UNSCALED_UNITS:
absformatter = wxT( "X %f Y %f" );
locformatter = wxT( "dx %f dy %f d %f" );
locformatter = wxT( "dx %f dy %f dist %f" );
break;
case DEGREES:

View File

@ -35,6 +35,7 @@
#include <gerbview_frame.h>
#include <class_drawpanel.h>
#include <hotkeys.h>
#include <gerbview_id.h>
/* How to add a new hotkey:
@ -58,27 +59,31 @@
// local variables
// Hotkey list:
static EDA_HOTKEY HkResetLocalCoord( wxT( "Reset Local Coordinates" ), HK_RESET_LOCAL_COORD, ' ' );
static EDA_HOTKEY HkSetGridOrigin( wxT("Set Grid Origin"), HK_SET_GRID_ORIGIN, 'S' );
static EDA_HOTKEY HkZoomAuto( _HKI( "Zoom Auto" ), HK_ZOOM_AUTO, WXK_HOME );
static EDA_HOTKEY HkZoomCenter( _HKI( "Zoom Center" ), HK_ZOOM_CENTER, WXK_F4 );
static EDA_HOTKEY HkZoomRedraw( _HKI( "Zoom Redraw" ), HK_ZOOM_REDRAW, WXK_F3 );
static EDA_HOTKEY HkZoomOut( _HKI( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 );
static EDA_HOTKEY HkZoomIn( _HKI( "Zoom In" ), HK_ZOOM_IN, WXK_F1 );
static EDA_HOTKEY HkHelp( _HKI( "Help (this window)" ), HK_HELP, '?' );
static EDA_HOTKEY HkSwitchUnits( _HKI( "Switch Units" ), HK_SWITCH_UNITS, 'U' );
static EDA_HOTKEY HkResetLocalCoord( _HKI( "Reset Local Coordinates" ), HK_RESET_LOCAL_COORD, ' ' );
static EDA_HOTKEY HkZoomAuto( wxT( "Zoom Auto" ), HK_ZOOM_AUTO, WXK_HOME );
static EDA_HOTKEY HkZoomCenter( wxT( "Zoom Center" ), HK_ZOOM_CENTER, WXK_F4 );
static EDA_HOTKEY HkZoomRedraw( wxT( "Zoom Redraw" ), HK_ZOOM_REDRAW, WXK_F3 );
static EDA_HOTKEY HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 );
static EDA_HOTKEY HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 );
static EDA_HOTKEY HkHelp( wxT( "Help (this window)" ), HK_HELP, '?' );
static EDA_HOTKEY HkSwitchUnits( wxT( "Switch Units" ), HK_SWITCH_UNITS, 'U' );
static EDA_HOTKEY HkTrackDisplayMode( wxT( "Track Display Mode" ), HK_SWITCH_GBR_ITEMS_DISPLAY_MODE, 'F' );
static EDA_HOTKEY HkLinesDisplayMode( _HKI( "Gbr Lines Display Mode" ), HK_GBR_LINES_DISPLAY_MODE, 'L' );
static EDA_HOTKEY HkFlashedDisplayMode( _HKI( "Gbr Flashed Display Mode" ), HK_GBR_FLASHED_DISPLAY_MODE, 'F' );
static EDA_HOTKEY HkPolygonDisplayMode( _HKI( "Gbr Polygons Display Mode" ), HK_GBR_POLYGON_DISPLAY_MODE, 'P' );
static EDA_HOTKEY HkNegativeObjDisplayMode( _HKI( "Gbr Negative Obj Display Mode" ), HK_GBR_NEGATIVE_DISPLAY_ONOFF, 'N' );
static EDA_HOTKEY HkDCodesDisplayMode( _HKI( "DCodes Display Mode" ), HK_GBR_DCODE_DISPLAY_ONOFF, 'D' );
static EDA_HOTKEY HkSwitch2NextCopperLayer( wxT( "Switch to Next Layer" ), HK_SWITCH_LAYER_TO_NEXT, '+' );
static EDA_HOTKEY HkSwitch2PreviousCopperLayer( wxT( "Switch to Previous Layer" ), HK_SWITCH_LAYER_TO_PREVIOUS, '-' );
static EDA_HOTKEY HkSwitch2NextCopperLayer( _HKI( "Switch to Next Layer" ), HK_SWITCH_LAYER_TO_NEXT, '+' );
static EDA_HOTKEY HkSwitch2PreviousCopperLayer( _HKI( "Switch to Previous Layer" ), HK_SWITCH_LAYER_TO_PREVIOUS, '-' );
// List of common hotkey descriptors
EDA_HOTKEY* s_Gerbview_Hotkey_List[] = {
EDA_HOTKEY* gerbviewHotkeyList[] = {
&HkHelp,
&HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter,
&HkZoomAuto, &HkSwitchUnits, &HkResetLocalCoord, &HkSetGridOrigin,
&HkTrackDisplayMode,
&HkZoomAuto, &HkSwitchUnits, &HkResetLocalCoord,
&HkLinesDisplayMode, &HkFlashedDisplayMode, &HkPolygonDisplayMode,
&HkDCodesDisplayMode, &HkNegativeObjDisplayMode,
&HkSwitch2NextCopperLayer,
&HkSwitch2PreviousCopperLayer,
NULL
@ -87,15 +92,20 @@ EDA_HOTKEY* s_Gerbview_Hotkey_List[] = {
// list of sections and corresponding hotkey list for GerbView (used to create an hotkey
// config file)
struct EDA_HOTKEY_CONFIG s_Gerbview_Hokeys_Descr[] =
static wxString gerbviewSectionTag( wxT( "[gerbview]" ) );
static wxString gerbviewSectionTitle( _HKI( "Gerbview Hotkeys" ) );
struct EDA_HOTKEY_CONFIG GerbviewHokeysDescr[] =
{
{ &g_CommonSectionTag, s_Gerbview_Hotkey_List, NULL },
{ &gerbviewSectionTag, gerbviewHotkeyList, &gerbviewSectionTitle },
{ NULL, NULL, NULL }
};
bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem )
{
#define CHANGE( x ) ( x ) = not (x )
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetEventObject( this );
@ -104,7 +114,7 @@ bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') )
aHotkeyCode += 'A' - 'a';
EDA_HOTKEY * HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_Gerbview_Hotkey_List );
EDA_HOTKEY * HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, gerbviewHotkeyList );
if( HK_Descr == NULL )
return false;
@ -116,7 +126,7 @@ bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
return false;
case HK_HELP: // Display Current hotkey list
DisplayHotkeyList( this, s_Gerbview_Hokeys_Descr );
DisplayHotkeyList( this, GerbviewHokeysDescr );
break;
case HK_ZOOM_IN:
@ -148,16 +158,32 @@ bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
GetScreen()->m_O_Curseur = GetCrossHairPosition();
break;
case HK_SET_GRID_ORIGIN:
SetGridOrigin( GetCrossHairPosition() );
break;
case HK_SWITCH_UNITS:
g_UserUnit = (g_UserUnit == INCHES ) ? MILLIMETRES : INCHES;
break;
case HK_SWITCH_GBR_ITEMS_DISPLAY_MODE:
m_DisplayOptions.m_DisplayLinesFill = not m_DisplayOptions.m_DisplayLinesFill;
case HK_GBR_LINES_DISPLAY_MODE:
CHANGE( m_DisplayOptions.m_DisplayLinesFill );
m_canvas->Refresh();
break;
case HK_GBR_FLASHED_DISPLAY_MODE:
CHANGE( m_DisplayOptions.m_DisplayFlashedItemsFill );
m_canvas->Refresh( true );
break;
case HK_GBR_POLYGON_DISPLAY_MODE:
CHANGE( m_DisplayOptions.m_DisplayPolygonsFill );
m_canvas->Refresh();
break;
case HK_GBR_NEGATIVE_DISPLAY_ONOFF:
SetElementVisibility( NEGATIVE_OBJECTS_VISIBLE, not IsElementVisible( NEGATIVE_OBJECTS_VISIBLE ) );
m_canvas->Refresh();
break;
case HK_GBR_DCODE_DISPLAY_ONOFF:
SetElementVisibility( DCODES_VISIBLE, not IsElementVisible( DCODES_VISIBLE ) );
m_canvas->Refresh();
break;

View File

@ -36,12 +36,16 @@
// for shared hotkeys id
enum hotkey_id_commnand {
HK_SWITCH_UNITS = HK_COMMON_END,
HK_SWITCH_GBR_ITEMS_DISPLAY_MODE,
HK_GBR_LINES_DISPLAY_MODE,
HK_GBR_FLASHED_DISPLAY_MODE,
HK_GBR_POLYGON_DISPLAY_MODE,
HK_GBR_NEGATIVE_DISPLAY_ONOFF,
HK_GBR_DCODE_DISPLAY_ONOFF,
HK_SWITCH_LAYER_TO_NEXT,
HK_SWITCH_LAYER_TO_PREVIOUS
};
// List of hotkey descriptors for GerbView.
extern struct EDA_HOTKEY_CONFIG s_Gerbview_Hokeys_Descr[];
extern struct EDA_HOTKEY_CONFIG GerbviewHokeysDescr[];
#endif // GERBVIEW_KOTKEYS_H_

View File

@ -44,6 +44,7 @@ void GERBVIEW_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
{
int id = event.GetId();
bool state;
switch( id )
{
case ID_MENU_GERBVIEW_SHOW_HIDE_LAYERS_MANAGER_DIALOG:

View File

@ -74,16 +74,16 @@ void GERBVIEW_FRAME::ReCreateHToolbar( void )
_( "Print layers" ) );
m_mainToolBar->AddSeparator();
msg = AddHotkeyName( _( "Zoom in" ), s_Gerbview_Hokeys_Descr, HK_ZOOM_IN, IS_COMMENT );
msg = AddHotkeyName( _( "Zoom in" ), GerbviewHokeysDescr, HK_ZOOM_IN, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_IN, wxEmptyString, KiBitmap( zoom_in_xpm ), msg );
msg = AddHotkeyName( _( "Zoom out" ), s_Gerbview_Hokeys_Descr, HK_ZOOM_OUT, IS_COMMENT );
msg = AddHotkeyName( _( "Zoom out" ), GerbviewHokeysDescr, HK_ZOOM_OUT, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_OUT, wxEmptyString, KiBitmap( zoom_out_xpm ), msg );
msg = AddHotkeyName( _( "Redraw view" ), s_Gerbview_Hokeys_Descr, HK_ZOOM_REDRAW, IS_COMMENT );
msg = AddHotkeyName( _( "Redraw view" ), GerbviewHokeysDescr, HK_ZOOM_REDRAW, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_REDRAW, wxEmptyString, KiBitmap( zoom_redraw_xpm ), msg );
msg = AddHotkeyName( _( "Zoom auto" ), s_Gerbview_Hokeys_Descr, HK_ZOOM_AUTO, IS_COMMENT );
msg = AddHotkeyName( _( "Zoom auto" ), GerbviewHokeysDescr, HK_ZOOM_AUTO, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_PAGE, wxEmptyString, KiBitmap( zoom_fit_in_page_xpm ), msg );
m_mainToolBar->AddSeparator();

View File

@ -118,7 +118,7 @@ static wxString commonSectionTitle( _HKI( "Common" ) );
static wxString s_PlEditorSectionTag( wxT( "[pl_editor]" ) );
static wxString s_PlEditorSectionTitle( _HKI( "Page Layout Editor" ) );
struct EDA_HOTKEY_CONFIG s_PlEditor_Hokeys_Descr[] =
struct EDA_HOTKEY_CONFIG PlEditorHokeysDescr[] =
{
{ &g_CommonSectionTag, s_Common_Hotkey_List, &commonSectionTitle },
{ &s_PlEditorSectionTag, s_PlEditor_Hotkey_List, &s_PlEditorSectionTitle },
@ -163,7 +163,7 @@ bool PL_EDITOR_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode,
break;
case HK_HELP: // Display Current hotkey list
DisplayHotkeyList( this, s_PlEditor_Hokeys_Descr );
DisplayHotkeyList( this, PlEditorHokeysDescr );
break;
case HK_UNDO:

View File

@ -46,6 +46,6 @@ enum hotkey_id_commnand {
};
// List of hotkey descriptors for PlEditor.
extern struct EDA_HOTKEY_CONFIG s_PlEditor_Hokeys_Descr[];
extern struct EDA_HOTKEY_CONFIG PlEditorHokeysDescr[];
#endif // PL_EDITOR_KOTKEYS_H_

View File

@ -80,7 +80,7 @@ bool PL_EDITOR_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* aPopMenu )
{
if( (item->GetFlags() & LOCATE_STARTPOINT) )
{
msg = AddHotkeyName( _( "Move Start Point" ), s_PlEditor_Hokeys_Descr,
msg = AddHotkeyName( _( "Move Start Point" ), PlEditorHokeysDescr,
HK_MOVE_START_POINT );
AddMenuItem( aPopMenu, ID_POPUP_ITEM_MOVE_START_POINT, msg,
KiBitmap( move_xpm ) );
@ -88,19 +88,19 @@ bool PL_EDITOR_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* aPopMenu )
if( (item->GetFlags() & LOCATE_ENDPOINT ) )
{
msg = AddHotkeyName( _( "Move End Point" ), s_PlEditor_Hokeys_Descr,
msg = AddHotkeyName( _( "Move End Point" ), PlEditorHokeysDescr,
HK_MOVE_END_POINT );
AddMenuItem( aPopMenu, ID_POPUP_ITEM_MOVE_END_POINT, msg,
KiBitmap( move_xpm ) );
}
msg = AddHotkeyName( _( "Move Item" ), s_PlEditor_Hokeys_Descr,
msg = AddHotkeyName( _( "Move Item" ), PlEditorHokeysDescr,
HK_MOVE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_ITEM_MOVE, msg,
KiBitmap( move_xpm ) );
aPopMenu->AppendSeparator();
msg = AddHotkeyName( _( "Delete" ), s_PlEditor_Hokeys_Descr,
msg = AddHotkeyName( _( "Delete" ), PlEditorHokeysDescr,
HK_DELETE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_ITEM_DELETE, msg, KiBitmap( delete_xpm ) );
aPopMenu->AppendSeparator();
@ -108,7 +108,7 @@ bool PL_EDITOR_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* aPopMenu )
}
else // An item is currently in edit
{
msg = AddHotkeyName( _( "Place Item" ), s_PlEditor_Hokeys_Descr,
msg = AddHotkeyName( _( "Place Item" ), PlEditorHokeysDescr,
HK_PLACE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_ITEM_PLACE, msg,
KiBitmap( move_xpm ) );

View File

@ -122,7 +122,7 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
// Must be called before creating the main frame in order to
// display the real hotkeys in menus or tool tips
ReadHotkeyConfig( PL_EDITOR_FRAME_NAME, s_PlEditor_Hokeys_Descr );
ReadHotkeyConfig( PL_EDITOR_FRAME_NAME, PlEditorHokeysDescr );
g_UserUnit = MILLIMETRES;

View File

@ -70,19 +70,19 @@ void PL_EDITOR_FRAME::Process_Config( wxCommandEvent& event )
// Standard basic hotkey IDs
case ID_PREFERENCES_HOTKEY_SHOW_EDITOR:
InstallHotkeyFrame( this, s_PlEditor_Hokeys_Descr );
InstallHotkeyFrame( this, PlEditorHokeysDescr );
break;
case ID_PREFERENCES_HOTKEY_EXPORT_CONFIG:
ExportHotkeyConfigToFile( s_PlEditor_Hokeys_Descr, wxT( "pl_editor" ) );
ExportHotkeyConfigToFile( PlEditorHokeysDescr, wxT( "pl_editor" ) );
break;
case ID_PREFERENCES_HOTKEY_IMPORT_CONFIG:
ImportHotkeyConfigFromFile( s_PlEditor_Hokeys_Descr, wxT( "pl_editor" ) );
ImportHotkeyConfigFromFile( PlEditorHokeysDescr, wxT( "pl_editor" ) );
break;
case ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST:
DisplayHotkeyList( this, s_PlEditor_Hokeys_Descr );
DisplayHotkeyList( this, PlEditorHokeysDescr );
break;
default:

View File

@ -62,7 +62,7 @@ PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_showAxis = false; // true to show X and Y axis on screen
m_showGridAxis = true;
m_showBorderAndTitleBlock = true; // true for reference drawings.
m_HotkeysZoomAndGridList = s_PlEditor_Hokeys_Descr;
m_HotkeysZoomAndGridList = PlEditorHokeysDescr;
m_originSelectChoice = 0;
SetDrawBgColor( WHITE ); // default value, user option (WHITE/BLACK)
SetShowPageLimits( true );

View File

@ -1,4 +1,3 @@
/**
* @file toolbars_pl_editor.cpp
* @brief Build tool bars
@ -76,16 +75,16 @@ void PL_EDITOR_FRAME::ReCreateHToolbar( void )
// Standard Zoom controls:
m_mainToolBar->AddSeparator();
msg = AddHotkeyName( _( "Zoom in" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_IN, IS_COMMENT );
msg = AddHotkeyName( _( "Zoom in" ), PlEditorHokeysDescr, HK_ZOOM_IN, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_IN, wxEmptyString, KiBitmap( zoom_in_xpm ), msg );
msg = AddHotkeyName( _( "Zoom out" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_OUT, IS_COMMENT );
msg = AddHotkeyName( _( "Zoom out" ), PlEditorHokeysDescr, HK_ZOOM_OUT, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_OUT, wxEmptyString, KiBitmap( zoom_out_xpm ), msg );
msg = AddHotkeyName( _( "Redraw view" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_REDRAW, IS_COMMENT );
msg = AddHotkeyName( _( "Redraw view" ), PlEditorHokeysDescr, HK_ZOOM_REDRAW, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_REDRAW, wxEmptyString, KiBitmap( zoom_redraw_xpm ), msg );
msg = AddHotkeyName( _( "Zoom auto" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_AUTO, IS_COMMENT );
msg = AddHotkeyName( _( "Zoom auto" ), PlEditorHokeysDescr, HK_ZOOM_AUTO, IS_COMMENT );
m_mainToolBar->AddTool( ID_ZOOM_PAGE, wxEmptyString, KiBitmap( zoom_fit_in_page_xpm ), msg );
// Display mode switch