diff options
Diffstat (limited to 'utils/xbox/vxconsole/bindings.cpp')
| -rw-r--r-- | utils/xbox/vxconsole/bindings.cpp | 591 |
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 |