Commit 3570e616 authored by Gildas Bazin's avatar Gildas Bazin

* modules/gui/wxwindows/*: implemented VOUT_SET_STAY_ON_TOP in ControlWindow()

* modules/video_output/directx and x11: implemented VOUT_SET_STAY_ON_TOP in Control()
* src/video_output/vout_intf.c: moved the video-on-top variable there.
parent 3a8f5790
...@@ -242,7 +242,8 @@ static inline int vout_Control( vout_thread_t *p_vout, int i_query, ... ) ...@@ -242,7 +242,8 @@ static inline int vout_Control( vout_thread_t *p_vout, int i_query, ... )
enum output_query_e enum output_query_e
{ {
VOUT_SET_ZOOM, /* arg1= double * res= */ VOUT_SET_ZOOM, /* arg1= double res= */
VOUT_SET_STAY_ON_TOP, /* arg1= vlc_bool_t res= */
VOUT_REPARENT, VOUT_REPARENT,
VOUT_CLOSE VOUT_CLOSE
}; };
......
...@@ -201,7 +201,8 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) ...@@ -201,7 +201,8 @@ BEGIN_EVENT_TABLE(Interface, wxFrame)
EVT_COMMAND_SCROLL(Gamma_Event, Interface::OnGammaUpdate) EVT_COMMAND_SCROLL(Gamma_Event, Interface::OnGammaUpdate)
/* Custom events */ /* Custom events */
EVT_COMMAND(0, wxEVT_INTF, Interface::UpdateSizeEvent) EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent)
EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent)
END_EVENT_TABLE() END_EVENT_TABLE()
...@@ -290,10 +291,22 @@ Interface::~Interface() ...@@ -290,10 +291,22 @@ Interface::~Interface()
delete timer; delete timer;
} }
void Interface::UpdateSizeEvent( wxCommandEvent& event ) void Interface::OnControlEvent( wxCommandEvent& event )
{ {
switch( event.GetId() )
{
case 0:
frame_sizer->Layout(); frame_sizer->Layout();
frame_sizer->Fit(this); frame_sizer->Fit(this);
break;
case 1:
long i_style = GetWindowStyle();
if( event.GetInt() ) i_style |= wxSTAY_ON_TOP;
else i_style &= ~wxSTAY_ON_TOP;
SetWindowStyle( i_style );
break;
}
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -342,11 +342,7 @@ wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu ) ...@@ -342,11 +342,7 @@ wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
pi_objects[i++] = p_object->i_object_id; pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "crop"; ppsz_varnames[i] = "crop";
pi_objects[i++] = p_object->i_object_id; pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "directx-on-top"; ppsz_varnames[i] = "video-on-top";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "xvideo-on-top";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "x11-on-top";
pi_objects[i++] = p_object->i_object_id; pi_objects[i++] = p_object->i_object_id;
p_dec_obj = (vlc_object_t *)vlc_object_find( p_object, p_dec_obj = (vlc_object_t *)vlc_object_find( p_object,
......
...@@ -45,7 +45,8 @@ static int ControlWindow( intf_thread_t *p_intf, void *p_window, ...@@ -45,7 +45,8 @@ static int ControlWindow( intf_thread_t *p_intf, void *p_window,
enum enum
{ {
UpdateSize_Event = wxID_HIGHEST + 1, UpdateSize_Event = wxID_HIGHEST + 1,
UpdateHide_Event UpdateHide_Event,
SetStayOnTop_Event,
}; };
class VideoWindow: public wxWindow class VideoWindow: public wxWindow
...@@ -70,13 +71,18 @@ private: ...@@ -70,13 +71,18 @@ private:
void UpdateSize( wxSizeEvent & ); void UpdateSize( wxSizeEvent & );
void UpdateHide( wxSizeEvent & ); void UpdateHide( wxSizeEvent & );
void OnControlEvent( wxCommandEvent & );
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
}; };
DEFINE_LOCAL_EVENT_TYPE( wxEVT_VLC_VIDEO );
BEGIN_EVENT_TABLE(VideoWindow, wxWindow) BEGIN_EVENT_TABLE(VideoWindow, wxWindow)
EVT_CUSTOM( wxEVT_SIZE, UpdateSize_Event, VideoWindow::UpdateSize ) EVT_CUSTOM( wxEVT_SIZE, UpdateSize_Event, VideoWindow::UpdateSize )
EVT_CUSTOM( wxEVT_SIZE, UpdateHide_Event, VideoWindow::UpdateHide ) EVT_CUSTOM( wxEVT_SIZE, UpdateHide_Event, VideoWindow::UpdateHide )
EVT_COMMAND( SetStayOnTop_Event, wxEVT_VLC_VIDEO,
VideoWindow::OnControlEvent )
END_EVENT_TABLE() END_EVENT_TABLE()
/***************************************************************************** /*****************************************************************************
...@@ -242,6 +248,18 @@ void VideoWindow::UpdateHide( wxSizeEvent &event ) ...@@ -242,6 +248,18 @@ void VideoWindow::UpdateHide( wxSizeEvent &event )
p_parent->AddPendingEvent( intf_event ); p_parent->AddPendingEvent( intf_event );
} }
void VideoWindow::OnControlEvent( wxCommandEvent &event )
{
switch( event.GetId() )
{
case SetStayOnTop_Event:
wxCommandEvent intf_event( wxEVT_INTF, 1 );
intf_event.SetInt( event.GetInt() );
p_parent->AddPendingEvent( intf_event );
break;
}
}
static int ControlWindow( intf_thread_t *p_intf, void *p_window, static int ControlWindow( intf_thread_t *p_intf, void *p_window,
int i_query, va_list args ) int i_query, va_list args )
{ {
...@@ -271,6 +289,17 @@ int VideoWindow::ControlWindow( void *p_window, int i_query, va_list args ) ...@@ -271,6 +289,17 @@ int VideoWindow::ControlWindow( void *p_window, int i_query, va_list args )
} }
break; break;
case VOUT_SET_STAY_ON_TOP:
{
int i_arg = va_arg( args, int );
wxCommandEvent event( wxEVT_VLC_VIDEO, SetStayOnTop_Event );
event.SetInt( i_arg );
AddPendingEvent( event );
i_ret = VLC_SUCCESS;
}
break;
default: default:
msg_Dbg( p_intf, "control query not supported" ); msg_Dbg( p_intf, "control query not supported" );
break; break;
......
...@@ -94,8 +94,6 @@ static int DirectXUnlockSurface ( vout_thread_t *p_vout, picture_t *p_pic ); ...@@ -94,8 +94,6 @@ static int DirectXUnlockSurface ( vout_thread_t *p_vout, picture_t *p_pic );
static DWORD DirectXFindColorkey( vout_thread_t *p_vout, uint32_t i_color ); static DWORD DirectXFindColorkey( vout_thread_t *p_vout, uint32_t i_color );
/* Object variables callbacks */ /* Object variables callbacks */
static int OnTopCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
static int FindDevicesCallback( vlc_object_t *, char const *, static int FindDevicesCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * ); vlc_value_t, vlc_value_t, void * );
...@@ -262,12 +260,8 @@ static int OpenVideo( vlc_object_t *p_this ) ...@@ -262,12 +260,8 @@ static int OpenVideo( vlc_object_t *p_this )
} }
/* Add a variable to indicate if the window should be on top of others */ /* Add a variable to indicate if the window should be on top of others */
var_Create( p_vout, "video-on-top", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
text.psz_string = _("Always on top");
var_Change( p_vout, "video-on-top", VLC_VAR_SETTEXT, &text, NULL );
var_Get( p_vout, "video-on-top", &val ); var_Get( p_vout, "video-on-top", &val );
p_vout->p_sys->b_on_top_change = val.b_bool; p_vout->p_sys->b_on_top_change = val.b_bool;
var_AddCallback( p_vout, "video-on-top", OnTopCallback, NULL );
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -409,8 +403,6 @@ static void CloseVideo( vlc_object_t *p_this ) ...@@ -409,8 +403,6 @@ static void CloseVideo( vlc_object_t *p_this )
msg_Dbg( p_vout, "CloseVideo" ); msg_Dbg( p_vout, "CloseVideo" );
var_Destroy( p_vout, "video-on-top" );
if( p_vout->p_sys->p_event ) if( p_vout->p_sys->p_event )
{ {
vlc_object_detach( p_vout->p_sys->p_event ); vlc_object_detach( p_vout->p_sys->p_event );
...@@ -1785,18 +1777,6 @@ static DWORD DirectXFindColorkey( vout_thread_t *p_vout, uint32_t i_color ) ...@@ -1785,18 +1777,6 @@ static DWORD DirectXFindColorkey( vout_thread_t *p_vout, uint32_t i_color )
return i_rgb; return i_rgb;
} }
/*****************************************************************************
* object variables callbacks: a bunch of object variables are used by the
* interfaces to interact with the vout.
*****************************************************************************/
static int OnTopCallback( 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;
p_vout->p_sys->b_on_top_change = VLC_TRUE;
return VLC_SUCCESS;
}
/***************************************************************************** /*****************************************************************************
* config variable callback * config variable callback
*****************************************************************************/ *****************************************************************************/
......
...@@ -948,6 +948,14 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) ...@@ -948,6 +948,14 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args )
case VOUT_CLOSE: case VOUT_CLOSE:
return VLC_SUCCESS; return VLC_SUCCESS;
case VOUT_SET_STAY_ON_TOP:
if( p_vout->p_sys->hparent )
return vout_ControlWindow( p_vout,
(void *)p_vout->p_sys->hparent, i_query, args );
p_vout->p_sys->b_on_top_change = VLC_TRUE;
return VLC_SUCCESS;
default: default:
msg_Dbg( p_vout, "control query not supported" ); msg_Dbg( p_vout, "control query not supported" );
return VLC_EGENERIC; return VLC_EGENERIC;
......
...@@ -122,9 +122,7 @@ static void SetPalette ( vout_thread_t *, ...@@ -122,9 +122,7 @@ static void SetPalette ( vout_thread_t *,
static void TestNetWMSupport( vout_thread_t * ); static void TestNetWMSupport( vout_thread_t * );
static int ConvertKey( int ); static int ConvertKey( int );
/* Object variables callbacks */ static int WindowOnTop( vout_thread_t *, vlc_bool_t );
static int OnTopCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
/***************************************************************************** /*****************************************************************************
* Activate: allocate X11 video thread output method * Activate: allocate X11 video thread output method
...@@ -283,11 +281,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -283,11 +281,7 @@ int E_(Activate) ( vlc_object_t *p_this )
TestNetWMSupport( p_vout ); TestNetWMSupport( p_vout );
/* Add a variable to indicate if the window should be on top of others */ /* Variable to indicate if the window should be on top of others */
var_Create( p_vout, "video-on-top", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
text.psz_string = _("Always on top");
var_Change( p_vout, "video-on-top", VLC_VAR_SETTEXT, &text, NULL );
var_AddCallback( p_vout, "video-on-top", OnTopCallback, NULL );
/* Trigger a callback right now */ /* Trigger a callback right now */
var_Get( p_vout, "video-on-top", &val ); var_Get( p_vout, "video-on-top", &val );
var_Set( p_vout, "video-on-top", val ); var_Set( p_vout, "video-on-top", val );
...@@ -2122,6 +2116,7 @@ static void SetPalette( vout_thread_t *p_vout, ...@@ -2122,6 +2116,7 @@ static void SetPalette( vout_thread_t *p_vout,
static int Control( vout_thread_t *p_vout, int i_query, va_list args ) static int Control( vout_thread_t *p_vout, int i_query, va_list args )
{ {
double f_arg; double f_arg;
vlc_bool_t b_arg;
switch( i_query ) switch( i_query )
{ {
...@@ -2149,6 +2144,15 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) ...@@ -2149,6 +2144,15 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args )
p_vout->p_sys->p_win->owner_window = 0; p_vout->p_sys->p_win->owner_window = 0;
return VLC_SUCCESS; return VLC_SUCCESS;
case VOUT_SET_STAY_ON_TOP:
if( p_vout->p_sys->p_win->owner_window )
return vout_ControlWindow( p_vout,
(void *)p_vout->p_sys->p_win->owner_window, i_query, args);
b_arg = va_arg( args, vlc_bool_t );
WindowOnTop( p_vout, b_arg );
return VLC_SUCCESS;
default: default:
msg_Dbg( p_vout, "control query not supported" ); msg_Dbg( p_vout, "control query not supported" );
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -2275,14 +2279,10 @@ static int ConvertKey( int i_key ) ...@@ -2275,14 +2279,10 @@ static int ConvertKey( int i_key )
} }
/***************************************************************************** /*****************************************************************************
* object variables callbacks: a bunch of object variables are used by the * WindowOnTop: Switches the "always on top" state of the video window.
* interfaces to interact with the vout.
*****************************************************************************/ *****************************************************************************/
static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd, static int WindowOnTop( vout_thread_t *p_vout, vlc_bool_t b_on_top )
vlc_value_t oldval, vlc_value_t newval, void *p_data )
{ {
vout_thread_t *p_vout = (vout_thread_t *)p_this;
if( p_vout->p_sys->b_net_wm_state_stays_on_top ) if( p_vout->p_sys->b_net_wm_state_stays_on_top )
{ {
XClientMessageEvent event; XClientMessageEvent event;
...@@ -2294,7 +2294,7 @@ static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd, ...@@ -2294,7 +2294,7 @@ static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd,
event.display = p_vout->p_sys->p_display; event.display = p_vout->p_sys->p_display;
event.window = p_vout->p_sys->p_win->base_window; event.window = p_vout->p_sys->p_win->base_window;
event.format = 32; event.format = 32;
event.data.l[ 0 ] = newval.b_bool; /* set property */ event.data.l[ 0 ] = b_on_top; /* set property */
event.data.l[ 1 ] = p_vout->p_sys->net_wm_state_stays_on_top; event.data.l[ 1 ] = p_vout->p_sys->net_wm_state_stays_on_top;
XSendEvent( p_vout->p_sys->p_display, XSendEvent( p_vout->p_sys->p_display,
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
/* Object variables callbacks */ /* Object variables callbacks */
static int ZoomCallback( vlc_object_t *, char const *, static int ZoomCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * ); vlc_value_t, vlc_value_t, void * );
static int OnTopCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
/***************************************************************************** /*****************************************************************************
* vout_RequestWindow: Create/Get a video window if possible. * vout_RequestWindow: Create/Get a video window if possible.
...@@ -169,6 +171,12 @@ void vout_IntfInit( vout_thread_t *p_vout ) ...@@ -169,6 +171,12 @@ void vout_IntfInit( vout_thread_t *p_vout )
var_Set( p_vout, "zoom", old_val ); var_Set( p_vout, "zoom", old_val );
var_AddCallback( p_vout, "zoom", ZoomCallback, NULL ); var_AddCallback( p_vout, "zoom", ZoomCallback, NULL );
/* Add a variable to indicate if the window should be on top of others */
var_Create( p_vout, "video-on-top", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
text.psz_string = _("Always on top");
var_Change( p_vout, "video-on-top", VLC_VAR_SETTEXT, &text, NULL );
var_AddCallback( p_vout, "video-on-top", OnTopCallback, NULL );
} }
/***************************************************************************** /*****************************************************************************
...@@ -181,3 +189,11 @@ static int ZoomCallback( vlc_object_t *p_this, char const *psz_cmd, ...@@ -181,3 +189,11 @@ static int ZoomCallback( vlc_object_t *p_this, char const *psz_cmd,
vout_Control( p_vout, VOUT_SET_ZOOM, newval.f_float ); vout_Control( p_vout, VOUT_SET_ZOOM, newval.f_float );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
static int OnTopCallback( 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_STAY_ON_TOP, newval.b_bool );
return VLC_SUCCESS;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment