From 767317f0bbf685e9f89ed3d91915c170515a98bf Mon Sep 17 00:00:00 2001
From: salixor <salixor@pm.me>
Date: Thu, 18 Jan 2024 23:27:38 +0100
Subject: [PATCH] Spawn a program when pressing an Fn key

---
 src/input.rs | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/input.rs b/src/input.rs
index 3869232..c70eb1f 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -1,7 +1,7 @@
 use smithay::{
     backend::input::{
         AbsolutePositionEvent, Axis, AxisSource, ButtonState, Event, InputBackend, InputEvent,
-        KeyboardKeyEvent, PointerAxisEvent, PointerButtonEvent,
+        KeyState, KeyboardKeyEvent, PointerAxisEvent, PointerButtonEvent,
     },
     input::{
         keyboard::FilterResult,
@@ -13,6 +13,8 @@ use smithay::{
 
 use crate::state::Smallvil;
 
+const PROGRAM_TO_SPAWN: &str = "konsole";
+
 impl Smallvil {
     pub fn process_input_event<I: InputBackend>(&mut self, event: InputEvent<I>) {
         match event {
@@ -26,7 +28,17 @@ impl Smallvil {
                     event.state(),
                     serial,
                     time,
-                    |_, _, _| FilterResult::Forward,
+                    |_, _, handle| {
+                        let state = event.state();
+                        let keysym = handle.modified_sym();
+
+                        if state == KeyState::Pressed && keysym.is_function_key() {
+                            std::process::Command::new(PROGRAM_TO_SPAWN).spawn().ok();
+                            return FilterResult::Intercept(());
+                        }
+
+                        FilterResult::Forward
+                    },
                 );
             }
             InputEvent::PointerMotion { .. } => {}
-- 
GitLab