* src/video_output/video_output.c: moved some stuff to vout_IntfInit().
* include/video_output.h: vout_vaControl()/vout_Control() prototypes.
* modules/video_output/x11/xcommon.c: implemented a vout_Control() (only VOUT_SET_ZOOM for now).
* modules/gui/wxwindows/menus.cpp: handle float object vars, added "zoom" to the menus.
int ( *pf_manage ) ( vout_thread_t * );
void ( *pf_render ) ( vout_thread_t *, picture_t * );
void ( *pf_display ) ( vout_thread_t *, picture_t * );
+ int ( *pf_control ) ( vout_thread_t *, int, va_list );
/**@}*/
/** \name Statistics
VLC_EXPORT( void *, vout_RequestWindow, ( vout_thread_t *, int *, int *, unsigned int *, unsigned int * ) );
VLC_EXPORT( void, vout_ReleaseWindow, ( vout_thread_t *, void * ) );
+static inline int vout_vaControl( vout_thread_t *p_vout, int i_query,
+ va_list args )
+{
+ if( p_vout->pf_control )
+ return p_vout->pf_control( p_vout, i_query, args );
+ else
+ return VLC_EGENERIC;
+}
+
+static inline int vout_Control( vout_thread_t *p_vout, int i_query, ... )
+{
+ va_list args;
+ int i_result;
+
+ va_start( args, i_query );
+ i_result = vout_vaControl( p_vout, i_query, args );
+ va_end( args );
+ return i_result;
+}
+
+enum output_query_e
+{
+ VOUT_SET_ZOOM, /* arg1= double * res= */
+ VOUT_REPARENT
+};
+
/**
* \addtogroup subpicture
* @{
ppsz_varnames[i] = "fullscreen";
pi_objects[i++] = p_object->i_object_id;
+ ppsz_varnames[i] = "zoom";
+ pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "deinterlace";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "aspect-ratio";
ppsz_varnames[i] = "fullscreen";
pi_objects[i++] = p_object->i_object_id;
+ ppsz_varnames[i] = "zoom";
+ pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "deinterlace";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "aspect-ratio";
case VLC_VAR_VARIABLE:
case VLC_VAR_STRING:
case VLC_VAR_INTEGER:
+ case VLC_VAR_FLOAT:
break;
default:
/* Variable doesn't exist or isn't handled */
case VLC_VAR_VARIABLE:
case VLC_VAR_STRING:
case VLC_VAR_INTEGER:
+ case VLC_VAR_FLOAT:
break;
default:
/* Variable doesn't exist or isn't handled */
menu->Check( i_item_id, TRUE );
break;
+ case VLC_VAR_FLOAT:
+ var_Get( p_object, psz_var, &val );
+
+ menuitem =
+ new wxMenuItemExt( menu, ++i_item_id,
+ text_list.p_list->p_values[i].psz_string ?
+ (wxString)wxU(
+ text_list.p_list->p_values[i].psz_string) :
+ wxString::Format(wxT("%.2f"),
+ val_list.p_list->p_values[i].f_float),wxT(""),
+ i_type & VLC_VAR_ISCOMMAND ?
+ wxITEM_NORMAL : wxITEM_RADIO,
+ strdup(psz_var),
+ p_object->i_object_id,
+ val_list.p_list->p_values[i], i_type );
+
+ menu->Append( menuitem );
+
+ if( !(i_type & VLC_VAR_ISCOMMAND) &&
+ val_list.p_list->p_values[i].f_float == val.f_float )
+ menu->Check( i_item_id, TRUE );
+ break;
+
default:
break;
}
static void EndVideo ( vout_thread_t * );
static void DisplayVideo ( vout_thread_t *, picture_t * );
static int ManageVideo ( vout_thread_t * );
+static int Control ( vout_thread_t *, int, va_list );
static int InitDisplay ( vout_thread_t * );
p_vout->pf_manage = ManageVideo;
p_vout->pf_render = NULL;
p_vout->pf_display = DisplayVideo;
+ p_vout->pf_control = Control;
/* Allocate structure */
p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
}
#endif
+/*****************************************************************************
+ * Control: control facility for the vout
+ *****************************************************************************/
+static int Control( vout_thread_t *p_vout, int i_query, va_list args )
+{
+ double f_arg;
+
+ switch( i_query )
+ {
+ case VOUT_SET_ZOOM:
+ f_arg = va_arg( args, double );
+
+ /* Update dimensions */
+ XResizeWindow( p_vout->p_sys->p_display,
+ p_vout->p_sys->p_win->base_window,
+ p_vout->render.i_width * f_arg,
+ p_vout->render.i_height * f_arg );
+
+ return VLC_SUCCESS;
+
+ default:
+ msg_Dbg( p_vout, "control query not supported" );
+ return VLC_EGENERIC;
+ }
+}
+
/*****************************************************************************
* TestNetWMSupport: tests for Extended Window Manager Hints support
*****************************************************************************/
static void MaskToShift ( int *, int *, uint32_t );
static void InitWindowSize ( vout_thread_t *, int *, int * );
+void vout_IntfInit( vout_thread_t * );
+
/* Object variables callbacks */
static int FullscreenCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
p_vout->render_time = 10;
p_vout->c_fps_samples = 0;
p_vout->b_filter_change = 0;
+ p_vout->pf_control = 0;
/* Mouse coordinates */
var_Create( p_vout, "mouse-x", VLC_VAR_INTEGER );
/* Attach the new object now so we can use var inheritance below */
vlc_object_attach( p_vout, p_parent );
- /* Create a few object variables we'll need later on */
- var_Create( p_vout, "aspect-ratio", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "zoom", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "align", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "video-x", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "video-y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ /* Take care of some "interface/control" related initialisations */
+ vout_IntfInit( p_vout );
p_vout->b_override_aspect = VLC_FALSE;
* Local prototypes
*****************************************************************************/
+/* Object variables callbacks */
+static int ZoomCallback( vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void * );
+
/*****************************************************************************
* vout_RequestWindow: Create/Get a video window if possible.
*****************************************************************************
p_intf->pf_release_window( p_intf, p_window );
vlc_object_release( p_intf );
}
+
+/*****************************************************************************
+ * vout_IntfInit: called during the vout creation to initialise misc things.
+ *****************************************************************************/
+void vout_IntfInit( vout_thread_t *p_vout )
+{
+ vlc_value_t val, text, old_val;
+
+ /* Create a few object variables we'll need later on */
+ var_Create( p_vout, "aspect-ratio", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
+ var_Create( p_vout, "width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ var_Create( p_vout, "height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ var_Create( p_vout, "align", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ var_Create( p_vout, "video-x", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ var_Create( p_vout, "video-y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+
+ var_Create( p_vout, "zoom", VLC_VAR_FLOAT | VLC_VAR_ISCOMMAND |
+ VLC_VAR_HASCHOICE | VLC_VAR_DOINHERIT );
+
+ text.psz_string = _("Zoom");
+ var_Change( p_vout, "zoom", VLC_VAR_SETTEXT, &text, NULL );
+
+ var_Get( p_vout, "zoom", &old_val );
+ if( old_val.f_float == 0.25 ||
+ old_val.f_float == 0.5 ||
+ old_val.f_float == 1 ||
+ old_val.f_float == 2 )
+ {
+ var_Change( p_vout, "zoom", VLC_VAR_DELCHOICE, &old_val, NULL );
+ }
+
+ val.f_float = 0.25; text.psz_string = _("1:4 Quater");
+ var_Change( p_vout, "zoom", VLC_VAR_ADDCHOICE, &val, &text );
+ val.f_float = 0.5; text.psz_string = _("1:2 Half");
+ var_Change( p_vout, "zoom", VLC_VAR_ADDCHOICE, &val, &text );
+ val.f_float = 1; text.psz_string = _("1:1 Original");
+ var_Change( p_vout, "zoom", VLC_VAR_ADDCHOICE, &val, &text );
+ val.f_float = 2; text.psz_string = _("2:1 Double");
+ var_Change( p_vout, "zoom", VLC_VAR_ADDCHOICE, &val, &text );
+
+ var_Set( p_vout, "zoom", old_val );
+
+ var_AddCallback( p_vout, "zoom", ZoomCallback, NULL );
+}
+
+/*****************************************************************************
+ * Object variables callbacks
+ *****************************************************************************/
+static int ZoomCallback( vlc_object_t *p_this, char const *psz_cmd,
+ vlc_value_t oldval, vlc_value_t newval, void *p_data )
+{
+ vout_thread_t *p_vout = (vout_thread_t *)p_this;
+ vout_Control( p_vout, VOUT_SET_ZOOM, newval.f_float );
+ return VLC_SUCCESS;
+}