+/*****************************************************************************
+ * CDMenu::CDMenu
+ *****************************************************************************/
+CDMenu::CDMenu(const char *name)
+ : BMenu(name)
+{
+}
+
+/*****************************************************************************
+ * CDMenu::~CDMenu
+ *****************************************************************************/
+CDMenu::~CDMenu()
+{
+}
+
+/*****************************************************************************
+ * CDMenu::AttachedToWindow
+ *****************************************************************************/
+void CDMenu::AttachedToWindow(void)
+{
+ while (RemoveItem((long int)0) != NULL); // remove all items
+ GetCD("/dev/disk");
+ BMenu::AttachedToWindow();
+}
+
+/*****************************************************************************
+ * CDMenu::GetCD
+ *****************************************************************************/
+int CDMenu::GetCD(const char *directory)
+{
+ 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);
+ 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);
+ AddItem(menu_item);
+ continue;
+ }
+ }
+ }
+ close(devfd);
+ }
+ }
+ return B_ERROR;
+}
+
+/*****************************************************************************
+ * LanguageMenu::LanguageMenu
+ *****************************************************************************/
+LanguageMenu::LanguageMenu(const char *name, int menu_kind, intf_thread_t *p_interface)
+ :BMenu(name)
+{
+ kind = menu_kind;
+ p_intf = p_interface;
+}
+
+/*****************************************************************************
+ * LanguageMenu::~LanguageMenu
+ *****************************************************************************/
+LanguageMenu::~LanguageMenu()
+{
+}
+
+/*****************************************************************************
+ * LanguageMenu::AttachedToWindow
+ *****************************************************************************/
+void LanguageMenu::AttachedToWindow(void)
+{
+ while (RemoveItem((long int)0) != NULL); // remove all items
+ SetRadioMode(true);
+ GetChannels();
+ BMenu::AttachedToWindow();
+}
+
+/*****************************************************************************
+ * LanguageMenu::GetChannels
+ *****************************************************************************/
+int LanguageMenu::GetChannels()
+{
+ char* psz_name;
+ bool b_active;
+ bool b_found;
+ int32 i;
+ es_descriptor_t *p_es;
+
+ if (p_intf->p_input == NULL)
+ return 1;
+
+ for (i = 0; i < p_intf->p_input->stream.i_selected_es_number; i++)
+ {
+ if (kind ==
+ p_intf->p_input->stream.pp_selected_es[i]->i_cat)
+ {
+ p_es = p_intf->p_input->stream.pp_selected_es[i];
+ }
+ }
+ for (i = 0; i < p_intf->p_input->stream.i_es_number; i++)
+ {
+ if (kind == p_intf->p_input->stream.pp_es[i]->i_cat)
+ {
+ psz_name = p_intf->p_input->stream.pp_es[i]->psz_desc;
+ BMessage *msg;
+ if (kind == AUDIO_ES) //audio
+ {
+ msg = new BMessage(SELECT_CHANNEL);
+ msg->AddInt32("channel", i);
+ }
+ else
+ {
+ msg = new BMessage(SELECT_SUBTITLE);
+ msg->AddInt32("subtitle", i);
+ }
+ BMenuItem *menu_item;
+ menu_item = new BMenuItem(psz_name, msg);
+ AddItem(menu_item);
+ b_active = (p_es == p_intf->p_input->stream.pp_es[i]);
+ menu_item->SetMarked(b_active);
+ }
+ }
+}
+
+
+/*****************************************************************************
+ * MediaSlider
+ *****************************************************************************/
+MediaSlider::MediaSlider(BRect frame,
+ BMessage *message,
+ int32 minValue,
+ int32 maxValue)
+ :BSlider(frame, NULL, NULL, message, minValue, maxValue)
+{
+
+}
+
+MediaSlider::~MediaSlider()
+{
+
+}
+
+void MediaSlider::DrawThumb(void)
+{
+ BRect r;
+ BView *v;
+
+ rgb_color black = {0,0,0};
+ r = ThumbFrame();
+ v = OffscreenView();
+ if(IsEnabled())
+ v->SetHighColor(black);
+ else
+ v->SetHighColor(tint_color(black, B_LIGHTEN_2_TINT));
+ r.InsetBy(r.IntegerWidth()/4, r.IntegerHeight()/(4 * r.IntegerWidth() / r.IntegerHeight()));
+ v->StrokeEllipse(r);
+ if(IsEnabled())
+ v->SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+ else
+ v->SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_LIGHTEN_2_TINT));
+ r.InsetBy(1,1);
+ v->FillEllipse(r);
+}
+
+/*****************************************************************************
+ * SeekSlider
+ *****************************************************************************/
+SeekSlider::SeekSlider(BRect frame,
+ InterfaceWindow *owner,
+ int32 minValue,
+ int32 maxValue,
+ thumb_style thumbType = B_TRIANGLE_THUMB)
+ :MediaSlider(frame, NULL, minValue, maxValue)
+{
+ fOwner = owner;
+ fMouseDown = false;
+}
+
+SeekSlider::~SeekSlider()
+{
+}
+
+/*****************************************************************************
+ * SeekSlider::MouseDown
+ *****************************************************************************/
+void SeekSlider::MouseDown(BPoint where)
+{
+ BSlider::MouseDown(where);
+ fOwner->fScrubSem = create_sem(1, "Vlc::fScrubSem");
+ fMouseDown = true;
+}
+
+/*****************************************************************************
+ * SeekSlider::MouseUp
+ *****************************************************************************/
+void SeekSlider::MouseMoved(BPoint where, uint32 code, const BMessage *message)
+{
+ BSlider::MouseMoved(where, code, message);
+ if (!fMouseDown)
+ return;
+ release_sem(fOwner->fScrubSem);
+}
+
+/*****************************************************************************
+ * SeekSlider::MouseUp
+ *****************************************************************************/
+void SeekSlider::MouseUp(BPoint where)
+{
+ BSlider::MouseUp(where);
+ delete_sem(fOwner->fScrubSem);
+ fOwner->fScrubSem = B_ERROR;
+ fMouseDown = false;
+}
+