From: Hugh McMaster Subject: [PATCH 1/2] Add console insert mode framework Message-Id: Date: Mon, 7 Jul 2014 18:49:33 +1000 This patch adds initial support for Insert Mode in wineconsole. From e9f97447bfa58a40bf65709131180941654f9ede Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Mon, 7 Jul 2014 18:33:50 +1000 Subject: [PATCH 1/2] Add console insert mode framework --- programs/wineconsole/dialog.c | 11 +++++++++++ programs/wineconsole/registry.c | 13 +++++++++++-- programs/wineconsole/winecon_private.h | 1 + programs/wineconsole/wineconsole.c | 1 + programs/wineconsole/wineconsole.rc | 16 +++++++++------- programs/wineconsole/wineconsole_res.h | 1 + 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/programs/wineconsole/dialog.c b/programs/wineconsole/dialog.c index 8ca6563..36ae1cb 100644 --- a/programs/wineconsole/dialog.c +++ b/programs/wineconsole/dialog.c @@ -63,6 +63,8 @@ static INT_PTR WINAPI WCUSER_OptionDlgProc(HWND hDlg, UINT msg, WPARAM wParam, L switch (msg) { case WM_INITDIALOG: + { + DWORD mode; di = (struct dialog_info*)((PROPSHEETPAGEA*)lParam)->lParam; di->hDlg = hDlg; SetWindowLongPtrW(hDlg, DWLP_USER, (LONG_PTR)di); @@ -82,7 +84,13 @@ static INT_PTR WINAPI WCUSER_OptionDlgProc(HWND hDlg, UINT msg, WPARAM wParam, L (di->config.menu_mask & MK_SHIFT) ? BST_CHECKED : BST_UNCHECKED, 0); SendDlgItemMessageW(hDlg, IDC_OPT_QUICK_EDIT, BM_SETCHECK, (di->config.quick_edit) ? BST_CHECKED : BST_UNCHECKED, 0); + GetConsoleMode(di->data->hConIn, &mode); + if ((mode & (ENABLE_INSERT_MODE|ENABLE_EXTENDED_FLAGS)) == (ENABLE_INSERT_MODE|ENABLE_EXTENDED_FLAGS)) + SendDlgItemMessageW(hDlg, IDC_OPT_INSERT_MODE, BM_SETCHECK, BST_CHECKED, 0); + else + SendDlgItemMessageW(hDlg, IDC_OPT_INSERT_MODE, BM_SETCHECK, BST_UNCHECKED, 0); return FALSE; /* because we set the focus */ + } case WM_COMMAND: break; case WM_NOTIFY: @@ -129,6 +137,9 @@ static INT_PTR WINAPI WCUSER_OptionDlgProc(HWND hDlg, UINT msg, WPARAM wParam, L val = (IsDlgButtonChecked(hDlg, IDC_OPT_QUICK_EDIT) & BST_CHECKED) != 0; di->config.quick_edit = val; + val = (IsDlgButtonChecked(hDlg, IDC_OPT_INSERT_MODE) & BST_CHECKED) != 0; + di->config.insert_mode = val; + SetWindowLongPtrW(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR); return TRUE; default: diff --git a/programs/wineconsole/registry.c b/programs/wineconsole/registry.c index 2805f2a..d1fb069 100644 --- a/programs/wineconsole/registry.c +++ b/programs/wineconsole/registry.c @@ -42,16 +42,17 @@ static const WCHAR wszHistoryBufferSize[] = {'H','i','s','t','o','r','y','B','u' static const WCHAR wszHistoryNoDup[] = {'H','i','s','t','o','r','y','N','o','D','u','p',0}; static const WCHAR wszMenuMask[] = {'M','e','n','u','M','a','s','k',0}; static const WCHAR wszQuickEdit[] = {'Q','u','i','c','k','E','d','i','t',0}; +static const WCHAR wszInsertMode[] = {'I','n','s','e','r','t','M','o','d','e',0}; static const WCHAR wszScreenBufferSize[] = {'S','c','r','e','e','n','B','u','f','f','e','r','S','i','z','e',0}; static const WCHAR wszScreenColors[] = {'S','c','r','e','e','n','C','o','l','o','r','s',0}; static const WCHAR wszWindowSize[] = {'W','i','n','d','o','w','S','i','z','e',0}; void WINECON_DumpConfig(const char* pfx, const struct config_data* cfg) { - WINE_TRACE("%s cell=(%u,%u) cursor=(%d,%d) attr=%02x font=%s/%u hist=%u/%d flags=%c%c msk=%08x sb=(%u,%u) win=(%u,%u)x(%u,%u) edit=%u registry=%s\n", + WINE_TRACE("%s cell=(%u,%u) cursor=(%d,%d) attr=%02x font=%s/%u hist=%u/%d flags=%c%c%c msk=%08x sb=(%u,%u) win=(%u,%u)x(%u,%u) edit=%u registry=%s\n", pfx, cfg->cell_width, cfg->cell_height, cfg->cursor_size, cfg->cursor_visible, cfg->def_attr, wine_dbgstr_w(cfg->face_name), cfg->font_weight, cfg->history_size, cfg->history_nodup ? 1 : 2, - cfg->quick_edit ? 'Q' : 'q', cfg->exit_on_die ? 'X' : 'x', + cfg->quick_edit ? 'Q' : 'q', cfg->exit_on_die ? 'X' : 'x', cfg->insert_mode ? 'I' : 'i', cfg->menu_mask, cfg->sb_width, cfg->sb_height, cfg->win_pos.X, cfg->win_pos.Y, cfg->win_width, cfg->win_height, cfg->edition_mode, wine_dbgstr_w(cfg->registry)); @@ -134,6 +135,10 @@ static void WINECON_RegLoadHelper(HKEY hConKey, struct config_data* cfg) cfg->quick_edit = val; count = sizeof(val); + if (!RegQueryValueExW(hConKey, wszInsertMode, 0, &type, (LPBYTE)&val, &count)) + cfg->insert_mode = val; + + count = sizeof(val); if (!RegQueryValueExW(hConKey, wszScreenBufferSize, 0, &type, (LPBYTE)&val, &count)) { cfg->sb_height = HIWORD(val); @@ -177,6 +182,7 @@ void WINECON_RegLoad(const WCHAR* appname, struct config_data* cfg) cfg->history_nodup = 0; cfg->menu_mask = 0; cfg->quick_edit = 0; + cfg->insert_mode = 1; cfg->sb_height = 25; cfg->sb_width = 80; cfg->def_attr = 0x000F; @@ -251,6 +257,9 @@ static void WINECON_RegSaveHelper(HKEY hConKey, const struct config_data* cfg) val = cfg->quick_edit; RegSetValueExW(hConKey, wszQuickEdit, 0, REG_DWORD, (LPBYTE)&val, sizeof(val)); + val = cfg->insert_mode; + RegSetValueExW(hConKey, wszInsertMode, 0, REG_DWORD, (LPBYTE)&val, sizeof(val)); + val = MAKELONG(cfg->sb_width, cfg->sb_height); RegSetValueExW(hConKey, wszScreenBufferSize, 0, REG_DWORD, (LPBYTE)&val, sizeof(val)); diff --git a/programs/wineconsole/winecon_private.h b/programs/wineconsole/winecon_private.h index 1daf581..4734200 100644 --- a/programs/wineconsole/winecon_private.h +++ b/programs/wineconsole/winecon_private.h @@ -38,6 +38,7 @@ struct config_data { DWORD history_nodup; /* TRUE if commands are not stored twice in buffer */ DWORD menu_mask; /* MK_CONTROL MK_SHIFT mask to drive submenu opening */ DWORD quick_edit; /* whether mouse ops are sent to app (false) or used for content selection (true) */ + DWORD insert_mode; /* whether keyboard input inserts (true) or overwrites text (false) */ unsigned sb_width; /* active screen buffer width */ unsigned sb_height; /* active screen buffer height */ unsigned win_width; /* size (in cells) of visible part of window (width & height) */ diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index 7698521..ab7b1eb 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -399,6 +399,7 @@ void WINECON_SetConfig(struct inner_data* data, const struct config_data* cf } data->curcfg.menu_mask = cfg->menu_mask; data->curcfg.quick_edit = cfg->quick_edit; + data->curcfg.insert_mode = cfg->insert_mode; if (1 /* FIXME: font info has changed */) { data->fnSetFont(data, cfg->face_name, cfg->cell_height, cfg->font_weight); diff --git a/programs/wineconsole/wineconsole.rc b/programs/wineconsole/wineconsole.rc index e4e0624..2c84232 100644 --- a/programs/wineconsole/wineconsole.rc +++ b/programs/wineconsole/wineconsole.rc @@ -54,28 +54,30 @@ IDS_USAGE_FOOTER "\nExample:\n wineconsole cmd\nStarts the Wine comma END -IDD_OPTION DIALOG 36, 24, 140, 105 +IDD_OPTION DIALOG 36, 24, 140, 115 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Options" FONT 8, "MS Shell Dlg" { - GROUPBOX "Cursor size", -1, 5, 5, 65, 56, BS_GROUPBOX + GROUPBOX "Cursor size", -1, 5, 5, 65, 62, BS_GROUPBOX AUTORADIOBUTTON "&Small", IDC_OPT_CURSOR_SMALL, 9, 18, 50, 10, WS_TABSTOP AUTORADIOBUTTON "&Medium", IDC_OPT_CURSOR_MEDIUM, 9, 30, 50, 10, WS_TABSTOP AUTORADIOBUTTON "&Large", IDC_OPT_CURSOR_LARGE, 9, 42, 50, 10, WS_TABSTOP - GROUPBOX "Control", -1, 75, 5, 125, 56, BS_GROUPBOX + GROUPBOX "Control", -1, 75, 5, 125, 62, BS_GROUPBOX LTEXT "Popup menu", -1, 79, 18, 50, 18 AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 138, 18, 60, 10, WS_TABSTOP AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 138, 30, 60, 10, WS_TABSTOP LTEXT "Quick edit", -1, 79, 42, 50, 18 AUTOCHECKBOX "&enable", IDC_OPT_QUICK_EDIT, 138, 42, 60, 10, WS_TABSTOP + LTEXT "Insert mode", -1, 79, 54, 50, 9 + AUTOCHECKBOX "En&able", IDC_OPT_INSERT_MODE, 138, 54, 60, 10, WS_TABSTOP - GROUPBOX "Command history", -1, 5, 63, 195, 40, BS_GROUPBOX - LTEXT "&Number of recalled commands:", -1, 9, 75, 78, 18 - EDITTEXT IDC_OPT_HIST_SIZE, 87, 77, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER + GROUPBOX "Command history", -1, 5, 69, 195, 40, BS_GROUPBOX + LTEXT "&Number of recalled commands:", -1, 9, 81, 78, 18 + EDITTEXT IDC_OPT_HIST_SIZE, 87, 83, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 - AUTOCHECKBOX "&Remove doubles", IDC_OPT_HIST_NODOUBLE, 125, 75, 60, 18, WS_TABSTOP|BS_MULTILINE + AUTOCHECKBOX "&Remove doubles", IDC_OPT_HIST_NODOUBLE, 125, 81, 60, 18, WS_TABSTOP|BS_MULTILINE } IDD_FONT DIALOG 36, 24, 140, 105 diff --git a/programs/wineconsole/wineconsole_res.h b/programs/wineconsole/wineconsole_res.h index ac62b58..8261fd5 100644 --- a/programs/wineconsole/wineconsole_res.h +++ b/programs/wineconsole/wineconsole_res.h @@ -70,6 +70,7 @@ #define IDC_OPT_CONF_CTRL 0x0107 #define IDC_OPT_CONF_SHIFT 0x0108 #define IDC_OPT_QUICK_EDIT 0x0109 +#define IDC_OPT_INSERT_MODE 0x0110 #define IDC_FNT_LIST_FONT 0x0201 #define IDC_FNT_LIST_SIZE 0x0202 -- 1.8.3.2