📄 interfacewindow.cpp
字号:
/***************************************************************************** * InterfaceWindow.cpp: beos interface ***************************************************************************** * Copyright (C) 1999, 2000, 2001 VideoLAN * $Id: InterfaceWindow.cpp,v 1.45 2004/01/26 16:52:31 zorglub Exp $ * * Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Samuel Hocevar <sam@zoy.org> * Tony Castley <tony@castley.net> * Richard Shepherd <richard@rshepherd.demon.co.uk> * Stephan Aßmus <stippi@yellowbites.com> * * 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 * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * 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. *****************************************************************************//* System headers */#include <kernel/OS.h>#include <InterfaceKit.h>#include <AppKit.h>#include <StorageKit.h>#include <SupportKit.h>#include <malloc.h>#include <scsi.h>#include <scsiprobe_driver.h>#include <fs_info.h>#include <string.h>/* VLC headers */#include <vlc/vlc.h>#include <vlc/aout.h>#include <vlc/intf.h>/* BeOS interface headers */#include "VlcWrapper.h"#include "MsgVals.h"#include "MediaControlView.h"#include "PlayListWindow.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_screenboolmake_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_limitsvoidmake_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_infoboolget_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_contentsvoidcollect_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?"), _("No"), _("Yes"), 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 ); } } }}/***************************************************************************** * InterfaceWindow *****************************************************************************/InterfaceWindow::InterfaceWindow( BRect frame, const char* name, intf_thread_t* p_interface ) : BWindow( frame, name, B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ), p_intf( p_interface ), fFilePanel( NULL ), fLastUpdateTime( system_time() ), fSettings( new BMessage( 'sett' ) ), p_wrapper( p_intf->p_sys->p_wrapper ){ fPlaylistIsEmpty = !( p_wrapper->PlaylistSize() > 0 ); 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 ); 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 ); fMessagesWindow = new MessagesWindow( p_intf, window_rect, _("Messages") ); // the media control view p_mediaControl = new MediaControlView( BRect( 0.0, 0.0, 250.0, 50.0 ), p_intf ); 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 ); AddChild( p_mediaControl ); // Add the file Menu BMenu* fileMenu = new BMenu( _("File") ); fMenuBar->AddItem( fileMenu ); fileMenu->AddItem( new BMenuItem( _AddEllipsis(_("Open File")), new BMessage( OPEN_FILE ), 'O') ); fileMenu->AddItem( new CDMenu( _("Open Disc") ) ); fileMenu->AddItem( new BMenuItem( _AddEllipsis(_("Open Subtitles")), new BMessage( LOAD_SUBFILE ) ) ); fileMenu->AddSeparatorItem(); BMenuItem* item = new BMenuItem( _AddEllipsis(_("About")), 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( _("Language"), AUDIO_ES, p_wrapper); fSubtitlesMenu = new LanguageMenu( _("Subtitles"), SPU_ES, p_wrapper); /* Add the Audio menu */ 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 ) ); fGotoMenuMI = new BMenuItem( _("Goto Menu"), new BMessage( NAVIGATE_MENU ) ); /* Add the Navigation menu */ fNavigationMenu = new BMenu( _("Navigation") ); fMenuBar->AddItem( fNavigationMenu ); fNavigationMenu->AddItem( fGotoMenuMI ); fNavigationMenu->AddSeparatorItem(); 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") ); fShowMenu->AddItem( new BMenuItem( _AddEllipsis(_("Playlist")), new BMessage( OPEN_PLAYLIST ), 'P') ); fShowMenu->AddItem( new BMenuItem( _AddEllipsis(_("Messages")), new BMessage( OPEN_MESSAGES ), 'M' ) ); fShowMenu->AddItem( new BMenuItem( _AddEllipsis(_("Preferences")), new BMessage( OPEN_PREFERENCES ), 'S' ) ); fMenuBar->AddItem( fShowMenu ); /* Prepare fow showing */ _SetMenusEnabled( false ); p_mediaControl->SetEnabled( false ); _RestoreSettings(); Show();}InterfaceWindow::~InterfaceWindow(){ if( fPlaylistWindow ) fPlaylistWindow->ReallyQuit(); fPlaylistWindow = NULL; if( fMessagesWindow ) fMessagesWindow->ReallyQuit(); fMessagesWindow = NULL; if( fPreferencesWindow ) fPreferencesWindow->ReallyQuit(); fPreferencesWindow = NULL; delete fFilePanel; delete fSettings;}/***************************************************************************** * InterfaceWindow::FrameResized *****************************************************************************/voidInterfaceWindow::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());}/***************************************************************************** * InterfaceWindow::MessageReceived *****************************************************************************/void InterfaceWindow::MessageReceived( BMessage * p_message ){ int playback_status; // remember playback state playback_status = p_wrapper->InputStatus(); switch( p_message->what ) { case B_ABOUT_REQUESTED: { BAlert* alert = new BAlert( "VLC " PACKAGE_VERSION, "VLC " PACKAGE_VERSION " for BeOS" "\n\n<www.videolan.org>", _("OK")); alert->Go(); break; } 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; case OPEN_PLAYLIST: if (fPlaylistWindow->Lock()) { if (fPlaylistWindow->IsHidden()) fPlaylistWindow->Show(); else fPlaylistWindow->Activate(); fPlaylistWindow->Unlock(); } break; case OPEN_DVD: { const char *psz_device; BString type( "dvd" ); if( p_message->FindString( "device", &psz_device ) == B_OK ) { BString device( psz_device ); p_wrapper->OpenDisc( type, device, 0, 0 ); } _UpdatePlaylist(); } break; case SUBFILE_RECEIVED: { entry_ref ref; if( p_message->FindRef( "refs", 0, &ref ) == B_OK ) { BPath path( &ref ); if ( path.InitCheck() == B_OK ) p_wrapper->LoadSubFile( path.Path() ); } break; } case STOP_PLAYBACK: // this currently stops playback not nicely if (playback_status > UNDEF_S) { p_wrapper->PlaylistStop(); p_mediaControl->SetStatus(UNDEF_S, DEFAULT_RATE); } break; case START_PLAYBACK: /* starts playing in normal mode */ case PAUSE_PLAYBACK:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -