Mercurial > mplayer.hg
annotate mp_fifo.c @ 36068:5fb59898a798
Add comment.
author | ib |
---|---|
date | Fri, 05 Apr 2013 12:34:44 +0000 |
parents | d63bf64a2094 |
children | 0caa0bf428b9 |
rev | line source |
---|---|
30429
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
1 /* |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
2 * This file is part of MPlayer. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
3 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
7 * (at your option) any later version. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
8 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
12 * GNU General Public License for more details. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
13 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
17 */ |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
22823
diff
changeset
|
18 |
22823
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
19 #include <stdlib.h> |
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
20 #include "osdep/timer.h" |
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
21 #include "input/input.h" |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
22 #include "input/mouse.h" |
30554 | 23 #include "mp_fifo.h" |
9831 | 24 |
22131
934010b90043
Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents:
21964
diff
changeset
|
25 int key_fifo_size = 7; |
33015 | 26 static int *key_fifo_data; |
27 static unsigned key_fifo_read; | |
28 static unsigned key_fifo_write; | |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
29 static int previous_down_key; |
9831 | 30 |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
31 static void mplayer_put_key_internal(int code){ |
33014 | 32 int fifo_free = key_fifo_read + key_fifo_size - key_fifo_write; |
14077
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
33 if (key_fifo_data == NULL) |
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
34 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
|
35 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
|
36 // reserve some space for key release events to avoid stuck keys |
33018
d88b8a9e989e
Change condition to avoid needless key state resets with very small
reimar
parents:
33017
diff
changeset
|
37 // Make sure we do not reset key state because of a down event |
d88b8a9e989e
Change condition to avoid needless key state resets with very small
reimar
parents:
33017
diff
changeset
|
38 if((code & MP_KEY_DOWN) && fifo_free <= (key_fifo_size >> 1)) |
22131
934010b90043
Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents:
21964
diff
changeset
|
39 return; |
33017
cc8cef372901
Make "stuck keys" problem impossibly by resetting the internal
reimar
parents:
33016
diff
changeset
|
40 // in the worst case, just reset key state |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
41 if (fifo_free == 1) { |
33145
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
42 // ensure we do not only create MP_KEY_RELEASE_ALL events |
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
43 if (previous_down_key & MP_KEY_RELEASE_ALL) |
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
44 return; |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
45 // HACK: this ensures that a fifo size of 2 does |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
46 // not queue any key presses while still allowing |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
47 // the mouse wheel to work (which sends down and up |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
48 // at nearly the same time |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
49 if (code != previous_down_key) |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
50 code = 0; |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
51 code |= MP_KEY_RELEASE_ALL; |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
52 } |
33014 | 53 key_fifo_data[key_fifo_write % key_fifo_size]=code; |
54 key_fifo_write++; | |
33019
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
55 if (code & MP_KEY_DOWN) |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
56 previous_down_key = code & ~MP_KEY_DOWN; |
03ed899a72bc
Allow mouse wheel to work with a key fifo size of 2.
reimar
parents:
33018
diff
changeset
|
57 else |
33145
1e637ada9003
Avoid MPlayer ignoring a key press completely, instead sending
reimar
parents:
33019
diff
changeset
|
58 previous_down_key = code & MP_KEY_RELEASE_ALL; |
9831 | 59 } |
60 | |
61 int mplayer_get_key(int fd){ | |
62 int key; | |
14077
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
63 if (key_fifo_data == NULL) |
3d3f3cc8494a
use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents:
13872
diff
changeset
|
64 return MP_INPUT_NOTHING; |
9831 | 65 if(key_fifo_write==key_fifo_read) return MP_INPUT_NOTHING; |
33014 | 66 key=key_fifo_data[key_fifo_read % key_fifo_size]; |
67 key_fifo_read++; | |
9831 | 68 return key; |
69 } | |
70 | |
71 | |
22823
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
22313
diff
changeset
|
72 unsigned doubleclick_time = 300; |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
73 |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
74 static void put_double(int code) { |
33304
d63bf64a2094
Support up to 20 mouse buttons, there really seem to be input devices
reimar
parents:
33145
diff
changeset
|
75 if (code >= MOUSE_BTN0 && code <= MOUSE_BTN_LAST) |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
76 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
|
77 } |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
78 |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
79 void mplayer_put_key(int code) { |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
80 static unsigned last_key_time[2]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
81 static int last_key[2]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
82 unsigned now = GetTimerMS(); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
83 // 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
|
84 if (doubleclick_time && |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
85 (code & ~MP_KEY_DOWN) >= MOUSE_BTN0_DBL && |
33304
d63bf64a2094
Support up to 20 mouse buttons, there really seem to be input devices
reimar
parents:
33145
diff
changeset
|
86 (code & ~MP_KEY_DOWN) <= MOUSE_BTN_LAST_DBL) |
21941
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
87 return; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
88 mplayer_put_key_internal(code); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
89 if (code & MP_KEY_DOWN) { |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
90 code &= ~MP_KEY_DOWN; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
91 last_key[1] = last_key[0]; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
92 last_key[0] = code; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
93 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
|
94 last_key_time[0] = now; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
95 if (last_key[1] == code && |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
96 now - last_key_time[1] < doubleclick_time) |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
97 put_double(code); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
98 return; |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
99 } |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
100 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
|
101 now - last_key_time[1] < doubleclick_time) |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
102 put_double(code); |
32c3d5e3a682
Apply ancient double-click patch that nobody cares to comment on.
reimar
parents:
14077
diff
changeset
|
103 } |