summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-09-22 06:15:36 +0200
committerwm4 <wm4@nowhere>2012-10-12 10:10:31 +0200
commit45b432f4c32be5cab798a0658d9461b3a40a6d94 (patch)
tree3a460173adb5e79a648f1b04fb39d73ba4d6a721
parent9939776e5ee70818d9cc4a5a7cd9f09da4239164 (diff)
downloadmpv-45b432f4c32be5cab798a0658d9461b3a40a6d94.tar.bz2
mpv-45b432f4c32be5cab798a0658d9461b3a40a6d94.tar.xz
commands: replace "switch" with "add" and "cycle"
Now it depends on the command whether a property wraps around, or stops at min/max valid property value. For practically all properties, it's quite unambiguous what the "switch" command should have done, and there's technically no need to replace it with these new commands. More over, most properties that cycle are boolean anyway. But it seems more orthogonal to make the difference explicit, rather than hardcoding it. Having different commands also makes it more explicit to the user what these commands do, both just due to the naming, and what wrapping policy is used. The code is simpler too.
-rw-r--r--command.c33
-rw-r--r--etc/input.conf128
-rw-r--r--input/input.c71
-rw-r--r--input/input.h3
-rw-r--r--m_property.c8
-rw-r--r--m_property.h20
6 files changed, 135 insertions, 128 deletions
diff --git a/command.c b/command.c
index e18389b878..53c8326e39 100644
--- a/command.c
+++ b/command.c
@@ -404,9 +404,6 @@ static int mp_property_edition(m_option_t *prop, int action, void *arg,
*(struct m_option *)arg = opt;
return M_PROPERTY_OK;
}
- case M_PROPERTY_GET_WRAP:
- *(bool *)arg = true;
- return M_PROPERTY_OK;
}
return M_PROPERTY_NOT_IMPLEMENTED;
}
@@ -480,9 +477,6 @@ static int mp_property_angle(m_option_t *prop, int action, void *arg,
resync_audio_stream(sh_audio);
}
return M_PROPERTY_OK;
- case M_PROPERTY_GET_WRAP:
- *(bool *)arg = true;
- return M_PROPERTY_OK;
}
return M_PROPERTY_NOT_IMPLEMENTED;
}
@@ -508,7 +502,7 @@ static int mp_property_metadata(m_option_t *prop, int action, void *arg,
return M_PROPERTY_OK;
}
case M_PROPERTY_KEY_ACTION: {
- struct m_property_action *ka = arg;
+ struct m_property_action_arg *ka = arg;
char *meta = demux_info_get(demuxer, ka->key);
if (!meta)
return M_PROPERTY_UNKNOWN;
@@ -561,13 +555,15 @@ static int mp_property_volume(m_option_t *prop, int action, void *arg,
case M_PROPERTY_SET:
mixer_setvolume(&mpctx->mixer, *(float *) arg, *(float *) arg);
return M_PROPERTY_OK;
- case M_PROPERTY_SWITCH:
- if (*(double *) arg <= 0)
+ case M_PROPERTY_SWITCH: {
+ struct m_property_switch_arg *sarg = arg;
+ if (sarg->inc <= 0)
mixer_decvolume(&mpctx->mixer);
else
mixer_incvolume(&mpctx->mixer);
return M_PROPERTY_OK;
}
+ }
return M_PROPERTY_NOT_IMPLEMENTED;
}
@@ -775,10 +771,12 @@ static int property_switch_track(m_option_t *prop, int action, void *arg,
}
return M_PROPERTY_OK;
- case M_PROPERTY_SWITCH:
+ case M_PROPERTY_SWITCH: {
+ struct m_property_switch_arg *sarg = arg;
mp_switch_track(mpctx, type,
- track_next(mpctx, type, *(double *)arg >= 0 ? +1 : -1, track));
+ track_next(mpctx, type, sarg->inc >= 0 ? +1 : -1, track));
return M_PROPERTY_OK;
+ }
case M_PROPERTY_SET:
mp_switch_track(mpctx, type, mp_track_by_tid(mpctx, type, *(int *)arg));
return M_PROPERTY_OK;
@@ -1793,11 +1791,16 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
break;
}
- case MP_CMD_SWITCH: {
+ case MP_CMD_ADD:
+ case MP_CMD_CYCLE:
+ {
cmd->args[0].v.s = translate_legacy_property(cmd, cmd->args[0].v.s);
- double s = 1;
+ struct m_property_switch_arg s = {
+ .inc = 1,
+ .wrap = cmd->id == MP_CMD_CYCLE,
+ };
if (cmd->args[1].v.f)
- s = cmd->args[1].v.f;
+ s.inc = cmd->args[1].v.f;
int r = mp_property_do(cmd->args[0].v.s, M_PROPERTY_SWITCH, &s, mpctx);
if (r == M_PROPERTY_UNKNOWN)
mp_msg(MSGT_CPLAYER, MSGL_WARN,
@@ -1805,7 +1808,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
else if (r <= 0)
mp_msg(MSGT_CPLAYER, MSGL_WARN,
"Failed to increment property '%s' by %g.\n",
- cmd->args[0].v.s, s);
+ cmd->args[0].v.s, s.inc);
else if (cmd->on_osd)
show_property_osd(mpctx, cmd->args[0].v.s);
break;
diff --git a/etc/input.conf b/etc/input.conf
index 2fd24080a6..a32495ab3a 100644
--- a/etc/input.conf
+++ b/etc/input.conf
@@ -26,12 +26,12 @@
# key combinations is only supported through the video windows of certain
# output drivers (not in output windows of other drivers or in a terminal).
-MOUSE_BTN0_DBL switch fullscreen # toggle fullscreen on/off
-MOUSE_BTN2 switch pause # toggle pause on/off
+MOUSE_BTN0_DBL cycle fullscreen # toggle fullscreen on/off
+MOUSE_BTN2 cycle pause # toggle pause on/off
MOUSE_BTN3 seek 10
MOUSE_BTN4 seek -10
-MOUSE_BTN5 switch volume 1
-MOUSE_BTN6 switch volume -1
+MOUSE_BTN5 add volume 1
+MOUSE_BTN6 add volume -1
# Seek units are in seconds, but note that these are limited by keyframes
RIGHT seek 10
@@ -45,8 +45,8 @@ Shift+UP seek 5 0 1
Shift+DOWN seek -5 0 1
PGUP seek 600
PGDWN seek -600
-+ switch audio-delay 0.100 # this changes audio/video sync
-- switch audio-delay -0.100
++ add audio-delay 0.100 # this changes audio/video sync
+- add audio-delay -0.100
[ speed_mult 0.9091 # scale playback speed
] speed_mult 1.1
{ speed_mult 0.5
@@ -55,78 +55,78 @@ BS set speed 1.0 # reset speed to normal
q quit
q {encode} quit
ESC quit
-p switch pause # toggle pause/playback mode
+p cycle pause # toggle pause/playback mode
. frame_step # advance one frame and pause
-SPACE switch pause
+SPACE cycle pause
> playlist_next # skip to next file
ENTER playlist_next 1 # skip to next file or quit
< playlist_prev # skip to previous file
o osd # cycle through OSD mode
I show_text "${filename}" # display filename in osd
P show_progress
-z switch sub-delay -0.1 # subtract 100 ms delay from subs
-x switch sub-delay +0.1 # add
+z add sub-delay -0.1 # subtract 100 ms delay from subs
+x add sub-delay +0.1 # add
g sub_step -1 # immediately display next subtitle
y sub_step +1 # previous
-9 switch volume -1
-/ switch volume -1
-0 switch volume 1
-* switch volume 1
-( switch balance -0.1 # adjust audio balance in favor of left
-) switch balance 0.1 # right
-m switch mute
-1 switch contrast -1
-2 switch contrast 1
-3 switch brightness -1
-4 switch brightness 1
-5 switch hue -1
-6 switch hue 1
-7 switch saturation -1
-8 switch saturation 1
-d switch framedrop # cycle through framedrop modes
+9 add volume -1
+/ add volume -1
+0 add volume 1
+* add volume 1
+( add balance -0.1 # adjust audio balance in favor of left
+) add balance 0.1 # right
+m cycle mute
+1 add contrast -1
+2 add contrast 1
+3 add brightness -1
+4 add brightness 1
+5 add hue -1
+6 add hue 1
+7 add saturation -1
+8 add saturation 1
+d cycle framedrop # cycle through framedrop modes
# toggle deinterlacer; requires either vdpau output, -vf yadif or kerndeint
-D switch deinterlace
-c switch colormatrix
+D cycle deinterlace
+c cycle colormatrix
# Next 3 currently only work with --no-ass
-r switch sub-pos -1 # move subtitles up
-t switch sub-pos +1 # down
-v switch sub-visibility
+r add sub-pos -1 # move subtitles up
+t add sub-pos +1 # down
+v cycle sub-visibility
# stretch SSA/ASS subtitles with anamorphic videos to match historical
-V switch ass-vsfilter-aspect-compat
-j switch sub # cycle through subtitles
-J switch sub -1 # ...backwards
-F switch sub-forced-only
-SHARP switch audio # switch audio streams
-_ switch video
-TAB switch program
+V cycle ass-vsfilter-aspect-compat
+j cycle sub # cycle through subtitles
+J cycle sub -1 # ...backwards
+F cycle sub-forced-only
+SHARP cycle audio # switch audio streams
+_ cycle video
+TAB cycle program
i edl_mark # for use with --edlout mode
-T switch ontop # toggle video window ontop of other windows
-f switch fullscreen # toggle fullscreen
+T cycle ontop # toggle video window ontop of other windows
+f cycle fullscreen # toggle fullscreen
s screenshot 0 # take a png screenshot
S screenshot 1 # ...on every frame
Alt+s screenshot 0 1 # take a screenshot of window contents
Alt+S screenshot 1 1 # ...on every frame
-w switch panscan -0.1 # zoom out with -panscan 0 -fs
-e switch panscan +0.1 # in
+w add panscan -0.1 # zoom out with -panscan 0 -fs
+e add panscan +0.1 # in
POWER quit
-MENU switch osd
-PLAY switch pause
-PAUSE switch pause
-PLAYPAUSE switch pause
+MENU cycle osd
+PLAY cycle pause
+PAUSE cycle pause
+PLAYPAUSE cycle pause
STOP quit
FORWARD seek 60
REWIND seek -60
NEXT playlist_next
PREV playlist_prev
-VOLUME_UP switch volume 1
-VOLUME_DOWN switch volume -1
-MUTE switch mute
+VOLUME_UP add volume 1
+VOLUME_DOWN add volume -1
+MUTE cycle mute
CLOSE_WIN quit
CLOSE_WIN {encode} quit
-! switch chapter -1 # skip to previous chapter
-@ switch chapter 1 # next
-E switch edition # next edition
-A switch angle 1
+! add chapter -1 # skip to previous chapter
+@ add chapter 1 # next
+E cycle edition # next edition
+A cycle angle
U stop
# TV
@@ -139,16 +139,16 @@ u tv_step_chanlist
# Apple Remote section
#
-AR_PLAY switch pause
+AR_PLAY cycle pause
AR_PLAY_HOLD quit
AR_NEXT seek 30
AR_NEXT_HOLD seek 120
AR_PREV seek -10
AR_PREV_HOLD seek -120
-AR_MENU switch osd
-AR_MENU_HOLD switch mute
-AR_VUP switch volume 1
-AR_VDOWN switch volume -1
+AR_MENU cycle osd
+AR_MENU_HOLD cycle mute
+AR_VUP add volume 1
+AR_VDOWN add volume -1
#
# Joystick section
@@ -160,15 +160,15 @@ JOY_AXIS0_PLUS seek 10
JOY_AXIS0_MINUS seek -10
JOY_AXIS1_MINUS seek 60
JOY_AXIS1_PLUS seek -60
-JOY_BTN0 switch pause
-JOY_BTN1 switch osd
-JOY_BTN2 switch volume 1
-JOY_BTN3 switch volume -1
+JOY_BTN0 cycle pause
+JOY_BTN1 cycle osd
+JOY_BTN2 add volume 1
+JOY_BTN3 add volume -1
#
# Not assigned by default
# (not an exhaustive list of unbound commands)
#
-#? switch sub-scale +0.1 # increase subtitle font size
-#? switch sub-scale -0.1 # decrease subtitle font size
+#? add sub-scale +0.1 # increase subtitle font size
+#? add sub-scale -0.1 # decrease subtitle font size
diff --git a/input/input.c b/input/input.c
index d3ad18075d..6c3e0d709f 100644
--- a/input/input.c
+++ b/input/input.c
@@ -135,7 +135,8 @@ static const mp_cmd_t mp_cmds[] = {
{ MP_CMD_KEYDOWN_EVENTS, "key_down_event", { ARG_INT } },
{ MP_CMD_SET, "set", { ARG_STRING, ARG_STRING } },
{ MP_CMD_GET_PROPERTY, "get_property", { ARG_STRING } },
- { MP_CMD_SWITCH, "switch", { ARG_STRING, OARG_FLOAT(0) } },
+ { MP_CMD_ADD, "add", { ARG_STRING, OARG_FLOAT(0) } },
+ { MP_CMD_CYCLE, "cycle", { ARG_STRING, OARG_FLOAT(0) } },
{ MP_CMD_SET_MOUSE_POS, "set_mouse_pos", { ARG_INT, ARG_INT } },
@@ -158,40 +159,40 @@ struct legacy_cmd {
const char *old, *new;
};
static const struct legacy_cmd legacy_cmds[] = {
- {"loop", "switch loop"},
- {"seek_chapter", "switch chapter"},
- {"switch_angle", "switch angle"},
- {"pause", "switch pause"},
- {"volume", "switch volume"},
- {"mute", "switch mute"},
- {"audio_delay", "switch audio-delay"},
- {"switch_audio", "switch audio"},
- {"balance", "switch balance"},
- {"vo_fullscreen", "no-osd switch fullscreen"},
- {"panscan", "switch panscan"},
- {"vo_ontop", "switch ontop"},
- {"vo_rootwin", "switch rootwin"},
- {"vo_border", "switch border"},
- {"frame_drop", "switch framedrop"},
- {"gamma", "switch gamma"},
- {"brightness", "switch brightness"},
- {"contrast", "switch contrast"},
- {"saturation", "switch saturation"},
- {"hue", "switch hue"},
- {"switch_vsync", "switch vsync"},
- {"sub_select", "switch sub"},
- {"sub_pos", "switch sub-pos"},
- {"sub_delay", "switch sub-delay"},
- {"sub_visibility", "switch sub-visibility"},
- {"forced_subs_only", "switch sub-forced-only"},
- {"sub_scale", "switch sub-scale"},
- {"ass_use_margins", "switch ass-use-margins"},
- {"tv_set_brightness", "switch tv-brightness"},
- {"tv_set_hue", "switch tv-hue"},
- {"tv_set_saturation", "switch tv-saturation"},
- {"tv_set_contrast", "switch tv-contrast"},
- {"step_property_osd", "switch"},
- {"step_property", "no-osd switch"},
+ {"loop", "cycle loop"},
+ {"seek_chapter", "add chapter"},
+ {"switch_angle", "cycle angle"},
+ {"pause", "cycle pause"},
+ {"volume", "add volume"},
+ {"mute", "cycle mute"},
+ {"audio_delay", "add audio-delay"},
+ {"switch_audio", "cycle audio"},
+ {"balance", "add balance"},
+ {"vo_fullscreen", "no-osd cycle fullscreen"},
+ {"panscan", "add panscan"},
+ {"vo_ontop", "cycle ontop"},
+ {"vo_rootwin", "cycle rootwin"},
+ {"vo_border", "cycle border"},
+ {"frame_drop", "cycle framedrop"},
+ {"gamma", "add gamma"},
+ {"brightness", "add brightness"},
+ {"contrast", "add contrast"},
+ {"saturation", "add saturation"},
+ {"hue", "add hue"},
+ {"switch_vsync", "cycle vsync"},
+ {"sub_select", "cycle sub"},
+ {"sub_pos", "add sub-pos"},
+ {"sub_delay", "add sub-delay"},
+ {"sub_visibility", "cycle sub-visibility"},
+ {"forced_subs_only", "cycle sub-forced-only"},
+ {"sub_scale", "add sub-scale"},
+ {"ass_use_margins", "cycle ass-use-margins"},
+ {"tv_set_brightness", "add tv-brightness"},
+ {"tv_set_hue", "add tv-hue"},
+ {"tv_set_saturation", "add tv-saturation"},
+ {"tv_set_contrast", "add tv-contrast"},
+ {"step_property_osd", "cycle"},
+ {"step_property", "no-osd cycle"},
{"set_property", "no-osd set"},
{"set_property_osd", "set"},
{"speed_set", "set speed"},
diff --git a/input/input.h b/input/input.h
index 158d71b8ac..d3abc6f4c8 100644
--- a/input/input.h
+++ b/input/input.h
@@ -54,7 +54,8 @@ enum mp_command_type {
MP_CMD_RADIO_SET_CHANNEL,
MP_CMD_RADIO_SET_FREQ,
MP_CMD_SET_MOUSE_POS,
- MP_CMD_SWITCH,
+ MP_CMD_ADD,
+ MP_CMD_CYCLE,
MP_CMD_RADIO_STEP_FREQ,
MP_CMD_TV_STEP_FREQ,
MP_CMD_TV_START_SCAN,
diff --git a/m_property.c b/m_property.c
index 4952c3a29c..dc856966f3 100644
--- a/m_property.c
+++ b/m_property.c
@@ -44,7 +44,7 @@ static int do_action(const m_option_t *prop_list, const char *name,
memcpy(base, name, len);
base[len] = 0;
prop = m_option_list_find(prop_list, base);
- struct m_property_action ka = {
+ struct m_property_action_arg ka = {
.key = sep + 1,
.action = action,
.arg = arg,
@@ -105,6 +105,7 @@ int m_property_do(const m_option_t *prop_list, const char *name,
return r;
}
case M_PROPERTY_SWITCH: {
+ struct m_property_switch_arg *sarg = arg;
if ((r = do_action(prop_list, name, M_PROPERTY_SWITCH, arg, ctx)) !=
M_PROPERTY_NOT_IMPLEMENTED)
return r;
@@ -113,10 +114,7 @@ int m_property_do(const m_option_t *prop_list, const char *name,
return M_PROPERTY_NOT_IMPLEMENTED;
if ((r = do_action(prop_list, name, M_PROPERTY_GET, &val, ctx)) <= 0)
return r;
- bool wrap = opt.type == &m_option_type_choice ||
- opt.type == &m_option_type_flag;
- do_action(prop_list, name, M_PROPERTY_GET_WRAP, &wrap, ctx);
- opt.type->add(&opt, &val, *(double*)arg, wrap);
+ opt.type->add(&opt, &val, sarg->inc, sarg->wrap);
r = do_action(prop_list, name, M_PROPERTY_SET, &val, ctx);
m_option_free(&opt, &val);
return r;
diff --git a/m_property.h b/m_property.h
index 33bd7f3f7c..249a22e969 100644
--- a/m_property.h
+++ b/m_property.h
@@ -19,7 +19,9 @@
#ifndef MPLAYER_M_PROPERTY_H
#define MPLAYER_M_PROPERTY_H
-#include "m_option.h"
+#include <stdbool.h>
+
+struct m_option;
enum mp_property_action {
// Get the property type. This defines the fundamental data type read from
@@ -47,7 +49,7 @@ enum mp_property_action {
// Switch the property up/down by a given value.
// If unimplemented, the property wrapper uses the property type as
// fallback.
- // arg: double* (value to add to the property)
+ // arg: struct m_property_switch_arg*
M_PROPERTY_SWITCH,
// Set a new value from a string. The property wrapper parses this using the
@@ -62,16 +64,18 @@ enum mp_property_action {
M_PROPERTY_TO_STRING,
// Pass down an action to a sub-property.
- // arg: struct m_property_action*
+ // arg: struct m_property_action_arg*
M_PROPERTY_KEY_ACTION,
+};
- // Get wrap method.
- // arg: bool* (true: wrap/cycle, false: clamp)
- M_PROPERTY_GET_WRAP,
+// Argument for M_PROPERTY_SWITCH
+struct m_property_switch_arg {
+ double inc; // value to add to property, or cycle direction
+ bool wrap; // whether value should wrap around on over/underflow
};
// Argument for M_PROPERTY_KEY_ACTION
-struct m_property_action {
+struct m_property_action_arg {
const char* key;
int action;
void* arg;
@@ -103,7 +107,7 @@ int m_property_do(const struct m_option* prop_list, const char* property_name,
int action, void* arg, void *ctx);
// Print a list of properties.
-void m_properties_print_help_list(const m_option_t* list);
+void m_properties_print_help_list(const struct m_option* list);
// Expand a property string.
/* This function allows to print strings containing property values.