X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=projects%2Fmozilla%2Fvlcshell.cpp;h=829ae7a5da3de60cb804dcad00420dbf83defa36;hb=f659703fb4033420e0607d34bc7cd880a5802ea7;hp=13696ac59505d4d0f0748de1f90b50c68b78c754;hpb=900e1dcdd57e1755b085cca4ab7d0078e261f363;p=vlc diff --git a/projects/mozilla/vlcshell.cpp b/projects/mozilla/vlcshell.cpp index 13696ac595..829ae7a5da 100644 --- a/projects/mozilla/vlcshell.cpp +++ b/projects/mozilla/vlcshell.cpp @@ -1,10 +1,11 @@ /***************************************************************************** * vlcshell.cpp: a VLC plugin for Mozilla ***************************************************************************** - * Copyright (C) 2002-2005 the VideoLAN team + * Copyright (C) 2002-2009 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar + * Jean-Paul Saman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,27 +31,16 @@ #include #include -/* Mozilla stuff */ -#ifdef HAVE_MOZILLA_CONFIG_H -# include -#endif - -/* This is from mozilla java, do we really need it? */ -#if 0 -#include -#endif - #include "vlcplugin.h" +#include "vlcshell.h" /* Enable/disable debugging printf's for X11 resizing */ #undef X11_RESIZE_DEBUG -#define WINDOW_TEXT "Video is loading..." - /***************************************************************************** * Unix-only declarations ******************************************************************************/ -#ifdef XP_UNIX +#if defined(XP_UNIX) static void Redraw( Widget w, XtPointer closure, XEvent *event ); static void ControlHandler( Widget w, XtPointer closure, XEvent *event ); @@ -78,24 +68,25 @@ static LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpa *****************************************************************************/ char * NPP_GetMIMEDescription( void ) { - return PLUGIN_MIMETYPES; + static char mimetype[] = PLUGIN_MIMETYPES; + return mimetype; } NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value ) { - + static char psz_name[] = PLUGIN_NAME; static char psz_desc[1000]; /* plugin class variables */ switch( variable ) { case NPPVpluginNameString: - *((char **)value) = PLUGIN_NAME; + *((char **)value) = psz_name; return NPERR_NO_ERROR; case NPPVpluginDescriptionString: snprintf( psz_desc, sizeof(psz_desc), PLUGIN_DESCRIPTION, - VLC_Version() ); + libvlc_get_version() ); *((char **)value) = psz_desc; return NPERR_NO_ERROR; @@ -114,7 +105,7 @@ NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value ) VlcPlugin* p_plugin = reinterpret_cast(instance->pdata); if( NULL == p_plugin ) { - // plugin has not been initialized yet ! + /* plugin has not been initialized yet ! */ return NPERR_INVALID_INSTANCE_ERROR; } @@ -153,22 +144,21 @@ NPError NPP_SetValue( NPP instance, NPNVariable variable, void *value ) * Mac-only API calls *****************************************************************************/ #ifdef XP_MACOSX -int16 NPP_HandleEvent( NPP instance, void * event ) +int16_t NPP_HandleEvent( NPP instance, void * event ) { static UInt32 lastMouseUp = 0; - if( instance == NULL ) { return false; } - VlcPlugin *p_plugin = (VlcPlugin*)instance->pdata; - + VlcPlugin* p_plugin = reinterpret_cast(instance->pdata); if( p_plugin == NULL ) { return false; } +#ifndef __x86_64__ EventRecord *myEvent = (EventRecord*)event; switch( myEvent->what ) @@ -180,21 +170,7 @@ int16 NPP_HandleEvent( NPP instance, void * event ) if( (myEvent->when - lastMouseUp) < GetDblTime() ) { /* double click */ - libvlc_instance_t *p_vlc = p_plugin->getVLC(); - - if( p_vlc ) - { - if( libvlc_playlist_isplaying(p_vlc, NULL) ) - { - libvlc_media_instance_t *p_md = - libvlc_playlist_get_media_instance(p_vlc, NULL); - if( p_md ) - { - libvlc_toggle_fullscreen(p_md, NULL); - libvlc_media_instance_release(p_md); - } - } - } + p_plugin->toggle_fullscreen(); } return true; } @@ -210,38 +186,29 @@ int16 NPP_HandleEvent( NPP instance, void * event ) const NPWindow& npwindow = p_plugin->getWindow(); if( npwindow.window ) { - int hasVout = FALSE; - libvlc_instance_t *p_vlc = p_plugin->getVLC(); + bool hasVout = false; - if( p_vlc ) + if( p_plugin->playlist_isplaying() ) { - if( libvlc_playlist_isplaying(p_vlc, NULL) ) + hasVout = p_plugin->player_has_vout(); +#if 0 + if( hasVout ) { - libvlc_media_instance_t *p_md = - libvlc_playlist_get_media_instance(p_vlc, NULL); - if( p_md ) - { - hasVout = libvlc_media_instance_has_vout(p_md, - NULL); - if( hasVout ) - { - libvlc_rectangle_t area; - area.left = 0; - area.top = 0; - area.right = npwindow.width; - area.bottom = npwindow.height; - libvlc_video_redraw_rectangle(p_md, &area, - NULL); - } - libvlc_media_instance_release(p_md); - } + libvlc_rectangle_t area; + area.left = 0; + area.top = 0; + area.right = npwindow.width; + area.bottom = npwindow.height; + libvlc_video_redraw_rectangle(p_plugin->getMD(), &area, NULL); } +#else +#warning disabled code +#endif } if( ! hasVout ) { - /* draw the beautiful "No Picture" */ - + /* draw the text from p_plugin->psz_text */ ForeColor(blackColor); PenMode( patCopy ); @@ -259,7 +226,8 @@ int16 NPP_HandleEvent( NPP instance, void * event ) ForeColor(whiteColor); MoveTo( (npwindow.width-80)/ 2 , npwindow.height / 2 ); - DrawText( WINDOW_TEXT , 0 , strlen(WINDOW_TEXT) ); + if( p_plugin->psz_text ) + DrawText( p_plugin->psz_text, 0, strlen(p_plugin->psz_text) ); } } return true; @@ -282,6 +250,7 @@ int16 NPP_HandleEvent( NPP instance, void * event ) default: ; } +#endif // __x86_64__ return false; } #endif /* XP_MACOSX */ @@ -294,17 +263,24 @@ NPError NPP_Initialize( void ) return NPERR_NO_ERROR; } +#ifdef OJI jref NPP_GetJavaClass( void ) { return NULL; } +#endif void NPP_Shutdown( void ) { ; } -NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, +NPError NPP_New( NPMIMEType pluginType, NPP instance, +#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20) + uint16 mode, int16 argc, +#else + uint16_t mode, int16_t argc, +#endif char* argn[], char* argv[], NPSavedData* saved ) { NPError status; @@ -347,7 +323,7 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save ) instance->pdata = NULL; -#if XP_WIN +#if defined(XP_WIN) HWND win = (HWND)p_plugin->getWindow().window; WNDPROC winproc = p_plugin->getWindowProc(); if( winproc ) @@ -357,6 +333,9 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save ) } #endif + if( p_plugin->playlist_isplaying() ) + p_plugin->playlist_stop(); + delete p_plugin; return NPERR_NO_ERROR; @@ -364,8 +343,10 @@ NPError NPP_Destroy( NPP instance, NPSavedData** save ) NPError NPP_SetWindow( NPP instance, NPWindow* window ) { +#if defined(XP_UNIX) Window control; unsigned int i_control_height = 0, i_control_width = 0; +#endif if( ! instance ) { @@ -379,7 +360,10 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) /* we should probably show a splash screen here */ return NPERR_NO_ERROR; } + +#if defined(XP_UNIX) control = p_plugin->getControlWindow(); +#endif libvlc_instance_t *p_vlc = p_plugin->getVLC(); @@ -399,11 +383,6 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) { /* check if plugin has a new parent window */ CGrafPtr drawable = (((NP_Port*) (window->window))->port); - if( !curwin.window || drawable != (((NP_Port*) (curwin.window))->port) ) - { - /* set/change parent window */ - libvlc_video_set_parent(p_vlc, (libvlc_drawable_t)drawable, NULL); - } /* as MacOS X video output is windowless, set viewport */ libvlc_rectangle_t view, clip; @@ -417,20 +396,23 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) view.left = ((NP_Port*) (window->window))->portx; view.bottom = window->height+view.top; view.right = window->width+view.left; + /* clipRect coordinates are also relative to GrafPort */ clip.top = window->clipRect.top; clip.left = window->clipRect.left; clip.bottom = window->clipRect.bottom; clip.right = window->clipRect.right; - - libvlc_video_set_viewport(p_vlc, &view, &clip, NULL); - +#ifdef NOT_WORKING + libvlc_video_set_viewport(p_vlc, p_plugin->getMD(), &view, &clip); +#else +#warning disabled code +#endif /* remember new window */ p_plugin->setWindow(*window); } - else if( curwin.window ) { + else if( curwin.window ) + { /* change/set parent */ - libvlc_video_set_parent(p_vlc, 0, NULL); curwin.window = NULL; } #endif /* XP_MACOSX */ @@ -463,9 +445,6 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS; SetWindowLong((HWND)drawable, GWL_STYLE, style); - /* change/set parent */ - libvlc_video_set_parent(p_vlc, (libvlc_drawable_t)drawable, NULL); - /* remember new window */ p_plugin->setWindow(*window); @@ -474,31 +453,27 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) UpdateWindow( (HWND)drawable ); } } - else if ( curwin.window ) + else if( curwin.window ) { /* reset WNDPROC */ HWND oldwin = (HWND)curwin.window; SetWindowLong( oldwin, GWL_WNDPROC, (LONG)(p_plugin->getWindowProc()) ); p_plugin->setWindowProc(NULL); - /* change/set parent */ - libvlc_video_set_parent(p_vlc, 0, NULL); + curwin.window = NULL; } #endif /* XP_WIN */ -#ifdef XP_UNIX - if( p_plugin->b_toolbar ) - { - p_plugin->getToolbarSize( &i_control_width, &i_control_height ); - } - else - { - i_control_height = i_control_width = 0; - } +#if defined(XP_UNIX) + /* default to hidden toolbar, shown at the end of this method if asked * + * developers note : getToolbarSize need to wait the end of this method + */ + i_control_height = 0; + i_control_width = window->width; if( window && window->window ) { - Window parent = (Window) window->window; + Window parent = (Window) window->window; if( !curwin.window || (parent != (Window)curwin.window) ) { Display *p_display = ( (NPSetWindowCallbackStruct *) @@ -513,13 +488,10 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) window->width, window->height - i_control_height, 0, i_blackColor, i_blackColor ); Window controls = (Window) NULL; - if( p_plugin->b_toolbar ) - { - controls = XCreateSimpleWindow( p_display, parent, - 0, window->height - i_control_height-1, - window->width, i_control_height-1, - 0, i_blackColor, i_blackColor ); - } + controls = XCreateSimpleWindow( p_display, parent, + 0, window->height - i_control_height-1, + window->width, i_control_height-1, + 0, i_blackColor, i_blackColor ); XMapWindow( p_display, parent ); XMapWindow( p_display, video ); @@ -537,33 +509,26 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) XtAddEventHandler( w, ButtonReleaseMask, FALSE, (XtEventHandler)ControlHandler, p_plugin ); - /* callback */ -/* - libvlc_media_instance_t *p_md; - - libvlc_exception_t ex; - libvlc_exception_init(& ex ); - p_md = libvlc_playlist_get_media_instance( p_plugin->getVLC(), &ex ); - libvlc_exception_init( &ex ); - libvlc_event_attach( libvlc_media_instance_event_manager( p_md, &ex ), - libvlc_MediaInstancePositionChanged, Redraw, NULL, &ex ); -*/ - - /* set/change parent window */ - libvlc_video_set_parent( p_vlc, (libvlc_drawable_t) video, NULL ); - /* remember window */ p_plugin->setWindow( *window ); p_plugin->setVideoWindow( video ); - if( controls ) { p_plugin->setControlWindow( controls ); } + + if( controls ) + { + p_plugin->setControlWindow( controls ); + } Redraw( w, (XtPointer)p_plugin, NULL ); + + /* now display toolbar if asked through parameters */ + if( p_plugin->b_toolbar ) + { + p_plugin->showToolbar(); + } } } - else if ( curwin.window ) + else if( curwin.window ) { - /* change/set parent */ - libvlc_video_set_parent(p_vlc, 0, NULL); curwin.window = NULL; } #endif /* XP_UNIX */ @@ -572,22 +537,25 @@ NPError NPP_SetWindow( NPP instance, NPWindow* window ) { if( p_plugin->psz_target ) { - if( libvlc_playlist_add( p_vlc, p_plugin->psz_target, - NULL, NULL ) != -1 ) + if( p_plugin->playlist_add( p_plugin->psz_target ) != -1 ) { if( p_plugin->b_autoplay ) { - libvlc_playlist_play(p_vlc, 0, 0, NULL, NULL); + p_plugin->playlist_play(); } } - p_plugin->b_stream = VLC_TRUE; + p_plugin->b_stream = true; } } return NPERR_NO_ERROR; } NPError NPP_NewStream( NPP instance, NPMIMEType type, NPStream *stream, +#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20) NPBool seekable, uint16 *stype ) +#else + NPBool seekable, uint16_t *stype ) +#endif { if( NULL == instance ) { @@ -616,21 +584,28 @@ NPError NPP_NewStream( NPP instance, NPMIMEType type, NPStream *stream, return NPERR_GENERIC_ERROR; } +#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20) int32 NPP_WriteReady( NPP instance, NPStream *stream ) +#else +int32_t NPP_WriteReady( NPP instance, NPStream *stream ) +#endif { /* TODO */ return 8*1024; } - +#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20) int32 NPP_Write( NPP instance, NPStream *stream, int32 offset, int32 len, void *buffer ) +#else +int32_t NPP_Write( NPP instance, NPStream *stream, int32_t offset, + int32_t len, void *buffer ) +#endif { /* TODO */ return len; } - NPError NPP_DestroyStream( NPP instance, NPStream *stream, NPError reason ) { if( instance == NULL ) @@ -640,7 +615,6 @@ NPError NPP_DestroyStream( NPP instance, NPStream *stream, NPError reason ) return NPERR_NO_ERROR; } - void NPP_StreamAsFile( NPP instance, NPStream *stream, const char* fname ) { if( instance == NULL ) @@ -654,17 +628,15 @@ void NPP_StreamAsFile( NPP instance, NPStream *stream, const char* fname ) return; } - if( libvlc_playlist_add( p_plugin->getVLC(), fname, stream->url, NULL ) - != -1 ) + if( p_plugin->playlist_add( stream->url ) != -1 ) { if( p_plugin->b_autoplay ) { - libvlc_playlist_play( p_plugin->getVLC(), 0, 0, NULL, NULL); + p_plugin->playlist_play(); } } } - void NPP_URLNotify( NPP instance, const char* url, NPReason reason, void* notifyData ) { @@ -675,7 +647,6 @@ void NPP_URLNotify( NPP instance, const char* url, \*********************************************/ } - void NPP_Print( NPP instance, NPPrint* printInfo ) { if( printInfo == NULL ) @@ -746,7 +717,7 @@ void NPP_Print( NPP instance, NPPrint* printInfo ) /****************************************************************************** * Windows-only methods *****************************************************************************/ -#if XP_WIN +#if defined(XP_WIN) static LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpar ) { VlcPlugin* p_plugin = reinterpret_cast(GetWindowLongPtr(p_hwnd, GWLP_USERDATA)); @@ -769,8 +740,9 @@ static LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpa FillRect( hdc, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH) ); SetTextColor(hdc, RGB(255, 255, 255)); SetBkColor(hdc, RGB(0, 0, 0)); - DrawText( hdc, WINDOW_TEXT, strlen(WINDOW_TEXT), &rect, - DT_CENTER|DT_VCENTER|DT_SINGLELINE); + if( p_plugin->psz_text ) + DrawText( hdc, p_plugin->psz_text, strlen(p_plugin->psz_text), &rect, + DT_CENTER|DT_VCENTER|DT_SINGLELINE); EndPaint( p_hwnd, &paintstruct ); return 0L; @@ -786,7 +758,7 @@ static LRESULT CALLBACK Manage( HWND p_hwnd, UINT i_msg, WPARAM wpar, LPARAM lpa /****************************************************************************** * UNIX-only methods *****************************************************************************/ -#ifdef XP_UNIX +#if defined(XP_UNIX) static void Redraw( Widget w, XtPointer closure, XEvent *event ) { VlcPlugin* p_plugin = reinterpret_cast(closure); @@ -797,10 +769,7 @@ static void Redraw( Widget w, XtPointer closure, XEvent *event ) unsigned int i_control_height, i_control_width; if( p_plugin->b_toolbar ) - { - p_plugin->showToolbar(); p_plugin->getToolbarSize( &i_control_width, &i_control_height ); - } else i_control_height = i_control_width = 0; @@ -816,16 +785,13 @@ static void Redraw( Widget w, XtPointer closure, XEvent *event ) gcv.foreground = WhitePixel( p_display, 0 ); XChangeGC( p_display, gc, GCForeground, &gcv ); - XDrawString( p_display, video, gc, - window.width / 2 - 40, (window.height - i_control_height) / 2, - WINDOW_TEXT, strlen(WINDOW_TEXT) ); + if( p_plugin->psz_text ) + XDrawString( p_display, video, gc, + window.width / 2 - 40, (window.height - i_control_height) / 2, + p_plugin->psz_text, strlen(p_plugin->psz_text) ); XFreeGC( p_display, gc ); - if( p_plugin->b_toolbar ) - { - p_plugin->redrawToolbar(); - p_plugin->hideToolbar(); - } + p_plugin->redrawToolbar(); } static void ControlHandler( Widget w, XtPointer closure, XEvent *event ) @@ -840,81 +806,71 @@ static void ControlHandler( Widget w, XtPointer closure, XEvent *event ) if( p_plugin && p_plugin->b_toolbar ) { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_instance_t *p_md = - libvlc_playlist_get_media_instance(p_plugin->getVLC(), &ex); - libvlc_exception_clear( &ex ); + int i_playing; + + libvlc_media_player_t *p_md = p_plugin->getMD(); - /* jump in the movie */ - if( i_yPos <= (i_height-30) ) + i_playing = p_plugin->playlist_isplaying(); + + vlc_toolbar_clicked_t clicked; + clicked = p_plugin->getToolbarButtonClicked( i_xPos, i_yPos ); + switch( clicked ) { - /* if a movie is loaded */ - if( p_md ) + case clicked_Play: + case clicked_Pause: + { + if( i_playing == 1 ) + p_plugin->playlist_pause(); + else + p_plugin->playlist_play(); + } + break; + + case clicked_Stop: { - vlc_int64_t f_length; - libvlc_exception_init( &ex ); - f_length = libvlc_media_instance_get_length( p_md, &ex ) / 100; - libvlc_exception_clear( &ex ); + p_plugin->playlist_stop(); + } + break; - f_length = (float)f_length * - ( ((float)i_xPos-4 ) / ( ((float)i_width-8)/100) ); + case clicked_Fullscreen: + { + p_plugin->set_fullscreen( 1 ); + } + break; - libvlc_exception_init( &ex ); - libvlc_media_instance_set_time( p_md, f_length, &ex ); - libvlc_exception_clear( &ex ); + case clicked_Mute: + case clicked_Unmute: + { + if( p_md ) + libvlc_audio_toggle_mute( p_md ); } - } + break; - /* play/pause toggle */ - if( (i_yPos > (i_height-30)) && (i_xPos > 4) && (i_xPos <= 39) ) - { - int i_playing; - libvlc_exception_init( &ex ); - i_playing = libvlc_playlist_isplaying( p_plugin->getVLC(), &ex ); - libvlc_exception_clear( &ex ); - - libvlc_exception_init( &ex ); - if( i_playing == 1 ) - libvlc_playlist_pause( p_plugin->getVLC(), &ex ); - else - libvlc_playlist_play( p_plugin->getVLC(), -1, 0, NULL, &ex ); - libvlc_exception_clear( &ex ); - } + case clicked_timeline: + { + /* if a movie is loaded */ + if( p_md ) + { + int64_t f_length; + f_length = libvlc_media_player_get_length( p_md ) / 100; - /* stop */ - if( (i_yPos > (i_height-30)) && (i_xPos > 39) && (i_xPos < 67) ) - { - libvlc_exception_init( &ex ); - libvlc_playlist_stop( p_plugin->getVLC(), &ex ); - libvlc_exception_clear( &ex ); - } + f_length = (float)f_length * + ( ((float)i_xPos-4.0 ) / ( ((float)i_width-8.0)/100) ); - /* fullscreen */ - if( (i_yPos > (i_height-30)) && (i_xPos >= 67) && (i_xPos < 94) ) - { - int i_playing; - libvlc_exception_init( &ex ); - i_playing = libvlc_playlist_isplaying( p_plugin->getVLC(), &ex ); - libvlc_exception_clear( &ex ); + libvlc_media_player_set_time( p_md, f_length ); + } + } + break; - if( (i_playing == 1) && p_md ) + case clicked_Time: { - libvlc_exception_init( &ex ); - libvlc_set_fullscreen( p_md, 1, &ex ); - libvlc_exception_clear( &ex ); + /* Not implemented yet*/ } - } + break; - /* mute toggle */ - if( (i_yPos > (i_height-30)) && (i_xPos >= 94) && (i_xPos < 109)) - { - libvlc_exception_init( &ex ); - libvlc_audio_toggle_mute( p_plugin->getVLC(), &ex ); - libvlc_exception_clear( &ex ); + default: /* button_Unknown */ + break; } - - if( p_md ) libvlc_media_instance_release( p_md ); } Redraw( w, closure, event ); }