X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=projects%2Fmozilla%2Fvlcplugin.cpp;h=c1f67f0a8afbee68e1847fbffd8e14282453ad88;hb=07dabf064c1c6db9db13b62c9ea0b27c67132f68;hp=fd9dc37a263de4d1360cba6d227c1046dd033db5;hpb=03a19fdb07baa26dad95bdcaf2be58fbd9fab5ac;p=vlc diff --git a/projects/mozilla/vlcplugin.cpp b/projects/mozilla/vlcplugin.cpp index fd9dc37a26..c1f67f0a8a 100644 --- a/projects/mozilla/vlcplugin.cpp +++ b/projects/mozilla/vlcplugin.cpp @@ -1,11 +1,12 @@ /***************************************************************************** * vlcplugin.cpp: a VLC plugin for Mozilla ***************************************************************************** - * Copyright (C) 2002-2005 the VideoLAN team + * Copyright (C) 2002-2008 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar * Damien Fouilleul + * 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 @@ -32,7 +33,6 @@ #endif #include "vlcplugin.h" -#include "control/npovlc.h" #include "control/npolibvlc.h" #include @@ -44,10 +44,7 @@ VlcPlugin::VlcPlugin( NPP instance, uint16 mode ) : i_npmode(mode), b_stream(0), b_autoplay(1), - b_show_toolbar(1), -#if XP_UNIX - i_control_height(45), -#endif + b_toolbar(0), psz_target(NULL), libvlc_instance(NULL), libvlc_log(NULL), @@ -60,7 +57,17 @@ VlcPlugin::VlcPlugin( NPP instance, uint16 mode ) : #if XP_UNIX ,i_width((unsigned)-1) ,i_height((unsigned)-1) + ,i_tb_width(0) + ,i_tb_height(0) ,i_last_position(0) + ,p_btnPlay(NULL) + ,p_btnPause(NULL) + ,p_btnStop(NULL) + ,p_btnMute(NULL) + ,p_btnUnmute(NULL) + ,p_btnFullscreen(NULL) + ,p_btnTime(NULL) + ,p_timeline(NULL) #endif { memset(&npwindow, 0, sizeof(NPWindow)); @@ -110,6 +117,7 @@ NPError VlcPlugin::init(int argc, char* const argn[], char* const argv[]) ppsz_argv[ppsz_argc++] = "-vv"; ppsz_argv[ppsz_argc++] = "--no-stats"; ppsz_argv[ppsz_argc++] = "--no-media-library"; + ppsz_argv[ppsz_argc++] = "--ignore-config"; ppsz_argv[ppsz_argc++] = "--intf"; ppsz_argv[ppsz_argc++] = "dummy"; @@ -158,7 +166,8 @@ NPError VlcPlugin::init(int argc, char* const argn[], char* const argv[]) { ppsz_argv[ppsz_argc++] = "--loop"; } - else { + else + { ppsz_argv[ppsz_argc++] = "--no-loop"; } } @@ -167,17 +176,19 @@ NPError VlcPlugin::init(int argc, char* const argn[], char* const argv[]) { progid = argv[i]; } - else if( !strcmp( argn[i], "show_toolbar" ) ) + else if( !strcmp( argn[i], "toolbar" ) ) { - b_show_toolbar = boolValue(argv[i]); + b_toolbar = boolValue(argv[i]); } } + libvlc_exception_t ex; + libvlc_exception_init(&ex); - - libvlc_instance = libvlc_new(ppsz_argc, ppsz_argv, NULL); - if( ! libvlc_instance ) + libvlc_instance = libvlc_new(ppsz_argc, ppsz_argv, &ex); + if( libvlc_exception_raised(&ex) ) { + libvlc_exception_clear(&ex); return NPERR_GENERIC_ERROR; } @@ -226,53 +237,12 @@ NPError VlcPlugin::init(int argc, char* const argn[], char* const argv[]) } /* assign plugin script root class */ - if( (NULL != progid) && (!strcmp(progid, "VideoLAN.VLCPlugin.2")) ) - { - /* new APIs */ - p_scriptClass = RuntimeNPClass::getClass(); - } - else - { - /* legacy APIs */ - p_scriptClass = RuntimeNPClass::getClass(); - } + /* new APIs */ + p_scriptClass = RuntimeNPClass::getClass(); return NPERR_NO_ERROR; } -#if 0 -#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; - - int i_vlc = libvlc_get_vlc_id(p_plugin->libvlc_instance); - VLC_VariableGet( i_vlc, "drawable", &value ); - - hwnd = FindWindowEx( (HWND)value.i_int, 0, 0, 0 ); - if( !hwnd ) return; - - PostMessage( hwnd, WM_CLOSE, 0, 0 ); - - do - { - 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 /* XP_WIN */ -#endif - VlcPlugin::~VlcPlugin() { delete psz_baseURL; @@ -454,60 +424,105 @@ int VlcPlugin::setSize(unsigned width, unsigned height) return diff; } +#define BTN_SPACE ((unsigned int)4) void VlcPlugin::showToolbar() { const NPWindow& window = getWindow(); Window control = getControlWindow(); + Window video = getVideoWindow(); Display *p_display = ((NPSetWindowCallbackStruct *)window.ws_info)->display; + unsigned int i_height = 0, i_width = BTN_SPACE; /* load icons */ - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/play.xpm", - &p_btnPlay, NULL, NULL); + if( !p_btnPlay ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/play.xpm", + &p_btnPlay, NULL, NULL); if( p_btnPlay ) - i_control_height = __MAX( i_control_height, p_btnPlay->height ); - - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/pause.xpm", - &p_btnPause, NULL, NULL); + { + i_height = __MAX( i_height, p_btnPlay->height ); + } + if( !p_btnPause ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/pause.xpm", + &p_btnPause, NULL, NULL); if( p_btnPause ) - i_control_height = __MAX( i_control_height, p_btnPause->height ); + { + i_height = __MAX( i_height, p_btnPause->height ); + } + i_width += __MAX( p_btnPause->width, p_btnPlay->width ); - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/stop.xpm", - &p_btnStop, NULL, NULL ); + if( !p_btnStop ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/stop.xpm", + &p_btnStop, NULL, NULL ); if( p_btnStop ) - i_control_height = __MAX( i_control_height, p_btnStop->height ); - - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_line.xpm", - &p_timeline, NULL, NULL); + { + i_height = __MAX( i_height, p_btnStop->height ); + i_width += BTN_SPACE + p_btnStop->width; + } + if( !p_timeline ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_line.xpm", + &p_timeline, NULL, NULL); if( p_timeline ) - i_control_height = __MAX( i_control_height, p_timeline->height ); - - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_icon.xpm", - &p_btnTime, NULL, NULL); + { + i_height = __MAX( i_height, p_timeline->height ); + i_width += BTN_SPACE + p_timeline->width; + } + if( !p_btnTime ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_icon.xpm", + &p_btnTime, NULL, NULL); if( p_btnTime ) - i_control_height = __MAX( i_control_height, p_btnTime->height ); - - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/fullscreen.xpm", - &p_btnFullscreen, NULL, NULL); + { + i_height = __MAX( i_height, p_btnTime->height ); + i_width += BTN_SPACE + p_btnTime->width; + } + if( !p_btnFullscreen ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/fullscreen.xpm", + &p_btnFullscreen, NULL, NULL); if( p_btnFullscreen ) - i_control_height = __MAX( i_control_height, p_btnFullscreen->height); - - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_max.xpm", - &p_btnMute, NULL, NULL); + { + i_height = __MAX( i_height, p_btnFullscreen->height ); + i_width += BTN_SPACE + p_btnFullscreen->width; + } + if( !p_btnMute ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_max.xpm", + &p_btnMute, NULL, NULL); if( p_btnMute ) - i_control_height = __MAX( i_control_height, p_btnMute->height); - - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_mute.xpm", - &p_btnUnmute, NULL, NULL); + { + i_height = __MAX( i_height, p_btnMute->height ); + } + if( !p_btnUnmute ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_mute.xpm", + &p_btnUnmute, NULL, NULL); if( p_btnUnmute ) - i_control_height = __MAX( i_control_height, p_btnUnmute->height); + { + i_height = __MAX( i_height, p_btnUnmute->height ); + } + i_width += BTN_SPACE + __MAX( p_btnUnmute->width, p_btnMute->width ); + + setToolbarSize( i_width, i_height ); if( !p_btnPlay || !p_btnPause || !p_btnStop || !p_timeline || !p_btnTime || !p_btnFullscreen || !p_btnMute || !p_btnUnmute ) fprintf(stderr, "Error: some button images not found in %s\n", DATA_PATH ); + + /* reset panels position and size */ + /* XXX use i_width */ + XResizeWindow( p_display, video, window.width, window.height - i_height); + XMoveWindow( p_display, control, 0, window.height - i_height ); + XResizeWindow( p_display, control, window.width, i_height -1); + + b_toolbar = 1; /* says toolbar is now shown */ + redrawToolbar(); } void VlcPlugin::hideToolbar() { + const NPWindow& window = getWindow(); + Display *p_display = ((NPSetWindowCallbackStruct *)window.ws_info)->display; + Window control = getControlWindow(); + Window video = getVideoWindow(); + + i_tb_width = i_tb_height = 0; + if( p_btnPlay ) XDestroyImage( p_btnPlay ); if( p_btnPause ) XDestroyImage( p_btnPause ); if( p_btnStop ) XDestroyImage( p_btnStop ); @@ -525,26 +540,42 @@ void VlcPlugin::hideToolbar() p_btnFullscreen = NULL; p_btnMute = NULL; p_btnUnmute = NULL; + + /* reset panels position and size */ + /* XXX use i_width */ + XResizeWindow( p_display, video, window.width, window.height ); + XMoveWindow( p_display, control, 0, window.height-1 ); + XResizeWindow( p_display, control, window.width, 1 ); + + b_toolbar = 0; /* says toolbar is now hidden */ + redrawToolbar(); } void VlcPlugin::redrawToolbar() { - libvlc_media_instance_t *p_md = NULL; + libvlc_media_player_t *p_md = NULL; libvlc_exception_t ex; float f_position = 0.0; int i_playing = 0; bool b_mute = false; - + unsigned int dst_x, dst_y; GC gc; XGCValues gcv; + unsigned int i_tb_width, i_tb_height; + + /* This method does nothing if toolbar is hidden. */ + if( !b_toolbar ) + return; const NPWindow& window = getWindow(); Window control = getControlWindow(); Display *p_display = ((NPSetWindowCallbackStruct *)window.ws_info)->display; + getToolbarSize( &i_tb_width, &i_tb_height ); + /* get media instance */ libvlc_exception_init( &ex ); - p_md = libvlc_playlist_get_media_instance( getVLC(), &ex ); + p_md = libvlc_playlist_get_media_player( getVLC(), &ex ); libvlc_exception_clear( &ex ); /* get isplaying */ @@ -561,61 +592,166 @@ void VlcPlugin::redrawToolbar() if( i_playing == 1 ) { libvlc_exception_init( &ex ); - f_position = libvlc_media_instance_get_position( p_md, &ex ) * 100; + f_position = libvlc_media_player_get_position( p_md, &ex ) * 100; libvlc_exception_clear( &ex ); } - libvlc_media_instance_release( p_md ); + libvlc_media_player_release( p_md ); gcv.foreground = BlackPixel( p_display, 0 ); gc = XCreateGC( p_display, control, GCForeground, &gcv ); XFillRectangle( p_display, control, gc, - 0, 0, window.width, i_control_height ); + 0, 0, window.width, i_tb_height ); gcv.foreground = WhitePixel( p_display, 0 ); XChangeGC( p_display, gc, GCForeground, &gcv ); /* position icons */ - fprintf( stderr, ">>>>>> is playing = %d\n", i_playing ); + dst_x = BTN_SPACE; + dst_y = i_tb_height >> 1; /* baseline = vertical middle */ + if( p_btnPause && (i_playing == 1) ) { - XPutImage( p_display, control, gc, p_btnPause, 0, 0, 4, 14, + XPutImage( p_display, control, gc, p_btnPause, 0, 0, dst_x, + dst_y - (p_btnPause->height >> 1), p_btnPause->width, p_btnPause->height ); + dst_x += BTN_SPACE + p_btnPause->width; } else if( p_btnPlay ) { - XPutImage( p_display, control, gc, p_btnPlay, 0, 0, 4, 14, + XPutImage( p_display, control, gc, p_btnPlay, 0, 0, dst_x, + dst_y - (p_btnPlay->height >> 1), p_btnPlay->width, p_btnPlay->height ); + dst_x += BTN_SPACE + p_btnPlay->width; } if( p_btnStop ) - XPutImage( p_display, control, gc, p_btnStop, 0, 0, 39, 14, + XPutImage( p_display, control, gc, p_btnStop, 0, 0, dst_x, + dst_y - (p_btnStop->height >> 1), p_btnStop->width, p_btnStop->height ); + + dst_x += BTN_SPACE + ( p_btnStop ? p_btnStop->width : 0 ); + if( p_btnFullscreen ) - XPutImage( p_display, control, gc, p_btnFullscreen, 0, 0, 67, 21, + XPutImage( p_display, control, gc, p_btnFullscreen, 0, 0, dst_x, + dst_y - (p_btnFullscreen->height >> 1), p_btnFullscreen->width, p_btnFullscreen->height ); + dst_x += BTN_SPACE + ( p_btnFullscreen ? p_btnFullscreen->width : 0 ); + if( p_btnUnmute && b_mute ) { - XPutImage( p_display, control, gc, p_btnUnmute, 0, 0, 94, 30, + XPutImage( p_display, control, gc, p_btnUnmute, 0, 0, dst_x, + dst_y - (p_btnUnmute->height >> 1), p_btnUnmute->width, p_btnUnmute->height ); + + dst_x += BTN_SPACE + ( p_btnUnmute ? p_btnUnmute->width : 0 ); } else if( p_btnMute ) { - XPutImage( p_display, control, gc, p_btnMute, 0, 0, 94, 30, + XPutImage( p_display, control, gc, p_btnMute, 0, 0, dst_x, + dst_y - (p_btnMute->height >> 1), p_btnMute->width, p_btnMute->height ); + + dst_x += BTN_SPACE + ( p_btnMute ? p_btnMute->width : 0 ); } if( p_timeline ) - XPutImage( p_display, control, gc, p_timeline, 0, 0, 4, 4, - (window.width-8), p_timeline->height ); + XPutImage( p_display, control, gc, p_timeline, 0, 0, dst_x, + dst_y - (p_timeline->height >> 1), + (window.width-(dst_x+BTN_SPACE)), p_timeline->height ); if( f_position > 0 ) - i_last_position = (((float)window.width-8.0)/100.0)*f_position; + i_last_position = (int)( f_position * + ( ((float)(window.width-(dst_x+BTN_SPACE))) / 100.0 )); + if( p_btnTime ) XPutImage( p_display, control, gc, p_btnTime, - 0, 0, (4+i_last_position), 2, + 0, 0, (dst_x+i_last_position), + dst_y - (p_btnTime->height >> 1), p_btnTime->width, p_btnTime->height ); XFreeGC( p_display, gc ); } + +vlc_toolbar_clicked_t VlcPlugin::getToolbarButtonClicked( int i_xpos, int i_ypos ) +{ + unsigned int i_dest = BTN_SPACE;//(i_tb_height >> 1); + int i_playing = 0; + bool b_mute = false; + libvlc_exception_t ex; + + fprintf( stderr, "ToolbarButtonClicked:: " + "trying to match (%d,%d) (%d,%d)\n", + i_xpos, i_ypos, i_tb_height, i_tb_width ); + + if( i_ypos >= i_tb_width ) + return clicked_Unknown; + + /* Note: the order of testing is dependend on the original + * drawing positions of the icon buttons. Buttons are tested + * left to right. + */ + + /* get isplaying */ + libvlc_exception_init( &ex ); + i_playing = libvlc_playlist_isplaying( getVLC(), &ex ); + libvlc_exception_clear( &ex ); + + /* get mute info */ + libvlc_exception_init(&ex); + b_mute = libvlc_audio_get_mute( getVLC(), &ex ); + libvlc_exception_clear( &ex ); + + /* is Pause of Play button clicked */ + if( (i_playing != 1) && + (i_xpos >= (BTN_SPACE>>1)) && + (i_xpos <= i_dest + p_btnPlay->width + (BTN_SPACE>>1)) ) + return clicked_Play; + else if( (i_xpos >= (BTN_SPACE>>1)) && + (i_xpos <= i_dest + p_btnPause->width) ) + return clicked_Pause; + + /* is Stop button clicked */ + if( i_playing != 1 ) + i_dest += (p_btnPlay->width + (BTN_SPACE>>1)); + else + i_dest += (p_btnPause->width + (BTN_SPACE>>1)); + + if( (i_xpos >= i_dest) && + (i_xpos <= i_dest + p_btnStop->width + (BTN_SPACE>>1)) ) + return clicked_Stop; + + /* is Fullscreen button clicked */ + i_dest += (p_btnStop->width + (BTN_SPACE>>1)); + if( (i_xpos >= i_dest) && + (i_xpos <= i_dest + p_btnFullscreen->width + (BTN_SPACE>>1)) ) + return clicked_Fullscreen; + + /* is Mute or Unmute button clicked */ + i_dest += (p_btnFullscreen->width + (BTN_SPACE>>1)); + if( !b_mute && (i_xpos >= i_dest) && + (i_xpos <= i_dest + p_btnMute->width + (BTN_SPACE>>1)) ) + return clicked_Mute; + else if( (i_xpos >= i_dest) && + (i_xpos <= i_dest + p_btnUnmute->width + (BTN_SPACE>>1)) ) + return clicked_Unmute; + + /* is timeline clicked */ + if( !b_mute ) + i_dest += (p_btnMute->width + (BTN_SPACE>>1)); + else + i_dest += (p_btnUnmute->width + (BTN_SPACE>>1)); + if( (i_xpos >= i_dest) && + (i_xpos <= i_dest + p_timeline->width + (BTN_SPACE>>1)) ) + return clicked_timeline; + + /* is time button clicked */ + i_dest += (p_timeline->width + (BTN_SPACE>>1)); + if( (i_xpos >= i_dest) && + (i_xpos <= i_dest + p_btnTime->width + (BTN_SPACE>>1)) ) + return clicked_Time; + + return clicked_Unknown; +} +#undef BTN_SPACE #endif