]> git.sesse.net Git - vlc/commitdiff
Added DVD device selection from interface menu
authorRichard Shepherd <richards@videolan.org>
Tue, 6 Mar 2001 19:52:03 +0000 (19:52 +0000)
committerRichard Shepherd <richards@videolan.org>
Tue, 6 Mar 2001 19:52:03 +0000 (19:52 +0000)
plugins/beos/InterfaceWindow.h
plugins/beos/intf_beos.cpp
plugins/beos/vout_beos.cpp

index 887489c52e7906dcc7a893b79877c366d55126a0..b7246620e942be200b493f72bb631aa6ae0d04ac 100644 (file)
@@ -32,6 +32,7 @@ public:
     virtual bool    QuitRequested();
     virtual void    MessageReceived(BMessage *message);
     
+       
     intf_thread_t  *p_intf;
        BSlider * p_vol;
        BSlider * p_seek;
@@ -39,6 +40,9 @@ public:
        sem_id  fScrubSem;
        bool    fSeeking;
        BFilePanel *file_panel;
+
+private:
+       int GetCD(const char *directory, BMenu *cd_menu);
 };
 
 class InterfaceView : public BView
index 62437e39ceb7b12a40f3a98ad64785c391804cfd..05f1ec81adfcaa3367afb6c153274e961a42e523 100644 (file)
@@ -2,7 +2,7 @@
  * intf_beos.cpp: beos interface
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: intf_beos.cpp,v 1.17 2001/03/06 01:26:06 richards Exp $
+ * $Id: intf_beos.cpp,v 1.18 2001/03/06 19:52:03 richards Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
 #include <Screen.h>
 #include <malloc.h>
 #include <string.h>
+#include <Directory.h>
+#include <Entry.h>
+#include <Path.h>
+#include <StorageDefs.h>
+#include <scsi.h>
+#include <scsiprobe_driver.h>
 
 extern "C"
 {
@@ -114,13 +120,16 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name , intf_thread_t
     menu_bar = new BMenuBar(rect, "main menu");
     AddChild( menu_bar );
 
-       BMenu *m;
+       BMenu *m, *cd_menu;
 
        menu_bar->AddItem( m = new BMenu("File") );
        menu_bar->ResizeToPreferred();
-       m->AddItem( new BMenuItem("Open file...", new BMessage(OPEN_FILE), 'O'));
-       m->AddItem( new BMenuItem("Open DVD...", new BMessage(OPEN_DVD), 'D'));
+       m->AddItem( new BMenuItem("Open File...", new BMessage(OPEN_FILE), 'O'));
+       cd_menu = new BMenu("Open DVD");
+       GetCD("/dev/disk", cd_menu);
+       m->AddItem(cd_menu);
        m->AddSeparatorItem();
+       m->AddItem( new BMenuItem("About...", new BMessage(B_ABOUT_REQUESTED), 'A'));
        m->AddItem( new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
        
 
@@ -231,6 +240,11 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
        Activate();
     switch( p_message->what )
     {
+    case B_ABOUT_REQUESTED:
+               alert = new BAlert(VOUT_TITLE, "BeOS " VOUT_TITLE "\n\n<www.videolan.org>", "Ok");
+           alert->Go();
+           break;      
+    
     case OPEN_FILE:
        if(file_panel)
                {
@@ -243,9 +257,13 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
        break;
 
     case OPEN_DVD:
-           alert = new BAlert(VOUT_TITLE, "Play DVD from menu not yet supported", "Bummer");
-           alert->Go();
-           //intf_PlstAdd( p_main->p_playlist, PLAYLIST_END, "dvd:/dev/disk/ide/atapi/1/master/0/raw" );
+           const char **device;
+           char device_method_and_name[B_FILE_NAME_LENGTH + 4];
+           if(p_message->FindString("device", device) != B_ERROR)
+               {
+               sprintf(device_method_and_name, "dvd:%s", *device); 
+               intf_PlstAdd( p_main->p_playlist, PLAYLIST_END, device_method_and_name );
+               }
        break;
 
     case STOP_PLAYBACK:
@@ -390,6 +408,74 @@ bool InterfaceWindow::QuitRequested()
 
     return( false );
 }
+
+
+int InterfaceWindow::GetCD(const char *directory, BMenu *cd_menu)
+{ 
+       BDirectory dir; 
+       dir.SetTo(directory); 
+       if(dir.InitCheck() != B_NO_ERROR) { 
+               return B_ERROR; 
+       } 
+       dir.Rewind(); 
+       BEntry entry; 
+       while(dir.GetNextEntry(&entry) >= 0) { 
+               BPath path; 
+               const char *name; 
+               entry_ref e; 
+               
+               if(entry.GetPath(&path) != B_NO_ERROR) 
+                       continue; 
+               name = path.Path(); 
+               
+               
+               if(entry.GetRef(&e) != B_NO_ERROR) 
+                       continue; 
+
+               if(entry.IsDirectory()) { 
+                       if(strcmp(e.name, "floppy") == 0) 
+                               continue; // ignore floppy (it is not silent) 
+                       int devfd = GetCD(name, cd_menu);
+                       if(devfd >= 0)
+                               {
+                               return devfd;
+                               }
+               } 
+               else { 
+                       int devfd; 
+                       device_geometry g; 
+                       status_t m;
+
+                       if(strcmp(e.name, "raw") != 0) 
+                               continue; // ignore partitions 
+
+                       devfd = open(name, O_RDONLY); 
+                       if(devfd < 0) 
+                               continue; 
+
+                       if(ioctl(devfd, B_GET_GEOMETRY, &g, sizeof(g)) >= 0) {
+                               if(g.device_type == B_CD) //ensure the drive is a CD-ROM
+                               { 
+                                       if(ioctl(devfd, B_GET_MEDIA_STATUS, &m, sizeof(m)) >= 0 )
+                                               if(m == B_NO_ERROR) //ensure media is present
+                                                       {
+                                                       BMessage *msg;
+                                                       msg = new BMessage(OPEN_DVD);
+                                                       msg->AddString("device", name);
+                                                       BMenuItem *menu_item;
+                                                       menu_item = new BMenuItem(name, msg);
+                                                       cd_menu->AddItem(menu_item);
+                                                       continue;
+                                                       }
+                               }
+                       }
+                       close(devfd);
+               } 
+       }
+       return B_ERROR;
+}
+
+
 /*****************************************************************************
  * MediaSlider
  *****************************************************************************/
index 08210c9bd13f7ffbba992a0cc957740cab067ea6..4ebecdaf1cc562904e5e8328e7258d260af771e0 100644 (file)
@@ -142,7 +142,7 @@ int32 DrawingThread(void *data)
  *****************************************************************************/
 
 VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_output )
-        : BWindow(frame, name, B_DOCUMENT_WINDOW, NULL)
+        : BWindow(frame, name, B_TITLED_WINDOW, NULL)
 {
        float minWidth, minHeight, maxWidth, maxHeight; 
 
@@ -247,7 +247,6 @@ void VideoWindow::Zoom(BPoint origin, float width, float height )
 {
 if(is_zoomed)
        {
-       SetLook(B_DOCUMENT_WINDOW_LOOK);
        MoveTo(rect.left, rect.top);
        ResizeTo(rect.IntegerWidth(), rect.IntegerHeight());
        be_app->ShowCursor();
@@ -259,7 +258,6 @@ else
        screen = new BScreen(this);
        BRect rect = screen->Frame();
        delete screen;
-       SetLook(B_NO_BORDER_WINDOW_LOOK);
        MoveTo(0,0);
        ResizeTo(rect.IntegerWidth(), rect.IntegerHeight());
        be_app->HideCursor();