]>
git.gir.st - sendHID.git/blob - main.c
2 description: sends a sequence of keystrokes to the hid device.
4 device file (e.g. /dev/hidg0)
5 keyboard layout (1=en_us, 2=de_at, 3=de_at-nodeadkeys)
6 unicode method: 1=gtk_holddown, 2=gtk_spaceend, 3=windows
7 the string to send (as whitespace is important, the `echo` way of concatenating all parameters is not supported. if your string has white space in it and you are in an interactive session, quote your string.)
12 #include "scancodes.h"
14 enum params
{ //argv-indices:
15 P_EXE
, //executable name
18 P_UNI
, //unicode method
19 P_STR
, //string to type
20 NUM_P
//number of parameters
22 enum kbdl
{ //keyboard layouts:
26 de_ND
//de_AT-nodeadkeys
28 enum uni_m
{ //unicode methods:
29 SKIP
, //ignore any keys not on the layout
30 GTK_HOLD
, //hold ctrl and shift while entering hex values
31 GTK_SPACE
, //end hex sequence with spacebar
32 WINDOWS
//use alt+numpad
35 ERR_SUCCESS
, //no error
36 ERR_ARGCOUNT
, //wrong number of arguments
37 ERR_SYMBOL
, //symbol not in look up table
38 ERR_LAYOUT
, //parameter P_LAY does not contain a correct keyboard layout
39 ERR_LAZY
//i haven't done this
42 void send_key ( FILE * hid_dev
, unsigned short key
, unsigned short mod
);
43 struct layout
* tolay ( struct keysym
* s
, enum kbdl layout
);
44 enum errors
send_unicode ( FILE * hid_dev
, unsigned int unicode
, enum uni_m method
, enum kbdl layout
);
46 int main ( int argc
, char ** argv
) {
48 fprintf ( stderr
, "Usage: %s <device file> <layout> <unicode> \" <string> \"\n " , argv
[ P_EXE
]);
51 FILE * hid_dev
= fopen ( "/dev/hidg0" , "w" );
52 for ( int i
= 0 ; i
< strlen ( argv
[ P_STR
]); i
++) {
54 char tmp
[ UTF8_MAX_LENGTH
] = { argv
[ P_STR
][ i
], argv
[ P_STR
][ i
+ 1 ], argv
[ P_STR
][ i
+ 2 ], '\0' };
55 //TODO: replace by something less stupid
56 if ( argv
[ P_STR
][ i
] < 128 ) { // not multi byte
58 } else { // is multi byte
59 if ( argv
[ P_STR
][ i
] < 0xe0 ) {
60 i
++; //skip next thing
63 i
+= 2 ; //WARN: fails on utf8 > 3 byte
67 struct keysym
* s
= toscan ( tmp
);
69 fprintf ( stderr
, "Key Symbol not found. \n " );
73 struct layout
* l
= tolay ( s
, atoi ( argv
[ P_LAY
]));
75 fprintf ( stderr
, "Unrecognised keyboard layout. \n " );
80 send_key ( hid_dev
, l
-> key
, l
-> mod
);
81 send_key ( hid_dev
, '\0' , '\0' ); //release all keys
83 //dead keys need to be pressed twice to show up
84 send_key ( hid_dev
, l
-> key
, l
-> mod
);
85 send_key ( hid_dev
, '\0' , '\0' ); //release all keys
88 //key does not exist in this layout, use unicode method
89 fprintf ( stderr
, "Warning: Key '%s'(0x%x) not in this layout! \n " , s
-> sym
, s
-> unicode
);
90 send_unicode ( hid_dev
, s
-> unicode
, atoi ( argv
[ P_UNI
]), atoi ( argv
[ P_LAY
]));
98 void send_key ( FILE * hid_dev
, unsigned short key
, unsigned short mod
) {
99 fprintf ( hid_dev
, "%c%c%c%c%c%c%c%c" , mod
, '\0' , key
, '\0' , '\0' , '\0' , '\0' , '\0' );
102 struct layout
* tolay ( struct keysym
* s
, enum kbdl layout
) {
104 case en_US
: return &( s
-> en_us
);
105 case de_AT
: return &( s
-> de_at
);
106 case de_ND
: return &( s
-> de_nd
);
107 default : return NULL
;
111 enum errors
send_unicode ( FILE * hid_dev
, unsigned int unicode
, enum uni_m method
, enum kbdl layout
) {
116 if ( unicode
== 0x00 ) {
117 fprintf ( stderr
, "Symbol not in lookup table! \n " );
125 sprintf ( buf
, "%x" , unicode
);
126 fprintf ( stderr
, "attempting to send: %s" , buf
);
128 l
= tolay ( s
, layout
);
129 send_key ( hid_dev
, l
-> key
, MOD_LCTRL
| MOD_LSHIFT
);
130 for ( int i
= 0 ; i
< strlen ( buf
); i
++) {
131 s
= toscan (( char [ 2 ]){ buf
[ i
], '\0' });
132 l
= tolay ( s
, layout
);
133 send_key ( hid_dev
, l
-> key
, MOD_LCTRL
| MOD_LSHIFT
);
135 send_key ( hid_dev
, '\0' , '\0' );
138 sprintf ( buf
, "%x " , unicode
);
139 fprintf ( stderr
, "attempting to send: %s" , buf
);
141 l
= tolay ( s
, layout
);
142 send_key ( hid_dev
, l
-> key
, MOD_LCTRL
| MOD_LSHIFT
);
143 for ( int i
= 0 ; i
< strlen ( buf
); i
++) {
144 s
= toscan (( char [ 2 ]){ buf
[ i
], '\0' });
145 l
= tolay ( s
, layout
);
146 send_key ( hid_dev
, l
-> key
, MOD_NONE
);
148 send_key ( hid_dev
, '\0' , '\0' );
151 fprintf ( stderr
, "windows method not implemented! \n " );
154 fprintf ( stderr
, "unknown unicode method! \n " );
155 return ERR_LAYOUT
; //TODO: better error code