#include <machine/archtypes.h>
#include <minix/callnr.h>
#include <minix/com.h>
+#include <minix/input.h>
#include <minix/keymap.h>
#include "tty.h"
#include "kernel/const.h"
#define CONSOLE 0 /* line number for console */
#define KB_IN_BYTES 32 /* size of keyboard input buffer */
+
+PRIVATE char injbuf[KB_IN_BYTES];
+PRIVATE char *injhead = injbuf;
+PRIVATE char *injtail = injbuf;
+PRIVATE int injcount;
+
PRIVATE char ibuf[KB_IN_BYTES]; /* input buffer */
PRIVATE char *ihead = ibuf; /* next free spot in input buffer */
PRIVATE char *itail = ibuf; /* scan code to return to TTY */
}
}
+
+PUBLIC void do_kb_inject(message *msg)
+{
+ unsigned char scode;
+ /* only handle keyboard events */
+ if (msg->INPUT_TYPE == INPUT_EV_KEY) {
+ scode = msg->INPUT_CODE;
+
+ /* is it a KEY RELEASE? */
+ if (msg->INPUT_VALUE == 0) {
+ scode |= KEY_RELEASE;
+ }
+
+ if (injcount < KB_IN_BYTES) {
+ *injhead++ = scode;
+ if (injhead == injbuf + KB_IN_BYTES) injhead = injbuf;
+ injcount++;
+ tty_table[ccurrent].tty_events = 1;
+ if (tty_table[ccurrent].tty_select_ops & SEL_RD) {
+ select_retry(&tty_table[ccurrent]);
+ }
+ }
+ }
+}
+
/*===========================================================================*
* kb_read *
*===========================================================================*/
char buf[7], *p, suffix;
int scode;
unsigned ch;
-
- tp = &tty_table[ccurrent]; /* always use the current console */
+
+ /* always use the current console */
+ tp = &tty_table[ccurrent];
if (try) {
if (icount > 0) return 1;
return 0;
}
- while (icount > 0) {
- scode = *itail++; /* take one key scan code */
- if (itail == ibuf + KB_IN_BYTES) itail = ibuf;
- icount--;
+ while (icount > 0 || injcount > 0) {
+ if (injcount > 0) {
+ /* take one key scan code */
+ scode = *injtail++;
+ if (injtail == injbuf + KB_IN_BYTES) injtail = injbuf;
+ injcount--;
+ } else {
+ /* take one key scan code */
+ scode = *itail++;
+ if (itail == ibuf + KB_IN_BYTES) itail = ibuf;
+ icount--;
+ }
/* Function keys are being used for debug dumps (if enabled). */
if (debug_fkeys && func_key(scode)) continue;
/* Perform make/break processing. */
+
ch = make_break(scode);
if (ch <= 0xFF) {
case FKEY_CONTROL: /* (un)register a fkey observer */
do_fkey_ctl(&tty_mess);
continue;
+ case INPUT_EVENT:
+ do_kb_inject(&tty_mess);
+ continue;
default: /* should be a driver request */
; /* do nothing; end switch */
}
_PROTOTYPE( void do_fkey_ctl, (message *m) );
_PROTOTYPE( void kbd_interrupt, (message *m) );
_PROTOTYPE( void do_kbd, (message *m) );
+_PROTOTYPE( void do_kb_inject, (message *m) );
_PROTOTYPE( void do_kbdaux, (message *m) );
_PROTOTYPE( int kbd_status, (message *m_ptr) );
minix/sysutil.h minix/timers.h minix/tty.h minix/type.h minix/types.h \
minix/u64.h minix/vfsif.h minix/vm.h minix/vtreefs.h minix/gcov.h \
minix/compiler.h minix/compiler-ack.h minix/sha2.h minix/sha1.h minix/md5.h \
- minix/audio_fw.h minix/hash.h
+ minix/audio_fw.h minix/hash.h minix/input.h
INCS+= net/hton.h net/if.h net/ioctl.h net/netlib.h
INCS+= net/gen/arp_io.h net/gen/dhcp.h net/gen/ether.h \
net/gen/eth_hdr.h net/gen/eth_io.h net/gen/icmp.h \
* 0xE00 - 0xEFF Common system messages (e.g. system signals)
* 0xF00 - 0xFFF Scheduling messages
* 0x1000 - 0x10FF Notify messages
+ * 0x1300 - 0x13FF TTY Input
*
* Zero and negative values are widely used for OK and error responses.
*/
/* SCHEDULING_INHERIT is like SCHEDULING_START, but without _QUANTUM field */
#define SCHEDULING_INHERIT (SCHEDULING_BASE+5)
+/*===========================================================================*
+ * TTY INPUT INJECTION *
+ *===========================================================================*/
+
+#define INPUT_BASE 0x1300
+
+#define INPUT_EVENT (INPUT_BASE + 0)
+
+# define INPUT_TYPE m4_l1
+# define INPUT_CODE m4_l2
+# define INPUT_VALUE m4_l3
+
#endif
/* _MINIX_COM_H */
--- /dev/null
+#ifndef _MINIX_INPUT_H
+#define _MINIX_INPUT_H
+
+#define INPUT_EV_KEY 0x1
+#define INPUT_EV_REL 0x2
+#define INPUT_EV_ABS 0x3
+
+#endif
_PROTOTYPE( int sys_getmcontext, (endpoint_t proc, mcontext_t *mcp) );
_PROTOTYPE( int sys_setmcontext, (endpoint_t proc, mcontext_t *mcp) );
+/* input */
+_PROTOTYPE( int tty_input_inject, (int type, int code, int val) );
+
#endif /* _SYSLIB_H */
SRCS= \
alloc_util.c \
assert.c \
+ asynsend.c \
+ ds.c \
+ env_get_prm.c \
+ env_panic.c \
+ env_parse.c \
+ env_prefix.c \
+ fkey_ctl.c \
+ gcov.c \
+ get_randomness.c \
+ getidle.c \
getsysinfo.c \
+ getuptime.c \
+ getuptime2.c \
+ input.c \
kernel_call.c \
+ kprintf.c \
+ kputc.c \
+ kputs.c \
panic.c \
pci_attr_r16.c \
pci_attr_r32.c \
pci_reserve.c \
pci_set_acl.c \
pci_slot_name.c \
+ profile.c \
+ profile_extern.c \
safecopies.c \
sched_start.c \
sched_stop.c \
sef_liveupdate.c \
sef_ping.c \
sef_signal.c \
+ ser_putc.c \
+ spin.c \
+ stacktrace.c \
sys_abort.c \
sys_clear.c \
- sys_mcontext.c \
sys_cprof.c \
sys_endsig.c \
sys_eniop.c \
sys_fork.c \
sys_getinfo.c \
sys_getsig.c \
+ sys_hz.c \
sys_in.c \
sys_int86.c \
sys_irqctl.c \
sys_kill.c \
+ sys_mcontext.c \
sys_memset.c \
sys_newmap.c \
sys_out.c \
sys_physcopy.c \
+ sys_privctl.c \
+ sys_profbuf.c \
sys_readbios.c \
sys_runctl.c \
- sys_update.c \
sys_safecopy.c \
sys_safemap.c \
- sys_sysctl.c \
- sys_vsafecopy.c \
- sys_profbuf.c \
+ sys_schedctl.c \
+ sys_schedule.c \
sys_sdevio.c \
sys_segctl.c \
sys_setalarm.c \
+ sys_setgrant.c \
sys_sigreturn.c \
sys_sigsend.c \
- sys_privctl.c \
- sys_setgrant.c \
sys_sprof.c \
+ sys_statectl.c \
sys_stime.c \
- sys_schedule.c \
- sys_schedctl.c \
- sys_statectl.c \
+ sys_sysctl.c \
sys_times.c \
sys_trace.c \
sys_umap.c \
+ sys_update.c \
sys_vinb.c \
sys_vinl.c \
sys_vinw.c \
sys_voutb.c \
sys_voutl.c \
sys_voutw.c \
+ sys_vsafecopy.c \
sys_vtimer.c \
taskcall.c \
- ds.c \
+ tickdelay.c \
+ timers.c \
+ timing.c \
+ tsc_util.c \
vm_brk.c \
vm_exec_newmem.c \
vm_exit.c \
- vm_notify_sig.c \
vm_fork.c \
vm_info.c \
vm_map_phys.c \
- vm_umap.c \
+ vm_notify_sig.c \
vm_push_sig.c \
+ vm_umap.c \
vm_yield_get_block.c \
- asynsend.c \
- kprintf.c \
- kputc.c \
- kputs.c \
- tickdelay.c \
- get_randomness.c \
- getidle.c \
- getuptime.c \
- getuptime2.c \
- env_get_prm.c \
- env_parse.c \
- env_panic.c \
- env_prefix.c \
- fkey_ctl.c \
- tsc_util.c \
- ser_putc.c \
- stacktrace.c \
- sys_hz.c \
- timing.c \
- profile_extern.c \
- profile.c \
vprintf.c \
- timers.c \
- spin.c \
- gcov.c
CPPFLAGS.sched_start.c+= -I${MINIXSRCDIR}
--- /dev/null
+#include "syslib.h"
+#include <minix/sysutil.h>
+/*****************************************************************************
+ * tty_inject_event *
+ *****************************************************************************/
+PUBLIC int tty_inject_event(type, code, val)
+int type;
+int code;
+int val;
+{
+ message msg;
+ msg.INPUT_TYPE = type;
+ msg.INPUT_CODE = code;
+ msg.INPUT_VALUE = val;
+
+ return send(TTY_PROC_NR, &msg);
+}