static int WindowOpen( vlc_object_t *p_obj ) { vout_window_t *p_wnd = (vout_window_t*)p_obj; /* */ if( p_wnd->cfg->is_standalone ) return VLC_EGENERIC; #if defined (Q_WS_X11) if( var_InheritBool( p_obj, "video-wallpaper" ) ) return VLC_EGENERIC; #endif vlc_value_t val; if( var_Inherit( p_obj, "qt4-iface", VLC_VAR_ADDRESS, &val ) ) val.p_address = NULL; intf_thread_t *p_intf = (intf_thread_t *)val.p_address; if( !p_intf ) { /* If another interface is used, this plugin cannot work */ msg_Dbg( p_obj, "Qt4 interface not found" ); return VLC_EGENERIC; } QMutexLocker locker (&lock); if (unlikely(!active)) return VLC_EGENERIC; MainInterface *p_mi = p_intf->p_sys->p_mi; msg_Dbg( p_obj, "requesting video..." ); int i_x = p_wnd->cfg->x; int i_y = p_wnd->cfg->y; unsigned i_width = p_wnd->cfg->width; unsigned i_height = p_wnd->cfg->height; #if defined (Q_WS_X11) p_wnd->handle.xid = p_mi->getVideo( &i_x, &i_y, &i_width, &i_height ); if( !p_wnd->handle.xid ) return VLC_EGENERIC; p_wnd->display.x11 = x11_display; #elif defined (Q_WS_WIN) p_wnd->handle.hwnd = p_mi->getVideo( &i_x, &i_y, &i_width, &i_height ); if( !p_wnd->handle.hwnd ) return VLC_EGENERIC; #else # error FIXME #endif p_wnd->control = WindowControl; p_wnd->sys = (vout_window_sys_t*)p_mi; return VLC_SUCCESS; }
static int vlclua_var_inherit( lua_State *L ) { vlc_value_t val; vlc_object_t *p_obj; if( lua_type( L, 1 ) == LUA_TNIL ) p_obj = vlclua_get_this( L ); else { vlc_object_t **pp_obj = luaL_checkudata( L, 1, "vlc_object" ); p_obj = *pp_obj; } const char *psz_var = luaL_checkstring( L, 2 ); int i_type = config_GetType( p_obj, psz_var ); if( var_Inherit( p_obj, psz_var, i_type, &val ) != VLC_SUCCESS ) return 0; lua_pop( L, 2 ); return vlclua_pushvalue( L, i_type, val, true ); }
/** * Initialize a vlc variable * * We hash the given string and insert it into the sorted list. The insertion * may require slow memory copies, but think about what we gain in the log(n) * lookup phase when setting/getting the variable value! * * \param p_this The object in which to create the variable * \param psz_name The name of the variable * \param i_type The variables type. Must be one of \ref var_type combined with * zero or more \ref var_flags */ int var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) { assert( p_this ); variable_t *p_var = calloc( 1, sizeof( *p_var ) ); if( p_var == NULL ) return VLC_ENOMEM; p_var->psz_name = strdup( psz_name ); p_var->psz_text = NULL; p_var->i_type = i_type & ~VLC_VAR_DOINHERIT; p_var->i_usage = 1; p_var->choices.i_count = 0; p_var->choices.p_values = NULL; p_var->choices_text.i_count = 0; p_var->choices_text.p_values = NULL; p_var->b_incallback = false; p_var->value_callbacks = (callback_table_t){ 0 }; /* Always initialize the variable, even if it is a list variable; this * will lead to errors if the variable is not initialized, but it will * not cause crashes in the variable handling. */ switch( i_type & VLC_VAR_CLASS ) { case VLC_VAR_BOOL: p_var->ops = &bool_ops; p_var->val.b_bool = false; break; case VLC_VAR_INTEGER: p_var->ops = &int_ops; p_var->val.i_int = 0; p_var->min.i_int = INT64_MIN; p_var->max.i_int = INT64_MAX; break; case VLC_VAR_STRING: p_var->ops = &string_ops; p_var->val.psz_string = NULL; break; case VLC_VAR_FLOAT: p_var->ops = &float_ops; p_var->val.f_float = 0.f; p_var->min.f_float = -FLT_MAX; p_var->max.f_float = FLT_MAX; break; case VLC_VAR_COORDS: p_var->ops = &coords_ops; p_var->val.coords.x = p_var->val.coords.y = 0; break; case VLC_VAR_ADDRESS: p_var->ops = &addr_ops; p_var->val.p_address = NULL; break; case VLC_VAR_VOID: p_var->ops = &void_ops; break; default: vlc_assert_unreachable (); } if (i_type & VLC_VAR_DOINHERIT) var_Inherit(p_this, psz_name, i_type, &p_var->val); vlc_object_internals_t *p_priv = vlc_internals( p_this ); variable_t **pp_var, *p_oldvar; int ret = VLC_SUCCESS; vlc_mutex_lock( &p_priv->var_lock ); pp_var = tsearch( p_var, &p_priv->var_root, varcmp ); if( unlikely(pp_var == NULL) ) ret = VLC_ENOMEM; else if( (p_oldvar = *pp_var) == p_var ) /* Variable create */ p_var = NULL; /* Variable created */ else /* Variable already exists */ { assert (((i_type ^ p_oldvar->i_type) & VLC_VAR_CLASS) == 0); p_oldvar->i_usage++; p_oldvar->i_type |= i_type & VLC_VAR_ISCOMMAND; } vlc_mutex_unlock( &p_priv->var_lock ); /* If we did not need to create a new variable, free everything... */ if( p_var != NULL ) Destroy( p_var ); return ret; }
/** * Initialize a vlc variable * * We hash the given string and insert it into the sorted list. The insertion * may require slow memory copies, but think about what we gain in the log(n) * lookup phase when setting/getting the variable value! * * \param p_this The object in which to create the variable * \param psz_name The name of the variable * \param i_type The variables type. Must be one of \ref var_type combined with * zero or more \ref var_flags */ int var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) { assert( p_this ); variable_t *p_var = calloc( 1, sizeof( *p_var ) ); if( p_var == NULL ) return VLC_ENOMEM; p_var->psz_name = strdup( psz_name ); p_var->psz_text = NULL; p_var->i_type = i_type & ~VLC_VAR_DOINHERIT; p_var->i_usage = 1; p_var->i_default = -1; p_var->choices.i_count = 0; p_var->choices.p_values = NULL; p_var->choices_text.i_count = 0; p_var->choices_text.p_values = NULL; p_var->b_incallback = false; p_var->i_entries = 0; p_var->p_entries = NULL; /* Always initialize the variable, even if it is a list variable; this * will lead to errors if the variable is not initialized, but it will * not cause crashes in the variable handling. */ switch( i_type & VLC_VAR_CLASS ) { case VLC_VAR_BOOL: p_var->ops = &bool_ops; p_var->val.b_bool = false; break; case VLC_VAR_INTEGER: p_var->ops = &int_ops; p_var->val.i_int = 0; break; case VLC_VAR_STRING: p_var->ops = &string_ops; p_var->val.psz_string = NULL; break; case VLC_VAR_FLOAT: p_var->ops = &float_ops; p_var->val.f_float = 0.0; break; case VLC_VAR_TIME: p_var->ops = &time_ops; p_var->val.i_time = 0; break; case VLC_VAR_COORDS: p_var->ops = &coords_ops; p_var->val.coords.x = p_var->val.coords.y = 0; break; case VLC_VAR_ADDRESS: p_var->ops = &addr_ops; p_var->val.p_address = NULL; break; default: p_var->ops = &void_ops; #ifndef NDEBUG if( (i_type & VLC_VAR_CLASS) != VLC_VAR_VOID ) msg_Err( p_this, "Creating the variable '%s' without a type", psz_name ); #endif } if( i_type & VLC_VAR_DOINHERIT ) { if( var_Inherit( p_this, psz_name, i_type, &p_var->val ) ) msg_Err( p_this, "cannot inherit value for %s", psz_name ); else if( i_type & VLC_VAR_HASCHOICE ) { /* We must add the inherited value to our choice list */ p_var->i_default = 0; INSERT_ELEM( p_var->choices.p_values, p_var->choices.i_count, 0, p_var->val ); INSERT_ELEM( p_var->choices_text.p_values, p_var->choices_text.i_count, 0, p_var->val ); p_var->ops->pf_dup( &p_var->choices.p_values[0] ); p_var->choices_text.p_values[0].psz_string = NULL; } } vlc_object_internals_t *p_priv = vlc_internals( p_this ); variable_t **pp_var, *p_oldvar; int ret = VLC_SUCCESS; vlc_mutex_lock( &p_priv->var_lock ); pp_var = tsearch( p_var, &p_priv->var_root, varcmp ); if( unlikely(pp_var == NULL) ) ret = VLC_ENOMEM; else if( (p_oldvar = *pp_var) == p_var ) p_var = NULL; else if( unlikely((i_type ^ p_oldvar->i_type) & VLC_VAR_CLASS) ) { /* If the types differ, variable creation failed. */ msg_Err( p_this, "Variable '%s' (0x%04x) already exist " "but with a different type (0x%04x)", psz_name, p_oldvar->i_type, i_type ); ret = VLC_EBADVAR; } else { p_oldvar->i_usage++; p_oldvar->i_type |= i_type & (VLC_VAR_ISCOMMAND|VLC_VAR_HASCHOICE); } vlc_mutex_unlock( &p_priv->var_lock ); /* If we did not need to create a new variable, free everything... */ if( p_var != NULL ) Destroy( p_var ); return ret; }