diff options
Diffstat (limited to 'input')
-rw-r--r-- | input/input.c | 351 | ||||
-rw-r--r-- | input/input.h | 11 | ||||
-rw-r--r-- | input/keycodes.h | 39 |
3 files changed, 220 insertions, 181 deletions
diff --git a/input/input.c b/input/input.c index e1c001077a..1d973c3aa6 100644 --- a/input/input.c +++ b/input/input.c @@ -36,6 +36,7 @@ #include "keycodes.h" #include "osdep/timer.h" #include "libavutil/avstring.h" +#include "libavutil/common.h" #include "mp_msg.h" #include "m_config.h" #include "m_option.h" @@ -72,7 +73,9 @@ struct key_name { /// The first field is an id used to recognize the command without too many strcmp. /// The second is obviously the command name. /// The third is the minimum number of arguments this command needs. -/// Then comes the definition of each argument, terminated with an arg of type -1. +/// Then comes the definition of each argument, terminated with an arg of +/// type 0 (this doesn't need to be explicit, because C will default initialize +/// the following arguments to type 0). /// A command can take a maximum of MP_CMD_MAX_ARGS-1 arguments (-1 because of /// the last one) which is actually 9. @@ -81,135 +84,136 @@ struct key_name { static const mp_cmd_t mp_cmds[] = { #ifdef CONFIG_RADIO - { MP_CMD_RADIO_STEP_CHANNEL, "radio_step_channel", 1, { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }}, - { MP_CMD_RADIO_SET_CHANNEL, "radio_set_channel", 1, { { MP_CMD_ARG_STRING, {0}}, {-1,{0}} }}, - { MP_CMD_RADIO_SET_FREQ, "radio_set_freq", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_RADIO_STEP_FREQ, "radio_step_freq", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, + { MP_CMD_RADIO_STEP_CHANNEL, "radio_step_channel", 1, { { MP_CMD_ARG_INT} } }, + { MP_CMD_RADIO_SET_CHANNEL, "radio_set_channel", 1, { { MP_CMD_ARG_STRING} } }, + { MP_CMD_RADIO_SET_FREQ, "radio_set_freq", 1, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_RADIO_STEP_FREQ, "radio_step_freq", 1, { {MP_CMD_ARG_FLOAT} } }, #endif - { MP_CMD_SEEK, "seek", 1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_EDL_MARK, "edl_mark", 0, { {-1,{0}} } }, - { MP_CMD_AUDIO_DELAY, "audio_delay", 1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SPEED_INCR, "speed_incr", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_SPEED_MULT, "speed_mult", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_SPEED_SET, "speed_set", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_QUIT, "quit", 0, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_STOP, "stop", 0, { {-1,{0}} } }, - { MP_CMD_PAUSE, "pause", 0, { {-1,{0}} } }, - { MP_CMD_FRAME_STEP, "frame_step", 0, { {-1,{0}} } }, - { MP_CMD_PLAY_TREE_STEP, "pt_step",1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } }, - { MP_CMD_PLAY_TREE_UP_STEP, "pt_up_step",1, { { MP_CMD_ARG_INT,{0} }, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } }, - { MP_CMD_PLAY_ALT_SRC_STEP, "alt_src_step",1, { { MP_CMD_ARG_INT,{0} }, {-1,{0}} } }, - { MP_CMD_LOOP, "loop", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SUB_DELAY, "sub_delay",1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SUB_STEP, "sub_step",1, { { MP_CMD_ARG_INT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_OSD, "osd",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_OSD_SHOW_TEXT, "osd_show_text", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{-1}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_OSD_SHOW_PROPERTY_TEXT, "osd_show_property_text",1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{-1}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_OSD_SHOW_PROGRESSION, "osd_show_progression", 0, { {-1,{0}} } }, - { MP_CMD_VOLUME, "volume", 1, { { MP_CMD_ARG_FLOAT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_BALANCE, "balance", 1, { { MP_CMD_ARG_FLOAT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_MIXER_USEMASTER, "use_master", 0, { {-1,{0}} } }, - { MP_CMD_MUTE, "mute", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_CONTRAST, "contrast",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_GAMMA, "gamma", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_BRIGHTNESS, "brightness",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_HUE, "hue",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SATURATION, "saturation",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_FRAMEDROPPING, "frame_drop",0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } }, - { MP_CMD_SUB_POS, "sub_pos", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SUB_ALIGNMENT, "sub_alignment",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_SUB_VISIBILITY, "sub_visibility", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_SUB_LOAD, "sub_load", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } }, - { MP_CMD_SUB_REMOVE, "sub_remove", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_SUB_SELECT, "vobsub_lang", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, // for compatibility - { MP_CMD_SUB_SELECT, "sub_select", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, - { MP_CMD_SUB_SOURCE, "sub_source", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, - { MP_CMD_SUB_VOB, "sub_vob", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, - { MP_CMD_SUB_DEMUX, "sub_demux", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, - { MP_CMD_SUB_FILE, "sub_file", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, - { MP_CMD_SUB_LOG, "sub_log", 0, { {-1,{0}} } }, - { MP_CMD_SUB_SCALE, "sub_scale",1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, + { MP_CMD_SEEK, "seek", 1, { {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_EDL_MARK, "edl_mark", 0 }, + { MP_CMD_AUDIO_DELAY, "audio_delay", 1, { {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SPEED_INCR, "speed_incr", 1, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_SPEED_MULT, "speed_mult", 1, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_SPEED_SET, "speed_set", 1, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_QUIT, "quit", 0, { {MP_CMD_ARG_INT} } }, + { MP_CMD_STOP, "stop", 0 }, + { MP_CMD_PAUSE, "pause", 0 }, + { MP_CMD_FRAME_STEP, "frame_step", 0 }, + { MP_CMD_PLAY_TREE_STEP, "pt_step", 1, { { MP_CMD_ARG_INT }, { MP_CMD_ARG_INT } } }, + { MP_CMD_PLAY_TREE_UP_STEP, "pt_up_step", 1, { { MP_CMD_ARG_INT }, { MP_CMD_ARG_INT } } }, + { MP_CMD_PLAY_ALT_SRC_STEP, "alt_src_step", 1, { { MP_CMD_ARG_INT } } }, + { MP_CMD_LOOP, "loop", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SUB_DELAY, "sub_delay", 1, { {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SUB_STEP, "sub_step", 1, { { MP_CMD_ARG_INT }, {MP_CMD_ARG_INT} } }, + { MP_CMD_OSD, "osd", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_OSD_SHOW_TEXT, "osd_show_text", 1, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_INT, {.i = -1}}, {MP_CMD_ARG_INT} } }, + { MP_CMD_OSD_SHOW_PROPERTY_TEXT, "osd_show_property_text",1, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_INT, {.i = -1}}, {MP_CMD_ARG_INT} } }, + { MP_CMD_OSD_SHOW_PROGRESSION, "osd_show_progression", 0 }, + { MP_CMD_VOLUME, "volume", 1, { { MP_CMD_ARG_FLOAT }, {MP_CMD_ARG_INT} } }, + { MP_CMD_BALANCE, "balance", 1, { { MP_CMD_ARG_FLOAT }, {MP_CMD_ARG_INT} } }, + { MP_CMD_MIXER_USEMASTER, "use_master", 0 }, + { MP_CMD_MUTE, "mute", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_CONTRAST, "contrast", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_GAMMA, "gamma", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_BRIGHTNESS, "brightness", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_HUE, "hue", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SATURATION, "saturation", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_FRAMEDROPPING, "frame_drop", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SUB_POS, "sub_pos", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SUB_ALIGNMENT, "sub_alignment", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SUB_VISIBILITY, "sub_visibility", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SUB_LOAD, "sub_load", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_SUB_REMOVE, "sub_remove", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SUB_SELECT, "vobsub_lang", 0, { { MP_CMD_ARG_INT, {.i = -2}} } }, // for compatibility + { MP_CMD_SUB_SELECT, "sub_select", 0, { { MP_CMD_ARG_INT, {.i = -2}} } }, + { MP_CMD_SUB_SOURCE, "sub_source", 0, { { MP_CMD_ARG_INT, {.i = -2}} } }, + { MP_CMD_SUB_VOB, "sub_vob", 0, { { MP_CMD_ARG_INT, {.i = -2}} } }, + { MP_CMD_SUB_DEMUX, "sub_demux", 0, { { MP_CMD_ARG_INT, {.i = -2}} } }, + { MP_CMD_SUB_FILE, "sub_file", 0, { { MP_CMD_ARG_INT, {.i = -2}} } }, + { MP_CMD_SUB_LOG, "sub_log", 0 }, + { MP_CMD_SUB_SCALE, "sub_scale", 1, { {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT} } }, #ifdef CONFIG_ASS - { MP_CMD_ASS_USE_MARGINS, "ass_use_margins", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, + { MP_CMD_ASS_USE_MARGINS, "ass_use_margins", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, #endif - { MP_CMD_GET_PERCENT_POS, "get_percent_pos", 0, { {-1,{0}} } }, - { MP_CMD_GET_TIME_POS, "get_time_pos", 0, { {-1,{0}} } }, - { MP_CMD_GET_TIME_LENGTH, "get_time_length", 0, { {-1,{0}} } }, - { MP_CMD_GET_FILENAME, "get_file_name", 0, { {-1,{0}} } }, - { MP_CMD_GET_VIDEO_CODEC, "get_video_codec", 0, { {-1,{0}} } }, - { MP_CMD_GET_VIDEO_BITRATE, "get_video_bitrate", 0, { {-1,{0}} } }, - { MP_CMD_GET_VIDEO_RESOLUTION, "get_video_resolution", 0, { {-1,{0}} } }, - { MP_CMD_GET_AUDIO_CODEC, "get_audio_codec", 0, { {-1,{0}} } }, - { MP_CMD_GET_AUDIO_BITRATE, "get_audio_bitrate", 0, { {-1,{0}} } }, - { MP_CMD_GET_AUDIO_SAMPLES, "get_audio_samples", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_TITLE, "get_meta_title", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_ARTIST, "get_meta_artist", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_ALBUM, "get_meta_album", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_YEAR, "get_meta_year", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_COMMENT, "get_meta_comment", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_TRACK, "get_meta_track", 0, { {-1,{0}} } }, - { MP_CMD_GET_META_GENRE, "get_meta_genre", 0, { {-1,{0}} } }, - { MP_CMD_SWITCH_AUDIO, "switch_audio", 0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } }, - { MP_CMD_SWITCH_ANGLE, "switch_angle", 0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } }, - { MP_CMD_SWITCH_TITLE, "switch_title", 0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } }, + { MP_CMD_GET_PERCENT_POS, "get_percent_pos", 0 }, + { MP_CMD_GET_TIME_POS, "get_time_pos", 0 }, + { MP_CMD_GET_TIME_LENGTH, "get_time_length", 0 }, + { MP_CMD_GET_FILENAME, "get_file_name", 0 }, + { MP_CMD_GET_VIDEO_CODEC, "get_video_codec", 0 }, + { MP_CMD_GET_VIDEO_BITRATE, "get_video_bitrate", 0 }, + { MP_CMD_GET_VIDEO_RESOLUTION, "get_video_resolution", 0 }, + { MP_CMD_GET_AUDIO_CODEC, "get_audio_codec", 0 }, + { MP_CMD_GET_AUDIO_BITRATE, "get_audio_bitrate", 0 }, + { MP_CMD_GET_AUDIO_SAMPLES, "get_audio_samples", 0 }, + { MP_CMD_GET_META_TITLE, "get_meta_title", 0 }, + { MP_CMD_GET_META_ARTIST, "get_meta_artist", 0 }, + { MP_CMD_GET_META_ALBUM, "get_meta_album", 0 }, + { MP_CMD_GET_META_YEAR, "get_meta_year", 0 }, + { MP_CMD_GET_META_COMMENT, "get_meta_comment", 0 }, + { MP_CMD_GET_META_TRACK, "get_meta_track", 0 }, + { MP_CMD_GET_META_GENRE, "get_meta_genre", 0 }, + { MP_CMD_SWITCH_AUDIO, "switch_audio", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SWITCH_ANGLE, "switch_angle", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SWITCH_TITLE, "switch_title", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, #ifdef CONFIG_TV - { MP_CMD_TV_START_SCAN, "tv_start_scan", 0, { {-1,{0}} }}, - { MP_CMD_TV_STEP_CHANNEL, "tv_step_channel", 1, { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }}, - { MP_CMD_TV_STEP_NORM, "tv_step_norm",0, { {-1,{0}} } }, - { MP_CMD_TV_STEP_CHANNEL_LIST, "tv_step_chanlist", 0, { {-1,{0}} } }, - { MP_CMD_TV_SET_CHANNEL, "tv_set_channel", 1, { { MP_CMD_ARG_STRING, {0}}, {-1,{0}} }}, - { MP_CMD_TV_LAST_CHANNEL, "tv_last_channel", 0, { {-1,{0}} } }, - { MP_CMD_TV_SET_FREQ, "tv_set_freq", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_TV_STEP_FREQ, "tv_step_freq", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_TV_SET_NORM, "tv_set_norm", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } }, - { MP_CMD_TV_SET_BRIGHTNESS, "tv_set_brightness", 1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT,{1} }, {-1,{0}} }}, - { MP_CMD_TV_SET_CONTRAST, "tv_set_contrast", 1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT,{1} }, {-1,{0}} }}, - { MP_CMD_TV_SET_HUE, "tv_set_hue", 1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT,{1} }, {-1,{0}} }}, - { MP_CMD_TV_SET_SATURATION, "tv_set_saturation", 1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT,{1} }, {-1,{0}} }}, + { MP_CMD_TV_START_SCAN, "tv_start_scan", 0 }, + { MP_CMD_TV_STEP_CHANNEL, "tv_step_channel", 1, { {MP_CMD_ARG_INT} } }, + { MP_CMD_TV_STEP_NORM, "tv_step_norm", 0 }, + { MP_CMD_TV_STEP_CHANNEL_LIST, "tv_step_chanlist", 0 }, + { MP_CMD_TV_SET_CHANNEL, "tv_set_channel", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_TV_LAST_CHANNEL, "tv_last_channel", 0 }, + { MP_CMD_TV_SET_FREQ, "tv_set_freq", 1, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_TV_STEP_FREQ, "tv_step_freq", 1, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_TV_SET_NORM, "tv_set_norm", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_TV_SET_BRIGHTNESS, "tv_set_brightness", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT, {.i = 1}} } }, + { MP_CMD_TV_SET_CONTRAST, "tv_set_contrast", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT, {.i = 1}} } }, + { MP_CMD_TV_SET_HUE, "tv_set_hue", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT, {.i = 1}} } }, + { MP_CMD_TV_SET_SATURATION, "tv_set_saturation", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT, {.i = 1}} } }, #endif - { MP_CMD_SUB_FORCED_ONLY, "forced_subs_only", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, + { MP_CMD_SUB_FORCED_ONLY, "forced_subs_only", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, #ifdef CONFIG_DVBIN - { MP_CMD_DVB_SET_CHANNEL, "dvb_set_channel", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}}, + { MP_CMD_DVB_SET_CHANNEL, "dvb_set_channel", 2, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, #endif - { MP_CMD_SWITCH_RATIO, "switch_ratio", 0, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } }, - { MP_CMD_VO_FULLSCREEN, "vo_fullscreen", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_VO_ONTOP, "vo_ontop", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_VO_ROOTWIN, "vo_rootwin", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_VO_BORDER, "vo_border", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, - { MP_CMD_SCREENSHOT, "screenshot", 0, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_PANSCAN, "panscan",1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SWITCH_VSYNC, "switch_vsync", 0, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_LOADFILE, "loadfile", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_LOADLIST, "loadlist", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_RUN, "run", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } }, - { MP_CMD_CAPTURING, "capturing", 0, { {-1,{0}} } }, - { MP_CMD_VF_CHANGE_RECTANGLE, "change_rectangle", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}}, - { MP_CMD_TV_TELETEXT_ADD_DEC, "teletext_add_dec", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } }, - { MP_CMD_TV_TELETEXT_GO_LINK, "teletext_go_link", 1, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, + { MP_CMD_SWITCH_RATIO, "switch_ratio", 0, { {MP_CMD_ARG_FLOAT} } }, + { MP_CMD_VO_FULLSCREEN, "vo_fullscreen", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_VO_ONTOP, "vo_ontop", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_VO_ROOTWIN, "vo_rootwin", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_VO_BORDER, "vo_border", 0, { {MP_CMD_ARG_INT, {.i = -1}} } }, + { MP_CMD_SCREENSHOT, "screenshot", 0, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_PANSCAN, "panscan",1, { {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SWITCH_VSYNC, "switch_vsync", 0, { {MP_CMD_ARG_INT} } }, + { MP_CMD_LOADFILE, "loadfile", 1, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_INT} } }, + { MP_CMD_LOADLIST, "loadlist", 1, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_INT} } }, + { MP_CMD_PLAY_TREE_CLEAR, "pt_clear", 0 }, + { MP_CMD_RUN, "run", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_CAPTURING, "capturing", 0 }, + { MP_CMD_VF_CHANGE_RECTANGLE, "change_rectangle", 2, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_TV_TELETEXT_ADD_DEC, "teletext_add_dec", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_TV_TELETEXT_GO_LINK, "teletext_go_link", 1, { {MP_CMD_ARG_INT} } }, #ifdef CONFIG_DVDNAV - { MP_CMD_DVDNAV, "dvdnav", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, + { MP_CMD_DVDNAV, "dvdnav", 1, { {MP_CMD_ARG_STRING} } }, #endif - { MP_CMD_GET_VO_FULLSCREEN, "get_vo_fullscreen", 0, { {-1,{0}} } }, - { MP_CMD_GET_SUB_VISIBILITY, "get_sub_visibility", 0, { {-1,{0}} } }, - { MP_CMD_KEYDOWN_EVENTS, "key_down_event", 1, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SET_PROPERTY, "set_property", 2, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - { MP_CMD_SET_PROPERTY_OSD, "set_property_osd", 2, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - { MP_CMD_GET_PROPERTY, "get_property", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - { MP_CMD_STEP_PROPERTY, "step_property", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_STEP_PROPERTY_OSD, "step_property_osd", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - - { MP_CMD_SEEK_CHAPTER, "seek_chapter", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - { MP_CMD_SET_MOUSE_POS, "set_mouse_pos", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, - - { MP_CMD_AF_SWITCH, "af_switch", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - { MP_CMD_AF_ADD, "af_add", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - { MP_CMD_AF_DEL, "af_del", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - { MP_CMD_AF_CLR, "af_clr", 0, { {-1,{0}} } }, - { MP_CMD_AF_CMDLINE, "af_cmdline", 2, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } }, - - { 0, NULL, 0, {} } + { MP_CMD_GET_VO_FULLSCREEN, "get_vo_fullscreen", 0 }, + { MP_CMD_GET_SUB_VISIBILITY, "get_sub_visibility", 0 }, + { MP_CMD_KEYDOWN_EVENTS, "key_down_event", 1, { {MP_CMD_ARG_INT} } }, + { MP_CMD_SET_PROPERTY, "set_property", 2, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_STRING} } }, + { MP_CMD_SET_PROPERTY_OSD, "set_property_osd", 2, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_STRING} } }, + { MP_CMD_GET_PROPERTY, "get_property", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_STEP_PROPERTY, "step_property", 1, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_STEP_PROPERTY_OSD, "step_property_osd", 1, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_FLOAT}, {MP_CMD_ARG_INT} } }, + + { MP_CMD_SEEK_CHAPTER, "seek_chapter", 1, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + { MP_CMD_SET_MOUSE_POS, "set_mouse_pos", 2, { {MP_CMD_ARG_INT}, {MP_CMD_ARG_INT} } }, + + { MP_CMD_AF_SWITCH, "af_switch", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_AF_ADD, "af_add", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_AF_DEL, "af_del", 1, { {MP_CMD_ARG_STRING} } }, + { MP_CMD_AF_CLR, "af_clr", 0 }, + { MP_CMD_AF_CMDLINE, "af_cmdline", 2, { {MP_CMD_ARG_STRING}, {MP_CMD_ARG_STRING} } }, + + {0} }; /// The names of the keys as used in input.conf @@ -228,6 +232,7 @@ static const struct key_name key_names[] = { { KEY_PAGE_UP, "PGUP" }, { KEY_PAGE_DOWN, "PGDWN" }, { KEY_ESC, "ESC" }, + { KEY_PRINT, "PRINT" }, { KEY_RIGHT, "RIGHT" }, { KEY_LEFT, "LEFT" }, { KEY_DOWN, "DOWN" }, @@ -571,9 +576,6 @@ struct cmd_bind_section { struct cmd_queue { struct mp_cmd *first; - struct mp_cmd *last; - int num_cmds; - int num_abort_cmds; }; struct input_ctx { @@ -647,6 +649,17 @@ static const m_option_t mp_input_opts[] = { static int default_cmd_func(int fd, char *buf, int l); +// Encode the unicode codepoint as UTF-8, and append to the end of the +// talloc'ed buffer. +static char *append_utf8_buffer(char *buffer, uint32_t codepoint) +{ + char data[8]; + uint8_t tmp; + char *output = data; + PUT_UTF8(codepoint, tmp, *output++ = tmp;); + return talloc_strndup_append_buffer(buffer, data, output - data); +} + static char *get_key_name(int key, char *ret) { for (int i = 0; modifier_names[i].name; i++) { @@ -661,8 +674,9 @@ static char *get_key_name(int key, char *ret) return talloc_asprintf_append_buffer(ret, "%s", key_names[i].name); } - if (isascii(key)) - return talloc_asprintf_append_buffer(ret, "%c", key); + // printable, and valid unicode range + if (key >= 32 && key <= 0x10FFFF) + return append_utf8_buffer(ret, key); // Print the hex key code return talloc_asprintf_append_buffer(ret, "%#-8x", key); @@ -693,32 +707,52 @@ static bool is_abort_cmd(int cmd_id) return false; } +static int queue_count_cmds(struct cmd_queue *queue) +{ + int res = 0; + for (struct mp_cmd *cmd = queue->first; cmd; cmd = cmd->queue_next) + res++; + return res; +} + +static bool queue_has_abort_cmds(struct cmd_queue *queue) +{ + for (struct mp_cmd *cmd = queue->first; cmd; cmd = cmd->queue_next) { + if (is_abort_cmd(cmd->id)) + return true; + } + return false; +} + +static void queue_remove(struct cmd_queue *queue, struct mp_cmd *cmd) +{ + struct mp_cmd **p_prev = &queue->first; + while (*p_prev != cmd) { + p_prev = &(*p_prev)->queue_next; + } + // if this fails, cmd was not in the queue + assert(*p_prev == cmd); + *p_prev = cmd->queue_next; +} + static void queue_pop(struct cmd_queue *queue) { - assert(queue->num_cmds > 0); - struct mp_cmd *cmd = queue->first; - queue->first = cmd->queue_next; - queue->num_cmds--; - queue->num_abort_cmds -= is_abort_cmd(cmd->id); + queue_remove(queue, queue->first); } static void queue_add(struct cmd_queue *queue, struct mp_cmd *cmd, bool at_head) { - if (!queue->num_cmds) { - queue->first = cmd; - queue->last = cmd; - } else if (at_head) { - queue->first->queue_prev = cmd; + if (at_head) { cmd->queue_next = queue->first; queue->first = cmd; } else { - queue->last->queue_next = cmd; - cmd->queue_prev = queue->last; - queue->last = cmd; + struct mp_cmd **p_prev = &queue->first; + while (*p_prev) + p_prev = &(*p_prev)->queue_next; + *p_prev = cmd; + cmd->queue_next = NULL; } - queue->num_cmds++; - queue->num_abort_cmds += is_abort_cmd(cmd->id); } int mp_input_add_cmd_fd(struct input_ctx *ictx, int fd, int select, @@ -945,7 +979,7 @@ mp_cmd_t *mp_input_parse_cmd(char *str) *argptr = 0; break; } - case -1: + case 0: ptr = NULL; break; default: @@ -961,7 +995,7 @@ mp_cmd_t *mp_input_parse_cmd(char *str) goto error; } - for (; i < MP_CMD_MAX_ARGS && cmd_def->args[i].type != -1; i++) { + for (; i < MP_CMD_MAX_ARGS && cmd_def->args[i].type; i++) { memcpy(&cmd->args[i], &cmd_def->args[i], sizeof(struct mp_cmd_arg)); if (cmd_def->args[i].type == MP_CMD_ARG_STRING && cmd_def->args[i].v.s != NULL) @@ -969,7 +1003,7 @@ mp_cmd_t *mp_input_parse_cmd(char *str) } if (i < MP_CMD_MAX_ARGS) - cmd->args[i].type = -1; + cmd->args[i].type = 0; return cmd; @@ -1171,7 +1205,7 @@ static mp_cmd_t *interpret_key(struct input_ctx *ictx, int code) * shift modifier is still kept for special keys like arrow keys. */ int unmod = code & ~KEY_MODIFIER_MASK; - if (unmod < 256 && unmod != KEY_ENTER && unmod != KEY_TAB) + if (unmod >= 32 && unmod < MP_KEY_BASE) code &= ~KEY_MODIFIER_SHIFT; if (code & MP_KEY_DOWN) { @@ -1279,8 +1313,8 @@ void mp_input_feed_key(struct input_ctx *ictx, int code) if (!cmd) return; struct cmd_queue *queue = &ictx->key_cmd_queue; - if (queue->num_cmds >= ictx->key_fifo_size && - (!is_abort_cmd(cmd->id) || queue->num_abort_cmds)) + if (queue_count_cmds(queue) >= ictx->key_fifo_size && + (!is_abort_cmd(cmd->id) || queue_has_abort_cmds(queue))) return; queue_add(queue, cmd, false); } @@ -1431,14 +1465,14 @@ mp_cmd_t *mp_input_get_cmd(struct input_ctx *ictx, int time, int peek_only) if (async_quit_request) return mp_input_parse_cmd("quit 1"); - if (ictx->control_cmd_queue.num_cmds || ictx->key_cmd_queue.num_cmds) + if (ictx->control_cmd_queue.first || ictx->key_cmd_queue.first) time = 0; read_all_events(ictx, time); struct mp_cmd *ret; struct cmd_queue *queue = &ictx->control_cmd_queue; - if (!queue->num_cmds) + if (!queue->first) queue = &ictx->key_cmd_queue; - if (!queue->num_cmds) { + if (!queue->first) { ret = check_autorepeat(ictx); if (!ret) return NULL; @@ -1464,7 +1498,7 @@ mp_cmd_t *mp_cmd_clone(mp_cmd_t *cmd) ret = talloc_memdup(NULL, cmd, sizeof(mp_cmd_t)); ret->name = talloc_strdup(ret, cmd->name); - for (i = 0; i < MP_CMD_MAX_ARGS && cmd->args[i].type != -1; i++) { + for (i = 0; i < MP_CMD_MAX_ARGS && cmd->args[i].type; i++) { if (cmd->args[i].type == MP_CMD_ARG_STRING && cmd->args[i].v.s != NULL) ret->args[i].v.s = talloc_strdup(ret, cmd->args[i].v.s); } @@ -1489,10 +1523,15 @@ int mp_input_get_key_from_name(const char *name) found: name = p + 1; } - int len = strlen(name); - if (len == 1) // Direct key code - return (unsigned char)name[0] + modifiers; - else if (len > 2 && strncasecmp("0x", name, 2) == 0) + + struct bstr bname = bstr(name); + + struct bstr rest; + int code = bstr_decode_utf8(bname, &rest); + if (code >= 0 && rest.len == 0) + return code + modifiers; + + if (bstr_startswith0(bname, "0x")) return strtol(name, NULL, 16) + modifiers; for (int i = 0; key_names[i].name != NULL; i++) { @@ -1834,7 +1873,7 @@ static int print_cmd_list(m_option_t *cfg) for (i = 0; (cmd = &mp_cmds[i])->name != NULL; i++) { printf("%-20.20s", cmd->name); - for (j = 0; j < MP_CMD_MAX_ARGS && cmd->args[j].type != -1; j++) { + for (j = 0; j < MP_CMD_MAX_ARGS && cmd->args[j].type; j++) { switch (cmd->args[j].type) { case MP_CMD_ARG_INT: type = "Integer"; @@ -1864,8 +1903,8 @@ static int print_cmd_list(m_option_t *cfg) int mp_input_check_interrupt(struct input_ctx *ictx, int time) { for (int i = 0; ; i++) { - if (async_quit_request || ictx->key_cmd_queue.num_abort_cmds || - ictx->control_cmd_queue.num_abort_cmds) { + if (async_quit_request || queue_has_abort_cmds(&ictx->key_cmd_queue) || + queue_has_abort_cmds(&ictx->control_cmd_queue)) { mp_tmsg(MSGT_INPUT, MSGL_WARN, "Received command to move to " "another file. Aborting current processing.\n"); return true; diff --git a/input/input.h b/input/input.h index 4058ce3d99..084e2dd3e7 100644 --- a/input/input.h +++ b/input/input.h @@ -50,6 +50,7 @@ enum mp_command_type { MP_CMD_MUTE, MP_CMD_LOADFILE, MP_CMD_LOADLIST, + MP_CMD_PLAY_TREE_CLEAR, MP_CMD_VF_CHANGE_RECTANGLE, MP_CMD_GAMMA, MP_CMD_SUB_VISIBILITY, @@ -153,10 +154,10 @@ enum mp_command_type { }; // The arg types -#define MP_CMD_ARG_INT 0 -#define MP_CMD_ARG_FLOAT 1 -#define MP_CMD_ARG_STRING 2 -#define MP_CMD_ARG_VOID 3 +#define MP_CMD_ARG_VOID 0 +#define MP_CMD_ARG_INT 1 +#define MP_CMD_ARG_FLOAT 2 +#define MP_CMD_ARG_STRING 3 #ifndef MP_CMD_MAX_ARGS #define MP_CMD_MAX_ARGS 10 @@ -184,7 +185,6 @@ struct mp_cmd_arg { int i; float f; char *s; - void *v; } v; }; @@ -194,7 +194,6 @@ typedef struct mp_cmd { int nargs; struct mp_cmd_arg args[MP_CMD_MAX_ARGS]; int pausing; - struct mp_cmd *queue_prev; struct mp_cmd *queue_next; } mp_cmd_t; diff --git a/input/keycodes.h b/input/keycodes.h index 45e7ec7d4b..84b41a3e89 100644 --- a/input/keycodes.h +++ b/input/keycodes.h @@ -21,19 +21,16 @@ #ifndef MPLAYER_KEYCODES_H #define MPLAYER_KEYCODES_H +#define MP_KEY_BASE (1<<21) + // For appleir.c which includes another header with KEY_ENTER etc defines #ifndef AR_DEFINES_ONLY #define KEY_ENTER 13 #define KEY_TAB 9 -#define KEY_BASE 0x100 - -/* Function keys */ -#define KEY_F (KEY_BASE+64) - /* Control keys */ -#define KEY_CTRL (KEY_BASE) +#define KEY_CTRL (MP_KEY_BASE) #define KEY_BACKSPACE (KEY_CTRL+0) #define KEY_DELETE (KEY_CTRL+1) #define KEY_INSERT (KEY_CTRL+2) @@ -42,6 +39,7 @@ #define KEY_PAGE_UP (KEY_CTRL+5) #define KEY_PAGE_DOWN (KEY_CTRL+6) #define KEY_ESC (KEY_CTRL+7) +#define KEY_PRINT (KEY_CTRL+8) /* Control keys short name */ #define KEY_BS KEY_BACKSPACE @@ -52,14 +50,14 @@ #define KEY_PGDWN KEY_PAGE_DOWN /* Cursor movement */ -#define KEY_CRSR (KEY_BASE+16) +#define KEY_CRSR (MP_KEY_BASE+0x10) #define KEY_RIGHT (KEY_CRSR+0) #define KEY_LEFT (KEY_CRSR+1) #define KEY_DOWN (KEY_CRSR+2) #define KEY_UP (KEY_CRSR+3) /* Multimedia keyboard/remote keys */ -#define KEY_MM_BASE (0x100+384) +#define KEY_MM_BASE (MP_KEY_BASE+0x20) #define KEY_POWER (KEY_MM_BASE+0) #define KEY_MENU (KEY_MM_BASE+1) #define KEY_PLAY (KEY_MM_BASE+2) @@ -74,8 +72,11 @@ #define KEY_VOLUME_DOWN (KEY_MM_BASE+11) #define KEY_MUTE (KEY_MM_BASE+12) +/* Function keys */ +#define KEY_F (MP_KEY_BASE+0x40) + /* Keypad keys */ -#define KEY_KEYPAD (KEY_BASE+32) +#define KEY_KEYPAD (MP_KEY_BASE+0x60) #define KEY_KP0 (KEY_KEYPAD+0) #define KEY_KP1 (KEY_KEYPAD+1) #define KEY_KP2 (KEY_KEYPAD+2) @@ -93,7 +94,7 @@ // Joystick input module -#define JOY_BASE (0x100+128) +#define JOY_BASE (MP_KEY_BASE+0x70) #define JOY_AXIS0_PLUS (JOY_BASE+0) #define JOY_AXIS0_MINUS (JOY_BASE+1) #define JOY_AXIS1_PLUS (JOY_BASE+2) @@ -115,7 +116,7 @@ #define JOY_AXIS9_PLUS (JOY_BASE+18) #define JOY_AXIS9_MINUS (JOY_BASE+19) -#define JOY_BTN_BASE ((0x100+148)|MP_NO_REPEAT_KEY) +#define JOY_BTN_BASE ((MP_KEY_BASE+0x90)|MP_NO_REPEAT_KEY) #define JOY_BTN0 (JOY_BTN_BASE+0) #define JOY_BTN1 (JOY_BTN_BASE+1) #define JOY_BTN2 (JOY_BTN_BASE+2) @@ -129,7 +130,7 @@ // Mouse events from VOs -#define MOUSE_BASE ((0x100+256)|MP_NO_REPEAT_KEY) +#define MOUSE_BASE ((MP_KEY_BASE+0xA0)|MP_NO_REPEAT_KEY) #define MOUSE_BTN0 (MOUSE_BASE+0) #define MOUSE_BTN1 (MOUSE_BASE+1) #define MOUSE_BTN2 (MOUSE_BASE+2) @@ -152,7 +153,7 @@ #define MOUSE_BTN19 (MOUSE_BASE+19) #define MOUSE_BTN_END (MOUSE_BASE+20) -#define MOUSE_BASE_DBL (0x300|MP_NO_REPEAT_KEY) +#define MOUSE_BASE_DBL ((MP_KEY_BASE+0xC0)|MP_NO_REPEAT_KEY) #define MOUSE_BTN0_DBL (MOUSE_BASE_DBL+0) #define MOUSE_BTN1_DBL (MOUSE_BASE_DBL+1) #define MOUSE_BTN2_DBL (MOUSE_BASE_DBL+2) @@ -179,7 +180,7 @@ #endif // AR_DEFINES_ONLY // Apple Remote input module -#define AR_BASE 0x500 +#define AR_BASE (MP_KEY_BASE+0xE0) #define AR_PLAY (AR_BASE + 0) #define AR_PLAY_HOLD (AR_BASE + 1) #define AR_NEXT (AR_BASE + 2) @@ -195,14 +196,14 @@ /* Special keys */ -#define KEY_INTERN (0x1000) +#define KEY_INTERN (MP_KEY_BASE+0x1000) #define KEY_CLOSE_WIN (KEY_INTERN+0) /* Modifiers added to individual keys */ -#define KEY_MODIFIER_SHIFT 0x2000 -#define KEY_MODIFIER_CTRL 0x4000 -#define KEY_MODIFIER_ALT 0x8000 -#define KEY_MODIFIER_META 0x10000 +#define KEY_MODIFIER_SHIFT (1<<22) +#define KEY_MODIFIER_CTRL (1<<23) +#define KEY_MODIFIER_ALT (1<<24) +#define KEY_MODIFIER_META (1<<25) #endif // AR_DEFINES_ONLY |