config ui updates to support smartcard readers in eamio

This commit is contained in:
daydensteve 2025-12-14 13:21:22 -05:00
parent 5a318ac58c
commit e1e47ee7c4
3 changed files with 183 additions and 21 deletions

View File

@ -116,12 +116,17 @@ FONT 8, "Ms Shell Dlg"
{
LTEXT "Keyboard device", IDC_STATIC, 15, 20, 54, 8, SS_LEFT
COMBOBOX IDC_KBD_DEVICE, 15, 30, 135, 12, WS_GROUP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
LTEXT "Card ID file", IDC_STATIC, 15, 50, 36, 8, SS_LEFT
EDITTEXT IDC_CARD_PATH, 15, 60, 135, 14, ES_AUTOHSCROLL
PUSHBUTTON "&Browse...", IDC_BROWSE, 155, 60, 50, 14
AUTOCHECKBOX "Use top keyboard row for PIN pad input", IDC_ALT_10K, 15, 47, 136, 8
LTEXT "Card ID file", IDC_CARD_TEXT, 15, 60, 36, 8, SS_LEFT
EDITTEXT IDC_CARD_PATH, 15, 70, 135, 14, ES_AUTOHSCROLL
PUSHBUTTON "&Browse...", IDC_BROWSE, 155, 70, 50, 14
LTEXT "Smartcard reader", IDC_SCARD_TEXT, 15, 60, 80, 8, SS_LEFT
LTEXT "", IDC_SCARD_READER_NAME, 15, 72, 135, 14, SS_LEFT
GROUPBOX "", IDC_GROUP, 5, 5, 210, 80
LTEXT "Keypad status", IDC_STATIC, 155, 20, 46, 8, SS_LEFT
LTEXT "", IDC_KEYPAD_STATE, 160, 30, 45, 12, SS_LEFT | SS_CENTERIMAGE
LTEXT "Card present", IDC_SCARD_CARD_TEXT, 155, 60, 46, 8, SS_LEFT
LTEXT "", IDC_SCARD_IS_PRESENT, 160, 70, 45, 12, SS_LEFT | SS_CENTERIMAGE
}
@ -170,14 +175,15 @@ FONT 8, "Ms Shell Dlg"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_TAB_NETWORK DIALOG 0, 0, 220, 215
IDD_TAB_NETWORK DIALOG 0, 0, 220, 240
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Network"
FONT 8, "Ms Shell Dlg"
{
LTEXT "", IDC_STATIC, 0, 0, 8, 8, SS_LEFT
AUTOCHECKBOX "Generate card ID files on insertion if they do not already exist", IDC_AUTOGEN, 5, 200, 206, 8
AUTOCHECKBOX "Use top keyboard row for PIN pad input", IDC_ALT_10K, 5, 185, 141, 8
AUTOCHECKBOX "Use smartcard readers instead of card ID files", IDC_SCARD, 5, 5, 200, 8
AUTOCHECKBOX "Use NUMLOCK to deconflict overlapping keypads (ON = P2)", IDC_MUX_KEYPAD, 5, 200, 265, 8
AUTOCHECKBOX "Use NUMLOCK to share one smartcard reader (ON = P2)", IDC_MUX_SCARD, 5, 212, 265, 8
AUTOCHECKBOX "Generate card ID files on insertion if they do not already exist", IDC_AUTOGEN, 5, 224, 265, 8
}

View File

@ -56,9 +56,14 @@ static INT_PTR eam_ui_handle_init(HWND hwnd, const PROPSHEETPAGE *psp);
static INT_PTR eam_ui_handle_activate(HWND hwnd);
static INT_PTR eam_ui_handle_passivate(HWND hwnd);
static INT_PTR eam_ui_handle_tick(HWND hwnd);
static INT_PTR eam_ui_handle_change_alt_10k(HWND hwnd);
static INT_PTR eam_ui_handle_change_scard(HWND hwnd);
static INT_PTR eam_ui_handle_change_mux_keypad(HWND hwnd);
static INT_PTR eam_ui_handle_change_mux_scard(HWND hwnd);
static INT_PTR eam_ui_handle_change_autogen(HWND hwnd);
static INT_PTR eam_ui_handle_fini(HWND hwnd);
static HWND eam_mux_keypad_dlg;
static HWND *eam_unit_dlgs;
static uint8_t eam_num_units;
static INT_PTR CALLBACK
eam_unit_ui_dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
@ -66,8 +71,10 @@ static INT_PTR
eam_unit_ui_handle_init(HWND hwnd, const struct eam_unit_def *def);
static void eam_unit_ui_handle_init_devs(HWND hwnd);
static void eam_unit_ui_handle_init_path(HWND hwnd);
static void eam_unit_ui_handle_init_alt_10k(HWND hwnd);
static INT_PTR eam_unit_ui_handle_browse(HWND hwnd);
static INT_PTR eam_unit_ui_handle_change_device(HWND hwnd);
static INT_PTR eam_unit_ui_handle_change_alt_10k(HWND hwnd);
static INT_PTR eam_unit_ui_handle_tick(HWND hwnd);
static INT_PTR eam_unit_ui_handle_fini(HWND hwnd);
@ -110,12 +117,18 @@ eam_ui_dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
switch (HIWORD(wparam)) {
case BN_CLICKED:
switch (LOWORD(wparam)) {
case IDC_SCARD:
return eam_ui_handle_change_scard(hwnd);
case IDC_MUX_KEYPAD:
return eam_ui_handle_change_mux_keypad(hwnd);
case IDC_MUX_SCARD:
return eam_ui_handle_change_mux_scard(hwnd);
case IDC_AUTOGEN:
return eam_ui_handle_change_autogen(hwnd);
case IDC_ALT_10K:
return eam_ui_handle_change_alt_10k(hwnd);
default:
return FALSE;
}
@ -163,8 +176,16 @@ static INT_PTR eam_ui_handle_init(HWND hwnd, const PROPSHEETPAGE *psp)
inst = (HINSTANCE) GetWindowLongPtr(hwnd, GWLP_HINSTANCE);
schema = (struct schema *) psp->lParam;
ypos = 0;
eam_unit_dlgs = xmalloc(sizeof(HWND) * schema->nunits);
eam_num_units = schema->nunits;
GetWindowRect(GetDlgItem(hwnd, IDC_SCARD), &r);
if (eam_io_config_api->get_scard()) {
SendMessage(GetDlgItem(hwnd, IDC_SCARD), BM_SETCHECK, BST_CHECKED, 0);
}
ypos = r.bottom - r.top + 8; // todo the +8 is hacky bc the bottom is hella big
for (i = 0; i < schema->nunits; i++) {
child = CreateDialogParam(
inst,
@ -172,6 +193,7 @@ static INT_PTR eam_ui_handle_init(HWND hwnd, const PROPSHEETPAGE *psp)
hwnd,
eam_unit_ui_dlg_proc,
(LPARAM) &schema->units[i]);
eam_unit_dlgs[i] = child;
GetWindowRect(child, &r);
SetWindowPos(
@ -182,14 +204,30 @@ static INT_PTR eam_ui_handle_init(HWND hwnd, const PROPSHEETPAGE *psp)
*array_append(HWND, &ui->children) = child;
}
eam_mux_keypad_dlg = GetDlgItem(hwnd, IDC_MUX_KEYPAD);
if (eam_io_config_api->get_mux_keypad()) {
SendMessage(eam_mux_keypad_dlg, BM_SETCHECK, BST_CHECKED, 0);
}
if (eam_io_config_api->get_mux_scard()) {
SendMessage(GetDlgItem(hwnd, IDC_MUX_SCARD), BM_SETCHECK, BST_CHECKED, 0);
}
if (eam_io_config_api->get_autogen()) {
SendMessage(GetDlgItem(hwnd, IDC_AUTOGEN), BM_SETCHECK, BST_CHECKED, 0);
}
if (eam_io_config_api->get_alt_10k()) {
SendMessage(GetDlgItem(hwnd, IDC_ALT_10K), BM_SETCHECK, BST_CHECKED, 0);
}
// invoke scard change handler so we can toggle card file / smartcard stuff
eam_ui_handle_change_scard(hwnd);
// invoke a keypad-related change handler so the keypad mux option updates
eam_unit_ui_handle_change_alt_10k(eam_unit_dlgs[0]);
// if only one reader is present, disablo mux options
if (schema->nunits == 1) {
EnableWindow(GetDlgItem(hwnd, IDC_MUX_KEYPAD), false);
EnableWindow(GetDlgItem(hwnd, IDC_MUX_SCARD), false);
}
return TRUE;
}
@ -225,15 +263,68 @@ static INT_PTR eam_ui_handle_tick(HWND hwnd)
return TRUE;
}
static INT_PTR eam_ui_handle_change_alt_10k(HWND hwnd)
static INT_PTR eam_ui_handle_change_scard(HWND hwnd)
{
HWND btn;
bool alt_10k;
bool scard;
size_t i;
btn = GetDlgItem(hwnd, IDC_ALT_10K);
alt_10k = SendMessage(btn, BM_GETCHECK, 0, 0) == BST_CHECKED;
btn = GetDlgItem(hwnd, IDC_SCARD);
scard = SendMessage(btn, BM_GETCHECK, 0, 0) == BST_CHECKED;
eam_io_config_api->set_alt_10k(alt_10k);
eam_io_config_api->set_scard(scard);
// toggle state of card file vs scard components
EnableWindow(GetDlgItem(hwnd, IDC_AUTOGEN), !scard);
EnableWindow(GetDlgItem(hwnd, IDC_MUX_SCARD), scard);
for (i = 0; i < eam_num_units; i++) {
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_CARD_TEXT), !scard);
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_CARD_PATH), !scard);
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_BROWSE), !scard);
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_SCARD_TEXT), scard);
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_SCARD_READER_NAME), scard);
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_SCARD_CARD_TEXT), scard);
ShowWindow(GetDlgItem(eam_unit_dlgs[i], IDC_SCARD_IS_PRESENT), scard);
if (scard) {
SetWindowTextA(
GetDlgItem(eam_unit_dlgs[i], IDC_SCARD_READER_NAME),
eam_io_config_api->get_scard_reader_name(i));
}
}
return TRUE;
}
static INT_PTR eam_ui_handle_change_mux_keypad(HWND hwnd)
{
HWND btn;
bool mux_keypad;
btn = GetDlgItem(hwnd, IDC_MUX_KEYPAD);
mux_keypad = SendMessage(btn, BM_GETCHECK, 0, 0) == BST_CHECKED;
eam_io_config_api->set_mux_keypad(mux_keypad);
return TRUE;
}
static INT_PTR eam_ui_handle_change_mux_scard(HWND hwnd)
{
HWND btn;
bool mux_scard;
size_t i;
btn = GetDlgItem(hwnd, IDC_MUX_SCARD);
mux_scard = SendMessage(btn, BM_GETCHECK, 0, 0) == BST_CHECKED;
eam_io_config_api->set_mux_scard(mux_scard);
for (i = 0; i < eam_num_units; i++) {
SetWindowTextA(
GetDlgItem(eam_unit_dlgs[i], IDC_SCARD_READER_NAME),
eam_io_config_api->get_scard_reader_name(i));
}
return TRUE;
}
@ -294,6 +385,15 @@ eam_unit_ui_dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
return FALSE;
}
case IDC_ALT_10K:
switch (HIWORD(wparam)) {
case BN_CLICKED:
return eam_unit_ui_handle_change_alt_10k(hwnd);
default:
return FALSE;
}
default:
return FALSE;
}
@ -326,6 +426,7 @@ eam_unit_ui_handle_init(HWND hwnd, const struct eam_unit_def *def)
eam_unit_ui_handle_init_devs(hwnd);
eam_unit_ui_handle_init_path(hwnd);
eam_unit_ui_handle_init_alt_10k(hwnd);
return TRUE;
}
@ -401,6 +502,17 @@ static void eam_unit_ui_handle_init_path(HWND hwnd)
}
}
static void eam_unit_ui_handle_init_alt_10k(HWND hwnd)
{
struct eam_unit_ui *ui;
ui = (struct eam_unit_ui *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (eam_io_config_api->get_alt_10k(ui->def->unit_no)) {
SendMessage(GetDlgItem(hwnd, IDC_ALT_10K), BM_SETCHECK, BST_CHECKED, 0);
}
}
static INT_PTR eam_unit_ui_handle_browse(HWND hwnd)
{
struct eam_unit_ui *ui;
@ -451,6 +563,28 @@ static INT_PTR eam_unit_ui_handle_change_device(HWND hwnd)
eam_io_config_api->set_keypad_device(ui->def->unit_no, hid);
}
// enable the keypad mux option if the devices/keys conflict
EnableWindow(eam_mux_keypad_dlg, eam_io_config_api->do_keypads_conflict());
return TRUE;
}
static INT_PTR eam_unit_ui_handle_change_alt_10k(HWND hwnd)
{
struct eam_unit_ui *ui;
HWND btn;
bool alt_10k;
ui = (struct eam_unit_ui *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
btn = GetDlgItem(hwnd, IDC_ALT_10K);
alt_10k = SendMessage(btn, BM_GETCHECK, 0, 0) == BST_CHECKED;
eam_io_config_api->set_alt_10k(ui->def->unit_no, alt_10k);
// enable the keypad mux option if the devices/keys conflict
EnableWindow(eam_mux_keypad_dlg, eam_io_config_api->do_keypads_conflict());
return TRUE;
}
@ -459,14 +593,28 @@ static INT_PTR eam_unit_ui_handle_tick(HWND hwnd)
struct eam_unit_ui *ui;
uint16_t state;
wchar_t state_str[9];
bool card_present;
// keypad state
ui = (struct eam_unit_ui *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
state = eam_io_get_keypad_state(ui->def->unit_no);
wstr_format(state_str, lengthof(state_str), L"%04x", state);
SetWindowText(GetDlgItem(hwnd, IDC_KEYPAD_STATE), state_str);
// smartcard state
if (eam_io_config_api->get_scard()) {
eam_io_poll(ui->def->unit_no);
card_present = eam_io_get_sensor_state(ui->def->unit_no);
SetWindowText(
GetDlgItem(hwnd, IDC_SCARD_IS_PRESENT),
(card_present ? L"YES" : L"NO"));
}
return TRUE;
}

View File

@ -20,7 +20,6 @@
#define IDC_LIGHT 1001
#define IDC_SENSITIVITY 1001
#define IDC_ACTION_NAME 1002
#define IDC_ALT_10K 1002
#define IDC_KEYPAD_STATE 1002
#define IDC_GAME_TYPE 1003
#define IDC_GROUP 1003
@ -39,6 +38,15 @@
#define IDC_BINDING_MAX 1010
#define IDC_LIMIT_MAX 1011
#define IDC_CURRENT 1013
#define IDC_SCARD 1014
#define IDC_ALT_10K 1015
#define IDC_MUX_KEYPAD 1016
#define IDC_MUX_SCARD 1017
#define IDC_CARD_TEXT 1018
#define IDC_SCARD_TEXT 1019
#define IDC_SCARD_READER_NAME 1020
#define IDC_SCARD_CARD_TEXT 1021
#define IDC_SCARD_IS_PRESENT 1022
#define IDC_BINDING_EDIT_MANY 40000
#define IDS_APPNAME 40000
#define IDS_BAD_GAME_TYPE 40001