X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mozilla%2Fvlcshell.cpp;h=c5be39751c4c893ffd74fec33caf92cef8f71e62;hb=1591dec08cacf0168d6008b41671d265264a7a4d;hp=bf9bed99e3044aaab77b41025946d4a48d63e7f3;hpb=eb505a2f6d699f8aa9a1774896c1d3c4f2077899;p=vlc diff --git a/mozilla/vlcshell.cpp b/mozilla/vlcshell.cpp index bf9bed99e3..c5be39751c 100644 --- a/mozilla/vlcshell.cpp +++ b/mozilla/vlcshell.cpp @@ -2,7 +2,7 @@ * vlcshell.cpp: a VLC plugin for Mozilla ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: vlcshell.cpp,v 1.15 2003/07/23 01:13:48 gbazin Exp $ + * $Id$ * * Authors: Samuel Hocevar * @@ -27,6 +27,8 @@ /***************************************************************************** * Preamble *****************************************************************************/ +#include "config.h" + #include #include #include @@ -37,14 +39,29 @@ #endif /* Mozilla stuff */ +#ifdef HAVE_MOZILLA_CONFIG_H +# include +#endif #include #include #include +#include + +#if !defined(XP_MACOSX) && !defined(XP_UNIX) && !defined(XP_WIN) +#define XP_UNIX 1 +#elif defined(XP_MACOSX) +#undef XP_UNIX +#endif #ifdef XP_WIN /* Windows stuff */ #endif +#ifdef XP_MACOSX + /* Mac OS X stuff */ +# include +#endif + #ifdef XP_UNIX /* X11 stuff */ # include @@ -52,11 +69,6 @@ # include #endif -#ifdef XP_MAC - /* Mac OS X stuff */ -# include -#endif - #include "vlcpeer.h" #include "vlcplugin.h" @@ -76,35 +88,26 @@ static void Redraw( Widget w, XtPointer closure, XEvent *event ); #endif +/***************************************************************************** + * MacOS-only declarations +******************************************************************************/ +#ifdef XP_MACOSX +# define VOUT_PLUGINS "macosx" +# define AOUT_PLUGINS "macosx" + +#endif + /***************************************************************************** * Windows-only declarations *****************************************************************************/ #ifdef XP_WIN -# define VOUT_PLUGINS "directx,dummy" -# define AOUT_PLUGINS "none" /* "directx,waveout,dummy" */ - -HINSTANCE g_hDllInstance = NULL; - -BOOL WINAPI -DllMain( HINSTANCE hinstDLL, // handle of DLL module - DWORD fdwReason, // reason for calling function - LPVOID lpvReserved) -{ - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - g_hDllInstance = hinstDLL; - break; - case DLL_THREAD_ATTACH: - case DLL_PROCESS_DETACH: - case DLL_THREAD_DETACH: - break; - } - return TRUE; -} +# define VOUT_PLUGINS "directx,wingdi,dummy" +# define AOUT_PLUGINS "directx,waveout,dummy" +#if defined(XP_WIN) && !USE_LIBVLC LRESULT CALLBACK Manage( HWND, UINT, WPARAM, LPARAM ); #endif +#endif /****************************************************************************** * UNIX-only API calls @@ -116,6 +119,7 @@ char * NPP_GetMIMEDescription( void ) NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value ) { + static nsIID nsid = VLCINTF_IID; static char psz_desc[1000]; @@ -176,23 +180,27 @@ NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value ) /****************************************************************************** * Mac-only API calls *****************************************************************************/ -#ifdef XP_MAC +#ifdef XP_MACOSX int16 NPP_HandleEvent( NPP instance, void * event ) { + VlcPlugin *p_plugin = (VlcPlugin*)instance->pdata; + vlc_value_t value; + if( instance == NULL ) { return false; } - Boolean eventHandled = false; + EventRecord *pouetEvent = (EventRecord*)event; -#if 0 - TPlugin *pPlugin = (TPlugin*)instance->pdata; - if( pPlugin != NULL && event != NULL ) + if (pouetEvent->what == 6) { - eventHandled = pPlugin->HandleEvent( *(EventRecord*)event ); + value.i_int = 1; + VLC_VariableSet( p_plugin->i_vlc, "drawableredraw", value ); + return true; } -#endif + + Boolean eventHandled = false; return eventHandled; } @@ -220,15 +228,11 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved ) { int i; + #if USE_LIBVLC vlc_value_t value; int i_ret; - char *ppsz_foo[] = - { - "vlc" - /*, "--plugin-path", "/home/sam/videolan/vlc_MAIN/plugins"*/ - }; #endif if( instance == NULL ) @@ -270,7 +274,64 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, return NPERR_GENERIC_ERROR; } - i_ret = VLC_Init( p_plugin->i_vlc, sizeof(ppsz_foo)/sizeof(char*), ppsz_foo ); + { +#ifdef XP_MACOSX + char *home_user; + char *directory; + char *plugin_path; + char *ppsz_argv[] = { "vlc", "--plugin-path", NULL }; + + home_user = strdup( getenv("HOME") ); + directory = strdup( "/Library/Internet Plug-Ins/VLC Plugin.plugin/" + "Contents/MacOS/modules" ); + plugin_path = malloc( strlen( directory ) + strlen( home_user ) ); + memcpy( plugin_path , home_user , strlen(home_user) ); + memcpy( plugin_path + strlen( home_user ) , directory , + strlen( directory ) ); + + ppsz_argv[2] = plugin_path; + +#elif defined(XP_WIN) + char *ppsz_argv[] = { NULL, "-vv" }; + HKEY h_key; + DWORD i_type, i_data = MAX_PATH + 1; + char p_data[MAX_PATH + 1]; + if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\VideoLAN\\VLC", + 0, KEY_READ, &h_key ) == ERROR_SUCCESS ) + { + if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type, + (LPBYTE)p_data, &i_data ) == ERROR_SUCCESS ) + { + if( i_type == REG_SZ ) + { + strcat( p_data, "\\vlc" ); + ppsz_argv[0] = p_data; + } + } + RegCloseKey( h_key ); + } + + if( !ppsz_argv[0] ) ppsz_argv[0] = "vlc"; + +#else + char *ppsz_argv[] = + { + "vlc" + /*, "--plugin-path", "/home/sam/videolan/vlc_MAIN/plugins"*/ + }; + +#endif + + i_ret = VLC_Init( p_plugin->i_vlc, sizeof(ppsz_argv)/sizeof(char*), + ppsz_argv ); + +#ifdef XP_MACOSX + free( home_user ); + free( directory ); + free( plugin_path ); +#endif + } + if( i_ret ) { VLC_Destroy( p_plugin->i_vlc ); @@ -281,11 +342,11 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, } value.psz_string = "dummy"; - VLC_Set( p_plugin->i_vlc, "conf::intf", value ); + VLC_VariableSet( p_plugin->i_vlc, "conf::intf", value ); value.psz_string = VOUT_PLUGINS; - VLC_Set( p_plugin->i_vlc, "conf::vout", value ); + VLC_VariableSet( p_plugin->i_vlc, "conf::vout", value ); value.psz_string = AOUT_PLUGINS; - VLC_Set( p_plugin->i_vlc, "conf::aout", value ); + VLC_VariableSet( p_plugin->i_vlc, "conf::aout", value ); #else p_plugin->i_vlc = 1; @@ -331,7 +392,22 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, if( !strcmp( argv[i], "yes" ) ) { value.b_bool = VLC_TRUE; - VLC_Set( p_plugin->i_vlc, "conf::loop", value ); + VLC_VariableSet( p_plugin->i_vlc, "conf::loop", value ); + } + } + else if( !strcmp( argn[i], "fullscreen" ) ) + { + if( !strcmp( argv[i], "yes" ) ) + { + value.b_bool = VLC_TRUE; + VLC_VariableSet( p_plugin->i_vlc, "conf::fullscreen", value ); + } + } + else if( !strcmp( argn[i], "mute" ) ) + { + if( !strcmp( argv[i], "yes" ) ) + { + VLC_VolumeMute( p_plugin->i_vlc ); } } #endif @@ -345,6 +421,37 @@ NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, return NPERR_NO_ERROR; } +#ifdef XP_WIN +/* This is really ugly but there is a deadlock when stopping a stream + * (in VLC_CleanUp()) because the video output is a child of the drawable but + * is in a different thread. */ +static void HackStopVout( VlcPlugin* p_plugin ) +{ + MSG msg; + HWND hwnd; + vlc_value_t value; + + VLC_VariableGet( p_plugin->i_vlc, "drawable", &value ); + + hwnd = FindWindowEx( (HWND)value.i_int, 0, 0, 0 ); + if( !hwnd ) return; + + PostMessage( hwnd, WM_CLOSE, 0, 0 ); + + do + { + fprintf( stderr, "FindWindow: %p\n", hwnd ); + while( PeekMessage( &msg, (HWND)value.i_int, 0, 0, PM_REMOVE ) ) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if( FindWindowEx( (HWND)value.i_int, 0, 0, 0 ) ) Sleep( 10 ); + } + while( (hwnd = FindWindowEx( (HWND)value.i_int, 0, 0, 0 )) ); +} +#endif + NPError NPP_Destroy( NPP instance, NPSavedData** save ) { if( instance == NULL ) @@ -359,7 +466,10 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save ) if( p_plugin->i_vlc ) { #if USE_LIBVLC - VLC_Stop( p_plugin->i_vlc ); +# ifdef XP_WIN + HackStopVout( p_plugin ); +# endif + VLC_CleanUp( p_plugin->i_vlc ); VLC_Destroy( p_plugin->i_vlc ); #endif p_plugin->i_vlc = 0; @@ -381,6 +491,22 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save ) NPError NPP_SetWindow( NPP instance, NPWindow* window ) { + vlc_value_t value; +#ifdef XP_MACOSX + vlc_value_t valuex; + vlc_value_t valuey; + vlc_value_t valuew; + vlc_value_t valueh; + vlc_value_t valuet; + vlc_value_t valuel; + vlc_value_t valueb; + vlc_value_t valuer; + vlc_value_t valueportx; + vlc_value_t valueporty; + Rect black_rect; + char * text; +#endif + if( instance == NULL ) { return NPERR_INVALID_INSTANCE_ERROR; @@ -390,11 +516,61 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) /* Write the window ID for vlc */ #if USE_LIBVLC - vlc_value_t value; +#ifdef XP_MACOSX + value.i_int = ((NP_Port*) (window->window))->port; + VLC_VariableSet( p_plugin->i_vlc, "drawable", value ); + + valueportx.i_int = ((NP_Port*) (window->window))->portx; + valueporty.i_int = ((NP_Port*) (window->window))->porty; + VLC_VariableSet( p_plugin->i_vlc, "drawableportx", valueportx ); + VLC_VariableSet( p_plugin->i_vlc, "drawableporty", valueporty ); + + valuex.i_int = window->x; + valuey.i_int = window->y; + valuew.i_int = window->width; + valueh.i_int = window->height; + valuet.i_int = window->clipRect.top; + valuel.i_int = window->clipRect.left; + valueb.i_int = window->clipRect.bottom; + valuer.i_int = window->clipRect.right; + + VLC_VariableSet( p_plugin->i_vlc, "drawablet", valuet ); + VLC_VariableSet( p_plugin->i_vlc, "drawablel", valuel ); + VLC_VariableSet( p_plugin->i_vlc, "drawableb", valueb ); + VLC_VariableSet( p_plugin->i_vlc, "drawabler", valuer ); + VLC_VariableSet( p_plugin->i_vlc, "drawablex", valuex ); + VLC_VariableSet( p_plugin->i_vlc, "drawabley", valuey ); + VLC_VariableSet( p_plugin->i_vlc, "drawablew", valuew ); + VLC_VariableSet( p_plugin->i_vlc, "drawableh", valueh ); + + p_plugin->window = window; + + /* draw the beautiful "No Picture" */ + + black_rect.top = valuet.i_int - valuey.i_int; + black_rect.left = valuel.i_int - valuex.i_int; + black_rect.bottom = valueb.i_int - valuey.i_int; + black_rect.right = valuer.i_int - valuex.i_int; + + SetPort( value.i_int ); + SetOrigin( valueportx.i_int , valueporty.i_int ); + ForeColor(blackColor); + PenMode( patCopy ); + PaintRect( &black_rect ); + + ForeColor(whiteColor); + text = strdup( WINDOW_TEXT ); + MoveTo( valuew.i_int / 2 - 40 , valueh.i_int / 2 ); + DrawText( text , 0 , strlen(text) ); + free(text); + +#else /* FIXME: this cast sucks */ value.i_int = (int) (ptrdiff_t) (void *) window->window; - VLC_Set( p_plugin->i_vlc, "drawable", value ); + VLC_VariableSet( p_plugin->i_vlc, "drawable", value ); +#endif + #endif /* @@ -411,8 +587,10 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) /* Window was destroyed. Invalidate everything. */ if( p_plugin->p_npwin ) { +#if !USE_LIBVLC SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC, (LONG)p_plugin->pf_wndproc ); +#endif p_plugin->pf_wndproc = NULL; p_plugin->p_hwnd = NULL; } @@ -427,24 +605,31 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) { /* Same window, but something may have changed. First we * update the plugin structure, then we redraw the window */ - InvalidateRect( p_plugin->p_hwnd, NULL, TRUE ); p_plugin->i_width = window->width; p_plugin->i_height = window->height; p_plugin->p_npwin = window; +#if !USE_LIBVLC + InvalidateRect( p_plugin->p_hwnd, NULL, TRUE ); UpdateWindow( p_plugin->p_hwnd ); +#endif return NPERR_NO_ERROR; } /* Window has changed. Destroy the one we have, and go * on as if it was a real initialization. */ +#if !USE_LIBVLC SetWindowLong( p_plugin->p_hwnd, GWL_WNDPROC, (LONG)p_plugin->pf_wndproc ); +#endif p_plugin->pf_wndproc = NULL; p_plugin->p_hwnd = NULL; } +#if !USE_LIBVLC p_plugin->pf_wndproc = (WNDPROC)SetWindowLong( (HWND)window->window, GWL_WNDPROC, (LONG)Manage ); +#endif + p_plugin->p_hwnd = (HWND)window->window; SetProp( p_plugin->p_hwnd, "w00t", (HANDLE)p_plugin ); InvalidateRect( p_plugin->p_hwnd, NULL, TRUE ); @@ -666,14 +851,13 @@ void NPP_Print( NPP instance, NPPrint* printInfo ) /****************************************************************************** * Windows-only methods *****************************************************************************/ -#ifdef XP_WIN +#if defined(XP_WIN) && !USE_LIBVLC LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpar ) { VlcPlugin* p_plugin = (VlcPlugin*) GetProp( p_hwnd, "w00t" ); switch( i_msg ) { -#if !USE_LIBVLC case WM_PAINT: { PAINTSTRUCT paintstruct; @@ -690,7 +874,6 @@ LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpar ) EndPaint( p_hwnd, &paintstruct ); break; } -#endif default: p_plugin->pf_wndproc( p_hwnd, i_msg, wpar, lpar ); break;