X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=projects%2Fmozilla%2Fvlcplugin.cpp;h=c1f67f0a8afbee68e1847fbffd8e14282453ad88;hb=32b31e87d90967549e5cc8bef18d5aae7e3b98c6;hp=65d090aa3df7f18299559d65a1f3ff86f6cac214;hpb=ef5b823d8102ea89d27a53705a9cc7cbace6b352;p=vlc diff --git a/projects/mozilla/vlcplugin.cpp b/projects/mozilla/vlcplugin.cpp index 65d090aa3d..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 @@ -59,6 +60,14 @@ VlcPlugin::VlcPlugin( NPP instance, uint16 mode ) : ,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)); @@ -157,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"; } } @@ -172,7 +182,6 @@ NPError VlcPlugin::init(int argc, char* const argn[], char* const argv[]) } } - libvlc_exception_t ex; libvlc_exception_init(&ex); @@ -415,79 +424,103 @@ 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 = 0; + 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_height = __MAX( i_height, p_btnPlay->height ); - i_width = __MAX( i_width, p_btnPlay->width ); } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/pause.xpm", - &p_btnPause, NULL, NULL); + if( !p_btnPause ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/pause.xpm", + &p_btnPause, NULL, NULL); if( p_btnPause ) { i_height = __MAX( i_height, p_btnPause->height ); - i_width = __MAX( i_width, p_btnPause->width ); } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/stop.xpm", - &p_btnStop, NULL, NULL ); + i_width += __MAX( p_btnPause->width, p_btnPlay->width ); + + if( !p_btnStop ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/stop.xpm", + &p_btnStop, NULL, NULL ); if( p_btnStop ) { i_height = __MAX( i_height, p_btnStop->height ); - i_width = __MAX( i_width, p_btnStop->width ); + i_width += BTN_SPACE + p_btnStop->width; } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_line.xpm", - &p_timeline, NULL, NULL); + if( !p_timeline ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_line.xpm", + &p_timeline, NULL, NULL); if( p_timeline ) { i_height = __MAX( i_height, p_timeline->height ); - i_width = __MAX( i_width, p_timeline->width ); + i_width += BTN_SPACE + p_timeline->width; } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_icon.xpm", - &p_btnTime, NULL, NULL); + if( !p_btnTime ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/time_icon.xpm", + &p_btnTime, NULL, NULL); if( p_btnTime ) { i_height = __MAX( i_height, p_btnTime->height ); - i_width = __MAX( i_width, p_btnTime->width ); + i_width += BTN_SPACE + p_btnTime->width; } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/fullscreen.xpm", - &p_btnFullscreen, NULL, NULL); + if( !p_btnFullscreen ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/fullscreen.xpm", + &p_btnFullscreen, NULL, NULL); if( p_btnFullscreen ) { i_height = __MAX( i_height, p_btnFullscreen->height ); - i_width = __MAX( i_width, p_btnFullscreen->width ); + i_width += BTN_SPACE + p_btnFullscreen->width; } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_max.xpm", - &p_btnMute, NULL, NULL); + if( !p_btnMute ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_max.xpm", + &p_btnMute, NULL, NULL); if( p_btnMute ) { i_height = __MAX( i_height, p_btnMute->height ); - i_width = __MAX( i_width, p_btnMute->width ); } - XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_mute.xpm", - &p_btnUnmute, NULL, NULL); + if( !p_btnUnmute ) + XpmReadFileToImage( p_display, DATA_PATH "/mozilla/volume_mute.xpm", + &p_btnUnmute, NULL, NULL); if( p_btnUnmute ) { i_height = __MAX( i_height, p_btnUnmute->height ); - i_width = __MAX( i_width, p_btnUnmute->width ); } + 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 ); @@ -507,6 +540,15 @@ 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() @@ -519,12 +561,18 @@ void VlcPlugin::redrawToolbar() unsigned int dst_x, dst_y; GC gc; XGCValues gcv; -#define BTN_SPACE ((unsigned int)4) + 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_player( getVLC(), &ex ); @@ -558,66 +606,152 @@ void VlcPlugin::redrawToolbar() XChangeGC( p_display, gc, GCForeground, &gcv ); /* position icons */ - dst_x = 4; dst_y = 4; + dst_x = BTN_SPACE; + dst_y = i_tb_height >> 1; /* baseline = vertical middle */ - fprintf( stderr, ">>>>>> is playing = %d\n", i_playing ); if( p_btnPause && (i_playing == 1) ) { - XPutImage( p_display, control, gc, p_btnPause, 0, 0, dst_x, dst_y, + 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, dst_x, dst_y, + 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; } - dst_x += BTN_SPACE + ( p_btnPlay ? p_btnPlay->width : 0 ); - dst_y = 4; - if( p_btnStop ) - XPutImage( p_display, control, gc, p_btnStop, 0, 0, dst_x, dst_y, + 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 ); - dst_y = 4; if( p_btnFullscreen ) - XPutImage( p_display, control, gc, p_btnFullscreen, 0, 0, dst_x, dst_y, + 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 ); - dst_y = 4; if( p_btnUnmute && b_mute ) { - XPutImage( p_display, control, gc, p_btnUnmute, 0, 0, dst_x, dst_y, + 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 ); - dst_y = 4; } else if( p_btnMute ) { - XPutImage( p_display, control, gc, p_btnMute, 0, 0, dst_x, dst_y, + 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 ); - dst_y = 4; } if( p_timeline ) - XPutImage( p_display, control, gc, p_timeline, 0, 0, dst_x, dst_y, + 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, (dst_x+i_last_position), dst_y, + 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