2018-01-11 11:08:40 +01:00
// SPDX-License-Identifier: GPL-2.0+
2010-10-07 13:20:02 -05:00
/* fakekey.c
* Functions for simulating keypresses .
*
* Copyright ( C ) 2010 the Speakup Team
*/
# include <linux/types.h>
# include <linux/slab.h>
# include <linux/preempt.h>
# include <linux/percpu.h>
# include <linux/input.h>
# include "speakup.h"
# define PRESSED 1
# define RELEASED 0
2015-12-18 12:42:51 -08:00
static DEFINE_PER_CPU ( int , reporting_keystroke ) ;
2010-10-07 13:20:02 -05:00
static struct input_dev * virt_keyboard ;
int speakup_add_virtual_keyboard ( void )
{
int err ;
virt_keyboard = input_allocate_device ( ) ;
if ( ! virt_keyboard )
return - ENOMEM ;
virt_keyboard - > name = " Speakup " ;
virt_keyboard - > id . bustype = BUS_VIRTUAL ;
virt_keyboard - > phys = " speakup/input0 " ;
virt_keyboard - > dev . parent = NULL ;
__set_bit ( EV_KEY , virt_keyboard - > evbit ) ;
__set_bit ( KEY_DOWN , virt_keyboard - > keybit ) ;
err = input_register_device ( virt_keyboard ) ;
if ( err ) {
input_free_device ( virt_keyboard ) ;
virt_keyboard = NULL ;
}
return err ;
}
void speakup_remove_virtual_keyboard ( void )
{
2017-03-24 16:59:59 +05:30
if ( virt_keyboard ) {
2010-10-07 13:20:02 -05:00
input_unregister_device ( virt_keyboard ) ;
virt_keyboard = NULL ;
}
}
/*
2017-02-12 16:15:58 +05:30
* Send a simulated down - arrow to the application .
*/
2010-10-07 13:20:02 -05:00
void speakup_fake_down_arrow ( void )
{
unsigned long flags ;
/* disable keyboard interrupts */
local_irq_save ( flags ) ;
/* don't change CPU */
preempt_disable ( ) ;
2010-12-06 11:16:24 -06:00
__this_cpu_write ( reporting_keystroke , true ) ;
2010-10-07 13:20:02 -05:00
input_report_key ( virt_keyboard , KEY_DOWN , PRESSED ) ;
input_report_key ( virt_keyboard , KEY_DOWN , RELEASED ) ;
2015-05-20 05:44:11 -04:00
input_sync ( virt_keyboard ) ;
2010-12-06 11:16:24 -06:00
__this_cpu_write ( reporting_keystroke , false ) ;
2010-10-07 13:20:02 -05:00
/* reenable preemption */
preempt_enable ( ) ;
/* reenable keyboard interrupts */
local_irq_restore ( flags ) ;
}
/*
2017-02-12 16:15:58 +05:30
* Are we handling a simulated keypress on the current CPU ?
* Returns a boolean .
*/
2010-10-07 13:20:02 -05:00
bool speakup_fake_key_pressed ( void )
{
2010-12-06 11:16:26 -06:00
return this_cpu_read ( reporting_keystroke ) ;
2010-10-07 13:20:02 -05:00
}