annotate fifo.c @ 22275:e104fa52d218

With \t(\b) text becomes bold at the middle of time interval, not at the end of it like before. The same for \t(\i).
author eugeni
date Tue, 20 Feb 2007 17:20:21 +0000
parents 934010b90043
children 5a5c7529e8a3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
1 #include "input/mouse.h"
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
2
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
3 #if 0
113
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
4
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
5 // keyboard:
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
6 static int keyb_fifo_put=-1;
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
7 static int keyb_fifo_get=-1;
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
8
13872
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
9 static void set_nonblock_flag(int fd) {
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
10 int oldflags;
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
11
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
12 oldflags = fcntl(fd, F_GETFL, 0);
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
13 if (oldflags != -1) {
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
14 if (fcntl(keyb_fifo_put, F_SETFL, oldflags | O_NONBLOCK) != -1) {
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
15 return;
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
16 }
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
17 }
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
18 mp_msg(MSGT_INPUT,MSGL_ERR,"Cannot set nonblocking mode for fd %d!\n", fd);
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
19 }
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
20
113
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
21 static void make_pipe(int* pr,int* pw){
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
22 int temp[2];
13699
11b249ef87b0 printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents: 9831
diff changeset
23 if(pipe(temp)!=0) mp_msg(MSGT_FIXME, MSGL_FIXME, MSGTR_CannotMakePipe);
113
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
24 *pr=temp[0];
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
25 *pw=temp[1];
13872
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
26 set_nonblock_flag(temp[1]);
113
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
27 }
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
28
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
29 static void mplayer_put_key_internal(int code){
113
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
30
13872
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
31 if( write(keyb_fifo_put,&code,4) != 4 ){
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
32 mp_msg(MSGT_INPUT,MSGL_ERR,"*** key event dropped (FIFO is full) ***\n");
8b810ed6e543 fix "stuck mouse button" by setting O_NONBLOCK, instead of using select() to check write() blocking on pipe.
iive
parents: 13699
diff changeset
33 }
113
f6f8f53b75ad common FIFO code moved to fifo.c
arpi_esp
parents:
diff changeset
34 }
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
35
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
36 #else
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
37
22131
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
38 int key_fifo_size = 7;
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
39 static int *key_fifo_data = NULL;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
40 static int key_fifo_read=0;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
41 static int key_fifo_write=0;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
42
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
43 static void mplayer_put_key_internal(int code){
22131
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
44 int fifo_free = key_fifo_read - key_fifo_write - 1;
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
45 if (fifo_free < 0) fifo_free += key_fifo_size;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
46 // printf("mplayer_put_key(%d)\n",code);
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
47 if (key_fifo_data == NULL)
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
48 key_fifo_data = malloc(key_fifo_size * sizeof(int));
22131
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
49 if(!fifo_free) return; // FIFO FULL!!
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
50 // reserve some space for key release events to avoid stuck keys
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
51 if((code & MP_KEY_DOWN) && fifo_free < (key_fifo_size >> 1))
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
52 return;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
53 key_fifo_data[key_fifo_write]=code;
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
54 key_fifo_write=(key_fifo_write+1)%key_fifo_size;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
55 }
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
56
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
57 int mplayer_get_key(int fd){
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
58 int key;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
59 // printf("mplayer_get_key(%d)\n",fd);
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
60 if (key_fifo_data == NULL)
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
61 return MP_INPUT_NOTHING;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
62 if(key_fifo_write==key_fifo_read) return MP_INPUT_NOTHING;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
63 key=key_fifo_data[key_fifo_read];
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
64 key_fifo_read=(key_fifo_read+1)%key_fifo_size;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
65 // printf("mplayer_get_key => %d\n",key);
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
66 return key;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
67 }
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
68
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
69 #endif
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
70
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
71 static unsigned doubleclick_time = 300;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
72
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
73 static void put_double(int code) {
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
74 if (code >= MOUSE_BTN0 && code <= MOUSE_BTN9)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
75 mplayer_put_key_internal(code - MOUSE_BTN0 + MOUSE_BTN0_DBL);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
76 }
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
77
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
78 void mplayer_put_key(int code) {
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
79 static unsigned last_key_time[2];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
80 static int last_key[2];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
81 unsigned now = GetTimerMS();
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
82 // ignore system-doubleclick if we generate these events ourselves
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
83 if (doubleclick_time &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
84 (code & ~MP_KEY_DOWN) >= MOUSE_BTN0_DBL &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
85 (code & ~MP_KEY_DOWN) <= MOUSE_BTN9_DBL)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
86 return;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
87 mplayer_put_key_internal(code);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
88 if (code & MP_KEY_DOWN) {
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
89 code &= ~MP_KEY_DOWN;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
90 last_key[1] = last_key[0];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
91 last_key[0] = code;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
92 last_key_time[1] = last_key_time[0];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
93 last_key_time[0] = now;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
94 if (last_key[1] == code &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
95 now - last_key_time[1] < doubleclick_time)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
96 put_double(code);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
97 return;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
98 }
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
99 if (last_key[0] == code && last_key[1] == code &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
100 now - last_key_time[1] < doubleclick_time)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
101 put_double(code);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
102 }