Skip to content

Commit 0d4d4a5

Browse files
committed
[add] a basic key event system and setup common event handlers inside the demo app.
1 parent 7e86b40 commit 0d4d4a5

4 files changed

Lines changed: 100 additions & 8 deletions

File tree

crates/lambda-platform/src/winit/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ use winit::{
2323
pub mod winit_exports {
2424
pub use winit::{
2525
event::{
26+
ElementState,
2627
Event,
28+
VirtualKeyCode,
2729
WindowEvent,
2830
},
2931
event_loop::{

lambda/src/core/events.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,49 @@
11
use std::time::Instant;
22

33
/// events generated by kernel interactions with the component.
4-
#[derive(Debug)]
4+
#[derive(Debug, Clone)]
55
pub enum ComponentEvent {
66
Attached { name: String },
77
Detached { name: String },
8-
Update { delta: Instant },
98
}
109

1110
/// Window events are generated in response to window events coming from
1211
/// the windowing system.
13-
#[derive(Debug)]
12+
#[derive(Debug, Clone)]
1413
pub enum WindowEvent {
1514
Close,
1615
Resize { width: u32, height: u32 },
1716
}
1817

1918
/// Kernel events are generated by the kernel itself
20-
#[derive(Debug)]
19+
#[derive(Debug, Clone)]
2120
pub enum RuntimeEvent {
2221
Initialized,
2322
Shutdown,
2423
}
2524

25+
/// Exports the winit virtual key codes to this namespace for convenience.
26+
pub use lambda_platform::winit::winit_exports::VirtualKeyCode as VirtualKey;
27+
28+
#[derive(Debug, Clone)]
29+
pub enum KeyEvent {
30+
KeyPressed {
31+
scan_code: u32,
32+
virtual_key: VirtualKey,
33+
},
34+
KeyReleased {
35+
scan_code: u32,
36+
virtual_key: VirtualKey,
37+
},
38+
ModifierPressed {
39+
modifier: u32,
40+
virtual_key: VirtualKey,
41+
},
42+
}
43+
2644
/// Generic Event Enum which encapsulates all possible events that will be
2745
/// emitted by the LambdaKernel
28-
#[derive(Debug)]
46+
#[derive(Debug, Clone)]
2947
pub enum Events {
3048
Component {
3149
event: ComponentEvent,
@@ -39,4 +57,8 @@ pub enum Events {
3957
event: RuntimeEvent,
4058
issued_at: Instant,
4159
},
60+
Keyboard {
61+
event: KeyEvent,
62+
issued_at: Instant,
63+
},
4264
}

lambda/src/runtimes/mod.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::time::Instant;
33
use lambda_platform::winit::{
44
winit_exports::{
55
ControlFlow,
6+
ElementState,
67
Event as WinitEvent,
78
WindowEvent as WinitWindowEvent,
89
},
@@ -15,6 +16,7 @@ use crate::core::{
1516
events::{
1617
ComponentEvent,
1718
Events,
19+
KeyEvent,
1820
RuntimeEvent,
1921
WindowEvent,
2022
},
@@ -176,10 +178,32 @@ impl Runtime for GenericRuntime {
176178
WinitWindowEvent::ReceivedCharacter(_) => {}
177179
WinitWindowEvent::Focused(_) => {}
178180
WinitWindowEvent::KeyboardInput {
179-
device_id,
181+
device_id: _,
180182
input,
181183
is_synthetic,
182-
} => {}
184+
} => match (input.state, is_synthetic) {
185+
(ElementState::Pressed, false) => {
186+
publisher.publish_event(Events::Keyboard {
187+
event: KeyEvent::KeyPressed {
188+
scan_code: input.scancode,
189+
virtual_key: input.virtual_keycode.unwrap(),
190+
},
191+
issued_at: Instant::now(),
192+
})
193+
}
194+
(ElementState::Released, false) => {
195+
publisher.publish_event(Events::Keyboard {
196+
event: KeyEvent::KeyReleased {
197+
scan_code: input.scancode,
198+
virtual_key: input.virtual_keycode.unwrap(),
199+
},
200+
issued_at: Instant::now(),
201+
})
202+
}
203+
_ => {
204+
println!("Unhandled synthetic keyboard event: {:?}", input);
205+
}
206+
},
183207
WinitWindowEvent::ModifiersChanged(_) => {}
184208
WinitWindowEvent::CursorMoved {
185209
device_id,

tools/lambda_rs_demo/src/main.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,51 @@ impl Component<Events> for DemoComponent {
4444

4545
fn on_detach(self: &mut DemoComponent) {}
4646

47-
fn on_event(self: &mut DemoComponent, _event: &lambda::core::events::Events) {
47+
fn on_event(self: &mut DemoComponent, event: &lambda::core::events::Events) {
48+
match event {
49+
Events::Runtime { event, issued_at } => match event {
50+
lambda::core::events::RuntimeEvent::Shutdown => {
51+
println!("Shutting down the runtime");
52+
}
53+
_ => {}
54+
},
55+
Events::Window { event, issued_at } => match event {
56+
lambda::core::events::WindowEvent::Resize { width, height } => {
57+
println!("Window resized to {}x{}", width, height);
58+
}
59+
lambda::core::events::WindowEvent::Close => {
60+
println!("Window closed");
61+
}
62+
},
63+
Events::Keyboard { event, issued_at } => match event {
64+
lambda::core::events::KeyEvent::KeyPressed {
65+
scan_code,
66+
virtual_key,
67+
} => {
68+
println!("Key pressed: {:?}", virtual_key);
69+
}
70+
lambda::core::events::KeyEvent::KeyReleased {
71+
scan_code,
72+
virtual_key,
73+
} => {
74+
println!("Key released: {:?}", virtual_key);
75+
}
76+
lambda::core::events::KeyEvent::ModifierPressed {
77+
modifier,
78+
virtual_key,
79+
} => {
80+
println!("Modifier pressed: {:?}", virtual_key);
81+
}
82+
},
83+
Events::Component { event, issued_at } => match event {
84+
lambda::core::events::ComponentEvent::Attached { name } => {
85+
println!("Component attached: {:?}", name);
86+
}
87+
lambda::core::events::ComponentEvent::Detached { name } => {
88+
println!("Component detached: {:?}", name);
89+
}
90+
},
91+
}
4892
}
4993

5094
fn on_update(self: &mut DemoComponent, last_frame: &std::time::Duration) {

0 commit comments

Comments
 (0)