aboutsummaryrefslogtreecommitdiff
path: root/src/machine/key.rs
diff options
context:
space:
mode:
authorTianhao Wang <shrik3@riseup.net>2023-03-24 15:25:13 +0100
committerTianhao Wang <shrik3@riseup.net>2023-03-24 15:25:13 +0100
commitd295be457035b42c4451610c50e520c2fecead54 (patch)
tree164f80e7c1ff9e7c9ad8d658743ae38bd4eac05e /src/machine/key.rs
parent625c9652007111ba4bfbc2787ebe579727eefdd2 (diff)
minimal support for keyctrl, not complete
Diffstat (limited to 'src/machine/key.rs')
-rw-r--r--src/machine/key.rs167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/machine/key.rs b/src/machine/key.rs
new file mode 100644
index 0000000..3464d83
--- /dev/null
+++ b/src/machine/key.rs
@@ -0,0 +1,167 @@
+use self::super::kbd_defs::*;
+use core::convert;
+
+pub struct Key {
+ asc: u8,
+ scan: u8,
+ modi: u8,
+ rawcode: u8, // this field not necessary, remove after testing
+}
+
+// Not implementing
+// +operator char()
+//
+
+impl convert::Into<char> for Key{
+ fn into(self) -> char {
+ self.asc as char
+ }
+}
+
+impl convert::Into<u8> for Key{
+ fn into(self) -> u8 {
+ self.asc
+ }
+}
+
+#[allow(dead_code)]
+impl Key {
+ pub fn new() -> Self {
+ Self {
+ asc: 0,
+ scan: 0,
+ modi: 0,
+ rawcode: 0,
+ }
+ }
+
+ pub fn valid(self) -> bool {
+ self.scan != 0
+ }
+
+ pub fn invalidate(&mut self) {
+ self.scan = 0;
+ }
+
+ pub fn set_raw(&mut self, code:u8) {
+ self.rawcode = code;
+ }
+
+ pub fn get_raw(self) -> u8 {
+ self.rawcode
+ }
+
+ // setter and getter for ascii and scancode
+ pub fn set_ascii(&mut self, ascii: u8) {
+ self.asc = ascii;
+ }
+ pub fn get_ascii(self) -> u8 {
+ self.asc
+ }
+ pub fn set_scancode(&mut self, scancode: u8) {
+ self.scan = scancode;
+ }
+ pub fn get_scancode(self) -> u8 {
+ self.scan
+ }
+
+ // reading the state of SHIFT, ALT, CTRL etc.
+ pub fn shift(&self) -> bool {
+ self.modi & (Mbit::Shift as u8) != 0
+ }
+ pub fn alt_left(&self) -> bool {
+ self.modi & (Mbit::AltLeft as u8) != 0
+ }
+ pub fn alt_right(&self) -> bool {
+ self.modi & (Mbit::AltRight as u8) != 0
+ }
+ pub fn ctrl_left(&self) -> bool {
+ self.modi & (Mbit::CtrlLeft as u8) != 0
+ }
+ pub fn ctrl_right(&self) -> bool {
+ self.modi & (Mbit::CtrlRight as u8) != 0
+ }
+ pub fn caps_lock(&self) -> bool {
+ self.modi & (Mbit::CapsLock as u8) != 0
+ }
+ pub fn num_lock(&self) -> bool {
+ self.modi & (Mbit::NumLock as u8) != 0
+ }
+ pub fn scroll_lock(&self) -> bool {
+ self.modi & (Mbit::ScrollLock as u8) != 0
+ }
+ pub fn alt(&self) -> bool {
+ self.alt_left() | self.alt_right()
+ }
+ pub fn ctrl(&self) -> bool {
+ self.ctrl_left() | self.ctrl_right()
+ }
+
+ // setting/clearing states of SHIFT, ALT, CTRL etc.
+ pub fn set_shift(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::Shift as u8
+ } else {
+ self.modi & !(Mbit::Shift as u8)
+ }
+ }
+
+ pub fn set_alt_left(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::AltLeft as u8
+ } else {
+ self.modi & !(Mbit::AltLeft as u8)
+ }
+ }
+
+
+ pub fn set_alt_right(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::AltRight as u8
+ } else {
+ self.modi & !(Mbit::AltRight as u8)
+ }
+ }
+
+ pub fn set_ctrl_left(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::CtrlLeft as u8
+ } else {
+ self.modi & !(Mbit::CtrlLeft as u8)
+ }
+ }
+
+ pub fn set_ctrl_right(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::CtrlRight as u8
+ } else {
+ self.modi & !(Mbit::CtrlRight as u8)
+ }
+ }
+
+
+ pub fn set_caps_lock(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::CapsLock as u8
+ } else {
+ self.modi & !(Mbit::CapsLock as u8)
+ }
+ }
+
+
+ pub fn set_num_lock(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::NumLock as u8
+ } else {
+ self.modi & !(Mbit::NumLock as u8)
+ }
+ }
+
+ pub fn set_scroll_lock(&mut self, pressed: bool) {
+ self.modi = if pressed {
+ self.modi | Mbit::ScrollLock as u8
+ } else {
+ self.modi & !(Mbit::ScrollLock as u8)
+ }
+ }
+}