--- Gui/app.h	2005-01-25 13:44:37.000000000 +0100
+++ Gui/app.h	2006-02-01 01:09:32.000000000 +0100
@@ -61,6 +61,10 @@
 #define evSetAudio	    45
 #define evSetVideo	    46
 // 47 ...
+//#ifdef USE_MPDVDNAV
+#define evPlayDVDNAV	    47
+#define evMenuDVDNAV	    48
+//#endif
 
 #define evExit              1000
 
@@ -80,6 +84,12 @@
 #define evSubtitleLoaded  5011
 #define evSetVCDTrack     5012
 #define evSetURL          5013
+//#ifdef USE_MPDVDNAV
+#define evSetDVDNAVAudio     5014
+#define evSetDVDNAVSubtitle  5015
+#define evSetDVDNAVTitle     5016
+#define evSetDVDNAVChapter   5017
+//#endif
 
 #define evFName           7000
 #define evMovieTime       7001
--- Gui/interface.h	2006-01-04 16:54:47.000000000 +0100
+++ Gui/interface.h	2006-02-01 01:09:32.000000000 +0100
@@ -11,6 +11,9 @@
 #ifdef USE_DVDREAD
  #include "libmpdemux/stream.h"
 #endif
+#ifdef USE_MPDVDNAV
+ #include "libmpdemux/stream_dvdnav.h"
+#endif
 
 typedef struct
 {
@@ -51,6 +54,22 @@
 } guiDVDStruct;
 #endif
 
+#ifdef USE_MPDVDNAV
+typedef struct
+{
+ int titles;
+ int chapters;
+ int angles;
+ int current_chapter;
+ int current_title;
+ int current_angle;
+ int nr_of_audio_channels;
+ stream_language_t audio_streams[32];
+ int nr_of_subtitles;
+ stream_language_t subtitles[32];
+} guiDVDNAVStruct;
+#endif
+
 typedef struct
 {
  int message;
@@ -73,6 +92,13 @@
    int			Chapter;
 #endif
 
+#ifdef USE_MPDVDNAV
+   guiDVDNAVStruct      DVDNAV;
+   int			NavTitle;
+   int			NavAngle;
+   int			NavChapter;
+#endif
+
 #ifdef HAVE_VCD
    int    VCDTracks;
 #endif
@@ -132,6 +158,9 @@
 #define guiSetDemuxer       15
 #define guiSetParameters    16
 #define guiSetAfilter       17
+#ifdef USE_MPDVDNAV
+#define guiSetDVDNAV        18
+#endif
 
 #define guiSetStop  0
 #define guiSetPlay  1
@@ -140,6 +169,9 @@
 #define guiDVD      	1
 #define guiVCD		2
 #define guiFilenames	4
+#ifdef USE_MPDVDNAV
+#define guiDVDNAV      	8
+#endif
 #define guiALL		0xffffffff
 
 extern char *get_path(char *filename); 
--- Gui/interface.c	2005-12-08 23:12:56.000000000 +0100
+++ Gui/interface.c	2006-02-01 01:09:32.000000000 +0100
@@ -537,6 +537,9 @@
 #ifdef USE_DVDREAD
  dvd_priv_t * dvdp = (dvd_priv_t *) arg;
 #endif 
+#ifdef USE_MPDVDNAV
+ dvdnav_priv_t * dvdnavp = (dvdnav_priv_t *) arg;
+#endif 
 
  switch ( type )
   {
@@ -605,6 +608,33 @@
         guiIntfStruct.Track=dvd_title + 1;
         break;
 #endif
+#ifdef USE_MPDVDNAV
+   case guiSetDVDNAV:
+#if 0
+        guiIntfStruct.DVDNAV.titles=dvdp->vmg_file->tt_srpt->nr_of_srpts;
+        guiIntfStruct.DVDNAV.chapters=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts;
+        guiIntfStruct.DVDNAV.angles=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles;
+        guiIntfStruct.DVDNAV.nr_of_audio_channels=dvdp->nr_of_channels;
+        memcpy( guiIntfStruct.DVDNAV.audio_streams,dvdp->audio_streams,sizeof( dvdp->audio_streams ) );
+        guiIntfStruct.DVDNAV.nr_of_subtitles=dvdp->nr_of_subtitles;
+        memcpy( guiIntfStruct.DVDNAV.subtitles,dvdp->subtitles,sizeof( dvdp->subtitles ) );
+        guiIntfStruct.DVDNAV.current_title=dvd_title + 1;
+        guiIntfStruct.DVDNAV.current_chapter=dvd_chapter + 1;
+        guiIntfStruct.DVDNAV.current_angle=dvd_angle + 1;
+        guiIntfStruct.Track=dvd_title + 1;
+#else
+        guiIntfStruct.DVDNAV.titles=dvdnavp->titles_nr;
+        guiIntfStruct.DVDNAV.chapters=dvdnavp->chapters_nr;
+        guiIntfStruct.DVDNAV.current_title=dvdnavp->title;
+        guiIntfStruct.DVDNAV.current_chapter=dvdnavp->part;
+
+        guiIntfStruct.DVDNAV.nr_of_audio_channels=dvdnavp->nr_of_channels;
+        memcpy( guiIntfStruct.DVDNAV.audio_streams,dvdnavp->audio_streams,sizeof( dvdnavp->audio_streams ) );
+        guiIntfStruct.DVDNAV.nr_of_subtitles=dvdnavp->nr_of_subtitles;
+        memcpy( guiIntfStruct.DVDNAV.subtitles,dvdnavp->subtitles,sizeof( dvdnavp->subtitles ) );
+#endif
+        break;
+#endif
    case guiSetStream:
 	guiIntfStruct.StreamType=stream->type;
 	switch( stream->type )
@@ -614,6 +644,11 @@
 	       guiGetEvent( guiSetDVD,(char *)stream->priv );
 	       break;
 #endif
+#ifdef USE_MPDVDNAV
+	  case STREAMTYPE_DVDNAV:
+	       guiGetEvent( guiSetDVDNAV,(char *)stream->priv );
+	       break; 
+#endif
 #ifdef HAVE_VCD
 	  case STREAMTYPE_VCD: 
 	       {
@@ -762,6 +797,18 @@
 	       dvd_angle=guiIntfStruct.Angle;
 	       break;
 #endif
+#ifdef USE_MPDVDNAV
+ 	  case STREAMTYPE_DVDNAV:
+	       {
+	        char tmp[512];
+//		sprintf( tmp,"dvdnav://%d",guiIntfStruct.Title );
+		sprintf( tmp,"dvdnav://");
+		guiSetFilename( guiIntfStruct.Filename,tmp );
+	       }
+	       dvd_chapter=guiIntfStruct.Chapter;
+	       dvd_angle=guiIntfStruct.Angle;
+	       break;
+#endif
 	 }
 	//if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST ) // Does not make problems anymore!
 	 {	
@@ -1127,6 +1174,9 @@
 #ifdef USE_DVDREAD
 	if ( (unsigned int)vparam & guiDVD ) memset( &guiIntfStruct.DVD,0,sizeof( guiDVDStruct ) );
 #endif
+#ifdef USE_MPDVDNAV
+	if ( (unsigned int)vparam & guiDVDNAV ) memset( &guiIntfStruct.DVDNAV,0,sizeof( guiDVDNAVStruct ) );
+#endif
 #ifdef HAVE_VCD
 	if ( (unsigned int)vparam & guiVCD ) guiIntfStruct.VCDTracks=0;
 #endif
--- Gui/mplayer/mw.c	2005-12-27 20:21:04.000000000 +0100
+++ Gui/mplayer/mw.c	2006-02-01 01:09:32.000000000 +0100
@@ -128,6 +128,16 @@
         guiIntfStruct.StreamType=STREAMTYPE_DVD;
 	goto play;
 #endif
+#ifdef USE_MPDVDNAV
+   case evPlayDVDNAV:
+        guiIntfStruct.DVDNAV.current_title=1;
+        guiIntfStruct.DVDNAV.current_chapter=1;
+        guiIntfStruct.DVDNAV.current_angle=1;
+play_dvdnav_2:
+ 	gtkSet( gtkClearStruct,0,(void *)(guiALL - guiDVDNAV) );
+        guiIntfStruct.StreamType=STREAMTYPE_DVDNAV;
+	goto play;
+#endif
    case evPlay:
    case evPlaySwitchToPause:
 play:
@@ -177,6 +187,20 @@
 		} 
                break;
 #endif
+#ifdef USE_MPDVDNAV
+          case STREAMTYPE_DVDNAV:
+	       gtkSet( gtkClearStruct,0,(void *)(guiALL - guiDVDNAV - guiFilenames) );
+	       if ( !dvd_device ) dvd_device=gstrdup( DEFAULT_DVD_DEVICE );
+	       mplSetFileName( NULL,dvd_device,STREAMTYPE_DVDNAV );
+	       if ( guiIntfStruct.Playing != 2 )
+	        {
+		 guiIntfStruct.Title=guiIntfStruct.DVDNAV.current_title;
+		 guiIntfStruct.Chapter=guiIntfStruct.DVDNAV.current_chapter;
+		 guiIntfStruct.Angle=guiIntfStruct.DVDNAV.current_angle;
+                 guiIntfStruct.DiskChanged=1;
+		} 
+               break;
+#endif
          }
 	guiIntfStruct.NewPlay=1;
         mplPlay();
@@ -201,6 +225,35 @@
         goto play_dvd_2;
         break;
 #endif
+#ifdef USE_MPDVDNAV
+   case evSetDVDNAVSubtitle:
+        dvdsub_id=iparam;
+	dvdnav_go_spu=1;
+//        goto play_dvdnav_2;
+        break;
+   case evSetDVDNAVAudio:
+        audio_id=iparam;
+	dvdnav_go_audio=1;
+//        goto play_dvdnav_2;
+        break;
+   case evSetDVDNAVChapter:
+	dvdnav_go_part=iparam;
+        guiIntfStruct.DVDNAV.current_chapter=iparam;
+//        goto play_dvdnav_2;
+        break;
+   case evSetDVDNAVTitle:
+	dvdnav_go_title=iparam;
+        guiIntfStruct.DVDNAV.current_title=iparam;
+	guiIntfStruct.DVDNAV.current_chapter=1;
+	guiIntfStruct.DVDNAV.current_angle=1;
+//        goto play_dvdnav_2;
+        break;
+   case evMenuDVDNAV:
+	dvdnav_go_menu=1;
+        guiIntfStruct.DVDNAV.current_chapter=iparam;
+//        goto play_dvdnav_2;
+        break;
+#endif
 
    case evPause:
    case evPauseSwitchToPlay:
@@ -340,6 +393,9 @@
 	  default: movie_aspect=-1;
 	 }
 	wsClearWindow( appMPlayer.subWindow );
+#ifdef USE_MPDVDNAV
+	if ( guiIntfStruct.StreamType == STREAMTYPE_DVDNAV ) goto play_dvdnav_2; else
+#endif
 #ifdef USE_DVDREAD
 	if ( guiIntfStruct.StreamType == STREAMTYPE_DVD || guiIntfStruct.StreamType == STREAMTYPE_VCD ) goto play_dvd_2;
 	 else 
--- Gui/mplayer/sw.c	2005-12-08 23:12:56.000000000 +0100
+++ Gui/mplayer/sw.c	2006-02-01 01:09:32.000000000 +0100
@@ -19,6 +19,15 @@
 extern int             sx,sy;
 extern int             i,pot;
 
+#ifdef USE_MPDVDNAV
+extern int	dvdnav_window_width;
+extern int	dvdnav_window_height;
+extern int	dvdnav_mouse_x;
+extern int	dvdnav_mouse_y;
+extern int	dvdnav_mouse_button;
+extern int	dvdnav_mouse_set;
+#endif
+
 void mplSubDraw( void )
 {
  if ( appMPlayer.subWindow.State == wsWindowClosed ) exit_player( MSGTR_Exit_quit );
@@ -65,8 +74,25 @@
           sx=X; sy=Y;
           msButton=wsPLMouseButton;
           mplSubMoved=0;
+#ifdef USE_MPDVDNAV
+	    if (dvdnav_mouse_set!=2) {
+	    dvdnav_window_width=appMPlayer.subWindow.Width;
+	    dvdnav_window_height=appMPlayer.subWindow.Height;
+	    dvdnav_mouse_x=X;
+	    dvdnav_mouse_y=Y;
+	    dvdnav_mouse_button=1;
+	    dvdnav_mouse_set=1;}
+#endif
           break;
    case wsMoveMouse:
+#ifdef USE_MPDVDNAV
+	    if (dvdnav_mouse_set!=2) {
+	    dvdnav_window_width=appMPlayer.subWindow.Width;
+	    dvdnav_window_height=appMPlayer.subWindow.Height;
+	    dvdnav_mouse_x=X;
+	    dvdnav_mouse_y=Y;
+	    dvdnav_mouse_set=1;}
+#endif
           switch ( msButton )
            {
             case wsPLMouseButton:
--- Gui/mplayer/common.c	2005-12-27 20:21:04.000000000 +0100
+++ Gui/mplayer/common.c	2006-02-01 01:09:32.000000000 +0100
@@ -61,6 +61,12 @@
             else strlcat( tmp,MSGTR_NoChapter,tmplen );
           break;
 #endif
+#ifdef USE_MPDVDNAV
+   case STREAMTYPE_DVDNAV:
+          if ( guiIntfStruct.DVDNAV.current_chapter ) snprintf(tmp,tmplen,MSGTR_Chapter,guiIntfStruct.DVDNAV.current_chapter );
+            else strlcat( tmp,MSGTR_NoChapter,tmplen );
+          break;
+#endif
 #ifdef HAVE_VCD
    case STREAMTYPE_VCD:
         snprintf( tmp,tmplen,MSGTR_VCDTrack,guiIntfStruct.Track );
@@ -164,6 +170,9 @@
 #ifdef USE_DVDREAD
              case STREAMTYPE_DVD:    strlcat( trbuf,"d",sizeof( trbuf ) ); break;
 #endif
+#ifdef USE_MPDVDNAV
+             case STREAMTYPE_DVDNAV: strlcat( trbuf,"d",sizeof( trbuf ) ); break;
+#endif
              default:                strlcat( trbuf," ",sizeof( trbuf ) ); break;
             }
            break;
--- Gui/mplayer/play.c	2005-12-08 23:12:56.000000000 +0100
+++ Gui/mplayer/play.c	2006-02-01 01:09:32.000000000 +0100
@@ -95,6 +95,11 @@
      guiIntfStruct.DVD.current_chapter=1;
      guiIntfStruct.DVD.current_angle=1;
 #endif
+#ifdef USE_MPDVDNAV
+     guiIntfStruct.DVDNAV.current_title=1;
+     guiIntfStruct.DVDNAV.current_chapter=1;
+     guiIntfStruct.DVDNAV.current_angle=1;
+#endif
 
      if ( !appMPlayer.subWindow.isFullScreen && gtkShowVideoWindow)
       {
@@ -282,6 +287,10 @@
    case STREAMTYPE_DVD:
 	break;
 #endif
+#ifdef USE_MPDVDNAV
+   case STREAMTYPE_DVDNAV:
+	break;
+#endif
 #ifdef HAVE_VCD
    case STREAMTYPE_VCD:
 	break;
@@ -318,6 +327,16 @@
 	guiIntfStruct.Track=guiIntfStruct.DVD.current_title;
 	break;
 #endif
+#ifdef USE_MPDVDNAV
+   case STREAMTYPE_DVDNAV:
+	if ( --guiIntfStruct.DVDNAV.current_chapter == 0 )
+	 {
+	  guiIntfStruct.DVDNAV.current_chapter=1;
+	  if ( --guiIntfStruct.DVDNAV.current_title <= 0 ) { guiIntfStruct.DVDNAV.current_title=1; stop=1; }
+	 }
+	guiIntfStruct.Track=guiIntfStruct.DVDNAV.current_title;
+	break;
+#endif
 #ifdef HAVE_VCD
    case STREAMTYPE_VCD:
 	if ( --guiIntfStruct.Track == 0 ) { guiIntfStruct.Track=1; stop=1; }
@@ -354,6 +373,16 @@
 	guiIntfStruct.Track=guiIntfStruct.DVD.current_title;
 	break;
 #endif
+#ifdef USE_MPDVDNAV
+   case STREAMTYPE_DVDNAV:
+	if ( guiIntfStruct.DVDNAV.current_chapter++ == guiIntfStruct.DVDNAV.chapters )
+	 {
+	  guiIntfStruct.DVDNAV.current_chapter=1;
+	  if ( ++guiIntfStruct.DVDNAV.current_title > guiIntfStruct.DVDNAV.titles ) { guiIntfStruct.DVDNAV.current_title=guiIntfStruct.DVDNAV.titles; stop=1; }
+	 }
+	guiIntfStruct.Track=guiIntfStruct.DVDNAV.current_title;
+	break;
+#endif
 #ifdef HAVE_VCD
    case STREAMTYPE_VCD:
 	if ( ++guiIntfStruct.Track > guiIntfStruct.VCDTracks ) { guiIntfStruct.Track=guiIntfStruct.VCDTracks; stop=1; }
--- Gui/mplayer/gtk/menu.c	2005-12-15 21:39:59.000000000 +0100
+++ Gui/mplayer/gtk/menu.c	2006-02-01 01:09:32.000000000 +0100
@@ -378,6 +378,9 @@
 }
 
 GtkWidget * DVDSubMenu;
+#ifdef USE_MPDVDNAV
+GtkWidget * DVDNAVSubMenu;
+#endif
 GtkWidget * DVDTitleMenu;
 GtkWidget * DVDChapterMenu;
 GtkWidget * DVDAudioLanguageMenu;
@@ -408,6 +411,9 @@
 #ifdef USE_DVDREAD
     AddMenuItem( window1, (const char*)playdvd_xpm, SubMenu,MSGTR_MENU_PlayDVD, evPlayDVD );
 #endif
+#ifdef USE_MPDVDNAV
+    AddMenuItem( window1, (const char*)playdvd_xpm, SubMenu,MSGTR_MENU_PlayDVDNAV, evPlayDVDNAV );
+#endif
     AddMenuItem( window1, (const char*)url_xpm, SubMenu,MSGTR_MENU_PlayURL, evSetURL );
     AddMenuItem( window1, (const char*)sub_xpm, SubMenu,MSGTR_MENU_LoadSubtitle"   ", evLoadSubtitle );
     AddMenuItem( window1, (const char*)delsub_xpm, SubMenu,MSGTR_MENU_DropSubtitle,evDropSubtitle );
@@ -525,6 +531,87 @@
         gtk_widget_set_sensitive( MenuItem,FALSE );
        }
 #endif
+#ifdef USE_MPDVDNAV
+   DVDNAVSubMenu=AddSubMenu( window1, (const char*)dvd_xpm, Menu,MSGTR_MENU_DVDNAV );
+    AddMenuItem( window1, (const char*)playdvd_xpm, DVDNAVSubMenu,MSGTR_MENU_PlayDisc"    ", evPlayDVDNAV );
+    MenuItem=AddMenuItem( window1, (const char*)prefs_xpm, DVDNAVSubMenu,MSGTR_MENU_MenuDVDNAV"    ", evMenuDVDNAV );
+    if (guiIntfStruct.DVDNAV.current_title==0)
+        gtk_widget_set_sensitive( MenuItem,FALSE ); else
+        gtk_widget_set_sensitive( MenuItem,TRUE );
+//    AddMenuItem( DVDNAVSubMenu,MSGTR_MENU_ShowDVDMenu, evNone );
+    AddSeparator( DVDNAVSubMenu );
+    DVDTitleMenu=AddSubMenu( window1, (const char*)title_xpm, DVDNAVSubMenu,MSGTR_MENU_Titles );
+     if ( guiIntfStruct.DVDNAV.titles )
+      {
+       char tmp[32]; int i;
+       for ( i=1 ; i<= guiIntfStruct.DVDNAV.titles;i++ )
+        {
+         snprintf( tmp,32,MSGTR_MENU_Title,i);
+         AddMenuCheckItem( window1, (const char*)empty1px_xpm, DVDTitleMenu,tmp,
+			   guiIntfStruct.DVDNAV.current_title == i,
+			   (i << 16) + evSetDVDNAVTitle );
+        }
+      }
+      else
+       {
+        MenuItem=AddMenuItem( window1, (const char*)empty_xpm, DVDTitleMenu,MSGTR_MENU_None,evNone );
+        gtk_widget_set_sensitive( MenuItem,FALSE );
+       }
+    DVDChapterMenu=AddSubMenu( window1, (const char*)chapter_xpm, DVDNAVSubMenu,MSGTR_MENU_Chapters );
+     if ( guiIntfStruct.DVDNAV.chapters )
+      {
+       char tmp[32]; int i;
+       for ( i=1;i <= guiIntfStruct.DVDNAV.chapters;i++ )
+        {
+         snprintf( tmp,32,MSGTR_MENU_Chapter,i );
+         AddMenuCheckItem( window1, (const char*)empty1px_xpm, DVDChapterMenu,tmp,guiIntfStruct.DVDNAV.current_chapter == i,
+			   ( i << 16 ) + evSetDVDNAVChapter );
+        }
+      }
+      else
+       {
+        MenuItem=AddMenuItem( window1, (const char*)empty_xpm, DVDChapterMenu,MSGTR_MENU_None,evNone );
+        gtk_widget_set_sensitive( MenuItem,FALSE );
+       }
+    DVDAudioLanguageMenu=AddSubMenu( window1, (const char*)tongue_xpm, DVDNAVSubMenu,MSGTR_MENU_AudioLanguages );
+     if ( guiIntfStruct.DVDNAV.nr_of_audio_channels )
+      {
+       char tmp[64]; int i, id = guiIntfStruct.demuxer ? ((demuxer_t *)guiIntfStruct.demuxer)->audio->id : audio_id;
+       for ( i=0;i < guiIntfStruct.DVDNAV.nr_of_audio_channels;i++ )
+        {
+	 snprintf( tmp,64,"%s - %s %s",GetLanguage( guiIntfStruct.DVDNAV.audio_streams[i].language ),
+	   ChannelTypes[ guiIntfStruct.DVDNAV.audio_streams[i].type ],
+	   ChannelNumbers[ guiIntfStruct.DVDNAV.audio_streams[i].channels ] );
+//	 if ( id == -1 ) id=audio_id; //guiIntfStruct.DVD.audio_streams[i].id;
+         AddMenuCheckItem( window1, (const char*)dolby_xpm, DVDAudioLanguageMenu,tmp,
+			   id == guiIntfStruct.DVDNAV.audio_streams[i].id,
+			   ( guiIntfStruct.DVDNAV.audio_streams[i].id << 16 ) + evSetDVDNAVAudio );
+        }
+      }
+      else
+       {
+        MenuItem=AddMenuItem( window1, (const char*)empty_xpm, DVDAudioLanguageMenu,MSGTR_MENU_None,evNone );
+        gtk_widget_set_sensitive( MenuItem,FALSE );
+       }
+    DVDSubtitleLanguageMenu=AddSubMenu( window1, (const char*)tonguebla_xpm, DVDNAVSubMenu,MSGTR_MENU_SubtitleLanguages );
+     if ( guiIntfStruct.DVDNAV.nr_of_subtitles )
+      {
+       char tmp[64]; int i;
+       AddMenuItem( window1, (const char*)empty1px_xpm, DVDSubtitleLanguageMenu,MSGTR_MENU_None,( (unsigned short)-1 << 16 ) + evSetDVDNAVSubtitle );
+       for ( i=0;i < guiIntfStruct.DVDNAV.nr_of_subtitles;i++ )
+        {
+	 snprintf( tmp,64,"%s",GetLanguage( guiIntfStruct.DVDNAV.subtitles[i].language ) );
+         AddMenuCheckItem( window1, (const char*)empty1px_xpm, DVDSubtitleLanguageMenu,tmp,
+			   dvdsub_id == guiIntfStruct.DVDNAV.subtitles[i].id,
+			   ( guiIntfStruct.DVDNAV.subtitles[i].id << 16 ) + evSetDVDNAVSubtitle );
+        }
+      }
+      else
+       {
+        MenuItem=AddMenuItem( window1, (const char*)empty_xpm, DVDSubtitleLanguageMenu,MSGTR_MENU_None,evNone );
+        gtk_widget_set_sensitive( MenuItem,FALSE );
+       }
+#endif
 
 //  if ( guiIntfStruct.Playing )
    {
