Commit 4ed02660 authored by Andre Pang's avatar Andre Pang

* mozilla/vlcshell.cpp: handle Mozilla plugin output window resizing in X11...

* mozilla/vlcshell.cpp: handle Mozilla plugin output window resizing in X11 (patch thanks to Conrad Parker, conrad AT metadecks DOT org), and annotate #endifs with the #ifdef that it closes

parent db7e8dc9
...@@ -82,6 +82,9 @@ ...@@ -82,6 +82,9 @@
# define WINDOW_TEXT "(no libvlc)" # define WINDOW_TEXT "(no libvlc)"
#endif #endif
/* Enable/disable debugging printf's for X11 resizing */
#undef X11_RESIZE_DEBUG
/***************************************************************************** /*****************************************************************************
* Unix-only declarations * Unix-only declarations
******************************************************************************/ ******************************************************************************/
...@@ -90,6 +93,7 @@ ...@@ -90,6 +93,7 @@
# define AOUT_PLUGINS "oss,dummy" # define AOUT_PLUGINS "oss,dummy"
static void Redraw( Widget w, XtPointer closure, XEvent *event ); static void Redraw( Widget w, XtPointer closure, XEvent *event );
static void Resize( Widget w, XtPointer closure, XEvent *event );
#endif #endif
/***************************************************************************** /*****************************************************************************
...@@ -136,9 +140,9 @@ NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value ) ...@@ -136,9 +140,9 @@ NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value )
case NPPVpluginDescriptionString: case NPPVpluginDescriptionString:
#if USE_LIBVLC #if USE_LIBVLC
snprintf( psz_desc, 1000-1, PLUGIN_DESCRIPTION, VLC_Version() ); snprintf( psz_desc, 1000-1, PLUGIN_DESCRIPTION, VLC_Version() );
#else #else /* USE_LIBVLC */
snprintf( psz_desc, 1000-1, PLUGIN_DESCRIPTION, "(disabled)" ); snprintf( psz_desc, 1000-1, PLUGIN_DESCRIPTION, "(disabled)" );
#endif #endif /* USE_LIBVLC */
psz_desc[1000-1] = 0; psz_desc[1000-1] = 0;
*((char **)value) = psz_desc; *((char **)value) = psz_desc;
return NPERR_NO_ERROR; return NPERR_NO_ERROR;
...@@ -208,7 +212,7 @@ int16 NPP_HandleEvent( NPP instance, void * event ) ...@@ -208,7 +212,7 @@ int16 NPP_HandleEvent( NPP instance, void * event )
return eventHandled; return eventHandled;
} }
#endif #endif /* XP_MACOSX */
/****************************************************************************** /******************************************************************************
* General Plug-in Calls * General Plug-in Calls
...@@ -237,7 +241,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, ...@@ -237,7 +241,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
vlc_value_t value; vlc_value_t value;
int i_ret; int i_ret;
#endif #endif /* USE_LIBVLC */
if( instance == NULL ) if( instance == NULL )
{ {
...@@ -256,12 +260,12 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, ...@@ -256,12 +260,12 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
#ifdef XP_WIN #ifdef XP_WIN
p_plugin->p_hwnd = NULL; p_plugin->p_hwnd = NULL;
p_plugin->pf_wndproc = NULL; p_plugin->pf_wndproc = NULL;
#endif #endif /* XP_WIN */
#ifdef XP_UNIX #ifdef XP_UNIX
p_plugin->window = 0; p_plugin->window = 0;
p_plugin->p_display = NULL; p_plugin->p_display = NULL;
#endif #endif /* XP_UNIX */
p_plugin->p_npwin = NULL; p_plugin->p_npwin = NULL;
p_plugin->i_npmode = mode; p_plugin->i_npmode = mode;
...@@ -317,14 +321,14 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, ...@@ -317,14 +321,14 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
if( !ppsz_argv[0] ) ppsz_argv[0] = "vlc"; if( !ppsz_argv[0] ) ppsz_argv[0] = "vlc";
#else #else /* XP_MACOSX */
char *ppsz_argv[] = char *ppsz_argv[] =
{ {
"vlc" "vlc"
/*, "--plugin-path", "/home/sam/videolan/vlc_MAIN/plugins"*/ /*, "--plugin-path", "/home/sam/videolan/vlc_MAIN/plugins"*/
}; };
#endif #endif /* XP_MACOSX */
i_ret = VLC_Init( p_plugin->i_vlc, sizeof(ppsz_argv)/sizeof(char*), i_ret = VLC_Init( p_plugin->i_vlc, sizeof(ppsz_argv)/sizeof(char*),
ppsz_argv ); ppsz_argv );
...@@ -333,7 +337,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, ...@@ -333,7 +337,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
free( home_user ); free( home_user );
free( directory ); free( directory );
free( plugin_path ); free( plugin_path );
#endif #endif /* XP_MACOSX */
} }
if( i_ret ) if( i_ret )
...@@ -352,7 +356,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, ...@@ -352,7 +356,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
value.psz_string = AOUT_PLUGINS; value.psz_string = AOUT_PLUGINS;
VLC_VariableSet( p_plugin->i_vlc, "conf::aout", value ); VLC_VariableSet( p_plugin->i_vlc, "conf::aout", value );
#else #else /* USE_LIBVLC */
p_plugin->i_vlc = 1; p_plugin->i_vlc = 1;
#endif /* USE_LIBVLC */ #endif /* USE_LIBVLC */
...@@ -414,7 +418,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, ...@@ -414,7 +418,7 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
VLC_VolumeMute( p_plugin->i_vlc ); VLC_VolumeMute( p_plugin->i_vlc );
} }
} }
#endif #endif /* USE_LIBVLC */
} }
if( p_plugin->psz_target ) if( p_plugin->psz_target )
...@@ -454,7 +458,7 @@ static void HackStopVout( VlcPlugin* p_plugin ) ...@@ -454,7 +458,7 @@ static void HackStopVout( VlcPlugin* p_plugin )
} }
while( (hwnd = FindWindowEx( (HWND)value.i_int, 0, 0, 0 )) ); while( (hwnd = FindWindowEx( (HWND)value.i_int, 0, 0, 0 )) );
} }
#endif #endif /* XP_WIN */
NPError NPP_Destroy( NPP instance, NPSavedData** save ) NPError NPP_Destroy( NPP instance, NPSavedData** save )
{ {
...@@ -472,10 +476,10 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save ) ...@@ -472,10 +476,10 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save )
#if USE_LIBVLC #if USE_LIBVLC
# ifdef XP_WIN # ifdef XP_WIN
HackStopVout( p_plugin ); HackStopVout( p_plugin );
# endif # endif /* XP_WIN */
VLC_CleanUp( p_plugin->i_vlc ); VLC_CleanUp( p_plugin->i_vlc );
VLC_Destroy( p_plugin->i_vlc ); VLC_Destroy( p_plugin->i_vlc );
#endif #endif /* USE_LIBVLC */
p_plugin->i_vlc = 0; p_plugin->i_vlc = 0;
} }
...@@ -509,7 +513,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) ...@@ -509,7 +513,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window )
vlc_value_t valueporty; vlc_value_t valueporty;
Rect black_rect; Rect black_rect;
char * text; char * text;
#endif #endif /* XP_MACOSX */
if( instance == NULL ) if( instance == NULL )
{ {
...@@ -569,13 +573,13 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) ...@@ -569,13 +573,13 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window )
DrawText( text , 0 , strlen(text) ); DrawText( text , 0 , strlen(text) );
free(text); free(text);
#else #else /* XP_MACOSX */
/* FIXME: this cast sucks */ /* FIXME: this cast sucks */
value.i_int = (int) (ptrdiff_t) (void *) window->window; value.i_int = (int) (ptrdiff_t) (void *) window->window;
VLC_VariableSet( p_plugin->i_vlc, "drawable", value ); VLC_VariableSet( p_plugin->i_vlc, "drawable", value );
#endif #endif /* XP_MACOSX */
#endif #endif /* USE_LIBVLC */
/* /*
* PLUGIN DEVELOPERS: * PLUGIN DEVELOPERS:
...@@ -594,7 +598,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) ...@@ -594,7 +598,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window )
#if !USE_LIBVLC #if !USE_LIBVLC
SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC, SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC,
(LONG)p_plugin->pf_wndproc ); (LONG)p_plugin->pf_wndproc );
#endif #endif /* !USE_LIBVLC */
p_plugin->pf_wndproc = NULL; p_plugin->pf_wndproc = NULL;
p_plugin->p_hwnd = NULL; p_plugin->p_hwnd = NULL;
} }
...@@ -615,7 +619,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) ...@@ -615,7 +619,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window )
#if !USE_LIBVLC #if !USE_LIBVLC
InvalidateRect( p_plugin->p_hwnd, NULL, TRUE ); InvalidateRect( p_plugin->p_hwnd, NULL, TRUE );
UpdateWindow( p_plugin->p_hwnd ); UpdateWindow( p_plugin->p_hwnd );
#endif #endif /* !USE_LIBVLC */
return NPERR_NO_ERROR; return NPERR_NO_ERROR;
} }
...@@ -624,7 +628,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) ...@@ -624,7 +628,7 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window )
#if !USE_LIBVLC #if !USE_LIBVLC
SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC, SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC,
(LONG)p_plugin->pf_wndproc ); (LONG)p_plugin->pf_wndproc );
#endif #endif /* !USE_LIBVLC */
p_plugin->pf_wndproc = NULL; p_plugin->pf_wndproc = NULL;
p_plugin->p_hwnd = NULL; p_plugin->p_hwnd = NULL;
} }
...@@ -632,28 +636,32 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) ...@@ -632,28 +636,32 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window )
#if !USE_LIBVLC #if !USE_LIBVLC
p_plugin->pf_wndproc = (WNDPROC)SetWindowLong( (HWND)window->window, p_plugin->pf_wndproc = (WNDPROC)SetWindowLong( (HWND)window->window,
GWL_WNDPROC, (LONG)Manage ); GWL_WNDPROC, (LONG)Manage );
#endif #endif /* !USE_LIBVLC */
p_plugin->p_hwnd = (HWND)window->window; p_plugin->p_hwnd = (HWND)window->window;
SetProp( p_plugin->p_hwnd, "w00t", (HANDLE)p_plugin ); SetProp( p_plugin->p_hwnd, "w00t", (HANDLE)p_plugin );
InvalidateRect( p_plugin->p_hwnd, NULL, TRUE ); InvalidateRect( p_plugin->p_hwnd, NULL, TRUE );
UpdateWindow( p_plugin->p_hwnd ); UpdateWindow( p_plugin->p_hwnd );
#endif #endif /* XP_WIN */
p_plugin->i_width = window->width;
p_plugin->i_height = window->height;
p_plugin->p_npwin = window;
#ifdef XP_UNIX #ifdef XP_UNIX
p_plugin->window = (Window) window->window; p_plugin->window = (Window) window->window;
p_plugin->p_display = ((NPSetWindowCallbackStruct *)window->ws_info)->display; p_plugin->p_display =
((NPSetWindowCallbackStruct *)window->ws_info)->display;
XResizeWindow( p_plugin->p_display, p_plugin->window,
p_plugin->i_width, p_plugin->i_height );
Widget w = XtWindowToWidget( p_plugin->p_display, p_plugin->window ); Widget w = XtWindowToWidget( p_plugin->p_display, p_plugin->window );
XtAddEventHandler( w, ExposureMask, FALSE, XtAddEventHandler( w, ExposureMask, FALSE,
(XtEventHandler)Redraw, p_plugin ); (XtEventHandler)Redraw, p_plugin );
XtAddEventHandler( w, StructureNotifyMask, FALSE,
(XtEventHandler)Resize, p_plugin );
Redraw( w, (XtPointer)p_plugin, NULL ); Redraw( w, (XtPointer)p_plugin, NULL );
#endif #endif /* XP_UNIX */
p_plugin->p_npwin = window;
p_plugin->i_width = window->width;
p_plugin->i_height = window->height;
if( !p_plugin->b_stream ) if( !p_plugin->b_stream )
{ {
...@@ -770,7 +778,7 @@ void NPP_StreamAsFile( NPP instance, NPStream *stream, const char* fname ) ...@@ -770,7 +778,7 @@ void NPP_StreamAsFile( NPP instance, NPStream *stream, const char* fname )
VLC_AddTarget( p_plugin->i_vlc, fname, 0, 0, VLC_AddTarget( p_plugin->i_vlc, fname, 0, 0,
PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END ); PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
#endif #endif /* USE_LIBVLC */
} }
...@@ -884,7 +892,7 @@ LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpar ) ...@@ -884,7 +892,7 @@ LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpar )
} }
return 0; return 0;
} }
#endif #endif /* XP_WIN */
/****************************************************************************** /******************************************************************************
* UNIX-only methods * UNIX-only methods
...@@ -911,5 +919,74 @@ static void Redraw( Widget w, XtPointer closure, XEvent *event ) ...@@ -911,5 +919,74 @@ static void Redraw( Widget w, XtPointer closure, XEvent *event )
XFreeGC( p_plugin->p_display, gc ); XFreeGC( p_plugin->p_display, gc );
} }
#endif
static void Resize ( Widget w, XtPointer closure, XEvent *event )
{
VlcPlugin* p_plugin = (VlcPlugin*)closure;
int i_ret;
Window root_return, parent_return, * children_return;
Window base_window;
unsigned int i_nchildren;
#ifdef X11_RESIZE_DEBUG
XWindowAttributes attr;
if( event && event->type == ConfigureNotify )
{
fprintf( stderr, "vlcshell::Resize() ConfigureNotify %d x %d, "
"send_event ? %s\n", event->xconfigure.width,
event->xconfigure.height,
event->xconfigure.send_event ? "TRUE" : "FALSE" );
}
#endif /* X11_RESIZE_DEBUG */
i_ret = XResizeWindow( p_plugin->p_display, p_plugin->window,
p_plugin->i_width, p_plugin->i_height );
#ifdef X11_RESIZE_DEBUG
fprintf( stderr,
"vlcshell::Resize() XResizeWindow(owner) returned %d\n", i_ret );
XGetWindowAttributes ( p_plugin->p_display, p_plugin->window, &attr );
/* X is asynchronous, so the current size reported here is not
necessarily the requested size as the Resize request may not
yet have been handled by the plugin host */
fprintf( stderr, "vlcshell::Resize() current (owner) size %d x %d\n",
attr.width, attr.height );
#endif /* X11_RESIZE_DEBUG */
XQueryTree( p_plugin->p_display, p_plugin->window,
&root_return, &parent_return, &children_return,
&i_nchildren );
if( i_nchildren > 0 )
{
/* XXX: Make assumptions related to the window parenting structure in
vlc/modules/video_output/x11/xcommon.c */
base_window = children_return[i_nchildren - 1];
#ifdef X11_RESIZE_DEBUG
fprintf( stderr, "vlcshell::Resize() got %d children\n", i_nchildren );
fprintf( stderr, "vlcshell::Resize() got base_window %p\n",
base_window );
#endif /* X11_RESIZE_DEBUG */
i_ret = XResizeWindow( p_plugin->p_display, base_window,
p_plugin->i_width, p_plugin->i_height );
#ifdef X11_RESIZE_DEBUG
fprintf( stderr,
"vlcshell::Resize() XResizeWindow(base) returned %d\n",
i_ret );
XGetWindowAttributes( p_plugin->p_display, base_window, &attr );
fprintf( stderr, "vlcshell::Resize() new size %d x %d\n",
attr.width, attr.height );
#endif /* X11_RESIZE_DEBUG */
}
}
#endif /* XP_UNIX */
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