diff fifo.c @ 13872:8b810ed6e543

fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe. Marius Gedminas have located the bug as send original patch. Modified version by me.
author iive
date Fri, 05 Nov 2004 04:13:25 +0000
parents 11b249ef87b0
children 3d3f3cc8494a
line wrap: on
line diff
--- a/fifo.c	Thu Nov 04 18:31:55 2004 +0000
+++ b/fifo.c	Fri Nov 05 04:13:25 2004 +0000
@@ -5,30 +5,31 @@
 static int keyb_fifo_put=-1;
 static int keyb_fifo_get=-1;
 
+static void set_nonblock_flag(int fd) {
+  int oldflags;
+
+  oldflags = fcntl(fd, F_GETFL, 0);
+  if (oldflags != -1) {
+    if (fcntl(keyb_fifo_put, F_SETFL, oldflags | O_NONBLOCK) != -1) {
+       return;
+    }
+  }
+  mp_msg(MSGT_INPUT,MSGL_ERR,"Cannot set nonblocking mode for fd %d!\n", fd);
+}
+
 static void make_pipe(int* pr,int* pw){
   int temp[2];
   if(pipe(temp)!=0) mp_msg(MSGT_FIXME, MSGL_FIXME, MSGTR_CannotMakePipe);
   *pr=temp[0];
   *pw=temp[1];
+  set_nonblock_flag(temp[1]);
 }
 
 void mplayer_put_key(int code){
-           fd_set rfds;
-           struct timeval tv;
 
-           /* Watch stdin (fd 0) to see when it has input. */
-           FD_ZERO(&rfds);
-           FD_SET(keyb_fifo_put, &rfds);
-           tv.tv_sec = 0;
-           tv.tv_usec = 0;
-
-           //retval = select(keyb_fifo_put+1, &rfds, NULL, NULL, &tv);
-           if(select(keyb_fifo_put+1, NULL, &rfds, NULL, &tv)>0){
-             write(keyb_fifo_put,&code,4);
-//             printf("*** key event %d sent ***\n",code);
-           } else {
-//             printf("*** key event dropped (FIFO is full) ***\n");
-           }
+    if( write(keyb_fifo_put,&code,4) != 4 ){
+        mp_msg(MSGT_INPUT,MSGL_ERR,"*** key event dropped (FIFO is full) ***\n");
+    }
 }
 
 #else