@@ -143,15 +143,25 @@ async fn main() -> Result<(), Box<dyn Error>> {
143143        } ; 
144144    } 
145145
146-     let  arg_devices:  Vec < & str >  = args. values_of ( "device" ) . unwrap_or_default ( ) . collect ( ) ; 
146+     let  arg_add_devices:  Vec < & str >  = args. values_of ( "device" ) . unwrap_or_default ( ) . collect ( ) ; 
147+     let  arg_ignore_devices:  Vec < & str >  =
148+         args. values_of ( "ignore-device" ) . unwrap_or_default ( ) . collect ( ) ; 
147149
148150    let  keyboard_devices:  Vec < _ >  = { 
149-         if  arg_devices . is_empty ( )  { 
151+         if  arg_add_devices . is_empty ( )  { 
150152            log:: trace!( "Attempting to find all keyboard file descriptors." ) ; 
151-             evdev:: enumerate ( ) . filter ( |( _,  dev) | check_device_is_keyboard ( dev) ) . collect ( ) 
153+             evdev:: enumerate ( ) 
154+                 . filter ( |( _,  dev) | { 
155+                     !arg_ignore_devices. contains ( & dev. name ( ) . unwrap_or ( "" ) ) 
156+                         && check_device_is_keyboard ( dev) 
157+                 } ) 
158+                 . collect ( ) 
152159        }  else  { 
153160            evdev:: enumerate ( ) 
154-                 . filter ( |( _,  dev) | arg_devices. contains ( & dev. name ( ) . unwrap_or ( "" ) ) ) 
161+                 . filter ( |( _,  dev) | { 
162+                     !arg_ignore_devices. contains ( & dev. name ( ) . unwrap_or ( "" ) ) 
163+                         && arg_add_devices. contains ( & dev. name ( ) . unwrap_or ( "" ) ) 
164+                 } ) 
155165                . collect ( ) 
156166        } 
157167    } ; 
@@ -309,7 +319,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
309319                            Ok ( device)  => device
310320                        } ; 
311321                        let  name = device. name( ) . unwrap_or( "[unknown]" ) ; 
312-                         if  arg_devices . contains( & name)  || check_device_is_keyboard( & device)  { 
322+                         if  !arg_ignore_devices . contains( & name)  &&  ( arg_add_devices . contains ( & name )   || check_device_is_keyboard( & device) )  { 
313323                            log:: info!( "Device '{}' at '{}' added." ,  name,  node) ; 
314324                            let  _ = device. grab( ) ; 
315325                            keyboard_states. insert( node. to_string( ) ,  KeyboardState :: new( ) ) ; 
@@ -490,14 +500,22 @@ pub fn set_command_line_args() -> Command<'static> {
490500        ) 
491501        . arg ( arg ! ( -d - -debug) . required ( false ) . help ( "Enable debug mode." ) ) 
492502        . arg ( 
493-             arg ! ( -D  --device <DEVICE_NAME >) 
503+             arg ! ( -D  --device <DEVICE_NAMES >) 
494504                . required ( false ) 
495505                . takes_value ( true ) 
496506                . multiple_occurrences ( true ) 
497507                . help ( 
498508                    "Specific keyboard devices to use. Seperate multiple devices with semicolon." , 
499509                ) , 
500-         ) ; 
510+         ) 
511+         . arg ( arg ! ( -I  --ignore-device <DEVICE_NAMES >) 
512+             . required ( false ) 
513+             . takes_value ( true ) 
514+             . multiple_occurrences ( true ) 
515+             . help ( 
516+                 "Specific keyboard devices to ignore. Seperate multiple devices with semicolon." 
517+             ) 
518+     ) ; 
501519    app
502520} 
503521
0 commit comments