Fix WiFi password entry

This commit is contained in:
NeilClack
2026-03-13 19:57:06 -05:00
parent df5e64d38a
commit ee2b3383a8
+34 -24
View File
@@ -14,6 +14,7 @@ import (
"rhemawavetech.com/rhemawave/internal/db" "rhemawavetech.com/rhemawave/internal/db"
"rhemawavetech.com/rhemawave/internal/fontManager" "rhemawavetech.com/rhemawave/internal/fontManager"
"rhemawavetech.com/rhemawave/internal/keybinds" "rhemawavetech.com/rhemawave/internal/keybinds"
"rhemawavetech.com/rhemawave/internal/logger"
"rhemawavetech.com/rhemawave/internal/network" "rhemawavetech.com/rhemawave/internal/network"
"rhemawavetech.com/rhemawave/internal/shaderManager" "rhemawavetech.com/rhemawave/internal/shaderManager"
) )
@@ -165,83 +166,91 @@ func (p *WiFiSetupPage) startScan() {
// HandleEvent processes user input. // HandleEvent processes user input.
func (p *WiFiSetupPage) HandleEvent(event *sdl.Event) error { func (p *WiFiSetupPage) HandleEvent(event *sdl.Event) error {
if p.isEnteringPassword && !sdl.IsTextInputActive() {
p.enterPasswordMode()
}
switch e := (*event).(type) { switch e := (*event).(type) {
case *sdl.TextInputEvent: case *sdl.TextInputEvent:
if p.isEnteringPassword { if p.isEnteringPassword {
if !p.textInputSupported { text := e.GetText()
// First TextInputEvent: the keyboard fallback already
// handled this character, so just record that text input // Append text exactly as SDL delivers it
// is supported and skip the duplicate append. p.passwordInput += text
p.textInputSupported = true
} else { // Log every character
p.passwordInput += e.GetText() for _, r := range text {
p.updatePasswordTexture() logger.Info("WiFi Password character entered: %c", r)
} }
p.updatePasswordTexture()
} }
case *sdl.KeyboardEvent: case *sdl.KeyboardEvent:
if e.Type != sdl.KEYDOWN { if e.Type != sdl.KEYDOWN {
return nil return nil
} }
if p.isEnteringPassword { if p.isEnteringPassword {
p.handlePasswordInput(e.Keysym.Sym, e.Keysym.Mod) p.handlePasswordInput(e.Keysym.Sym)
} else { } else {
p.handleNetworkSelection(e.Keysym.Sym) p.handleNetworkSelection(e.Keysym.Sym)
} }
} }
return nil return nil
} }
// handlePasswordInput manages keyboard events during password entry. // handlePasswordInput manages keyboard events during password entry.
func (p *WiFiSetupPage) handlePasswordInput(sym sdl.Keycode, mod uint16) { func (p *WiFiSetupPage) handlePasswordInput(sym sdl.Keycode) {
switch sym { switch sym {
case sdl.K_RETURN: case sdl.K_RETURN:
p.exitPasswordMode() p.exitPasswordMode()
p.pendingSSID = p.selectedAP.SSID p.pendingSSID = p.selectedAP.SSID
p.isConnecting = true p.isConnecting = true
p.connectionError = "" p.connectionError = ""
p.connectionAttemptTime = time.Now() p.connectionAttemptTime = time.Now()
err := p.networkManager.Connect(*p.wifiDevice, *p.selectedAP, p.passwordInput) err := p.networkManager.Connect(*p.wifiDevice, *p.selectedAP, p.passwordInput)
if err != nil { if err != nil {
p.isConnecting = false p.isConnecting = false
p.pendingSSID = "" p.pendingSSID = ""
p.connectionError = "Failed to initiate connection" p.connectionError = "Failed to initiate connection"
} }
p.isEnteringPassword = false p.isEnteringPassword = false
case sdl.K_BACKSPACE: case sdl.K_BACKSPACE:
if len(p.passwordInput) > 0 { if len(p.passwordInput) > 0 {
p.passwordInput = p.passwordInput[:len(p.passwordInput)-1] p.passwordInput = p.passwordInput[:len(p.passwordInput)-1]
logger.Info("WiFi Password backspace pressed")
p.updatePasswordTexture() p.updatePasswordTexture()
} }
case sdl.K_ESCAPE: case sdl.K_ESCAPE:
logger.Info("WiFi Password entry cancelled")
p.isEnteringPassword = false p.isEnteringPassword = false
p.pendingSSID = "" p.pendingSSID = ""
p.connectionError = "" p.connectionError = ""
p.exitPasswordMode() p.exitPasswordMode()
default:
// Keyboard fallback: if TextInputEvent was not received for this
// event cycle, convert printable keycodes to characters directly.
// This handles kiosk systems without an input method framework.
if !p.textInputSupported {
if ch := keycodeToChar(sym, mod); ch != 0 {
p.passwordInput += string(ch)
p.updatePasswordTexture()
}
}
} }
} }
// enterPasswordMode disables global keybinds and starts SDL text input. // enterPasswordMode disables global keybinds and starts SDL text input.
func (p *WiFiSetupPage) enterPasswordMode() { func (p *WiFiSetupPage) enterPasswordMode() {
keybinds.Enabled = false keybinds.Enabled = false
p.passwordInput = ""
logger.Info("WiFi Password entry started")
sdl.StartTextInput() sdl.StartTextInput()
} }
// exitPasswordMode re-enables global keybinds and stops SDL text input. // exitPasswordMode re-enables global keybinds and stops SDL text input.
func (p *WiFiSetupPage) exitPasswordMode() { func (p *WiFiSetupPage) exitPasswordMode() {
logger.Info("WiFi Password entry finished")
keybinds.Enabled = true keybinds.Enabled = true
sdl.StopTextInput() sdl.StopTextInput()
} }
@@ -257,6 +266,7 @@ func keycodeToChar(sym sdl.Keycode, mod uint16) rune {
if shifted { if shifted {
ch -= 'a' - 'A' ch -= 'a' - 'A'
} }
logger.Info("Wifi Password entered: %v", ch)
return ch return ch
} }