mirror of https://github.com/mpv-player/mpv
commands: don't use dummy option declaration for properties
The property-to-option bridge (when properties change values normally set by the command line parser) uses M_PROPERTY_GET_TYPE to get the exact option type. In these cases, the entry in mp_properties[] is unused, except for the name field and the property callback. Instead, mp_property_generic_option() implements M_PROPERTY_GET_TYPE and returns the m_option as defined in cfg-mplayer.h. However, if a property is unavailable, mp_property_generic_option() is never actually called, and M_PROPERTY_GET_TYPE will return the dummy option entry. We could make sure that the dummy option entry equals the option entry defined in cfg-mplayer.h. But this would duplicate all information. Add a dummy option type m_option_type_dummy, which is used by entries using the property-to-option bridge. Make M_PROPERTY_GET_TYPE fail if this type is encountered. This dummy should never be used, as it isn
This commit is contained in:
parent
46e8d33809
commit
8fc2aef3b7
|
@ -1329,14 +1329,14 @@ static int mp_property_tv_color(m_option_t *prop, int action, void *arg,
|
|||
|
||||
// Use option-to-property-bridge. (The property and option have the same names.)
|
||||
#define M_OPTION_PROPERTY(name) \
|
||||
{(name), mp_property_generic_option, &m_option_type_choice, 0, 0, 0, (name)}
|
||||
{(name), mp_property_generic_option, &m_option_type_dummy, 0, 0, 0, (name)}
|
||||
|
||||
// OPTION_PROPERTY(), but with a custom property handler. The custom handler
|
||||
// must let unknown operations fall back to mp_property_generic_option().
|
||||
#define M_OPTION_PROPERTY_CUSTOM(name, handler) \
|
||||
{(name), (handler), &m_option_type_choice, 0, 0, 0, (name)}
|
||||
{(name), (handler), &m_option_type_dummy, 0, 0, 0, (name)}
|
||||
#define M_OPTION_PROPERTY_CUSTOM_(name, handler, ...) \
|
||||
{(name), (handler), &m_option_type_choice, 0, 0, 0, (name), __VA_ARGS__}
|
||||
{(name), (handler), &m_option_type_dummy, 0, 0, 0, (name), __VA_ARGS__}
|
||||
|
||||
/// All properties available in MPlayer.
|
||||
/** \ingroup Properties
|
||||
|
|
|
@ -35,6 +35,10 @@
|
|||
#include "mp_msg.h"
|
||||
#include "mpcommon.h"
|
||||
|
||||
const struct m_option_type m_option_type_dummy = {
|
||||
.name = "Unknown",
|
||||
};
|
||||
|
||||
static int do_action(const m_option_t *prop_list, const char *name,
|
||||
int action, void *arg, void *ctx)
|
||||
{
|
||||
|
@ -59,7 +63,9 @@ static int do_action(const m_option_t *prop_list, const char *name,
|
|||
return M_PROPERTY_UNKNOWN;
|
||||
int (*control)(const m_option_t*, int, void*, void*) = prop->p;
|
||||
int r = control(prop, action, arg, ctx);
|
||||
if (action == M_PROPERTY_GET_TYPE && r < 0) {
|
||||
if (action == M_PROPERTY_GET_TYPE && r < 0 &&
|
||||
prop->type != &m_option_type_dummy)
|
||||
{
|
||||
*(struct m_option *)arg = *prop;
|
||||
return M_PROPERTY_OK;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
struct m_option;
|
||||
|
||||
extern const struct m_option_type m_option_type_dummy;
|
||||
|
||||
enum mp_property_action {
|
||||
// Get the property type. This defines the fundamental data type read from
|
||||
// or written to the property.
|
||||
|
|
Loading…
Reference in New Issue