diff options
author | rathann <rathann@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-03-29 17:16:11 +0000 |
---|---|---|
committer | rathann <rathann@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-03-29 17:16:11 +0000 |
commit | 259cfbe7e23f353d15291875b70663517e973377 (patch) | |
tree | 3fd490d7182022d324b120a4bebb9433144d2f42 /mp_fifo.c | |
parent | 929e2c51efc4e9d7b6dcd61dbd3b9c60a27dacd7 (diff) | |
download | mpv-259cfbe7e23f353d15291875b70663517e973377.tar.bz2 mpv-259cfbe7e23f353d15291875b70663517e973377.tar.xz |
Code cleanup: don't include a .c file in mplayer.c and fix a few
"implicit declaration of function ‘mplayer_put_key’" warnings
Based on Attila's suggestions.
Approved by Uoti and Ivan.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22841 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mp_fifo.c')
-rw-r--r-- | mp_fifo.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/mp_fifo.c b/mp_fifo.c new file mode 100644 index 0000000000..5d0159dfd8 --- /dev/null +++ b/mp_fifo.c @@ -0,0 +1,70 @@ +#include <stdlib.h> +#include "osdep/timer.h" +#include "input/input.h" +#include "input/mouse.h" + + +int key_fifo_size = 7; +static int *key_fifo_data = NULL; +static int key_fifo_read=0; +static int key_fifo_write=0; + +static void mplayer_put_key_internal(int code){ + int fifo_free = key_fifo_read - key_fifo_write - 1; + if (fifo_free < 0) fifo_free += key_fifo_size; +// printf("mplayer_put_key(%d)\n",code); + if (key_fifo_data == NULL) + key_fifo_data = malloc(key_fifo_size * sizeof(int)); + if(!fifo_free) return; // FIFO FULL!! + // reserve some space for key release events to avoid stuck keys + if((code & MP_KEY_DOWN) && fifo_free < (key_fifo_size >> 1)) + return; + key_fifo_data[key_fifo_write]=code; + key_fifo_write=(key_fifo_write+1)%key_fifo_size; +} + +int mplayer_get_key(int fd){ + int key; +// printf("mplayer_get_key(%d)\n",fd); + if (key_fifo_data == NULL) + return MP_INPUT_NOTHING; + if(key_fifo_write==key_fifo_read) return MP_INPUT_NOTHING; + key=key_fifo_data[key_fifo_read]; + key_fifo_read=(key_fifo_read+1)%key_fifo_size; +// printf("mplayer_get_key => %d\n",key); + return key; +} + + +unsigned doubleclick_time = 300; + +static void put_double(int code) { + if (code >= MOUSE_BTN0 && code <= MOUSE_BTN9) + mplayer_put_key_internal(code - MOUSE_BTN0 + MOUSE_BTN0_DBL); +} + +void mplayer_put_key(int code) { + static unsigned last_key_time[2]; + static int last_key[2]; + unsigned now = GetTimerMS(); + // ignore system-doubleclick if we generate these events ourselves + if (doubleclick_time && + (code & ~MP_KEY_DOWN) >= MOUSE_BTN0_DBL && + (code & ~MP_KEY_DOWN) <= MOUSE_BTN9_DBL) + return; + mplayer_put_key_internal(code); + if (code & MP_KEY_DOWN) { + code &= ~MP_KEY_DOWN; + last_key[1] = last_key[0]; + last_key[0] = code; + last_key_time[1] = last_key_time[0]; + last_key_time[0] = now; + if (last_key[1] == code && + now - last_key_time[1] < doubleclick_time) + put_double(code); + return; + } + if (last_key[0] == code && last_key[1] == code && + now - last_key_time[1] < doubleclick_time) + put_double(code); +} |