Add coordinates (VLC_VAR_COORDS) variable type
[vlc.git] / include / vlc_variables.h
index 24be87f..4a0de14 100644 (file)
  * These are the different actions that can be used with var_GetAndSet()
  * @{
  */
-/**
- * Toggle the value of this boolean
- * \param val Unused
- */
-#define VLC_VAR_TOGGLE_BOOL         0x0010
-/**
- * Increment or decrement an integer of a given value
- * \param val the value
- */
-#define VLC_VAR_INTEGER_INCDEC      0x0020
+enum {
+    VLC_VAR_BOOL_TOGGLE, /**< Invert a boolean value (param ignored) */
+    VLC_VAR_INTEGER_ADD, /**< Add parameter to an integer value */
+    VLC_VAR_INTEGER_OR,  /**< Binary OR over an integer bits field */
+    VLC_VAR_INTEGER_NAND,/**< Binary NAND over an integer bits field */
+};
 /**@}*/
 
 /*****************************************************************************
@@ -151,9 +147,10 @@ VLC_EXPORT( int, var_Get, ( vlc_object_t *, const char *, vlc_value_t * ) );
 #define var_Get(a,b,c) var_Get( VLC_OBJECT(a), b, c )
 
 VLC_EXPORT( int, var_SetChecked, ( vlc_object_t *, const char *, int, vlc_value_t ) );
+#define var_SetChecked(o,n,t,v) var_SetChecked(VLC_OBJECT(o),n,t,v)
 VLC_EXPORT( int, var_GetChecked, ( vlc_object_t *, const char *, int, vlc_value_t * ) );
-VLC_EXPORT( int, var_GetAndSet, ( vlc_object_t *, const char *, int, vlc_value_t ) );
-#define var_GetAndSet(a,b,c,d) var_GetAndSet(VLC_OBJECT(a), b, c, d)
+#define var_GetChecked(o,n,t,v) var_GetChecked(VLC_OBJECT(o),n,t,v)
+VLC_EXPORT( int, var_GetAndSet, ( vlc_object_t *, const char *, int, vlc_value_t * ) );
 
 VLC_EXPORT( int, var_Inherit, ( vlc_object_t *, const char *, int, vlc_value_t * ) );
 
@@ -226,6 +223,16 @@ static inline int var_SetTime( vlc_object_t *p_obj, const char *psz_name, int64_
     return var_SetChecked( p_obj, psz_name, VLC_VAR_TIME, val );
 }
 
+static inline int var_SetCoords( vlc_object_t *obj, const char *name,
+                                 int32_t x, int32_t y )
+{
+    vlc_value_t val;
+    val.coords.x = x;
+    val.coords.y = y;
+    return var_SetChecked (obj, name, VLC_VAR_COORDS, val);
+}
+#define var_SetCoords(o,n,x,y) var_SetCoords(VLC_OBJECT(o),n,x,y)
+
 /**
  * Set the value of a float variable
  *
@@ -326,6 +333,21 @@ static inline int64_t var_GetTime( vlc_object_t *p_obj, const char *psz_name )
         return 0;
 }
 
+static inline void var_GetCoords( vlc_object_t *obj, const char *name,
+                                  int32_t *px, int32_t *py )
+{
+    vlc_value_t val;
+
+    if (likely(!var_GetChecked (obj, name, VLC_VAR_COORDS, &val)))
+    {
+        *px = val.coords.x;
+        *py = val.coords.y;
+    }
+    else
+        *px = *py = 0;
+}
+#define var_GetCoords(o,n,x,y) var_GetCoords(VLC_OBJECT(o),n,x,y)
+
 /**
  * Get a float value
  *
@@ -385,11 +407,12 @@ static inline void *var_GetAddress( vlc_object_t *p_obj, const char *psz_name )
  * \param p_obj the object that holds the variable
  * \param psz_name the name of the variable
  */
-static inline void var_IncInteger( vlc_object_t *p_obj, const char *psz_name )
+static inline int var_IncInteger( vlc_object_t *p_obj, const char *psz_name )
 {
     vlc_value_t val;
     val.i_int = 1;
-    var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_INCDEC, val );
+    var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val );
+    return val.i_int;
 }
 #define var_IncInteger(a,b) var_IncInteger( VLC_OBJECT(a), b )
 
@@ -398,14 +421,35 @@ static inline void var_IncInteger( vlc_object_t *p_obj, const char *psz_name )
  * \param p_obj the object that holds the variable
  * \param psz_name the name of the variable
  */
-static inline void var_DecInteger( vlc_object_t *p_obj, const char *psz_name )
+static inline int var_DecInteger( vlc_object_t *p_obj, const char *psz_name )
 {
     vlc_value_t val;
     val.i_int = -1;
-    var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_INCDEC, val );
+    var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val );
+    return val.i_int;
 }
 #define var_DecInteger(a,b) var_DecInteger( VLC_OBJECT(a), b )
 
+static inline unsigned var_OrInteger( vlc_object_t *obj, const char *name,
+                                      unsigned v )
+{
+    vlc_value_t val;
+    val.i_int = v;
+    var_GetAndSet( obj, name, VLC_VAR_INTEGER_OR, &val );
+    return val.i_int;
+}
+#define var_OrInteger(a,b,c) var_OrInteger(VLC_OBJECT(a),b,c)
+
+static inline unsigned var_NAndInteger( vlc_object_t *obj, const char *name,
+                                        unsigned v )
+{
+    vlc_value_t val;
+    val.i_int = v;
+    var_GetAndSet( obj, name, VLC_VAR_INTEGER_NAND, &val );
+    return val.i_int;
+}
+#define var_NAndInteger(a,b,c) var_NAndInteger(VLC_OBJECT(a),b,c)
+
 /**
  * Create a integer variable with inherit and get its value.
  *
@@ -600,10 +644,11 @@ static inline int var_CountChoices( vlc_object_t *p_obj, const char *psz_name )
 #define var_CountChoices(a,b) var_CountChoices( VLC_OBJECT(a),b)
 
 
-static inline int var_ToggleBool( vlc_object_t *p_obj, const char *psz_name )
+static inline bool var_ToggleBool( vlc_object_t *p_obj, const char *psz_name )
 {
     vlc_value_t val;
-    return var_GetAndSet( p_obj, psz_name, VLC_VAR_TOGGLE_BOOL, val );
+    var_GetAndSet( p_obj, psz_name, VLC_VAR_BOOL_TOGGLE, &val );
+    return val.b_bool;
 }
 #define var_ToggleBool(a,b) var_ToggleBool( VLC_OBJECT(a),b )