]> git.sesse.net Git - vlc/commitdiff
Interface for Familiar v0.7 and GPE. This interface is based on gtk2 libaries.
authorJean-Paul Saman <jpsaman@videolan.org>
Wed, 23 Jul 2003 22:02:56 +0000 (22:02 +0000)
committerJean-Paul Saman <jpsaman@videolan.org>
Wed, 23 Jul 2003 22:02:56 +0000 (22:02 +0000)
17 files changed:
configure.ac
modules/LIST
modules/gui/pda/Modules.am [new file with mode: 0644]
modules/gui/pda/callbacks.c [new file with mode: 0644]
modules/gui/pda/callbacks.h [new file with mode: 0644]
modules/gui/pda/interface.c [new file with mode: 0644]
modules/gui/pda/interface.h [new file with mode: 0644]
modules/gui/pda/network.c [new file with mode: 0644]
modules/gui/pda/network.h [new file with mode: 0644]
modules/gui/pda/pda.c [new file with mode: 0644]
modules/gui/pda/pda.glade [new file with mode: 0644]
modules/gui/pda/pda.gladep [new file with mode: 0644]
modules/gui/pda/pda.h [new file with mode: 0644]
modules/gui/pda/playlist.c [new file with mode: 0644]
modules/gui/pda/playlist.h [new file with mode: 0644]
modules/gui/pda/support.c [new file with mode: 0644]
modules/gui/pda/support.h [new file with mode: 0644]

index b7fb0af39bdb70365028d2aecbb73f0c65a2e0f9..f4ef37d5bc1a03f80b4fecb162b510e2b60df261 100644 (file)
@@ -1,5 +1,5 @@
 dnl Autoconf settings for vlc
-dnl $Id: configure.ac,v 1.40 2003/07/22 20:49:10 hartman Exp $
+dnl $Id: configure.ac,v 1.41 2003/07/23 22:02:56 jpsaman Exp $
 
 AC_INIT(vlc,0.6.1-test1)
 
@@ -2526,6 +2526,21 @@ dnl     NEED_GTK2_MAIN=yes
 dnl   fi
 dnl fi
 
+dnl
+dnl  PDA Gtk+2 module
+dnl
+AC_ARG_ENABLE(pda,
+  [  --enable-pda           PDA interface needs Gtk2 suport (default disabled)])
+if test "x${enable_pda}" = "xyes"
+then
+  PKG_CHECK_MODULES(GTK2, [gtk+-2.0 >= 2.0.0, gthread-2.0])
+  AX_ADD_CFLAGS([gtk2],[${GTK2_CFLAGS}])
+  AX_ADD_LDFLAGS([gtk2],[${GTK2_LIBS}])
+  AX_ADD_CFLAGS([pda],[${GTK2_CFLAGS} ${CFLAGS_pda}])
+  AX_ADD_LDFLAGS([pda],[${GTK2_LDFLAGS} ${LDFLAGS_pda}])
+  AX_ADD_PLUGINS([pda])
+fi
+
 dnl
 dnl  Familiar module uses Gtk+ library
 dnl
@@ -3064,16 +3079,16 @@ dnl
 if test "${NEED_GTK_MAIN}" != "no"
 then
     AX_ADD_PLUGINS([gtk_main])
-    AX_ADD_CFLAGS([gtk familiar],[-DNEED_GTK_MAIN])
-    AX_ADD_CFLAGS([gtk_main],[${CFLAGS_gtk} ${CFLAGS_familiar}])
-    AX_ADD_LDFLAGS([gtk_main],[${LDFLAGS_gtk} ${LDFLAGS_familiar}])
+    AX_ADD_CFLAGS([gtk familiar pda],[-DNEED_GTK_MAIN])
+    AX_ADD_CFLAGS([gtk_main],[${CFLAGS_gtk} ${CFLAGS_familiar} ${CFLAGS_pda}])
+    AX_ADD_LDFLAGS([gtk_main],[${LDFLAGS_gtk} ${LDFLAGS_familiar} ${LDFLAGS_pda}])
 fi
 
 if test "${NEED_GNOME_MAIN}" != "no"
 then
     AX_ADD_PLUGINS([gnome_main])
-    AX_ADD_CFLAGS([gnome_main],[${CFLAGS_gtk} ${CFLAGS_familiar} ${CFLAGS_gnome}])
-    AX_ADD_LDFLAGS([gnome_main],[${LDFLAGS_gtk} ${LDFLAGS_familiar} ${LDFLAGS_gnome}])
+    AX_ADD_CFLAGS([gnome_main],[${CFLAGS_gtk} ${CFLAGS_familiar} ${CFLAGS_pda} ${CFLAGS_gnome}])
+    AX_ADD_LDFLAGS([gnome_main],[${LDFLAGS_gtk} ${LDFLAGS_familiar} ${LDFLAGS_pda} ${LDFLAGS_gnome}])
 fi
 
 if test "${NEED_GTK2_MAIN}" != "no"
@@ -3272,6 +3287,7 @@ AC_OUTPUT([
   modules/gui/Makefile
   modules/gui/beos/Makefile
   modules/gui/familiar/Makefile
+  modules/gui/pda/Makefile
   modules/gui/gtk/Makefile
   modules/gui/gtk2/Makefile
   modules/gui/kde/Makefile
index 3224aff6db218ed324ea41ea5b1ca9b694c8f94e..86658f630270fe4585c16465b8522a1011e744cc 100644 (file)
@@ -1,5 +1,5 @@
 List of vlc plugins
-$Id: LIST,v 1.6 2002/12/09 00:52:42 babal Exp $
+$Id: LIST,v 1.7 2003/07/23 22:02:56 jpsaman Exp $
 
  * a52_system: input module for A52 decapsulation.
 
@@ -129,6 +129,8 @@ $Id: LIST,v 1.6 2002/12/09 00:52:42 babal Exp $
 
  * ogg: input module for OGG decapsulation.
 
+ * pda-gtk2: interface for iPaq using the Gtk2+ widget set.
+
  * qt: interface module using the Qt widget set.
 
  * qte: video output module for Qt Embedded.
diff --git a/modules/gui/pda/Modules.am b/modules/gui/pda/Modules.am
new file mode 100644 (file)
index 0000000..4e4ae28
--- /dev/null
@@ -0,0 +1,17 @@
+SOURCES_pda = \
+       pda.c \
+       pda.h \
+       interface.c \
+       interface.h \
+       support.c \
+       support.h \
+       callbacks.c \
+       callbacks.h \
+    network.c \
+    network.h \
+    playlist.c \
+    playlist.h \
+       $(NULL)
+
+EXTRA_DIST += pda.glade \
+       $(NULL)
diff --git a/modules/gui/pda/callbacks.c b/modules/gui/pda/callbacks.c
new file mode 100644 (file)
index 0000000..8208fe7
--- /dev/null
@@ -0,0 +1,588 @@
+/*****************************************************************************
+ * callbacks.c : Callbacks for the pda Linux Gtk+ plugin.
+ *****************************************************************************
+ * Copyright (C) 2000, 2001 VideoLAN
+ * $Id: callbacks.c,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
+ *
+ * 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.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <sys/types.h>                                              /* off_t */
+#include <stdlib.h>
+#include <vlc/vlc.h>
+#include <vlc/intf.h>
+#include <vlc/vout.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "playlist.h"
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+#include "pda.h"
+
+static char* get_file_perm(const char *path);
+
+/*****************************************************************************
+ * Useful function to retrieve p_intf
+ ****************************************************************************/
+void * E_(__GtkGetIntf)( GtkWidget * widget )
+{
+    void *p_data;
+
+    if( GTK_IS_MENU_ITEM( widget ) )
+    {
+        /* Look for a GTK_MENU */
+        while( widget->parent && !GTK_IS_MENU( widget ) )
+        {
+            widget = widget->parent;
+        }
+
+        /* Maybe this one has the data */
+        p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
+        if( p_data )
+        {
+            return p_data;
+        }
+
+        /* Otherwise, the parent widget has it */
+        widget = gtk_menu_get_attach_widget( GTK_MENU( widget ) );
+    }
+
+    /* We look for the top widget */
+    widget = gtk_widget_get_toplevel( GTK_WIDGET( widget ) );
+
+    p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
+
+    return p_data;
+}
+
+/*****************************************************************************
+ * Helper functions for URL changes in Media and Preferences notebook pages.
+ ****************************************************************************/
+void MediaURLOpenChanged( GtkWidget *widget, gchar *psz_url )
+{
+    intf_thread_t *p_intf = GtkGetIntf( widget );
+    playlist_t *p_playlist;
+
+    // Add p_url to playlist .... but how ?
+    p_playlist = (playlist_t *)
+             vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+
+    if( p_playlist ==  NULL)
+    {
+        return;
+    }
+    
+    if( p_playlist )
+    {
+        if (p_intf->p_sys->b_autoplayfile)
+        {
+            playlist_Add( p_playlist, (char*)psz_url, 0, 0, 
+                          PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
+        }
+        else
+        {
+            playlist_Add( p_playlist, (char*)psz_url, 0, 0, 
+                          PLAYLIST_APPEND, PLAYLIST_END );
+        }
+        vlc_object_release(  p_playlist );
+        PDARebuildCList( p_intf->p_sys->p_clistplaylist, p_playlist);
+    }
+}
+
+/*****************************************************************
+ * Read directory helper function.
+ ****************************************************************/
+void ReadDirectory( GtkCList *clist, char *psz_dir )
+{
+    intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(clist) );
+    struct dirent **namelist;
+    int n=-1, status=-1;
+
+    msg_Dbg(p_intf, "changing to dir %s", psz_dir);
+    if (psz_dir)
+    {
+       status = chdir(psz_dir);
+       if (status<0)
+          msg_Err( p_intf, "permision denied" );                       
+    }
+    n = scandir(".", &namelist, 0, alphasort);
+    
+    if (n<0)
+        perror("scandir");
+    else
+    {
+        int i, ctr=0;
+        gchar *ppsz_text[5];
+
+        msg_Dbg( p_intf, "updating interface" );
+        gtk_clist_freeze( clist );
+        gtk_clist_clear( clist );
+
+        /* XXX : kludge temporaire pour yopy */
+        ppsz_text[0]="..";
+        ppsz_text[1] = get_file_perm("..");
+        ppsz_text[2] = "";
+        ppsz_text[3] = "";
+        ppsz_text[4] = "";
+       gtk_clist_insert( GTK_CLIST(clist), ctr++, ppsz_text );
+
+        /* kludge */                
+        for (i=0; i<n; i++)
+        {
+            if (namelist[i]->d_name[0] != '.')
+            {
+                /* This is a list of strings. */
+                ppsz_text[0] = namelist[i]->d_name;
+                ppsz_text[1] = get_file_perm(namelist[i]->d_name);
+                ppsz_text[2] = "";
+                ppsz_text[3] = "";
+                ppsz_text[4] = "";
+                //            msg_Dbg(p_intf, "(%d) file: %s permission: %s", i, ppsz_text[0], ppsz_text[1] );
+                gtk_clist_insert( GTK_CLIST(clist), ctr++, ppsz_text );
+            }
+        }
+        gtk_clist_thaw( clist );
+        free(namelist);
+    }
+
+    /* now switch to the "file" tab */
+    if (p_intf->p_sys->p_mediabook)
+    {
+       gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
+       gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
+    }
+}
+
+static char* get_file_perm(const char *path)
+{
+    struct stat st;
+    char *perm;
+
+    perm = (char *) malloc(sizeof(char)*10);
+    strncpy( perm, "----------", sizeof("----------"));
+    if (lstat(path, &st)==0)
+    {
+        if (S_ISLNK(st.st_mode))
+            perm[0]= 'l';
+        else if (S_ISDIR(st.st_mode))
+            perm[0]= 'd';
+        else if (S_ISCHR(st.st_mode))
+            perm[0]= 'c';
+        else if (S_ISBLK(st.st_mode))
+            perm[0]= 'b';
+        else if (S_ISFIFO(st.st_mode))
+            perm[0]= 'f';
+        else if (S_ISSOCK(st.st_mode))
+            perm[0]= 's';
+        else if (S_ISREG(st.st_mode))
+            perm[0]= '-';
+        else /* Unknown type is an error */
+            perm[0]= '?';
+        /* Get file permissions */
+        /* User */
+        if (st.st_mode & S_IRUSR)
+            perm[1]= 'r';
+        if (st.st_mode & S_IWUSR)
+            perm[2]= 'w';
+        if (st.st_mode & S_IXUSR)
+        {
+            if (st.st_mode & S_ISUID)
+                perm[3] = 's';
+            else
+                perm[3]= 'x';
+        }
+        else if (st.st_mode & S_ISUID)
+            perm[3] = 'S';
+        /* Group */
+        if (st.st_mode & S_IRGRP)
+            perm[4]= 'r';
+        if (st.st_mode & S_IWGRP)
+            perm[5]= 'w';
+        if (st.st_mode & S_IXGRP)
+        {
+            if (st.st_mode & S_ISGID)
+                perm[6] = 's';
+            else
+                perm[6]= 'x';
+        }
+        else if (st.st_mode & S_ISGID)
+            perm[6] = 'S';
+        /* Other */
+        if (st.st_mode & S_IROTH)
+            perm[7]= 'r';
+        if (st.st_mode & S_IWOTH)
+            perm[8]= 'w';
+        if (st.st_mode & S_IXOTH)
+        {
+            // 'sticky' bit
+            if (st.st_mode &S_ISVTX)
+                perm[9] = 't';
+            else
+                perm[9]= 'x';
+        }
+        else if (st.st_mode &S_ISVTX)
+            perm[9]= 'T';
+    }
+    return perm;
+}
+
+/*
+ * Main interface callbacks
+ */
+gboolean PDAExit( GtkWidget       *widget,
+                       gpointer         user_data )
+{
+    intf_thread_t *p_intf = GtkGetIntf( widget );
+
+    vlc_mutex_lock( &p_intf->change_lock );
+    p_intf->p_vlc->b_die = VLC_TRUE;
+    vlc_mutex_unlock( &p_intf->change_lock );
+
+    return TRUE;
+}
+
+void
+on_toolbar_open_clicked                (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
+
+    if (p_intf->p_sys->p_notebook)
+    {
+       gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
+       gtk_notebook_set_page(p_intf->p_sys->p_notebook,0);
+    }
+    if (p_intf->p_sys->p_mediabook)
+    {
+       gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
+       gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
+    }
+    gdk_window_raise( p_intf->p_sys->p_window->window );
+    if (p_intf->p_sys->p_clist)
+    {
+       ReadDirectory(p_intf->p_sys->p_clist, ".");
+    }
+}
+
+void
+on_toolbar_preferences_clicked         (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
+
+    if (p_intf->p_sys->p_notebook)
+    {
+       gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
+       gtk_notebook_set_page(p_intf->p_sys->p_notebook,2);
+    }
+    gdk_window_raise( p_intf->p_sys->p_window->window );
+}
+
+void
+on_toolbar_rewind_clicked              (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+
+    if( p_intf->p_sys->p_input != NULL )
+    {
+        input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
+    }
+}
+
+void
+on_toolbar_pause_clicked               (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+
+    if( p_intf->p_sys->p_input != NULL )
+    {
+        input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
+    }
+}
+
+void
+on_toolbar_play_clicked                (GtkButton       *button,
+                                        gpointer         user_data)
+{
+     intf_thread_t *  p_intf = GtkGetIntf( GTK_WIDGET( button ) );
+     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+
+     if( p_playlist == NULL )
+     {
+         /* Display open page */
+         on_toolbar_open_clicked(button,user_data);
+     }
+
+     /* If the playlist is empty, open a file requester instead */
+     vlc_mutex_lock( &p_playlist->object_lock );
+     if( p_playlist->i_size )
+     {
+         vlc_mutex_unlock( &p_playlist->object_lock );
+         playlist_Play( p_playlist );
+         vlc_object_release( p_playlist );
+         gdk_window_lower( p_intf->p_sys->p_window->window );
+     }
+     else
+     {
+         vlc_mutex_unlock( &p_playlist->object_lock );
+         vlc_object_release( p_playlist );
+         /* Display open page */
+         on_toolbar_open_clicked(button,user_data);
+    }
+}
+
+void
+on_toolbar_stop_clicked                (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( GTK_WIDGET( button ) );
+    playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                                       FIND_ANYWHERE );
+    if( p_playlist)
+    {
+        playlist_Stop( p_playlist );
+        vlc_object_release( p_playlist );
+        gdk_window_raise( p_intf->p_sys->p_window->window );
+    }
+}
+
+void
+on_toolbar_forward_clicked             (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+
+    if( p_intf->p_sys->p_input != NULL )
+    {
+        input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
+    }
+}
+
+void
+on_toolbar_playlist_clicked            (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
+
+    // Toggle notebook
+    if (p_intf->p_sys->p_notebook)
+    {
+        gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
+        gtk_notebook_set_page(p_intf->p_sys->p_notebook,1);
+    }
+    gdk_window_raise( p_intf->p_sys->p_window->window );
+}
+
+void
+on_toolbar_about_clicked               (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
+
+    // Toggle notebook
+    if (p_intf->p_sys->p_notebook)
+    {
+        gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
+        gtk_notebook_set_page(p_intf->p_sys->p_notebook,3);
+    }
+    gdk_window_raise( p_intf->p_sys->p_window->window );
+}
+
+void
+on_comboURL_entry_changed              (GtkEditable     *editable,
+                                        gpointer         user_data)
+{
+    intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET(editable) );
+    gchar *       psz_url;
+    struct stat st;
+    
+    psz_url = gtk_entry_get_text(GTK_ENTRY(editable));
+/*    if( (strncmp("file://",(const char *) psz_url,7)==0) ||
+        (strncmp("udp://",(const char *) psz_url,6)==0) ||
+        (strncmp("udp4://",(const char *) psz_url,7)==0) ||
+        (strncmp("udp6://",(const char *) psz_url,7)==0) ||
+        (strncmp("udpstream://",(const char *) psz_url,12)==0) ||
+        (strncmp("rtp://",(const char *) psz_url,6)==0) ||
+        (strncmp("rtp4://",(const char *) psz_url,7)==0) ||
+        (strncmp("rtp6://",(const char *) psz_url,7)==0) ||
+        (strncmp("rtpstream://",(const char *) psz_url,12)==0) ||
+        (strncmp("ftp://",(const char *) psz_url,6)==0) ||
+        (strncmp("mms://",(const char *) psz_url,6)==0) ||
+        (strncmp("http://",(const char *) psz_url,7)==0) )
+    {
+        MediaURLOpenChanged(GTK_WIDGET(editable), psz_url);
+    }
+    else */
+    if (stat((char*)psz_url, &st)==0)
+    {
+        if (S_ISDIR(st.st_mode))
+        {
+            if (!p_intf->p_sys->p_clist)
+                msg_Err(p_intf, "p_clist pointer invalid!!" );
+            ReadDirectory(p_intf->p_sys->p_clist, psz_url);
+        }
+        else if( (S_ISLNK(st.st_mode)) || (S_ISCHR(st.st_mode)) ||
+            (S_ISBLK(st.st_mode)) || (S_ISFIFO(st.st_mode))||
+            (S_ISSOCK(st.st_mode))|| (S_ISREG(st.st_mode)) )
+        {
+            MediaURLOpenChanged(GTK_WIDGET(editable), psz_url);
+        }
+    }
+}
+
+void
+on_clistmedia_click_column             (GtkCList        *clist,
+                                        gint             column,
+                                        gpointer         user_data)
+{
+    static GtkSortType sort_type = GTK_SORT_ASCENDING;
+
+    // Should sort on column
+    switch(sort_type)
+    {
+        case GTK_SORT_ASCENDING:
+            sort_type = GTK_SORT_DESCENDING;
+            break;
+        case GTK_SORT_DESCENDING:
+            sort_type = GTK_SORT_ASCENDING;
+            break;
+    }
+    gtk_clist_freeze( clist );
+    gtk_clist_set_sort_type( clist, sort_type );
+    gtk_clist_sort( clist );
+    gtk_clist_thaw( clist );
+}
+
+void
+on_clistmedia_select_row               (GtkCList        *clist,
+                                        gint             row,
+                                        gint             column,
+                                        GdkEvent        *event,
+                                        gpointer         user_data)
+{
+    intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET(clist) );
+    gchar *text[2];
+    gint ret;
+    struct stat st;
+
+    if (!p_intf->p_sys->p_clist)
+               msg_Err(p_intf, "p_clist pointer is invalid.");
+    ret = gtk_clist_get_text (p_intf->p_sys->p_clist, row, 0, text);
+    if (ret)
+    {
+        if (stat((char*)text[0], &st)==0)
+        {
+            if (S_ISDIR(st.st_mode))
+               ReadDirectory(p_intf->p_sys->p_clist, text[0]);
+            else if( (S_ISLNK(st.st_mode)) || (S_ISCHR(st.st_mode)) ||
+                     (S_ISBLK(st.st_mode)) || (S_ISFIFO(st.st_mode))||
+                     (S_ISSOCK(st.st_mode))|| (S_ISREG(st.st_mode)) )
+            {
+               MediaURLOpenChanged(GTK_WIDGET(p_intf->p_sys->p_clist), text[0]);
+            }
+       }
+    }
+}
+
+void
+on_cbautoplay_toggled                  (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+}
+
+gboolean
+on_pda_delete_event               (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data)
+{
+    PDAExit( GTK_WIDGET( widget ), user_data );
+    return TRUE;
+}
+
+/* Slider Management */
+gboolean
+PDASliderRelease                  (GtkWidget       *widget,
+                                        GdkEventButton  *event,
+                                        gpointer         user_data)
+{
+    intf_thread_t *p_intf = GtkGetIntf( widget );
+
+    vlc_mutex_lock( &p_intf->change_lock );
+    p_intf->p_sys->b_slider_free = 1;
+    vlc_mutex_unlock( &p_intf->change_lock );
+
+    return FALSE;
+}
+
+gboolean
+PDASliderPress                    (GtkWidget       *widget,
+                                        GdkEventButton  *event,
+                                        gpointer         user_data)
+{
+    intf_thread_t *p_intf = GtkGetIntf( widget );
+
+    vlc_mutex_lock( &p_intf->change_lock );
+    p_intf->p_sys->b_slider_free = 0;
+    vlc_mutex_unlock( &p_intf->change_lock );
+
+    return FALSE;
+}
+
+void
+PDAMrlGo                          (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+
+    MediaURLOpenChanged( GTK_WIDGET( button ),
+            gtk_entry_get_text(p_intf->p_sys->p_mrlentry ) );
+}
+
+void
+PDAPreferencesApply               (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET(button) );
+    
+    GtkToggleButton * p_autopl_button = GTK_GET( TOGGLE_BUTTON, "cbautoplay" );
+    if (gtk_toggle_button_get_active(p_autopl_button))
+    {
+        p_intf->p_sys->b_autoplayfile = 1;
+    }
+    else
+    {
+        p_intf->p_sys->b_autoplayfile = 0;
+    }
+}
+
diff --git a/modules/gui/pda/callbacks.h b/modules/gui/pda/callbacks.h
new file mode 100644 (file)
index 0000000..dc1b47f
--- /dev/null
@@ -0,0 +1,116 @@
+/*****************************************************************************
+ * callbacks.h : pda plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2003 VideoLAN
+ * $Id: callbacks.h,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
+ *
+ * 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.
+ *****************************************************************************/
+
+#include <gtk/gtk.h>
+
+#include "network.h"
+#include "playlist.h"
+
+gboolean PDAExit           ( GtkWidget *, gpointer );
+
+void ReadDirectory(GtkCList *clist, char *psz_dir);
+void MediaURLOpenChanged( GtkWidget *widget, gchar *psz_url );
+
+void
+on_toolbar_open_clicked                (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_preferences_clicked         (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_rewind_clicked              (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_pause_clicked               (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_play_clicked                (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_stop_clicked                (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_forward_clicked             (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_about_clicked               (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_comboURL_entry_changed              (GtkEditable     *editable,
+                                        gpointer         user_data);
+
+
+void
+on_clistmedia_click_column             (GtkCList        *clist,
+                                        gint             column,
+                                        gpointer         user_data);
+
+void
+on_clistmedia_select_row               (GtkCList        *clist,
+                                        gint             row,
+                                        gint             column,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+void
+on_cbautoplay_toggled                  (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+
+gboolean
+on_pda_delete_event               (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+gboolean
+PDASliderRelease                  (GtkWidget       *widget,
+                                        GdkEventButton  *event,
+                                        gpointer         user_data);
+
+gboolean
+PDASliderPress                    (GtkWidget       *widget,
+                                        GdkEventButton  *event,
+                                        gpointer         user_data);
+
+
+
+
+void
+PDAMrlGo                          (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_toolbar_playlist_clicked            (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+PDAPreferencesApply               (GtkButton       *button,
+                                        gpointer         user_data);
diff --git a/modules/gui/pda/interface.c b/modules/gui/pda/interface.c
new file mode 100644 (file)
index 0000000..4ad7053
--- /dev/null
@@ -0,0 +1,862 @@
+/* This file was created automatically by glade and fixed by bootstrap */
+
+#include <vlc/vlc.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+GtkWidget*
+create_pda (void)
+{
+  GtkWidget *pda;
+  GtkWidget *vbox;
+  GtkWidget *toolbar;
+  GtkWidget *tmp_toolbar_icon;
+  GtkWidget *toolbar_open;
+  GtkWidget *toolbar_playlist;
+  GtkWidget *toolbar_preferences;
+  GtkWidget *toolbar_rewind;
+  GtkWidget *toolbar_pause;
+  GtkWidget *toolbar_play;
+  GtkWidget *toolbar_stop;
+  GtkWidget *toolbar_forward;
+  GtkWidget *toolbar_about;
+  GtkWidget *slider_label;
+  GtkWidget *slider;
+  GtkWidget *notebook;
+  GtkWidget *vbox1;
+  GtkWidget *hbox1;
+  GtkWidget *buttonMrlGo;
+  GtkWidget *labelUrl;
+  GtkWidget *mrl_combo;
+  GList *mrl_combo_items = NULL;
+  GtkWidget *mrl_entry;
+  GtkWidget *mediabook;
+  GtkWidget *scrolledwindow4;
+  GtkWidget *viewport2;
+  GtkWidget *clistmedia;
+  GtkWidget *labelname;
+  GtkWidget *labeltype;
+  GtkWidget *label13;
+  GtkWidget *vbox3;
+  GSList *network_group = NULL;
+  GtkWidget *network_multicast;
+  GtkWidget *table1;
+  GtkWidget *label21;
+  GtkWidget *label22;
+  GtkObject *network_multicast_port_adj;
+  GtkWidget *network_multicast_port;
+  GtkWidget *combo2;
+  GtkWidget *network_multicast_address;
+  GtkWidget *hseparator10;
+  GtkWidget *hbox9;
+  GtkWidget *network_http;
+  GtkWidget *network_ftp;
+  GtkWidget *network_mms;
+  GtkWidget *hseparator11;
+  GtkWidget *label20;
+  GtkWidget *media2;
+  GtkWidget *vbox4;
+  GtkWidget *scrolledwindow5;
+  GtkWidget *clistplaylist;
+  GtkWidget *label25;
+  GtkWidget *label26;
+  GtkWidget *hbox11;
+  GtkWidget *update_playlist;
+  GtkWidget *playlist_del;
+  GtkWidget *playlist_clear;
+  GtkWidget *playlist;
+  GtkWidget *vbox2;
+  GtkWidget *cbautoplay;
+  GtkWidget *hbox2;
+  GtkWidget *buttonSave;
+  GtkWidget *buttonApply;
+  GtkWidget *buttonCancel;
+  GtkWidget *preferences;
+  GtkWidget *scrolledwindow3;
+  GtkWidget *viewport1;
+  GtkWidget *fixed2;
+  GtkWidget *pixmap2;
+  GtkWidget *label8;
+  GtkWidget *label9;
+  GtkWidget *label11;
+  GtkWidget *label27;
+  GtkWidget *label10;
+  GtkWidget *about;
+
+  pda = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (pda, "pda");
+  gtk_object_set_data (GTK_OBJECT (pda), "pda", pda);
+  gtk_window_set_title (GTK_WINDOW (pda), _("VLC media player"));
+  gtk_window_set_policy (GTK_WINDOW (pda), TRUE, TRUE, TRUE);
+
+  vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox, "vbox");
+  gtk_widget_ref (vbox);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "vbox", vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox);
+  gtk_container_add (GTK_CONTAINER (pda), vbox);
+
+  toolbar = gtk_toolbar_new ();
+  gtk_toolbar_set_orientation( GTK_TOOLBAR(toolbar),GTK_ORIENTATION_HORIZONTAL);
+  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
+  gtk_widget_set_name (toolbar, "toolbar");
+  gtk_widget_ref (toolbar);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar", toolbar,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar);
+  gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 5);
+  gtk_widget_set_usize (toolbar, 240, 12);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-openb16x16.xpm");
+  toolbar_open = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                "",
+                                _("Open file"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_open, "toolbar_open");
+  gtk_widget_ref (toolbar_open);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_open", toolbar_open,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_open);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-playlistb16x16.xpm");
+  toolbar_playlist = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                "",
+                                NULL, NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_playlist, "toolbar_playlist");
+  gtk_widget_ref (toolbar_playlist);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_playlist", toolbar_playlist,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_playlist);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-preferencesb16x16.xpm");
+  toolbar_preferences = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Preferences"),
+                                _("Preferences"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_preferences, "toolbar_preferences");
+  gtk_widget_ref (toolbar_preferences);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_preferences", toolbar_preferences,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_preferences);
+
+  gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-rewindb16x16.xpm");
+  toolbar_rewind = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Rewind"),
+                                _("Rewind stream"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_rewind, "toolbar_rewind");
+  gtk_widget_ref (toolbar_rewind);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_rewind", toolbar_rewind,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_rewind);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-pauseb16x16.xpm");
+  toolbar_pause = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Pause"),
+                                _("Pause stream"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_pause, "toolbar_pause");
+  gtk_widget_ref (toolbar_pause);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_pause", toolbar_pause,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_pause);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-playb16x16.xpm");
+  toolbar_play = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Play"),
+                                _("Play stream"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_play, "toolbar_play");
+  gtk_widget_ref (toolbar_play);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_play", toolbar_play,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_play);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-stopb16x16.xpm");
+  toolbar_stop = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Stop"),
+                                _("Stop stream"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_stop, "toolbar_stop");
+  gtk_widget_ref (toolbar_stop);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_stop", toolbar_stop,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_stop);
+
+  tmp_toolbar_icon = create_pixmap (pda, "pda-forwardb16x16.xpm");
+  toolbar_forward = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("Forward"),
+                                _("Forward stream"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_forward, "toolbar_forward");
+  gtk_widget_ref (toolbar_forward);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_forward", toolbar_forward,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_forward);
+
+  gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+
+  tmp_toolbar_icon = create_pixmap (pda, "vlc16x16.xpm");
+  toolbar_about = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
+                                GTK_TOOLBAR_CHILD_BUTTON,
+                                NULL,
+                                _("About"),
+                                _("About"), NULL,
+                                tmp_toolbar_icon, NULL, NULL);
+  gtk_widget_set_name (toolbar_about, "toolbar_about");
+  gtk_widget_ref (toolbar_about);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "toolbar_about", toolbar_about,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (toolbar_about);
+
+  slider_label = gtk_label_new ("0:00:00");
+  gtk_widget_set_name (slider_label, "slider_label");
+  gtk_widget_ref (slider_label);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "slider_label", slider_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (slider_label);
+  gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+
+  gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), slider_label, NULL, NULL);
+
+  slider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 6.25, 0)));
+  gtk_widget_set_name (slider, "slider");
+  gtk_widget_ref (slider);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "slider", slider,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (slider);
+  gtk_box_pack_start (GTK_BOX (vbox), slider, FALSE, FALSE, 4);
+  gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
+  gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_RIGHT);
+  gtk_scale_set_digits (GTK_SCALE (slider), 3);
+
+  notebook = gtk_notebook_new ();
+  gtk_widget_set_name (notebook, "notebook");
+  gtk_widget_ref (notebook);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "notebook", notebook,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (notebook);
+  gtk_box_pack_end (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
+
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox1, "vbox1");
+  gtk_widget_ref (vbox1);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "vbox1", vbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox1);
+  gtk_container_add (GTK_CONTAINER (notebook), vbox1);
+
+  hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (hbox1, "hbox1");
+  gtk_widget_ref (hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "hbox1", hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
+
+  buttonMrlGo = gtk_button_new_with_label (_("Add"));
+  gtk_widget_set_name (buttonMrlGo, "buttonMrlGo");
+  gtk_widget_ref (buttonMrlGo);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "buttonMrlGo", buttonMrlGo,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonMrlGo);
+  gtk_box_pack_start (GTK_BOX (hbox1), buttonMrlGo, FALSE, FALSE, 0);
+
+  labelUrl = gtk_label_new (_("MRL :"));
+  gtk_widget_set_name (labelUrl, "labelUrl");
+  gtk_widget_ref (labelUrl);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "labelUrl", labelUrl,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (labelUrl);
+  gtk_box_pack_start (GTK_BOX (hbox1), labelUrl, FALSE, FALSE, 2);
+
+  mrl_combo = gtk_combo_new ();
+  gtk_widget_set_name (mrl_combo, "mrl_combo");
+  gtk_widget_ref (mrl_combo);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "mrl_combo", mrl_combo,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mrl_combo);
+  gtk_box_pack_start (GTK_BOX (hbox1), mrl_combo, TRUE, TRUE, 3);
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "file://");
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "ftp://");
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "http://");
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "udp://@:1234");
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "udp6://@:1234");
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "rtp://");
+  mrl_combo_items = g_list_append (mrl_combo_items, (gpointer) "rtp6://");
+  gtk_combo_set_popdown_strings (GTK_COMBO (mrl_combo), mrl_combo_items);
+  g_list_free (mrl_combo_items);
+
+  mrl_entry = GTK_COMBO (mrl_combo)->entry;
+  gtk_widget_set_name (mrl_entry, "mrl_entry");
+  gtk_widget_ref (mrl_entry);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "mrl_entry", mrl_entry,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mrl_entry);
+  gtk_entry_set_text (GTK_ENTRY (mrl_entry), "file://");
+
+  mediabook = gtk_notebook_new ();
+  gtk_widget_set_name (mediabook, "mediabook");
+  gtk_widget_ref (mediabook);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "mediabook", mediabook,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mediabook);
+  gtk_box_pack_start (GTK_BOX (vbox1), mediabook, TRUE, TRUE, 0);
+
+  scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_set_name (scrolledwindow4, "scrolledwindow4");
+  gtk_widget_ref (scrolledwindow4);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "scrolledwindow4", scrolledwindow4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow4);
+  gtk_container_add (GTK_CONTAINER (mediabook), scrolledwindow4);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+  viewport2 = gtk_viewport_new (NULL, NULL);
+  gtk_widget_set_name (viewport2, "viewport2");
+  gtk_widget_ref (viewport2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "viewport2", viewport2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (viewport2);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow4), viewport2);
+
+  clistmedia = gtk_clist_new (2);
+  gtk_widget_set_name (clistmedia, "clistmedia");
+  gtk_widget_ref (clistmedia);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "clistmedia", clistmedia,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (clistmedia);
+  gtk_container_add (GTK_CONTAINER (viewport2), clistmedia);
+  gtk_clist_set_column_width (GTK_CLIST (clistmedia), 0, 129);
+  gtk_clist_set_column_width (GTK_CLIST (clistmedia), 1, 80);
+  gtk_clist_column_titles_show (GTK_CLIST (clistmedia));
+
+  labelname = gtk_label_new (_("Name"));
+  gtk_widget_set_name (labelname, "labelname");
+  gtk_widget_ref (labelname);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "labelname", labelname,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (labelname);
+  gtk_clist_set_column_widget (GTK_CLIST (clistmedia), 0, labelname);
+
+  labeltype = gtk_label_new (_("Type"));
+  gtk_widget_set_name (labeltype, "labeltype");
+  gtk_widget_ref (labeltype);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "labeltype", labeltype,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (labeltype);
+  gtk_clist_set_column_widget (GTK_CLIST (clistmedia), 1, labeltype);
+
+  label13 = gtk_label_new (_("File"));
+  gtk_widget_set_name (label13, "label13");
+  gtk_widget_ref (label13);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label13", label13,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label13);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (mediabook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (mediabook), 0), label13);
+
+  vbox3 = gtk_vbox_new (FALSE, 2);
+  gtk_widget_set_name (vbox3, "vbox3");
+  gtk_widget_ref (vbox3);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "vbox3", vbox3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox3);
+  gtk_container_add (GTK_CONTAINER (mediabook), vbox3);
+
+  network_multicast = gtk_radio_button_new_with_label (network_group, _("UDP/RTP (Adress when Multicast)"));
+  network_group = gtk_radio_button_group (GTK_RADIO_BUTTON (network_multicast));
+  gtk_widget_set_name (network_multicast, "network_multicast");
+  gtk_widget_ref (network_multicast);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "network_multicast", network_multicast,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (network_multicast);
+  gtk_box_pack_start (GTK_BOX (vbox3), network_multicast, FALSE, FALSE, 0);
+
+  table1 = gtk_table_new (2, 2, FALSE);
+  gtk_widget_set_name (table1, "table1");
+  gtk_widget_ref (table1);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "table1", table1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table1);
+  gtk_box_pack_start (GTK_BOX (vbox3), table1, FALSE, TRUE, 0);
+  gtk_table_set_col_spacings (GTK_TABLE (table1), 5);
+
+  label21 = gtk_label_new (_("Address"));
+  gtk_widget_set_name (label21, "label21");
+  gtk_widget_ref (label21);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label21", label21,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label21);
+  gtk_table_attach (GTK_TABLE (table1), label21, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label21), 0, 0.5);
+
+  label22 = gtk_label_new (_("Port"));
+  gtk_widget_set_name (label22, "label22");
+  gtk_widget_ref (label22);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label22", label22,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label22);
+  gtk_table_attach (GTK_TABLE (table1), label22, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label22), 0, 0.5);
+
+  network_multicast_port_adj = gtk_adjustment_new (1234, 1, 65536, 1, 10, 10);
+  network_multicast_port = gtk_spin_button_new (GTK_ADJUSTMENT (network_multicast_port_adj), 1, 0);
+  gtk_widget_set_name (network_multicast_port, "network_multicast_port");
+  gtk_widget_ref (network_multicast_port);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "network_multicast_port", network_multicast_port,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (network_multicast_port);
+  gtk_table_attach (GTK_TABLE (table1), network_multicast_port, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  combo2 = gtk_combo_new ();
+  gtk_widget_set_name (combo2, "combo2");
+  gtk_widget_ref (combo2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "combo2", combo2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (combo2);
+  gtk_table_attach (GTK_TABLE (table1), combo2, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  network_multicast_address = GTK_COMBO (combo2)->entry;
+  gtk_widget_set_name (network_multicast_address, "network_multicast_address");
+  gtk_widget_ref (network_multicast_address);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "network_multicast_address", network_multicast_address,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (network_multicast_address);
+
+  hseparator10 = gtk_hseparator_new ();
+  gtk_widget_set_name (hseparator10, "hseparator10");
+  gtk_widget_ref (hseparator10);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "hseparator10", hseparator10,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hseparator10);
+  gtk_box_pack_start (GTK_BOX (vbox3), hseparator10, FALSE, TRUE, 0);
+
+  hbox9 = gtk_hbox_new (TRUE, 0);
+  gtk_widget_set_name (hbox9, "hbox9");
+  gtk_widget_ref (hbox9);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "hbox9", hbox9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox9);
+  gtk_box_pack_start (GTK_BOX (vbox3), hbox9, FALSE, TRUE, 0);
+
+  network_http = gtk_radio_button_new_with_label (network_group, _("HTTP"));
+  network_group = gtk_radio_button_group (GTK_RADIO_BUTTON (network_http));
+  gtk_widget_set_name (network_http, "network_http");
+  gtk_widget_ref (network_http);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "network_http", network_http,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (network_http);
+  gtk_box_pack_start (GTK_BOX (hbox9), network_http, FALSE, TRUE, 0);
+  gtk_widget_set_sensitive (network_http, FALSE);
+
+  network_ftp = gtk_radio_button_new_with_label (network_group, _("FTP"));
+  network_group = gtk_radio_button_group (GTK_RADIO_BUTTON (network_ftp));
+  gtk_widget_set_name (network_ftp, "network_ftp");
+  gtk_widget_ref (network_ftp);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "network_ftp", network_ftp,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (network_ftp);
+  gtk_box_pack_start (GTK_BOX (hbox9), network_ftp, FALSE, TRUE, 0);
+  gtk_widget_set_sensitive (network_ftp, FALSE);
+
+  network_mms = gtk_radio_button_new_with_label (network_group, _("MMS"));
+  network_group = gtk_radio_button_group (GTK_RADIO_BUTTON (network_mms));
+  gtk_widget_set_name (network_mms, "network_mms");
+  gtk_widget_ref (network_mms);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "network_mms", network_mms,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (network_mms);
+  gtk_box_pack_start (GTK_BOX (hbox9), network_mms, FALSE, TRUE, 0);
+  gtk_widget_set_sensitive (network_mms, FALSE);
+
+  hseparator11 = gtk_hseparator_new ();
+  gtk_widget_set_name (hseparator11, "hseparator11");
+  gtk_widget_ref (hseparator11);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "hseparator11", hseparator11,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hseparator11);
+  gtk_box_pack_start (GTK_BOX (vbox3), hseparator11, TRUE, TRUE, 0);
+
+  label20 = gtk_label_new (_("Network"));
+  gtk_widget_set_name (label20, "label20");
+  gtk_widget_ref (label20);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label20", label20,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label20);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (mediabook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (mediabook), 1), label20);
+
+  media2 = gtk_label_new (_("Media"));
+  gtk_widget_set_name (media2, "media2");
+  gtk_widget_ref (media2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "media2", media2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (media2);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0), media2);
+
+  vbox4 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox4, "vbox4");
+  gtk_widget_ref (vbox4);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "vbox4", vbox4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox4);
+  gtk_container_add (GTK_CONTAINER (notebook), vbox4);
+
+  scrolledwindow5 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_set_name (scrolledwindow5, "scrolledwindow5");
+  gtk_widget_ref (scrolledwindow5);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "scrolledwindow5", scrolledwindow5,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow5);
+  gtk_box_pack_start (GTK_BOX (vbox4), scrolledwindow5, TRUE, TRUE, 0);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+  clistplaylist = gtk_clist_new (2);
+  gtk_widget_set_name (clistplaylist, "clistplaylist");
+  gtk_widget_ref (clistplaylist);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "clistplaylist", clistplaylist,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (clistplaylist);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow5), clistplaylist);
+  gtk_clist_set_column_width (GTK_CLIST (clistplaylist), 0, 140);
+  gtk_clist_set_column_width (GTK_CLIST (clistplaylist), 1, 80);
+  gtk_clist_column_titles_show (GTK_CLIST (clistplaylist));
+
+  label25 = gtk_label_new (_("MRL"));
+  gtk_widget_set_name (label25, "label25");
+  gtk_widget_ref (label25);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label25", label25,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label25);
+  gtk_clist_set_column_widget (GTK_CLIST (clistplaylist), 0, label25);
+  gtk_label_set_justify (GTK_LABEL (label25), GTK_JUSTIFY_LEFT);
+
+  label26 = gtk_label_new (_("Time"));
+  gtk_widget_set_name (label26, "label26");
+  gtk_widget_ref (label26);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label26", label26,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label26);
+  gtk_clist_set_column_widget (GTK_CLIST (clistplaylist), 1, label26);
+  gtk_label_set_justify (GTK_LABEL (label26), GTK_JUSTIFY_RIGHT);
+
+  hbox11 = gtk_hbox_new (TRUE, 0);
+  gtk_widget_set_name (hbox11, "hbox11");
+  gtk_widget_ref (hbox11);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "hbox11", hbox11,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox11);
+  gtk_box_pack_start (GTK_BOX (vbox4), hbox11, FALSE, FALSE, 2);
+
+  update_playlist = gtk_button_new_with_label (_("Update"));
+  gtk_widget_set_name (update_playlist, "update_playlist");
+  gtk_widget_ref (update_playlist);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "update_playlist", update_playlist,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (update_playlist);
+  gtk_box_pack_start (GTK_BOX (hbox11), update_playlist, FALSE, FALSE, 0);
+
+  playlist_del = gtk_button_new_with_label (_(" Del "));
+  gtk_widget_set_name (playlist_del, "playlist_del");
+  gtk_widget_ref (playlist_del);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "playlist_del", playlist_del,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (playlist_del);
+  gtk_box_pack_start (GTK_BOX (hbox11), playlist_del, FALSE, FALSE, 5);
+
+  playlist_clear = gtk_button_new_with_label (_(" Clear "));
+  gtk_widget_set_name (playlist_clear, "playlist_clear");
+  gtk_widget_ref (playlist_clear);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "playlist_clear", playlist_clear,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (playlist_clear);
+  gtk_box_pack_start (GTK_BOX (hbox11), playlist_clear, FALSE, FALSE, 5);
+
+  playlist = gtk_label_new (_("Playlist"));
+  gtk_widget_set_name (playlist, "playlist");
+  gtk_widget_ref (playlist);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "playlist", playlist,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (playlist);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1), playlist);
+
+  vbox2 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox2, "vbox2");
+  gtk_widget_ref (vbox2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "vbox2", vbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox2);
+  gtk_container_add (GTK_CONTAINER (notebook), vbox2);
+
+  cbautoplay = gtk_check_button_new_with_label (_("Automatically play file"));
+  gtk_widget_set_name (cbautoplay, "cbautoplay");
+  gtk_widget_ref (cbautoplay);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "cbautoplay", cbautoplay,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (cbautoplay);
+  gtk_box_pack_start (GTK_BOX (vbox2), cbautoplay, FALSE, FALSE, 0);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cbautoplay), TRUE);
+
+  hbox2 = gtk_hbox_new (TRUE, 0);
+  gtk_widget_set_name (hbox2, "hbox2");
+  gtk_widget_ref (hbox2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "hbox2", hbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox2);
+  gtk_box_pack_end (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
+
+  buttonSave = gtk_button_new_with_label (_(" Save "));
+  gtk_widget_set_name (buttonSave, "buttonSave");
+  gtk_widget_ref (buttonSave);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "buttonSave", buttonSave,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonSave);
+  gtk_box_pack_start (GTK_BOX (hbox2), buttonSave, FALSE, FALSE, 0);
+
+  buttonApply = gtk_button_new_with_label (_(" Apply "));
+  gtk_widget_set_name (buttonApply, "buttonApply");
+  gtk_widget_ref (buttonApply);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "buttonApply", buttonApply,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonApply);
+  gtk_box_pack_start (GTK_BOX (hbox2), buttonApply, FALSE, FALSE, 0);
+
+  buttonCancel = gtk_button_new_with_label (_(" Cancel "));
+  gtk_widget_set_name (buttonCancel, "buttonCancel");
+  gtk_widget_ref (buttonCancel);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "buttonCancel", buttonCancel,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonCancel);
+  gtk_box_pack_end (GTK_BOX (hbox2), buttonCancel, FALSE, FALSE, 0);
+
+  preferences = gtk_label_new (_("Preference"));
+  gtk_widget_set_name (preferences, "preferences");
+  gtk_widget_ref (preferences);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "preferences", preferences,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (preferences);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 2), preferences);
+
+  scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_set_name (scrolledwindow3, "scrolledwindow3");
+  gtk_widget_ref (scrolledwindow3);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "scrolledwindow3", scrolledwindow3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow3);
+  gtk_container_add (GTK_CONTAINER (notebook), scrolledwindow3);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+  viewport1 = gtk_viewport_new (NULL, NULL);
+  gtk_widget_set_name (viewport1, "viewport1");
+  gtk_widget_ref (viewport1);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "viewport1", viewport1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (viewport1);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow3), viewport1);
+  gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport1), GTK_SHADOW_NONE);
+
+  fixed2 = gtk_fixed_new ();
+  gtk_widget_set_name (fixed2, "fixed2");
+  gtk_widget_ref (fixed2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "fixed2", fixed2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (fixed2);
+  gtk_container_add (GTK_CONTAINER (viewport1), fixed2);
+
+  pixmap2 = create_pixmap (pda, "vlc32x32.xpm");
+  gtk_widget_set_name (pixmap2, "pixmap2");
+  gtk_widget_ref (pixmap2);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "pixmap2", pixmap2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (pixmap2);
+  gtk_fixed_put (GTK_FIXED (fixed2), pixmap2, 8, 0);
+  gtk_widget_set_uposition (pixmap2, 8, 0);
+  gtk_widget_set_usize (pixmap2, 50, 50);
+
+  label8 = gtk_label_new (_("(c) 1996-2003 the VideoLAN team"));
+  gtk_widget_set_name (label8, "label8");
+  gtk_widget_ref (label8);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label8", label8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label8);
+  gtk_fixed_put (GTK_FIXED (fixed2), label8, 16, 56);
+  gtk_widget_set_uposition (label8, 16, 56);
+  gtk_widget_set_usize (label8, 200, 18);
+
+  label9 = gtk_label_new (_("Authors: The VideoLAN Team, http://www.videolan.org"));
+  gtk_widget_set_name (label9, "label9");
+  gtk_widget_ref (label9);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label9", label9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label9);
+  gtk_fixed_put (GTK_FIXED (fixed2), label9, 16, 80);
+  gtk_widget_set_uposition (label9, 16, 80);
+  gtk_widget_set_usize (label9, 200, 40);
+  gtk_label_set_line_wrap (GTK_LABEL (label9), TRUE);
+
+  label11 = gtk_label_new (_("VLC media player"));
+  gtk_widget_set_name (label11, "label11");
+  gtk_widget_ref (label11);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label11", label11,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label11);
+  gtk_fixed_put (GTK_FIXED (fixed2), label11, 64, 8);
+  gtk_widget_set_uposition (label11, 64, 8);
+  gtk_widget_set_usize (label11, 120, 40);
+  gtk_label_set_line_wrap (GTK_LABEL (label11), TRUE);
+
+  label27 = gtk_label_new ("http://www.videolan.org");
+  gtk_widget_set_name (label27, "label27");
+  gtk_widget_ref (label27);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label27", label27,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label27);
+  gtk_fixed_put (GTK_FIXED (fixed2), label27, 16, 200);
+  gtk_widget_set_uposition (label27, 16, 200);
+  gtk_widget_set_usize (label27, 208, 16);
+
+  label10 = gtk_label_new (_("The VideoLAN Client is a MPEG, MPEG 2, MP3, DivX player, that accepts input from local or network sources."));
+  gtk_widget_set_name (label10, "label10");
+  gtk_widget_ref (label10);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "label10", label10,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label10);
+  gtk_fixed_put (GTK_FIXED (fixed2), label10, 16, 128);
+  gtk_widget_set_uposition (label10, 16, 128);
+  gtk_widget_set_usize (label10, 200, 70);
+  gtk_label_set_justify (GTK_LABEL (label10), GTK_JUSTIFY_LEFT);
+  gtk_label_set_line_wrap (GTK_LABEL (label10), TRUE);
+
+  about = gtk_label_new (_("About"));
+  gtk_widget_set_name (about, "about");
+  gtk_widget_ref (about);
+  gtk_object_set_data_full (GTK_OBJECT (pda), "about", about,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (about);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 3), about);
+
+  gtk_signal_connect (GTK_OBJECT (pda), "delete_event",
+                      GTK_SIGNAL_FUNC (on_pda_delete_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_open), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_open_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_playlist), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_playlist_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_preferences), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_preferences_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_rewind), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_rewind_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_pause), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_pause_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_play), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_play_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_stop), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_stop_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_forward), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_forward_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (toolbar_about), "clicked",
+                      GTK_SIGNAL_FUNC (on_toolbar_about_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (slider), "button_release_event",
+                      GTK_SIGNAL_FUNC (PDASliderRelease),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (slider), "button_press_event",
+                      GTK_SIGNAL_FUNC (PDASliderPress),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonMrlGo), "clicked",
+                      GTK_SIGNAL_FUNC (PDAMrlGo),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mrl_entry), "changed",
+                      GTK_SIGNAL_FUNC (on_comboURL_entry_changed),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (clistmedia), "select_row",
+                      GTK_SIGNAL_FUNC (on_clistmedia_select_row),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (clistmedia), "click_column",
+                      GTK_SIGNAL_FUNC (on_clistmedia_click_column),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (network_multicast), "toggled",
+                      GTK_SIGNAL_FUNC (on_network_multicast_toggled),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (network_multicast_port), "changed",
+                      GTK_SIGNAL_FUNC (on_network_multicast_port_changed),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (network_multicast_address), "changed",
+                      GTK_SIGNAL_FUNC (on_network_multicast_address_changed),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (network_http), "toggled",
+                      GTK_SIGNAL_FUNC (on_network_http_toggled),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (network_ftp), "toggled",
+                      GTK_SIGNAL_FUNC (on_network_ftp_toggled),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (network_mms), "toggled",
+                      GTK_SIGNAL_FUNC (on_network_mms_toggled),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (clistplaylist), "event",
+                      GTK_SIGNAL_FUNC (PDAPlaylistEvent),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (update_playlist), "clicked",
+                      GTK_SIGNAL_FUNC (PDAPlaylistUpdate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (playlist_del), "clicked",
+                      GTK_SIGNAL_FUNC (PDAPlaylistDel),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (playlist_clear), "clicked",
+                      GTK_SIGNAL_FUNC (PDAPlaylistClear),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (cbautoplay), "toggled",
+                      GTK_SIGNAL_FUNC (on_cbautoplay_toggled),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonApply), "clicked",
+                      GTK_SIGNAL_FUNC (PDAPreferencesApply),
+                      NULL);
+
+  return pda;
+}
+
diff --git a/modules/gui/pda/interface.h b/modules/gui/pda/interface.h
new file mode 100644 (file)
index 0000000..02c671e
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_pda (void);
diff --git a/modules/gui/pda/network.c b/modules/gui/pda/network.c
new file mode 100644 (file)
index 0000000..b013aca
--- /dev/null
@@ -0,0 +1,136 @@
+/*****************************************************************************
+ * network.c : Network interface of the gtk-pda plugin.
+ *****************************************************************************
+ * Copyright (C) 2000, 2001 VideoLAN
+ * $Id: network.c,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Marc Ariberti <marcari@videolan.org>
+ *      
+ * 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.
+ *****************************************************************************/
+
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <sys/types.h>                                              /* off_t */
+#include <stdlib.h>
+
+#include <vlc/vlc.h>
+#include <vlc/intf.h>
+#include <vlc/vout.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+#include "pda.h"
+
+static void update_network_multicast(GtkWidget * widget);
+
+static void update_network_multicast(GtkWidget * widget)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( widget );
+    GtkToggleButton * p_network_multicast = 
+        GTK_GET( TOGGLE_BUTTON, "network_multicast" );
+    GtkEditable * p_network_multicast_address = 
+        GTK_GET( EDITABLE, "network_multicast_address" );
+    GtkEditable * p_network_multicast_port = 
+        GTK_GET( EDITABLE, "network_multicast_port" );
+        
+    if (gtk_toggle_button_get_active(p_network_multicast))
+    {
+        gchar * str = g_strconcat( "udp://@",
+            gtk_editable_get_chars(p_network_multicast_address, 0, -1), ":",
+            gtk_editable_get_chars(p_network_multicast_port, 0, -1), NULL );
+        gtk_entry_set_text(p_intf->p_sys->p_mrlentry, str);
+        g_free( str );
+    }
+}
+
+
+void
+on_network_multicast_toggled           (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+    update_network_multicast(GTK_WIDGET(togglebutton));
+}
+
+
+void
+on_network_multicast_port_changed      (GtkEditable     *editable,
+                                        gpointer         user_data)
+{
+    update_network_multicast(GTK_WIDGET(editable));
+}
+
+
+void
+on_network_multicast_address_changed   (GtkEditable     *editable,
+                                        gpointer         user_data)
+{
+    update_network_multicast(GTK_WIDGET(editable));
+}
+
+
+void
+on_network_http_toggled                (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( togglebutton );
+
+    if (gtk_toggle_button_get_active(togglebutton))
+    {
+        gtk_entry_set_text(p_intf->p_sys->p_mrlentry, "http://");
+    }
+}
+
+
+void
+on_network_ftp_toggled                 (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( togglebutton );
+    
+    if (gtk_toggle_button_get_active(togglebutton))
+    {
+        gtk_entry_set_text(p_intf->p_sys->p_mrlentry, "ftp://");
+    }
+}
+
+
+void
+on_network_mms_toggled                 (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( togglebutton );
+    
+    if (gtk_toggle_button_get_active(togglebutton))
+    {
+        gtk_entry_set_text(p_intf->p_sys->p_mrlentry, "mms://");
+    }
+}
+
diff --git a/modules/gui/pda/network.h b/modules/gui/pda/network.h
new file mode 100644 (file)
index 0000000..529c44a
--- /dev/null
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * network.h : Network part of the gtk-pda plugin.
+ *****************************************************************************
+ * Copyright (C) 2000, 2001 VideoLAN
+ * $Id: network.h,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Marc Ariberti <marcari@videolan.org>
+ *      
+ * 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.
+ *****************************************************************************/
+
+void
+on_network_udp_toggled                 (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+void
+on_network_udp_port_changed            (GtkEditable     *editable,
+                                        gpointer         user_data);
+
+void
+on_network_multicast_toggled           (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+void
+on_network_multicast_port_changed      (GtkEditable     *editable,
+                                        gpointer         user_data);
+
+void
+on_network_multicast_address_changed   (GtkEditable     *editable,
+                                        gpointer         user_data);
+
+void
+on_network_http_toggled                (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+void
+on_network_ftp_toggled                 (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+void
+on_network_mms_toggled                 (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+void
+PDANetworkGo                      (GtkButton       *button,
+                                        gpointer         user_data);
diff --git a/modules/gui/pda/pda.c b/modules/gui/pda/pda.c
new file mode 100644 (file)
index 0000000..3699ce4
--- /dev/null
@@ -0,0 +1,540 @@
+/*****************************************************************************
+ * pda.c : PDA Gtk2 plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2002 VideoLAN
+ * $Id: pda.c,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
+ *          Marc Ariberti <marcari@videolan.org>
+ *
+ * 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.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h>                                      /* malloc(), free() */
+#include <errno.h>                                                 /* ENOMEM */
+#include <string.h>                                            /* strerror() */
+#include <stdio.h>
+
+#include <vlc/vlc.h>
+#include <vlc/intf.h>
+
+#include <gtk/gtk.h>
+
+#ifdef HAVE_GPE_INIT_H
+#include <gpe/init.h>
+#endif
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+#include "pda.h"
+
+/*****************************************************************************
+ * Local prototypes.
+ *****************************************************************************/
+static int  Open         ( vlc_object_t * );
+static void Close        ( vlc_object_t * );
+static void Run          ( intf_thread_t * );
+
+void GtkAutoPlayFile     ( vlc_object_t * );
+static int Manage        ( intf_thread_t *p_intf );
+void E_(GtkDisplayDate)  ( GtkAdjustment *p_adj );
+gint E_(GtkModeManage)   ( intf_thread_t * p_intf );
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+#define AUTOPLAYFILE_TEXT  N_("Autoplay selected file")
+#define AUTOPLAYFILE_LONGTEXT N_("Automatically play a file when selected in the "\
+        "file selection list")
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+vlc_module_begin();
+    add_category_hint( N_("Miscellaneous"), NULL, VLC_TRUE );
+    add_bool( "pda-autoplayfile", 1, GtkAutoPlayFile, AUTOPLAYFILE_TEXT, AUTOPLAYFILE_LONGTEXT, VLC_TRUE );
+    set_description( _("PDA Linux Gtk2+ interface") );
+    set_capability( "interface", 70 );
+    set_callbacks( Open, Close );
+    add_shortcut( "pda" );
+vlc_module_end();
+
+/*****************************************************************************
+ * Open: initialize and create window
+ *****************************************************************************/
+static int Open( vlc_object_t *p_this )
+{
+    intf_thread_t *p_intf = (intf_thread_t *)p_this;
+
+    /* Allocate instance and initialize some members */
+    p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
+    if( p_intf->p_sys == NULL )
+    {
+        msg_Err( p_intf, "out of memory" );
+        return VLC_ENOMEM;
+    }
+
+#ifdef NEED_GTK_MAIN
+    msg_Dbg( p_intf, "Using gui-helper" );
+    p_intf->p_sys->p_gtk_main = module_Need( p_this, "gui-helper", "gtk" );
+    if( p_intf->p_sys->p_gtk_main == NULL )
+    {
+        free( p_intf->p_sys );
+        return VLC_ENOMOD;
+    }
+#endif
+
+    /* Initialize Gtk+ thread */
+    p_intf->p_sys->p_input = NULL;
+
+    p_intf->p_sys->b_autoplayfile = 1;
+    p_intf->p_sys->b_playing = 0;
+    p_intf->p_sys->b_slider_free = 1;
+
+    p_intf->pf_run = Run;
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * Close: destroy interface window
+ *****************************************************************************/
+static void Close( vlc_object_t *p_this )
+{
+    intf_thread_t *p_intf = (intf_thread_t *)p_this;
+
+    if( p_intf->p_sys->p_input )
+    {
+        vlc_object_release( p_intf->p_sys->p_input );
+    }
+
+#ifdef NEED_GTK_MAIN
+    msg_Dbg( p_intf, "Releasing gui-helper" );
+    module_Unneed( p_intf, p_intf->p_sys->p_gtk_main );
+#endif
+
+    /* Destroy structure */
+    free( p_intf->p_sys );
+}
+
+/*****************************************************************************
+ * Run: Gtk+ thread
+ *****************************************************************************
+ * this part of the interface is in a separate thread so that we can call
+ * gtk_main() from within it without annoying the rest of the program.
+ *****************************************************************************/
+static void Run( intf_thread_t *p_intf )
+{
+#ifndef NEED_GTK_MAIN
+    /* gtk_init needs to know the command line. We don't care, so we
+     * give it an empty one */
+    char  *p_args[] = { "", NULL };
+    char **pp_args  = p_args;
+    int    i_args   = 1;
+    int    i_dummy;
+#endif
+
+#ifdef HAVE_GPE_INIT_H
+    /* Initialize GPE interface */
+    msg_Dbg( p_intf, "Starting pda GPE interface" );
+    if (gpe_application_init(&i_args, &pp_args) == FALSE)
+        exit (1);
+#else
+    gtk_set_locale ();
+#   ifndef NEED_GTK_MAIN
+    msg_Dbg( p_intf, "Starting pda GTK2+ interface" );
+    gtk_init( &i_args, &pp_args );
+#   else
+    /* Initialize Gtk+ */
+    msg_Dbg( p_intf, "Starting pda GTK+ interface thread" );
+    gdk_threads_enter();
+#   endif
+#endif
+
+    /* Create some useful widgets that will certainly be used */
+// FIXME: magic path
+    add_pixmap_directory("share");
+    add_pixmap_directory("/usr/share/vlc");
+
+    /* Path for pixmaps under linupy 1.4 */
+    add_pixmap_directory("/usr/local/share/pixmaps/vlc");
+
+    /* Path for pixmaps under linupy 2.0 */
+    add_pixmap_directory("/usr/share/pixmaps/vlc");
+
+    p_intf->p_sys->p_window = create_pda();
+    if (p_intf->p_sys->p_window == NULL)
+    {
+        msg_Err( p_intf, "unable to create pda interface" );
+    }
+    gtk_widget_set_usize(p_intf->p_sys->p_window, 
+                        gdk_screen_width() , gdk_screen_height() - 30 );
+
+    /* Set the title of the main window */
+    gtk_window_set_title( GTK_WINDOW(p_intf->p_sys->p_window),
+                          VOUT_TITLE " (pda Linux interface)");
+
+    p_intf->p_sys->p_notebook = GTK_NOTEBOOK( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "notebook" ) );
+    p_intf->p_sys->p_mediabook = GTK_NOTEBOOK( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "mediabook" ) );
+
+    /* Get the slider object */
+    p_intf->p_sys->p_slider = GTK_HSCALE( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "slider" ) );
+    p_intf->p_sys->p_slider_label = GTK_LABEL( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "slider_label" ) );
+
+    /* Connect the date display to the slider */
+#define P_SLIDER GTK_RANGE( gtk_object_get_data( \
+                         GTK_OBJECT( p_intf->p_sys->p_window ), "slider" ) )
+    p_intf->p_sys->p_adj = gtk_range_get_adjustment( P_SLIDER );
+
+    gtk_signal_connect ( GTK_OBJECT( p_intf->p_sys->p_adj ), "value_changed",
+                         GTK_SIGNAL_FUNC( E_(GtkDisplayDate) ), NULL );
+    p_intf->p_sys->f_adj_oldvalue = 0;
+    p_intf->p_sys->i_adj_oldvalue = 0;
+#undef P_SLIDER
+
+    p_intf->p_sys->p_clist = GTK_CLIST( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "clistmedia" ) );
+    gtk_clist_set_column_visibility (GTK_CLIST (p_intf->p_sys->p_clist), 2, FALSE);
+    gtk_clist_set_column_visibility (GTK_CLIST (p_intf->p_sys->p_clist), 3, FALSE);
+    gtk_clist_set_column_visibility (GTK_CLIST (p_intf->p_sys->p_clist), 4, FALSE);
+    gtk_clist_column_titles_show (GTK_CLIST (p_intf->p_sys->p_clist));
+
+    /* the playlist object */
+    p_intf->p_sys->p_clistplaylist = GTK_CLIST( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "clistplaylist" ) );
+    
+    p_intf->p_sys->p_mrlentry = GTK_ENTRY( gtk_object_get_data(
+        GTK_OBJECT( p_intf->p_sys->p_window ), "mrl_entry" ) );
+
+    /* Store p_intf to keep an eye on it */
+    gtk_object_set_data( GTK_OBJECT(p_intf->p_sys->p_window),
+                         "p_intf", p_intf );
+    gtk_object_set_data( GTK_OBJECT(p_intf->p_sys->p_adj),
+                         "p_intf", p_intf );
+    
+    /* Show the control window */
+    gtk_widget_show( p_intf->p_sys->p_window );
+    ReadDirectory(p_intf->p_sys->p_clist, ".");
+
+    /* update the playlist */
+    PDARebuildCList( p_intf->p_sys->p_clistplaylist, 
+        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ));
+    
+#ifdef NEED_GTK_MAIN
+    msg_Dbg( p_intf, "Manage GTK keyboard events using threads" );
+    while( !p_intf->b_die )
+    {
+        Manage( p_intf );
+
+        /* Sleep to avoid using all CPU - since some interfaces need to
+         * access keyboard events, a 100ms delay is a good compromise */
+        gdk_threads_leave();
+        if (p_intf->p_libvlc->i_cpu & CPU_CAPABILITY_FPU)
+            msleep( INTF_IDLE_SLEEP );
+        else
+            msleep( 1000 );
+        gdk_threads_enter();
+    }
+#else
+    msg_Dbg( p_intf, "Manage GTK keyboard events using timeouts" );
+    /* Sleep to avoid using all CPU - since some interfaces needs to access
+     * keyboard events, a 1000ms delay is a good compromise */
+    if (p_intf->p_libvlc->i_cpu & CPU_CAPABILITY_FPU)
+        i_dummy = gtk_timeout_add( INTF_IDLE_SLEEP / 1000, (GtkFunction)Manage, p_intf );
+    else
+        i_dummy = gtk_timeout_add( 1000, (GtkFunction)Manage, p_intf );
+
+    /* Enter Gtk mode */
+    gtk_main();
+    /* Remove the timeout */
+    gtk_timeout_remove( i_dummy );
+#endif
+
+    gtk_object_destroy( GTK_OBJECT(p_intf->p_sys->p_window) );
+#ifdef NEED_GTK_MAIN
+    gdk_threads_leave();
+#endif
+}
+
+/*****************************************************************************
+ * GtkAutoplayFile: Autoplay file depending on configuration settings
+ *****************************************************************************/
+void GtkAutoPlayFile( vlc_object_t *p_this )
+{
+    GtkWidget *cbautoplay;
+    intf_thread_t *p_intf;
+    int i_index;
+    vlc_list_t *p_list = vlc_list_find( p_this, VLC_OBJECT_INTF,
+                                        FIND_ANYWHERE );
+
+    for( i_index = 0; i_index < p_list->i_count; i_index++ )
+    {
+        p_intf = (intf_thread_t *)p_list->p_values[i_index].p_object ;
+
+        if( strcmp( MODULE_STRING, p_intf->p_module->psz_object_name ) )
+        {
+            continue;
+        }
+        cbautoplay = GTK_WIDGET( gtk_object_get_data(
+                            GTK_OBJECT( p_intf->p_sys->p_window ),
+                            "cbautoplay" ) );
+
+        if( !config_GetInt( p_this, "pda-autoplayfile" ) )
+        {
+            p_intf->p_sys->b_autoplayfile = VLC_FALSE;
+        }
+        else
+        {
+            p_intf->p_sys->b_autoplayfile = VLC_TRUE;
+        }
+        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( cbautoplay ),
+                                      p_intf->p_sys->b_autoplayfile );
+    }
+    vlc_list_release( p_list );
+}
+
+/* following functions are local */
+
+/*****************************************************************************
+ * Manage: manage main thread messages
+ *****************************************************************************
+ * In this function, called approx. 10 times a second, we check what the
+ * main program wanted to tell us.
+ *****************************************************************************/
+static int Manage( intf_thread_t *p_intf )
+{
+    vlc_mutex_lock( &p_intf->change_lock );
+
+    /* Update the input */
+    if( p_intf->p_sys->p_input == NULL )
+    {
+        p_intf->p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT,
+                                                          FIND_ANYWHERE );
+    }
+    else if( p_intf->p_sys->p_input->b_dead )
+    {
+        vlc_object_release( p_intf->p_sys->p_input );
+        p_intf->p_sys->p_input = NULL;
+    }
+
+    if( p_intf->p_sys->p_input )
+    {
+        input_thread_t *p_input = p_intf->p_sys->p_input;
+
+        vlc_mutex_lock( &p_input->stream.stream_lock );
+        if( !p_input->b_die )
+        {
+            /* New input or stream map change */
+            if( p_input->stream.b_changed )
+            {
+                playlist_t *p_playlist;
+
+                E_(GtkModeManage)( p_intf );
+                p_intf->p_sys->b_playing = 1;
+
+                /* update playlist interface */
+                p_playlist = (playlist_t *) vlc_object_find( 
+                        p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+                if (p_playlist != NULL)
+                {
+                    PDARebuildCList( p_intf->p_sys->p_clistplaylist, 
+                                          p_playlist );
+                }
+            }
+
+            /* Manage the slider */
+            if (p_intf->p_libvlc->i_cpu & CPU_CAPABILITY_FPU)
+            {
+                /* Manage the slider for CPU_CAPABILITY_FPU hardware */        
+                if( p_input->stream.b_seekable && p_intf->p_sys->b_playing )
+                {
+                    float newvalue = p_intf->p_sys->p_adj->value;
+
+#define p_area p_input->stream.p_selected_area
+                    /* If the user hasn't touched the slider since the last time,
+                     * then the input can safely change it */
+                    if( newvalue == p_intf->p_sys->f_adj_oldvalue )
+                    {
+                        /* Update the value */
+                        p_intf->p_sys->p_adj->value =
+                        p_intf->p_sys->f_adj_oldvalue =
+                            ( 100. * p_area->i_tell ) / p_area->i_size;
+                        gtk_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ),
+                                                 "value_changed" );
+                    }
+                    /* Otherwise, send message to the input if the user has
+                     * finished dragging the slider */
+                    else if( p_intf->p_sys->b_slider_free )
+                    {
+                        off_t i_seek = ( newvalue * p_area->i_size ) / 100;
+
+                        /* release the lock to be able to seek */
+                        vlc_mutex_unlock( &p_input->stream.stream_lock );
+                        input_Seek( p_input, i_seek, INPUT_SEEK_SET );
+                        vlc_mutex_lock( &p_input->stream.stream_lock );
+
+                        /* Update the old value */
+                        p_intf->p_sys->f_adj_oldvalue = newvalue;
+                    }
+#undef p_area
+                }
+            }
+            else
+            {
+                /* Manage the slider without CPU_CAPABILITY_FPU hardware */
+                if( p_input->stream.b_seekable && p_intf->p_sys->b_playing )
+                {
+                    off_t newvalue = p_intf->p_sys->p_adj->value;
+
+#define p_area p_input->stream.p_selected_area
+                    /* If the user hasn't touched the slider since the last time,
+                     * then the input can safely change it */
+                    if( newvalue == p_intf->p_sys->i_adj_oldvalue )
+                    {
+                        /* Update the value */
+                        p_intf->p_sys->p_adj->value =
+                        p_intf->p_sys->i_adj_oldvalue =
+                            ( 100 * p_area->i_tell ) / p_area->i_size;
+                        gtk_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ),
+                                                 "value_changed" );
+                    }
+                    /* Otherwise, send message to the input if the user has
+                     * finished dragging the slider */
+                    else if( p_intf->p_sys->b_slider_free )
+                    {
+                        off_t i_seek = ( newvalue * p_area->i_size ) / 100;
+
+                        /* release the lock to be able to seek */
+                        vlc_mutex_unlock( &p_input->stream.stream_lock );
+                        input_Seek( p_input, i_seek, INPUT_SEEK_SET );
+                        vlc_mutex_lock( &p_input->stream.stream_lock );
+
+                        /* Update the old value */
+                        p_intf->p_sys->i_adj_oldvalue = newvalue;
+                    }
+#undef p_area
+                }
+            }
+        }
+        vlc_mutex_unlock( &p_input->stream.stream_lock );
+    }
+    else if( p_intf->p_sys->b_playing && !p_intf->b_die )
+    {
+        E_(GtkModeManage)( p_intf );
+        p_intf->p_sys->b_playing = 0;
+    }
+
+#ifndef NEED_GTK_MAIN
+    if( p_intf->b_die )
+    {
+        vlc_mutex_unlock( &p_intf->change_lock );
+
+        /* Prepare to die, young Skywalker */
+        gtk_main_quit();
+
+        return FALSE;
+    }
+#endif
+
+    vlc_mutex_unlock( &p_intf->change_lock );
+
+    return TRUE;
+}
+
+/*****************************************************************************
+ * GtkDisplayDate: display stream date
+ *****************************************************************************
+ * This function displays the current date related to the position in
+ * the stream. It is called whenever the slider changes its value.
+ * The lock has to be taken before you call the function.
+ *****************************************************************************/
+void E_(GtkDisplayDate)( GtkAdjustment *p_adj )
+{
+    intf_thread_t *p_intf;
+
+    p_intf = gtk_object_get_data( GTK_OBJECT( p_adj ), "p_intf" );
+
+    if( p_intf->p_sys->p_input )
+    {
+#define p_area p_intf->p_sys->p_input->stream.p_selected_area
+        char psz_time[ OFFSETTOTIME_MAX_SIZE ];
+
+        gtk_label_set_text( GTK_LABEL( p_intf->p_sys->p_slider_label ),
+                        input_OffsetToTime( p_intf->p_sys->p_input, psz_time,
+                                   ( p_area->i_size * p_adj->value ) / 100 ) );
+#undef p_area
+     }
+}
+
+/*****************************************************************************
+ * GtkModeManage: actualize the aspect of the interface whenever the input
+ *                changes.
+ *****************************************************************************
+ * The lock has to be taken before you call the function.
+ *****************************************************************************/
+gint E_(GtkModeManage)( intf_thread_t * p_intf )
+{
+    GtkWidget *     p_slider;
+    vlc_bool_t      b_control;
+
+#define GETWIDGET( ptr, name ) GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( \
+                           p_intf->p_sys->ptr ) , ( name ) ) )
+    /* hide slider */
+    p_slider = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+                           p_intf->p_sys->p_window ), "slider" ) );
+    gtk_widget_hide( GTK_WIDGET( p_slider ) );
+
+    /* controls unavailable */
+    b_control = 0;
+
+    /* show the box related to current input mode */
+    if( p_intf->p_sys->p_input )
+    {
+        /* initialize and show slider for seekable streams */
+        if( p_intf->p_sys->p_input->stream.b_seekable )
+        {
+            if (p_intf->p_libvlc->i_cpu & CPU_CAPABILITY_FPU)
+                p_intf->p_sys->p_adj->value = p_intf->p_sys->f_adj_oldvalue = 0;
+            else
+                p_intf->p_sys->p_adj->value = p_intf->p_sys->i_adj_oldvalue = 0;
+            gtk_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ),
+                                     "value_changed" );
+            gtk_widget_show( GTK_WIDGET( p_slider ) );
+        }
+
+        /* control buttons for free pace streams */
+        b_control = p_intf->p_sys->p_input->stream.b_pace_control;
+
+        p_intf->p_sys->p_input->stream.b_changed = 0;
+        msg_Dbg( p_intf, "stream has changed, refreshing interface" );
+    }
+
+    /* set control items */
+    gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_rewind"), b_control );
+    gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_pause"), b_control );
+    gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_forward"), b_control );
+
+#undef GETWIDGET
+    return TRUE;
+}
+
diff --git a/modules/gui/pda/pda.glade b/modules/gui/pda/pda.glade
new file mode 100644 (file)
index 0000000..da8272d
--- /dev/null
@@ -0,0 +1,1298 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="gtk2">
+  <property name="width_request">240</property>
+  <property name="height_request">320</property>
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">VLC media player</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">vlc16x16.png</property>
+  <signal name="delete_event" handler="on_pda_delete_event"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+       <widget class="GtkToolbar" id="toolbar">
+         <property name="width_request">240</property>
+         <property name="height_request">38</property>
+         <property name="visible">True</property>
+         <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
+         <property name="toolbar_style">GTK_TOOLBAR_ICONS</property>
+         <property name="tooltips">True</property>
+
+         <child>
+           <widget class="button" id="toolbar_open">
+             <property name="width_request">22</property>
+             <property name="height_request">22</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Open file</property>
+             <property name="label">gtk-open</property>
+             <property name="use_stock">True</property>
+             <signal name="clicked" handler="on_toolbar_open_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_playlist">
+             <property name="width_request">26</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Playlist</property>
+             <property name="label" translatable="yes">Playlist</property>
+             <property name="use_underline">True</property>
+             <property name="stock_pixmap">gtk-index</property>
+             <signal name="clicked" handler="on_toolbar_playlist_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_preferences">
+             <property name="width_request">66</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Preferences</property>
+             <property name="label">gtk-preferences</property>
+             <property name="use_stock">True</property>
+             <signal name="clicked" handler="on_toolbar_preferences_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_rewind">
+             <property name="width_request">44</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Rewind stream</property>
+             <property name="label">gtk-goto-first</property>
+             <property name="use_stock">True</property>
+             <signal name="clicked" handler="on_toolbar_rewind_clicked"/>
+           </widget>
+           <packing>
+             <property name="new_group">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_pause">
+             <property name="width_request">40</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Pause stream</property>
+             <property name="label" translatable="yes">Pause</property>
+             <property name="use_underline">True</property>
+             <property name="stock_pixmap">cdplayer-pause</property>
+             <signal name="clicked" handler="on_toolbar_pause_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_play">
+             <property name="width_request">30</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Play stream</property>
+             <property name="label">gtk-go-forward</property>
+             <property name="use_stock">True</property>
+             <signal name="clicked" handler="on_toolbar_play_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_stop">
+             <property name="width_request">32</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Stop stream</property>
+             <property name="label">gtk-stop</property>
+             <property name="use_stock">True</property>
+             <signal name="clicked" handler="on_toolbar_stop_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_forward">
+             <property name="width_request">47</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">Forward stream</property>
+             <property name="label">gtk-goto-last</property>
+             <property name="use_stock">True</property>
+             <signal name="clicked" handler="on_toolbar_forward_clicked"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="button" id="toolbar_about">
+             <property name="width_request">32</property>
+             <property name="height_request">38</property>
+             <property name="visible">True</property>
+             <property name="tooltip" translatable="yes">About</property>
+             <property name="label" translatable="yes">About</property>
+             <property name="use_underline">True</property>
+             <property name="icon">vlc16x16.png</property>
+             <signal name="clicked" handler="on_toolbar_about_clicked"/>
+           </widget>
+           <packing>
+             <property name="new_group">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="slider_label">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">0:00:00</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_CENTER</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="new_group">True</property>
+           </packing>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">5</property>
+         <property name="expand">False</property>
+         <property name="fill">True</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkHScale" id="slider">
+         <property name="visible">True</property>
+         <property name="can_focus">True</property>
+         <property name="draw_value">False</property>
+         <property name="value_pos">GTK_POS_RIGHT</property>
+         <property name="digits">3</property>
+         <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+         <property name="inverted">False</property>
+         <property name="adjustment">3 0 100 1 6.25 0</property>
+         <signal name="button_release_event" handler="PDASliderRelease"/>
+         <signal name="button_press_event" handler="PDASliderPress"/>
+       </widget>
+       <packing>
+         <property name="padding">4</property>
+         <property name="expand">False</property>
+         <property name="fill">False</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkNotebook" id="notebook">
+         <property name="visible">True</property>
+         <property name="can_focus">True</property>
+         <property name="show_tabs">True</property>
+         <property name="show_border">True</property>
+         <property name="tab_pos">GTK_POS_TOP</property>
+         <property name="scrollable">False</property>
+         <property name="enable_popup">False</property>
+
+         <child>
+           <widget class="GtkVBox" id="vbox1">
+             <property name="visible">True</property>
+             <property name="homogeneous">False</property>
+             <property name="spacing">0</property>
+
+             <child>
+               <widget class="GtkHBox" id="hbox1">
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkButton" id="buttonMrlGo">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes">Add</property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="PDAMrlGo"/>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="labelUrl">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">MRL :</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_CENTER</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">2</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkCombo" id="mrl_combo">
+                     <property name="visible">True</property>
+                     <property name="value_in_list">False</property>
+                     <property name="allow_empty">True</property>
+                     <property name="case_sensitive">False</property>
+                     <property name="enable_arrow_keys">True</property>
+                     <property name="enable_arrows_always">False</property>
+
+                     <child internal-child="entry">
+                       <widget class="GtkEntry" id="mrl_entry">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">True</property>
+                         <property name="visibility">True</property>
+                         <property name="max_length">0</property>
+                         <property name="text" translatable="yes"></property>
+                         <property name="has_frame">True</property>
+                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="activates_default">False</property>
+                         <signal name="changed" handler="on_comboURL-entry_changed"/>
+                       </widget>
+                     </child>
+
+                     <child internal-child="list">
+                       <widget class="GtkList" id="convertwidget1">
+                         <property name="visible">True</property>
+                         <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget2">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget3">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">file://</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget4">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget5">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">ftp://</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget6">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget7">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">http://</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget8">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget9">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">udp://@:1234</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget10">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget11">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">udp6://@:1234</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget12">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget13">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">rtp://</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget14">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget15">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">rtp6://</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="convertwidget16">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="convertwidget17">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes"></property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">3</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">False</property>
+                 <property name="fill">True</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkNotebook" id="mediabook">
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="show_tabs">True</property>
+                 <property name="show_border">True</property>
+                 <property name="tab_pos">GTK_POS_TOP</property>
+                 <property name="scrollable">False</property>
+                 <property name="enable_popup">False</property>
+
+                 <child>
+                   <widget class="GtkScrolledWindow" id="scrolledwindow4">
+                     <property name="visible">True</property>
+                     <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="shadow_type">GTK_SHADOW_NONE</property>
+                     <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                     <child>
+                       <widget class="GtkViewport" id="viewport2">
+                         <property name="visible">True</property>
+                         <property name="shadow_type">GTK_SHADOW_IN</property>
+
+                         <child>
+                           <widget class="GtkTreeView" id="clistmedia">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="headers_visible">True</property>
+                             <property name="rules_hint">False</property>
+                             <property name="reorderable">False</property>
+                             <property name="enable_search">True</property>
+                             <signal name="select_row" handler="on_clistmedia_select_row"/>
+                             <signal name="click_column" handler="on_clistmedia_click_column"/>
+                           </widget>
+                         </child>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="tab_expand">False</property>
+                     <property name="tab_fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="label13">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">File</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_CENTER</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="type">tab</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkVBox" id="vbox3">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">2</property>
+
+                     <child>
+                       <widget class="GtkRadioButton" id="network_multicast">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="label" translatable="yes">UDP/RTP (Adress when Multicast)</property>
+                         <property name="use_underline">True</property>
+                         <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="active">False</property>
+                         <property name="inconsistent">False</property>
+                         <property name="draw_indicator">True</property>
+                         <signal name="toggled" handler="on_network_multicast_toggled"/>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkTable" id="table1">
+                         <property name="visible">True</property>
+                         <property name="n_rows">2</property>
+                         <property name="n_columns">2</property>
+                         <property name="homogeneous">False</property>
+                         <property name="row_spacing">0</property>
+                         <property name="column_spacing">5</property>
+
+                         <child>
+                           <widget class="GtkLabel" id="label21">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">Address</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">0</property>
+                             <property name="right_attach">1</property>
+                             <property name="top_attach">0</property>
+                             <property name="bottom_attach">1</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="label22">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">Port</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">0</property>
+                             <property name="right_attach">1</property>
+                             <property name="top_attach">1</property>
+                             <property name="bottom_attach">2</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkSpinButton" id="network_multicast_port">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="climb_rate">1</property>
+                             <property name="digits">0</property>
+                             <property name="numeric">False</property>
+                             <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                             <property name="snap_to_ticks">False</property>
+                             <property name="wrap">False</property>
+                             <property name="adjustment">1234 1 65536 1 10 10</property>
+                             <signal name="changed" handler="on_network_multicast_port_changed"/>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">1</property>
+                             <property name="bottom_attach">2</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCombo" id="combo2">
+                             <property name="visible">True</property>
+                             <property name="value_in_list">False</property>
+                             <property name="allow_empty">True</property>
+                             <property name="case_sensitive">False</property>
+                             <property name="enable_arrow_keys">True</property>
+                             <property name="enable_arrows_always">False</property>
+
+                             <child internal-child="entry">
+                               <widget class="GtkEntry" id="network_multicast_address">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="activates_default">False</property>
+                                 <signal name="changed" handler="on_network_multicast_address_changed"/>
+                               </widget>
+                             </child>
+
+                             <child internal-child="list">
+                               <widget class="GtkList" id="convertwidget20">
+                                 <property name="visible">True</property>
+                                 <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="convertwidget21">
+                                     <property name="visible">True</property>
+
+                                     <child>
+                                       <widget class="GtkLabel" id="convertwidget22">
+                                         <property name="visible">True</property>
+                                         <property name="label" translatable="yes"></property>
+                                         <property name="use_underline">False</property>
+                                         <property name="use_markup">False</property>
+                                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                         <property name="wrap">False</property>
+                                         <property name="selectable">False</property>
+                                         <property name="xalign">0</property>
+                                         <property name="yalign">0.5</property>
+                                         <property name="xpad">0</property>
+                                         <property name="ypad">0</property>
+                                       </widget>
+                                     </child>
+                                   </widget>
+                                 </child>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">0</property>
+                             <property name="bottom_attach">1</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkHSeparator" id="hseparator10">
+                         <property name="visible">True</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkHBox" id="hbox9">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">True</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkRadioButton" id="network_http">
+                             <property name="visible">True</property>
+                             <property name="sensitive">False</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">HTTP</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <property name="group">network_multicast</property>
+                             <signal name="toggled" handler="on_network_http_toggled"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkRadioButton" id="network_ftp">
+                             <property name="visible">True</property>
+                             <property name="sensitive">False</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">FTP</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <property name="group">network_multicast</property>
+                             <signal name="toggled" handler="on_network_ftp_toggled"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkRadioButton" id="network_mms">
+                             <property name="visible">True</property>
+                             <property name="sensitive">False</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">MMS</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <property name="group">network_multicast</property>
+                             <signal name="toggled" handler="on_network_mms_toggled"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkHSeparator" id="hseparator11">
+                         <property name="visible">True</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <placeholder/>
+                     </child>
+
+                     <child>
+                       <placeholder/>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="tab_expand">False</property>
+                     <property name="tab_fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="label20">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Network</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_CENTER</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="type">tab</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">True</property>
+                 <property name="fill">True</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="media2">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Media</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_CENTER</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkVBox" id="vbox4">
+             <property name="visible">True</property>
+             <property name="homogeneous">False</property>
+             <property name="spacing">0</property>
+
+             <child>
+               <widget class="GtkScrolledWindow" id="scrolledwindow5">
+                 <property name="visible">True</property>
+                 <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                 <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                 <property name="shadow_type">GTK_SHADOW_IN</property>
+                 <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                 <child>
+                   <widget class="GtkTreeView" id="clistplaylist">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="headers_visible">True</property>
+                     <property name="rules_hint">False</property>
+                     <property name="reorderable">False</property>
+                     <property name="enable_search">True</property>
+                     <signal name="event" handler="PDAPlaylistEvent"/>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">True</property>
+                 <property name="fill">True</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkHBox" id="hbox11">
+                 <property name="visible">True</property>
+                 <property name="homogeneous">True</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkButton" id="update_playlist">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes">Update</property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="PDAPlaylistUpdate"/>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="playlist_del">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"> Del </property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="PDAPlaylistDel"/>
+                   </widget>
+                   <packing>
+                     <property name="padding">5</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="playlist_clear">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"> Clear </property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="PDAPlaylistClear"/>
+                   </widget>
+                   <packing>
+                     <property name="padding">5</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">2</property>
+                 <property name="expand">False</property>
+                 <property name="fill">False</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="playlist">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Playlist</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_CENTER</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkVBox" id="vbox2">
+             <property name="visible">True</property>
+             <property name="homogeneous">False</property>
+             <property name="spacing">0</property>
+
+             <child>
+               <widget class="GtkCheckButton" id="cbautoplay">
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="label" translatable="yes">Automatically play file</property>
+                 <property name="use_underline">True</property>
+                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="active">True</property>
+                 <property name="inconsistent">False</property>
+                 <property name="draw_indicator">True</property>
+                 <signal name="toggled" handler="on_cbautoplay_toggled"/>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">False</property>
+                 <property name="fill">False</property>
+               </packing>
+             </child>
+
+             <child>
+               <placeholder/>
+             </child>
+
+             <child>
+               <widget class="GtkHBox" id="hbox2">
+                 <property name="visible">True</property>
+                 <property name="homogeneous">True</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkButton" id="buttonSave">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"> Save </property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="buttonApply">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"> Apply </property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="PDAPreferencesApply"/>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <placeholder/>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="buttonCancel">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"> Cancel </property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                     <property name="pack_type">GTK_PACK_END</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">2</property>
+                 <property name="expand">False</property>
+                 <property name="fill">False</property>
+                 <property name="pack_type">GTK_PACK_END</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="preferences">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Preference</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_CENTER</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkScrolledWindow" id="scrolledwindow3">
+             <property name="visible">True</property>
+             <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+             <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+             <property name="shadow_type">GTK_SHADOW_NONE</property>
+             <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+             <child>
+               <widget class="GtkViewport" id="viewport1">
+                 <property name="visible">True</property>
+                 <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+                 <child>
+                   <widget class="GtkFixed" id="fixed2">
+                     <property name="visible">True</property>
+
+                     <child>
+                       <widget class="GtkImage" id="pixmap2">
+                         <property name="width_request">0</property>
+                         <property name="height_request">0</property>
+                         <property name="visible">True</property>
+                         <property name="pixbuf">vlc48x48.png</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="x">0</property>
+                         <property name="y">0</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label8">
+                         <property name="width_request">0</property>
+                         <property name="height_request">0</property>
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">(c) 1996-2003 the VideoLAN team</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_CENTER</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="x">16</property>
+                         <property name="y">48</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label11">
+                         <property name="width_request">0</property>
+                         <property name="height_request">0</property>
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">VLC media player</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_CENTER</property>
+                         <property name="wrap">True</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="x">64</property>
+                         <property name="y">16</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label9">
+                         <property name="width_request">208</property>
+                         <property name="height_request">32</property>
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">Authors: The VideoLAN Team, http://www.videolan.org</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">True</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="x">16</property>
+                         <property name="y">72</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label10">
+                         <property name="width_request">224</property>
+                         <property name="height_request">64</property>
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">The VideoLAN Client is a MPEG, MPEG 2, MP3, DivX player, that accepts input from local or network sources.</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">True</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="x">16</property>
+                         <property name="y">112</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label27">
+                         <property name="width_request">112</property>
+                         <property name="height_request">16</property>
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">http://www.videolan.org</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_CENTER</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="x">64</property>
+                         <property name="y">184</property>
+                       </packing>
+                     </child>
+                   </widget>
+                 </child>
+               </widget>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="about">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">About</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_CENTER</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">True</property>
+         <property name="fill">True</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
diff --git a/modules/gui/pda/pda.gladep b/modules/gui/pda/pda.gladep
new file mode 100644 (file)
index 0000000..62bddfc
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+  <name>Pda</name>
+  <program_name>pda</program_name>
+  <pixmaps_directory>../../../share</pixmaps_directory>
+  <output_main_file>FALSE</output_main_file>
+  <output_build_files>FALSE</output_build_files>
+</glade-project>
diff --git a/modules/gui/pda/pda.h b/modules/gui/pda/pda.h
new file mode 100644 (file)
index 0000000..99ac868
--- /dev/null
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * pda.h: private Gtk+ interface description
+ *****************************************************************************
+ * Copyright (C) 1999, 2000 VideoLAN
+ * $Id: pda.h,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
+ *
+ * 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.
+ *****************************************************************************/
+
+#define MAX_ATEXIT                 10
+
+/*****************************************************************************
+ * intf_sys_t: description and status of Gtk+ interface
+ *****************************************************************************/
+struct intf_sys_t
+{
+    /* The gtk_main module */
+    module_t *          p_gtk_main;
+
+    /* windows and widgets */
+    GtkWidget   *       p_window;                             /* main window */
+    GtkEntry    *       p_mrlentry;
+    GtkNotebook *       p_notebook;
+    GtkNotebook *       p_mediabook;
+    GtkHScale   *       p_slider;
+    GtkCList    *       p_clist;
+    GtkCList    *       p_clistplaylist;
+
+    /* slider */
+    GtkLabel *          p_slider_label;
+    GtkAdjustment *     p_adj;                   /* slider adjustment object */
+    off_t               i_adj_oldvalue;  /* previous value -no FPU hardware  */
+    float               f_adj_oldvalue;  /* previous value -with FPU hardware*/
+
+    /* special actions */
+    vlc_bool_t          b_playing;
+    vlc_bool_t          b_window_changed;        /* window display toggled ? */
+    vlc_bool_t          b_slider_free;                      /* slider status */
+
+    /* Preference settings */
+    vlc_bool_t          b_autoplayfile;
+
+    /* The input thread */
+    input_thread_t *    p_input;
+};
+
+/*****************************************************************************
+ * Useful macro
+ ****************************************************************************/
+#define GTK_GET( type, nom ) GTK_##type( gtk_object_get_data( \
+        GTK_OBJECT( p_intf->p_sys->p_window ), nom ) )
+
+            
+#define  GtkGetIntf( widget ) E_(__GtkGetIntf)( GTK_WIDGET( widget ) )
+void * E_(__GtkGetIntf)( GtkWidget * );
diff --git a/modules/gui/pda/playlist.c b/modules/gui/pda/playlist.c
new file mode 100644 (file)
index 0000000..4f7af55
--- /dev/null
@@ -0,0 +1,203 @@
+/*****************************************************************************
+ * playlist.c : Playlist interface of the gtk-pda plugin.
+ *****************************************************************************
+ * Copyright (C) 2000, 2001 VideoLAN
+ * $Id: playlist.c,v 1.1 2003/07/23 22:02:56 jpsaman Exp $
+ *
+ * Authors: Marc Ariberti <marcari@videolan.org>
+ *      
+ * 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.
+ *****************************************************************************/
+
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <sys/types.h>                                              /* off_t */
+#include <stdlib.h>
+
+#include <vlc/vlc.h>
+#include <vlc/intf.h>
+#include <vlc/vout.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+#include <gtk/gtk.h>
+
+#include "interface.h"
+#include "support.h"
+#include "pda.h"
+#include "playlist.h"
+
+gboolean
+PDAPlaylistEvent                  (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( widget );
+    playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                                       FIND_ANYWHERE );
+    if( p_playlist == NULL )
+    {
+        return FALSE;
+    }
+
+    if( ( event->button ).type == GDK_2BUTTON_PRESS )
+    {
+        GtkCList *  p_clist;
+        gint        i_row;
+        gint        i_col;
+
+        p_clist = p_intf->p_sys->p_clistplaylist;
+
+        if( gtk_clist_get_selection_info( p_clist, (event->button).x,
+                    (event->button).y, &i_row, &i_col ) == 1 )
+        {
+            playlist_Goto( p_playlist, i_row );
+        }
+
+        vlc_object_release( p_playlist );
+        PDARebuildCList( p_clist, p_playlist );
+        return TRUE;
+    }
+
+    vlc_object_release( p_playlist );
+
+  return FALSE;
+}
+
+void
+PDAPlaylistClear                  (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+    playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                                       FIND_ANYWHERE );
+    int item;
+    
+    if( p_playlist == NULL )
+    {
+        return;
+    }
+
+    for(item = p_playlist->i_size - 1 ; item >= 0 ; item-- )
+    {
+        playlist_Delete( p_playlist, item);
+    }
+    
+    vlc_object_release( p_playlist );
+    PDARebuildCList( p_intf->p_sys->p_clistplaylist, p_playlist);
+}
+
+void PDARebuildCList( GtkCList * p_clist, playlist_t * p_playlist )
+{
+    int         i_dummy;
+    gchar *     ppsz_text[2];
+    GdkColor    red;
+    red.red     = 65535;
+    red.blue    = 0;
+    red.green   = 0;
+
+    gtk_clist_freeze( p_clist );
+    gtk_clist_clear( p_clist );
+
+    vlc_mutex_lock( &p_playlist->object_lock );
+    for( i_dummy = p_playlist->i_size ; i_dummy-- ; )
+    {
+        ppsz_text[0] = p_playlist->pp_items[i_dummy]->psz_name;
+        ppsz_text[1] = "no info";
+        gtk_clist_insert( p_clist, 0, ppsz_text );
+    }
+    vlc_mutex_unlock( &p_playlist->object_lock );
+
+    gtk_clist_set_background( p_clist, p_playlist->i_index, &red);
+    gtk_clist_thaw( p_clist );
+}
+
+
+void
+PDAPlaylistUpdate                 (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+    playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                                       FIND_ANYWHERE );
+    if( p_playlist == NULL )
+    {
+        return;
+    }
+
+
+    PDARebuildCList( p_intf->p_sys->p_clistplaylist, p_playlist );
+}
+
+static void PDADeleteGListItem( gpointer data, gpointer param )
+{
+    int i_cur_row = (long)data;
+    playlist_t * p_playlist = param;
+
+    playlist_Delete( p_playlist, i_cur_row );
+}
+
+static gint PDACompareItems( gconstpointer a, gconstpointer b )
+{
+    return (ptrdiff_t) ( (int *)b - (int *)a );
+}
+
+
+void
+PDAPlaylistDel                    (GtkButton       *button,
+                                        gpointer         user_data)
+{
+    /* user wants to delete a file in the queue */
+    GList *     p_selection;
+    
+    intf_thread_t *  p_intf = GtkGetIntf( button );
+    playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                                       FIND_ANYWHERE );
+    if( p_playlist == NULL )
+    {
+        return;
+    }
+
+    
+    /* lock the struct */
+    vlc_mutex_lock( &p_intf->change_lock );
+
+    p_selection = p_intf->p_sys->p_clistplaylist->selection;
+
+    if( g_list_length( p_selection ) )
+    {
+        /* reverse-sort so that we can delete from the furthest
+         * to the closest item to delete...
+         */
+        p_selection = g_list_sort( p_selection, PDACompareItems );
+        g_list_foreach( p_selection, PDADeleteGListItem, p_playlist );
+    }
+
+    vlc_mutex_unlock( &p_intf->change_lock );
+
+
+    vlc_object_release( p_playlist );
+    PDARebuildCList( p_intf->p_sys->p_clistplaylist, p_playlist );
+}
+
diff --git a/modules/gui/pda/playlist.h b/modules/gui/pda/playlist.h
new file mode 100644 (file)
index 0000000..f1845a3
--- /dev/null
@@ -0,0 +1,20 @@
+
+
+gboolean
+PDAPlaylistEvent                  (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+void PDARebuildCList( GtkCList * p_clist, playlist_t * p_playlist );
+
+void PDAPlaylistClear             (GtkButton       *button,
+                                        gpointer         user_data);
+
+
+void
+PDAPlaylistUpdate                 (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+PDAPlaylistDel                    (GtkButton       *button,
+                                        gpointer         user_data);
diff --git a/modules/gui/pda/support.c b/modules/gui/pda/support.c
new file mode 100644 (file)
index 0000000..5077e59
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists        (const gchar     *directory,
+                                        const gchar     *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap  (GtkWidget       *widget);
+
+GtkWidget*
+lookup_widget                          (GtkWidget       *widget,
+                                        const gchar     *widget_name)
+{
+  GtkWidget *parent, *found_widget;
+
+  for (;;)
+    {
+      if (GTK_IS_MENU (widget))
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+      else
+        parent = widget->parent;
+      if (parent == NULL)
+        break;
+      widget = parent;
+    }
+
+  found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+                                                   widget_name);
+  if (!found_widget)
+    g_warning ("Widget not found: %s", widget_name);
+  return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+"  c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap                    (GtkWidget       *widget)
+{
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+                                                     NULL, dummy_pixmap_xpm);
+  if (gdkpixmap == NULL)
+    g_error ("Couldn't create replacement pixmap.");
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory                   (const gchar     *directory)
+{
+  pixmaps_directories = g_list_prepend (pixmaps_directories,
+                                        g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        const gchar     *filename)
+{
+  gchar *found_filename = NULL;
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+  GList *elem;
+
+  if (!filename || !filename[0])
+      return create_dummy_pixmap (widget);
+
+  /* We first try any pixmaps directories set by the application. */
+  elem = pixmaps_directories;
+  while (elem)
+    {
+      found_filename = check_file_exists ((gchar*)elem->data, filename);
+      if (found_filename)
+        break;
+      elem = elem->next;
+    }
+
+  /* If we haven't found the pixmap, try the source directory. */
+  if (!found_filename)
+    {
+      found_filename = check_file_exists ("../../../share", filename);
+    }
+
+  if (!found_filename)
+    {
+      g_warning (_("Couldn't find pixmap file: %s"), filename);
+      return create_dummy_pixmap (widget);
+    }
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+                                                   NULL, found_filename);
+  if (gdkpixmap == NULL)
+    {
+      g_warning (_("Error loading pixmap file: %s"), found_filename);
+      g_free (found_filename);
+      return create_dummy_pixmap (widget);
+    }
+  g_free (found_filename);
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar*
+check_file_exists                      (const gchar     *directory,
+                                        const gchar     *filename)
+{
+  gchar *full_filename;
+  struct stat s;
+  gint status;
+
+  full_filename = (gchar*) g_malloc (strlen (directory) + 1
+                                     + strlen (filename) + 1);
+  strcpy (full_filename, directory);
+  strcat (full_filename, G_DIR_SEPARATOR_S);
+  strcat (full_filename, filename);
+
+  status = stat (full_filename, &s);
+  if (status == 0 && S_ISREG (s.st_mode))
+    return full_filename;
+  g_free (full_filename);
+  return NULL;
+}
+
diff --git a/modules/gui/pda/support.h b/modules/gui/pda/support.h
new file mode 100644 (file)
index 0000000..7a13025
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Created by glade, fixed by bootstrap
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <vlc/vlc.h>
+#endif
+
+#include <gtk/gtk.h>
+
+/*
+ * Standard gettext macros.
+ */
+#if 0 /* Disabled by bootstrap */
+#  include <libintl.h>
+#  undef _
+#  define _(String) dgettext (PACKAGE, String)
+#  ifdef gettext_noop
+#    define N_(String) gettext_noop (String)
+#  else
+#    define N_(String) (String)
+#  endif
+/* #else */
+#  define textdomain(String) (String)
+#  define gettext(String) (String)
+#  define dgettext(Domain,Message) (Message)
+#  define dcgettext(Domain,Message,Type) (Message)
+#  define bindtextdomain(Domain,Directory) (Domain)
+#  define _(String) (String)
+#  define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*  lookup_widget              (GtkWidget       *widget,
+                                        const gchar     *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void        add_pixmap_directory       (const gchar     *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget*  create_pixmap              (GtkWidget       *widget,
+                                        const gchar     *filename);
+