summaryrefslogtreecommitdiff
path: root/utils/xbox/vxconsole/bindings.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/xbox/vxconsole/bindings.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/xbox/vxconsole/bindings.cpp')
-rw-r--r--utils/xbox/vxconsole/bindings.cpp591
1 files changed, 591 insertions, 0 deletions
diff --git a/utils/xbox/vxconsole/bindings.cpp b/utils/xbox/vxconsole/bindings.cpp
new file mode 100644
index 0000000..67bce48
--- /dev/null
+++ b/utils/xbox/vxconsole/bindings.cpp
@@ -0,0 +1,591 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// BINDINGS.CPP
+//
+// Keyboard Shortcuts
+//=====================================================================================//
+#include "vxconsole.h"
+
+#define ID_BINDINGS_LISTVIEW 100
+
+// column id
+#define ID_BIND_KEYCODE 0
+#define ID_BIND_MENUNAME 1
+#define ID_BIND_COMMAND 2
+
+typedef struct
+{ const CHAR* name;
+ int width;
+ int subItemIndex;
+} label_t;
+
+typedef struct
+{
+ int keyCode;
+ const char *pKeyString;
+ char *pMenuName;
+ char *pCommandString;
+} bind_t;
+
+// {VK_F1, "F1", "WireFrame", "incrementvar mat_wireframe 0 2 1"},
+// {VK_F2, "F2", "FullBright", "incrementvar mat_fullbright 0 2 1"},
+// {VK_F3, "F3", "Impulse 101", "impulse 101"},
+// {VK_F4, "F4", "Screenshot", "*screenshot"},
+
+
+bind_t g_bindings[MAX_BINDINGS] =
+{
+ {VK_F1, "F1", NULL, NULL},
+ {VK_F2, "F2", NULL, NULL},
+ {VK_F3, "F3", NULL, NULL},
+ {VK_F4, "F4", NULL, NULL},
+ {VK_F5, "F5", NULL, NULL},
+ {VK_F6, "F6", NULL, NULL},
+ {VK_F7, "F7", NULL, NULL},
+ {VK_F8, "F8", NULL, NULL},
+ {VK_F9, "F9", NULL, NULL},
+ {VK_F10, "F10", NULL, NULL},
+ {VK_F11, "F11", NULL, NULL},
+ {VK_F12, "F12", NULL, NULL},
+};
+
+label_t g_bindings_labels[] =
+{
+ {"Key", 80, ID_BIND_KEYCODE},
+ {"Menu Name", 150, ID_BIND_MENUNAME},
+ {"Command", 400, ID_BIND_COMMAND},
+};
+
+HWND g_bindings_hWnd;
+HWND g_bindings_hWndListView;
+RECT g_bindings_windowRect;
+char g_bindingsModify_menuName[256];
+char g_bindingsModify_command[256];
+char g_bindingsModify_keyCode[256];
+
+//-----------------------------------------------------------------------------
+// Bindings_ModifyEntry
+//
+//-----------------------------------------------------------------------------
+void Bindings_ModifyEntry( int i, const char *pMenuName, const char *pCommandString )
+{
+ if ( g_bindings[i].pMenuName && g_bindings[i].pMenuName[0] )
+ Sys_Free( g_bindings[i].pMenuName );
+ g_bindings[i].pMenuName = Sys_CopyString( pMenuName );
+
+ if ( g_bindings[i].pCommandString && g_bindings[i].pCommandString[0] )
+ Sys_Free( g_bindings[i].pCommandString );
+ g_bindings[i].pCommandString = Sys_CopyString( pCommandString );
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_GetSelectedItem
+//
+//-----------------------------------------------------------------------------
+int Bindings_GetSelectedItem()
+{
+ int i;
+ int selection = -1;
+ int state;
+
+ for ( i=0; i<MAX_BINDINGS; i++ )
+ {
+ state = ListView_GetItemState( g_bindings_hWndListView, i, LVIS_SELECTED );
+ if ( state == LVIS_SELECTED )
+ {
+ selection = i;
+ break;
+ }
+ }
+
+ return selection;
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_TranslateKey
+//
+//-----------------------------------------------------------------------------
+bool Bindings_TranslateKey( int vkKeyCode )
+{
+ int i;
+
+ for ( i=0; i<MAX_BINDINGS; i++ )
+ {
+ if ( !g_bindings[i].pCommandString || !g_bindings[i].pCommandString[0] )
+ continue;
+
+ if ( vkKeyCode == g_bindings[i].keyCode )
+ {
+ ProcessCommand( g_bindings[i].pCommandString );
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_MenuSelection
+//
+//-----------------------------------------------------------------------------
+bool Bindings_MenuSelection( int wID )
+{
+ int index;
+
+ index = wID - IDM_BINDINGS_BIND1;
+ if ( index < 0 || index > MAX_BINDINGS-1 )
+ return false;
+
+ // as if the key were pressed...
+ return ( Bindings_TranslateKey( g_bindings[index].keyCode ) );
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_UpdateMenu
+//
+// Builds the dynamic menu
+//-----------------------------------------------------------------------------
+void Bindings_UpdateMenu()
+{
+ HMENU hMenu;
+ HMENU hNewMenu;
+ MENUITEMINFO menuItemInfo;
+ int i;
+ int numAdded;
+ char menuBuff[64];
+
+ hMenu = GetMenu( g_hDlgMain );
+ if ( !hMenu )
+ return;
+
+ memset( &menuItemInfo, 0, sizeof( menuItemInfo ) );
+ menuItemInfo.cbSize = sizeof( MENUITEMINFO );
+
+ numAdded = 0;
+ hNewMenu = CreatePopupMenu();
+ menuItemInfo.fMask = MIIM_ID|MIIM_FTYPE|MIIM_STRING;
+ menuItemInfo.fType = MFT_STRING;
+ for ( i=MAX_BINDINGS-1; i>=0; i-- )
+ {
+ if ( !g_bindings[i].pCommandString || !g_bindings[i].pCommandString[0] )
+ continue;
+
+ menuItemInfo.wID = IDM_BINDINGS_BIND1+i;
+ sprintf( menuBuff, "%s\tF%d", g_bindings[i].pMenuName, g_bindings[i].keyCode-VK_F1+1 );
+ menuItemInfo.dwTypeData = ( LPSTR )menuBuff;
+ InsertMenuItem( hNewMenu, 0, true, &menuItemInfo );
+
+ numAdded++;
+ }
+
+ if ( numAdded )
+ {
+ // add seperator
+ menuItemInfo.fMask = MIIM_FTYPE;
+ menuItemInfo.fType = MFT_SEPARATOR;
+ InsertMenuItem( hNewMenu, 0, true, &menuItemInfo );
+ }
+
+ menuItemInfo.fMask = MIIM_ID|MIIM_FTYPE|MIIM_STRING;
+ menuItemInfo.fType = MFT_STRING;
+ menuItemInfo.wID = IDM_BINDINGS_EDIT;
+ menuItemInfo.dwTypeData = "Edit...";
+ InsertMenuItem( hNewMenu, 0, true, &menuItemInfo );
+
+ // delete the previous menu
+ menuItemInfo.fMask = MIIM_SUBMENU;
+ GetMenuItemInfo( hMenu, IDM_BINDINGS, false, &menuItemInfo );
+ if ( menuItemInfo.hSubMenu )
+ DestroyMenu( menuItemInfo.hSubMenu );
+ else
+ {
+ // add a new menu at the tail of the app menu
+ AppendMenu( hMenu, MF_STRING, ( UINT_PTR )IDM_BINDINGS, "Bindings" );
+ }
+
+ // add the new menu to bar
+ menuItemInfo.fMask = MIIM_SUBMENU;
+ menuItemInfo.hSubMenu = hNewMenu;
+ SetMenuItemInfo( hMenu, IDM_BINDINGS, false, &menuItemInfo );
+
+ DrawMenuBar( g_hDlgMain );
+}
+
+//-----------------------------------------------------------------------------
+// BindingsModifyDlg_Proc
+//
+//-----------------------------------------------------------------------------
+BOOL CALLBACK BindingsModifyDlg_Proc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ switch ( message )
+ {
+ case WM_INITDIALOG:
+ SetDlgItemText( hWnd, IDC_MODIFYBIND_KEYCODE, g_bindingsModify_keyCode );
+ SetDlgItemText( hWnd, IDC_MODIFYBIND_MENUNAME, g_bindingsModify_menuName );
+ SetDlgItemText( hWnd, IDC_MODIFYBIND_COMMAND, g_bindingsModify_command );
+ return ( TRUE );
+
+ case WM_COMMAND:
+ switch ( LOWORD( wParam ) )
+ {
+ case IDC_OK:
+ GetDlgItemText( hWnd, IDC_MODIFYBIND_MENUNAME, g_bindingsModify_menuName, sizeof( g_bindingsModify_menuName ) );
+ GetDlgItemText( hWnd, IDC_MODIFYBIND_COMMAND, g_bindingsModify_command, sizeof( g_bindingsModify_command ) );
+ case IDCANCEL:
+ case IDC_CANCEL:
+ EndDialog( hWnd, wParam );
+ return ( TRUE );
+ }
+ break;
+ }
+ return ( FALSE );
+}
+
+//-----------------------------------------------------------------------------
+// BindingsModifyDlg_Open
+//
+//-----------------------------------------------------------------------------
+void BindingsModifyDlg_Open( int selection )
+{
+ int result;
+
+ sprintf( g_bindingsModify_keyCode, "F%d", selection+1 );
+ strcpy( g_bindingsModify_menuName, g_bindings[selection].pMenuName );
+ strcpy( g_bindingsModify_command, g_bindings[selection].pCommandString );
+
+ result = DialogBox( g_hInstance, MAKEINTRESOURCE( IDD_MODIFYBIND ), g_hDlgMain, ( DLGPROC )BindingsModifyDlg_Proc );
+ if ( LOWORD( result ) != IDC_OK )
+ return;
+
+ // accept changes and update
+ Bindings_ModifyEntry( selection, g_bindingsModify_menuName, g_bindingsModify_command );
+ ListView_RedrawItems( g_bindings_hWndListView, 0, MAX_BINDINGS-1 );
+ UpdateWindow( g_bindings_hWndListView );
+ Bindings_UpdateMenu();
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_LoadConfig
+//
+//-----------------------------------------------------------------------------
+void Bindings_LoadConfig()
+{
+ char valueBuff[256];
+ char keyBuff[32];
+ char menuName[256];
+ char commandString[256];
+ char *ptr;
+ char *token;
+ int keyCode;
+ int i;
+ int numArgs;
+ char buff[256];
+
+ for ( i=0; i<MAX_BINDINGS; i++ )
+ {
+ menuName[0] = '\0';
+ commandString[0] = '\0';
+
+ sprintf( keyBuff, "bind%d", i );
+ Sys_GetRegistryString( keyBuff, valueBuff, "", sizeof( valueBuff ) );
+
+ // parse and populate valid values
+ ptr = valueBuff;
+ token = Sys_GetToken( &ptr, false, NULL );
+ if ( token[0] )
+ keyCode = atoi( token );
+
+ token = Sys_GetToken( &ptr, false, NULL );
+ if ( token[0] )
+ strcpy( menuName, token );
+
+ token = Sys_GetToken( &ptr, false, NULL );
+ if ( token[0] )
+ strcpy( commandString, token );
+
+ Bindings_ModifyEntry( i, menuName, commandString );
+ }
+
+ Sys_GetRegistryString( "bindingsWindowRect", buff, "", sizeof( buff ) );
+ numArgs = sscanf( buff, "%d %d %d %d", &g_bindings_windowRect.left, &g_bindings_windowRect.top, &g_bindings_windowRect.right, &g_bindings_windowRect.bottom );
+ if ( numArgs != 4 )
+ memset( &g_bindings_windowRect, 0, sizeof( g_bindings_windowRect ) );
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_SaveConfig
+//
+//-----------------------------------------------------------------------------
+void Bindings_SaveConfig()
+{
+ char valueBuff[256];
+ char buff[256];
+ char keyBuff[32];
+ char *pMenuName;
+ char *pCommandString;
+ int len;
+ int i;
+ WINDOWPLACEMENT wp;
+
+ if ( g_bindings_hWnd )
+ {
+ memset( &wp, 0, sizeof( wp ) );
+ wp.length = sizeof( WINDOWPLACEMENT );
+ GetWindowPlacement( g_bindings_hWnd, &wp );
+ g_bindings_windowRect = wp.rcNormalPosition;
+ sprintf( buff, "%d %d %d %d", wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom );
+ Sys_SetRegistryString( "bindingsWindowRect", buff );
+ }
+
+ for ( i=0; i<MAX_BINDINGS; i++ )
+ {
+ sprintf( keyBuff, "bind%d", i );
+
+ pMenuName = g_bindings[i].pMenuName;
+ if ( !pMenuName )
+ pMenuName = "";
+
+ pCommandString = g_bindings[i].pCommandString;
+ if ( !pCommandString )
+ pCommandString = "";
+
+ len = _snprintf( valueBuff, sizeof( valueBuff ), "%d \"%s\" \"%s\"", g_bindings[i].keyCode, pMenuName, pCommandString );
+ if ( len == -1 )
+ {
+ // kill it
+ valueBuff[0] = '\0';
+ }
+
+ Sys_SetRegistryString( keyBuff, valueBuff );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_SizeWindow
+//
+//-----------------------------------------------------------------------------
+void Bindings_SizeWindow( HWND hwnd, int cx, int cy )
+{
+ if ( cx==0 || cy==0 )
+ {
+ RECT rcClient;
+ GetClientRect( hwnd, &rcClient );
+ cx = rcClient.right;
+ cy = rcClient.bottom;
+ }
+
+ // position the ListView
+ SetWindowPos( g_bindings_hWndListView, NULL, 0, 0, cx, cy, SWP_NOZORDER );
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_WndProc
+//
+//-----------------------------------------------------------------------------
+LRESULT CALLBACK Bindings_WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ WORD wID = LOWORD( wParam );
+ bind_t* pBind;
+ int selection;
+
+ switch ( message )
+ {
+ case WM_CREATE:
+ return 0L;
+
+ case WM_DESTROY:
+ Bindings_SaveConfig();
+ Bindings_UpdateMenu();
+
+ g_bindings_hWnd = NULL;
+ return 0L;
+
+ case WM_SIZE:
+ Bindings_SizeWindow( hwnd, LOWORD( lParam ), HIWORD( lParam ) );
+ return 0L;
+
+ case WM_NOTIFY:
+ switch ( ( ( LPNMHDR )lParam )->code )
+ {
+ case LVN_GETDISPINFO:
+ NMLVDISPINFO* plvdi;
+ plvdi = ( NMLVDISPINFO* )lParam;
+ pBind = ( bind_t* )plvdi->item.lParam;
+ switch ( plvdi->item.iSubItem )
+ {
+ case ID_BIND_KEYCODE:
+ plvdi->item.pszText = ( LPSTR )pBind->pKeyString;
+ return 0L;
+
+ case ID_BIND_MENUNAME:
+ plvdi->item.pszText = pBind->pMenuName;
+ return 0L;
+
+ case ID_BIND_COMMAND:
+ plvdi->item.pszText = pBind->pCommandString;
+ return 0L;
+
+ default:
+ break;
+ }
+ break;
+
+ case NM_DBLCLK:
+ NMITEMACTIVATE *pnmitem;
+ pnmitem = ( LPNMITEMACTIVATE )lParam;
+ BindingsModifyDlg_Open( pnmitem->iItem );
+ break;
+ }
+ break;
+
+ case WM_COMMAND:
+ switch ( wID )
+ {
+ case IDM_BINDOPTIONS_MODIFY:
+ selection = Bindings_GetSelectedItem();
+ if ( selection >= 0 )
+ BindingsModifyDlg_Open( selection );
+ return 0L;
+
+ case IDM_BINDOPTIONS_DELETE:
+ selection = Bindings_GetSelectedItem();
+ if ( selection >= 0 )
+ {
+ Bindings_ModifyEntry( selection, "", "" );
+ ListView_RedrawItems( g_bindings_hWndListView, 0, MAX_BINDINGS-1 );
+ UpdateWindow( g_bindings_hWndListView );
+ Bindings_UpdateMenu();
+ }
+ return 0L;
+ }
+ break;
+ }
+
+ return ( DefWindowProc( hwnd, message, wParam, lParam ) );
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_Open
+//
+//-----------------------------------------------------------------------------
+void Bindings_Open()
+{
+ RECT clientRect;
+ HWND hWnd;
+ int i;
+ LVITEM lvi;
+
+ if ( g_bindings_hWnd )
+ {
+ // only one instance
+ if ( IsIconic( g_bindings_hWnd ) )
+ ShowWindow( g_bindings_hWnd, SW_RESTORE );
+ SetForegroundWindow( g_bindings_hWnd );
+ return;
+ }
+
+ hWnd = CreateWindowEx(
+ WS_EX_CLIENTEDGE,
+ "BINDINGSCLASS",
+ "Edit Bindings",
+ WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
+ 0,
+ 0,
+ 600,
+ 300,
+ g_hDlgMain,
+ NULL,
+ g_hInstance,
+ NULL );
+ g_bindings_hWnd = hWnd;
+
+ GetClientRect( g_bindings_hWnd, &clientRect );
+ hWnd = CreateWindow(
+ WC_LISTVIEW,
+ "",
+ WS_VISIBLE|WS_CHILD|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SINGLESEL|LVS_NOSORTHEADER,
+ 0,
+ 0,
+ clientRect.right-clientRect.left,
+ clientRect.bottom-clientRect.top,
+ g_bindings_hWnd,
+ ( HMENU )ID_BINDINGS_LISTVIEW,
+ g_hInstance,
+ NULL );
+ g_bindings_hWndListView = hWnd;
+
+ // init list view columns
+ for ( i=0; i<sizeof( g_bindings_labels )/sizeof( g_bindings_labels[0] ); i++ )
+ {
+ LVCOLUMN lvc;
+ memset( &lvc, 0, sizeof( lvc ) );
+
+ lvc.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
+ lvc.iSubItem = 0;
+ lvc.cx = g_bindings_labels[i].width;
+ lvc.fmt = LVCFMT_LEFT;
+ lvc.pszText = ( LPSTR )g_bindings_labels[i].name;
+
+ ListView_InsertColumn( g_bindings_hWndListView, i, &lvc );
+ }
+
+ ListView_SetBkColor( g_bindings_hWndListView, g_backgroundColor );
+ ListView_SetTextBkColor( g_bindings_hWndListView, g_backgroundColor );
+
+ DWORD style = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP;
+ ListView_SetExtendedListViewStyleEx( g_bindings_hWndListView, style, style );
+
+ // populate list view
+ for ( i=0; i<MAX_BINDINGS; i++ )
+ {
+ int itemCount = ListView_GetItemCount( g_bindings_hWndListView );
+
+ // setup and insert at end of list
+ memset( &lvi, 0, sizeof( lvi ) );
+ lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
+ lvi.iItem = itemCount;
+ lvi.iSubItem = 0;
+ lvi.state = 0;
+ lvi.stateMask = 0;
+ lvi.pszText = LPSTR_TEXTCALLBACK;
+ lvi.lParam = ( LPARAM )&g_bindings[i];
+
+ ListView_InsertItem( g_bindings_hWndListView, &lvi );
+ }
+
+ // set the first item selected
+ ListView_SetItemState( g_bindings_hWndListView, 0, LVIS_SELECTED, LVIS_SELECTED );
+ SetFocus( g_bindings_hWndListView );
+
+ if ( g_bindings_windowRect.right && g_bindings_windowRect.bottom )
+ MoveWindow( g_bindings_hWnd, g_bindings_windowRect.left, g_bindings_windowRect.top, g_bindings_windowRect.right-g_bindings_windowRect.left, g_bindings_windowRect.bottom-g_bindings_windowRect.top, FALSE );
+ ShowWindow( g_bindings_hWnd, SHOW_OPENWINDOW );
+}
+
+//-----------------------------------------------------------------------------
+// Bindings_Init
+//
+//-----------------------------------------------------------------------------
+bool Bindings_Init()
+{
+ // set up our window class
+ WNDCLASS wndclass;
+ memset( &wndclass, 0, sizeof( wndclass ) );
+ wndclass.style = 0;
+ wndclass.lpfnWndProc = Bindings_WndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hInstance = g_hInstance;
+ wndclass.hIcon = g_hIcons[ICON_APPLICATION];
+ wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
+ wndclass.hbrBackground = g_hBackgroundBrush;
+ wndclass.lpszMenuName = MAKEINTRESOURCE( MENU_BINDOPTIONS );
+ wndclass.lpszClassName = "BINDINGSCLASS";
+ if ( !RegisterClass( &wndclass ) )
+ return false;
+
+ Bindings_LoadConfig();
+ Bindings_UpdateMenu();
+
+ return true;
+} \ No newline at end of file