Event handlers?
Event handlers?
I am using given code to handle mouse clicks. However, this is not working. I have gone through input.h to figure it out but I couldn't. bytes is 1 when it reaches if condition, but my code still doesnt allow execution to go inside if condition. What is that is being done wrong here:
const char *mfile = "/dev/input/mice";
int main()
O_NONBLOCK);
if(fd == -1)
printf("ERROR Opening associated device file: /dev/input/mice n");
return -1;
while(1)
bytes = read(fd, &data, sizeof(struct input_event));
if(bytes > 0)
if((data.code == BTN_LEFT) && (data.value == 0))
printf("Left pressed. n");
else if((data.code == BTN_RIGHT) && (data.value == 0))
printf("Right presseed. n");
close(fd);
return 0;
if (bytes > 0)
if (bytes == sizeof data)
Doesnt work. I printed bytes and it prints 1, which is greater than 0 so it should go in if condition
– Moose
Sep 15 '18 at 8:20
When
bytes == 1, and the (data.code == BTN_LEFT) && (data.value == 0) is false, what do you think code should do with the input it just read? Ignore/discard it, save it for later?– chux
Sep 15 '18 at 13:13
bytes == 1
(data.code == BTN_LEFT) && (data.value == 0)
Print “left released” when left button is released. Print “right released” when right button is released.
– Moose
Sep 15 '18 at 17:43
If only 1 byte was read, then
data was not fully read. With insufficient information read, it does not make sense to try and access the members .code and .value as those members will not be completely assigned. Code needs a new approach.– chux
Sep 15 '18 at 17:51
data
.code
.value
1 Answer
1
You will have to wait until read has read input the size of input_event structure before you process the data in it.
read
input_event
But the current code only checks if any bytes have been read. This check should be changed to check if the number of bytes read equals the input_event structure.
input_event
See the documentation of read:.
Return Value.
On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this number. It is not an error if this number is smaller than the number of bytes requested; this may happen for example because fewer bytes are actually available right now (maybe because we were close to end-of-file, or because we are reading from a pipe, or from a terminal), or because read() was interrupted by a signal. On error, -1 is returned, and errno is set appropriately. In this case it is left unspecified whether the file position (if any) changes.
Thanks for contributing an answer to Stack Overflow!
But avoid …
To learn more, see our tips on writing great answers.
Required, but never shown
Required, but never shown
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
I'd expect
if (bytes > 0)-->if (bytes == sizeof data)to issue all expected data was read. Also always print something when any data read.– chux
Sep 15 '18 at 3:27