Skip to content

Commit

Permalink
Pass keyboard event to the active window only
Browse files Browse the repository at this point in the history
  • Loading branch information
tyfkda committed Jul 1, 2023
1 parent 8aa706e commit 9115cfa
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 19 deletions.
21 changes: 17 additions & 4 deletions src/app/key_config_wnd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {DomUtil} from '../util/dom_util'
import {GamepadManager} from '../util/gamepad_manager'
import {PadBit} from '../nes/apu'
import {PadKeyHandler} from '../util/pad_key_handler'
import {KeyboardManager} from '../util/keyboard_manager'
import {WindowManager} from '../wnd/window_manager'
import {Wnd} from '../wnd/wnd'
import {WndEvent} from '../wnd/types'
Expand Down Expand Up @@ -260,27 +261,39 @@ const kKeyLabels: Record<string, string> = (() => {
})()

export class KeyConfigWnd extends GamepadBaseWnd {
private keyboardManager = new KeyboardManager()

public constructor(wndMgr: WindowManager, onClose?: () => void) {
super(wndMgr, 'Key Config', kGamepadLabels, onClose)
this.updateLabels()
wndMgr.add(this)

const onKeyDown = (event: KeyboardEvent) => {
event.preventDefault()
this.keyboardManager.onKeyDown(event)
}
const onKeyUp = (event: KeyboardEvent) => {
event.preventDefault()
this.keyboardManager.onKeyUp(event)
}
const root = document.body // TODO:
root.addEventListener('keydown', onKeyDown)
root.addEventListener('keyup', onKeyUp)
}

protected checkGamepad(): number {
const padNo = 0
const keyboardManager = this.wndMgr.getKeyboardManager()
const table = PadKeyHandler.getMapping(padNo)
let state = 0
for (let i = 0; i < table.length; ++i) {
if (keyboardManager.getKeyPressing(table[i].key))
if (this.keyboardManager.getKeyPressing(table[i].key))
state |= table[i].bit
}
return state
}

protected modifyButton(buttonIndex: number): boolean {
const keyboardManager = this.wndMgr.getKeyboardManager()
const key = keyboardManager.getLastPressing()
const key = this.keyboardManager.getLastPressing()
if (!key)
return false

Expand Down
25 changes: 22 additions & 3 deletions src/app/screen_wnd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {GlobalSetting} from './global_setting'
import {ScalerType} from './def'
import {PadBit, PadValue} from '../nes/apu'
import {PadKeyHandler} from '../util/pad_key_handler'
import {KeyboardManager} from '../util/keyboard_manager'
import {GamepadManager} from '../util/gamepad_manager'
import {RegisterWnd, RamWnd, TraceWnd, ControlWnd} from './debug_wnd'
import {FpsWnd, PaletWnd, NameTableWnd, PatternTableWnd, AudioWnd} from './other_wnd'
Expand Down Expand Up @@ -96,6 +97,7 @@ export class ScreenWnd extends Wnd {
private menuItems: Array<MenuItemInfo>
private scalerType: ScalerType = ScalerType.NEAREST
private padKeyHandler = new PadKeyHandler()
private keyboardManager = new KeyboardManager()
private timeScale = 1
private fullscreenResizeFunc: () => void
private repeatBtnFrame = false
Expand Down Expand Up @@ -247,8 +249,26 @@ export class ScreenWnd extends Wnd {
if (!param) {
this.timeScale = TIME_SCALE_NORMAL
this.padKeyHandler.clearAll()
this.keyboardManager.clear()
}
break

case WndEvent.KEY_DOWN:
{
const event = param as KeyboardEvent
if (!(event.ctrlKey || event.altKey || event.metaKey))
this.keyboardManager.onKeyDown(event)
}
break

case WndEvent.KEY_UP:
{
const event = param as KeyboardEvent
if (!(event.ctrlKey || event.altKey || event.metaKey))
this.keyboardManager.onKeyUp(event)
}
break

default:
break
}
Expand Down Expand Up @@ -665,9 +685,8 @@ export class ScreenWnd extends Wnd {
}

private update(elapsedTime: number) {
this.padKeyHandler.update(this.wndMgr.getKeyboardManager())
const speedUp = (this.isTop() &&
this.wndMgr.getKeyboardManager().getKeyPressing('ShiftLeft'))
this.padKeyHandler.update(this.keyboardManager)
const speedUp = this.keyboardManager.getKeyPressing('ShiftLeft')
this.timeScale = speedUp ? TIME_SCALE_FAST : TIME_SCALE_NORMAL

this.stream.triggerStartCalc()
Expand Down
2 changes: 2 additions & 0 deletions src/wnd/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export const enum WndEvent {
RESIZE_MOVE,
RESIZE_END,
FOCUS, // param: true or false
KEY_DOWN,
KEY_UP,
}

export interface SubmenuItemInfo {
Expand Down
20 changes: 8 additions & 12 deletions src/wnd/window_manager.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import {DomUtil} from '../util/dom_util'
import {KeyboardManager} from '../util/keyboard_manager'
import {SubmenuItemInfo} from './types'
import {StartMenu} from './start_menu'
import {Wnd} from './wnd'
Expand All @@ -15,7 +14,6 @@ function setWindowZIndex(wnd: Wnd, i: number, n: number): void {

export class WindowManager {
private windows: Wnd[] = []
private keyboardManager = new KeyboardManager()

private onKeyDown: (event: KeyboardEvent) => void
private onKeyUp: (event: KeyboardEvent) => void
Expand All @@ -33,15 +31,14 @@ export class WindowManager {
}
}

if (event.ctrlKey || event.altKey || event.metaKey)
return

event.preventDefault()
this.keyboardManager.onKeyDown(event)
if (this.windows.length > 0)
this.windows[0].onEvent(WndEvent.KEY_DOWN, event)
}
this.onKeyUp = (event: KeyboardEvent) => {
event.preventDefault()
this.keyboardManager.onKeyUp(event)
if (this.windows.length > 0)
this.windows[0].onEvent(WndEvent.KEY_UP, event)
}
this.root.addEventListener('keydown', this.onKeyDown)
this.root.addEventListener('keyup', this.onKeyUp)
Expand All @@ -63,10 +60,6 @@ export class WindowManager {
return this.blurred
}

public getKeyboardManager(): KeyboardManager {
return this.keyboardManager
}

public add(wnd: Wnd): void {
if (this.windows.length > 0)
this.windows[0].onEvent(WndEvent.FOCUS, false)
Expand Down Expand Up @@ -204,10 +197,13 @@ export class WindowManager {
private setUpBlur(): void {
window.addEventListener('focus', () => {
this.blurred = false
if (this.windows.length > 0)
this.windows[0].onEvent(WndEvent.FOCUS, true)
})
window.addEventListener('blur', () => {
this.blurred = true
this.keyboardManager.clear()
if (this.windows.length > 0)
this.windows[0].onEvent(WndEvent.FOCUS, false)
})
}

Expand Down

0 comments on commit 9115cfa

Please sign in to comment.