magma_winit 0.1.0-alpha.9

Part of the Magma-API, which is the API of the Magma3D game engine. A winit windowing and input backend implementation.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
/*!
This crate integrates [`winit`] into the Magma API in order to manage application windows.

# Example

```
# use std::error::Error;
# use magma_app::{magma_ecs::entities::Entity, App, schedule::Update, World};
# use magma_windowing::Window;
# use magma_winit::WinitModule;
fn main() -> Result<(), Box<dyn Error>> {
    let mut app = App::new();
    app.add_module(WinitModule);
    // Add the system to close created windows.
    // Windows should not be closed in a startup system, bc it might cause the app to hang.
    app.add_systems::<Update>(&[(close_windows, "close_windows", &[])]).unwrap();
    // create a window
    // The winit module will create a single window on startup. That means there will now be two.
    app.world.create_entity((Window::new().with_title("test"),))?;
    app.run();
    Ok(())
}

// system for closing the opened windows
fn close_windows(world: &World) {
    // close windows
    world
        .query::<(Window,)>()
        .unwrap()
        .iter()
        .for_each(|window| window.delete());
}
```
*/

use magma_app::schedule::{PostUpdate, PreUpdate, Startup, Update};
use magma_app::{App, module::Module};
use magma_input::InputModule;
use magma_input::input_event::{
    KeyboardInput, MouseButtonInput, MouseMotionInput, MouseScrollInput,
};
use magma_math::{IVec2, UVec2, Vec2};
use magma_windowing::monitor::VideoMode;
use magma_windowing::window::WindowTheme;
use magma_windowing::{Monitor, PrimaryMonitor, window_event::*};
use magma_windowing::{Window, WindowingModule};
use windows::Windows;
use winit::event_loop::ActiveEventLoop;
use winit::{
    application::ApplicationHandler,
    event::WindowEvent,
    event_loop::{ControlFlow, EventLoop},
};

mod systems;
pub mod windows;

/**
The [`WinitModule`] adds winit as a backend for [magma_windowing](https://crates.io/crates/magma_windowing). It also automatically creates one window on application start.
*/
pub struct WinitModule;

impl Module for WinitModule {
    fn setup(self, app: &mut magma_app::App) {
        app.set_runner(winit_event_loop);
        app.add_module(WindowingModule);
        app.add_module(InputModule);

        app.world.add_resource(Windows::new()).unwrap();

        app.add_systems::<PreUpdate>(&[(
            systems::delete_pending_windows,
            "window_management",
            &[],
        )])
        .unwrap();

        // default event handling
        app.add_event_systems::<WindowCloseRequested>(&[(
            systems::mark_closed_windows,
            "winit_mark_closed",
            &[],
        )])
        .unwrap();
        app.add_event_systems::<WindowResized>(&[(systems::resized, "winit_resized", &[])])
            .unwrap();
        app.add_event_systems::<WindowMoved>(&[(systems::moved, "winit_moved", &[])])
            .unwrap();
        app.add_event_systems::<WindowFocused>(&[(systems::focused, "winit_focused", &[])])
            .unwrap();
    }
}

pub struct WrappedApp {
    pub app: App,
}

impl WrappedApp {
    pub fn new(app: App) -> Self {
        Self { app }
    }
}

impl ApplicationHandler for WrappedApp {
    fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) {
        let primary_monitor = event_loop.primary_monitor();
        for (id, winit_monitor) in event_loop.available_monitors().enumerate() {
            let monitor = Monitor {
                name: winit_monitor.name(),
                height: winit_monitor.size().height,
                width: winit_monitor.size().width,
                position: IVec2::new(winit_monitor.position().x, winit_monitor.position().y),
                refresh_rate: winit_monitor.refresh_rate_millihertz(),
                scale_factor: winit_monitor.scale_factor(),
                video_modes: winit_monitor
                    .video_modes()
                    .map(|video_mode_handle| VideoMode {
                        size: UVec2::new(
                            video_mode_handle.size().width,
                            video_mode_handle.size().height,
                        ),
                        bit_depth: video_mode_handle.bit_depth(),
                        refresh_rate: video_mode_handle.refresh_rate_millihertz(),
                    })
                    .collect(),
                id,
            };
            if primary_monitor.as_ref() == Some(&winit_monitor) {
                self.app
                    .world
                    .create_entity((monitor, PrimaryMonitor))
                    .unwrap();
            } else {
                self.app.world.create_entity((monitor,)).unwrap();
            }
        }
    }

    fn window_event(
        &mut self,
        _: &winit::event_loop::ActiveEventLoop,
        window_id: winit::window::WindowId,
        event: WindowEvent,
    ) {
        // convert winit events to app events
        match event {
            WindowEvent::Resized(physical_size) => self
                .app
                .world
                .send_event(WindowResized {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    width: physical_size.width,
                    height: physical_size.height,
                })
                .unwrap(),
            WindowEvent::Moved(physical_position) => self
                .app
                .world
                .send_event(WindowMoved {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    position: IVec2 {
                        x: physical_position.x,
                        y: physical_position.y,
                    },
                })
                .unwrap(),
            WindowEvent::CloseRequested => self
                .app
                .world
                .send_event(WindowCloseRequested {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            WindowEvent::Destroyed => self.app.world.send_event(WindowDestroyed).unwrap(),
            WindowEvent::DroppedFile(path_buf) => self
                .app
                .world
                .send_event(FileDragDrop::Dropped {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    path: path_buf,
                })
                .unwrap(),
            WindowEvent::HoveredFile(path_buf) => self
                .app
                .world
                .send_event(FileDragDrop::Hovered {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    path: path_buf,
                })
                .unwrap(),
            WindowEvent::HoveredFileCancelled => self
                .app
                .world
                .send_event(FileDragDrop::HoverCanceled {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            WindowEvent::Focused(focus) => self
                .app
                .world
                .send_event(WindowFocused {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    focus,
                })
                .unwrap(),
            WindowEvent::CursorMoved { position, .. } => self
                .app
                .world
                .send_event(CursorMoved {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    position: IVec2 {
                        x: position.x as i32,
                        y: position.y as i32,
                    },
                })
                .unwrap(),
            WindowEvent::CursorEntered { .. } => self
                .app
                .world
                .send_event(CursorEntered {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            WindowEvent::CursorLeft { .. } => self
                .app
                .world
                .send_event(CursorLeft {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            WindowEvent::ThemeChanged(theme) => self
                .app
                .world
                .send_event(WindowThemeChanged {
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                    theme: match theme {
                        winit::window::Theme::Light => WindowTheme::Light,
                        winit::window::Theme::Dark => WindowTheme::Dark,
                    },
                })
                .unwrap(),
            WindowEvent::Occluded(occlusion) => self
                .app
                .world
                .send_event(match occlusion {
                    true => WindowOcclusion::Occluded {
                        window: *self
                            .app
                            .world
                            .get_resource::<Windows>()
                            .unwrap()
                            .window_to_entity
                            .get(&window_id)
                            .unwrap(),
                    },
                    false => WindowOcclusion::NotOccluded {
                        window: *self
                            .app
                            .world
                            .get_resource::<Windows>()
                            .unwrap()
                            .window_to_entity
                            .get(&window_id)
                            .unwrap(),
                    },
                })
                .unwrap(),
            WindowEvent::RedrawRequested => self.app.world.send_event(RedrawRequested).unwrap(),
            WindowEvent::KeyboardInput { event, .. } => self
                .app
                .world
                .send_event(KeyboardInput {
                    key: match event.logical_key {
                        winit::keyboard::Key::Named(named_key) => match named_key {
                            winit::keyboard::NamedKey::Alt => magma_input::keyboard::Key::Alt,
                            winit::keyboard::NamedKey::AltGraph => {
                                magma_input::keyboard::Key::AltGraph
                            }
                            winit::keyboard::NamedKey::CapsLock => {
                                magma_input::keyboard::Key::CapsLock
                            }
                            winit::keyboard::NamedKey::Control => {
                                magma_input::keyboard::Key::Control
                            }
                            winit::keyboard::NamedKey::Fn => magma_input::keyboard::Key::Fn,
                            winit::keyboard::NamedKey::FnLock => magma_input::keyboard::Key::FnLock,
                            winit::keyboard::NamedKey::NumLock => {
                                magma_input::keyboard::Key::NumLock
                            }
                            winit::keyboard::NamedKey::ScrollLock => {
                                magma_input::keyboard::Key::ScrollLock
                            }
                            winit::keyboard::NamedKey::Shift => magma_input::keyboard::Key::Shift,
                            winit::keyboard::NamedKey::Symbol => magma_input::keyboard::Key::Symbol,
                            winit::keyboard::NamedKey::SymbolLock => {
                                magma_input::keyboard::Key::SymbolLock
                            }
                            winit::keyboard::NamedKey::Meta => magma_input::keyboard::Key::Meta,
                            winit::keyboard::NamedKey::Hyper => magma_input::keyboard::Key::Hyper,
                            winit::keyboard::NamedKey::Super => magma_input::keyboard::Key::Super,
                            winit::keyboard::NamedKey::Enter => magma_input::keyboard::Key::Enter,
                            winit::keyboard::NamedKey::Tab => magma_input::keyboard::Key::Tab,
                            winit::keyboard::NamedKey::Space => magma_input::keyboard::Key::Space,
                            winit::keyboard::NamedKey::ArrowDown => {
                                magma_input::keyboard::Key::ArrowDown
                            }
                            winit::keyboard::NamedKey::ArrowLeft => {
                                magma_input::keyboard::Key::ArrowLeft
                            }
                            winit::keyboard::NamedKey::ArrowRight => {
                                magma_input::keyboard::Key::ArrowRight
                            }
                            winit::keyboard::NamedKey::ArrowUp => {
                                magma_input::keyboard::Key::ArrowUp
                            }
                            winit::keyboard::NamedKey::End => magma_input::keyboard::Key::End,
                            winit::keyboard::NamedKey::Home => magma_input::keyboard::Key::Home,
                            winit::keyboard::NamedKey::PageDown => {
                                magma_input::keyboard::Key::PageDown
                            }
                            winit::keyboard::NamedKey::PageUp => magma_input::keyboard::Key::PageUp,
                            winit::keyboard::NamedKey::Backspace => {
                                magma_input::keyboard::Key::Backspace
                            }
                            winit::keyboard::NamedKey::Clear => magma_input::keyboard::Key::Clear,
                            winit::keyboard::NamedKey::Copy => magma_input::keyboard::Key::Copy,
                            winit::keyboard::NamedKey::CrSel => magma_input::keyboard::Key::CrSel,
                            winit::keyboard::NamedKey::Cut => magma_input::keyboard::Key::Cut,
                            winit::keyboard::NamedKey::Delete => magma_input::keyboard::Key::Delete,
                            winit::keyboard::NamedKey::EraseEof => {
                                magma_input::keyboard::Key::EraseEof
                            }
                            winit::keyboard::NamedKey::ExSel => magma_input::keyboard::Key::ExSel,
                            winit::keyboard::NamedKey::Insert => magma_input::keyboard::Key::Insert,
                            winit::keyboard::NamedKey::Paste => magma_input::keyboard::Key::Paste,
                            winit::keyboard::NamedKey::Redo => magma_input::keyboard::Key::Redo,
                            winit::keyboard::NamedKey::Undo => magma_input::keyboard::Key::Undo,
                            winit::keyboard::NamedKey::Accept => magma_input::keyboard::Key::Accept,
                            winit::keyboard::NamedKey::Again => magma_input::keyboard::Key::Again,
                            winit::keyboard::NamedKey::Attn => magma_input::keyboard::Key::Attn,
                            winit::keyboard::NamedKey::Cancel => magma_input::keyboard::Key::Cancel,
                            winit::keyboard::NamedKey::ContextMenu => {
                                magma_input::keyboard::Key::ContextMenu
                            }
                            winit::keyboard::NamedKey::Escape => magma_input::keyboard::Key::Escape,
                            winit::keyboard::NamedKey::Execute => {
                                magma_input::keyboard::Key::Execute
                            }
                            winit::keyboard::NamedKey::Find => magma_input::keyboard::Key::Find,
                            winit::keyboard::NamedKey::Help => magma_input::keyboard::Key::Help,
                            winit::keyboard::NamedKey::Pause => magma_input::keyboard::Key::Pause,
                            winit::keyboard::NamedKey::Play => magma_input::keyboard::Key::Play,
                            winit::keyboard::NamedKey::Props => magma_input::keyboard::Key::Props,
                            winit::keyboard::NamedKey::Select => magma_input::keyboard::Key::Select,
                            winit::keyboard::NamedKey::ZoomIn => magma_input::keyboard::Key::ZoomIn,
                            winit::keyboard::NamedKey::ZoomOut => {
                                magma_input::keyboard::Key::ZoomOut
                            }
                            winit::keyboard::NamedKey::BrightnessDown => {
                                magma_input::keyboard::Key::BrightnessDown
                            }
                            winit::keyboard::NamedKey::BrightnessUp => {
                                magma_input::keyboard::Key::BrightnessUp
                            }
                            winit::keyboard::NamedKey::Eject => magma_input::keyboard::Key::Eject,
                            winit::keyboard::NamedKey::LogOff => magma_input::keyboard::Key::LogOff,
                            winit::keyboard::NamedKey::Power => magma_input::keyboard::Key::Power,
                            winit::keyboard::NamedKey::PowerOff => {
                                magma_input::keyboard::Key::PowerOff
                            }
                            winit::keyboard::NamedKey::PrintScreen => {
                                magma_input::keyboard::Key::PrintScreen
                            }
                            winit::keyboard::NamedKey::Hibernate => {
                                magma_input::keyboard::Key::Hibernate
                            }
                            winit::keyboard::NamedKey::Standby => {
                                magma_input::keyboard::Key::Standby
                            }
                            winit::keyboard::NamedKey::WakeUp => magma_input::keyboard::Key::WakeUp,
                            winit::keyboard::NamedKey::AllCandidates => {
                                magma_input::keyboard::Key::AllCandidates
                            }
                            winit::keyboard::NamedKey::Alphanumeric => {
                                magma_input::keyboard::Key::Alphanumeric
                            }
                            winit::keyboard::NamedKey::CodeInput => {
                                magma_input::keyboard::Key::CodeInput
                            }
                            winit::keyboard::NamedKey::Compose => {
                                magma_input::keyboard::Key::Compose
                            }
                            winit::keyboard::NamedKey::Convert => {
                                magma_input::keyboard::Key::Convert
                            }
                            winit::keyboard::NamedKey::FinalMode => {
                                magma_input::keyboard::Key::FinalMode
                            }
                            winit::keyboard::NamedKey::GroupFirst => {
                                magma_input::keyboard::Key::GroupFirst
                            }
                            winit::keyboard::NamedKey::GroupLast => {
                                magma_input::keyboard::Key::GroupLast
                            }
                            winit::keyboard::NamedKey::GroupNext => {
                                magma_input::keyboard::Key::GroupNext
                            }
                            winit::keyboard::NamedKey::GroupPrevious => {
                                magma_input::keyboard::Key::GroupPrevious
                            }
                            winit::keyboard::NamedKey::ModeChange => {
                                magma_input::keyboard::Key::ModeChange
                            }
                            winit::keyboard::NamedKey::NextCandidate => {
                                magma_input::keyboard::Key::NextCandidate
                            }
                            winit::keyboard::NamedKey::NonConvert => {
                                magma_input::keyboard::Key::NonConvert
                            }
                            winit::keyboard::NamedKey::PreviousCandidate => {
                                magma_input::keyboard::Key::PreviousCandidate
                            }
                            winit::keyboard::NamedKey::Process => {
                                magma_input::keyboard::Key::Process
                            }
                            winit::keyboard::NamedKey::SingleCandidate => {
                                magma_input::keyboard::Key::SingleCandidate
                            }
                            winit::keyboard::NamedKey::HangulMode => {
                                magma_input::keyboard::Key::HangulMode
                            }
                            winit::keyboard::NamedKey::HanjaMode => {
                                magma_input::keyboard::Key::HanjaMode
                            }
                            winit::keyboard::NamedKey::JunjaMode => {
                                magma_input::keyboard::Key::JunjaMode
                            }
                            winit::keyboard::NamedKey::Eisu => magma_input::keyboard::Key::Eisu,
                            winit::keyboard::NamedKey::Hankaku => {
                                magma_input::keyboard::Key::Hankaku
                            }
                            winit::keyboard::NamedKey::Hiragana => {
                                magma_input::keyboard::Key::Hiragana
                            }
                            winit::keyboard::NamedKey::HiraganaKatakana => {
                                magma_input::keyboard::Key::HiraganaKatakana
                            }
                            winit::keyboard::NamedKey::KanaMode => {
                                magma_input::keyboard::Key::KanaMode
                            }
                            winit::keyboard::NamedKey::KanjiMode => {
                                magma_input::keyboard::Key::KanjiMode
                            }
                            winit::keyboard::NamedKey::Katakana => {
                                magma_input::keyboard::Key::Katakana
                            }
                            winit::keyboard::NamedKey::Romaji => magma_input::keyboard::Key::Romaji,
                            winit::keyboard::NamedKey::Zenkaku => {
                                magma_input::keyboard::Key::Zenkaku
                            }
                            winit::keyboard::NamedKey::ZenkakuHankaku => {
                                magma_input::keyboard::Key::ZenkakuHankaku
                            }
                            winit::keyboard::NamedKey::Soft1 => magma_input::keyboard::Key::Soft1,
                            winit::keyboard::NamedKey::Soft2 => magma_input::keyboard::Key::Soft2,
                            winit::keyboard::NamedKey::Soft3 => magma_input::keyboard::Key::Soft3,
                            winit::keyboard::NamedKey::Soft4 => magma_input::keyboard::Key::Soft4,
                            winit::keyboard::NamedKey::ChannelDown => {
                                magma_input::keyboard::Key::ChannelDown
                            }
                            winit::keyboard::NamedKey::ChannelUp => {
                                magma_input::keyboard::Key::ChannelUp
                            }
                            winit::keyboard::NamedKey::Close => magma_input::keyboard::Key::Close,
                            winit::keyboard::NamedKey::MailForward => {
                                magma_input::keyboard::Key::MailForward
                            }
                            winit::keyboard::NamedKey::MailReply => {
                                magma_input::keyboard::Key::MailReply
                            }
                            winit::keyboard::NamedKey::MailSend => {
                                magma_input::keyboard::Key::MailSend
                            }
                            winit::keyboard::NamedKey::MediaClose => {
                                magma_input::keyboard::Key::MediaClose
                            }
                            winit::keyboard::NamedKey::MediaFastForward => {
                                magma_input::keyboard::Key::MediaFastForward
                            }
                            winit::keyboard::NamedKey::MediaPause => {
                                magma_input::keyboard::Key::MediaPause
                            }
                            winit::keyboard::NamedKey::MediaPlay => {
                                magma_input::keyboard::Key::MediaPlay
                            }
                            winit::keyboard::NamedKey::MediaPlayPause => {
                                magma_input::keyboard::Key::MediaPlayPause
                            }
                            winit::keyboard::NamedKey::MediaRecord => {
                                magma_input::keyboard::Key::MediaRecord
                            }
                            winit::keyboard::NamedKey::MediaRewind => {
                                magma_input::keyboard::Key::MediaRewind
                            }
                            winit::keyboard::NamedKey::MediaStop => {
                                magma_input::keyboard::Key::MediaStop
                            }
                            winit::keyboard::NamedKey::MediaTrackNext => {
                                magma_input::keyboard::Key::MediaTrackNext
                            }
                            winit::keyboard::NamedKey::MediaTrackPrevious => {
                                magma_input::keyboard::Key::MediaTrackPrevious
                            }
                            winit::keyboard::NamedKey::New => magma_input::keyboard::Key::New,
                            winit::keyboard::NamedKey::Open => magma_input::keyboard::Key::Open,
                            winit::keyboard::NamedKey::Print => magma_input::keyboard::Key::Print,
                            winit::keyboard::NamedKey::Save => magma_input::keyboard::Key::Save,
                            winit::keyboard::NamedKey::SpellCheck => {
                                magma_input::keyboard::Key::SpellCheck
                            }
                            winit::keyboard::NamedKey::Key11 => magma_input::keyboard::Key::Key11,
                            winit::keyboard::NamedKey::Key12 => magma_input::keyboard::Key::Key12,
                            winit::keyboard::NamedKey::AudioBalanceLeft => {
                                magma_input::keyboard::Key::AudioBalanceLeft
                            }
                            winit::keyboard::NamedKey::AudioBalanceRight => {
                                magma_input::keyboard::Key::AudioBalanceRight
                            }
                            winit::keyboard::NamedKey::AudioBassBoostDown => {
                                magma_input::keyboard::Key::AudioBassBoostDown
                            }
                            winit::keyboard::NamedKey::AudioBassBoostToggle => {
                                magma_input::keyboard::Key::AudioBassBoostToggle
                            }
                            winit::keyboard::NamedKey::AudioBassBoostUp => {
                                magma_input::keyboard::Key::AudioBassBoostUp
                            }
                            winit::keyboard::NamedKey::AudioFaderFront => {
                                magma_input::keyboard::Key::AudioFaderFront
                            }
                            winit::keyboard::NamedKey::AudioFaderRear => {
                                magma_input::keyboard::Key::AudioFaderRear
                            }
                            winit::keyboard::NamedKey::AudioSurroundModeNext => {
                                magma_input::keyboard::Key::AudioSurroundModeNext
                            }
                            winit::keyboard::NamedKey::AudioTrebleDown => {
                                magma_input::keyboard::Key::AudioTrebleDown
                            }
                            winit::keyboard::NamedKey::AudioTrebleUp => {
                                magma_input::keyboard::Key::AudioTrebleUp
                            }
                            winit::keyboard::NamedKey::AudioVolumeDown => {
                                magma_input::keyboard::Key::AudioVolumeDown
                            }
                            winit::keyboard::NamedKey::AudioVolumeUp => {
                                magma_input::keyboard::Key::AudioVolumeUp
                            }
                            winit::keyboard::NamedKey::AudioVolumeMute => {
                                magma_input::keyboard::Key::AudioVolumeMute
                            }
                            winit::keyboard::NamedKey::MicrophoneToggle => {
                                magma_input::keyboard::Key::MicrophoneToggle
                            }
                            winit::keyboard::NamedKey::MicrophoneVolumeDown => {
                                magma_input::keyboard::Key::MicrophoneVolumeDown
                            }
                            winit::keyboard::NamedKey::MicrophoneVolumeUp => {
                                magma_input::keyboard::Key::MicrophoneVolumeDown
                            }
                            winit::keyboard::NamedKey::MicrophoneVolumeMute => {
                                magma_input::keyboard::Key::MicrophoneVolumeMute
                            }
                            winit::keyboard::NamedKey::SpeechCorrectionList => {
                                magma_input::keyboard::Key::SpeechCorrectionList
                            }
                            winit::keyboard::NamedKey::SpeechInputToggle => {
                                magma_input::keyboard::Key::SpeechInputToggle
                            }
                            winit::keyboard::NamedKey::LaunchApplication1 => {
                                magma_input::keyboard::Key::LaunchApplication1
                            }
                            winit::keyboard::NamedKey::LaunchApplication2 => {
                                magma_input::keyboard::Key::LaunchApplication2
                            }
                            winit::keyboard::NamedKey::LaunchCalendar => {
                                magma_input::keyboard::Key::LaunchCalendar
                            }
                            winit::keyboard::NamedKey::LaunchContacts => {
                                magma_input::keyboard::Key::LaunchContacts
                            }
                            winit::keyboard::NamedKey::LaunchMail => {
                                magma_input::keyboard::Key::LaunchMail
                            }
                            winit::keyboard::NamedKey::LaunchMediaPlayer => {
                                magma_input::keyboard::Key::LaunchMediaPlayer
                            }
                            winit::keyboard::NamedKey::LaunchMusicPlayer => {
                                magma_input::keyboard::Key::LaunchMusicPlayer
                            }
                            winit::keyboard::NamedKey::LaunchPhone => {
                                magma_input::keyboard::Key::LaunchPhone
                            }
                            winit::keyboard::NamedKey::LaunchScreenSaver => {
                                magma_input::keyboard::Key::LaunchScreenSaver
                            }
                            winit::keyboard::NamedKey::LaunchSpreadsheet => {
                                magma_input::keyboard::Key::LaunchSpreadsheet
                            }
                            winit::keyboard::NamedKey::LaunchWebBrowser => {
                                magma_input::keyboard::Key::LaunchWebBrowser
                            }
                            winit::keyboard::NamedKey::LaunchWebCam => {
                                magma_input::keyboard::Key::LaunchWebCam
                            }
                            winit::keyboard::NamedKey::LaunchWordProcessor => {
                                magma_input::keyboard::Key::LaunchWordProcessor
                            }
                            winit::keyboard::NamedKey::BrowserBack => {
                                magma_input::keyboard::Key::BrowserBack
                            }
                            winit::keyboard::NamedKey::BrowserFavorites => {
                                magma_input::keyboard::Key::BrowserFavorites
                            }
                            winit::keyboard::NamedKey::BrowserForward => {
                                magma_input::keyboard::Key::BrowserForward
                            }
                            winit::keyboard::NamedKey::BrowserHome => {
                                magma_input::keyboard::Key::BrowserHome
                            }
                            winit::keyboard::NamedKey::BrowserRefresh => {
                                magma_input::keyboard::Key::BrowserRefresh
                            }
                            winit::keyboard::NamedKey::BrowserSearch => {
                                magma_input::keyboard::Key::BrowserSearch
                            }
                            winit::keyboard::NamedKey::BrowserStop => {
                                magma_input::keyboard::Key::BrowserStop
                            }
                            winit::keyboard::NamedKey::AppSwitch => {
                                magma_input::keyboard::Key::AppSwitch
                            }
                            winit::keyboard::NamedKey::Call => magma_input::keyboard::Key::Call,
                            winit::keyboard::NamedKey::Camera => magma_input::keyboard::Key::Camera,
                            winit::keyboard::NamedKey::CameraFocus => {
                                magma_input::keyboard::Key::CameraFocus
                            }
                            winit::keyboard::NamedKey::EndCall => {
                                magma_input::keyboard::Key::EndCall
                            }
                            winit::keyboard::NamedKey::GoBack => magma_input::keyboard::Key::GoBack,
                            winit::keyboard::NamedKey::GoHome => magma_input::keyboard::Key::GoHome,
                            winit::keyboard::NamedKey::HeadsetHook => {
                                magma_input::keyboard::Key::HeadsetHook
                            }
                            winit::keyboard::NamedKey::LastNumberRedial => {
                                magma_input::keyboard::Key::LastNumberRedial
                            }
                            winit::keyboard::NamedKey::Notification => {
                                magma_input::keyboard::Key::Notification
                            }
                            winit::keyboard::NamedKey::MannerMode => {
                                magma_input::keyboard::Key::MannerMode
                            }
                            winit::keyboard::NamedKey::VoiceDial => {
                                magma_input::keyboard::Key::VoiceDial
                            }
                            winit::keyboard::NamedKey::TV => magma_input::keyboard::Key::TV,
                            winit::keyboard::NamedKey::TV3DMode => {
                                magma_input::keyboard::Key::TV3DMode
                            }
                            winit::keyboard::NamedKey::TVAntennaCable => {
                                magma_input::keyboard::Key::TVAntennaCable
                            }
                            winit::keyboard::NamedKey::TVAudioDescription => {
                                magma_input::keyboard::Key::TVAudioDescription
                            }
                            winit::keyboard::NamedKey::TVAudioDescriptionMixDown => {
                                magma_input::keyboard::Key::TVAudioDescriptionMixDown
                            }
                            winit::keyboard::NamedKey::TVAudioDescriptionMixUp => {
                                magma_input::keyboard::Key::TVAudioDescriptionMixUp
                            }
                            winit::keyboard::NamedKey::TVContentsMenu => {
                                magma_input::keyboard::Key::TVContentsMenu
                            }
                            winit::keyboard::NamedKey::TVDataService => {
                                magma_input::keyboard::Key::TVDataService
                            }
                            winit::keyboard::NamedKey::TVInput => {
                                magma_input::keyboard::Key::TVInput
                            }
                            winit::keyboard::NamedKey::TVInputComponent1 => {
                                magma_input::keyboard::Key::TVInputComponent1
                            }
                            winit::keyboard::NamedKey::TVInputComponent2 => {
                                magma_input::keyboard::Key::TVInputComponent2
                            }
                            winit::keyboard::NamedKey::TVInputComposite1 => {
                                magma_input::keyboard::Key::TVInputComposite1
                            }
                            winit::keyboard::NamedKey::TVInputComposite2 => {
                                magma_input::keyboard::Key::TVInputComposite2
                            }
                            winit::keyboard::NamedKey::TVInputHDMI1 => {
                                magma_input::keyboard::Key::TVInputHDMI1
                            }
                            winit::keyboard::NamedKey::TVInputHDMI2 => {
                                magma_input::keyboard::Key::TVInputHDMI2
                            }
                            winit::keyboard::NamedKey::TVInputHDMI3 => {
                                magma_input::keyboard::Key::TVInputHDMI3
                            }
                            winit::keyboard::NamedKey::TVInputHDMI4 => {
                                magma_input::keyboard::Key::TVInputHDMI4
                            }
                            winit::keyboard::NamedKey::TVInputVGA1 => {
                                magma_input::keyboard::Key::TVInputVGA1
                            }
                            winit::keyboard::NamedKey::TVMediaContext => {
                                magma_input::keyboard::Key::TVMediaContext
                            }
                            winit::keyboard::NamedKey::TVNetwork => {
                                magma_input::keyboard::Key::TVNetwork
                            }
                            winit::keyboard::NamedKey::TVNumberEntry => {
                                magma_input::keyboard::Key::TVNumberEntry
                            }
                            winit::keyboard::NamedKey::TVPower => {
                                magma_input::keyboard::Key::TVPower
                            }
                            winit::keyboard::NamedKey::TVRadioService => {
                                magma_input::keyboard::Key::TVRadioService
                            }
                            winit::keyboard::NamedKey::TVSatellite => {
                                magma_input::keyboard::Key::TVSatellite
                            }
                            winit::keyboard::NamedKey::TVSatelliteBS => {
                                magma_input::keyboard::Key::TVSatelliteBS
                            }
                            winit::keyboard::NamedKey::TVSatelliteCS => {
                                magma_input::keyboard::Key::TVSatelliteCS
                            }
                            winit::keyboard::NamedKey::TVSatelliteToggle => {
                                magma_input::keyboard::Key::TVSatelliteToggle
                            }
                            winit::keyboard::NamedKey::TVTerrestrialAnalog => {
                                magma_input::keyboard::Key::TVTerrestrialAnalog
                            }
                            winit::keyboard::NamedKey::TVTerrestrialDigital => {
                                magma_input::keyboard::Key::TVTerrestrialDigital
                            }
                            winit::keyboard::NamedKey::TVTimer => {
                                magma_input::keyboard::Key::TVTimer
                            }
                            winit::keyboard::NamedKey::AVRInput => {
                                magma_input::keyboard::Key::AVRInput
                            }
                            winit::keyboard::NamedKey::AVRPower => {
                                magma_input::keyboard::Key::AVRPower
                            }
                            winit::keyboard::NamedKey::ColorF0Red => {
                                magma_input::keyboard::Key::ColorF0Red
                            }
                            winit::keyboard::NamedKey::ColorF1Green => {
                                magma_input::keyboard::Key::ColorF1Green
                            }
                            winit::keyboard::NamedKey::ColorF2Yellow => {
                                magma_input::keyboard::Key::ColorF2Yellow
                            }
                            winit::keyboard::NamedKey::ColorF3Blue => {
                                magma_input::keyboard::Key::ColorF3Blue
                            }
                            winit::keyboard::NamedKey::ColorF4Grey => {
                                magma_input::keyboard::Key::ColorF4Grey
                            }
                            winit::keyboard::NamedKey::ColorF5Brown => {
                                magma_input::keyboard::Key::ColorF5Brown
                            }
                            winit::keyboard::NamedKey::ClosedCaptionToggle => {
                                magma_input::keyboard::Key::ClosedCaptionToggle
                            }
                            winit::keyboard::NamedKey::Dimmer => magma_input::keyboard::Key::Dimmer,
                            winit::keyboard::NamedKey::DisplaySwap => {
                                magma_input::keyboard::Key::DisplaySwap
                            }
                            winit::keyboard::NamedKey::DVR => magma_input::keyboard::Key::DVR,
                            winit::keyboard::NamedKey::Exit => magma_input::keyboard::Key::Exit,
                            winit::keyboard::NamedKey::FavoriteClear0 => {
                                magma_input::keyboard::Key::FavoriteClear0
                            }
                            winit::keyboard::NamedKey::FavoriteClear1 => {
                                magma_input::keyboard::Key::FavoriteClear1
                            }
                            winit::keyboard::NamedKey::FavoriteClear2 => {
                                magma_input::keyboard::Key::FavoriteClear2
                            }
                            winit::keyboard::NamedKey::FavoriteClear3 => {
                                magma_input::keyboard::Key::FavoriteClear3
                            }
                            winit::keyboard::NamedKey::FavoriteRecall0 => {
                                magma_input::keyboard::Key::FavoriteRecall0
                            }
                            winit::keyboard::NamedKey::FavoriteRecall1 => {
                                magma_input::keyboard::Key::FavoriteRecall1
                            }
                            winit::keyboard::NamedKey::FavoriteRecall2 => {
                                magma_input::keyboard::Key::FavoriteRecall2
                            }
                            winit::keyboard::NamedKey::FavoriteRecall3 => {
                                magma_input::keyboard::Key::FavoriteRecall3
                            }
                            winit::keyboard::NamedKey::FavoriteStore0 => {
                                magma_input::keyboard::Key::FavoriteStore0
                            }
                            winit::keyboard::NamedKey::FavoriteStore1 => {
                                magma_input::keyboard::Key::FavoriteStore1
                            }
                            winit::keyboard::NamedKey::FavoriteStore2 => {
                                magma_input::keyboard::Key::FavoriteStore2
                            }
                            winit::keyboard::NamedKey::FavoriteStore3 => {
                                magma_input::keyboard::Key::FavoriteStore3
                            }
                            winit::keyboard::NamedKey::Guide => magma_input::keyboard::Key::Guide,
                            winit::keyboard::NamedKey::GuideNextDay => {
                                magma_input::keyboard::Key::GuideNextDay
                            }
                            winit::keyboard::NamedKey::GuidePreviousDay => {
                                magma_input::keyboard::Key::GuidePreviousDay
                            }
                            winit::keyboard::NamedKey::Info => magma_input::keyboard::Key::Info,
                            winit::keyboard::NamedKey::InstantReplay => {
                                magma_input::keyboard::Key::InstantReplay
                            }
                            winit::keyboard::NamedKey::Link => magma_input::keyboard::Key::Link,
                            winit::keyboard::NamedKey::ListProgram => {
                                magma_input::keyboard::Key::ListProgram
                            }
                            winit::keyboard::NamedKey::LiveContent => {
                                magma_input::keyboard::Key::LiveContent
                            }
                            winit::keyboard::NamedKey::Lock => magma_input::keyboard::Key::Lock,
                            winit::keyboard::NamedKey::MediaApps => {
                                magma_input::keyboard::Key::MediaApps
                            }
                            winit::keyboard::NamedKey::MediaAudioTrack => {
                                magma_input::keyboard::Key::MediaAudioTrack
                            }
                            winit::keyboard::NamedKey::MediaLast => {
                                magma_input::keyboard::Key::MediaLast
                            }
                            winit::keyboard::NamedKey::MediaSkipBackward => {
                                magma_input::keyboard::Key::MediaSkipBackward
                            }
                            winit::keyboard::NamedKey::MediaSkipForward => {
                                magma_input::keyboard::Key::MediaSkipForward
                            }
                            winit::keyboard::NamedKey::MediaStepBackward => {
                                magma_input::keyboard::Key::MediaStepBackward
                            }
                            winit::keyboard::NamedKey::MediaStepForward => {
                                magma_input::keyboard::Key::MediaStepForward
                            }
                            winit::keyboard::NamedKey::MediaTopMenu => {
                                magma_input::keyboard::Key::MediaTopMenu
                            }
                            winit::keyboard::NamedKey::NavigateIn => {
                                magma_input::keyboard::Key::NavigateIn
                            }
                            winit::keyboard::NamedKey::NavigateNext => {
                                magma_input::keyboard::Key::NavigateNext
                            }
                            winit::keyboard::NamedKey::NavigateOut => {
                                magma_input::keyboard::Key::NavigateOut
                            }
                            winit::keyboard::NamedKey::NavigatePrevious => {
                                magma_input::keyboard::Key::NavigatePrevious
                            }
                            winit::keyboard::NamedKey::NextFavoriteChannel => {
                                magma_input::keyboard::Key::NextFavoriteChannel
                            }
                            winit::keyboard::NamedKey::NextUserProfile => {
                                magma_input::keyboard::Key::NextUserProfile
                            }
                            winit::keyboard::NamedKey::OnDemand => {
                                magma_input::keyboard::Key::OnDemand
                            }
                            winit::keyboard::NamedKey::Pairing => {
                                magma_input::keyboard::Key::Pairing
                            }
                            winit::keyboard::NamedKey::PinPDown => {
                                magma_input::keyboard::Key::PinPDown
                            }
                            winit::keyboard::NamedKey::PinPMove => {
                                magma_input::keyboard::Key::PinPMove
                            }
                            winit::keyboard::NamedKey::PinPToggle => {
                                magma_input::keyboard::Key::PinPToggle
                            }
                            winit::keyboard::NamedKey::PinPUp => magma_input::keyboard::Key::PinPUp,
                            winit::keyboard::NamedKey::PlaySpeedDown => {
                                magma_input::keyboard::Key::PlaySpeedDown
                            }
                            winit::keyboard::NamedKey::PlaySpeedReset => {
                                magma_input::keyboard::Key::PlaySpeedReset
                            }
                            winit::keyboard::NamedKey::PlaySpeedUp => {
                                magma_input::keyboard::Key::PlaySpeedUp
                            }
                            winit::keyboard::NamedKey::RandomToggle => {
                                magma_input::keyboard::Key::RandomToggle
                            }
                            winit::keyboard::NamedKey::RcLowBattery => {
                                magma_input::keyboard::Key::RcLowBattery
                            }
                            winit::keyboard::NamedKey::RecordSpeedNext => {
                                magma_input::keyboard::Key::RecordSpeedNext
                            }
                            winit::keyboard::NamedKey::RfBypass => {
                                magma_input::keyboard::Key::RfBypass
                            }
                            winit::keyboard::NamedKey::ScanChannelsToggle => {
                                magma_input::keyboard::Key::ScanChannelsToggle
                            }
                            winit::keyboard::NamedKey::ScreenModeNext => {
                                magma_input::keyboard::Key::ScreenModeNext
                            }
                            winit::keyboard::NamedKey::Settings => {
                                magma_input::keyboard::Key::Settings
                            }
                            winit::keyboard::NamedKey::SplitScreenToggle => {
                                magma_input::keyboard::Key::SplitScreenToggle
                            }
                            winit::keyboard::NamedKey::STBInput => {
                                magma_input::keyboard::Key::STBInput
                            }
                            winit::keyboard::NamedKey::STBPower => {
                                magma_input::keyboard::Key::STBPower
                            }
                            winit::keyboard::NamedKey::Subtitle => {
                                magma_input::keyboard::Key::Subtitle
                            }
                            winit::keyboard::NamedKey::Teletext => {
                                magma_input::keyboard::Key::Teletext
                            }
                            winit::keyboard::NamedKey::VideoModeNext => {
                                magma_input::keyboard::Key::VideoModeNext
                            }
                            winit::keyboard::NamedKey::Wink => magma_input::keyboard::Key::Wink,
                            winit::keyboard::NamedKey::ZoomToggle => {
                                magma_input::keyboard::Key::ZoomToggle
                            }
                            winit::keyboard::NamedKey::F1 => magma_input::keyboard::Key::F1,
                            winit::keyboard::NamedKey::F2 => magma_input::keyboard::Key::F2,
                            winit::keyboard::NamedKey::F3 => magma_input::keyboard::Key::F3,
                            winit::keyboard::NamedKey::F4 => magma_input::keyboard::Key::F4,
                            winit::keyboard::NamedKey::F5 => magma_input::keyboard::Key::F5,
                            winit::keyboard::NamedKey::F6 => magma_input::keyboard::Key::F6,
                            winit::keyboard::NamedKey::F7 => magma_input::keyboard::Key::F7,
                            winit::keyboard::NamedKey::F8 => magma_input::keyboard::Key::F8,
                            winit::keyboard::NamedKey::F9 => magma_input::keyboard::Key::F9,
                            winit::keyboard::NamedKey::F10 => magma_input::keyboard::Key::F10,
                            winit::keyboard::NamedKey::F11 => magma_input::keyboard::Key::F11,
                            winit::keyboard::NamedKey::F12 => magma_input::keyboard::Key::F12,
                            winit::keyboard::NamedKey::F13 => magma_input::keyboard::Key::F13,
                            winit::keyboard::NamedKey::F14 => magma_input::keyboard::Key::F14,
                            winit::keyboard::NamedKey::F15 => magma_input::keyboard::Key::F15,
                            winit::keyboard::NamedKey::F16 => magma_input::keyboard::Key::F16,
                            winit::keyboard::NamedKey::F17 => magma_input::keyboard::Key::F17,
                            winit::keyboard::NamedKey::F18 => magma_input::keyboard::Key::F18,
                            winit::keyboard::NamedKey::F19 => magma_input::keyboard::Key::F19,
                            winit::keyboard::NamedKey::F20 => magma_input::keyboard::Key::F20,
                            winit::keyboard::NamedKey::F21 => magma_input::keyboard::Key::F21,
                            winit::keyboard::NamedKey::F22 => magma_input::keyboard::Key::F22,
                            winit::keyboard::NamedKey::F23 => magma_input::keyboard::Key::F23,
                            winit::keyboard::NamedKey::F24 => magma_input::keyboard::Key::F24,
                            winit::keyboard::NamedKey::F25 => magma_input::keyboard::Key::F25,
                            winit::keyboard::NamedKey::F26 => magma_input::keyboard::Key::F26,
                            winit::keyboard::NamedKey::F27 => magma_input::keyboard::Key::F27,
                            winit::keyboard::NamedKey::F28 => magma_input::keyboard::Key::F28,
                            winit::keyboard::NamedKey::F29 => magma_input::keyboard::Key::F29,
                            winit::keyboard::NamedKey::F30 => magma_input::keyboard::Key::F30,
                            winit::keyboard::NamedKey::F31 => magma_input::keyboard::Key::F31,
                            winit::keyboard::NamedKey::F32 => magma_input::keyboard::Key::F32,
                            winit::keyboard::NamedKey::F33 => magma_input::keyboard::Key::F33,
                            winit::keyboard::NamedKey::F34 => magma_input::keyboard::Key::F34,
                            winit::keyboard::NamedKey::F35 => magma_input::keyboard::Key::F35,
                            _ => magma_input::keyboard::Key::Unidentified,
                        },
                        winit::keyboard::Key::Character(string) => {
                            magma_input::keyboard::Key::Character(string.to_string())
                        }
                        winit::keyboard::Key::Unidentified(_) => {
                            magma_input::keyboard::Key::Unidentified
                        }
                        winit::keyboard::Key::Dead(key) => magma_input::keyboard::Key::Dead(key),
                    },
                    key_code: match event.physical_key {
                        winit::keyboard::PhysicalKey::Code(key_code) => match key_code {
                            winit::keyboard::KeyCode::Backquote => {
                                magma_input::keyboard::KeyCode::Backquote
                            }
                            winit::keyboard::KeyCode::Backslash => {
                                magma_input::keyboard::KeyCode::Backslash
                            }
                            winit::keyboard::KeyCode::BracketLeft => {
                                magma_input::keyboard::KeyCode::BracketLeft
                            }
                            winit::keyboard::KeyCode::BracketRight => {
                                magma_input::keyboard::KeyCode::BracketRight
                            }
                            winit::keyboard::KeyCode::Comma => {
                                magma_input::keyboard::KeyCode::Comma
                            }
                            winit::keyboard::KeyCode::Digit0 => {
                                magma_input::keyboard::KeyCode::Digit0
                            }
                            winit::keyboard::KeyCode::Digit1 => {
                                magma_input::keyboard::KeyCode::Digit1
                            }
                            winit::keyboard::KeyCode::Digit2 => {
                                magma_input::keyboard::KeyCode::Digit2
                            }
                            winit::keyboard::KeyCode::Digit3 => {
                                magma_input::keyboard::KeyCode::Digit3
                            }
                            winit::keyboard::KeyCode::Digit4 => {
                                magma_input::keyboard::KeyCode::Digit4
                            }
                            winit::keyboard::KeyCode::Digit5 => {
                                magma_input::keyboard::KeyCode::Digit5
                            }
                            winit::keyboard::KeyCode::Digit6 => {
                                magma_input::keyboard::KeyCode::Digit6
                            }
                            winit::keyboard::KeyCode::Digit7 => {
                                magma_input::keyboard::KeyCode::Digit7
                            }
                            winit::keyboard::KeyCode::Digit8 => {
                                magma_input::keyboard::KeyCode::Digit8
                            }
                            winit::keyboard::KeyCode::Digit9 => {
                                magma_input::keyboard::KeyCode::Digit9
                            }
                            winit::keyboard::KeyCode::Equal => {
                                magma_input::keyboard::KeyCode::Equal
                            }
                            winit::keyboard::KeyCode::IntlBackslash => {
                                magma_input::keyboard::KeyCode::IntlBackslash
                            }
                            winit::keyboard::KeyCode::IntlRo => {
                                magma_input::keyboard::KeyCode::IntlRo
                            }
                            winit::keyboard::KeyCode::IntlYen => {
                                magma_input::keyboard::KeyCode::IntlYen
                            }
                            winit::keyboard::KeyCode::KeyA => magma_input::keyboard::KeyCode::KeyA,
                            winit::keyboard::KeyCode::KeyB => magma_input::keyboard::KeyCode::KeyB,
                            winit::keyboard::KeyCode::KeyC => magma_input::keyboard::KeyCode::KeyC,
                            winit::keyboard::KeyCode::KeyD => magma_input::keyboard::KeyCode::KeyD,
                            winit::keyboard::KeyCode::KeyE => magma_input::keyboard::KeyCode::KeyE,
                            winit::keyboard::KeyCode::KeyF => magma_input::keyboard::KeyCode::KeyF,
                            winit::keyboard::KeyCode::KeyG => magma_input::keyboard::KeyCode::KeyG,
                            winit::keyboard::KeyCode::KeyH => magma_input::keyboard::KeyCode::KeyH,
                            winit::keyboard::KeyCode::KeyI => magma_input::keyboard::KeyCode::KeyI,
                            winit::keyboard::KeyCode::KeyJ => magma_input::keyboard::KeyCode::KeyJ,
                            winit::keyboard::KeyCode::KeyK => magma_input::keyboard::KeyCode::KeyK,
                            winit::keyboard::KeyCode::KeyL => magma_input::keyboard::KeyCode::KeyL,
                            winit::keyboard::KeyCode::KeyM => magma_input::keyboard::KeyCode::KeyM,
                            winit::keyboard::KeyCode::KeyN => magma_input::keyboard::KeyCode::KeyN,
                            winit::keyboard::KeyCode::KeyO => magma_input::keyboard::KeyCode::KeyO,
                            winit::keyboard::KeyCode::KeyP => magma_input::keyboard::KeyCode::KeyP,
                            winit::keyboard::KeyCode::KeyQ => magma_input::keyboard::KeyCode::KeyQ,
                            winit::keyboard::KeyCode::KeyR => magma_input::keyboard::KeyCode::KeyR,
                            winit::keyboard::KeyCode::KeyS => magma_input::keyboard::KeyCode::KeyS,
                            winit::keyboard::KeyCode::KeyT => magma_input::keyboard::KeyCode::KeyT,
                            winit::keyboard::KeyCode::KeyU => magma_input::keyboard::KeyCode::KeyU,
                            winit::keyboard::KeyCode::KeyV => magma_input::keyboard::KeyCode::KeyV,
                            winit::keyboard::KeyCode::KeyW => magma_input::keyboard::KeyCode::KeyW,
                            winit::keyboard::KeyCode::KeyX => magma_input::keyboard::KeyCode::KeyX,
                            winit::keyboard::KeyCode::KeyY => magma_input::keyboard::KeyCode::KeyY,
                            winit::keyboard::KeyCode::KeyZ => magma_input::keyboard::KeyCode::KeyZ,
                            winit::keyboard::KeyCode::Minus => {
                                magma_input::keyboard::KeyCode::Minus
                            }
                            winit::keyboard::KeyCode::Period => {
                                magma_input::keyboard::KeyCode::Period
                            }
                            winit::keyboard::KeyCode::Quote => {
                                magma_input::keyboard::KeyCode::Quote
                            }
                            winit::keyboard::KeyCode::Semicolon => {
                                magma_input::keyboard::KeyCode::Semicolon
                            }
                            winit::keyboard::KeyCode::Slash => {
                                magma_input::keyboard::KeyCode::Slash
                            }
                            winit::keyboard::KeyCode::AltLeft => {
                                magma_input::keyboard::KeyCode::AltLeft
                            }
                            winit::keyboard::KeyCode::AltRight => {
                                magma_input::keyboard::KeyCode::AltRight
                            }
                            winit::keyboard::KeyCode::Backspace => {
                                magma_input::keyboard::KeyCode::Backspace
                            }
                            winit::keyboard::KeyCode::CapsLock => {
                                magma_input::keyboard::KeyCode::CapsLock
                            }
                            winit::keyboard::KeyCode::ContextMenu => {
                                magma_input::keyboard::KeyCode::ContextMenu
                            }
                            winit::keyboard::KeyCode::ControlLeft => {
                                magma_input::keyboard::KeyCode::ControlLeft
                            }
                            winit::keyboard::KeyCode::ControlRight => {
                                magma_input::keyboard::KeyCode::ControlRight
                            }
                            winit::keyboard::KeyCode::Enter => {
                                magma_input::keyboard::KeyCode::Enter
                            }
                            winit::keyboard::KeyCode::SuperLeft => {
                                magma_input::keyboard::KeyCode::SuperLeft
                            }
                            winit::keyboard::KeyCode::SuperRight => {
                                magma_input::keyboard::KeyCode::SuperRight
                            }
                            winit::keyboard::KeyCode::ShiftLeft => {
                                magma_input::keyboard::KeyCode::ShiftLeft
                            }
                            winit::keyboard::KeyCode::ShiftRight => {
                                magma_input::keyboard::KeyCode::ShiftRight
                            }
                            winit::keyboard::KeyCode::Space => {
                                magma_input::keyboard::KeyCode::Space
                            }
                            winit::keyboard::KeyCode::Tab => magma_input::keyboard::KeyCode::Tab,
                            winit::keyboard::KeyCode::Convert => {
                                magma_input::keyboard::KeyCode::Convert
                            }
                            winit::keyboard::KeyCode::KanaMode => {
                                magma_input::keyboard::KeyCode::KanaMode
                            }
                            winit::keyboard::KeyCode::Lang1 => {
                                magma_input::keyboard::KeyCode::Lang1
                            }
                            winit::keyboard::KeyCode::Lang2 => {
                                magma_input::keyboard::KeyCode::Lang2
                            }
                            winit::keyboard::KeyCode::Lang3 => {
                                magma_input::keyboard::KeyCode::Lang3
                            }
                            winit::keyboard::KeyCode::Lang4 => {
                                magma_input::keyboard::KeyCode::Lang4
                            }
                            winit::keyboard::KeyCode::Lang5 => {
                                magma_input::keyboard::KeyCode::Lang5
                            }
                            winit::keyboard::KeyCode::NonConvert => {
                                magma_input::keyboard::KeyCode::NonConvert
                            }
                            winit::keyboard::KeyCode::Delete => {
                                magma_input::keyboard::KeyCode::Delete
                            }
                            winit::keyboard::KeyCode::End => magma_input::keyboard::KeyCode::End,
                            winit::keyboard::KeyCode::Help => magma_input::keyboard::KeyCode::Help,
                            winit::keyboard::KeyCode::Home => magma_input::keyboard::KeyCode::Home,
                            winit::keyboard::KeyCode::Insert => {
                                magma_input::keyboard::KeyCode::Insert
                            }
                            winit::keyboard::KeyCode::PageDown => {
                                magma_input::keyboard::KeyCode::PageDown
                            }
                            winit::keyboard::KeyCode::PageUp => {
                                magma_input::keyboard::KeyCode::PageUp
                            }
                            winit::keyboard::KeyCode::ArrowDown => {
                                magma_input::keyboard::KeyCode::ArrowDown
                            }
                            winit::keyboard::KeyCode::ArrowLeft => {
                                magma_input::keyboard::KeyCode::ArrowLeft
                            }
                            winit::keyboard::KeyCode::ArrowRight => {
                                magma_input::keyboard::KeyCode::ArrowRight
                            }
                            winit::keyboard::KeyCode::ArrowUp => {
                                magma_input::keyboard::KeyCode::ArrowUp
                            }
                            winit::keyboard::KeyCode::NumLock => {
                                magma_input::keyboard::KeyCode::NumLock
                            }
                            winit::keyboard::KeyCode::Numpad0 => {
                                magma_input::keyboard::KeyCode::Numpad0
                            }
                            winit::keyboard::KeyCode::Numpad1 => {
                                magma_input::keyboard::KeyCode::Numpad1
                            }
                            winit::keyboard::KeyCode::Numpad2 => {
                                magma_input::keyboard::KeyCode::Numpad2
                            }
                            winit::keyboard::KeyCode::Numpad3 => {
                                magma_input::keyboard::KeyCode::Numpad3
                            }
                            winit::keyboard::KeyCode::Numpad4 => {
                                magma_input::keyboard::KeyCode::Numpad4
                            }
                            winit::keyboard::KeyCode::Numpad5 => {
                                magma_input::keyboard::KeyCode::Numpad5
                            }
                            winit::keyboard::KeyCode::Numpad6 => {
                                magma_input::keyboard::KeyCode::Numpad6
                            }
                            winit::keyboard::KeyCode::Numpad7 => {
                                magma_input::keyboard::KeyCode::Numpad7
                            }
                            winit::keyboard::KeyCode::Numpad8 => {
                                magma_input::keyboard::KeyCode::Numpad8
                            }
                            winit::keyboard::KeyCode::Numpad9 => {
                                magma_input::keyboard::KeyCode::Numpad9
                            }
                            winit::keyboard::KeyCode::NumpadAdd => {
                                magma_input::keyboard::KeyCode::NumpadAdd
                            }
                            winit::keyboard::KeyCode::NumpadBackspace => {
                                magma_input::keyboard::KeyCode::NumpadBackspace
                            }
                            winit::keyboard::KeyCode::NumpadClear => {
                                magma_input::keyboard::KeyCode::NumpadClear
                            }
                            winit::keyboard::KeyCode::NumpadClearEntry => {
                                magma_input::keyboard::KeyCode::NumpadClearEntry
                            }
                            winit::keyboard::KeyCode::NumpadComma => {
                                magma_input::keyboard::KeyCode::NumpadComma
                            }
                            winit::keyboard::KeyCode::NumpadDecimal => {
                                magma_input::keyboard::KeyCode::NumpadDecimal
                            }
                            winit::keyboard::KeyCode::NumpadDivide => {
                                magma_input::keyboard::KeyCode::NumpadDivide
                            }
                            winit::keyboard::KeyCode::NumpadEnter => {
                                magma_input::keyboard::KeyCode::NumpadEnter
                            }
                            winit::keyboard::KeyCode::NumpadEqual => {
                                magma_input::keyboard::KeyCode::NumpadEqual
                            }
                            winit::keyboard::KeyCode::NumpadHash => {
                                magma_input::keyboard::KeyCode::NumpadHash
                            }
                            winit::keyboard::KeyCode::NumpadMemoryAdd => {
                                magma_input::keyboard::KeyCode::NumpadMemoryAdd
                            }
                            winit::keyboard::KeyCode::NumpadMemoryClear => {
                                magma_input::keyboard::KeyCode::NumpadMemoryClear
                            }
                            winit::keyboard::KeyCode::NumpadMemoryRecall => {
                                magma_input::keyboard::KeyCode::NumpadMemoryRecall
                            }
                            winit::keyboard::KeyCode::NumpadMemoryStore => {
                                magma_input::keyboard::KeyCode::NumpadMemoryStore
                            }
                            winit::keyboard::KeyCode::NumpadMemorySubtract => {
                                magma_input::keyboard::KeyCode::NumpadMemorySubtract
                            }
                            winit::keyboard::KeyCode::NumpadMultiply => {
                                magma_input::keyboard::KeyCode::NumpadMultiply
                            }
                            winit::keyboard::KeyCode::NumpadParenLeft => {
                                magma_input::keyboard::KeyCode::NumpadParenLeft
                            }
                            winit::keyboard::KeyCode::NumpadParenRight => {
                                magma_input::keyboard::KeyCode::NumpadParenRight
                            }
                            winit::keyboard::KeyCode::NumpadStar => {
                                magma_input::keyboard::KeyCode::NumpadStar
                            }
                            winit::keyboard::KeyCode::NumpadSubtract => {
                                magma_input::keyboard::KeyCode::NumpadSubtract
                            }
                            winit::keyboard::KeyCode::Escape => {
                                magma_input::keyboard::KeyCode::Escape
                            }
                            winit::keyboard::KeyCode::Fn => magma_input::keyboard::KeyCode::Fn,
                            winit::keyboard::KeyCode::FnLock => {
                                magma_input::keyboard::KeyCode::FnLock
                            }
                            winit::keyboard::KeyCode::PrintScreen => {
                                magma_input::keyboard::KeyCode::PrintScreen
                            }
                            winit::keyboard::KeyCode::ScrollLock => {
                                magma_input::keyboard::KeyCode::ScrollLock
                            }
                            winit::keyboard::KeyCode::Pause => {
                                magma_input::keyboard::KeyCode::Pause
                            }
                            winit::keyboard::KeyCode::BrowserBack => {
                                magma_input::keyboard::KeyCode::BrowserBack
                            }
                            winit::keyboard::KeyCode::BrowserFavorites => {
                                magma_input::keyboard::KeyCode::BrowserFavorites
                            }
                            winit::keyboard::KeyCode::BrowserForward => {
                                magma_input::keyboard::KeyCode::BrowserForward
                            }
                            winit::keyboard::KeyCode::BrowserHome => {
                                magma_input::keyboard::KeyCode::BrowserHome
                            }
                            winit::keyboard::KeyCode::BrowserRefresh => {
                                magma_input::keyboard::KeyCode::BrowserRefresh
                            }
                            winit::keyboard::KeyCode::BrowserSearch => {
                                magma_input::keyboard::KeyCode::BrowserSearch
                            }
                            winit::keyboard::KeyCode::BrowserStop => {
                                magma_input::keyboard::KeyCode::BrowserStop
                            }
                            winit::keyboard::KeyCode::Eject => {
                                magma_input::keyboard::KeyCode::Eject
                            }
                            winit::keyboard::KeyCode::LaunchApp1 => {
                                magma_input::keyboard::KeyCode::LaunchApp1
                            }
                            winit::keyboard::KeyCode::LaunchApp2 => {
                                magma_input::keyboard::KeyCode::LaunchApp2
                            }
                            winit::keyboard::KeyCode::LaunchMail => {
                                magma_input::keyboard::KeyCode::LaunchMail
                            }
                            winit::keyboard::KeyCode::MediaPlayPause => {
                                magma_input::keyboard::KeyCode::MediaPlayPause
                            }
                            winit::keyboard::KeyCode::MediaSelect => {
                                magma_input::keyboard::KeyCode::MediaSelect
                            }
                            winit::keyboard::KeyCode::MediaStop => {
                                magma_input::keyboard::KeyCode::MediaStop
                            }
                            winit::keyboard::KeyCode::MediaTrackNext => {
                                magma_input::keyboard::KeyCode::MediaTrackNext
                            }
                            winit::keyboard::KeyCode::MediaTrackPrevious => {
                                magma_input::keyboard::KeyCode::MediaTrackPrevious
                            }
                            winit::keyboard::KeyCode::Power => {
                                magma_input::keyboard::KeyCode::Power
                            }
                            winit::keyboard::KeyCode::Sleep => {
                                magma_input::keyboard::KeyCode::Sleep
                            }
                            winit::keyboard::KeyCode::AudioVolumeDown => {
                                magma_input::keyboard::KeyCode::AudioVolumeDown
                            }
                            winit::keyboard::KeyCode::AudioVolumeMute => {
                                magma_input::keyboard::KeyCode::AudioVolumeMute
                            }
                            winit::keyboard::KeyCode::AudioVolumeUp => {
                                magma_input::keyboard::KeyCode::AudioVolumeUp
                            }
                            winit::keyboard::KeyCode::WakeUp => {
                                magma_input::keyboard::KeyCode::WakeUp
                            }
                            winit::keyboard::KeyCode::Meta => magma_input::keyboard::KeyCode::Meta,
                            winit::keyboard::KeyCode::Hyper => {
                                magma_input::keyboard::KeyCode::Hyper
                            }
                            winit::keyboard::KeyCode::Turbo => {
                                magma_input::keyboard::KeyCode::Turbo
                            }
                            winit::keyboard::KeyCode::Abort => {
                                magma_input::keyboard::KeyCode::Abort
                            }
                            winit::keyboard::KeyCode::Resume => {
                                magma_input::keyboard::KeyCode::Resume
                            }
                            winit::keyboard::KeyCode::Suspend => {
                                magma_input::keyboard::KeyCode::Suspend
                            }
                            winit::keyboard::KeyCode::Again => {
                                magma_input::keyboard::KeyCode::Again
                            }
                            winit::keyboard::KeyCode::Copy => magma_input::keyboard::KeyCode::Copy,
                            winit::keyboard::KeyCode::Cut => magma_input::keyboard::KeyCode::Cut,
                            winit::keyboard::KeyCode::Find => magma_input::keyboard::KeyCode::Find,
                            winit::keyboard::KeyCode::Open => magma_input::keyboard::KeyCode::Open,
                            winit::keyboard::KeyCode::Paste => {
                                magma_input::keyboard::KeyCode::Paste
                            }
                            winit::keyboard::KeyCode::Props => {
                                magma_input::keyboard::KeyCode::Props
                            }
                            winit::keyboard::KeyCode::Select => {
                                magma_input::keyboard::KeyCode::Select
                            }
                            winit::keyboard::KeyCode::Undo => magma_input::keyboard::KeyCode::Undo,
                            winit::keyboard::KeyCode::Hiragana => {
                                magma_input::keyboard::KeyCode::Hiragana
                            }
                            winit::keyboard::KeyCode::Katakana => {
                                magma_input::keyboard::KeyCode::Katakana
                            }
                            winit::keyboard::KeyCode::F1 => magma_input::keyboard::KeyCode::F1,
                            winit::keyboard::KeyCode::F2 => magma_input::keyboard::KeyCode::F2,
                            winit::keyboard::KeyCode::F3 => magma_input::keyboard::KeyCode::F3,
                            winit::keyboard::KeyCode::F4 => magma_input::keyboard::KeyCode::F4,
                            winit::keyboard::KeyCode::F5 => magma_input::keyboard::KeyCode::F5,
                            winit::keyboard::KeyCode::F6 => magma_input::keyboard::KeyCode::F6,
                            winit::keyboard::KeyCode::F7 => magma_input::keyboard::KeyCode::F7,
                            winit::keyboard::KeyCode::F8 => magma_input::keyboard::KeyCode::F8,
                            winit::keyboard::KeyCode::F9 => magma_input::keyboard::KeyCode::F9,
                            winit::keyboard::KeyCode::F10 => magma_input::keyboard::KeyCode::F10,
                            winit::keyboard::KeyCode::F11 => magma_input::keyboard::KeyCode::F11,
                            winit::keyboard::KeyCode::F12 => magma_input::keyboard::KeyCode::F12,
                            winit::keyboard::KeyCode::F13 => magma_input::keyboard::KeyCode::F13,
                            winit::keyboard::KeyCode::F14 => magma_input::keyboard::KeyCode::F14,
                            winit::keyboard::KeyCode::F15 => magma_input::keyboard::KeyCode::F15,
                            winit::keyboard::KeyCode::F16 => magma_input::keyboard::KeyCode::F16,
                            winit::keyboard::KeyCode::F17 => magma_input::keyboard::KeyCode::F17,
                            winit::keyboard::KeyCode::F18 => magma_input::keyboard::KeyCode::F18,
                            winit::keyboard::KeyCode::F19 => magma_input::keyboard::KeyCode::F19,
                            winit::keyboard::KeyCode::F20 => magma_input::keyboard::KeyCode::F20,
                            winit::keyboard::KeyCode::F21 => magma_input::keyboard::KeyCode::F21,
                            winit::keyboard::KeyCode::F22 => magma_input::keyboard::KeyCode::F22,
                            winit::keyboard::KeyCode::F23 => magma_input::keyboard::KeyCode::F23,
                            winit::keyboard::KeyCode::F24 => magma_input::keyboard::KeyCode::F24,
                            winit::keyboard::KeyCode::F25 => magma_input::keyboard::KeyCode::F25,
                            winit::keyboard::KeyCode::F26 => magma_input::keyboard::KeyCode::F26,
                            winit::keyboard::KeyCode::F27 => magma_input::keyboard::KeyCode::F27,
                            winit::keyboard::KeyCode::F28 => magma_input::keyboard::KeyCode::F28,
                            winit::keyboard::KeyCode::F29 => magma_input::keyboard::KeyCode::F29,
                            winit::keyboard::KeyCode::F30 => magma_input::keyboard::KeyCode::F30,
                            winit::keyboard::KeyCode::F31 => magma_input::keyboard::KeyCode::F31,
                            winit::keyboard::KeyCode::F32 => magma_input::keyboard::KeyCode::F32,
                            winit::keyboard::KeyCode::F33 => magma_input::keyboard::KeyCode::F33,
                            winit::keyboard::KeyCode::F34 => magma_input::keyboard::KeyCode::F34,
                            winit::keyboard::KeyCode::F35 => magma_input::keyboard::KeyCode::F35,
                            _ => magma_input::keyboard::KeyCode::Unidentified,
                        },
                        winit::keyboard::PhysicalKey::Unidentified(_) => {
                            magma_input::keyboard::KeyCode::Unidentified
                        }
                    },
                    state: match event.state {
                        winit::event::ElementState::Pressed => magma_input::ButtonState::Pressed,
                        winit::event::ElementState::Released => magma_input::ButtonState::Released,
                    },
                    repeat: event.repeat,
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            WindowEvent::MouseInput { state, button, .. } => self
                .app
                .world
                .send_event(MouseButtonInput {
                    button: match button {
                        winit::event::MouseButton::Left => magma_input::mouse::MouseButton::Left,
                        winit::event::MouseButton::Right => magma_input::mouse::MouseButton::Right,
                        winit::event::MouseButton::Middle => {
                            magma_input::mouse::MouseButton::Middle
                        }
                        winit::event::MouseButton::Back => magma_input::mouse::MouseButton::Back,
                        winit::event::MouseButton::Forward => {
                            magma_input::mouse::MouseButton::Forward
                        }
                        winit::event::MouseButton::Other(id) => {
                            magma_input::mouse::MouseButton::Other(id)
                        }
                    },
                    state: match state {
                        winit::event::ElementState::Pressed => magma_input::ButtonState::Pressed,
                        winit::event::ElementState::Released => magma_input::ButtonState::Pressed,
                    },
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            WindowEvent::MouseWheel { delta, .. } => self
                .app
                .world
                .send_event(MouseScrollInput {
                    unit: match delta {
                        winit::event::MouseScrollDelta::LineDelta(_, _) => {
                            magma_input::mouse::MouseScrollUnit::Line
                        }
                        winit::event::MouseScrollDelta::PixelDelta(_) => {
                            magma_input::mouse::MouseScrollUnit::Pixel
                        }
                    },
                    x: match delta {
                        winit::event::MouseScrollDelta::LineDelta(x, _) => x,
                        winit::event::MouseScrollDelta::PixelDelta(delta) => delta.x as f32,
                    },
                    y: match delta {
                        winit::event::MouseScrollDelta::LineDelta(_, y) => y,
                        winit::event::MouseScrollDelta::PixelDelta(delta) => delta.y as f32,
                    },
                    window: *self
                        .app
                        .world
                        .get_resource::<Windows>()
                        .unwrap()
                        .window_to_entity
                        .get(&window_id)
                        .unwrap(),
                })
                .unwrap(),
            _ => (),
        }
    }

    fn device_event(
        &mut self,
        _event_loop: &winit::event_loop::ActiveEventLoop,
        _device_id: winit::event::DeviceId,
        event: winit::event::DeviceEvent,
    ) {
        match event {
            winit::event::DeviceEvent::MouseMotion { delta } => self
                .app
                .world
                .send_event(MouseMotionInput {
                    delta: Vec2::new(delta.0 as f32, delta.1 as f32),
                })
                .unwrap(),
            _ => (),
        }
    }

    fn about_to_wait(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) {
        // update winit backend
        self.winit_update(event_loop);
        // update the app
        self.app.run_schedule::<PreUpdate>().unwrap();
        self.app.run_schedule::<Update>().unwrap();
        self.app.run_schedule::<PostUpdate>().unwrap();
        self.app.process_events();
    }
}

impl WrappedApp {
    pub fn winit_update(&mut self, event_loop: &ActiveEventLoop) {
        // create winit windows for new window components
        self.app
            .world
            .query::<(Window,)>()
            .unwrap()
            .iter()
            .for_each(|window_entity| {
                let mut window_component = window_entity.get_component_mut::<Window>().unwrap();
                if !window_component.has_window {
                    self.app
                        .world
                        .get_resource_mut::<Windows>()
                        .unwrap()
                        .create_winit_window(
                            &self.app.world,
                            event_loop,
                            &mut window_component,
                            window_entity.into(),
                        );
                } else if window_component.changed_attr {
                    self.app
                        .world
                        .get_resource_mut::<Windows>()
                        .unwrap()
                        .update_winit_window(
                            &mut window_component,
                            window_entity.into(),
                            &self.app.world,
                        );
                }
                window_component.changed_attr = false;
                self.app
                    .world
                    .send_event(WindowCreated {
                        window: window_entity.into(),
                    })
                    .unwrap();
            });

        let windows = self.app.world.query::<(Window,)>().unwrap();

        // exit if no windows are present
        if windows.is_empty() {
            event_loop.exit();
        } else if windows.len()
            < self
                .app
                .world
                .get_resource::<Windows>()
                .unwrap()
                .winit_windows
                .len()
        {
            // drop winit windows without an entity
            let windows_to_drop = self
                .app
                .world
                .get_resource::<Windows>()
                .unwrap()
                .window_to_entity
                .iter()
                .filter_map(|(_, entity)| {
                    if windows
                        .iter()
                        .find(|query_entity| entity.id() == query_entity.id())
                        .is_none()
                    {
                        Some(*entity)
                    } else {
                        None
                    }
                })
                .collect::<Vec<_>>();
            for window in windows_to_drop {
                self.app
                    .world
                    .get_resource_mut::<Windows>()
                    .unwrap()
                    .delete_window(window);
            }
        }
    }
}

fn winit_event_loop(app: App) {
    // create primary window
    app.world.create_entity((Window::new(),)).unwrap();
    // set up winit event loop
    let event_loop = EventLoop::new().unwrap();
    event_loop.set_control_flow(ControlFlow::Poll);
    let mut app = WrappedApp::new(app);
    app.app.run_schedule::<Startup>().unwrap();
    event_loop.run_app(&mut app).unwrap();
}