X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fbeos%2FInterfaceWindow.cpp;h=96b500ee50801f55e4fd7e15358a6b2c6d55a0e6;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=8b92974efb7e76b52ef63ca56efd3d5ab973e504;hpb=19ea8feb6db01c1deafb19f35ecee8eff81aeb02;p=vlc diff --git a/modules/gui/beos/InterfaceWindow.cpp b/modules/gui/beos/InterfaceWindow.cpp index 8b92974efb..96b500ee50 100644 --- a/modules/gui/beos/InterfaceWindow.cpp +++ b/modules/gui/beos/InterfaceWindow.cpp @@ -1,13 +1,14 @@ /***************************************************************************** * InterfaceWindow.cpp: beos interface ***************************************************************************** - * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: InterfaceWindow.cpp,v 1.1 2002/08/04 17:23:43 sam Exp $ + * Copyright (C) 1999, 2000, 2001 the VideoLAN team + * $Id$ * * Authors: Jean-Marc Dressler * Samuel Hocevar * Tony Castley * Richard Shepherd + * Stephan Aßmus * * 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 @@ -21,7 +22,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /* System headers */ @@ -34,114 +35,354 @@ #include #include #include -#include - /* VLC headers */ #include -#include -#include +#include +#include /* BeOS interface headers */ #include "MsgVals.h" #include "MediaControlView.h" #include "PlayListWindow.h" -#include "VlcWrapper.h" +#include "PreferencesWindow.h" +#include "MessagesWindow.h" #include "InterfaceWindow.h" +#define INTERFACE_UPDATE_TIMEOUT 80000 // 2 frames if at 25 fps +#define INTERFACE_LOCKING_TIMEOUT 5000 + +// make_sure_frame_is_on_screen +bool +make_sure_frame_is_on_screen( BRect& frame ) +{ + BScreen screen( B_MAIN_SCREEN_ID ); + if (frame.IsValid() && screen.IsValid()) { + if (!screen.Frame().Contains(frame)) { + // make sure frame fits in the screen + if (frame.Width() > screen.Frame().Width()) + frame.right -= frame.Width() - screen.Frame().Width() + 10.0; + if (frame.Height() > screen.Frame().Height()) + frame.bottom -= frame.Height() - screen.Frame().Height() + 30.0; + // frame is now at the most the size of the screen + if (frame.right > screen.Frame().right) + frame.OffsetBy(-(frame.right - screen.Frame().right), 0.0); + if (frame.bottom > screen.Frame().bottom) + frame.OffsetBy(0.0, -(frame.bottom - screen.Frame().bottom)); + if (frame.left < screen.Frame().left) + frame.OffsetBy((screen.Frame().left - frame.left), 0.0); + if (frame.top < screen.Frame().top) + frame.OffsetBy(0.0, (screen.Frame().top - frame.top)); + } + return true; + } + return false; +} + +// make_sure_frame_is_within_limits +void +make_sure_frame_is_within_limits( BRect& frame, float minWidth, float minHeight, + float maxWidth, float maxHeight ) +{ + if ( frame.Width() < minWidth ) + frame.right = frame.left + minWidth; + if ( frame.Height() < minHeight ) + frame.bottom = frame.top + minHeight; + if ( frame.Width() > maxWidth ) + frame.right = frame.left + maxWidth; + if ( frame.Height() > maxHeight ) + frame.bottom = frame.top + maxHeight; +} + +// get_volume_info +bool +get_volume_info( BVolume& volume, BString& volumeName, bool& isCDROM, BString& deviceName ) +{ + bool success = false; + isCDROM = false; + deviceName = ""; + volumeName = ""; + char name[B_FILE_NAME_LENGTH]; + if ( volume.GetName( name ) >= B_OK ) // disk is currently mounted + { + volumeName = name; + dev_t dev = volume.Device(); + fs_info info; + if ( fs_stat_dev( dev, &info ) == B_OK ) + { + success = true; + deviceName = info.device_name; + if ( volume.IsReadOnly() ) + { + int i_dev = open( info.device_name, O_RDONLY ); + if ( i_dev >= 0 ) + { + device_geometry g; + if ( ioctl( i_dev, B_GET_GEOMETRY, &g, sizeof( g ) ) >= 0 ) + isCDROM = ( g.device_type == B_CD ); + close( i_dev ); + } + } + } + } + return success; +} + +// collect_folder_contents +void +collect_folder_contents( BDirectory& dir, BList& list, bool& deep, bool& asked, BEntry& entry ) +{ + while ( dir.GetNextEntry( &entry, true ) == B_OK ) + { + if ( !entry.IsDirectory() ) + { + BPath path; + // since the directory will give us the entries in reverse order, + // we put them each at the same index, effectively reversing the + // items while adding them + if ( entry.GetPath( &path ) == B_OK ) + { + BString* string = new BString( path.Path() ); + if ( !list.AddItem( string, 0 ) ) + delete string; // at least don't leak + } + } + else + { + if ( !asked ) + { + // ask user if we should parse sub-folders as well + BAlert* alert = new BAlert( "sub-folders?", + _("Open files from all sub-folders as well?"), + _("Cancel"), _("Open"), NULL, B_WIDTH_AS_USUAL, + B_IDEA_ALERT ); + int32 buttonIndex = alert->Go(); + deep = buttonIndex == 1; + asked = true; + // never delete BAlerts!! + } + if ( deep ) + { + BDirectory subDir( &entry ); + if ( subDir.InitCheck() == B_OK ) + collect_folder_contents( subDir, list, + deep, asked, entry ); + } + } + } +} + +static int PlaylistChanged( vlc_object_t *p_this, const char * psz_variable, + vlc_value_t old_val, vlc_value_t new_val, + void * param ) +{ + InterfaceWindow * w = (InterfaceWindow *) param; + w->UpdatePlaylist(); + return VLC_SUCCESS; +} /***************************************************************************** * InterfaceWindow *****************************************************************************/ -InterfaceWindow::InterfaceWindow( BRect frame, const char *name, - intf_thread_t *p_interface ) - : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, - B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_WILL_ACCEPT_FIRST_CLICK - | B_ASYNCHRONOUS_CONTROLS ) -{ - file_panel = NULL; - playlist_window = NULL; - p_intf = p_interface; - p_vlc_wrapper = Intf_VLCWrapper::getVLCWrapper(p_intf); - BRect controlRect(0,0,0,0); - - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - b_empty_playlist = (p_playlist->i_size < 0); - b_mute = false; - - /* set the title bar */ - SetName( "interface" ); - SetTitle(VOUT_TITLE); - - /* set up the main menu */ - BMenuBar *menu_bar; - menu_bar = new BMenuBar(controlRect, "main menu"); - AddChild( menu_bar ); - - BMenu *mFile; - BMenu *mAudio; - CDMenu *cd_menu; - BMenu *mNavigation; - - /* Add the file Menu */ - BMenuItem *mItem; - menu_bar->AddItem( mFile = new BMenu( "File" ) ); - menu_bar->ResizeToPreferred(); - mFile->AddItem( mItem = new BMenuItem( "Open File" B_UTF8_ELLIPSIS, - new BMessage(OPEN_FILE), 'O') ); - - cd_menu = new CDMenu( "Open Disc" ); - mFile->AddItem( cd_menu ); - - mFile->AddSeparatorItem(); - mFile->AddItem( mItem = new BMenuItem( "Play List" B_UTF8_ELLIPSIS, - new BMessage(OPEN_PLAYLIST), 'P') ); - - mFile->AddSeparatorItem(); - mFile->AddItem( mItem = new BMenuItem( "About" B_UTF8_ELLIPSIS, - new BMessage(B_ABOUT_REQUESTED), 'A') ); - mItem->SetTarget( be_app ); - mFile->AddItem(mItem = new BMenuItem( "Quit", - new BMessage(B_QUIT_REQUESTED), 'Q') ); +InterfaceWindow::InterfaceWindow( intf_thread_t * _p_intf, BRect frame, + const char * name ) + : BWindow( frame, name, B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, + B_NOT_ZOOMABLE | B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ), + + /* Initializations */ + p_intf( _p_intf ), + p_input( NULL ), + p_playlist( NULL ), + + fFilePanel( NULL ), + fLastUpdateTime( system_time() ), + fSettings( new BMessage( 'sett' ) ) +{ + p_playlist = (playlist_t *) + vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); + + var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this ); + var_AddCallback( p_playlist, "item-change", PlaylistChanged, this ); + var_AddCallback( p_playlist, "item-append", PlaylistChanged, this ); + var_AddCallback( p_playlist, "item-deleted", PlaylistChanged, this ); + var_AddCallback( p_playlist, "playlist-current", PlaylistChanged, this ); + + char psz_tmp[1024]; +#define ADD_ELLIPSIS( a ) \ + memset( psz_tmp, 0, 1024 ); \ + snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS ); + + BScreen screen; + BRect screen_rect = screen.Frame(); + BRect window_rect; + window_rect.Set( ( screen_rect.right - PREFS_WINDOW_WIDTH ) / 2, + ( screen_rect.bottom - PREFS_WINDOW_HEIGHT ) / 2, + ( screen_rect.right + PREFS_WINDOW_WIDTH ) / 2, + ( screen_rect.bottom + PREFS_WINDOW_HEIGHT ) / 2 ); + fPreferencesWindow = new PreferencesWindow( p_intf, window_rect, _("Preferences") ); + window_rect.Set( screen_rect.right - 500, + screen_rect.top + 50, + screen_rect.right - 150, + screen_rect.top + 250 ); +#if 0 + fPlaylistWindow = new PlayListWindow( window_rect, _("Playlist"), this, p_intf ); + window_rect.Set( screen_rect.right - 550, + screen_rect.top + 300, + screen_rect.right - 150, + screen_rect.top + 500 ); +#endif + fMessagesWindow = new MessagesWindow( p_intf, window_rect, _("Messages") ); + + // the media control view + p_mediaControl = new MediaControlView( p_intf, BRect( 0.0, 0.0, 250.0, 50.0 ) ); + p_mediaControl->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) ); + + float width, height; + p_mediaControl->GetPreferredSize( &width, &height ); + + // set up the main menu + fMenuBar = new BMenuBar( BRect(0.0, 0.0, width, 15.0), "main menu", + B_FOLLOW_NONE, B_ITEMS_IN_ROW, false ); + + // make menu bar resize to correct height + float menuWidth, menuHeight; + fMenuBar->GetPreferredSize( &menuWidth, &menuHeight ); + fMenuBar->ResizeTo( width, menuHeight ); // don't change! it's a workarround! + // take care of proper size for ourself + height += fMenuBar->Bounds().Height(); + ResizeTo( width, height ); + + p_mediaControl->MoveTo( fMenuBar->Bounds().LeftBottom() + BPoint(0.0, 1.0) ); + AddChild( fMenuBar ); + + + // Add the file Menu + BMenu* fileMenu = new BMenu( _("File") ); + fMenuBar->AddItem( fileMenu ); + ADD_ELLIPSIS( _("Open File") ); + fileMenu->AddItem( new BMenuItem( psz_tmp, new BMessage( OPEN_FILE ), 'O') ); + fileMenu->AddItem( new CDMenu( _("Open Disc") ) ); + ADD_ELLIPSIS( _("Open Subtitles") ); + fileMenu->AddItem( new BMenuItem( psz_tmp, new BMessage( LOAD_SUBFILE ) ) ); + + fileMenu->AddSeparatorItem(); + ADD_ELLIPSIS( _("About") ); + BMenuItem* item = new BMenuItem( psz_tmp, new BMessage( B_ABOUT_REQUESTED ), 'A'); + item->SetTarget( be_app ); + fileMenu->AddItem( item ); + fileMenu->AddItem( new BMenuItem( _("Quit"), new BMessage( B_QUIT_REQUESTED ), 'Q') ); + + fLanguageMenu = new LanguageMenu( p_intf, _("Language"), "audio-es" ); + fSubtitlesMenu = new LanguageMenu( p_intf, _("Subtitles"), "spu-es" ); /* Add the Audio menu */ - menu_bar->AddItem ( mAudio = new BMenu( "Audio" ) ); - menu_bar->ResizeToPreferred(); - mAudio->AddItem( new LanguageMenu( "Language", AUDIO_ES, p_intf ) ); - mAudio->AddItem( new LanguageMenu( "Subtitles", SPU_ES, p_intf ) ); + fAudioMenu = new BMenu( _("Audio") ); + fMenuBar->AddItem ( fAudioMenu ); + fAudioMenu->AddItem( fLanguageMenu ); + fAudioMenu->AddItem( fSubtitlesMenu ); + + fPrevTitleMI = new BMenuItem( _("Prev Title"), new BMessage( PREV_TITLE ) ); + fNextTitleMI = new BMenuItem( _("Next Title"), new BMessage( NEXT_TITLE ) ); + fPrevChapterMI = new BMenuItem( _("Previous chapter"), new BMessage( PREV_CHAPTER ) ); + fNextChapterMI = new BMenuItem( _("Next chapter"), new BMessage( NEXT_CHAPTER ) ); /* Add the Navigation menu */ - menu_bar->AddItem( mNavigation = new BMenu( "Navigation" ) ); - menu_bar->ResizeToPreferred(); - mNavigation->AddItem( new BMenuItem( "Prev Title", - new BMessage(PREV_TITLE)) ); - mNavigation->AddItem( new BMenuItem( "Next Title", - new BMessage(NEXT_TITLE)) ); - mNavigation->AddItem( new BMenuItem( "Prev Chapter", - new BMessage(PREV_CHAPTER)) ); - mNavigation->AddItem( new BMenuItem( "Next Chapter", - new BMessage(NEXT_CHAPTER)) ); - - ResizeTo(260,50 + menu_bar->Bounds().IntegerHeight()+1); - controlRect = Bounds(); - controlRect.top += menu_bar->Bounds().IntegerHeight() + 1; - - p_mediaControl = new MediaControlView( controlRect ); - p_mediaControl->SetViewColor( ui_color(B_PANEL_BACKGROUND_COLOR) ); - b_empty_playlist = true; - p_mediaControl->SetEnabled( !b_empty_playlist ); - - /* Show */ + fNavigationMenu = new BMenu( _("Navigation") ); + fMenuBar->AddItem( fNavigationMenu ); + fNavigationMenu->AddItem( fPrevTitleMI ); + fNavigationMenu->AddItem( fNextTitleMI ); + fNavigationMenu->AddItem( fTitleMenu = new TitleMenu( _("Go to Title"), p_intf ) ); + fNavigationMenu->AddSeparatorItem(); + fNavigationMenu->AddItem( fPrevChapterMI ); + fNavigationMenu->AddItem( fNextChapterMI ); + fNavigationMenu->AddItem( fChapterMenu = new ChapterMenu( _("Go to Chapter"), p_intf ) ); + + /* Add the Speed menu */ + fSpeedMenu = new BMenu( _("Speed") ); + fSpeedMenu->SetRadioMode( true ); + fSpeedMenu->AddItem( + fHeighthMI = new BMenuItem( "1/8x", new BMessage( HEIGHTH_PLAY ) ) ); + fSpeedMenu->AddItem( + fQuarterMI = new BMenuItem( "1/4x", new BMessage( QUARTER_PLAY ) ) ); + fSpeedMenu->AddItem( + fHalfMI = new BMenuItem( "1/2x", new BMessage( HALF_PLAY ) ) ); + fSpeedMenu->AddItem( + fNormalMI = new BMenuItem( "1x", new BMessage( NORMAL_PLAY ) ) ); + fSpeedMenu->AddItem( + fTwiceMI = new BMenuItem( "2x", new BMessage( TWICE_PLAY ) ) ); + fSpeedMenu->AddItem( + fFourMI = new BMenuItem( "4x", new BMessage( FOUR_PLAY ) ) ); + fSpeedMenu->AddItem( + fHeightMI = new BMenuItem( "8x", new BMessage( HEIGHT_PLAY ) ) ); + fMenuBar->AddItem( fSpeedMenu ); + + /* Add the Show menu */ + fShowMenu = new BMenu( _("Window") ); +#if 0 + ADD_ELLIPSIS( _("Playlist") ); + fShowMenu->AddItem( new BMenuItem( psz_tmp, new BMessage( OPEN_PLAYLIST ), 'P') ); +#endif + ADD_ELLIPSIS( _("Messages") ); + fShowMenu->AddItem( new BMenuItem( psz_tmp, new BMessage( OPEN_MESSAGES ), 'M' ) ); + ADD_ELLIPSIS( _("Preferences") ); + fShowMenu->AddItem( new BMenuItem( psz_tmp, new BMessage( OPEN_PREFERENCES ), 'S' ) ); + fMenuBar->AddItem( fShowMenu ); + + // add the media control view after the menubar is complete + // because it will set the window size limits in AttachedToWindow() + // and the menubar needs to report the correct PreferredSize() AddChild( p_mediaControl ); + + /* Prepare fow showing */ + _SetMenusEnabled( false ); + p_mediaControl->SetEnabled( false ); + + _RestoreSettings(); + Show(); - } InterfaceWindow::~InterfaceWindow() { - if (playlist_window) playlist_window->ReallyQuit(); + if( p_input ) + { + vlc_object_release( p_input ); + } + if( p_playlist ) + { + vlc_object_release( p_playlist ); + } +#if 0 + if( fPlaylistWindow ) + { + fPlaylistWindow->ReallyQuit(); + } +#endif + if( fMessagesWindow ) + { + fMessagesWindow->ReallyQuit(); + } + if( fPreferencesWindow ) + { + fPreferencesWindow->ReallyQuit(); + } + delete fFilePanel; + delete fSettings; +} + +/***************************************************************************** + * InterfaceWindow::FrameResized + *****************************************************************************/ +void +InterfaceWindow::FrameResized(float width, float height) +{ + BRect r(Bounds()); + fMenuBar->MoveTo(r.LeftTop()); + fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height()); + r.top += fMenuBar->Bounds().Height() + 1.0; + p_mediaControl->MoveTo(r.LeftTop()); + p_mediaControl->ResizeTo(r.Width(), r.Height()); } /***************************************************************************** @@ -149,268 +390,765 @@ InterfaceWindow::~InterfaceWindow() *****************************************************************************/ void InterfaceWindow::MessageReceived( BMessage * p_message ) { - int vol_val = p_mediaControl->GetVolume(); // remember the current volume - int playback_status; // remember playback state - int i_index; - BAlert *alert; - - Activate(); - playback_status = p_vlc_wrapper->inputGetStatus(); - switch( p_message->what ) { - case B_ABOUT_REQUESTED: - alert = new BAlert(VOUT_TITLE, "BeOS " VOUT_TITLE "\n\n", "Ok"); - alert->Go(); - break; - - case TOGGLE_ON_TOP: - break; - - case OPEN_FILE: - if( file_panel ) + case B_ABOUT_REQUESTED: { - file_panel->Show(); + BAlert * alert; + + alert = new BAlert( "VLC media player" VERSION, + "VLC media player" VERSION " (BeOS interface)\n\n" + "The VideoLAN team \n" + "http://www.videolan.org/", _("OK") ); + alert->Go(); break; } - file_panel = new BFilePanel(); - file_panel->SetTarget( this ); - file_panel->Show(); - b_empty_playlist = false; - p_mediaControl->SetEnabled( !b_empty_playlist ); - break; - - case OPEN_PLAYLIST: - { - BRect rect(20,20,320,420); - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - - playlist_window = PlayListWindow::getPlayList(rect, - "Playlist", p_playlist); - playlist_window->Show(); - } - break; - case OPEN_DVD: + case TOGGLE_ON_TOP: + break; + + case OPEN_FILE: + _ShowFilePanel( B_REFS_RECEIVED, _("VLC media player: Open Media Files") ); + break; + + case LOAD_SUBFILE: + _ShowFilePanel( SUBFILE_RECEIVED, _("VLC media player: Open Subtitle File") ); + break; +#if 0 + case OPEN_PLAYLIST: + if (fPlaylistWindow->Lock()) + { + if (fPlaylistWindow->IsHidden()) + fPlaylistWindow->Show(); + else + fPlaylistWindow->Activate(); + fPlaylistWindow->Unlock(); + } + break; +#endif + case OPEN_DVD: + { + const char * psz_device; + if( p_playlist && + p_message->FindString( "device", &psz_device ) == B_OK ) + { + char psz_uri[1024]; + memset( psz_uri, 0, 1024 ); + snprintf( psz_uri, 1024, "dvdnav:%s", psz_device ); + playlist_Add( p_playlist, psz_uri, psz_device, + PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, VLC_TRUE ); + } + UpdatePlaylist(); + } + break; + + case SUBFILE_RECEIVED: { - const char *psz_device; - BString type("dvd"); - if( p_message->FindString("device", &psz_device) != B_ERROR ) + entry_ref ref; + if( p_message->FindRef( "refs", 0, &ref ) == B_OK ) { - BString device(psz_device); - p_vlc_wrapper->openDisc(type, device, 0,0); + BPath path( &ref ); + if ( path.InitCheck() == B_OK ) + config_PutPsz( p_intf, "sub-file", path.Path() ); } + break; } - break; - - case STOP_PLAYBACK: - // this currently stops playback not nicely - //p_vlc_wrapper->volume_mute(); - //snooze( 400000 ); - p_vlc_wrapper->playlistStop(); - p_mediaControl->SetStatus(NOT_STARTED_S,DEFAULT_RATE); - break; - - case START_PLAYBACK: - /* starts playing in normal mode */ - - case PAUSE_PLAYBACK: - /* toggle between pause and play */ - if( p_intf->p_sys->p_input != NULL ) + + case STOP_PLAYBACK: + if( p_playlist ) + { + playlist_Stop( p_playlist ); + } + p_mediaControl->SetStatus(-1, INPUT_RATE_DEFAULT); + break; + + case START_PLAYBACK: + case PAUSE_PLAYBACK: { - /* pause if currently playing */ - if ( playback_status == PLAYING_S ) + vlc_value_t val; + val.i_int = PLAYING_S; + if( p_input ) + { + var_Get( p_input, "state", &val ); + } + if( p_input && val.i_int != PAUSE_S ) { - //p_vlc_wrapper->volume_mute(); - //snooze( 400000 ); - p_vlc_wrapper->playlistPause(); + val.i_int = PAUSE_S; + var_Set( p_input, "state", val ); } else { - //p_vlc_wrapper->volume_restore(); - p_vlc_wrapper->playlistPlay(); + playlist_Play( p_playlist ); } + break; } - else - { - /* Play a new file */ - p_vlc_wrapper->playlistPlay(); - } - break; - - case FASTER_PLAY: - /* cycle the fast playback modes */ - //p_vlc_wrapper->volume_mute(); - //snooze( 400000 ); - p_vlc_wrapper->playFaster(); - break; - - case SLOWER_PLAY: - /* cycle the slow playback modes */ - //p_vlc_wrapper->volume_mute(); - //snooze( 400000 ); - p_vlc_wrapper->playSlower(); - break; - - case SEEK_PLAYBACK: - /* handled by semaphores */ - break; - - case VOLUME_CHG: - /* adjust the volume */ -// vlc_mutex_lock( &p_intf->p_sys->p_input->lock ); -// for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) -// { -// if( p_aout_bank->pp_aout[i_index]->i_savedvolume ) -// { -// p_aout_bank->pp_aout[i_index]->i_savedvolume = vol_val; -// } -// else -// { -// p_aout_bank->pp_aout[i_index]->i_volume = vol_val; -// } -// } -// vlc_mutex_unlock( &p_aout_bank->lock ); - break; - - case VOLUME_MUTE: - /* toggle muting */ - p_vlc_wrapper->toggleMute( ); - break; - - case SELECT_AUDIO: + case HEIGHTH_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 8 ); + } + break; + + case QUARTER_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 4 ); + } + break; + + case HALF_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 2 ); + } + break; + + case NORMAL_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT ); + } + break; + + case TWICE_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 2 ); + } + break; + + case FOUR_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 4 ); + } + break; + + case HEIGHT_PLAY: + if( p_input ) + { + var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 8 ); + } + break; + + case SEEK_PLAYBACK: + /* handled by semaphores */ + break; + + case VOLUME_CHG: + aout_VolumeSet( p_intf, p_mediaControl->GetVolume() ); + break; + + case VOLUME_MUTE: + aout_VolumeMute( p_intf, NULL ); + break; + + case SELECT_CHANNEL: { - int32 i = p_message->FindInt32( "audio" ); - p_vlc_wrapper->toggleLanguage( i ); + int32 channel; + if( p_input ) + { + if( p_message->FindInt32( "audio-es", &channel ) == B_OK ) + { + var_SetInteger( p_input, "audio-es", channel ); + } + else if( p_message->FindInt32( "spu-es", &channel ) == B_OK ) + { + var_SetInteger( p_input, "spu-es", channel ); + } + } + break; } - break; - case SELECT_SUBTITLE: + case PREV_TITLE: + if( p_input ) + { + var_SetVoid( p_input, "prev-title" ); + } + break; + + case NEXT_TITLE: + if( p_input ) + { + var_SetVoid( p_input, "next-title" ); + } + break; + + case TOGGLE_TITLE: { - int32 i = p_message->FindInt32( "subtitle" ); - p_vlc_wrapper->toggleSubtitle( i ); + int32 index; + if( p_input && + p_message->FindInt32( "index", &index ) == B_OK ) + { + var_SetInteger( p_input, "title", index ); + } + break; } - break; - case PREV_TITLE: - { - int i_id; - i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_id - 1; - /* Disallow area 0 since it is used for video_ts.vob */ - if( i_id > 0 ) + case PREV_CHAPTER: + if( p_input ) { - p_vlc_wrapper->toggleTitle(i_id); + var_SetVoid( p_input, "prev-chapter" ); } break; - } - case NEXT_TITLE: - { - int i_id; - i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_id + 1; + case NEXT_CHAPTER: + if( p_input ) + { + var_SetVoid( p_input, "next-chapter" ); + } + break; - if( i_id < p_intf->p_sys->p_input->stream.i_area_nb ) + case TOGGLE_CHAPTER: + { + int32 index; + if( p_input && + p_message->FindInt32( "index", &index ) == B_OK ) { - p_vlc_wrapper->toggleTitle(i_id); + var_SetInteger( p_input, "chapter", index ); } + break; } - break; - case PREV_CHAPTER: - { - int i_id; - i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_part - 1; + case PREV_FILE: + if( p_playlist ) + { + playlist_Prev( p_playlist ); + } + break; - if( i_id >= 0 ) + case NEXT_FILE: + if( p_playlist ) { - p_vlc_wrapper->toggleChapter(i_id); + playlist_Next( p_playlist ); } - } - break; - case NEXT_CHAPTER: - { - int i_id; + break; + + case NAVIGATE_PREV: + if( p_input ) + { + vlc_value_t val; + + /* First try to go to previous chapter */ + if( !var_Get( p_input, "chapter", &val ) ) + { + if( val.i_int > 1 ) + { + var_SetVoid( p_input, "prev-chapter" ); + break; + } + } + + /* Try to go to previous title */ + if( !var_Get( p_input, "title", &val ) ) + { + if( val.i_int > 1 ) + { + var_SetVoid( p_input, "prev-title" ); + break; + } + } + + /* Try to go to previous file */ + if( p_playlist ) + { + playlist_Prev( p_playlist ); + } + } + break; + + case NAVIGATE_NEXT: + if( p_input ) + { + vlc_value_t val, val_list; + + /* First try to go to next chapter */ + if( !var_Get( p_input, "chapter", &val ) ) + { + var_Change( p_input, "chapter", VLC_VAR_GETCHOICES, + &val_list, NULL ); + if( val_list.p_list->i_count > val.i_int ) + { + var_Change( p_input, "chapter", VLC_VAR_FREELIST, + &val_list, NULL ); + var_SetVoid( p_input, "next-chapter" ); + break; + } + var_Change( p_input, "chapter", VLC_VAR_FREELIST, + &val_list, NULL ); + } + + /* Try to go to next title */ + if( !var_Get( p_input, "title", &val ) ) + { + var_Change( p_input, "title", VLC_VAR_GETCHOICES, + &val_list, NULL ); + if( val_list.p_list->i_count > val.i_int ) + { + var_Change( p_input, "title", VLC_VAR_FREELIST, + &val_list, NULL ); + var_SetVoid( p_input, "next-title" ); + break; + } + var_Change( p_input, "title", VLC_VAR_FREELIST, + &val_list, NULL ); + } - i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_part + 1; + /* Try to go to next file */ + if( p_playlist ) + { + playlist_Next( p_playlist ); + } + } + break; - if( i_id >= 0 ) + // drag'n'drop and system messages + case MSG_SOUNDPLAY: + // convert soundplay drag'n'drop message (containing paths) + // to normal message (containing refs) { - p_vlc_wrapper->toggleChapter(i_id); + const char* path; + for ( int32 i = 0; p_message->FindString( "path", i, &path ) == B_OK; i++ ) + { + entry_ref ref; + if ( get_ref_for_path( path, &ref ) == B_OK ) + p_message->AddRef( "refs", &ref ); + } } - } - break; - case B_REFS_RECEIVED: - case B_SIMPLE_DATA: + // fall through + case B_REFS_RECEIVED: + case B_SIMPLE_DATA: { - entry_ref ref; - BList* files = new BList(); + /* file(s) opened by the File menu -> append to the playlist; + file(s) opened by drag & drop -> replace playlist; + file(s) opened by 'shift' + drag & drop -> append */ + + int32 count; + type_code dummy; + if( p_message->GetInfo( "refs", &dummy, &count ) != B_OK || + count < 1 ) + { + break; + } + + vlc_bool_t b_remove = ( p_message->WasDropped() && + !( modifiers() & B_SHIFT_KEY ) ); - int i = 0; - while( p_message->FindRef( "refs", i, &ref ) == B_OK ) + if( b_remove && p_playlist ) + { + playlist_Clear( p_playlist, VLC_TRUE ); + } + + entry_ref ref; + for( int i = 0; p_message->FindRef( "refs", i, &ref ) == B_OK; i++ ) { BPath path( &ref ); - files->AddItem(new BString((char*)path.Path()) ); - i++; + /* TODO: find out if this is a DVD icon */ + + if( p_playlist ) + { + playlist_Add( p_playlist, path.Path(), NULL, + PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, VLC_TRUE ); + } + } + + UpdatePlaylist(); + break; + } + + case OPEN_PREFERENCES: + { + if( fPreferencesWindow->Lock() ) + { + if (fPreferencesWindow->IsHidden()) + fPreferencesWindow->Show(); + else + fPreferencesWindow->Activate(); + fPreferencesWindow->Unlock(); } - p_vlc_wrapper->openFiles(files); - delete files; + break; } - break; - default: - BWindow::MessageReceived( p_message ); - break; + case OPEN_MESSAGES: + { + if( fMessagesWindow->Lock() ) + { + if (fMessagesWindow->IsHidden()) + fMessagesWindow->Show(); + else + fMessagesWindow->Activate(); + fMessagesWindow->Unlock(); + } + break; + } + case MSG_UPDATE: + UpdateInterface(); + break; + default: + BWindow::MessageReceived( p_message ); + break; } +} +/***************************************************************************** + * InterfaceWindow::QuitRequested + *****************************************************************************/ +bool InterfaceWindow::QuitRequested() +{ + if( p_playlist ) + { + playlist_Stop( p_playlist ); + } + p_mediaControl->SetStatus(-1, INPUT_RATE_DEFAULT); + + _StoreSettings(); + + vlc_object_kill( p_intf ); + + return( true ); } /***************************************************************************** - * InterfaceWindow::updateInterface + * InterfaceWindow::UpdateInterface *****************************************************************************/ -void InterfaceWindow::updateInterface() +void InterfaceWindow::UpdateInterface() { + if( !p_input ) + { + p_input = (input_thread_t *) + vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); + } + else if( p_input->b_dead ) + { + vlc_object_release( p_input ); + p_input = NULL; + } - if ( p_intf->p_sys->p_input != NULL ) - { - if ( acquire_sem(p_mediaControl->fScrubSem) == B_OK ) + /* Get ready to update the interface */ + if( LockWithTimeout( INTERFACE_LOCKING_TIMEOUT ) != B_OK ) + { + return; + } + + if( b_playlist_update ) + { +#if 0 + if( fPlaylistWindow->Lock() ) + { + fPlaylistWindow->UpdatePlaylist( true ); + fPlaylistWindow->Unlock(); + b_playlist_update = false; + } +#endif + p_mediaControl->SetEnabled( !playlist_IsEmpty( p_playlist ) ); + } + + if( p_input ) + { + vlc_value_t val; + p_mediaControl->SetEnabled( true ); + bool hasTitles = !var_Get( p_input, "title", &val ); + bool hasChapters = !var_Get( p_input, "chapter", &val ); + p_mediaControl->SetStatus( var_GetInteger( p_input, "state" ), + var_GetInteger( p_input, "rate" ) ); + var_Get( p_input, "position", &val ); + p_mediaControl->SetProgress( val.f_float ); + _SetMenusEnabled( true, hasChapters, hasTitles ); + _UpdateSpeedMenu( var_GetInteger( p_input, "rate" ) ); + + // enable/disable skip buttons +#if 0 + bool canSkipPrev; + bool canSkipNext; + p_wrapper->GetNavCapabilities( &canSkipPrev, &canSkipNext ); + p_mediaControl->SetSkippable( canSkipPrev, canSkipNext ); +#endif + + audio_volume_t i_volume; + aout_VolumeGet( p_intf, &i_volume ); + p_mediaControl->SetAudioEnabled( true ); + p_mediaControl->SetMuted( i_volume ); + } + else + { + p_mediaControl->SetAudioEnabled( false ); + + _SetMenusEnabled( false ); + + if( !playlist_IsEmpty( p_playlist ) ) { - p_vlc_wrapper->setTimeAsFloat(p_mediaControl->GetSeekTo()); + p_mediaControl->SetProgress( 0 ); + +#if 0 + // enable/disable skip buttons + bool canSkipPrev; + bool canSkipNext; + p_wrapper->GetNavCapabilities( &canSkipPrev, &canSkipNext ); + p_mediaControl->SetSkippable( canSkipPrev, canSkipNext ); +#endif } - else if( Lock() ) + else { - p_mediaControl->SetStatus(p_intf->p_sys->p_input->stream.control.i_status, - p_intf->p_sys->p_input->stream.control.i_rate); - p_mediaControl->SetProgress(p_intf->p_sys->p_input->stream.p_selected_area->i_tell, - p_intf->p_sys->p_input->stream.p_selected_area->i_size); - Unlock(); + p_mediaControl->SetEnabled( false ); } } - - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if ( b_empty_playlist != (p_playlist->i_size < 1) ) + Unlock(); + fLastUpdateTime = system_time(); +} + +/***************************************************************************** + * InterfaceWindow::UpdatePlaylist + *****************************************************************************/ +void +InterfaceWindow::UpdatePlaylist() +{ + b_playlist_update = true; +} + +/***************************************************************************** + * InterfaceWindow::IsStopped + *****************************************************************************/ +bool +InterfaceWindow::IsStopped() const +{ + return (system_time() - fLastUpdateTime > INTERFACE_UPDATE_TIMEOUT); +} + +/***************************************************************************** + * InterfaceWindow::_SetMenusEnabled + *****************************************************************************/ +void +InterfaceWindow::_SetMenusEnabled(bool hasFile, bool hasChapters, bool hasTitles) +{ + if (!hasFile) + { + hasChapters = false; + hasTitles = false; + } + if ( LockWithTimeout( INTERFACE_LOCKING_TIMEOUT ) == B_OK) + { + if ( fNextChapterMI->IsEnabled() != hasChapters ) + fNextChapterMI->SetEnabled( hasChapters ); + if ( fPrevChapterMI->IsEnabled() != hasChapters ) + fPrevChapterMI->SetEnabled( hasChapters ); + if ( fChapterMenu->IsEnabled() != hasChapters ) + fChapterMenu->SetEnabled( hasChapters ); + if ( fNextTitleMI->IsEnabled() != hasTitles ) + fNextTitleMI->SetEnabled( hasTitles ); + if ( fPrevTitleMI->IsEnabled() != hasTitles ) + fPrevTitleMI->SetEnabled( hasTitles ); + if ( fTitleMenu->IsEnabled() != hasTitles ) + fTitleMenu->SetEnabled( hasTitles ); + if ( fAudioMenu->IsEnabled() != hasFile ) + fAudioMenu->SetEnabled( hasFile ); + if ( fNavigationMenu->IsEnabled() != hasFile ) + fNavigationMenu->SetEnabled( hasFile ); + if ( fLanguageMenu->IsEnabled() != hasFile ) + fLanguageMenu->SetEnabled( hasFile ); + if ( fSubtitlesMenu->IsEnabled() != hasFile ) + fSubtitlesMenu->SetEnabled( hasFile ); + if ( fSpeedMenu->IsEnabled() != hasFile ) + fSpeedMenu->SetEnabled( hasFile ); + Unlock(); + } +} + +/***************************************************************************** + * InterfaceWindow::_UpdateSpeedMenu + *****************************************************************************/ +void +InterfaceWindow::_UpdateSpeedMenu( int rate ) +{ + BMenuItem * toMark = NULL; + + switch( rate ) + { + case ( INPUT_RATE_DEFAULT * 8 ): + toMark = fHeighthMI; + break; + + case ( INPUT_RATE_DEFAULT * 4 ): + toMark = fQuarterMI; + break; + + case ( INPUT_RATE_DEFAULT * 2 ): + toMark = fHalfMI; + break; + + case ( INPUT_RATE_DEFAULT ): + toMark = fNormalMI; + break; + + case ( INPUT_RATE_DEFAULT / 2 ): + toMark = fTwiceMI; + break; + + case ( INPUT_RATE_DEFAULT / 4 ): + toMark = fFourMI; + break; + + case ( INPUT_RATE_DEFAULT / 8 ): + toMark = fHeightMI; + break; + } + + if ( toMark && !toMark->IsMarked() ) + { + toMark->SetMarked( true ); + } +} + +/***************************************************************************** + * InterfaceWindow::_ShowFilePanel + *****************************************************************************/ +void +InterfaceWindow::_ShowFilePanel( uint32 command, const char* windowTitle ) +{ + if( !fFilePanel ) + { + fFilePanel = new BFilePanel( B_OPEN_PANEL, NULL, NULL, + B_FILE_NODE | B_DIRECTORY_NODE ); + fFilePanel->SetTarget( this ); + } + fFilePanel->Window()->SetTitle( windowTitle ); + BMessage message( command ); + fFilePanel->SetMessage( &message ); + if ( !fFilePanel->IsShowing() ) + { + fFilePanel->Refresh(); + fFilePanel->Show(); + } +} + +// set_window_pos +void +set_window_pos( BWindow* window, BRect frame ) +{ + // sanity checks: make sure window is not too big/small + // and that it's not off-screen + float minWidth, maxWidth, minHeight, maxHeight; + window->GetSizeLimits( &minWidth, &maxWidth, &minHeight, &maxHeight ); + + make_sure_frame_is_within_limits( frame, + minWidth, minHeight, maxWidth, maxHeight ); + if ( make_sure_frame_is_on_screen( frame ) ) { - if (Lock()) + window->MoveTo( frame.LeftTop() ); + window->ResizeTo( frame.Width(), frame.Height() ); + } +} + +// set_window_pos +void +launch_window( BWindow* window, bool showing ) +{ + if ( window->Lock() ) + { + if ( showing ) + { + if ( window->IsHidden() ) + window->Show(); + } + else { - b_empty_playlist = !b_empty_playlist; - p_mediaControl->SetEnabled( !b_empty_playlist ); - Unlock(); + if ( !window->IsHidden() ) + window->Hide(); } + window->Unlock(); } } /***************************************************************************** - * InterfaceWindow::QuitRequested + * InterfaceWindow::_RestoreSettings *****************************************************************************/ -bool InterfaceWindow::QuitRequested() +void +InterfaceWindow::_RestoreSettings() { - p_intf->p_vlc->b_die = VLC_TRUE; + if ( load_settings( fSettings, "interface_settings", "VideoLAN Client" ) == B_OK ) + { + BRect frame; + if ( fSettings->FindRect( "main frame", &frame ) == B_OK ) + set_window_pos( this, frame ); +#if 0 + if (fSettings->FindRect( "playlist frame", &frame ) == B_OK ) + set_window_pos( fPlaylistWindow, frame ); +#endif + if (fSettings->FindRect( "messages frame", &frame ) == B_OK ) + set_window_pos( fMessagesWindow, frame ); + if (fSettings->FindRect( "settings frame", &frame ) == B_OK ) + { + /* FIXME: Preferences resizing doesn't work correctly yet */ + frame.right = frame.left + fPreferencesWindow->Frame().Width(); + frame.bottom = frame.top + fPreferencesWindow->Frame().Height(); + set_window_pos( fPreferencesWindow, frame ); + } - return( true ); + bool showing; +#if 0 + if ( fSettings->FindBool( "playlist showing", &showing ) == B_OK ) + launch_window( fPlaylistWindow, showing ); +#endif + if ( fSettings->FindBool( "messages showing", &showing ) == B_OK ) + launch_window( fMessagesWindow, showing ); + if ( fSettings->FindBool( "settings showing", &showing ) == B_OK ) + launch_window( fPreferencesWindow, showing ); +#if 0 + uint32 displayMode; + if ( fSettings->FindInt32( "playlist display mode", (int32*)&displayMode ) == B_OK ) + fPlaylistWindow->SetDisplayMode( displayMode ); +#endif + } } +/***************************************************************************** + * InterfaceWindow::_StoreSettings + *****************************************************************************/ +void +InterfaceWindow::_StoreSettings() +{ + /* Save the volume */ + config_PutInt( p_intf, "volume", p_mediaControl->GetVolume() ); + config_SaveConfigFile( p_intf, "main" ); + + /* Save the windows positions */ + if ( fSettings->ReplaceRect( "main frame", Frame() ) != B_OK ) + fSettings->AddRect( "main frame", Frame() ); +#if 0 + if ( fPlaylistWindow->Lock() ) + { + if (fSettings->ReplaceRect( "playlist frame", fPlaylistWindow->Frame() ) != B_OK) + fSettings->AddRect( "playlist frame", fPlaylistWindow->Frame() ); + if (fSettings->ReplaceBool( "playlist showing", !fPlaylistWindow->IsHidden() ) != B_OK) + fSettings->AddBool( "playlist showing", !fPlaylistWindow->IsHidden() ); + fPlaylistWindow->Unlock(); + } +#endif + if ( fMessagesWindow->Lock() ) + { + if (fSettings->ReplaceRect( "messages frame", fMessagesWindow->Frame() ) != B_OK) + fSettings->AddRect( "messages frame", fMessagesWindow->Frame() ); + if (fSettings->ReplaceBool( "messages showing", !fMessagesWindow->IsHidden() ) != B_OK) + fSettings->AddBool( "messages showing", !fMessagesWindow->IsHidden() ); + fMessagesWindow->Unlock(); + } + if ( fPreferencesWindow->Lock() ) + { + if (fSettings->ReplaceRect( "settings frame", fPreferencesWindow->Frame() ) != B_OK) + fSettings->AddRect( "settings frame", fPreferencesWindow->Frame() ); + if (fSettings->ReplaceBool( "settings showing", !fPreferencesWindow->IsHidden() ) != B_OK) + fSettings->AddBool( "settings showing", !fPreferencesWindow->IsHidden() ); + fPreferencesWindow->Unlock(); + } +#if 0 + uint32 displayMode = fPlaylistWindow->DisplayMode(); + if (fSettings->ReplaceInt32( "playlist display mode", displayMode ) != B_OK ) + fSettings->AddInt32( "playlist display mode", displayMode ); +#endif + save_settings( fSettings, "interface_settings", "VideoLAN Client" ); +} + + /***************************************************************************** * CDMenu::CDMenu *****************************************************************************/ @@ -431,8 +1169,10 @@ CDMenu::~CDMenu() *****************************************************************************/ void CDMenu::AttachedToWindow(void) { - while (RemoveItem((long int)0) != NULL); // remove all items - GetCD("/dev/disk"); + // remove all items + while ( BMenuItem* item = RemoveItem( 0L ) ) + delete item; + GetCD( "/dev/disk" ); BMenu::AttachedToWindow(); } @@ -441,64 +1181,38 @@ void CDMenu::AttachedToWindow(void) *****************************************************************************/ int CDMenu::GetCD( const char *directory ) { - BVolumeRoster *volRoster; - BVolume *vol; - BDirectory *dir; - int status; - int mounted; - char name[B_FILE_NAME_LENGTH]; - fs_info info; - dev_t dev; - - volRoster = new BVolumeRoster(); - vol = new BVolume(); - dir = new BDirectory(); - status = volRoster->GetNextVolume(vol); - status = vol->GetRootDirectory(dir); - while (status == B_NO_ERROR) - { - mounted = vol->GetName(name); - if ((mounted == B_OK) && /* Disk is currently Mounted */ - (vol->IsReadOnly()) ) /* Disk is read-only */ - { - dev = vol->Device(); - fs_stat_dev(dev, &info); - - device_geometry g; - int i_dev; - i_dev = open( info.device_name, O_RDONLY ); - - if( i_dev >= 0 ) - { - if( ioctl(i_dev, B_GET_GEOMETRY, &g, sizeof(g)) >= 0 ) - { - if( g.device_type == B_CD ) //ensure the drive is a CD-ROM - { - BMessage *msg; - msg = new BMessage( OPEN_DVD ); - msg->AddString( "device", info.device_name ); - BMenuItem *menu_item; - menu_item = new BMenuItem( name, msg ); - AddItem( menu_item ); - } - close(i_dev); - } - } - } - vol->Unset(); - status = volRoster->GetNextVolume(vol); - } + BVolumeRoster volRoster; + BVolume vol; + BDirectory dir; + status_t status = volRoster.GetNextVolume( &vol ); + while ( status == B_NO_ERROR ) + { + BString deviceName; + BString volumeName; + bool isCDROM; + if ( get_volume_info( vol, volumeName, isCDROM, deviceName ) + && isCDROM ) + { + BMessage* msg = new BMessage( OPEN_DVD ); + msg->AddString( "device", deviceName.String() ); + BMenuItem* item = new BMenuItem( volumeName.String(), msg ); + AddItem( item ); + } + vol.Unset(); + status = volRoster.GetNextVolume( &vol ); + } + return 0; } /***************************************************************************** * LanguageMenu::LanguageMenu *****************************************************************************/ -LanguageMenu::LanguageMenu(const char *name, int menu_kind, - intf_thread_t *p_interface) - :BMenu(name) +LanguageMenu::LanguageMenu( intf_thread_t * _p_intf, const char * psz_name, + char * _psz_variable ) + : BMenu( psz_name ) { - kind = menu_kind; - p_intf = p_interface; + p_intf = _p_intf; + psz_variable = strdup( _psz_variable ); } /***************************************************************************** @@ -506,86 +1220,237 @@ LanguageMenu::LanguageMenu(const char *name, int menu_kind, *****************************************************************************/ LanguageMenu::~LanguageMenu() { + free( psz_variable ); } /***************************************************************************** * LanguageMenu::AttachedToWindow *****************************************************************************/ -void LanguageMenu::AttachedToWindow(void) +void LanguageMenu::AttachedToWindow() { - while( RemoveItem((long int)0) != NULL ) + BMenuItem * item; + + // remove all items + while( ( item = RemoveItem( 0L ) ) ) { - ; // remove all items + delete item; } - SetRadioMode(true); - GetChannels(); + SetRadioMode( true ); + + input_thread_t * p_input = (input_thread_t *) + vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( !p_input ) + { + return; + } + + vlc_value_t val_list, text_list; + BMessage * message; + int i_current; + + i_current = var_GetInteger( p_input, psz_variable ); + var_Change( p_input, psz_variable, VLC_VAR_GETLIST, &val_list, &text_list ); + for( int i = 0; i < val_list.p_list->i_count; i++ ) + { + message = new BMessage( SELECT_CHANNEL ); + message->AddInt32( psz_variable, val_list.p_list->p_values[i].i_int ); + item = new BMenuItem( text_list.p_list->p_values[i].psz_string, message ); + if( val_list.p_list->p_values[i].i_int == i_current ) + { + item->SetMarked( true ); + } + AddItem( item ); + } + var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list ); + + vlc_object_release( p_input ); + BMenu::AttachedToWindow(); } /***************************************************************************** - * LanguageMenu::GetChannels + * TitleMenu::TitleMenu + *****************************************************************************/ +TitleMenu::TitleMenu( const char *name, intf_thread_t *p_interface ) + : BMenu(name), + p_intf( p_interface ) +{ +} + +/***************************************************************************** + * TitleMenu::~TitleMenu *****************************************************************************/ -int LanguageMenu::GetChannels() +TitleMenu::~TitleMenu() { - char *psz_name; - bool b_active; - BMessage *msg; - int i; - es_descriptor_t *p_es = NULL; +} - /* Insert the null */ - if( kind == SPU_ES ) //audio +/***************************************************************************** + * TitleMenu::AttachedToWindow + *****************************************************************************/ +void TitleMenu::AttachedToWindow() +{ + BMenuItem * item; + while( ( item = RemoveItem( 0L ) ) ) { - msg = new BMessage(SELECT_SUBTITLE); - msg->AddInt32("subtitle", -1); - BMenuItem *menu_item; - menu_item = new BMenuItem("None", msg); - AddItem(menu_item); - menu_item->SetMarked(TRUE); + delete item; + } + input_thread_t * p_input; + p_input = (input_thread_t *) + vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( !p_input ) + { + return; } - if( p_intf->p_sys->p_input == NULL ) + vlc_value_t val; + BMessage * message; + if( !var_Get( p_input, "title", &val ) ) { - return 1; + vlc_value_t val_list, text_list; + var_Change( p_input, "title", VLC_VAR_GETCHOICES, + &val_list, &text_list ); + + for( int i = 0; i < val_list.p_list->i_count; i++ ) + { + message = new BMessage( TOGGLE_TITLE ); + message->AddInt32( "index", val_list.p_list->p_values[i].i_int ); + item = new BMenuItem( text_list.p_list->p_values[i].psz_string, + message ); + if( val_list.p_list->p_values[i].i_int == val.i_int ) + { + item->SetMarked( true ); + } + AddItem( item ); + } + + var_Change( p_input, "title", VLC_VAR_FREELIST, + &val_list, &text_list ); + } + vlc_object_release( p_input ); + BMenu::AttachedToWindow(); +} + + +/***************************************************************************** + * ChapterMenu::ChapterMenu + *****************************************************************************/ +ChapterMenu::ChapterMenu( const char *name, intf_thread_t *p_interface ) + : BMenu(name), + p_intf( p_interface ) +{ +} + +/***************************************************************************** + * ChapterMenu::~ChapterMenu + *****************************************************************************/ +ChapterMenu::~ChapterMenu() +{ +} + +/***************************************************************************** + * ChapterMenu::AttachedToWindow + *****************************************************************************/ +void ChapterMenu::AttachedToWindow() +{ + BMenuItem * item; + while( ( item = RemoveItem( 0L ) ) ) + { + delete item; } + input_thread_t * p_input; + p_input = (input_thread_t *) + vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( !p_input ) + { + return; + } - vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); - for( i = 0; i < p_intf->p_sys->p_input->stream.i_selected_es_number; i++ ) + vlc_value_t val; + BMessage * message; + if( !var_Get( p_input, "chapter", &val ) ) { - if( kind == p_intf->p_sys->p_input->stream.pp_selected_es[i]->i_cat ) + vlc_value_t val_list, text_list; + var_Change( p_input, "chapter", VLC_VAR_GETCHOICES, + &val_list, &text_list ); + + for( int i = 0; i < val_list.p_list->i_count; i++ ) { - p_es = p_intf->p_sys->p_input->stream.pp_selected_es[i]; + message = new BMessage( TOGGLE_CHAPTER ); + message->AddInt32( "index", val_list.p_list->p_values[i].i_int ); + item = new BMenuItem( text_list.p_list->p_values[i].psz_string, + message ); + if( val_list.p_list->p_values[i].i_int == val.i_int ) + { + item->SetMarked( true ); + } + AddItem( item ); } + + var_Change( p_input, "chapter", VLC_VAR_FREELIST, + &val_list, &text_list ); } + vlc_object_release( p_input ); + BMenu::AttachedToWindow(); +} - for( i = 0; i < p_intf->p_sys->p_input->stream.i_es_number; i++ ) + +/***************************************************************************** + * load_settings + *****************************************************************************/ +status_t +load_settings( BMessage* message, const char* fileName, const char* folder ) +{ + status_t ret = B_BAD_VALUE; + if ( message ) { - if( kind == p_intf->p_sys->p_input->stream.pp_es[i]->i_cat ) + BPath path; + if ( ( ret = find_directory( B_USER_SETTINGS_DIRECTORY, &path ) ) == B_OK ) { - psz_name = p_intf->p_sys->p_input->stream.pp_es[i]->psz_desc; - if( kind == AUDIO_ES ) //audio + // passing folder is optional + if ( folder ) + ret = path.Append( folder ); + if ( ret == B_OK && ( ret = path.Append( fileName ) ) == B_OK ) { - msg = new BMessage(SELECT_AUDIO); - msg->AddInt32("audio", i); + BFile file( path.Path(), B_READ_ONLY ); + if ( ( ret = file.InitCheck() ) == B_OK ) + { + ret = message->Unflatten( &file ); + file.Unset(); + } } - else + } + } + return ret; +} + +/***************************************************************************** + * save_settings + *****************************************************************************/ +status_t +save_settings( BMessage* message, const char* fileName, const char* folder ) +{ + status_t ret = B_BAD_VALUE; + if ( message ) + { + BPath path; + if ( ( ret = find_directory( B_USER_SETTINGS_DIRECTORY, &path ) ) == B_OK ) + { + // passing folder is optional + if ( folder && ( ret = path.Append( folder ) ) == B_OK ) + ret = create_directory( path.Path(), 0777 ); + if ( ret == B_OK && ( ret = path.Append( fileName ) ) == B_OK ) { - msg = new BMessage(SELECT_SUBTITLE); - msg->AddInt32("subtitle", i); + BFile file( path.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE ); + if ( ( ret = file.InitCheck() ) == B_OK ) + { + ret = message->Flatten( &file ); + file.Unset(); + } } - BMenuItem *menu_item; - menu_item = new BMenuItem(psz_name, msg); - AddItem(menu_item); - b_active = (p_es == p_intf->p_sys->p_input->stream.pp_es[i]); - menu_item->SetMarked(b_active); } } - vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); - + return ret; } - - -